dsh-more 0.0.6 → 0.0.8
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/CONTRIBUTING.md +5 -3
- package/README.md +17 -6
- package/README.zh-CN.md +17 -6
- package/dist/client.js +398 -61
- package/dist/index.js +102 -29
- package/dist/types/generated/patch-catalog.d.ts +1 -1
- package/dist/types/patches/conversation-markdown-export/client/menu.d.ts +5 -0
- package/dist/types/patches/projectless-tasks/client/adapter.d.ts +4 -2
- package/dist/types/patches/projectless-tasks/client/draft.d.ts +17 -3
- package/dist/types/patches/projectless-tasks/client/group-menu.d.ts +2 -0
- package/dist/types/patches/projectless-tasks/client/groups.d.ts +21 -0
- package/dist/types/patches/projectless-tasks/groups.d.ts +6 -0
- package/dist/types/patches/projectless-tasks/host/groups.d.ts +9 -0
- package/dsh.plugin.json +1 -1
- package/package.json +62 -60
package/dist/index.js
CHANGED
|
@@ -519,10 +519,11 @@ function buildCleanSeed(source, selection) {
|
|
|
519
519
|
}
|
|
520
520
|
if (event.type === "assistant/message") {
|
|
521
521
|
rebuilt.append("assistant/message", {
|
|
522
|
+
// Keep the durable stream and settlement metadata required by DSH 0.1.5.
|
|
523
|
+
// Only the reconstructed turn/step coordinates belong to the new log.
|
|
524
|
+
...event.data,
|
|
522
525
|
turn,
|
|
523
|
-
step
|
|
524
|
-
message: event.data.message,
|
|
525
|
-
...event.data.usage === void 0 ? {} : { usage: event.data.usage }
|
|
526
|
+
step
|
|
526
527
|
}, { surfaceOp: "append" });
|
|
527
528
|
assistantSeen = true;
|
|
528
529
|
for (const call of event.data.message.content) {
|
|
@@ -664,15 +665,13 @@ var SESSION_DELETE_PATCH_ID = "session-delete";
|
|
|
664
665
|
// src/patches/session-delete/host/live-session-handles.ts
|
|
665
666
|
var TRACKER = /* @__PURE__ */ Symbol.for("dsh-more.session-delete.live-session-handles");
|
|
666
667
|
function trackedHandle(tracker, handle) {
|
|
667
|
-
let
|
|
668
|
+
let disposal;
|
|
668
669
|
const wrapped = {
|
|
669
670
|
agent: handle.agent,
|
|
670
|
-
dispose: async () => {
|
|
671
|
-
if (disposed) return;
|
|
672
|
-
disposed = true;
|
|
673
|
-
if (tracker.handles.get(handle.agent.id) === wrapped) tracker.handles.delete(handle.agent.id);
|
|
671
|
+
dispose: () => disposal ??= Promise.resolve().then(async () => {
|
|
674
672
|
await handle.dispose();
|
|
675
|
-
|
|
673
|
+
if (tracker.handles.get(handle.agent.id) === wrapped) tracker.handles.delete(handle.agent.id);
|
|
674
|
+
})
|
|
676
675
|
};
|
|
677
676
|
tracker.handles.set(handle.agent.id, wrapped);
|
|
678
677
|
return wrapped;
|
|
@@ -682,26 +681,37 @@ function installLiveSessionHandleTracker(ctx) {
|
|
|
682
681
|
const existing = registry[TRACKER];
|
|
683
682
|
if (existing !== void 0) {
|
|
684
683
|
existing.references += 1;
|
|
685
|
-
return ()
|
|
686
|
-
existing.references -= 1;
|
|
687
|
-
};
|
|
684
|
+
return releaseTracker(registry, existing);
|
|
688
685
|
}
|
|
689
686
|
const originalCreate = registry.create;
|
|
690
687
|
const originalResume = registry.resume;
|
|
691
688
|
const tracker = { handles: /* @__PURE__ */ new Map() };
|
|
692
689
|
tracker.originalCreate = originalCreate;
|
|
693
690
|
tracker.originalResume = originalResume;
|
|
691
|
+
tracker.createDescriptor = Object.getOwnPropertyDescriptor(registry, "create");
|
|
692
|
+
tracker.resumeDescriptor = Object.getOwnPropertyDescriptor(registry, "resume");
|
|
694
693
|
tracker.wrappedCreate = async (options) => trackedHandle(tracker, await originalCreate.call(registry, options));
|
|
695
694
|
tracker.wrappedResume = async (options) => trackedHandle(tracker, await originalResume.call(registry, options));
|
|
696
695
|
tracker.references = 1;
|
|
697
696
|
registry[TRACKER] = tracker;
|
|
698
697
|
registry.create = tracker.wrappedCreate;
|
|
699
698
|
registry.resume = tracker.wrappedResume;
|
|
699
|
+
return releaseTracker(registry, tracker);
|
|
700
|
+
}
|
|
701
|
+
function releaseTracker(registry, tracker) {
|
|
702
|
+
let released = false;
|
|
700
703
|
return () => {
|
|
704
|
+
if (released) return;
|
|
705
|
+
released = true;
|
|
701
706
|
tracker.references -= 1;
|
|
702
707
|
if (tracker.references > 0 || registry[TRACKER] !== tracker) return;
|
|
703
|
-
|
|
704
|
-
|
|
708
|
+
const restore = (key, installed, descriptor) => {
|
|
709
|
+
if (Object.getOwnPropertyDescriptor(registry, key)?.value !== installed) return;
|
|
710
|
+
if (descriptor === void 0) Reflect.deleteProperty(registry, key);
|
|
711
|
+
else Object.defineProperty(registry, key, descriptor);
|
|
712
|
+
};
|
|
713
|
+
restore("create", tracker.wrappedCreate, tracker.createDescriptor);
|
|
714
|
+
restore("resume", tracker.wrappedResume, tracker.resumeDescriptor);
|
|
705
715
|
delete registry[TRACKER];
|
|
706
716
|
};
|
|
707
717
|
}
|
|
@@ -725,12 +735,16 @@ function detachInternal(registry, sessionId, label) {
|
|
|
725
735
|
async function unloadLiveSession(ctx, sessionId) {
|
|
726
736
|
const agent = ctx.agents.get(sessionId);
|
|
727
737
|
const session = ctx.sessions.get(sessionId);
|
|
738
|
+
const handle = getLiveSessionHandle(ctx, sessionId);
|
|
739
|
+
const ownsWriter = "open" in ctx.sessionPersistence && typeof ctx.sessionPersistence.open === "function";
|
|
740
|
+
if (session !== void 0 && ownsWriter && handle === void 0) {
|
|
741
|
+
throw new DshMoreError("session-not-live", "\u65E0\u6CD5\u5B89\u5168\u5378\u8F7D\u8FD9\u6761\u5DF2\u52A0\u8F7D\u7684\u4F1A\u8BDD\uFF0C\u8BF7\u91CD\u542F DSH \u540E\u518D\u5220\u9664\u3002", 409);
|
|
742
|
+
}
|
|
728
743
|
if (agent !== void 0) {
|
|
729
744
|
agent.cancel({ kind: "disposed" });
|
|
730
745
|
await agent.whenIdle();
|
|
731
746
|
}
|
|
732
747
|
if (session !== void 0) await ctx.sessions.flush(session);
|
|
733
|
-
const handle = getLiveSessionHandle(ctx, sessionId);
|
|
734
748
|
if (handle !== void 0) {
|
|
735
749
|
await handle.dispose();
|
|
736
750
|
} else {
|
|
@@ -753,7 +767,8 @@ function sessionDirectoryFromLocation(locationPath) {
|
|
|
753
767
|
throw new DshMoreError("internal", "\u5F53\u524D\u6301\u4E45\u5316\u540E\u7AEF\u6CA1\u6709\u8FD4\u56DE\u7EDD\u5BF9\u4F1A\u8BDD\u8DEF\u5F84\u3002", 409);
|
|
754
768
|
}
|
|
755
769
|
const artifact = basename(locationPath);
|
|
756
|
-
|
|
770
|
+
const match = /^session(?:\.v([1-9][0-9]*))?\.jsonl(?:\.zstd)?$/.exec(artifact);
|
|
771
|
+
if (match === null || match[1] !== void 0 && !Number.isSafeInteger(Number(match[1]))) {
|
|
757
772
|
throw new DshMoreError("internal", "\u6301\u4E45\u5316\u540E\u7AEF\u8FD4\u56DE\u4E86\u672A\u77E5\u7684\u4F1A\u8BDD\u6587\u4EF6\u5E03\u5C40\u3002", 500);
|
|
758
773
|
}
|
|
759
774
|
const sessionDir = dirname(locationPath);
|
|
@@ -765,18 +780,26 @@ function sessionDirectoryFromLocation(locationPath) {
|
|
|
765
780
|
async function deleteSessionPermanently(ctx, rawSessionId) {
|
|
766
781
|
const sessionId = SessionId6(rawSessionId);
|
|
767
782
|
const live = ctx.sessions.get(sessionId);
|
|
768
|
-
const
|
|
783
|
+
const stored = await ctx.sessionPersistence.list();
|
|
784
|
+
const header2 = stored.map((candidate) => "header" in candidate ? candidate.header : candidate).find((candidate) => candidate.id === sessionId) ?? live?.header;
|
|
769
785
|
if (header2 === void 0) throw new DshMoreError("not-found", "\u4F1A\u8BDD\u8BB0\u5F55\u4E0D\u5B58\u5728\u3002", 404);
|
|
770
|
-
const
|
|
786
|
+
const persistence = ctx.sessionPersistence;
|
|
787
|
+
const location = "locate" in persistence && typeof persistence.locate === "function" ? persistence.locate(header2) : void 0;
|
|
771
788
|
if (location === void 0) {
|
|
772
789
|
throw new DshMoreError("internal", "\u5F53\u524D\u6301\u4E45\u5316\u540E\u7AEF\u4E0D\u652F\u6301\u9010\u4F1A\u8BDD\u7269\u7406\u5220\u9664\u3002", 409);
|
|
773
790
|
}
|
|
791
|
+
if (typeof location !== "object" || location === null || !("kind" in location) || typeof location.kind !== "string" || !("path" in location) || typeof location.path !== "string") {
|
|
792
|
+
throw new DshMoreError("internal", "\u6301\u4E45\u5316\u540E\u7AEF\u8FD4\u56DE\u4E86\u65E0\u6548\u7684\u4F1A\u8BDD\u4F4D\u7F6E\u3002", 500);
|
|
793
|
+
}
|
|
774
794
|
if (location.kind !== "jsonl") {
|
|
775
795
|
throw new DshMoreError("internal", `\u6301\u4E45\u5316\u540E\u7AEF ${location.kind} \u4E0D\u652F\u6301\u5B89\u5168\u7684\u9010\u76EE\u5F55\u5220\u9664\u3002`, 409);
|
|
776
796
|
}
|
|
777
797
|
const sessionDir = sessionDirectoryFromLocation(location.path);
|
|
778
798
|
await unloadLiveSession(ctx, sessionId);
|
|
779
|
-
const info = await stat(sessionDir).catch(() =>
|
|
799
|
+
const info = await stat(sessionDir).catch((error) => {
|
|
800
|
+
if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT") return void 0;
|
|
801
|
+
throw error;
|
|
802
|
+
});
|
|
780
803
|
if (info !== void 0) {
|
|
781
804
|
if (!info.isDirectory()) throw new DshMoreError("internal", "\u4F1A\u8BDD\u6301\u4E45\u5316\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55\u3002", 500);
|
|
782
805
|
await rm(sessionDir, { recursive: true, force: false });
|
|
@@ -1435,6 +1458,48 @@ import { join } from "node:path";
|
|
|
1435
1458
|
var PROJECTLESS_TASKS_PATCH_ID = "projectless-tasks";
|
|
1436
1459
|
var TASK_ID_PATTERN = /^task-[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;
|
|
1437
1460
|
|
|
1461
|
+
// src/patches/projectless-tasks/groups.ts
|
|
1462
|
+
var SESSION_GROUPS_NAMESPACE = "dsh-more-session-groups";
|
|
1463
|
+
var EMPTY_GROUPS = { assignments: {} };
|
|
1464
|
+
function decodeSessionGroups(value) {
|
|
1465
|
+
if (typeof value !== "object" || value === null || !("assignments" in value)) return void 0;
|
|
1466
|
+
const assignments = value.assignments;
|
|
1467
|
+
if (typeof assignments !== "object" || assignments === null || Array.isArray(assignments) || !Object.values(assignments).every((id) => typeof id === "string")) return void 0;
|
|
1468
|
+
return { assignments };
|
|
1469
|
+
}
|
|
1470
|
+
|
|
1471
|
+
// src/patches/projectless-tasks/host/groups.ts
|
|
1472
|
+
import z2 from "@deepseek-ai/schemastery";
|
|
1473
|
+
import { SessionId as SessionId7 } from "@deepseek-ai/dsh-session";
|
|
1474
|
+
import { WorkspaceId } from "@deepseek-ai/dsh-workspace";
|
|
1475
|
+
var SessionGroupsSchema = z2.object({ assignments: z2.dict(z2.string()).default({}) });
|
|
1476
|
+
async function moveSessionGroup(ctx, payload) {
|
|
1477
|
+
const sessionId = SessionId7(requireString(payload, "sessionId"));
|
|
1478
|
+
if (typeof payload !== "object" || payload === null || !("workspaceId" in payload) || !(payload.workspaceId === null || typeof payload.workspaceId === "string" && payload.workspaceId.length > 0)) {
|
|
1479
|
+
throw new DshMoreError("bad-request", "\u8BF7\u9009\u62E9\u76EE\u6807\u5DE5\u4F5C\u533A\u3002");
|
|
1480
|
+
}
|
|
1481
|
+
const workspaceId = payload.workspaceId;
|
|
1482
|
+
if (!ctx.settings.writable) throw new DshMoreError("forbidden", "\u5F53\u524D\u914D\u7F6E\u4E3A\u53EA\u8BFB\uFF0C\u65E0\u6CD5\u79FB\u52A8\u4F1A\u8BDD\u3002", 403);
|
|
1483
|
+
if (workspaceId !== null && ctx.workspaceRegistry.get(WorkspaceId(workspaceId)) === void 0) {
|
|
1484
|
+
throw new DshMoreError("not-found", "\u76EE\u6807\u5DE5\u4F5C\u533A\u5DF2\u4E0D\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\u3002", 404);
|
|
1485
|
+
}
|
|
1486
|
+
const storedHeaders = async () => {
|
|
1487
|
+
const stored = await ctx.sessionPersistence.list();
|
|
1488
|
+
return stored.map((item) => "header" in item ? item.header : item);
|
|
1489
|
+
};
|
|
1490
|
+
const header2 = ctx.sessions.get(sessionId)?.header ?? (await storedHeaders()).find((item) => item.id === sessionId);
|
|
1491
|
+
if (header2 === void 0) throw new DshMoreError("not-found", "\u8BE5\u4F1A\u8BDD\u5DF2\u4E0D\u5B58\u5728\u3002", 404);
|
|
1492
|
+
if (header2.origin === "subagent") throw new DshMoreError("bad-request", "\u5B50\u4F1A\u8BDD\u8DDF\u968F\u4E3B\u4F1A\u8BDD\u5F52\u7EC4\uFF0C\u8BF7\u79FB\u52A8\u4E3B\u4F1A\u8BDD\u3002");
|
|
1493
|
+
if (ctx.workspaceRegistry.list().some((workspace) => workspace.sessionIds.includes(sessionId))) {
|
|
1494
|
+
throw new DshMoreError("bad-request", "\u8FD9\u6761\u4F1A\u8BDD\u5DF2\u6709\u539F\u751F\u5DE5\u4F5C\u533A\uFF0C\u53EA\u652F\u6301\u79FB\u52A8\u672A\u5206\u7EC4\u6216\u624B\u52A8\u5F52\u7EC4\u7684\u4F1A\u8BDD\u3002");
|
|
1495
|
+
}
|
|
1496
|
+
const current = decodeSessionGroups(ctx.settings.get(SESSION_GROUPS_NAMESPACE)) ?? EMPTY_GROUPS;
|
|
1497
|
+
const result = { sessionId, workspaceId };
|
|
1498
|
+
if ((current.assignments[sessionId] ?? null) === workspaceId) return result;
|
|
1499
|
+
await ctx.settings.mutate(SESSION_GROUPS_NAMESPACE, [workspaceId === null ? { op: "unset", path: ["assignments", sessionId] } : { op: "set", path: ["assignments", sessionId], value: workspaceId }]);
|
|
1500
|
+
return result;
|
|
1501
|
+
}
|
|
1502
|
+
|
|
1438
1503
|
// src/patches/projectless-tasks/host/index.ts
|
|
1439
1504
|
function prepareTask(payload, homeDirectory = homedir()) {
|
|
1440
1505
|
if (typeof payload !== "object" || payload === null || Array.isArray(payload) || !("sessionId" in payload) || typeof payload.sessionId !== "string" || !TASK_ID_PATTERN.test(payload.sessionId) || Object.keys(payload).length !== 1) {
|
|
@@ -1444,7 +1509,15 @@ function prepareTask(payload, homeDirectory = homedir()) {
|
|
|
1444
1509
|
}
|
|
1445
1510
|
var hostPatch7 = {
|
|
1446
1511
|
id: PROJECTLESS_TASKS_PATCH_ID,
|
|
1447
|
-
|
|
1512
|
+
setup: (ctx) => {
|
|
1513
|
+
const fiber = ctx.inject(["settings"], (scope) => {
|
|
1514
|
+
scope.settings.register(SESSION_GROUPS_NAMESPACE, SessionGroupsSchema);
|
|
1515
|
+
});
|
|
1516
|
+
return () => {
|
|
1517
|
+
void fiber.dispose();
|
|
1518
|
+
};
|
|
1519
|
+
},
|
|
1520
|
+
routes: ({ ctx }) => ({ prepare: (payload) => prepareTask(payload), move: (payload) => moveSessionGroup(ctx, payload) })
|
|
1448
1521
|
};
|
|
1449
1522
|
|
|
1450
1523
|
// src/generated/host-registry.ts
|
|
@@ -1495,15 +1568,15 @@ var HostPatchActivation = class {
|
|
|
1495
1568
|
};
|
|
1496
1569
|
|
|
1497
1570
|
// src/generated/host-settings-schema.ts
|
|
1498
|
-
import
|
|
1499
|
-
var PatchSettingsSchema =
|
|
1500
|
-
"message-edit":
|
|
1501
|
-
"message-delete":
|
|
1502
|
-
"session-delete":
|
|
1503
|
-
"conversation-markdown-export":
|
|
1504
|
-
"model-capabilities":
|
|
1505
|
-
"session-auto-title":
|
|
1506
|
-
"projectless-tasks":
|
|
1571
|
+
import z3 from "@deepseek-ai/schemastery";
|
|
1572
|
+
var PatchSettingsSchema = z3.object({
|
|
1573
|
+
"message-edit": z3.boolean().default(true),
|
|
1574
|
+
"message-delete": z3.boolean().default(true),
|
|
1575
|
+
"session-delete": z3.boolean().default(true),
|
|
1576
|
+
"conversation-markdown-export": z3.boolean().default(true),
|
|
1577
|
+
"model-capabilities": z3.boolean().default(true),
|
|
1578
|
+
"session-auto-title": z3.boolean().default(true),
|
|
1579
|
+
"projectless-tasks": z3.boolean().default(true)
|
|
1507
1580
|
});
|
|
1508
1581
|
|
|
1509
1582
|
// src/kernel/host/settings.ts
|
|
@@ -43,7 +43,7 @@ export declare const PATCH_CATALOG: readonly [{
|
|
|
43
43
|
}, {
|
|
44
44
|
readonly id: "projectless-tasks";
|
|
45
45
|
readonly name: "独立任务";
|
|
46
|
-
readonly description: "
|
|
46
|
+
readonly description: "在工作区下拉框创建独立任务并保留草稿,也可将未分组会话移入工作区列表";
|
|
47
47
|
readonly defaultEnabled: true;
|
|
48
48
|
readonly order: 700;
|
|
49
49
|
readonly clientKind: "standalone";
|
|
@@ -7,9 +7,11 @@ export declare function clientSessionActions(ctx: Context): Pick<ISessions, 'cre
|
|
|
7
7
|
/** Only the native workspace gate is removed; loading and business blocks stay native. */
|
|
8
8
|
export declare function unlockComposer(owner: ComposerBarOwnerProps, independent: boolean, block: ComposerBarOwnerProps['blocked']): ComposerBarOwnerProps;
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
10
|
+
* Keep the native conversation registration identity,
|
|
11
11
|
* children, stores and render authorizations; adapt only its owner props.
|
|
12
12
|
* A dormant fallback registration invalidates the public slot subscription
|
|
13
13
|
* on install/uninstall, including an already mounted Web client.
|
|
14
14
|
*/
|
|
15
|
-
export declare
|
|
15
|
+
export declare const CONVERSATION_SLOTS: readonly ["conversation", "main.conversation"];
|
|
16
|
+
export declare function conversationSlot(name: typeof CONVERSATION_SLOTS[number]): 'main.conversation';
|
|
17
|
+
export declare function installConversationAdapter(ctx: Context, activation: PatchActivationSource, name?: typeof CONVERSATION_SLOTS[number]): () => void;
|
|
@@ -1,9 +1,23 @@
|
|
|
1
1
|
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
-
import type {
|
|
2
|
+
import type { DraftAttachmentId } from '@deepseek-ai/dsh-client-ui-conversation/client';
|
|
3
3
|
import type { SessionId } from '@deepseek-ai/dsh-session/types';
|
|
4
|
-
|
|
4
|
+
interface Draft {
|
|
5
|
+
state: {
|
|
6
|
+
getSnapshot(): {
|
|
7
|
+
phase: string;
|
|
8
|
+
draft: string;
|
|
9
|
+
imageIds?: readonly DraftAttachmentId[];
|
|
10
|
+
attachmentIds?: readonly DraftAttachmentId[];
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
setDraft(text: string): void;
|
|
14
|
+
addImages?(ids: DraftAttachmentId[]): boolean;
|
|
15
|
+
removeImage?(id: DraftAttachmentId): unknown;
|
|
16
|
+
addAttachments?(ids: readonly DraftAttachmentId[]): boolean;
|
|
17
|
+
removeAttachment?(id: DraftAttachmentId): unknown;
|
|
18
|
+
}
|
|
5
19
|
/** Move only after all target admission checks pass; never overwrite another draft. */
|
|
6
|
-
export declare function transferDraft(source: Draft, target: Draft): void;
|
|
20
|
+
export declare function transferDraft(source: Draft, target: Draft, rebind?: (ids: readonly DraftAttachmentId[]) => void): void;
|
|
7
21
|
/** Validate the Client-only service methods where Cordis Host types overlap. */
|
|
8
22
|
export declare function transferBeforeOpen(ctx: Context, sourceId: SessionId | undefined, targetId: SessionId): boolean;
|
|
9
23
|
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type ComponentType } from 'react';
|
|
2
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
3
|
+
import type { SessionId } from '@deepseek-ai/dsh-session/types';
|
|
4
|
+
import type { SessionListState } from '@deepseek-ai/dsh-api-session-controller/client';
|
|
5
|
+
import type { WorkspaceSnapshot } from '@deepseek-ai/dsh-api-workspace-controller/client';
|
|
6
|
+
import type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
|
|
7
|
+
import type { SettingsScope } from '@deepseek-ai/dsh-client-ui-settings/client';
|
|
8
|
+
import type { PatchActivationSource } from '../../../kernel/client/activation.js';
|
|
9
|
+
import { type SessionGroups } from '../groups.js';
|
|
10
|
+
/** Only the sidebar receives grouping metadata; execution and workspace selection use native cwd. */
|
|
11
|
+
export declare function projectSessionGroups(workspaces: WorkspaceSnapshot, sessions: SessionListState, groups: SessionGroups): WorkspaceSnapshot;
|
|
12
|
+
type SidebarProps = PropsRuntime<'sidebar'> & {
|
|
13
|
+
archiveSession(id: SessionId): Promise<void>;
|
|
14
|
+
};
|
|
15
|
+
interface Lifetime {
|
|
16
|
+
subscribe(listener: () => void): () => void;
|
|
17
|
+
getSnapshot(): boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function extendGroupedSidebar(original: ComponentType<SidebarProps>, activation: PatchActivationSource, source: SettingsScope<SessionGroups>, lifetime?: Lifetime): ComponentType<SidebarProps>;
|
|
20
|
+
export declare function installSessionGrouping(ctx: Context, activation: PatchActivationSource): void;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const SESSION_GROUPS_NAMESPACE = "dsh-more-session-groups";
|
|
2
|
+
export interface SessionGroups {
|
|
3
|
+
assignments: Record<string, string>;
|
|
4
|
+
}
|
|
5
|
+
export declare const EMPTY_GROUPS: SessionGroups;
|
|
6
|
+
export declare function decodeSessionGroups(value: unknown): SessionGroups | undefined;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
import z from '@deepseek-ai/schemastery';
|
|
3
|
+
import { type SessionGroups } from '../groups.js';
|
|
4
|
+
export declare const SessionGroupsSchema: z<SessionGroups>;
|
|
5
|
+
/** Persist presentation membership only. Immutable cwd and native accounts stay authoritative. */
|
|
6
|
+
export declare function moveSessionGroup(ctx: Context, payload: unknown): Promise<{
|
|
7
|
+
sessionId: string;
|
|
8
|
+
workspaceId: string | null;
|
|
9
|
+
}>;
|
package/dsh.plugin.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-more",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.8",
|
|
4
4
|
"description": "Practical patches for missing DeepSeek Harness Web context and history controls.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -89,74 +89,76 @@
|
|
|
89
89
|
},
|
|
90
90
|
"peerDependencies": {
|
|
91
91
|
"@deepseek-ai/cordis": "^4.0.2",
|
|
92
|
-
"@deepseek-ai/dsh-agent": "^0.1.
|
|
93
|
-
"@deepseek-ai/dsh-client-ui-conversation": "^0.1.
|
|
94
|
-
"@deepseek-ai/dsh-client-ui-primitives": "^0.1.
|
|
95
|
-
"@deepseek-ai/dsh-client-ui-settings": "^0.1.
|
|
96
|
-
"@deepseek-ai/dsh-client-ui-settings-plugins": "^0.1.
|
|
97
|
-
"@deepseek-ai/dsh-client-ui-slots": "^0.1.
|
|
98
|
-
"@deepseek-ai/dsh-compaction": "^0.1.
|
|
99
|
-
"@deepseek-ai/dsh-agent-presets": "^0.1.
|
|
100
|
-
"@deepseek-ai/dsh-host-webserver": "^0.1.
|
|
101
|
-
"@deepseek-ai/dsh-llm": "^0.1.
|
|
102
|
-
"@deepseek-ai/dsh-session": "^0.1.
|
|
103
|
-
"@deepseek-ai/dsh-session-persistence": "^0.1.
|
|
104
|
-
"@deepseek-ai/dsh-session-projection": "^0.1.
|
|
105
|
-
"@deepseek-ai/dsh-settings": "^0.1.
|
|
106
|
-
"@deepseek-ai/dsh-system-prompt": "^0.1.
|
|
107
|
-
"@deepseek-ai/dsh-workspace": "^0.1.
|
|
108
|
-
"@deepseek-ai/dsh-web-app": "^0.1.
|
|
92
|
+
"@deepseek-ai/dsh-agent": "^0.1.5-rc.2",
|
|
93
|
+
"@deepseek-ai/dsh-client-ui-conversation": "^0.1.5-rc.2",
|
|
94
|
+
"@deepseek-ai/dsh-client-ui-primitives": "^0.1.5-rc.2",
|
|
95
|
+
"@deepseek-ai/dsh-client-ui-settings": "^0.1.5-rc.2",
|
|
96
|
+
"@deepseek-ai/dsh-client-ui-settings-plugins": "^0.1.5-rc.2",
|
|
97
|
+
"@deepseek-ai/dsh-client-ui-slots": "^0.1.5-rc.2",
|
|
98
|
+
"@deepseek-ai/dsh-compaction": "^0.1.5-rc.2",
|
|
99
|
+
"@deepseek-ai/dsh-agent-presets": "^0.1.5-rc.2",
|
|
100
|
+
"@deepseek-ai/dsh-host-webserver": "^0.1.5-rc.2",
|
|
101
|
+
"@deepseek-ai/dsh-llm": "^0.1.5-rc.2",
|
|
102
|
+
"@deepseek-ai/dsh-session": "^0.1.5-rc.2",
|
|
103
|
+
"@deepseek-ai/dsh-session-persistence": "^0.1.5-rc.2",
|
|
104
|
+
"@deepseek-ai/dsh-session-projection": "^0.1.5-rc.2",
|
|
105
|
+
"@deepseek-ai/dsh-settings": "^0.1.5-rc.2",
|
|
106
|
+
"@deepseek-ai/dsh-system-prompt": "^0.1.5-rc.2",
|
|
107
|
+
"@deepseek-ai/dsh-workspace": "^0.1.5-rc.2",
|
|
108
|
+
"@deepseek-ai/dsh-web-app": "^0.1.5-rc.2",
|
|
109
109
|
"@deepseek-ai/schemastery": "^3.18.2",
|
|
110
110
|
"react": "^18.2.0",
|
|
111
111
|
"react-dom": "^18.2.0",
|
|
112
112
|
"zod": "^4.4.3",
|
|
113
|
-
"@deepseek-ai/dsh-api-session-controller": "^0.1.
|
|
114
|
-
"@deepseek-ai/dsh-api-workspace-controller": "^0.1.
|
|
115
|
-
"@deepseek-ai/dsh-client-ui-chat": "^0.1.
|
|
116
|
-
"@deepseek-ai/dsh-client-ui-session": "^0.1.
|
|
117
|
-
"@deepseek-ai/dsh-client-ui-renderer": "^0.1.
|
|
118
|
-
"@deepseek-ai/dsh-client-store": "^0.1.
|
|
119
|
-
"@deepseek-ai/dsh-llm-retry": "^0.1.
|
|
120
|
-
"@deepseek-ai/dsh-session-title": "^0.1.
|
|
113
|
+
"@deepseek-ai/dsh-api-session-controller": "^0.1.5-rc.2",
|
|
114
|
+
"@deepseek-ai/dsh-api-workspace-controller": "^0.1.5-rc.2",
|
|
115
|
+
"@deepseek-ai/dsh-client-ui-chat": "^0.1.5-rc.2",
|
|
116
|
+
"@deepseek-ai/dsh-client-ui-session": "^0.1.5-rc.2",
|
|
117
|
+
"@deepseek-ai/dsh-client-ui-renderer": "^0.1.5-rc.2",
|
|
118
|
+
"@deepseek-ai/dsh-client-store": "^0.1.5-rc.2",
|
|
119
|
+
"@deepseek-ai/dsh-llm-retry": "^0.1.5-rc.2",
|
|
120
|
+
"@deepseek-ai/dsh-session-title": "^0.1.5-rc.2",
|
|
121
|
+
"@deepseek-ai/dsh-client-ui-layout": "^0.1.5-rc.2"
|
|
121
122
|
},
|
|
122
123
|
"devDependencies": {
|
|
123
|
-
"@deepseek-ai/cordis": "4.0.2",
|
|
124
|
-
"@deepseek-ai/dsh-agent": "0.1.
|
|
125
|
-
"@deepseek-ai/dsh-client-ui-conversation": "0.1.
|
|
126
|
-
"@deepseek-ai/dsh-client-ui-layout": "0.1.
|
|
127
|
-
"@deepseek-ai/dsh-client-ui-primitives": "0.1.
|
|
128
|
-
"@deepseek-ai/dsh-client-ui-settings": "0.1.
|
|
129
|
-
"@deepseek-ai/dsh-client-ui-settings-plugins": "0.1.
|
|
130
|
-
"@deepseek-ai/dsh-client-ui-slots": "0.1.
|
|
131
|
-
"@deepseek-ai/dsh-compaction": "0.1.
|
|
132
|
-
"@deepseek-ai/dsh-agent-presets": "0.1.
|
|
133
|
-
"@deepseek-ai/dsh-host-webserver": "0.1.
|
|
134
|
-
"@deepseek-ai/dsh-llm": "0.1.
|
|
135
|
-
"@deepseek-ai/dsh-session": "0.1.
|
|
136
|
-
"@deepseek-ai/dsh-session-persistence": "0.1.
|
|
137
|
-
"@deepseek-ai/dsh-session-projection": "0.1.
|
|
138
|
-
"@deepseek-ai/dsh-settings": "0.1.
|
|
139
|
-
"@deepseek-ai/dsh-system-prompt": "0.1.
|
|
140
|
-
"@deepseek-ai/dsh-workspace": "0.1.
|
|
141
|
-
"@deepseek-ai/dsh-web-app": "0.1.
|
|
142
|
-
"@deepseek-ai/schemastery": "3.18.2",
|
|
124
|
+
"@deepseek-ai/cordis": "^4.0.2",
|
|
125
|
+
"@deepseek-ai/dsh-agent": "^0.1.5-rc.2",
|
|
126
|
+
"@deepseek-ai/dsh-client-ui-conversation": "^0.1.5-rc.2",
|
|
127
|
+
"@deepseek-ai/dsh-client-ui-layout": "^0.1.5-rc.2",
|
|
128
|
+
"@deepseek-ai/dsh-client-ui-primitives": "^0.1.5-rc.2",
|
|
129
|
+
"@deepseek-ai/dsh-client-ui-settings": "^0.1.5-rc.2",
|
|
130
|
+
"@deepseek-ai/dsh-client-ui-settings-plugins": "^0.1.5-rc.2",
|
|
131
|
+
"@deepseek-ai/dsh-client-ui-slots": "^0.1.5-rc.2",
|
|
132
|
+
"@deepseek-ai/dsh-compaction": "^0.1.5-rc.2",
|
|
133
|
+
"@deepseek-ai/dsh-agent-presets": "^0.1.5-rc.2",
|
|
134
|
+
"@deepseek-ai/dsh-host-webserver": "^0.1.5-rc.2",
|
|
135
|
+
"@deepseek-ai/dsh-llm": "^0.1.5-rc.2",
|
|
136
|
+
"@deepseek-ai/dsh-session": "^0.1.5-rc.2",
|
|
137
|
+
"@deepseek-ai/dsh-session-persistence": "^0.1.5-rc.2",
|
|
138
|
+
"@deepseek-ai/dsh-session-projection": "^0.1.5-rc.2",
|
|
139
|
+
"@deepseek-ai/dsh-settings": "^0.1.5-rc.2",
|
|
140
|
+
"@deepseek-ai/dsh-system-prompt": "^0.1.5-rc.2",
|
|
141
|
+
"@deepseek-ai/dsh-workspace": "^0.1.5-rc.2",
|
|
142
|
+
"@deepseek-ai/dsh-web-app": "^0.1.5-rc.2",
|
|
143
|
+
"@deepseek-ai/schemastery": "^3.18.2",
|
|
143
144
|
"@types/node": "^24.0.0",
|
|
144
|
-
"@types/react": "
|
|
145
|
-
"@types/react-dom": "
|
|
145
|
+
"@types/react": "^18.3.0",
|
|
146
|
+
"@types/react-dom": "^18.3.0",
|
|
146
147
|
"esbuild": "^0.28.2",
|
|
147
|
-
"react": "18.3.1",
|
|
148
|
-
"react-dom": "18.3.1",
|
|
148
|
+
"react": "^18.3.1",
|
|
149
|
+
"react-dom": "^18.3.1",
|
|
149
150
|
"typescript": "^5.9.2",
|
|
150
151
|
"vitest": "^4.0.0",
|
|
151
|
-
"zod": "4.4.3",
|
|
152
|
-
"@deepseek-ai/dsh-api-session-controller": "0.1.
|
|
153
|
-
"@deepseek-ai/dsh-api-workspace-controller": "0.1.
|
|
154
|
-
"@deepseek-ai/dsh-client-ui-chat": "0.1.
|
|
155
|
-
"@deepseek-ai/dsh-client-ui-session": "0.1.
|
|
156
|
-
"@deepseek-ai/dsh-client-ui-renderer": "0.1.
|
|
157
|
-
"@deepseek-ai/dsh-client-store": "0.1.
|
|
158
|
-
"@deepseek-ai/dsh-llm-retry": "0.1.
|
|
159
|
-
"happy-dom": "20.14.0",
|
|
160
|
-
"@deepseek-ai/dsh-session-title": "0.1.
|
|
152
|
+
"zod": "^4.4.3",
|
|
153
|
+
"@deepseek-ai/dsh-api-session-controller": "^0.1.5-rc.2",
|
|
154
|
+
"@deepseek-ai/dsh-api-workspace-controller": "^0.1.5-rc.2",
|
|
155
|
+
"@deepseek-ai/dsh-client-ui-chat": "^0.1.5-rc.2",
|
|
156
|
+
"@deepseek-ai/dsh-client-ui-session": "^0.1.5-rc.2",
|
|
157
|
+
"@deepseek-ai/dsh-client-ui-renderer": "^0.1.5-rc.2",
|
|
158
|
+
"@deepseek-ai/dsh-client-store": "^0.1.5-rc.2",
|
|
159
|
+
"@deepseek-ai/dsh-llm-retry": "^0.1.5-rc.2",
|
|
160
|
+
"happy-dom": "^20.14.0",
|
|
161
|
+
"@deepseek-ai/dsh-session-title": "^0.1.5-rc.2",
|
|
162
|
+
"@deepseek-ai/dsh-session-persistence-jsonl": "^0.1.5-rc.2"
|
|
161
163
|
}
|
|
162
164
|
}
|