index.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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 { ConnectionHandle } from '@deepseek-ai/dsh-client-connection/client'
  5. import { createSessionControlStream } from './transport.ts'
  6. import { ClientSessions } from './sessions/service.ts'
  7. import type { SessionRemotes } from './sessions/remotes.ts'
  8. import type {} from '../remote-events.ts'
  9. export {
  10. createSessionControlStream,
  11. SessionEventStream,
  12. SESSION_SEARCH_RESULT_LIMIT,
  13. SESSION_SEARCH_SNIPPET_MAX_CODE_POINTS,
  14. sessionStreamFailure,
  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 { ISession, ProjectionsFace, SessionFace } from './contract/session.ts'
  42. export type { ISessions } from './contract/sessions.ts'
  43. export { MutableSessionEventSource } from './contract/events.ts'
  44. export type {
  45. SessionEventChange,
  46. SessionEventLike,
  47. SessionEventLikeEntry,
  48. SessionEventSource,
  49. SessionEventWindow,
  50. SessionLiveEventEntry,
  51. } from './contract/events.ts'
  52. export type {
  53. OpenState,
  54. PromptError,
  55. QueuedMessage,
  56. SessionSnapshot,
  57. } from './contract/snapshot.ts'
  58. export type { ClientFailure, ClientResult } from './contract/result.ts'
  59. declare module '@deepseek-ai/cordis' {
  60. interface Context {
  61. /** Client Session object layer and Agent scope owner. */
  62. sessions: import('./contract/sessions.ts').ISessions
  63. }
  64. }
  65. /** Required wire, Remote, and Context projection services. */
  66. export const inject = [
  67. 'connection',
  68. 'typert',
  69. 'remote',
  70. 'remote.commands',
  71. 'remote.session',
  72. 'remote.subagents',
  73. ]
  74. /**
  75. * Install Client Session state and its reconnecting control stream.
  76. * @param ctx - Client Cordis context.
  77. */
  78. export function apply(ctx: Context): void {
  79. const connection = ctx.get('connection') as ConnectionHandle
  80. const remotes = ctx.remote as unknown as SessionRemotes
  81. const sessions = new ClientSessions(ctx, remotes)
  82. ctx.remote.$on('api-session/added', (summary) => { sessions.handleSessionAdded(summary) })
  83. ctx.remote.$on('api-session/removed', (sessionId) => { sessions.handleSessionRemoved(sessionId) })
  84. ctx.remote.$on('api-session/status', (sessionId, running) => {
  85. sessions.handleSessionStatus(sessionId, running)
  86. })
  87. ctx.remote.$on('api-session/activity', (sessionId, updatedAt) => {
  88. sessions.handleSessionActivity(sessionId, updatedAt)
  89. })
  90. ctx.remote.$on('api-session/error', (sessionId, message) => {
  91. sessions.handleSessionError(sessionId, message)
  92. })
  93. const control = createSessionControlStream(remotes, {
  94. accept: (frame) => { sessions.handleControlFrame(frame) },
  95. failed: (error) => { console.error('[session-controller] control stream failed:', error) },
  96. })
  97. control.start()
  98. ctx.on('connection/reset', () => { sessions.handleConnected() })
  99. if (connection.hostDescription.getSnapshot() !== undefined) sessions.handleConnected()
  100. ctx.typert.contexts.registerClient('agent', {
  101. identity: candidate => sessions.scopeOf(candidate),
  102. resolve: sessionId => sessions.resolveAgentScope(sessionId),
  103. })
  104. ctx.effect(() => async () => { await control.dispose() }, 'session-controller.client.control')
  105. }