@deepseek-ai/dsh-api-session-controller 0.1.7-alpha.1 → 0.1.7-rc.1

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.
@@ -15,10 +15,15 @@ function projectionsBaseline(value) {
15
15
  asOfSeq: value.asOfSeq === -1 ? -1 : SessionSeq(value.asOfSeq),
16
16
  };
17
17
  }
18
- /** Messages requested per history page. */
18
+ /** Minimum message count for ordinary history windows. */
19
19
  export const PAGE_MESSAGES = 50;
20
- /** Messages requested per page while a turn jump loops backwards (fewer, larger round trips). */
20
+ const HISTORY_PAGE_OPTIONS = { maxMessages: 500, turnWindow: { minMessages: PAGE_MESSAGES, minTurns: 2 } };
21
+ /** Minimum messages per page while a turn jump loops backwards. */
21
22
  export const JUMP_PAGE_MESSAGES = 200;
23
+ const JUMP_PAGE_OPTIONS = {
24
+ ...HISTORY_PAGE_OPTIONS,
25
+ turnWindow: { ...HISTORY_PAGE_OPTIONS.turnWindow, minMessages: JUMP_PAGE_MESSAGES },
26
+ };
22
27
  /**
23
28
  * Owns a session's event window, lifecycle state, and observable
24
29
  * snapshot. React bindings remain outside this data layer. Features see only
@@ -304,7 +309,7 @@ export class Session {
304
309
  this.openPromise = promise;
305
310
  return promise;
306
311
  }
307
- /** Page up: pull one earlier page with the window's first seq as beforeSeq and prepend. */
312
+ /** Prepend one Turn-aligned page: at least 50 messages and two Turn starts, capped at 500 messages. */
308
313
  async loadOlder() {
309
314
  if (this.openState !== 'open' || !this.hasMore || this.loadingOlder)
310
315
  return;
@@ -314,7 +319,10 @@ export class Session {
314
319
  this.loadingOlder = true;
315
320
  this.notifier.markDirty();
316
321
  try {
317
- await events.prepend({ beforeSeq: this.baseSeq, maxMessages: PAGE_MESSAGES });
322
+ await events.prepend({
323
+ beforeSeq: this.baseSeq,
324
+ ...HISTORY_PAGE_OPTIONS,
325
+ });
318
326
  }
319
327
  catch (error) {
320
328
  if (!isRemoteFailure(error)) {
@@ -363,7 +371,7 @@ export class Session {
363
371
  if (generation !== this.openGeneration)
364
372
  return;
365
373
  const before = pending.beforeSeq;
366
- await events.prepend({ beforeSeq: before, maxMessages: JUMP_PAGE_MESSAGES });
374
+ await events.prepend({ beforeSeq: before, ...JUMP_PAGE_OPTIONS });
367
375
  // No-progress guard: an empty or dropped page that still claims more
368
376
  // history must end the loop, not spin it.
369
377
  if (pending.beforeSeq >= before)
@@ -504,10 +512,12 @@ export class Session {
504
512
  async dispose() {
505
513
  this.stopObservingInbox();
506
514
  // Unsettled echoes retire as failed so their owners can restore or
507
- // release browser resources; echoes already scheduled as observed keep
508
- // that settlement.
509
- for (const requestId of [...this.submissionSettlements.keys()]) {
510
- this.retireFailedSubmission(requestId);
515
+ // release browser resources; admitted echoes keep their observed outcome.
516
+ for (const [requestId, settlement] of [...this.submissionSettlements]) {
517
+ if (settlement.admitted !== undefined)
518
+ this.scheduleObservedRetirement(requestId, settlement.admitted);
519
+ else
520
+ this.retireFailedSubmission(requestId);
511
521
  }
512
522
  this.openGeneration++;
513
523
  const events = this.events;
@@ -532,7 +542,7 @@ export class Session {
532
542
  });
533
543
  this.events = events;
534
544
  try {
535
- await events.open({ maxMessages: PAGE_MESSAGES });
545
+ await events.open(HISTORY_PAGE_OPTIONS);
536
546
  if (generation !== this.openGeneration || this.events !== events)
537
547
  return;
538
548
  this.openState = 'open';
@@ -585,7 +595,7 @@ export class Session {
585
595
  if (projections !== undefined)
586
596
  this.projections.seed(projections);
587
597
  this.eventSource.replace(visible, hasMore);
588
- // A new follow baseline replaces optimistic steering with Host-owned rows.
598
+ // A new follow baseline replaces confirmed optimistic inputs with Host-owned rows.
589
599
  // Receipt-backed inputs are accepted, not failed, even if their history is outside this window.
590
600
  if (projections !== undefined) {
591
601
  for (const [requestId, { receipt }] of this.submissionSettlements) {
@@ -598,7 +608,9 @@ export class Session {
598
608
  this.observeSubmissionEvent(entry.event);
599
609
  if (projections !== undefined) {
600
610
  const inbox = projections.values.inbox;
601
- this.observeSteeringInsertions(inbox?.['next-step'] ?? [], 0, projections.asOfSeq);
611
+ for (const target of ['next-turn', 'next-step']) {
612
+ this.observeSubmissionInsertions(target, inbox?.[target] ?? [], 0, projections.asOfSeq);
613
+ }
602
614
  }
603
615
  this.notifier.markDirty();
604
616
  }
@@ -622,8 +634,12 @@ export class Session {
622
634
  this.notifier.markDirty();
623
635
  return;
624
636
  }
625
- if (result?.type === 'publish' && this.appendLive(result.entry)) {
626
- this.notifier.markDirty();
637
+ if (result?.type === 'publish') {
638
+ const changed = this.appendLive(result.entry);
639
+ if (result.retireAttemptId !== undefined)
640
+ this.eventSource.settleAssistant(result.retireAttemptId);
641
+ if (changed || result.retireAttemptId !== undefined)
642
+ this.notifier.markDirty();
627
643
  }
628
644
  else if (result?.type === 'transient') {
629
645
  this.eventSource.append(result.entry);
@@ -662,30 +678,29 @@ export class Session {
662
678
  return;
663
679
  if (event.type === 'agent/inbox/spliced') {
664
680
  const { target, start, removedCount = 0, inserted, outcome } = event.data;
665
- if (target === 'next-step') {
666
- for (const [requestId, settlement] of this.submissionSettlements) {
667
- const receipt = settlement.receipt;
668
- if (receipt === undefined || receipt.index === null || receipt.seq >= event.seq)
669
- continue;
670
- const removed = receipt.index >= start && receipt.index < start + removedCount;
671
- if (removed && outcome === 'canceled')
672
- this.retireFailedSubmission(requestId);
673
- else
674
- settlement.receipt = {
675
- ...receipt,
676
- seq: event.seq,
677
- index: removed ? null : receipt.index < start ? receipt.index : receipt.index + inserted.length - removedCount,
678
- };
679
- }
680
- this.observeSteeringInsertions(inserted, start, event.seq);
681
+ for (const [requestId, settlement] of this.submissionSettlements) {
682
+ const receipt = settlement.receipt;
683
+ if (receipt?.target !== target || receipt.index === null || receipt.seq >= event.seq)
684
+ continue;
685
+ const removed = receipt.index >= start && receipt.index < start + removedCount;
686
+ if (removed && outcome === 'canceled')
687
+ this.retireFailedSubmission(requestId);
688
+ else
689
+ settlement.receipt = {
690
+ ...receipt,
691
+ seq: event.seq,
692
+ index: removed ? null : receipt.index < start ? receipt.index : receipt.index + inserted.length - removedCount,
693
+ };
681
694
  }
695
+ this.observeSubmissionInsertions(target, inserted, start, event.seq);
682
696
  for (const message of inserted)
683
697
  this.observeSubmissionMessage(message, false);
684
698
  return;
685
699
  }
686
700
  if (event.type === 'request/context' || event.type === 'turn/end') {
687
701
  for (const [requestId, settlement] of this.submissionSettlements) {
688
- if (settlement.receipt?.index === null && settlement.receipt.seq < event.seq)
702
+ if (settlement.admitted === undefined && settlement.receipt?.index === null
703
+ && settlement.receipt.seq < event.seq)
689
704
  this.retireFailedSubmission(requestId);
690
705
  }
691
706
  return;
@@ -693,34 +708,60 @@ export class Session {
693
708
  if (event.type === 'user/message')
694
709
  this.observeSubmissionMessage(event.data, true);
695
710
  }
696
- observeSteeringInsertions(messages, start, seq) {
711
+ observeSubmissionInsertions(target, messages, start, seq) {
697
712
  for (const [index, message] of messages.entries()) {
698
713
  const source = message.source;
699
714
  if (source.kind !== 'user' || !('rpcId' in source))
700
715
  continue;
701
716
  const settlement = this.submissionSettlements.get(source.rpcId);
702
- if (settlement?.placement !== 'steering' || settlement.retiring || (settlement.receipt?.seq ?? -1) > seq)
717
+ if (settlement === undefined || settlement.placement === 'queued'
718
+ || settlement.retiring || (settlement.receipt?.seq ?? -1) > seq)
703
719
  continue;
704
- settlement.receipt = { seq, index: start + index, attachments: attachmentRefsIn(message.content) };
720
+ settlement.receipt = { target, seq, index: start + index, attachments: attachmentRefsIn(message.content) };
705
721
  }
706
722
  }
707
723
  observeSubmissionMessage(message, admitted) {
708
724
  const source = message.source;
709
725
  if (source.kind !== 'user' || !('rpcId' in source))
710
726
  return;
711
- if (!admitted && this.submissionSettlements.get(source.rpcId)?.placement === 'steering')
727
+ const settlement = this.submissionSettlements.get(source.rpcId);
728
+ if (settlement === undefined || settlement.retiring)
729
+ return;
730
+ if (!admitted) {
731
+ if (settlement.placement === 'queued')
732
+ this.scheduleObservedRetirement(source.rpcId, attachmentRefsIn(message.content));
712
733
  return;
713
- this.scheduleObservedRetirement(source.rpcId, attachmentRefsIn(message.content));
734
+ }
735
+ settlement.admitted = attachmentRefsIn(message.content);
736
+ this.retireAdmittedSubmission(source.rpcId);
714
737
  }
715
- /** Retire non-steering echoes when the Inbox accepts their queue occurrences. */
738
+ /** Retire admitted Chat identities only after stale Inbox rows can no longer reappear. */
739
+ retireAdmittedSubmission(requestId) {
740
+ const settlement = this.submissionSettlements.get(requestId);
741
+ if (settlement?.admitted === undefined)
742
+ return;
743
+ const receipt = settlement.receipt;
744
+ if (receipt?.index === null
745
+ && (this.projections.seqOf('inbox') ?? -1) < receipt.seq)
746
+ return;
747
+ this.scheduleObservedRetirement(requestId, settlement.admitted);
748
+ }
749
+ /** Inbox acceptance retires queued echoes; its watermark completes admitted Chat handoffs. */
716
750
  observeSubmissionInbox() {
717
751
  if (this.submissionSettlements.size === 0)
718
752
  return;
719
753
  const inbox = this.projections.get('inbox');
720
754
  if (inbox === undefined)
721
755
  return;
722
- for (const message of [...inbox['next-turn'], ...inbox['next-step']])
723
- this.observeSubmissionMessage(message, false);
756
+ const seq = this.projections.seqOf('inbox');
757
+ for (const target of ['next-turn', 'next-step']) {
758
+ if (seq !== undefined)
759
+ this.observeSubmissionInsertions(target, inbox[target], 0, seq);
760
+ for (const message of inbox[target])
761
+ this.observeSubmissionMessage(message, false);
762
+ }
763
+ for (const requestId of this.submissionSettlements.keys())
764
+ this.retireAdmittedSubmission(requestId);
724
765
  }
725
766
  /**
726
767
  * Latch one observed settlement and remove the echo an animation frame
@@ -738,7 +779,7 @@ export class Session {
738
779
  /** Remove one unsettled echo immediately (prompt rejection, abort, or disposal). */
739
780
  retireFailedSubmission(requestId) {
740
781
  const settlement = this.submissionSettlements.get(requestId);
741
- if (settlement === undefined || settlement.retiring)
782
+ if (settlement === undefined || settlement.retiring || settlement.admitted !== undefined)
742
783
  return;
743
784
  settlement.retiring = true;
744
785
  this.finishSubmission(requestId, { reason: 'failed' });
@@ -76,7 +76,7 @@ export class SessionEventStream extends RemoteJournalStream {
76
76
  for await (const frame of this.remote.session.follow({
77
77
  address: this.address,
78
78
  assistantStream: true,
79
- ...(request.maxMessages === undefined ? {} : { maxMessages: request.maxMessages }),
79
+ ...this.repairRequest(request),
80
80
  }, signal)) {
81
81
  if (frame.type === 'snapshot') {
82
82
  for (const record of frame.records)
@@ -121,7 +121,10 @@ export class SessionEventStream extends RemoteJournalStream {
121
121
  }
122
122
  /** @inheritdoc */
123
123
  repairRequest(request) {
124
- return request.maxMessages === undefined ? {} : { maxMessages: request.maxMessages };
124
+ return {
125
+ ...(request.maxMessages === undefined ? {} : { maxMessages: request.maxMessages }),
126
+ ...(request.turnWindow === undefined ? {} : { turnWindow: request.turnWindow }),
127
+ };
125
128
  }
126
129
  }
127
130
  //# sourceMappingURL=transport.js.map
@@ -115,7 +115,7 @@ export class SessionHistoryController {
115
115
  if (throughSeq >= 0 && sourceLog[throughSeq]?.seq !== throughSeq) {
116
116
  throw new RemoteError('gateway/internal', `session log does not contain through seq ${String(throughSeq)}`, {});
117
117
  }
118
- const page = paginate(sourceLog, beforeSeq, request.maxMessages ?? DEFAULT_MAX_MESSAGES, throughSeq);
118
+ const page = paginate(sourceLog, beforeSeq, request.maxMessages ?? DEFAULT_MAX_MESSAGES, throughSeq, request.turnWindow);
119
119
  const records = pageRecords(page.events);
120
120
  return {
121
121
  records,
@@ -137,7 +137,7 @@ export class SessionHistoryController {
137
137
  * @returns a complete opening snapshot followed by gap-free durable events and opted-in assistant frames.
138
138
  */
139
139
  async *follow(request, signal) {
140
- validateFollowRequest(request);
140
+ validateHistoryWindow(request);
141
141
  const { address } = request;
142
142
  const target = addressId(address);
143
143
  const buffered = new Deque();
@@ -198,7 +198,7 @@ export class SessionHistoryController {
198
198
  signal.throwIfAborted();
199
199
  const cursor = source.cursor;
200
200
  snapshotCursor = cursor;
201
- const page = paginate(events, undefined, request.maxMessages ?? DEFAULT_MAX_MESSAGES);
201
+ const page = paginate(events, undefined, request.maxMessages ?? DEFAULT_MAX_MESSAGES, cursor, request.turnWindow);
202
202
  const assistantStream = request.assistantStream === true
203
203
  ? this.assistantStreams.get(target)?.snapshot() ?? { revision: 0 }
204
204
  : undefined;
@@ -327,16 +327,23 @@ function validatePageRequest(request) {
327
327
  || Object.is(request.beforeSeq, -0))) {
328
328
  throw new RemoteError('gateway/bad-request', 'beforeSeq must be a non-negative safe integer', {});
329
329
  }
330
- if (request.maxMessages !== undefined
331
- && (!Number.isSafeInteger(request.maxMessages) || request.maxMessages <= 0)) {
332
- throw new RemoteError('gateway/bad-request', 'maxMessages must be a positive safe integer', {});
333
- }
330
+ validateHistoryWindow(request);
334
331
  }
335
- function validateFollowRequest(request) {
332
+ function validateHistoryWindow(request) {
336
333
  if (request.maxMessages !== undefined
337
334
  && (!Number.isSafeInteger(request.maxMessages) || request.maxMessages <= 0)) {
338
335
  throw new RemoteError('gateway/bad-request', 'maxMessages must be a positive safe integer', {});
339
336
  }
337
+ const window = request.turnWindow;
338
+ if (window !== undefined) {
339
+ if (!Number.isSafeInteger(window.minMessages) || window.minMessages <= 0
340
+ || window.minMessages > (request.maxMessages ?? DEFAULT_MAX_MESSAGES)) {
341
+ throw new RemoteError('gateway/bad-request', 'turnWindow.minMessages must be a positive safe integer no greater than maxMessages', {});
342
+ }
343
+ if (!Number.isSafeInteger(window.minTurns) || window.minTurns <= 0) {
344
+ throw new RemoteError('gateway/bad-request', 'turnWindow.minTurns must be a positive safe integer', {});
345
+ }
346
+ }
340
347
  }
341
348
  function addressId(address) {
342
349
  return address.kind === 'session' ? address.sessionId : address.childSessionId;
@@ -385,12 +392,20 @@ function rejectNotFound(address) {
385
392
  childSessionId: address.childSessionId,
386
393
  });
387
394
  }
388
- function paginate(events, beforeSeq, maxMessages, throughSeq = events.at(-1)?.seq ?? -1) {
395
+ function paginate(events, beforeSeq, maxMessages, throughSeq, turnWindow) {
389
396
  const end = SessionLogOffset(Math.min(throughSeq + 1, beforeSeq ?? throughSeq + 1));
390
397
  let count = 0;
398
+ let turns = 0;
391
399
  let cut = SessionLogOffset(0);
392
400
  for (let index = end - 1; index >= 0; index--) {
393
401
  const event = events[index];
402
+ if (turnWindow !== undefined && event.type === 'turn/start') {
403
+ turns++;
404
+ if (count >= turnWindow.minMessages && turns >= turnWindow.minTurns) {
405
+ cut = SessionLogOffset(index);
406
+ break;
407
+ }
408
+ }
394
409
  if (!MESSAGE_TYPES.has(event.type) || !isAppendSurfaceEvent(event))
395
410
  continue;
396
411
  count++;
@@ -443,11 +443,17 @@ export interface SessionPageRequest {
443
443
  readonly throughSeq: number;
444
444
  readonly beforeSeq?: number;
445
445
  readonly maxMessages?: number;
446
+ /** Stop at a Turn start after both minima, unless maxMessages or history exhaustion wins. */
447
+ readonly turnWindow?: {
448
+ /** Minimum append-origin user/assistant messages; must not exceed maxMessages. */
449
+ readonly minMessages: number;
450
+ /** Minimum Turn starts crossed, including the partial Turn at beforeSeq. */
451
+ readonly minTurns: number;
452
+ };
446
453
  }
447
454
  /** One live event request for a durable Session address. */
448
- export interface SessionFollowRequest {
455
+ export interface SessionFollowRequest extends Pick<SessionPageRequest, 'maxMessages' | 'turnWindow'> {
449
456
  readonly address: SessionAddress;
450
- readonly maxMessages?: number;
451
457
  /** Include process-local assistant presentation frames for the Web client. */
452
458
  readonly assistantStream?: true;
453
459
  }
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.1.7-alpha.1",
4
+ "version": "0.1.7-rc.1",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -67,39 +67,39 @@
67
67
  "dependencies": {
68
68
  "mime-types": "^3.0.2",
69
69
  "zod": "^4.4.3",
70
- "@deepseek-ai/dsh-deque": "^0.1.7-alpha.1",
71
- "@deepseek-ai/schemastery": "^3.18.3",
72
- "@deepseek-ai/dsh-brand": "^0.1.7-alpha.1"
70
+ "@deepseek-ai/dsh-deque": "0.1.7-rc.1",
71
+ "@deepseek-ai/schemastery": "~3.18.4",
72
+ "@deepseek-ai/dsh-brand": "0.1.7-rc.1"
73
73
  },
74
74
  "peerDependencies": {
75
- "@deepseek-ai/cordis": "^4.0.3",
76
- "@deepseek-ai/dsh-agent": "^0.1.7-alpha.1",
77
- "@deepseek-ai/dsh-agent-default-model": "^0.1.7-alpha.1",
78
- "@deepseek-ai/dsh-agent-preset-registry": "^0.1.7-alpha.1",
79
- "@deepseek-ai/dsh-api-gateway": "^0.1.7-alpha.1",
80
- "@deepseek-ai/dsh-client-connection": "^0.1.7-alpha.1",
81
- "@deepseek-ai/dsh-client-file-upload": "^0.1.7-alpha.1",
82
- "@deepseek-ai/dsh-commands": "^0.1.7-alpha.1",
83
- "@deepseek-ai/dsh-attachment": "^0.1.7-alpha.1",
84
- "@deepseek-ai/dsh-fs": "^0.1.7-alpha.1",
85
- "@deepseek-ai/dsh-llm": "^0.1.7-alpha.1",
86
- "@deepseek-ai/dsh-file-reference": "^0.1.7-alpha.1",
87
- "@deepseek-ai/dsh-native-command": "^0.1.7-alpha.1",
88
- "@deepseek-ai/dsh-scope": "^0.1.7-alpha.1",
89
- "@deepseek-ai/dsh-session-projection-cache": "^0.1.7-alpha.1",
90
- "@deepseek-ai/dsh-session-title": "^0.1.7-alpha.1",
91
- "@deepseek-ai/dsh-session-query": "^0.1.7-alpha.1",
92
- "@deepseek-ai/dsh-skill": "^0.1.7-alpha.1",
93
- "@deepseek-ai/dsh-typert-registry": "^0.1.7-alpha.1",
94
- "@deepseek-ai/dsh-typert-protocol": "^0.1.7-alpha.1",
95
- "@deepseek-ai/dsh-session": "^0.1.7-alpha.1",
96
- "@deepseek-ai/dsh-util-time": "^0.1.7-alpha.1",
97
- "@deepseek-ai/dsh-subagent": "^0.1.7-alpha.1",
98
- "@deepseek-ai/dsh-util-values": "^0.1.7-alpha.1",
99
- "@deepseek-ai/dsh-workspace": "^0.1.7-alpha.1",
100
- "@deepseek-ai/dsh-util-workspace-path": "^0.1.7-alpha.1",
101
- "@deepseek-ai/dsh-session-projection": "^0.1.7-alpha.1",
102
- "@deepseek-ai/dsh-session-persistence": "^0.1.7-alpha.1"
75
+ "@deepseek-ai/dsh-agent-default-model": "0.1.7-rc.1",
76
+ "@deepseek-ai/dsh-agent-preset-registry": "0.1.7-rc.1",
77
+ "@deepseek-ai/dsh-api-gateway": "0.1.7-rc.1",
78
+ "@deepseek-ai/dsh-agent": "0.1.7-rc.1",
79
+ "@deepseek-ai/dsh-attachment": "0.1.7-rc.1",
80
+ "@deepseek-ai/dsh-client-connection": "0.1.7-rc.1",
81
+ "@deepseek-ai/dsh-client-file-upload": "0.1.7-rc.1",
82
+ "@deepseek-ai/dsh-commands": "0.1.7-rc.1",
83
+ "@deepseek-ai/dsh-file-reference": "0.1.7-rc.1",
84
+ "@deepseek-ai/cordis": "~4.0.4",
85
+ "@deepseek-ai/dsh-fs": "0.1.7-rc.1",
86
+ "@deepseek-ai/dsh-native-command": "0.1.7-rc.1",
87
+ "@deepseek-ai/dsh-scope": "0.1.7-rc.1",
88
+ "@deepseek-ai/dsh-session": "0.1.7-rc.1",
89
+ "@deepseek-ai/dsh-session-projection": "0.1.7-rc.1",
90
+ "@deepseek-ai/dsh-session-query": "0.1.7-rc.1",
91
+ "@deepseek-ai/dsh-session-projection-cache": "0.1.7-rc.1",
92
+ "@deepseek-ai/dsh-subagent": "0.1.7-rc.1",
93
+ "@deepseek-ai/dsh-session-persistence": "0.1.7-rc.1",
94
+ "@deepseek-ai/dsh-skill": "0.1.7-rc.1",
95
+ "@deepseek-ai/dsh-typert-protocol": "0.1.7-rc.1",
96
+ "@deepseek-ai/dsh-typert-registry": "0.1.7-rc.1",
97
+ "@deepseek-ai/dsh-util-time": "0.1.7-rc.1",
98
+ "@deepseek-ai/dsh-util-workspace-path": "0.1.7-rc.1",
99
+ "@deepseek-ai/dsh-util-values": "0.1.7-rc.1",
100
+ "@deepseek-ai/dsh-llm": "0.1.7-rc.1",
101
+ "@deepseek-ai/dsh-session-title": "0.1.7-rc.1",
102
+ "@deepseek-ai/dsh-workspace": "0.1.7-rc.1"
103
103
  },
104
104
  "peerDependenciesMeta": {
105
105
  "@deepseek-ai/dsh-session-persistence": {
@@ -111,45 +111,45 @@
111
111
  },
112
112
  "devDependencies": {
113
113
  "@types/mime-types": "^3.0.1",
114
- "@deepseek-ai/dsh-agent": "^0.1.7-alpha.1",
115
- "@deepseek-ai/dsh-agent-default-model": "^0.1.7-alpha.1",
116
- "@deepseek-ai/dsh-agent-loop": "^0.1.7-alpha.1",
117
- "@deepseek-ai/dsh-api-gateway": "^0.1.7-alpha.1",
118
- "@deepseek-ai/dsh-client-connection": "^0.1.7-alpha.1",
119
- "@deepseek-ai/dsh-attachment": "^0.1.7-alpha.1",
120
- "@deepseek-ai/dsh-client-file-upload": "^0.1.7-alpha.1",
121
- "@deepseek-ai/dsh-client-store": "^0.1.7-alpha.1",
122
- "@deepseek-ai/dsh-client-test-runtime": "^0.1.7-alpha.1",
123
- "@deepseek-ai/dsh-commands": "^0.1.7-alpha.1",
124
- "@deepseek-ai/dsh-file-reference": "^0.1.7-alpha.1",
125
- "@deepseek-ai/dsh-fs": "^0.1.7-alpha.1",
126
- "@deepseek-ai/dsh-fs-local": "^0.1.7-alpha.1",
127
- "@deepseek-ai/dsh-llm": "^0.1.7-alpha.1",
128
- "@deepseek-ai/dsh-agent-preset-registry": "^0.1.7-alpha.1",
129
- "@deepseek-ai/cordis": "^4.0.3",
130
- "@deepseek-ai/dsh-native-command": "^0.1.7-alpha.1",
131
- "@deepseek-ai/dsh-agent-loop-testkit": "^0.1.7-alpha.1",
132
- "@deepseek-ai/dsh-permission-presets": "^0.1.7-alpha.1",
133
- "@deepseek-ai/dsh-scope": "^0.1.7-alpha.1",
134
- "@deepseek-ai/dsh-session-persistence": "^0.1.7-alpha.1",
135
- "@deepseek-ai/dsh-session": "^0.1.7-alpha.1",
136
- "@deepseek-ai/dsh-session-projection": "^0.1.7-alpha.1",
137
- "@deepseek-ai/dsh-session-projection-cache": "^0.1.7-alpha.1",
138
- "@deepseek-ai/dsh-session-title": "^0.1.7-alpha.1",
139
- "@deepseek-ai/dsh-skill": "^0.1.7-alpha.1",
140
- "@deepseek-ai/dsh-storage": "^0.1.7-alpha.1",
141
- "@deepseek-ai/dsh-remote-mock": "^0.1.7-alpha.1",
142
- "@deepseek-ai/dsh-typert-protocol": "^0.1.7-alpha.1",
143
- "@deepseek-ai/dsh-typert-registry": "^0.1.7-alpha.1",
144
- "@deepseek-ai/dsh-util-crypto": "^0.1.7-alpha.1",
145
- "@deepseek-ai/dsh-storage-domain": "^0.1.7-alpha.1",
146
- "@deepseek-ai/dsh-util-time": "^0.1.7-alpha.1",
147
- "@deepseek-ai/dsh-storage-json": "^0.1.7-alpha.1",
148
- "@deepseek-ai/dsh-session-query": "^0.1.7-alpha.1",
149
- "@deepseek-ai/dsh-util-workspace-path": "^0.1.7-alpha.1",
150
- "@deepseek-ai/dsh-workspace": "^0.1.7-alpha.1",
151
- "@deepseek-ai/dsh-subagent": "^0.1.7-alpha.1",
152
- "@deepseek-ai/dsh-util-values": "^0.1.7-alpha.1"
114
+ "@deepseek-ai/dsh-agent": "0.1.7-rc.1",
115
+ "@deepseek-ai/dsh-agent-default-model": "0.1.7-rc.1",
116
+ "@deepseek-ai/dsh-agent-loop": "0.1.7-rc.1",
117
+ "@deepseek-ai/cordis": "~4.0.4",
118
+ "@deepseek-ai/dsh-agent-loop-testkit": "0.1.7-rc.1",
119
+ "@deepseek-ai/dsh-attachment": "0.1.7-rc.1",
120
+ "@deepseek-ai/dsh-client-connection": "0.1.7-rc.1",
121
+ "@deepseek-ai/dsh-client-file-upload": "0.1.7-rc.1",
122
+ "@deepseek-ai/dsh-client-store": "0.1.7-rc.1",
123
+ "@deepseek-ai/dsh-client-test-runtime": "0.1.7-rc.1",
124
+ "@deepseek-ai/dsh-commands": "0.1.7-rc.1",
125
+ "@deepseek-ai/dsh-file-reference": "0.1.7-rc.1",
126
+ "@deepseek-ai/dsh-fs": "0.1.7-rc.1",
127
+ "@deepseek-ai/dsh-fs-local": "0.1.7-rc.1",
128
+ "@deepseek-ai/dsh-llm": "0.1.7-rc.1",
129
+ "@deepseek-ai/dsh-agent-preset-registry": "0.1.7-rc.1",
130
+ "@deepseek-ai/dsh-api-gateway": "0.1.7-rc.1",
131
+ "@deepseek-ai/dsh-permission-presets": "0.1.7-rc.1",
132
+ "@deepseek-ai/dsh-remote-mock": "0.1.7-rc.1",
133
+ "@deepseek-ai/dsh-scope": "0.1.7-rc.1",
134
+ "@deepseek-ai/dsh-session": "0.1.7-rc.1",
135
+ "@deepseek-ai/dsh-session-persistence": "0.1.7-rc.1",
136
+ "@deepseek-ai/dsh-native-command": "0.1.7-rc.1",
137
+ "@deepseek-ai/dsh-session-projection": "0.1.7-rc.1",
138
+ "@deepseek-ai/dsh-session-projection-cache": "0.1.7-rc.1",
139
+ "@deepseek-ai/dsh-session-title": "0.1.7-rc.1",
140
+ "@deepseek-ai/dsh-skill": "0.1.7-rc.1",
141
+ "@deepseek-ai/dsh-storage": "0.1.7-rc.1",
142
+ "@deepseek-ai/dsh-storage-domain": "0.1.7-rc.1",
143
+ "@deepseek-ai/dsh-storage-json": "0.1.7-rc.1",
144
+ "@deepseek-ai/dsh-subagent": "0.1.7-rc.1",
145
+ "@deepseek-ai/dsh-typert-protocol": "0.1.7-rc.1",
146
+ "@deepseek-ai/dsh-session-query": "0.1.7-rc.1",
147
+ "@deepseek-ai/dsh-typert-registry": "0.1.7-rc.1",
148
+ "@deepseek-ai/dsh-util-crypto": "0.1.7-rc.1",
149
+ "@deepseek-ai/dsh-util-values": "0.1.7-rc.1",
150
+ "@deepseek-ai/dsh-util-time": "0.1.7-rc.1",
151
+ "@deepseek-ai/dsh-util-workspace-path": "0.1.7-rc.1",
152
+ "@deepseek-ai/dsh-workspace": "0.1.7-rc.1"
153
153
  },
154
154
  "scripts": {
155
155
  "bundle": "tsdown",