dsh-rewind-plugin 0.15.0-beta.1 → 0.15.0
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/SECURITY.md +7 -7
- package/cordis.patch.yml +4 -7
- package/docs/README.md +2 -1
- package/docs/architecture.md +5 -25
- package/docs/compat/audit.md +20 -42
- package/docs/compat/diagnostics.md +6 -10
- package/docs/compat/diagnostics.zh.md +3 -4
- package/docs/compat/tracking-boundary.md +1 -4
- package/docs/compat/tracking-boundary.zh.md +2 -2
- package/docs/harness-reference.md +1 -8
- package/docs/release/release.md +6 -17
- package/docs/snapshot-auto-cleanup.md +18 -22
- package/docs/snapshot-auto-cleanup.zh.md +5 -10
- package/lib/client.js +117 -31
- package/lib/index.js +19 -9
- package/lib/types/client/candidates.d.ts +0 -11
- package/lib/types/client/hidden.d.ts +44 -22
- package/lib/types/client/index.d.ts +9 -21
- package/lib/types/client/log.d.ts +11 -19
- package/lib/types/client/pending.d.ts +19 -8
- package/lib/types/client/portals.d.ts +40 -18
- package/lib/types/client/settings-card.d.ts +0 -1
- package/lib/types/index.d.ts +3 -11
- package/lib/types/locales.d.ts +2 -0
- package/lib/types/marker.d.ts +3 -21
- package/lib/types/rewind.d.ts +12 -23
- package/lib/types/snapshot.d.ts +5 -34
- package/package.json +37 -37
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
*/
|
|
43
43
|
import { type ReactNode } from 'react';
|
|
44
44
|
import type { SessionFace } from '@deepseek-ai/dsh-api-session-controller/client';
|
|
45
|
-
import { type ChatOf, type ChatWatch, type HiddenChat } from './hidden.ts';
|
|
45
|
+
import { type ChatOf, type ChatWatch, type HiddenChat, type MessageImageRef } from './hidden.ts';
|
|
46
46
|
import type { RewindKey } from './locales.ts';
|
|
47
47
|
type Translate = (key: RewindKey, params?: Record<string, unknown>) => string;
|
|
48
48
|
/** One portal target: the actions row of a user/steering seat + its durable node. */
|
|
@@ -63,7 +63,7 @@ export type PortalTarget = {
|
|
|
63
63
|
readonly container: HTMLElement;
|
|
64
64
|
/** The host inbox occurrence the retract button addresses. */
|
|
65
65
|
readonly itemId: string;
|
|
66
|
-
/** Complete editable text; null when the message contains
|
|
66
|
+
/** Complete editable text; null when the message contains no text block. */
|
|
67
67
|
readonly text: string | null;
|
|
68
68
|
readonly preview: string;
|
|
69
69
|
};
|
|
@@ -96,6 +96,13 @@ export interface RewindBridgeDeps {
|
|
|
96
96
|
* Session-scoped so the refill only lands in the session that just rewound.
|
|
97
97
|
*/
|
|
98
98
|
readonly setComposerText: (sessionId: string, text: string) => boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Session-aware image restorer (see `restoreImages` in index.ts): re-adds
|
|
101
|
+
* a withdrawn message's durable image references to that session's
|
|
102
|
+
* composer draft so a rewind of an image-bearing message does not lose
|
|
103
|
+
* the pictures. Optional — absent degrades to the text-only refill.
|
|
104
|
+
*/
|
|
105
|
+
readonly restoreImages?: (sessionId: string, images: readonly MessageImageRef[]) => Promise<void>;
|
|
99
106
|
}
|
|
100
107
|
/** Structural face of the runtime slot service (see the module doc). */
|
|
101
108
|
export interface SlotsLike {
|
|
@@ -162,7 +169,7 @@ export declare function writeComposer(text: string, facade: ComposerDraftWriter
|
|
|
162
169
|
* the old baseline heuristic refilled withdrawn text into the composer
|
|
163
170
|
* after switching sessions or restarting dsh.
|
|
164
171
|
*/
|
|
165
|
-
export declare function runRewindAndFill(session: SessionFace, seq: number, mode: 'chat' | 'both', isMainViewSession: (sessionId: string) => boolean, chatOf: ChatOf, watchChat: ChatWatch, setComposerText: (sessionId: string, text: string) => boolean): Promise<void>;
|
|
172
|
+
export declare function runRewindAndFill(session: SessionFace, seq: number, mode: 'chat' | 'both', isMainViewSession: (sessionId: string) => boolean, chatOf: ChatOf, watchChat: ChatWatch, setComposerText: (sessionId: string, text: string) => boolean, restoreImages?: (sessionId: string, images: readonly MessageImageRef[]) => Promise<void>): Promise<void>;
|
|
166
173
|
/**
|
|
167
174
|
* The snapshot seq a rendered seat stands for.
|
|
168
175
|
*
|
|
@@ -183,12 +190,12 @@ export declare function resolveSeatAnchorSeq(element: HTMLElement, chat: HiddenC
|
|
|
183
190
|
* Locate the actions container of a user/steering seat row — the element the
|
|
184
191
|
* ↶ button portals into (the copy/branch IconActions row).
|
|
185
192
|
*
|
|
186
|
-
* The finder is STRUCTURAL on purpose:
|
|
187
|
-
*
|
|
188
|
-
*
|
|
189
|
-
* located as the direct holder of
|
|
190
|
-
* container, which mounts that
|
|
191
|
-
*
|
|
193
|
+
* The finder is STRUCTURAL on purpose: `MessageIconActions` marks this container
|
|
194
|
+
* with `data-clock`, which names clock placement rather than the action row (the
|
|
195
|
+
* old `data-time-hover-root` marker lived on the per-turn tail footer and is
|
|
196
|
+
* gone in 0.1.6-alpha.2), so the container is located as the direct holder of
|
|
197
|
+
* the copy `<button>` (the `MessageIconActions` container, which mounts that
|
|
198
|
+
* button as a direct child).
|
|
192
199
|
*
|
|
193
200
|
* Returns undefined when no qualifying container is found; the caller refuses
|
|
194
201
|
* to portal (never a crash, never a wrong attachment). Exported as a test seam
|
|
@@ -220,14 +227,8 @@ export declare function actionsContainerOf(row: HTMLElement | undefined): HTMLEl
|
|
|
220
227
|
* withdrawn "command executed" tool group on screen as an empty expandable row
|
|
221
228
|
* after every member below it had been hidden.
|
|
222
229
|
*
|
|
223
|
-
*
|
|
224
|
-
*
|
|
225
|
-
* document scan, and no per-shell subtree walk.
|
|
226
|
-
*
|
|
227
|
-
* Every hidden element carries `data-dsh-rewind-hidden`, so DevTools, other DOM
|
|
228
|
-
* plugins and tests can tell a rewind-hide apart from a collapse/filter hide; a
|
|
229
|
-
* re-created row has no marker and is re-judged, and a row that leaves the
|
|
230
|
-
* withdrawn span is shown again.
|
|
230
|
+
* Every hidden element carries `data-dsh-rewind-hidden` (see
|
|
231
|
+
* `docs/contract/client-contract.md`).
|
|
231
232
|
*
|
|
232
233
|
* @param chat - the live chat snapshot the seats belong to.
|
|
233
234
|
* @param seats - this refresh's seat batch (every `[data-chat-anchor-key]`).
|
|
@@ -275,6 +276,27 @@ export declare function isRewindInertSession(snapshot: SessionKindLike): boolean
|
|
|
275
276
|
* @param hiddenSeqs - anchor seqs withdrawn by previous rewinds.
|
|
276
277
|
*/
|
|
277
278
|
export declare function collectDurableTargets(snapshot: SessionKindLike, chat: HiddenChat | undefined, hiddenSeqs: ReadonlySet<number>): readonly PortalTarget[];
|
|
279
|
+
/**
|
|
280
|
+
* The pending bubble row's compared text and its message-attachment block
|
|
281
|
+
* count, read from a CLONE (the live row is never touched).
|
|
282
|
+
*
|
|
283
|
+
* Both the actions container and the message-attachment block are excluded from
|
|
284
|
+
* the text: the copy button's Tooltip mounts its label inside that button, and
|
|
285
|
+
* the attachment block renders text of its own (a file name/size, a lone
|
|
286
|
+
* image's loading label) that no inbox row reproduces. The block is counted
|
|
287
|
+
* instead, as the attachment half of the match key (`matchPendingRows`).
|
|
288
|
+
*
|
|
289
|
+
* The clone's counterpart is taken by query position, not by position among the
|
|
290
|
+
* row's children: the harness renders the attachment block BEFORE the message
|
|
291
|
+
* bubble, so "drop the first child" would drop the message text.
|
|
292
|
+
*
|
|
293
|
+
* @param row - one rendered `[data-pending-steering]` row.
|
|
294
|
+
* @returns the compared text and the attachment block count.
|
|
295
|
+
*/
|
|
296
|
+
export declare function bubbleTextOf(row: HTMLElement): {
|
|
297
|
+
readonly text: string;
|
|
298
|
+
readonly attachments: number;
|
|
299
|
+
};
|
|
278
300
|
interface RewindPortalsProps extends RewindBridgeDeps {
|
|
279
301
|
readonly sessionId: string;
|
|
280
302
|
}
|
|
@@ -289,7 +311,7 @@ interface RewindPortalsProps extends RewindBridgeDeps {
|
|
|
289
311
|
* their actions containers) and the session's `inbox` projection (the pending
|
|
290
312
|
* occurrences — see `syncInboxSubscription`).
|
|
291
313
|
*/
|
|
292
|
-
export declare function RewindPortals({ sessionId, sessionOf, chatOf, isMainViewSession, watchChat, t, subscribeLocale, setComposerText }: RewindPortalsProps): ReactNode;
|
|
314
|
+
export declare function RewindPortals({ sessionId, sessionOf, chatOf, isMainViewSession, watchChat, t, subscribeLocale, setComposerText, restoreImages }: RewindPortalsProps): ReactNode;
|
|
293
315
|
/** The current composer draft: the contenteditable `textContent`.
|
|
294
316
|
* Empty when the composer is absent. Exported as a test seam (the
|
|
295
317
|
* empty-composer guard in `retractPending`). */
|
|
@@ -39,7 +39,6 @@ export interface CleanupPolicy {
|
|
|
39
39
|
readonly autoCleanupEnabled: boolean;
|
|
40
40
|
readonly autoCleanupMaxAgeDays: number;
|
|
41
41
|
}
|
|
42
|
-
/** One form snapshot as this card reads it (the shared store's `getSnapshot`). */
|
|
43
42
|
/**
|
|
44
43
|
* One form snapshot as this card reads it: the shared form frame's own state
|
|
45
44
|
* (`SettingsFormShell`) plus the two field drafts.
|
package/lib/types/index.d.ts
CHANGED
|
@@ -4,17 +4,9 @@
|
|
|
4
4
|
* lives in `src/client/`).
|
|
5
5
|
*
|
|
6
6
|
* Rewind mechanism: planning is pure (`src/rewind.ts`); execution appends a
|
|
7
|
-
* marker `user/message`
|
|
8
|
-
*
|
|
9
|
-
* (
|
|
10
|
-
* is cut, so the next request derives its context from the target onward.
|
|
11
|
-
* The marker is a `user/message` carrying the shadowed-seq citations
|
|
12
|
-
* (`sourceEventSeqs`): v3 reserves surface `replace` to a node that cites
|
|
13
|
-
* every shadowed seq, and `assistant/message` can no longer carry those — so
|
|
14
|
-
* the replacement node is a `user/message`, exactly as /compact's checkpoint
|
|
15
|
-
* is. It derives to itself (a present user turn), so the marker stays as the
|
|
16
|
-
* surface-tail cut point rather than vanishing.
|
|
17
|
-
*
|
|
7
|
+
* marker `user/message` whose `surfaceOp` replaces every surface node after the
|
|
8
|
+
* target with itself, cutting only the model-visible surface
|
|
9
|
+
* (`docs/architecture.md`).
|
|
18
10
|
*
|
|
19
11
|
* File restore (mode `both`) follows Claude Code's checkpointing: the plugin
|
|
20
12
|
* backs up each tracked write-class edit BEFORE it happens (at the
|
package/lib/types/locales.d.ts
CHANGED
package/lib/types/marker.d.ts
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The rewind marker's message-source identity
|
|
3
|
-
* client.
|
|
2
|
+
* The rewind marker's message-source identity.
|
|
4
3
|
*
|
|
5
4
|
* A producer owns its source `kind` outright (`MessageSourceMap` is
|
|
6
5
|
* merge-extensible and has no catch-all `plugin` kind since session format v4),
|
|
7
|
-
* so this module declares `dsh-rewind`
|
|
8
|
-
*
|
|
9
|
-
* lets the browser half name the marker without pulling in the host plugin.
|
|
6
|
+
* so this module declares the `dsh-rewind` source every marker carries. Kept in
|
|
7
|
+
* a leaf with no cordis or node imports.
|
|
10
8
|
*
|
|
11
9
|
* @module dsh-rewind/marker
|
|
12
10
|
*/
|
|
@@ -17,23 +15,7 @@ declare module '@deepseek-ai/dsh-llm' {
|
|
|
17
15
|
};
|
|
18
16
|
}
|
|
19
17
|
}
|
|
20
|
-
/** Producer kind carried by every marker this plugin appends. */
|
|
21
|
-
export declare const REWIND_MARKER_KIND = "dsh-rewind";
|
|
22
18
|
/** The marker's source: one producer-owned kind, no private fields. */
|
|
23
19
|
export declare const REWIND_MARKER_SOURCE: Readonly<{
|
|
24
20
|
readonly kind: "dsh-rewind";
|
|
25
21
|
}>;
|
|
26
|
-
/**
|
|
27
|
-
* Test whether a persisted message source identifies a rewind marker.
|
|
28
|
-
*
|
|
29
|
-
* Three shapes are recognized because a marker's source is immutable once
|
|
30
|
-
* written: the current producer-owned kind, the released v3 plugin wrapper
|
|
31
|
-
* (`{ kind: 'plugin', plugin: 'dsh-rewind' }`) on logs this build has not yet
|
|
32
|
-
* rewritten, and the migrated form of that wrapper (`plugin:dsh-rewind`) that
|
|
33
|
-
* the v3→v4 conversion produces for a producer it does not know by name.
|
|
34
|
-
* @param source - source restored from a surface user message, or any stored
|
|
35
|
-
* value: a log written by an earlier build carries shapes the current union
|
|
36
|
-
* no longer names.
|
|
37
|
-
* @returns whether the source carries the rewind brand.
|
|
38
|
-
*/
|
|
39
|
-
export declare function isRewindMarker(source: unknown): boolean;
|
package/lib/types/rewind.d.ts
CHANGED
|
@@ -3,32 +3,19 @@
|
|
|
3
3
|
* No I/O and no `Session` dependency — everything derives from the event log
|
|
4
4
|
* and the ordered surface, so this module stays unit-testable.
|
|
5
5
|
*
|
|
6
|
-
* Rewind semantics
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* `
|
|
14
|
-
* `marker.ts`) — a single event:
|
|
15
|
-
*
|
|
16
|
-
* user/message (marker content) → { surfaceOp {replace, startSeq, endSeq} }
|
|
17
|
-
*
|
|
18
|
-
* v3 reserves surface `replace` to a node that cites every shadowed seq via
|
|
19
|
-
* `sourceEventSeqs`, and `assistant/message` can no longer carry
|
|
20
|
-
* `sourceEventSeqs` (it now embeds its provider stream instead) — so the
|
|
21
|
-
* replacement node must be a `user/message`, exactly as /compact's checkpoint
|
|
22
|
-
* is. No ghost `step/start`…`step/end` frame is needed: the token-meter's
|
|
23
|
-
* step state machine ignores `user/message`, and the session invariant
|
|
24
|
-
* (`invariant.ts`) imposes no open-turn requirement on it, so the marker is
|
|
25
|
-
* appended while idle, outside any turn. It sits at the surface tail as the
|
|
26
|
-
* model-visible "cut point" — a present user turn in derived history.
|
|
6
|
+
* Rewind semantics: rewinding to a user message appends a marker node into the
|
|
7
|
+
* session log whose `surfaceOp` replaces every surface node AFTER the target
|
|
8
|
+
* with itself. The log (audit trail, rendered transcript) is untouched; only
|
|
9
|
+
* the model-visible surface is cut, so the next request derives its context
|
|
10
|
+
* from the target message onward. The marker is a `user/message` carrying a
|
|
11
|
+
* replace `surfaceOp` and the producer-owned source `{ kind: 'dsh-rewind' }`
|
|
12
|
+
* (see `marker.ts`); the shape's invariants and history are documented in
|
|
13
|
+
* `docs/architecture.md`.
|
|
27
14
|
*
|
|
28
15
|
* @module dsh-rewind/rewind
|
|
29
16
|
*/
|
|
30
17
|
import type { SessionEvent, UserMessage } from '@deepseek-ai/dsh-session';
|
|
31
|
-
export {
|
|
18
|
+
export { REWIND_MARKER_SOURCE } from './marker.ts';
|
|
32
19
|
/** Which of the two rewind modes a rewind executes. */
|
|
33
20
|
export type RewindMode = 'chat' | 'both';
|
|
34
21
|
/**
|
|
@@ -101,7 +88,9 @@ export declare function isHumanUserMessageEvent(event: SessionEvent): event is S
|
|
|
101
88
|
/** Join the text blocks of a message into one plain string. */
|
|
102
89
|
export declare function messagePreview(message: UserMessage): string;
|
|
103
90
|
/**
|
|
104
|
-
* Parse a raw command token into a rewind target.
|
|
91
|
+
* Parse a raw command token into a rewind target. Both forms must be plain
|
|
92
|
+
* decimal integers: a bare `Number()` would also accept `@1e3`, `@0x10` and
|
|
93
|
+
* `@+5`, and would read a bare `@` as seq 0.
|
|
105
94
|
* @param raw - one token: `@123` (absolute seq) or `12` (recency index).
|
|
106
95
|
* @returns the parsed target, or undefined when the token is malformed.
|
|
107
96
|
*/
|
package/lib/types/snapshot.d.ts
CHANGED
|
@@ -20,33 +20,9 @@
|
|
|
20
20
|
* - Because entries live on disk under the dsh data directory, they survive a
|
|
21
21
|
* host restart, are bounded (the newest 100 anchor groups per session are
|
|
22
22
|
* kept), and restores read/write the real file system with plain `node:fs`
|
|
23
|
-
* — independent of the fs service.
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* plugin holds — the model-facing fences constrain the model's tools, not this
|
|
27
|
-
* code. The store stays bounded to the model-touched paths, so excluding a
|
|
28
|
-
* file (e.g. `.env`) is a model-permission concern (see `SECURITY.md`).
|
|
29
|
-
*
|
|
30
|
-
* Crash safety (this module's own engineering asset):
|
|
31
|
-
* - Checkpoint commits are ATOMIC: the sidecar is fully written first, then
|
|
32
|
-
* the entry JSON is written to a sibling temp file and renamed over the
|
|
33
|
-
* target, so a host crash mid-write can never leave a readable entry
|
|
34
|
-
* without its bytes — at worst an unreferenced orphan sidecar, or an inert
|
|
35
|
-
* `.tmp` leftover that the next commit of the same file overwrites and that
|
|
36
|
-
* no reader ever picks up.
|
|
37
|
-
* - Every restore pass is JOURNALED. Before mutating anything the store
|
|
38
|
-
* captures the pre-restore ("rescue") state of each planned path as a raw
|
|
39
|
-
* byte copy and persists an intent journal (`journal-<op>.json` in the
|
|
40
|
-
* session dir) holding only references, then marks each action done as it
|
|
41
|
-
* is applied. A crash at any point leaves the journal on disk; after a host
|
|
42
|
-
* restart `reconcileRestores(sessionId)` re-derives from the REAL disk which
|
|
43
|
-
* paths already match the target and which are still pending (reporting
|
|
44
|
-
* "restored up to where, what changed"), auto-heals journals whose goal is
|
|
45
|
-
* already reached, and `continueRestore` / `rollbackRestore` finish the
|
|
46
|
-
* interrupted op or undo it back to the exact pre-restore state.
|
|
47
|
-
* - Journal IO is best-effort and never fails a restore: if the journal
|
|
48
|
-
* cannot be written the restore proceeds exactly like the pre-journal code
|
|
49
|
-
* (crash safety degrades, behavior does not).
|
|
23
|
+
* — independent of the fs service. The atomic-commit and journaled-restore
|
|
24
|
+
* guarantees, the security model and the in-store layout are specified in
|
|
25
|
+
* `SECURITY.md` and `docs/format.md`.
|
|
50
26
|
*
|
|
51
27
|
* Restore semantics (identical to Claude Code): for every path with entries
|
|
52
28
|
* anchored at or after the target message, apply the EARLIEST entry — write
|
|
@@ -54,13 +30,8 @@
|
|
|
54
30
|
* creation. Symlinked and hard-linked paths are skipped and reported, never
|
|
55
31
|
* written through.
|
|
56
32
|
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
* `restore-journal-` prefix) are still READ — their string content is the
|
|
60
|
-
* exact UTF-8 bytes it always was, except for records that were decoded
|
|
61
|
-
* lossily (they contain U+FFFD: comparable, but never written back). New
|
|
62
|
-
* writes are always the byte format; the marker contract that keeps a
|
|
63
|
-
* downgraded v1 build from touching the workspace lives in
|
|
33
|
+
* Released-v1 entries stay readable and the byte format is specified in
|
|
34
|
+
* `docs/format.md`; the downgrade marker contract lives in
|
|
64
35
|
* `tests/downgrade-safety.test.ts`.
|
|
65
36
|
*
|
|
66
37
|
* @module dsh-rewind/snapshot
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-rewind-plugin",
|
|
3
|
-
"version": "0.15.0
|
|
3
|
+
"version": "0.15.0",
|
|
4
4
|
"description": "In-window conversation rewind with workspace file restore · 同窗口内对话回退并可还原工作区文件",
|
|
5
5
|
"icon": "./assets/icon.svg",
|
|
6
6
|
"keywords": [
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
"typecheck": "tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.client.json && tsc --noEmit -p tsconfig.client-test.json",
|
|
69
69
|
"test": "vitest run",
|
|
70
70
|
"verify:host": "node scripts/verify-host.mjs",
|
|
71
|
-
"check": "npm run typecheck && npm
|
|
71
|
+
"check": "npm run typecheck && npm run build && npm test && node scripts/verify-host.mjs && npm pack --dry-run",
|
|
72
72
|
"prepare": "npm run build"
|
|
73
73
|
},
|
|
74
74
|
"publishConfig": {
|
|
@@ -145,41 +145,41 @@
|
|
|
145
145
|
"devDependencies": {
|
|
146
146
|
"@deepseek-ai/cordis": "4.0.3",
|
|
147
147
|
"@deepseek-ai/cosmokit": "1.8.4",
|
|
148
|
-
"@deepseek-ai/dsh-agent": "0.2.0-rc.
|
|
149
|
-
"@deepseek-ai/dsh-api-session-controller": "0.2.0-rc.
|
|
150
|
-
"@deepseek-ai/dsh-attachment": "0.2.0-rc.
|
|
151
|
-
"@deepseek-ai/dsh-client-connection": "0.2.0-rc.
|
|
152
|
-
"@deepseek-ai/dsh-client-locale": "0.2.0-rc.
|
|
153
|
-
"@deepseek-ai/dsh-client-store": "0.2.0-rc.
|
|
154
|
-
"@deepseek-ai/dsh-client-ui-commands": "0.2.0-rc.
|
|
155
|
-
"@deepseek-ai/dsh-client-ui-conversation": "0.2.0-rc.
|
|
156
|
-
"@deepseek-ai/dsh-client-ui-input-trigger": "0.2.0-rc.
|
|
157
|
-
"@deepseek-ai/dsh-client-ui-plugin-manager": "0.2.0-rc.
|
|
158
|
-
"@deepseek-ai/dsh-client-ui-primitives": "0.2.0-rc.
|
|
159
|
-
"@deepseek-ai/dsh-client-ui-session": "0.2.0-rc.
|
|
160
|
-
"@deepseek-ai/dsh-client-ui-settings": "0.2.0-rc.
|
|
161
|
-
"@deepseek-ai/dsh-client-ui-slots": "0.2.0-rc.
|
|
162
|
-
"@deepseek-ai/dsh-command-compact": "0.2.0-rc.
|
|
163
|
-
"@deepseek-ai/dsh-commands": "0.2.0-rc.
|
|
164
|
-
"@deepseek-ai/dsh-compaction": "0.2.0-rc.
|
|
165
|
-
"@deepseek-ai/dsh-compaction-basic": "0.2.0-rc.
|
|
166
|
-
"@deepseek-ai/dsh-compaction-image-offload": "0.2.0-rc.
|
|
167
|
-
"@deepseek-ai/dsh-fs": "0.2.0-rc.
|
|
168
|
-
"@deepseek-ai/dsh-goal": "0.2.0-rc.
|
|
169
|
-
"@deepseek-ai/dsh-home-paths": "0.2.0-rc.
|
|
170
|
-
"@deepseek-ai/dsh-llm": "0.2.0-rc.
|
|
171
|
-
"@deepseek-ai/dsh-plan-mode": "0.2.0-rc.
|
|
172
|
-
"@deepseek-ai/dsh-sandbox": "0.2.0-rc.
|
|
173
|
-
"@deepseek-ai/dsh-scope": "0.2.0-rc.
|
|
174
|
-
"@deepseek-ai/dsh-session": "0.2.0-rc.
|
|
175
|
-
"@deepseek-ai/dsh-session-projection": "0.2.0-rc.
|
|
176
|
-
"@deepseek-ai/dsh-session-stats": "0.2.0-rc.
|
|
177
|
-
"@deepseek-ai/dsh-session-title": "0.2.0-rc.
|
|
178
|
-
"@deepseek-ai/dsh-settings": "0.2.0-rc.
|
|
179
|
-
"@deepseek-ai/dsh-token-meter": "0.2.0-rc.
|
|
180
|
-
"@deepseek-ai/dsh-tools": "0.2.0-rc.
|
|
181
|
-
"@deepseek-ai/dsh-typert-protocol": "0.2.0-rc.
|
|
182
|
-
"@deepseek-ai/dsh-user-questions": "0.2.0-rc.
|
|
148
|
+
"@deepseek-ai/dsh-agent": "0.2.0-rc.2",
|
|
149
|
+
"@deepseek-ai/dsh-api-session-controller": "0.2.0-rc.2",
|
|
150
|
+
"@deepseek-ai/dsh-attachment": "0.2.0-rc.2",
|
|
151
|
+
"@deepseek-ai/dsh-client-connection": "0.2.0-rc.2",
|
|
152
|
+
"@deepseek-ai/dsh-client-locale": "0.2.0-rc.2",
|
|
153
|
+
"@deepseek-ai/dsh-client-store": "0.2.0-rc.2",
|
|
154
|
+
"@deepseek-ai/dsh-client-ui-commands": "0.2.0-rc.2",
|
|
155
|
+
"@deepseek-ai/dsh-client-ui-conversation": "0.2.0-rc.2",
|
|
156
|
+
"@deepseek-ai/dsh-client-ui-input-trigger": "0.2.0-rc.2",
|
|
157
|
+
"@deepseek-ai/dsh-client-ui-plugin-manager": "0.2.0-rc.2",
|
|
158
|
+
"@deepseek-ai/dsh-client-ui-primitives": "0.2.0-rc.2",
|
|
159
|
+
"@deepseek-ai/dsh-client-ui-session": "0.2.0-rc.2",
|
|
160
|
+
"@deepseek-ai/dsh-client-ui-settings": "0.2.0-rc.2",
|
|
161
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.2.0-rc.2",
|
|
162
|
+
"@deepseek-ai/dsh-command-compact": "0.2.0-rc.2",
|
|
163
|
+
"@deepseek-ai/dsh-commands": "0.2.0-rc.2",
|
|
164
|
+
"@deepseek-ai/dsh-compaction": "0.2.0-rc.2",
|
|
165
|
+
"@deepseek-ai/dsh-compaction-basic": "0.2.0-rc.2",
|
|
166
|
+
"@deepseek-ai/dsh-compaction-image-offload": "0.2.0-rc.2",
|
|
167
|
+
"@deepseek-ai/dsh-fs": "0.2.0-rc.2",
|
|
168
|
+
"@deepseek-ai/dsh-goal": "0.2.0-rc.2",
|
|
169
|
+
"@deepseek-ai/dsh-home-paths": "0.2.0-rc.2",
|
|
170
|
+
"@deepseek-ai/dsh-llm": "0.2.0-rc.2",
|
|
171
|
+
"@deepseek-ai/dsh-plan-mode": "0.2.0-rc.2",
|
|
172
|
+
"@deepseek-ai/dsh-sandbox": "0.2.0-rc.2",
|
|
173
|
+
"@deepseek-ai/dsh-scope": "0.2.0-rc.2",
|
|
174
|
+
"@deepseek-ai/dsh-session": "0.2.0-rc.2",
|
|
175
|
+
"@deepseek-ai/dsh-session-projection": "0.2.0-rc.2",
|
|
176
|
+
"@deepseek-ai/dsh-session-stats": "0.2.0-rc.2",
|
|
177
|
+
"@deepseek-ai/dsh-session-title": "0.2.0-rc.2",
|
|
178
|
+
"@deepseek-ai/dsh-settings": "0.2.0-rc.2",
|
|
179
|
+
"@deepseek-ai/dsh-token-meter": "0.2.0-rc.2",
|
|
180
|
+
"@deepseek-ai/dsh-tools": "0.2.0-rc.2",
|
|
181
|
+
"@deepseek-ai/dsh-typert-protocol": "0.2.0-rc.2",
|
|
182
|
+
"@deepseek-ai/dsh-user-questions": "0.2.0-rc.2",
|
|
183
183
|
"@deepseek-ai/schemastery": "3.18.4",
|
|
184
184
|
"@types/node": "^24.0.0",
|
|
185
185
|
"@types/react": "^18.3.31",
|