@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.
- package/README.i18n.yaml +2 -2
- package/README.md +6 -4
- package/README.zh.md +6 -4
- package/lib/client.js +101 -32
- package/lib/index.js +19 -6
- package/lib/typert.host.js +15 -79
- package/lib/typert.remote-client.js +9 -1
- package/lib/types/client/contract/session.d.ts +9 -4
- package/lib/types/client/contract/snapshot.d.ts +1 -1
- package/lib/types/client/sessions/assistant-stream.d.ts +5 -0
- package/lib/types/client/sessions/assistant-stream.js +16 -1
- package/lib/types/client/sessions/projection-store.d.ts +6 -0
- package/lib/types/client/sessions/projection-store.js +9 -0
- package/lib/types/client/sessions/session.d.ts +7 -5
- package/lib/types/client/sessions/session.js +81 -40
- package/lib/types/client/transport.js +5 -2
- package/lib/types/history.js +24 -9
- package/lib/types/types.d.ts +8 -2
- package/package.json +71 -71
|
@@ -15,10 +15,15 @@ function projectionsBaseline(value) {
|
|
|
15
15
|
asOfSeq: value.asOfSeq === -1 ? -1 : SessionSeq(value.asOfSeq),
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
|
-
/**
|
|
18
|
+
/** Minimum message count for ordinary history windows. */
|
|
19
19
|
export const PAGE_MESSAGES = 50;
|
|
20
|
-
|
|
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
|
-
/**
|
|
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({
|
|
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,
|
|
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
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
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(
|
|
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
|
|
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
|
-
|
|
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'
|
|
626
|
-
this.
|
|
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
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
734
|
+
}
|
|
735
|
+
settlement.admitted = attachmentRefsIn(message.content);
|
|
736
|
+
this.retireAdmittedSubmission(source.rpcId);
|
|
714
737
|
}
|
|
715
|
-
/** Retire
|
|
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
|
-
|
|
723
|
-
|
|
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
|
|
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
|
|
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
|
package/lib/types/history.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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++;
|
package/lib/types/types.d.ts
CHANGED
|
@@ -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-
|
|
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": "
|
|
71
|
-
"@deepseek-ai/schemastery": "
|
|
72
|
-
"@deepseek-ai/dsh-brand": "
|
|
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/
|
|
76
|
-
"@deepseek-ai/dsh-agent": "
|
|
77
|
-
"@deepseek-ai/dsh-
|
|
78
|
-
"@deepseek-ai/dsh-agent
|
|
79
|
-
"@deepseek-ai/dsh-
|
|
80
|
-
"@deepseek-ai/dsh-client-connection": "
|
|
81
|
-
"@deepseek-ai/dsh-client-file-upload": "
|
|
82
|
-
"@deepseek-ai/dsh-commands": "
|
|
83
|
-
"@deepseek-ai/dsh-
|
|
84
|
-
"@deepseek-ai/
|
|
85
|
-
"@deepseek-ai/dsh-
|
|
86
|
-
"@deepseek-ai/dsh-
|
|
87
|
-
"@deepseek-ai/dsh-
|
|
88
|
-
"@deepseek-ai/dsh-
|
|
89
|
-
"@deepseek-ai/dsh-session-projection
|
|
90
|
-
"@deepseek-ai/dsh-session-
|
|
91
|
-
"@deepseek-ai/dsh-session-
|
|
92
|
-
"@deepseek-ai/dsh-
|
|
93
|
-
"@deepseek-ai/dsh-
|
|
94
|
-
"@deepseek-ai/dsh-
|
|
95
|
-
"@deepseek-ai/dsh-
|
|
96
|
-
"@deepseek-ai/dsh-
|
|
97
|
-
"@deepseek-ai/dsh-
|
|
98
|
-
"@deepseek-ai/dsh-util-
|
|
99
|
-
"@deepseek-ai/dsh-
|
|
100
|
-
"@deepseek-ai/dsh-
|
|
101
|
-
"@deepseek-ai/dsh-session-
|
|
102
|
-
"@deepseek-ai/dsh-
|
|
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": "
|
|
115
|
-
"@deepseek-ai/dsh-agent-default-model": "
|
|
116
|
-
"@deepseek-ai/dsh-agent-loop": "
|
|
117
|
-
"@deepseek-ai/
|
|
118
|
-
"@deepseek-ai/dsh-
|
|
119
|
-
"@deepseek-ai/dsh-attachment": "
|
|
120
|
-
"@deepseek-ai/dsh-client-
|
|
121
|
-
"@deepseek-ai/dsh-client-
|
|
122
|
-
"@deepseek-ai/dsh-client-
|
|
123
|
-
"@deepseek-ai/dsh-
|
|
124
|
-
"@deepseek-ai/dsh-
|
|
125
|
-
"@deepseek-ai/dsh-
|
|
126
|
-
"@deepseek-ai/dsh-fs
|
|
127
|
-
"@deepseek-ai/dsh-
|
|
128
|
-
"@deepseek-ai/dsh-
|
|
129
|
-
"@deepseek-ai/
|
|
130
|
-
"@deepseek-ai/dsh-
|
|
131
|
-
"@deepseek-ai/dsh-
|
|
132
|
-
"@deepseek-ai/dsh-
|
|
133
|
-
"@deepseek-ai/dsh-scope": "
|
|
134
|
-
"@deepseek-ai/dsh-session
|
|
135
|
-
"@deepseek-ai/dsh-session": "
|
|
136
|
-
"@deepseek-ai/dsh-
|
|
137
|
-
"@deepseek-ai/dsh-session-projection
|
|
138
|
-
"@deepseek-ai/dsh-session-
|
|
139
|
-
"@deepseek-ai/dsh-
|
|
140
|
-
"@deepseek-ai/dsh-
|
|
141
|
-
"@deepseek-ai/dsh-
|
|
142
|
-
"@deepseek-ai/dsh-
|
|
143
|
-
"@deepseek-ai/dsh-
|
|
144
|
-
"@deepseek-ai/dsh-
|
|
145
|
-
"@deepseek-ai/dsh-
|
|
146
|
-
"@deepseek-ai/dsh-
|
|
147
|
-
"@deepseek-ai/dsh-
|
|
148
|
-
"@deepseek-ai/dsh-
|
|
149
|
-
"@deepseek-ai/dsh-util-
|
|
150
|
-
"@deepseek-ai/dsh-
|
|
151
|
-
"@deepseek-ai/dsh-
|
|
152
|
-
"@deepseek-ai/dsh-
|
|
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",
|