@deepseek-ai/dsh-cordis-client-runner 0.1.5-rc.2 → 0.1.6-alpha.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 CHANGED
@@ -2,5 +2,5 @@
2
2
  # side as of the last confirmed-consistent state. Both languages carry equal authority;
3
3
  # after editing either side, bring the other along and re-record with:
4
4
  # pnpm run verify-translation-pairing --write packages/extensions/cordis-client-runner/README.md
5
- README.md: 260d4703bda2560a4254962d7b868221d0328ec8
6
- README.zh.md: a74128508c5b6a81d0600452b6ec5301bf7c8dcb
5
+ README.md: 153a8bf3b71d2c4c8edf3423dd0b7004083d1ecc
6
+ README.zh.md: 207b3d40c56110d734499bb516e41872c53b262a
package/README.md CHANGED
@@ -51,7 +51,7 @@ This section explains the design behind the browser half; the observable behavio
51
51
 
52
52
  ### Design philosophy
53
53
 
54
- The browser half is built on one principle: a dynamic package must ride the same activation gating, fiber-effect cleanup, and status projection as a static one. The evaluated plugin is seated in the module table and mounted through `loader.create`; unload is entry removal plus factory invalidation plus style removal. The guard is a whitelist — lifecycle verbs plus declared services — that mirrors the host-side sandbox facade, so a package author meets one contract on both halves. One observer feeds two outlets: the slot registry's entry-error seam is watched only here, and a crash belonging to a package this runner seated goes upstream to the host for the model and onto this package's own `renderFailures` for the panel.
54
+ The browser half is built on one principle: a dynamic package must ride the same activation gating, fiber-effect cleanup, and status projection as a static one. The evaluated plugin is seated in the module table and mounted through `loader.create`; unload removes the entry, waits for its fiber's cleanup, then invalidates its factory and removes its styles. The guard is a whitelist — lifecycle verbs plus declared services — that mirrors the host-side sandbox facade, so a package author meets one contract on both halves. One observer feeds two outlets: the slot registry's entry-error seam is watched only here, and a crash belonging to a package this runner seated goes upstream to the host for the model and onto this package's own `renderFailures` for the panel.
55
55
 
56
56
  ### Source map
57
57
 
package/README.zh.md CHANGED
@@ -51,7 +51,7 @@ kind: "package-reference"
51
51
 
52
52
  ### 设计理念
53
53
 
54
- 浏览器半建立在一个原则之上:动态包必须与静态包共享同一套激活门控、fiber effect 清理与状态投影。求值后的插件被塞进模块表,并经 `loader.create` 挂载;卸载 = 移除 entry + 失效 factory + 撤下样式。guard 是一份白名单——生命周期动词加已声明服务——与 host 侧沙箱门面对称,因此包作者在两侧面对同一个约定。一个观察者供两个出口:只有这里监视槽位注册表的 entry 错误接缝,凡属于本 runner 落座过的包的崩溃,一路上行给 host(给模型),一路发布到本包自己的 `renderFailures`(给面板)。
54
+ 浏览器半建立在一个原则之上:动态包必须与静态包共享同一套激活门控、fiber effect 清理与状态投影。求值后的插件被塞进模块表,并经 `loader.create` 挂载;卸载先移除 entry,等待其 fiber 清理完成,再使 factory 失效并撤下样式。guard 是一份白名单——生命周期动词加已声明服务——与 host 侧沙箱门面对称,因此包作者在两侧面对同一个约定。一个观察者供两个出口:只有这里监视槽位注册表的 entry-error seam,凡属于本 runner 落座过的包的崩溃,一路上行给 host(给模型),一路发布到本包自己的 `renderFailures`(给面板)。
55
55
 
56
56
  ### 源码地图
57
57
 
@@ -140,4 +140,4 @@ kind: "package-reference"
140
140
 
141
141
  </details>
142
142
 
143
- **运行时不变式:** 不发布伴生入口。live Plugin 与 Plugin Run ID 的关系只存在于浏览器侧 service,Host 不变式无法观察;包内 load/teardown 测试直接覆盖该关系。
143
+ **运行时不变式:** 不发布伴生入口。所属关系(一个 live Plugin 的 loader entry 仅在一个 Plugin Run ID 存活期间存在)是只能通过 Client 半服务访问的浏览器侧状态,Node 平面的伴生入口无法观察。该关系改由本包自己的装载与拆除测试直接断言。
package/lib/client.js CHANGED
@@ -625,7 +625,9 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
625
625
  async teardown(id, entryId, styles) {
626
626
  this.live.delete(id);
627
627
  this.failures.delete(id);
628
- await this.env.loader.remove(entryId);
628
+ const disposal = this.env.loader.resolve(entryId).fiber?.dispose();
629
+ this.env.loader.remove(entryId);
630
+ await disposal;
629
631
  this.env.modules.invalidate(moduleIdOf(id));
630
632
  styles.dispose();
631
633
  }
@@ -1502,6 +1504,14 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1502
1504
  description: "Session to archive."
1503
1505
  }]
1504
1506
  },
1507
+ {
1508
+ signature: "unarchiveSession(sessionId: SessionId): Promise<void>",
1509
+ description: "Unarchive a Session, restoring it to its recorded Workspace position.",
1510
+ parameters: [{
1511
+ name: "sessionId",
1512
+ description: "Session to unarchive."
1513
+ }]
1514
+ },
1505
1515
  {
1506
1516
  signature: "pickDirectory(): Promise<string | null>",
1507
1517
  description: "Open the Host-native directory picker.",
@@ -1576,6 +1586,14 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1576
1586
  description: "Session to archive."
1577
1587
  }]
1578
1588
  },
1589
+ {
1590
+ signature: "unarchiveSession(sessionId: SessionId): Promise<void>",
1591
+ description: "Unarchive a Session from the archived Session list.",
1592
+ parameters: [{
1593
+ name: "sessionId",
1594
+ description: "Session to unarchive."
1595
+ }]
1596
+ },
1579
1597
  {
1580
1598
  signature: "insertSessionBefore( workspaceId: WorkspaceId, sessionId: SessionId, beforeSessionId?: SessionId, ): Promise<WorkspaceView>",
1581
1599
  description: "Move a Session within one Workspace account.",
@@ -2284,7 +2302,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2284
2302
  occupants: ["client-ui-message-feedback MessageFeedbackActions id 'feedback'"],
2285
2303
  replaceRisk: "none",
2286
2304
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.chat.assistant-actions', () => ctx.slots.register(\n { name: 'conversation.chat.assistant-actions', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2287
- source: "packages/client/ui-chat/src/client/contract/slots.ts:213"
2305
+ source: "packages/client/ui-chat/src/client/contract/slots.ts:217"
2288
2306
  },
2289
2307
  {
2290
2308
  key: "conversation.chat.commandview",
@@ -2327,7 +2345,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2327
2345
  occupants: [],
2328
2346
  replaceRisk: "none",
2329
2347
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.chat.commandview', () => ctx.slots.register(\n { name: 'conversation.chat.commandview', key: '<one key the owner dispatches>' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2330
- source: "packages/client/ui-chat/src/client/contract/slots.ts:201"
2348
+ source: "packages/client/ui-chat/src/client/contract/slots.ts:205"
2331
2349
  },
2332
2350
  {
2333
2351
  key: "conversation.chat.node",
@@ -2341,7 +2359,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2341
2359
  type: "string",
2342
2360
  doc: "Your cell key: the entry renders where the owner dispatches this exact key. Registering an already-occupied key replaces that occupant."
2343
2361
  }],
2344
- ownerProps: ["/** Stable owner currency delivered to a keyed Chat renderer. */\nexport interface ChatNodeOwnerProps {\n cwd?: string | undefined\n openFile: (path: string, options?: OpenFileOptions) => void\n inspectCall: (callId: ToolCallId) => void\n forkAt: (seq: number) => void\n /**\n * Session-authorized image loader, down-threaded from the Chat view so a\n * chat-node renderer can render the attachment presentation slot directly\n * with only the durable references plus this loader, instead of receiving a\n * rendering closure.\n */\n loadImage: MessageImageLoader\n renderMessageImages: RenderMessageImages\n fileMentions: (owner: TurnTailOwnerProps) => MarkdownFileMentions | undefined\n /** Turn-process state when this Node belongs to a projected Turn. */\n turnProcess?: TurnProcessOwnerProps | undefined\n}"],
2362
+ ownerProps: ["/** Stable owner currency delivered to a keyed Chat renderer. */\nexport interface ChatNodeOwnerProps {\n cwd?: string | undefined\n /** Open the current source file of a skill referenced by a sent message. */\n openSkill: (name: string) => void\n openFile: (path: string, options?: OpenFileOptions) => void\n inspectCall: (callId: ToolCallId) => void\n forkAt: (seq: number) => void\n /**\n * Session-authorized image loader, down-threaded from the Chat view so a\n * chat-node renderer can render the attachment presentation slot directly\n * with only the durable references plus this loader, instead of receiving a\n * rendering closure.\n */\n loadImage: MessageImageLoader\n renderMessageImages: RenderMessageImages\n fileMentions: (owner: TurnTailOwnerProps) => MarkdownFileMentions | undefined\n /** Turn-process state when this Node belongs to a projected Turn. */\n turnProcess?: TurnProcessOwnerProps | undefined\n}"],
2345
2363
  ownerPropsReferences: [
2346
2364
  "MarkdownFileMentions",
2347
2365
  "MessageImageLoader",
@@ -2391,7 +2409,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2391
2409
  ],
2392
2410
  replaceRisk: "shadows-shipped-ui",
2393
2411
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.chat.node', () => ctx.slots.register(\n { name: 'conversation.chat.node', key: '<one key the owner dispatches>' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2394
- source: "packages/client/ui-chat/src/client/contract/slots.ts:182"
2412
+ source: "packages/client/ui-chat/src/client/contract/slots.ts:186"
2395
2413
  },
2396
2414
  {
2397
2415
  key: "conversation.chat.turnTail",
@@ -2430,7 +2448,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2430
2448
  occupants: ["client-ui-deliverables Deliverables"],
2431
2449
  replaceRisk: "none",
2432
2450
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.chat.turnTail', () => ctx.slots.register(\n { name: 'conversation.chat.turnTail', select: owner => null },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2433
- source: "packages/client/ui-chat/src/client/contract/slots.ts:207"
2451
+ source: "packages/client/ui-chat/src/client/contract/slots.ts:211"
2434
2452
  },
2435
2453
  {
2436
2454
  key: "conversation.composer",
@@ -2477,7 +2495,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2477
2495
  ],
2478
2496
  replaceRisk: "none",
2479
2497
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.composer', () => ctx.slots.register(\n { name: 'conversation.composer', select: owner => null },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2480
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:158"
2498
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:157"
2481
2499
  },
2482
2500
  {
2483
2501
  key: "conversation.composer.bar",
@@ -2509,7 +2527,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2509
2527
  occupants: ["client-ui-conversation InputBar"],
2510
2528
  replaceRisk: "shadows-shipped-ui",
2511
2529
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.composer.bar', () => ctx.slots.register(\n { name: 'conversation.composer.bar' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2512
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:176"
2530
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:175"
2513
2531
  },
2514
2532
  {
2515
2533
  key: "conversation.composer.dock",
@@ -2562,7 +2580,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2562
2580
  occupants: ["client-ui-chat StatsPills id 'stats'"],
2563
2581
  replaceRisk: "none",
2564
2582
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.composer.dock', () => ctx.slots.register(\n { name: 'conversation.composer.dock', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2565
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:170"
2583
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:169"
2566
2584
  },
2567
2585
  {
2568
2586
  key: "conversation.hero.agentPreset",
@@ -2588,7 +2606,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2588
2606
  occupants: ["client-ui-agent-preset AgentPresetSeat"],
2589
2607
  replaceRisk: "shadows-shipped-ui",
2590
2608
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.hero.agentPreset', () => ctx.slots.register(\n { name: 'conversation.hero.agentPreset' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2591
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:164"
2609
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:163"
2592
2610
  },
2593
2611
  {
2594
2612
  key: "conversation.hero.brand.mark",
@@ -2614,7 +2632,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2614
2632
  occupants: [],
2615
2633
  replaceRisk: "none",
2616
2634
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.hero.brand.mark', () => ctx.slots.register(\n { name: 'conversation.hero.brand.mark' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2617
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:162"
2635
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:161"
2618
2636
  },
2619
2637
  {
2620
2638
  key: "conversation.hero.workspace",
@@ -2640,7 +2658,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2640
2658
  occupants: ["client-ui-workspace WorkspacePicker"],
2641
2659
  replaceRisk: "shadows-shipped-ui",
2642
2660
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.hero.workspace', () => ctx.slots.register(\n { name: 'conversation.hero.workspace' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2643
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:160"
2661
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:159"
2644
2662
  },
2645
2663
  {
2646
2664
  key: "conversation.hero.workspace.directoryFlow",
@@ -2702,7 +2720,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2702
2720
  occupants: ["client-ui-attachment ComposerAttachments"],
2703
2721
  replaceRisk: "shadows-shipped-ui",
2704
2722
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.input.attachments', () => ctx.slots.register(\n { name: 'conversation.input.attachments' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2705
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:178"
2723
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:177"
2706
2724
  },
2707
2725
  {
2708
2726
  key: "conversation.input.dock",
@@ -2759,7 +2777,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2759
2777
  ],
2760
2778
  replaceRisk: "none",
2761
2779
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.input.dock', () => ctx.slots.register(\n { name: 'conversation.input.dock', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2762
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:166"
2780
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:165"
2763
2781
  },
2764
2782
  {
2765
2783
  key: "conversation.input.left",
@@ -2812,7 +2830,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2812
2830
  occupants: [],
2813
2831
  replaceRisk: "none",
2814
2832
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.input.left', () => ctx.slots.register(\n { name: 'conversation.input.left', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2815
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:172"
2833
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:171"
2816
2834
  },
2817
2835
  {
2818
2836
  key: "conversation.input.model",
@@ -2821,7 +2839,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2821
2839
  summary: "Model selector inside the composer tool row.",
2822
2840
  doc: "Model selector inside the composer tool row.",
2823
2841
  registerOptions: [],
2824
- ownerProps: ["/** Owner share of the named plan and model controls. */\nexport interface InputControlOwnerProps {\n /** Whether the composer currently refuses interaction. */\n locked: boolean\n}"],
2842
+ ownerProps: ["/** Owner share of the named plan, permission, and model controls. */\nexport interface InputControlOwnerProps {\n /** Whether the composer currently refuses interaction. */\n locked: boolean\n}"],
2825
2843
  ownerPropsReferences: [],
2826
2844
  standardProps: [
2827
2845
  "useResource: UseResource",
@@ -2846,7 +2864,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2846
2864
  occupants: ["client-ui-model-selection ModelSelect"],
2847
2865
  replaceRisk: "shadows-shipped-ui",
2848
2866
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.input.model', () => ctx.slots.register(\n { name: 'conversation.input.model' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2849
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:186"
2867
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:187"
2850
2868
  },
2851
2869
  {
2852
2870
  key: "conversation.input.overlay",
@@ -2903,7 +2921,41 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2903
2921
  ],
2904
2922
  replaceRisk: "none",
2905
2923
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.input.overlay', () => ctx.slots.register(\n { name: 'conversation.input.overlay', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2906
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:168"
2924
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:167"
2925
+ },
2926
+ {
2927
+ key: "conversation.input.permission",
2928
+ kind: "single",
2929
+ scope: "session",
2930
+ summary: "Current-session permission control inside the composer tool row.",
2931
+ doc: "Current-session permission control inside the composer tool row.",
2932
+ registerOptions: [],
2933
+ ownerProps: ["/** Owner share of the named plan, permission, and model controls. */\nexport interface InputControlOwnerProps {\n /** Whether the composer currently refuses interaction. */\n locked: boolean\n}"],
2934
+ ownerPropsReferences: [],
2935
+ standardProps: [
2936
+ "useResource: UseResource",
2937
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2938
+ "usePanelInfo: UsePanelInfo",
2939
+ "useSessions: UseSessions",
2940
+ "useSessionPendingInteraction: UseSessionPendingInteraction",
2941
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2942
+ "useChat: UseChat",
2943
+ "useConversation: UseConversation",
2944
+ "useInput: SnapshotSelectorHook<InputState>",
2945
+ "inputActions: InputActions",
2946
+ "useSession: SessionSnapshotSelector",
2947
+ "sessionId: SessionId",
2948
+ "useProjection: UseProjection",
2949
+ "useTrajectory: UseTrajectory"
2950
+ ],
2951
+ keyDomain: "",
2952
+ hookContext: "",
2953
+ slotInject: "",
2954
+ declaredBy: "an entry in 'conversation.composer.bar' (client-ui-conversation), so it exists while that entry is mounted",
2955
+ occupants: ["client-ui-permission-presets PermissionSelect"],
2956
+ replaceRisk: "shadows-shipped-ui",
2957
+ example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.input.permission', () => ctx.slots.register(\n { name: 'conversation.input.permission' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2958
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:185"
2907
2959
  },
2908
2960
  {
2909
2961
  key: "conversation.input.plan",
@@ -2912,7 +2964,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2912
2964
  summary: "Plan control inside the composer tool row.",
2913
2965
  doc: "Plan control inside the composer tool row.",
2914
2966
  registerOptions: [],
2915
- ownerProps: ["/** Owner share of the named plan and model controls. */\nexport interface InputControlOwnerProps {\n /** Whether the composer currently refuses interaction. */\n locked: boolean\n}"],
2967
+ ownerProps: ["/** Owner share of the named plan, permission, and model controls. */\nexport interface InputControlOwnerProps {\n /** Whether the composer currently refuses interaction. */\n locked: boolean\n}"],
2916
2968
  ownerPropsReferences: [],
2917
2969
  standardProps: [
2918
2970
  "useResource: UseResource",
@@ -2937,7 +2989,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2937
2989
  occupants: ["client-ui-plan PlanChip"],
2938
2990
  replaceRisk: "shadows-shipped-ui",
2939
2991
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.input.plan', () => ctx.slots.register(\n { name: 'conversation.input.plan' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2940
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:184"
2992
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:183"
2941
2993
  },
2942
2994
  {
2943
2995
  key: "conversation.input.right",
@@ -2990,7 +3042,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2990
3042
  occupants: [],
2991
3043
  replaceRisk: "none",
2992
3044
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.input.right', () => ctx.slots.register(\n { name: 'conversation.input.right', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2993
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:174"
3045
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:173"
2994
3046
  },
2995
3047
  {
2996
3048
  key: "conversation.message.images",
@@ -3028,7 +3080,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3028
3080
  occupants: ["client-ui-attachment MessageImages"],
3029
3081
  replaceRisk: "shadows-shipped-ui",
3030
3082
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.message.images', () => ctx.slots.register(\n { name: 'conversation.message.images' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
3031
- source: "packages/client/ui-chat/src/client/contract/slots.ts:195"
3083
+ source: "packages/client/ui-chat/src/client/contract/slots.ts:199"
3032
3084
  },
3033
3085
  {
3034
3086
  key: "conversation.session",
@@ -3062,7 +3114,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3062
3114
  occupants: ["client-ui-conversation ConversationSession"],
3063
3115
  replaceRisk: "shadows-shipped-ui",
3064
3116
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.session', () => ctx.slots.register(\n { name: 'conversation.session' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
3065
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:123"
3117
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:122"
3066
3118
  },
3067
3119
  {
3068
3120
  key: "conversation.session.header",
@@ -3096,7 +3148,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3096
3148
  occupants: ["client-ui-conversation ConversationSessionHeader"],
3097
3149
  replaceRisk: "shadows-shipped-ui",
3098
3150
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.session.header', () => ctx.slots.register(\n { name: 'conversation.session.header' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
3099
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:125"
3151
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:124"
3100
3152
  },
3101
3153
  {
3102
3154
  key: "conversation.session.header.actions",
@@ -3150,11 +3202,12 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3150
3202
  "client-ui-agent-preset AgentPresetLabel id 'agent-preset'",
3151
3203
  "client-ui-jobs JobListAction id 'job-list'",
3152
3204
  "client-ui-schedule ScheduleCatalogAction id 'schedule-catalog'",
3205
+ "client-ui-sidebar-terminal TerminalRecovery",
3153
3206
  "experimental-client-ui-agent-team TeamAction id 'agent-team'"
3154
3207
  ],
3155
3208
  replaceRisk: "none",
3156
3209
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.session.header.actions', () => ctx.slots.register(\n { name: 'conversation.session.header.actions', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
3157
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:133"
3210
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:132"
3158
3211
  },
3159
3212
  {
3160
3213
  key: "conversation.session.header.corner",
@@ -3188,7 +3241,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3188
3241
  occupants: ["client-ui-sidebar-right ExpandButton"],
3189
3242
  replaceRisk: "shadows-shipped-ui",
3190
3243
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.session.header.corner', () => ctx.slots.register(\n { name: 'conversation.session.header.corner' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
3191
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:150"
3244
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:149"
3192
3245
  },
3193
3246
  {
3194
3247
  key: "conversation.session.header.lineage",
@@ -3222,7 +3275,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3222
3275
  occupants: ["client-ui-subagent SubagentHeaderLineage"],
3223
3276
  replaceRisk: "shadows-shipped-ui",
3224
3277
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.session.header.lineage', () => ctx.slots.register(\n { name: 'conversation.session.header.lineage' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
3225
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:127"
3278
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:126"
3226
3279
  },
3227
3280
  {
3228
3281
  key: "conversation.session.header.utilities",
@@ -3275,7 +3328,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3275
3328
  occupants: ["client-ui-open-in-app OpenInAppAction id 'open-in-app'", "session-log-export SessionLogDownloadHeaderAction id 'session-log-download'"],
3276
3329
  replaceRisk: "none",
3277
3330
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.session.header.utilities', () => ctx.slots.register(\n { name: 'conversation.session.header.utilities', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
3278
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:139"
3331
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:138"
3279
3332
  },
3280
3333
  {
3281
3334
  key: "conversation.trajectory.images",
@@ -3366,7 +3419,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3366
3419
  occupants: ["client-ui-chat ChatView id 'chat'", "client-ui-trajectory TrajectoryView id 'trajectory'"],
3367
3420
  replaceRisk: "none",
3368
3421
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.view', () => ctx.slots.register(\n { name: 'conversation.view', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
3369
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:156"
3422
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:155"
3370
3423
  },
3371
3424
  {
3372
3425
  key: "main",
@@ -3429,7 +3482,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3429
3482
  occupants: ["client-ui-conversation ConversationRoot"],
3430
3483
  replaceRisk: "shadows-shipped-ui",
3431
3484
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('main.conversation', () => ctx.slots.register(\n { name: 'main.conversation' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
3432
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:121"
3485
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:120"
3433
3486
  },
3434
3487
  {
3435
3488
  key: "rightbar",
@@ -3912,7 +3965,8 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3912
3965
  "client-ui-agent-preset AgentPresetSection id 'agent-presets'",
3913
3966
  "client-ui-settings-general GeneralSection id 'general'",
3914
3967
  "client-ui-settings-models ModelsSection id 'models'",
3915
- "client-ui-settings-plugins PluginsSettingsSection id 'plugins'"
3968
+ "client-ui-settings-plugins PluginsSettingsSection id 'plugins'",
3969
+ "client-ui-settings-unarchive-sessions ArchivedSessionsSection id 'archived-sessions'"
3916
3970
  ],
3917
3971
  replaceRisk: "none",
3918
3972
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('settings.section', () => ctx.slots.register(\n { name: 'settings.section', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
@@ -3984,7 +4038,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3984
4038
  hookContext: "",
3985
4039
  slotInject: "",
3986
4040
  declaredBy: "an entry in 'root' (client-ui-layout), so it exists while that entry is mounted",
3987
- occupants: [],
4041
+ occupants: ["client-ui-sidebar-terminal TerminalCleanup"],
3988
4042
  replaceRisk: "none",
3989
4043
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('shell.overlay', () => ctx.slots.register(\n { name: 'shell.overlay', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
3990
4044
  source: "packages/client/ui-layout/src/client/index.ts:91"
@@ -4194,7 +4248,8 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4194
4248
  occupants: [
4195
4249
  "client-ui-sidebar-documentpreview TextPreview",
4196
4250
  "client-ui-sidebar-files FilesBody",
4197
- "client-ui-sidebar-right GuideBody"
4251
+ "client-ui-sidebar-right GuideBody",
4252
+ "client-ui-sidebar-terminal TerminalBody"
4198
4253
  ],
4199
4254
  replaceRisk: "none",
4200
4255
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('sidebar.right.pane.tab', () => ctx.slots.register(\n { name: 'sidebar.right.pane.tab', key: '<one key the owner dispatches>' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
@@ -4237,7 +4292,8 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4237
4292
  occupants: [
4238
4293
  "client-ui-sidebar-documentpreview TextTitle",
4239
4294
  "client-ui-sidebar-files FilesTitle",
4240
- "client-ui-sidebar-right GuideTitle"
4295
+ "client-ui-sidebar-right GuideTitle",
4296
+ "client-ui-sidebar-terminal TerminalTitle"
4241
4297
  ],
4242
4298
  replaceRisk: "none",
4243
4299
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('sidebar.right.pane.tab.title', () => ctx.slots.register(\n { name: 'sidebar.right.pane.tab.title', key: '<one key the owner dispatches>' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
@@ -4328,6 +4384,45 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4328
4384
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('sidebar.right.tab.guide', () => ctx.slots.register(\n { name: 'sidebar.right.tab.guide', select: owner => null },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4329
4385
  source: "packages/client/ui-sidebar-right/src/client/contract/slots.ts:75"
4330
4386
  },
4387
+ {
4388
+ key: "sidebar.right.tab.guide.entry",
4389
+ kind: "keyed",
4390
+ scope: "session",
4391
+ summary: "One provider's guide card, with the standard card as the owner's fallback.",
4392
+ doc: "One provider's guide card, with the standard card as the owner's fallback.",
4393
+ registerOptions: [{
4394
+ name: "key",
4395
+ requirement: "required",
4396
+ type: "string",
4397
+ doc: "Your cell key: the entry renders where the owner dispatches this exact key. Registering an already-occupied key replaces that occupant."
4398
+ }],
4399
+ ownerProps: ["/** Resolved guide copy and entry identity supplied to a provider's card renderer. */\nexport interface SidebarRightGuideEntryOwnerProps {\n readonly entryId: string\n readonly kind: string\n readonly title: string\n readonly description?: string\n}"],
4400
+ ownerPropsReferences: [],
4401
+ standardProps: [
4402
+ "useResource: UseResource",
4403
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
4404
+ "usePanelInfo: UsePanelInfo",
4405
+ "useSessions: UseSessions",
4406
+ "useSessionPendingInteraction: UseSessionPendingInteraction",
4407
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
4408
+ "useChat: UseChat",
4409
+ "useConversation: UseConversation",
4410
+ "useInput: SnapshotSelectorHook<InputState>",
4411
+ "inputActions: InputActions",
4412
+ "useSession: SessionSnapshotSelector",
4413
+ "sessionId: SessionId",
4414
+ "useProjection: UseProjection",
4415
+ "useTrajectory: UseTrajectory"
4416
+ ],
4417
+ keyDomain: "open: any string the owner dispatches (no compile-time key set), none are taken yet",
4418
+ hookContext: "UseSidebarRightTabInfo",
4419
+ slotInject: "{ hooks: { tabInfo: SlotHookFactory<'sidebar.right.tab.guide.entry', UseSidebarRightTabInfo> } }",
4420
+ declaredBy: "an entry in 'sidebar.right.pane.tab' (client-ui-sidebar-right), so it exists while that entry is mounted",
4421
+ occupants: ["client-ui-sidebar-terminal TerminalGuide"],
4422
+ replaceRisk: "none",
4423
+ example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('sidebar.right.tab.guide.entry', () => ctx.slots.register(\n { name: 'sidebar.right.tab.guide.entry', key: '<one key the owner dispatches>' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4424
+ source: "packages/client/ui-sidebar-right/src/client/contract/slots.ts:82"
4425
+ },
4331
4426
  {
4332
4427
  key: "sidebar.right.tab.menu.item",
4333
4428
  kind: "list",
@@ -4379,7 +4474,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4379
4474
  occupants: [],
4380
4475
  replaceRisk: "none",
4381
4476
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('sidebar.right.tab.menu.item', () => ctx.slots.register(\n { name: 'sidebar.right.tab.menu.item', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4382
- source: "packages/client/ui-sidebar-right/src/client/contract/slots.ts:86"
4477
+ source: "packages/client/ui-sidebar-right/src/client/contract/slots.ts:94"
4383
4478
  },
4384
4479
  {
4385
4480
  key: "sidebar.settings",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-cordis-client-runner",
3
3
  "description": "Browser half of dynamic dual-half plugin packages: event subscription, closure evaluation, guard facade, and loader entries",
4
- "version": "0.1.5-rc.2",
4
+ "version": "0.1.6-alpha.1",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -44,12 +44,12 @@
44
44
  "@types/react": "~18.3.1",
45
45
  "react": "^18.2.0",
46
46
  "@deepseek-ai/cordis-plugin-loader": "^1.0.3",
47
- "@deepseek-ai/dsh-api-remotes": "^0.1.5-rc.2",
48
- "@deepseek-ai/dsh-client-modules": "^0.1.5-rc.2",
49
- "@deepseek-ai/dsh-client-ui-renderer": "^0.1.5-rc.2",
50
- "@deepseek-ai/dsh-client-ui-theme": "^0.1.5-rc.2",
47
+ "@deepseek-ai/dsh-api-remotes": "^0.1.6-alpha.1",
48
+ "@deepseek-ai/dsh-client-modules": "^0.1.6-alpha.1",
49
+ "@deepseek-ai/dsh-client-ui-renderer": "^0.1.6-alpha.1",
50
+ "@deepseek-ai/dsh-client-ui-theme": "^0.1.6-alpha.1",
51
51
  "@deepseek-ai/cordis": "^4.0.2",
52
- "@deepseek-ai/dsh-util-values": "^0.1.5-rc.2"
52
+ "@deepseek-ai/dsh-util-values": "^0.1.6-alpha.1"
53
53
  },
54
54
  "files": [
55
55
  "lib/index.js",