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