index.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /** Host Workspace Remote owner: explicit commands and reconnect-safe state. */
  2. import { Context } from '@deepseek-ai/cordis'
  3. import { Remote, TypertRemoteService } from '@deepseek-ai/dsh-typert-protocol'
  4. import { WorkspaceCommands } from './commands.ts'
  5. import { WorkspaceFeed } from './feed.ts'
  6. import type {
  7. WorkspaceArchiveSessionRequest,
  8. WorkspaceArchiveValue,
  9. WorkspaceCreateRequest,
  10. WorkspaceCreateValue,
  11. WorkspaceDeleteRequest,
  12. WorkspaceDeleteValue,
  13. WorkspaceFollowFrame,
  14. WorkspaceInsertBeforeRequest,
  15. WorkspaceInsertSessionBeforeRequest,
  16. WorkspaceOrderValue,
  17. WorkspaceRenameRequest,
  18. WorkspaceValue,
  19. } from './types.ts'
  20. export type * from './types.ts'
  21. declare module '@deepseek-ai/cordis' {
  22. interface Context {
  23. /** Host Workspace business API and Remote namespace owner. */
  24. workspaceController: WorkspaceController
  25. }
  26. }
  27. /** Host service backing the generated `ctx.remote.workspace` namespace. */
  28. export class WorkspaceController extends TypertRemoteService {
  29. static inject = ['typert', 'workspaceRegistry']
  30. private readonly commands: WorkspaceCommands
  31. private readonly feed: WorkspaceFeed
  32. /** @param ctx - Host context containing the Workspace registry. */
  33. constructor(ctx: Context) {
  34. super(ctx, 'workspaceController', { namespace: 'workspace' })
  35. this.commands = new WorkspaceCommands(ctx)
  36. this.feed = new WorkspaceFeed(ctx)
  37. }
  38. /**
  39. * Create or idempotently resolve one Workspace over an existing directory.
  40. * @param request - directory path to register.
  41. * @returns the Workspace and whether this call created it.
  42. */
  43. @Remote('create')
  44. create(request: WorkspaceCreateRequest): Promise<WorkspaceCreateValue> {
  45. return this.commands.create(request)
  46. }
  47. /**
  48. * Rename one Workspace to a unique non-blank title.
  49. * @param request - Workspace identity and proposed title.
  50. * @returns the updated Workspace projection.
  51. */
  52. @Remote('rename')
  53. rename(request: WorkspaceRenameRequest): Promise<WorkspaceValue> {
  54. return this.commands.rename(request)
  55. }
  56. /**
  57. * Remove one Workspace registration while retaining files and Sessions.
  58. * @param request - Workspace identity to remove.
  59. * @returns deletion confirmation.
  60. */
  61. @Remote('delete')
  62. delete(request: WorkspaceDeleteRequest): Promise<WorkspaceDeleteValue> {
  63. return this.commands.delete(request)
  64. }
  65. /**
  66. * Move one Workspace within the registry display order.
  67. * @param request - moved Workspace and optional anchor.
  68. * @returns the complete resulting Workspace order.
  69. */
  70. @Remote('insertBefore')
  71. insertBefore(request: WorkspaceInsertBeforeRequest): Promise<WorkspaceOrderValue> {
  72. return this.commands.insertBefore(request)
  73. }
  74. /**
  75. * Move one accounted Session within a Workspace.
  76. * @param request - Workspace, Session, and optional anchor identities.
  77. * @returns the updated Workspace projection.
  78. */
  79. @Remote('insertSessionBefore')
  80. insertSessionBefore(request: WorkspaceInsertSessionBeforeRequest): Promise<WorkspaceValue> {
  81. return this.commands.insertSessionBefore(request)
  82. }
  83. /**
  84. * Hide one known Session from Workspace grouping surfaces.
  85. * @param request - Session identity to archive.
  86. * @returns the complete resulting archive set.
  87. */
  88. @Remote('archiveSession')
  89. archiveSession(request: WorkspaceArchiveSessionRequest): Promise<WorkspaceArchiveValue> {
  90. return this.commands.archiveSession(request)
  91. }
  92. /**
  93. * Stream a complete Workspace baseline followed by ordered increments.
  94. * @param signal - generation cancellation.
  95. * @returns baseline followed by ordered Workspace increments.
  96. */
  97. @Remote({ mode: 'stream' })
  98. follow(signal: AbortSignal): AsyncIterable<WorkspaceFollowFrame> {
  99. return this.feed.follow(signal)
  100. }
  101. }
  102. export default WorkspaceController