@deepseek-ai/dsh-api-session-controller 0.2.1-alpha.2 → 0.2.1-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.i18n.yaml +2 -2
- package/README.md +3 -1
- package/README.zh.md +3 -1
- package/lib/client.js +11 -6
- package/lib/index.js +222 -97
- package/lib/typert.host.js +1243 -691
- package/lib/typert.remote-client.d.ts +25 -2
- package/lib/typert.remote-client.js +1039 -676
- package/lib/types/agent.d.ts +61 -17
- package/lib/types/agent.js +148 -84
- package/lib/types/client/contract/sessions.d.ts +6 -3
- package/lib/types/client/sessions/manager.d.ts +3 -2
- package/lib/types/client/sessions/manager.js +6 -3
- package/lib/types/client/sessions/service.d.ts +3 -2
- package/lib/types/client/sessions/service.js +2 -2
- package/lib/types/client/sessions/session.js +1 -1
- package/lib/types/commands.d.ts +20 -6
- package/lib/types/commands.js +28 -34
- package/lib/types/index.d.ts +6 -4
- package/lib/types/index.js +65 -15
- package/lib/types/types.d.ts +14 -3
- package/locale/en.json +5 -0
- package/locale/zh.json +6 -0
- package/package.json +83 -80
package/lib/types/commands.js
CHANGED
|
@@ -60,11 +60,15 @@ import { buildForkSeed } from '@deepseek-ai/dsh-session/fork';
|
|
|
60
60
|
import { SessionLogOffset, SessionSeq } from '@deepseek-ai/dsh-session';
|
|
61
61
|
import { SessionQueryError } from '@deepseek-ai/dsh-session-query';
|
|
62
62
|
import { SessionTitleInvalidError } from '@deepseek-ai/dsh-session-title';
|
|
63
|
-
import { canonicalClientTimeZone } from '@deepseek-ai/dsh-util-time';
|
|
64
63
|
import { assertNever } from '@deepseek-ai/dsh-util-values';
|
|
65
64
|
import { RemoteError, remoteErrorOf } from '@deepseek-ai/dsh-typert-protocol';
|
|
66
65
|
import { ApiSessionCwdConflict, ApiSessionNotFound, ApiSessionPresetConflict, ApiSessionSubagentOwnership, apiSessionSubagentOwnershipError, hasApiSessionSubagentOwner, inspectApiSession, } from "./agent.js";
|
|
67
|
-
|
|
66
|
+
/**
|
|
67
|
+
* Whether prompt content carries non-whitespace text or an attachment.
|
|
68
|
+
* @param content - submitted or edited prompt parts.
|
|
69
|
+
* @returns false for content the Agent must not receive.
|
|
70
|
+
*/
|
|
71
|
+
export function hasPromptContent(content) {
|
|
68
72
|
return content.some(part => part.type !== 'text' || part.text.trim().length > 0);
|
|
69
73
|
}
|
|
70
74
|
/**
|
|
@@ -100,15 +104,15 @@ export class SessionCommandController {
|
|
|
100
104
|
this.defaultCwd = defaultCwd;
|
|
101
105
|
}
|
|
102
106
|
/**
|
|
103
|
-
* Create
|
|
104
|
-
*
|
|
105
|
-
* @
|
|
107
|
+
* Create one ordinary Session for a new conversation, reusing the named
|
|
108
|
+
* blank Session while it is an unarchived member of the requested Workspace.
|
|
109
|
+
* @param request - optional blank Session to reuse, location, and Agent preset.
|
|
110
|
+
* @returns the created or reused Session identity and its preset when configured.
|
|
106
111
|
*/
|
|
107
112
|
async create(request) {
|
|
108
113
|
if (request.workspaceId !== undefined && request.cwd !== undefined) {
|
|
109
114
|
throw new RemoteError('gateway/bad-request', 'session.create accepts workspaceId or cwd, not both', {});
|
|
110
115
|
}
|
|
111
|
-
const sessionId = request.sessionId ?? brandString(`session-${randomUUID()}`);
|
|
112
116
|
let workspace;
|
|
113
117
|
if (request.workspaceId !== undefined) {
|
|
114
118
|
workspace = this.ctx.workspaceRegistry.get(request.workspaceId);
|
|
@@ -119,13 +123,20 @@ export class SessionCommandController {
|
|
|
119
123
|
}
|
|
120
124
|
}
|
|
121
125
|
const cwd = workspace?.path ?? request.cwd ?? this.defaultCwd;
|
|
122
|
-
let
|
|
126
|
+
let created;
|
|
123
127
|
try {
|
|
124
|
-
|
|
128
|
+
created = await this.agents.createSession({
|
|
129
|
+
...(request.sessionId === undefined ? {} : { sessionId: request.sessionId }),
|
|
130
|
+
cwd,
|
|
131
|
+
...(request.agentPreset === undefined ? {} : { agentPreset: request.agentPreset }),
|
|
132
|
+
reusable: sessionId => !this.ctx.workspaceRegistry.archivedSessionIds.includes(sessionId)
|
|
133
|
+
&& (workspace === undefined || workspace.sessionIds.includes(sessionId)),
|
|
134
|
+
});
|
|
125
135
|
}
|
|
126
136
|
catch (error) {
|
|
127
|
-
this.rejectCreation(
|
|
137
|
+
this.rejectCreation(error);
|
|
128
138
|
}
|
|
139
|
+
const sessionId = created.agent.id;
|
|
129
140
|
if (workspace !== undefined) {
|
|
130
141
|
try {
|
|
131
142
|
await workspace.attachSession(sessionId);
|
|
@@ -134,8 +145,7 @@ export class SessionCommandController {
|
|
|
134
145
|
throw new RemoteError('session/workspace-attach-failed', `session "${sessionId}" was created but could not attach to workspace "${workspace.id}": ${String(error)}`, { sessionId, workspaceId: workspace.id });
|
|
135
146
|
}
|
|
136
147
|
}
|
|
137
|
-
|
|
138
|
-
return { sessionId, ...(agentPreset === undefined ? {} : { agentPreset }) };
|
|
148
|
+
return { sessionId, ...(created.agentPreset === undefined ? {} : { agentPreset: created.agentPreset }) };
|
|
139
149
|
}
|
|
140
150
|
/**
|
|
141
151
|
* Validate and install one Session-local model selection; save the default in the background.
|
|
@@ -283,28 +293,16 @@ export class SessionCommandController {
|
|
|
283
293
|
}
|
|
284
294
|
}
|
|
285
295
|
/**
|
|
286
|
-
*
|
|
287
|
-
*
|
|
296
|
+
* Admit one prompt after Agent and attachment validation; the Remote method
|
|
297
|
+
* has already validated the content and built the durable message source.
|
|
298
|
+
* @param request - Session identity, prompt content, and delivery mode.
|
|
299
|
+
* @param source - the `user-rpc` source recorded on the accepted message.
|
|
288
300
|
* @returns acknowledgement that the Agent accepted the prompt.
|
|
289
301
|
*/
|
|
290
|
-
async prompt(request) {
|
|
291
|
-
if (!hasPromptContent(request.content)) {
|
|
292
|
-
throw new RemoteError('gateway/bad-request', 'prompt content must include non-whitespace text or an attachment', {});
|
|
293
|
-
}
|
|
294
|
-
const clientTimeZone = request.clientTimeZone === undefined
|
|
295
|
-
? undefined
|
|
296
|
-
: canonicalClientTimeZone(request.clientTimeZone);
|
|
297
|
-
if (request.clientTimeZone !== undefined && clientTimeZone === undefined) {
|
|
298
|
-
throw new RemoteError('session/invalid-time-zone', 'clientTimeZone must be UTC or a valid IANA Area/Location name', { value: request.clientTimeZone });
|
|
299
|
-
}
|
|
302
|
+
async prompt(request, source) {
|
|
300
303
|
const agent = await this.resolveAgent(request.sessionId);
|
|
301
304
|
if (hasPromptRequest(agent, request.requestId))
|
|
302
305
|
return { accepted: true };
|
|
303
|
-
const source = {
|
|
304
|
-
kind: 'user',
|
|
305
|
-
rpcId: request.requestId,
|
|
306
|
-
...(clientTimeZone === undefined ? {} : { clientTimeZone }),
|
|
307
|
-
};
|
|
308
306
|
const hasImage = request.content.some(part => part.type === 'image');
|
|
309
307
|
const admit = async () => {
|
|
310
308
|
try {
|
|
@@ -482,17 +480,13 @@ export class SessionCommandController {
|
|
|
482
480
|
throw found.error;
|
|
483
481
|
return found.agent;
|
|
484
482
|
}
|
|
485
|
-
rejectCreation(
|
|
483
|
+
rejectCreation(error) {
|
|
486
484
|
if (remoteErrorOf(error) !== undefined)
|
|
487
485
|
throw error;
|
|
488
|
-
if (error instanceof Error && error.name === 'SessionAlreadyOwnedError') {
|
|
489
|
-
throw new RemoteError('session/writer-held', error.message, { sessionId });
|
|
490
|
-
}
|
|
491
486
|
if (error instanceof ApiSessionPresetConflict) {
|
|
492
487
|
throw new RemoteError('agent-preset/conflict', error.message, {
|
|
493
488
|
sessionId: error.sessionId,
|
|
494
489
|
requestedPreset: error.requestedPreset,
|
|
495
|
-
...(error.existingPreset === undefined ? {} : { existingPreset: error.existingPreset }),
|
|
496
490
|
});
|
|
497
491
|
}
|
|
498
492
|
if (error instanceof ApiSessionCwdConflict) {
|
|
@@ -505,7 +499,7 @@ export class SessionCommandController {
|
|
|
505
499
|
if (error instanceof ApiSessionSubagentOwnership) {
|
|
506
500
|
throw apiSessionSubagentOwnershipError(error.sessionId);
|
|
507
501
|
}
|
|
508
|
-
throw new RemoteError('gateway/internal', `failed to create session
|
|
502
|
+
throw new RemoteError('gateway/internal', `failed to create session: ${String(error)}`, {});
|
|
509
503
|
}
|
|
510
504
|
async readSessionState(sessionId) {
|
|
511
505
|
const attached = this.ctx.sessions.get(sessionId);
|
package/lib/types/index.d.ts
CHANGED
|
@@ -85,16 +85,18 @@ export declare class SessionController extends TypertRemoteService {
|
|
|
85
85
|
*/
|
|
86
86
|
list(_request: SessionListRequest, signal: AbortSignal): Promise<SessionListValue>;
|
|
87
87
|
/**
|
|
88
|
-
* Search visible Session content without resuming an Agent.
|
|
88
|
+
* Search visible Session content without resuming an Agent. A non-owner
|
|
89
|
+
* receives only the hits whose Session `allows()` admits; `hasMore`
|
|
90
|
+
* describes the bounded result before that filtering.
|
|
89
91
|
* @param request - literal message-content query.
|
|
90
92
|
* @param signal - cancellation for list and search reads.
|
|
91
93
|
* @returns authorized bounded Session search results.
|
|
92
94
|
*/
|
|
93
95
|
search(request: SessionSearchRequest, signal: AbortSignal): Promise<SessionSearchValue>;
|
|
94
96
|
/**
|
|
95
|
-
* Create
|
|
96
|
-
* @param request -
|
|
97
|
-
* @returns the Session identity and
|
|
97
|
+
* Create one ordinary Session for a new conversation, reusing the named blank Session while it is reusable.
|
|
98
|
+
* @param request - optional blank Session to reuse, location, and Agent preset.
|
|
99
|
+
* @returns the created or reused Session identity and its preset when configured.
|
|
98
100
|
*/
|
|
99
101
|
create(request: SessionCreateRequest): Promise<SessionCreateValue>;
|
|
100
102
|
/**
|
package/lib/types/index.js
CHANGED
|
@@ -91,9 +91,11 @@ import z from '@deepseek-ai/schemastery';
|
|
|
91
91
|
import { errorChain, ReasoningEffortId } from '@deepseek-ai/dsh-llm';
|
|
92
92
|
import { canOpenNativePath, nativeFileManager, nativeFileApplications, openNativeFileApplication, openNativeAssociatedPath, revealNativePath } from '@deepseek-ai/dsh-native-command';
|
|
93
93
|
import { SessionQueryError } from '@deepseek-ai/dsh-session-query';
|
|
94
|
-
import { Remote, RemoteError, TypertRemoteService } from '@deepseek-ai/dsh-typert-protocol';
|
|
94
|
+
import { Remote, RemoteError, TypertRemoteService, principalOf } from '@deepseek-ai/dsh-typert-protocol';
|
|
95
|
+
import { canonicalClientTimeZone } from '@deepseek-ai/dsh-util-time';
|
|
96
|
+
import { assertNever } from '@deepseek-ai/dsh-util-values';
|
|
95
97
|
import { ApiSessionAgentController, inspectApiSession, } from "./agent.js";
|
|
96
|
-
import { SessionCommandController } from "./commands.js";
|
|
98
|
+
import { SessionCommandController, hasPromptContent } from "./commands.js";
|
|
97
99
|
import { SessionControlController } from "./control.js";
|
|
98
100
|
import { SessionHistoryController } from "./history.js";
|
|
99
101
|
import { SessionFileReferences } from "./file-references.js";
|
|
@@ -106,6 +108,15 @@ import { ArchivedSessionGate } from "./archived-session-gate.js";
|
|
|
106
108
|
export { ApiSessionNotFound } from "./agent.js";
|
|
107
109
|
export { SessionFileReferences } from "./file-references.js";
|
|
108
110
|
export { SessionSkillCatalog } from "./skill-catalog.js";
|
|
111
|
+
/**
|
|
112
|
+
* Read the Session resource a history address names: the Session itself, or
|
|
113
|
+
* the child Session whose transcript a subagent address reads.
|
|
114
|
+
* @param request - history request carrying the durable address.
|
|
115
|
+
* @returns the Session whose access the read requires.
|
|
116
|
+
*/
|
|
117
|
+
function addressedSession(request) {
|
|
118
|
+
return request.address.kind === 'session' ? request.address.sessionId : request.address.childSessionId;
|
|
119
|
+
}
|
|
109
120
|
/** Host service backing the generated `ctx.remote.session` namespace. */
|
|
110
121
|
let SessionController = (() => {
|
|
111
122
|
let _classSuper = TypertRemoteService;
|
|
@@ -147,8 +158,8 @@ let SessionController = (() => {
|
|
|
147
158
|
_attachment_decorators = [Remote('attachment')];
|
|
148
159
|
_updateQueue_decorators = [Remote('updateQueue')];
|
|
149
160
|
_cancel_decorators = [Remote('cancel')];
|
|
150
|
-
_page_decorators = [Remote('page')];
|
|
151
|
-
_follow_decorators = [Remote({ mode: 'stream' })];
|
|
161
|
+
_page_decorators = [Remote({ name: 'page', resources: { session: addressedSession } })];
|
|
162
|
+
_follow_decorators = [Remote({ mode: 'stream', resources: { session: addressedSession } })];
|
|
152
163
|
_projections_decorators = [Remote('projections')];
|
|
153
164
|
_control_decorators = [Remote({ mode: 'stream' })];
|
|
154
165
|
__esDecorate(this, null, _list_decorators, { kind: "method", name: "list", static: false, private: false, access: { has: obj => "list" in obj, get: obj => obj.list }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
@@ -179,6 +190,7 @@ let SessionController = (() => {
|
|
|
179
190
|
'fileUploads',
|
|
180
191
|
'fs',
|
|
181
192
|
'llm',
|
|
193
|
+
'remoteAccess',
|
|
182
194
|
'sessions',
|
|
183
195
|
'sessionProjections',
|
|
184
196
|
'sessionQuery',
|
|
@@ -207,6 +219,7 @@ let SessionController = (() => {
|
|
|
207
219
|
*/
|
|
208
220
|
constructor(ctx, config, internals = {}) {
|
|
209
221
|
super(ctx, 'sessionController', { namespace: 'session' });
|
|
222
|
+
ctx.typert.resources.register('session', { field: 'sessionId' });
|
|
210
223
|
const resolved = SessionController.Config(config);
|
|
211
224
|
installModelSelectionProjection(ctx);
|
|
212
225
|
this.agents = new ApiSessionAgentController(ctx);
|
|
@@ -324,21 +337,25 @@ let SessionController = (() => {
|
|
|
324
337
|
* @returns visible Session summaries ordered by activity.
|
|
325
338
|
*/
|
|
326
339
|
async list(_request, signal) {
|
|
327
|
-
|
|
340
|
+
const items = await this.listState.list(signal);
|
|
341
|
+
return { items: items.filter(item => this.ctx.remoteAccess.allows({ kind: 'session', id: item.sessionId })) };
|
|
328
342
|
}
|
|
329
343
|
/**
|
|
330
|
-
* Search visible Session content without resuming an Agent.
|
|
344
|
+
* Search visible Session content without resuming an Agent. A non-owner
|
|
345
|
+
* receives only the hits whose Session `allows()` admits; `hasMore`
|
|
346
|
+
* describes the bounded result before that filtering.
|
|
331
347
|
* @param request - literal message-content query.
|
|
332
348
|
* @param signal - cancellation for list and search reads.
|
|
333
349
|
* @returns authorized bounded Session search results.
|
|
334
350
|
*/
|
|
335
|
-
search(request, signal) {
|
|
336
|
-
|
|
351
|
+
async search(request, signal) {
|
|
352
|
+
const result = await this.listState.search(request.query, signal);
|
|
353
|
+
return { ...result, items: result.items.filter(item => this.ctx.remoteAccess.allows({ kind: 'session', id: item.sessionId })) };
|
|
337
354
|
}
|
|
338
355
|
/**
|
|
339
|
-
* Create
|
|
340
|
-
* @param request -
|
|
341
|
-
* @returns the Session identity and
|
|
356
|
+
* Create one ordinary Session for a new conversation, reusing the named blank Session while it is reusable.
|
|
357
|
+
* @param request - optional blank Session to reuse, location, and Agent preset.
|
|
358
|
+
* @returns the created or reused Session identity and its preset when configured.
|
|
342
359
|
*/
|
|
343
360
|
create(request) {
|
|
344
361
|
return this.commands.create(request);
|
|
@@ -483,9 +500,26 @@ let SessionController = (() => {
|
|
|
483
500
|
* @param signal - caller cancellation before prompt admission begins.
|
|
484
501
|
* @returns acknowledgement that the Agent accepted the prompt.
|
|
485
502
|
*/
|
|
486
|
-
prompt(request, signal) {
|
|
503
|
+
async prompt(request, signal) {
|
|
487
504
|
signal.throwIfAborted();
|
|
488
|
-
|
|
505
|
+
if (!hasPromptContent(request.content)) {
|
|
506
|
+
throw new RemoteError('gateway/bad-request', 'prompt content must include non-whitespace text or an attachment', {});
|
|
507
|
+
}
|
|
508
|
+
const clientTimeZone = request.clientTimeZone === undefined
|
|
509
|
+
? undefined
|
|
510
|
+
: canonicalClientTimeZone(request.clientTimeZone);
|
|
511
|
+
if (request.clientTimeZone !== undefined && clientTimeZone === undefined) {
|
|
512
|
+
throw new RemoteError('session/invalid-time-zone', 'clientTimeZone must be UTC or a valid IANA Area/Location name', { value: request.clientTimeZone });
|
|
513
|
+
}
|
|
514
|
+
// The caller is recorded only when it is not the owner, so owner messages keep their exact source.
|
|
515
|
+
const principal = principalOf(this.ctx.invocation);
|
|
516
|
+
const source = {
|
|
517
|
+
kind: 'user',
|
|
518
|
+
rpcId: request.requestId,
|
|
519
|
+
...(clientTimeZone === undefined ? {} : { clientTimeZone }),
|
|
520
|
+
...(principal === undefined ? {} : { principal }),
|
|
521
|
+
};
|
|
522
|
+
return this.commands.prompt(request, source);
|
|
489
523
|
}
|
|
490
524
|
/**
|
|
491
525
|
* Read one image proven reachable from the addressed Session log.
|
|
@@ -598,8 +632,24 @@ let SessionController = (() => {
|
|
|
598
632
|
* @param signal - cancellation owned by the Remote stream carrier.
|
|
599
633
|
* @returns one complete baseline followed by live replacement frames.
|
|
600
634
|
*/
|
|
601
|
-
control(signal) {
|
|
602
|
-
|
|
635
|
+
async *control(signal) {
|
|
636
|
+
for await (const frame of this.controlState.control(signal)) {
|
|
637
|
+
switch (frame.type) {
|
|
638
|
+
case 'baseline': {
|
|
639
|
+
const projections = Object.fromEntries(Object.entries(frame.value.projections)
|
|
640
|
+
.filter(([sessionId]) => this.ctx.remoteAccess.allows({ kind: 'session', id: sessionId })));
|
|
641
|
+
yield { type: 'baseline', value: { ...frame.value, projections } };
|
|
642
|
+
break;
|
|
643
|
+
}
|
|
644
|
+
case 'projection':
|
|
645
|
+
if (this.ctx.remoteAccess.allows({ kind: 'session', id: frame.sessionId }))
|
|
646
|
+
yield frame;
|
|
647
|
+
break;
|
|
648
|
+
/* v8 ignore next -- closed control-frame union. */
|
|
649
|
+
default:
|
|
650
|
+
assertNever(frame);
|
|
651
|
+
}
|
|
652
|
+
}
|
|
603
653
|
}
|
|
604
654
|
};
|
|
605
655
|
})();
|
package/lib/types/types.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ import type { LlmAttemptId, MessageId } from '@deepseek-ai/dsh-llm/brand';
|
|
|
6
6
|
import type { TextBlock } from '@deepseek-ai/dsh-llm';
|
|
7
7
|
import type { SessionId, SessionSeqCursor } from '@deepseek-ai/dsh-session/types';
|
|
8
8
|
import type { SessionProjectionMap } from '@deepseek-ai/dsh-session-projection/types';
|
|
9
|
+
import type { Principal } from '@deepseek-ai/dsh-typert-protocol';
|
|
9
10
|
import type { JsonValue } from '@deepseek-ai/dsh-util-values';
|
|
10
11
|
import type { WorkspaceId } from '@deepseek-ai/dsh-workspace/types';
|
|
11
12
|
declare module '@deepseek-ai/dsh-session-projection/types' {
|
|
@@ -211,7 +212,6 @@ declare module '@deepseek-ai/dsh-typert-protocol' {
|
|
|
211
212
|
'agent-preset/conflict': {
|
|
212
213
|
readonly sessionId: SessionId;
|
|
213
214
|
readonly requestedPreset: string;
|
|
214
|
-
readonly existingPreset?: string;
|
|
215
215
|
};
|
|
216
216
|
'session/attachment-invalid': {
|
|
217
217
|
readonly reason: string;
|
|
@@ -280,16 +280,22 @@ export interface SessionSearchValue {
|
|
|
280
280
|
readonly items: readonly SessionSearchItem[];
|
|
281
281
|
readonly hasMore: boolean;
|
|
282
282
|
}
|
|
283
|
-
/** Session
|
|
283
|
+
/** Request for a Session for a new conversation. */
|
|
284
284
|
export interface SessionCreateRequest {
|
|
285
|
+
/** Workspace the Session joins; exclusive with `cwd`. */
|
|
285
286
|
readonly workspaceId?: WorkspaceId;
|
|
287
|
+
/** Directory the Session owns when no Workspace is named. */
|
|
286
288
|
readonly cwd?: string;
|
|
289
|
+
/** Blank Session to reuse while it is reusable, or the identity of a new Session when none is stored under it. */
|
|
287
290
|
readonly sessionId?: SessionId;
|
|
291
|
+
/** Preset the Session runs, replacing a reused Session's recorded preset; the configured default when omitted. */
|
|
288
292
|
readonly agentPreset?: string;
|
|
289
293
|
}
|
|
290
294
|
/** Session creation response value. */
|
|
291
295
|
export interface SessionCreateValue {
|
|
296
|
+
/** The created or reused Session, which may differ from the requested `sessionId`. */
|
|
292
297
|
readonly sessionId: SessionId;
|
|
298
|
+
/** Preset the Session runs, when the deployment composes a preset roster. */
|
|
293
299
|
readonly agentPreset?: string;
|
|
294
300
|
}
|
|
295
301
|
/** Session model-selection request. */
|
|
@@ -381,11 +387,16 @@ export interface SessionOpenWorkspacePathValue {
|
|
|
381
387
|
export type SessionRequestId = Branded<'session-request-id'>;
|
|
382
388
|
declare module '@deepseek-ai/dsh-llm' {
|
|
383
389
|
interface MessageSourceMap {
|
|
384
|
-
/**
|
|
390
|
+
/**
|
|
391
|
+
* Browser prompt correlation, optional Host-validated time zone, and the
|
|
392
|
+
* caller that submitted the prompt. `principal` is written only for a
|
|
393
|
+
* caller other than the owner, so an absent `principal` means the owner.
|
|
394
|
+
*/
|
|
385
395
|
'user-rpc': {
|
|
386
396
|
kind: 'user';
|
|
387
397
|
rpcId: SessionRequestId;
|
|
388
398
|
clientTimeZone?: string;
|
|
399
|
+
principal?: Principal;
|
|
389
400
|
};
|
|
390
401
|
}
|
|
391
402
|
}
|
package/locale/en.json
ADDED
package/locale/zh.json
ADDED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deepseek-ai/dsh-api-session-controller",
|
|
3
3
|
"description": "Session Remote commands, cold reads, and live control transport",
|
|
4
|
-
"version": "0.2.1-alpha.
|
|
4
|
+
"version": "0.2.1-alpha.4",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -39,7 +39,8 @@
|
|
|
39
39
|
"default": "./lib/typert.remote-client.js"
|
|
40
40
|
},
|
|
41
41
|
"./src/*": "./src/*",
|
|
42
|
-
"./package.json": "./package.json"
|
|
42
|
+
"./package.json": "./package.json",
|
|
43
|
+
"./locale/*.json": "./locale/*.json"
|
|
43
44
|
},
|
|
44
45
|
"dsh": {
|
|
45
46
|
"client": {
|
|
@@ -54,6 +55,7 @@
|
|
|
54
55
|
}
|
|
55
56
|
},
|
|
56
57
|
"files": [
|
|
58
|
+
"locale/*.json",
|
|
57
59
|
"lib/index.js",
|
|
58
60
|
"lib/client.js",
|
|
59
61
|
"lib/types/**/*.js",
|
|
@@ -65,44 +67,44 @@
|
|
|
65
67
|
],
|
|
66
68
|
"license": "MIT",
|
|
67
69
|
"dependencies": {
|
|
68
|
-
"@deepseek-ai/dsh-brand": "0.2.1-alpha.
|
|
69
|
-
"@deepseek-ai/dsh-deque": "0.2.1-alpha.
|
|
70
|
-
"@deepseek-ai/schemastery": "~3.18.5-alpha.
|
|
70
|
+
"@deepseek-ai/dsh-brand": "0.2.1-alpha.4",
|
|
71
|
+
"@deepseek-ai/dsh-deque": "0.2.1-alpha.4",
|
|
72
|
+
"@deepseek-ai/schemastery": "~3.18.5-alpha.2",
|
|
71
73
|
"mime-types": "^3.0.2",
|
|
72
|
-
"zod": "
|
|
74
|
+
"zod": "4.4.3"
|
|
73
75
|
},
|
|
74
76
|
"peerDependencies": {
|
|
75
|
-
"@deepseek-ai/cordis": "~4.0.5-alpha.
|
|
76
|
-
"@deepseek-ai/dsh-agent": "0.2.1-alpha.
|
|
77
|
-
"@deepseek-ai/dsh-agent-default-model": "0.2.1-alpha.
|
|
78
|
-
"@deepseek-ai/dsh-agent-preset-registry": "0.2.1-alpha.
|
|
79
|
-
"@deepseek-ai/dsh-api-gateway": "0.2.1-alpha.
|
|
80
|
-
"@deepseek-ai/dsh-attachment": "0.2.1-alpha.
|
|
81
|
-
"@deepseek-ai/dsh-client-connection": "0.2.1-alpha.
|
|
82
|
-
"@deepseek-ai/dsh-client-file-upload": "0.2.1-alpha.
|
|
83
|
-
"@deepseek-ai/dsh-commands": "0.2.1-alpha.
|
|
84
|
-
"@deepseek-ai/dsh-credentials": "0.2.1-alpha.
|
|
85
|
-
"@deepseek-ai/dsh-file-reference": "0.2.1-alpha.
|
|
86
|
-
"@deepseek-ai/dsh-fs": "0.2.1-alpha.
|
|
87
|
-
"@deepseek-ai/dsh-llm": "0.2.1-alpha.
|
|
88
|
-
"@deepseek-ai/dsh-native-command": "0.2.1-alpha.
|
|
89
|
-
"@deepseek-ai/dsh-scope": "0.2.1-alpha.
|
|
90
|
-
"@deepseek-ai/dsh-session": "0.2.1-alpha.
|
|
91
|
-
"@deepseek-ai/dsh-session-persistence": "0.2.1-alpha.
|
|
92
|
-
"@deepseek-ai/dsh-session-projection": "0.2.1-alpha.
|
|
93
|
-
"@deepseek-ai/dsh-session-projection-cache": "0.2.1-alpha.
|
|
94
|
-
"@deepseek-ai/dsh-session-query": "0.2.1-alpha.
|
|
95
|
-
"@deepseek-ai/dsh-session-title": "0.2.1-alpha.
|
|
96
|
-
"@deepseek-ai/dsh-settings": "0.2.1-alpha.
|
|
97
|
-
"@deepseek-ai/dsh-skill": "0.2.1-alpha.
|
|
98
|
-
"@deepseek-ai/dsh-subagent": "0.2.1-alpha.
|
|
99
|
-
"@deepseek-ai/dsh-typert-protocol": "0.2.1-alpha.
|
|
100
|
-
"@deepseek-ai/dsh-typert-registry": "0.2.1-alpha.
|
|
101
|
-
"@deepseek-ai/dsh-util-time": "0.2.1-alpha.
|
|
102
|
-
"@deepseek-ai/dsh-util-values": "0.2.1-alpha.
|
|
103
|
-
"@deepseek-ai/dsh-util-workspace-path": "0.2.1-alpha.
|
|
104
|
-
"@deepseek-ai/dsh-workspace": "0.2.1-alpha.
|
|
105
|
-
"@deepseek-ai/dsh-working-directory": "0.2.1-alpha.
|
|
77
|
+
"@deepseek-ai/cordis": "~4.0.5-alpha.2",
|
|
78
|
+
"@deepseek-ai/dsh-agent": "0.2.1-alpha.4",
|
|
79
|
+
"@deepseek-ai/dsh-agent-default-model": "0.2.1-alpha.4",
|
|
80
|
+
"@deepseek-ai/dsh-agent-preset-registry": "0.2.1-alpha.4",
|
|
81
|
+
"@deepseek-ai/dsh-api-gateway": "0.2.1-alpha.4",
|
|
82
|
+
"@deepseek-ai/dsh-attachment": "0.2.1-alpha.4",
|
|
83
|
+
"@deepseek-ai/dsh-client-connection": "0.2.1-alpha.4",
|
|
84
|
+
"@deepseek-ai/dsh-client-file-upload": "0.2.1-alpha.4",
|
|
85
|
+
"@deepseek-ai/dsh-commands": "0.2.1-alpha.4",
|
|
86
|
+
"@deepseek-ai/dsh-credentials": "0.2.1-alpha.4",
|
|
87
|
+
"@deepseek-ai/dsh-file-reference": "0.2.1-alpha.4",
|
|
88
|
+
"@deepseek-ai/dsh-fs": "0.2.1-alpha.4",
|
|
89
|
+
"@deepseek-ai/dsh-llm": "0.2.1-alpha.4",
|
|
90
|
+
"@deepseek-ai/dsh-native-command": "0.2.1-alpha.4",
|
|
91
|
+
"@deepseek-ai/dsh-scope": "0.2.1-alpha.4",
|
|
92
|
+
"@deepseek-ai/dsh-session": "0.2.1-alpha.4",
|
|
93
|
+
"@deepseek-ai/dsh-session-persistence": "0.2.1-alpha.4",
|
|
94
|
+
"@deepseek-ai/dsh-session-projection": "0.2.1-alpha.4",
|
|
95
|
+
"@deepseek-ai/dsh-session-projection-cache": "0.2.1-alpha.4",
|
|
96
|
+
"@deepseek-ai/dsh-session-query": "0.2.1-alpha.4",
|
|
97
|
+
"@deepseek-ai/dsh-session-title": "0.2.1-alpha.4",
|
|
98
|
+
"@deepseek-ai/dsh-settings": "0.2.1-alpha.4",
|
|
99
|
+
"@deepseek-ai/dsh-skill": "0.2.1-alpha.4",
|
|
100
|
+
"@deepseek-ai/dsh-subagent": "0.2.1-alpha.4",
|
|
101
|
+
"@deepseek-ai/dsh-typert-protocol": "0.2.1-alpha.4",
|
|
102
|
+
"@deepseek-ai/dsh-typert-registry": "0.2.1-alpha.4",
|
|
103
|
+
"@deepseek-ai/dsh-util-time": "0.2.1-alpha.4",
|
|
104
|
+
"@deepseek-ai/dsh-util-values": "0.2.1-alpha.4",
|
|
105
|
+
"@deepseek-ai/dsh-util-workspace-path": "0.2.1-alpha.4",
|
|
106
|
+
"@deepseek-ai/dsh-workspace": "0.2.1-alpha.4",
|
|
107
|
+
"@deepseek-ai/dsh-working-directory": "0.2.1-alpha.4"
|
|
106
108
|
},
|
|
107
109
|
"peerDependenciesMeta": {
|
|
108
110
|
"@deepseek-ai/dsh-session-persistence": {
|
|
@@ -116,50 +118,51 @@
|
|
|
116
118
|
}
|
|
117
119
|
},
|
|
118
120
|
"devDependencies": {
|
|
119
|
-
"@deepseek-ai/
|
|
120
|
-
"@deepseek-ai/
|
|
121
|
-
"@deepseek-ai/dsh-agent
|
|
122
|
-
"@deepseek-ai/dsh-agent-
|
|
123
|
-
"@deepseek-ai/dsh-agent-loop
|
|
124
|
-
"@deepseek-ai/dsh-agent-
|
|
125
|
-
"@deepseek-ai/dsh-
|
|
126
|
-
"@deepseek-ai/dsh-
|
|
127
|
-
"@deepseek-ai/dsh-
|
|
128
|
-
"@deepseek-ai/dsh-client-
|
|
129
|
-
"@deepseek-ai/dsh-client-
|
|
130
|
-
"@deepseek-ai/dsh-client-
|
|
131
|
-
"@deepseek-ai/dsh-
|
|
132
|
-
"@deepseek-ai/dsh-
|
|
133
|
-
"@deepseek-ai/dsh-
|
|
134
|
-
"@deepseek-ai/dsh-
|
|
135
|
-
"@deepseek-ai/dsh-fs
|
|
136
|
-
"@deepseek-ai/dsh-
|
|
137
|
-
"@deepseek-ai/dsh-
|
|
138
|
-
"@deepseek-ai/dsh-
|
|
139
|
-
"@deepseek-ai/dsh-
|
|
140
|
-
"@deepseek-ai/dsh-
|
|
141
|
-
"@deepseek-ai/dsh-
|
|
142
|
-
"@deepseek-ai/dsh-session
|
|
143
|
-
"@deepseek-ai/dsh-session-persistence
|
|
144
|
-
"@deepseek-ai/dsh-session-
|
|
145
|
-
"@deepseek-ai/dsh-session-projection
|
|
146
|
-
"@deepseek-ai/dsh-session-
|
|
147
|
-
"@deepseek-ai/dsh-session-
|
|
148
|
-
"@deepseek-ai/dsh-
|
|
149
|
-
"@deepseek-ai/dsh-
|
|
150
|
-
"@deepseek-ai/dsh-
|
|
151
|
-
"@deepseek-ai/dsh-storage
|
|
152
|
-
"@deepseek-ai/dsh-storage-
|
|
153
|
-
"@deepseek-ai/dsh-
|
|
154
|
-
"@deepseek-ai/dsh-
|
|
155
|
-
"@deepseek-ai/dsh-typert-
|
|
156
|
-
"@deepseek-ai/dsh-
|
|
157
|
-
"@deepseek-ai/dsh-util-
|
|
158
|
-
"@deepseek-ai/dsh-util-
|
|
159
|
-
"@deepseek-ai/dsh-util-
|
|
160
|
-
"@deepseek-ai/dsh-workspace": "0.2.1-alpha.
|
|
121
|
+
"@deepseek-ai/dsh-api-remote-access": "0.2.1-alpha.4",
|
|
122
|
+
"@deepseek-ai/cordis": "~4.0.5-alpha.2",
|
|
123
|
+
"@deepseek-ai/dsh-agent": "0.2.1-alpha.4",
|
|
124
|
+
"@deepseek-ai/dsh-agent-default-model": "0.2.1-alpha.4",
|
|
125
|
+
"@deepseek-ai/dsh-agent-loop": "0.2.1-alpha.4",
|
|
126
|
+
"@deepseek-ai/dsh-agent-loop-testkit": "0.2.1-alpha.4",
|
|
127
|
+
"@deepseek-ai/dsh-agent-preset-registry": "0.2.1-alpha.4",
|
|
128
|
+
"@deepseek-ai/dsh-api-gateway": "0.2.1-alpha.4",
|
|
129
|
+
"@deepseek-ai/dsh-attachment": "0.2.1-alpha.4",
|
|
130
|
+
"@deepseek-ai/dsh-client-connection": "0.2.1-alpha.4",
|
|
131
|
+
"@deepseek-ai/dsh-client-file-upload": "0.2.1-alpha.4",
|
|
132
|
+
"@deepseek-ai/dsh-client-store": "0.2.1-alpha.4",
|
|
133
|
+
"@deepseek-ai/dsh-client-test-runtime": "0.2.1-alpha.4",
|
|
134
|
+
"@deepseek-ai/dsh-commands": "0.2.1-alpha.4",
|
|
135
|
+
"@deepseek-ai/dsh-credentials": "0.2.1-alpha.4",
|
|
136
|
+
"@deepseek-ai/dsh-file-reference": "0.2.1-alpha.4",
|
|
137
|
+
"@deepseek-ai/dsh-fs": "0.2.1-alpha.4",
|
|
138
|
+
"@deepseek-ai/dsh-fs-local": "0.2.1-alpha.4",
|
|
139
|
+
"@deepseek-ai/dsh-llm": "0.2.1-alpha.4",
|
|
140
|
+
"@deepseek-ai/dsh-native-command": "0.2.1-alpha.4",
|
|
141
|
+
"@deepseek-ai/dsh-permission-presets": "0.2.1-alpha.4",
|
|
142
|
+
"@deepseek-ai/dsh-remote-mock": "0.2.1-alpha.4",
|
|
143
|
+
"@deepseek-ai/dsh-scope": "0.2.1-alpha.4",
|
|
144
|
+
"@deepseek-ai/dsh-session": "0.2.1-alpha.4",
|
|
145
|
+
"@deepseek-ai/dsh-session-persistence": "0.2.1-alpha.4",
|
|
146
|
+
"@deepseek-ai/dsh-session-persistence-jsonl": "0.2.1-alpha.4",
|
|
147
|
+
"@deepseek-ai/dsh-session-projection": "0.2.1-alpha.4",
|
|
148
|
+
"@deepseek-ai/dsh-session-projection-cache": "0.2.1-alpha.4",
|
|
149
|
+
"@deepseek-ai/dsh-session-query": "0.2.1-alpha.4",
|
|
150
|
+
"@deepseek-ai/dsh-session-title": "0.2.1-alpha.4",
|
|
151
|
+
"@deepseek-ai/dsh-settings": "0.2.1-alpha.4",
|
|
152
|
+
"@deepseek-ai/dsh-skill": "0.2.1-alpha.4",
|
|
153
|
+
"@deepseek-ai/dsh-storage": "0.2.1-alpha.4",
|
|
154
|
+
"@deepseek-ai/dsh-storage-domain": "0.2.1-alpha.4",
|
|
155
|
+
"@deepseek-ai/dsh-storage-json": "0.2.1-alpha.4",
|
|
156
|
+
"@deepseek-ai/dsh-subagent": "0.2.1-alpha.4",
|
|
157
|
+
"@deepseek-ai/dsh-typert-protocol": "0.2.1-alpha.4",
|
|
158
|
+
"@deepseek-ai/dsh-typert-registry": "0.2.1-alpha.4",
|
|
159
|
+
"@deepseek-ai/dsh-util-crypto": "0.2.1-alpha.4",
|
|
160
|
+
"@deepseek-ai/dsh-util-time": "0.2.1-alpha.4",
|
|
161
|
+
"@deepseek-ai/dsh-util-values": "0.2.1-alpha.4",
|
|
162
|
+
"@deepseek-ai/dsh-util-workspace-path": "0.2.1-alpha.4",
|
|
163
|
+
"@deepseek-ai/dsh-workspace": "0.2.1-alpha.4",
|
|
161
164
|
"@types/mime-types": "^3.0.1",
|
|
162
|
-
"@deepseek-ai/dsh-working-directory": "0.2.1-alpha.
|
|
165
|
+
"@deepseek-ai/dsh-working-directory": "0.2.1-alpha.4"
|
|
163
166
|
},
|
|
164
167
|
"scripts": {
|
|
165
168
|
"bundle": "tsdown",
|