@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.
@@ -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
- function hasPromptContent(content) {
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 or idempotently adopt one ordinary Session.
104
- * @param request - requested identity, location, and Agent preset.
105
- * @returns the Session identity and resolved preset when configured.
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 adopted;
126
+ let created;
123
127
  try {
124
- adopted = await this.agents.ensureSession(sessionId, cwd, request.sessionId !== undefined, request.agentPreset);
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(sessionId, error);
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
- const agentPreset = this.agents.presetForSession(adopted.session);
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
- * Reject empty content, then admit one prompt after Agent and attachment validation.
287
- * @param request - Session identity, prompt content, source metadata, and delivery mode.
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(sessionId, error) {
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 "${sessionId}": ${String(error)}`, {});
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);
@@ -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 or idempotently adopt one ordinary Session.
96
- * @param request - requested identity, location, and Agent preset.
97
- * @returns the Session identity and resolved preset when configured.
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
  /**
@@ -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
- return { items: await this.listState.list(signal) };
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
- return this.listState.search(request.query, signal);
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 or idempotently adopt one ordinary Session.
340
- * @param request - requested identity, location, and Agent preset.
341
- * @returns the Session identity and resolved preset when configured.
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
- return this.commands.prompt(request);
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
- return this.controlState.control(signal);
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
  })();
@@ -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 creation or explicit-id adoption request. */
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
- /** Browser prompt correlation and optional Host-validated time zone. */
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
@@ -0,0 +1,5 @@
1
+ {
2
+ "meta": {
3
+ "title": "api-session-controller"
4
+ }
5
+ }
package/locale/zh.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "会话控制接口",
4
+ "description": "向客户端提供会话读取、运行控制和状态更新能力。"
5
+ }
6
+ }
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.2",
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.2",
69
- "@deepseek-ai/dsh-deque": "0.2.1-alpha.2",
70
- "@deepseek-ai/schemastery": "~3.18.5-alpha.1",
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": "^4.4.3"
74
+ "zod": "4.4.3"
73
75
  },
74
76
  "peerDependencies": {
75
- "@deepseek-ai/cordis": "~4.0.5-alpha.1",
76
- "@deepseek-ai/dsh-agent": "0.2.1-alpha.2",
77
- "@deepseek-ai/dsh-agent-default-model": "0.2.1-alpha.2",
78
- "@deepseek-ai/dsh-agent-preset-registry": "0.2.1-alpha.2",
79
- "@deepseek-ai/dsh-api-gateway": "0.2.1-alpha.2",
80
- "@deepseek-ai/dsh-attachment": "0.2.1-alpha.2",
81
- "@deepseek-ai/dsh-client-connection": "0.2.1-alpha.2",
82
- "@deepseek-ai/dsh-client-file-upload": "0.2.1-alpha.2",
83
- "@deepseek-ai/dsh-commands": "0.2.1-alpha.2",
84
- "@deepseek-ai/dsh-credentials": "0.2.1-alpha.2",
85
- "@deepseek-ai/dsh-file-reference": "0.2.1-alpha.2",
86
- "@deepseek-ai/dsh-fs": "0.2.1-alpha.2",
87
- "@deepseek-ai/dsh-llm": "0.2.1-alpha.2",
88
- "@deepseek-ai/dsh-native-command": "0.2.1-alpha.2",
89
- "@deepseek-ai/dsh-scope": "0.2.1-alpha.2",
90
- "@deepseek-ai/dsh-session": "0.2.1-alpha.2",
91
- "@deepseek-ai/dsh-session-persistence": "0.2.1-alpha.2",
92
- "@deepseek-ai/dsh-session-projection": "0.2.1-alpha.2",
93
- "@deepseek-ai/dsh-session-projection-cache": "0.2.1-alpha.2",
94
- "@deepseek-ai/dsh-session-query": "0.2.1-alpha.2",
95
- "@deepseek-ai/dsh-session-title": "0.2.1-alpha.2",
96
- "@deepseek-ai/dsh-settings": "0.2.1-alpha.2",
97
- "@deepseek-ai/dsh-skill": "0.2.1-alpha.2",
98
- "@deepseek-ai/dsh-subagent": "0.2.1-alpha.2",
99
- "@deepseek-ai/dsh-typert-protocol": "0.2.1-alpha.2",
100
- "@deepseek-ai/dsh-typert-registry": "0.2.1-alpha.2",
101
- "@deepseek-ai/dsh-util-time": "0.2.1-alpha.2",
102
- "@deepseek-ai/dsh-util-values": "0.2.1-alpha.2",
103
- "@deepseek-ai/dsh-util-workspace-path": "0.2.1-alpha.2",
104
- "@deepseek-ai/dsh-workspace": "0.2.1-alpha.2",
105
- "@deepseek-ai/dsh-working-directory": "0.2.1-alpha.2"
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/cordis": "~4.0.5-alpha.1",
120
- "@deepseek-ai/dsh-agent": "0.2.1-alpha.2",
121
- "@deepseek-ai/dsh-agent-default-model": "0.2.1-alpha.2",
122
- "@deepseek-ai/dsh-agent-loop": "0.2.1-alpha.2",
123
- "@deepseek-ai/dsh-agent-loop-testkit": "0.2.1-alpha.2",
124
- "@deepseek-ai/dsh-agent-preset-registry": "0.2.1-alpha.2",
125
- "@deepseek-ai/dsh-api-gateway": "0.2.1-alpha.2",
126
- "@deepseek-ai/dsh-attachment": "0.2.1-alpha.2",
127
- "@deepseek-ai/dsh-client-connection": "0.2.1-alpha.2",
128
- "@deepseek-ai/dsh-client-file-upload": "0.2.1-alpha.2",
129
- "@deepseek-ai/dsh-client-store": "0.2.1-alpha.2",
130
- "@deepseek-ai/dsh-client-test-runtime": "0.2.1-alpha.2",
131
- "@deepseek-ai/dsh-commands": "0.2.1-alpha.2",
132
- "@deepseek-ai/dsh-credentials": "0.2.1-alpha.2",
133
- "@deepseek-ai/dsh-file-reference": "0.2.1-alpha.2",
134
- "@deepseek-ai/dsh-fs": "0.2.1-alpha.2",
135
- "@deepseek-ai/dsh-fs-local": "0.2.1-alpha.2",
136
- "@deepseek-ai/dsh-llm": "0.2.1-alpha.2",
137
- "@deepseek-ai/dsh-native-command": "0.2.1-alpha.2",
138
- "@deepseek-ai/dsh-permission-presets": "0.2.1-alpha.2",
139
- "@deepseek-ai/dsh-remote-mock": "0.2.1-alpha.2",
140
- "@deepseek-ai/dsh-scope": "0.2.1-alpha.2",
141
- "@deepseek-ai/dsh-session": "0.2.1-alpha.2",
142
- "@deepseek-ai/dsh-session-persistence": "0.2.1-alpha.2",
143
- "@deepseek-ai/dsh-session-persistence-jsonl": "0.2.1-alpha.2",
144
- "@deepseek-ai/dsh-session-projection": "0.2.1-alpha.2",
145
- "@deepseek-ai/dsh-session-projection-cache": "0.2.1-alpha.2",
146
- "@deepseek-ai/dsh-session-query": "0.2.1-alpha.2",
147
- "@deepseek-ai/dsh-session-title": "0.2.1-alpha.2",
148
- "@deepseek-ai/dsh-settings": "0.2.1-alpha.2",
149
- "@deepseek-ai/dsh-skill": "0.2.1-alpha.2",
150
- "@deepseek-ai/dsh-storage": "0.2.1-alpha.2",
151
- "@deepseek-ai/dsh-storage-domain": "0.2.1-alpha.2",
152
- "@deepseek-ai/dsh-storage-json": "0.2.1-alpha.2",
153
- "@deepseek-ai/dsh-subagent": "0.2.1-alpha.2",
154
- "@deepseek-ai/dsh-typert-protocol": "0.2.1-alpha.2",
155
- "@deepseek-ai/dsh-typert-registry": "0.2.1-alpha.2",
156
- "@deepseek-ai/dsh-util-crypto": "0.2.1-alpha.2",
157
- "@deepseek-ai/dsh-util-time": "0.2.1-alpha.2",
158
- "@deepseek-ai/dsh-util-values": "0.2.1-alpha.2",
159
- "@deepseek-ai/dsh-util-workspace-path": "0.2.1-alpha.2",
160
- "@deepseek-ai/dsh-workspace": "0.2.1-alpha.2",
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.2"
165
+ "@deepseek-ai/dsh-working-directory": "0.2.1-alpha.4"
163
166
  },
164
167
  "scripts": {
165
168
  "bundle": "tsdown",