index.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. /** Client Session object layer, Agent scopes, and Remote lifecycle wiring. */
  2. import type { Context } from '@deepseek-ai/cordis'
  3. import type {} from '@deepseek-ai/dsh-agent/types'
  4. import type {} from '@deepseek-ai/dsh-client-connection/client'
  5. import type {} from '@deepseek-ai/dsh-client-file-upload/client'
  6. import { createSessionControlStream } from './transport.ts'
  7. import { ClientSessions } from './sessions/service.ts'
  8. import type { SessionRemotes } from './sessions/remotes.ts'
  9. import type {} from '../remote-events.ts'
  10. export {
  11. createSessionControlStream,
  12. SessionEventStream,
  13. SESSION_SEARCH_RESULT_LIMIT,
  14. SESSION_SEARCH_SNIPPET_MAX_CODE_POINTS,
  15. } from './transport.ts'
  16. export type {
  17. ClientSessionPageRequest,
  18. SessionControlStream,
  19. SessionControlStreamOptions,
  20. SessionEventStreamOptions,
  21. SessionJournalChange,
  22. SessionRemote,
  23. } from './transport.ts'
  24. export { createScope, scopeOf } from './scope.ts'
  25. export type { AgentContext, AgentScopeHandle } from './scope.ts'
  26. export { SessionCreateError, SessionForkError } from './sessions/service.ts'
  27. export type { SessionBinding, SessionListState, SessionSummary } from './sessions/service.ts'
  28. export type {
  29. SessionListPhase,
  30. SessionListSnapshot,
  31. SessionSearchResultItem,
  32. SubagentCatalogSnapshot,
  33. } from './sessions/manager.ts'
  34. export type { Session } from './sessions/session.ts'
  35. export type {
  36. ProjectionsBaseline,
  37. ProjectionValueStore,
  38. SessionProjectionMap,
  39. UseProjection,
  40. } from './sessions/projection-store.ts'
  41. export type {
  42. BeginSubmissionInput,
  43. ISession,
  44. PendingSubmissionRetirement,
  45. ProjectionsFace,
  46. SessionFace,
  47. SubmissionHandle,
  48. } from './contract/session.ts'
  49. export type { ISessions } from './contract/sessions.ts'
  50. export { MutableSessionEventSource } from './contract/events.ts'
  51. export type {
  52. AssistantLiveChunkEvent,
  53. SessionAssistantSettlementEntry,
  54. SessionEventChange,
  55. SessionEventLike,
  56. SessionEventLikeEntry,
  57. SessionEventSource,
  58. SessionEventWindow,
  59. SessionLiveEventEntry,
  60. SessionTransientEventEntry,
  61. } from './contract/events.ts'
  62. export type {
  63. OpenState,
  64. PendingSubmission,
  65. PendingSubmissionAttachment,
  66. PendingSubmissionFileAttachment,
  67. PendingSubmissionImage,
  68. PendingSubmissionImageAttachment,
  69. PendingSubmissionPlacement,
  70. PromptError,
  71. QueuedMessage,
  72. SessionSnapshot,
  73. } from './contract/snapshot.ts'
  74. declare module '@deepseek-ai/cordis' {
  75. interface Context {
  76. /** Client Session object layer and Agent scope owner. */
  77. sessions: import('./contract/sessions.ts').ISessions
  78. }
  79. }
  80. /** Required Remote and Context projection services. */
  81. export const inject = [
  82. 'connection',
  83. 'fileUpload',
  84. 'typert',
  85. 'remote',
  86. 'remote.commands',
  87. 'remote.session',
  88. 'remote.subagents',
  89. ]
  90. /**
  91. * Install Client Session state and its reconnecting control stream.
  92. * @param ctx - Client Cordis context.
  93. */
  94. export function apply(ctx: Context): void {
  95. const remotes = ctx.remote as unknown as SessionRemotes
  96. const sessions = new ClientSessions(ctx, remotes)
  97. ctx.remote.$on('api-session/added', (summary) => { sessions.handleSessionAdded(summary) })
  98. ctx.remote.$on('api-session/removed', (sessionId) => { sessions.handleSessionRemoved(sessionId) })
  99. ctx.remote.$on('api-session/status', (sessionId, running) => {
  100. sessions.handleSessionStatus(sessionId, running)
  101. })
  102. ctx.remote.$on('api-session/activity', (sessionId, updatedAt) => {
  103. sessions.handleSessionActivity(sessionId, updatedAt)
  104. })
  105. ctx.remote.$on('api-session/error', (sessionId, message) => {
  106. sessions.handleSessionError(sessionId, message)
  107. })
  108. const control = createSessionControlStream(remotes, {
  109. accept: (frame) => { sessions.handleControlFrame(frame) },
  110. failed: (error) => { console.error('[session-controller] control stream failed:', error) },
  111. })
  112. control.start()
  113. ctx.on('connection/reset', () => { sessions.handleConnected() })
  114. if (ctx.remote.$host.home !== undefined) sessions.handleConnected()
  115. ctx.typert.contexts.registerClient('agent', {
  116. identity: candidate => sessions.scopeOf(candidate),
  117. resolve: sessionId => sessions.resolveAgentScope(sessionId),
  118. })
  119. ctx.effect(() => async () => { await control.dispose() }, 'session-controller.client.control')
  120. }