@deepseek-ai/dsh-cordis-client-runner 0.2.0-rc.2 → 0.2.1-alpha.2

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
@@ -75,5 +75,5 @@
75
75
  en: a728aeb4aa18db7d
76
76
  zh: b596309cd6707da7
77
77
  /deepseek-ai-dsh-cordis-client-runner/known-limitations-and-deferred-work/dev-note:
78
- en: c4cff307d238c93a
79
- zh: d1a9ff4164056741
78
+ en: e67f633dc6fe7773
79
+ zh: 3bb0c20c93f16f98
package/README.md CHANGED
@@ -143,5 +143,3 @@ These limits define where the browser half needs special care. They are current
143
143
  None.
144
144
 
145
145
  </details>
146
-
147
- **Runtime invariant:** No companion is published. The owned relation (a live Plugin's loader entry exists exactly while one Plugin Run ID is live) is browser-only state reachable through the client half's service, which the node-plane companion cannot observe. The relation is asserted by the package's own load/teardown coverage instead.
package/README.zh.md CHANGED
@@ -143,5 +143,3 @@ React 可能在加载成功后失败。Client 报告其拥有的每个 entry 失
143
143
  无。
144
144
 
145
145
  </details>
146
-
147
- **运行时不变式:** 不发布伴生入口。所属关系(一个 live Plugin 的 loader entry 仅在一个 Plugin Run ID 存活期间存在)是只能通过 Client 半服务访问的浏览器侧状态,Node 平面的伴生入口无法观察。该关系改由本包自己的装载与拆除测试直接断言。
package/lib/client.js CHANGED
@@ -1309,7 +1309,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1309
1309
  },
1310
1310
  {
1311
1311
  signature: "refreshProjections(sessionId: SessionId): Promise<void>",
1312
- description: "Load all Session projections once per connection; retry an unsuccessful initial read.",
1312
+ description: "Read projections without starting migration; retry failed or migration-deferred reads.",
1313
1313
  parameters: [{
1314
1314
  name: "sessionId",
1315
1315
  description: "Session to inspect without opening its conversation."
@@ -1329,7 +1329,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1329
1329
  returns: "bounded results, or a business/transport error."
1330
1330
  },
1331
1331
  {
1332
- signature: "fork(opts: { sessionId: SessionId atSeq?: number increaseTitle?: boolean onCreated?: (childId: SessionId) => void }): Promise<SessionId>",
1332
+ signature: "fork(opts: { sessionId: SessionId atSeq?: number increaseTitle?: boolean onCreated?: (childId: SessionId) => void /** False refuses source migration; omission preserves the Host default. */ allowMigration?: boolean }): Promise<SessionId>",
1333
1333
  description: "Fork a session from an exact inclusive prefix of the source; on resolution the child is catalogued and can be explicitly retained.",
1334
1334
  parameters: [{
1335
1335
  name: "opts",
@@ -1415,11 +1415,14 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1415
1415
  }]
1416
1416
  },
1417
1417
  {
1418
- signature: "setFontSize(px: number): void",
1419
- description: "Change the conversation content font size — the only font-size write entry. Accepted values are written through the settings scope and emit `theme/change`.",
1418
+ signature: "setFontSize(role: FontRole, px: number): void",
1419
+ description: "Change one role's font size — the only font-size write entry. Accepted values are written through the settings scope and emit `theme/change`.",
1420
1420
  parameters: [{
1421
+ name: "role",
1422
+ description: "font role."
1423
+ }, {
1421
1424
  name: "px",
1422
- description: "integer px within FONT_SIZE_MIN..FONT_SIZE_MAX; out-of-range or fractional values throw."
1425
+ description: "integer px within the role's `FONT_SIZE_SPECS` range; out-of-range or fractional values throw."
1423
1426
  }]
1424
1427
  },
1425
1428
  {
@@ -1509,15 +1512,22 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1509
1512
  throws: ["on failure; a refused creation is also shown through the Workspace notice unless a later navigation or disposal superseded the request."]
1510
1513
  },
1511
1514
  {
1512
- signature: "forkSession(sessionId: SessionId, onCreated?: (childId: SessionId) => void): Promise<SessionId>",
1515
+ signature: "forkSession( sessionId: SessionId, onCreated?: (childId: SessionId) => void, options?: Pick<Parameters<ISessions['fork']>[0], 'allowMigration'>, ): Promise<SessionId>",
1513
1516
  description: "Fork a Session without changing the current selection.",
1514
- parameters: [{
1515
- name: "sessionId",
1516
- description: "source Session."
1517
- }, {
1518
- name: "onCreated",
1519
- description: "observer before the optional child-title update."
1520
- }],
1517
+ parameters: [
1518
+ {
1519
+ name: "sessionId",
1520
+ description: "source Session."
1521
+ },
1522
+ {
1523
+ name: "onCreated",
1524
+ description: "observer before the optional child-title update."
1525
+ },
1526
+ {
1527
+ name: "options",
1528
+ description: "optional permission to start source migration; omission preserves the Host default."
1529
+ }
1530
+ ],
1521
1531
  returns: "the child SessionId after creation and inherited-title increment."
1522
1532
  },
1523
1533
  {
@@ -1530,11 +1540,14 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1530
1540
  returns: "a Session already addressable through the Session Controller."
1531
1541
  },
1532
1542
  {
1533
- signature: "startSession(workspaceId?: WorkspaceId): void",
1534
- description: "Start a New Session flow and navigate to its Session; a creation the Host refuses is shown through the Workspace notice and leaves the selection as it was.",
1543
+ signature: "startSession(workspaceId?: WorkspaceId, options?: StartSessionOptions): void",
1544
+ description: "Create a fresh Session, or reuse a blank when preparing an explicit draft. A creation the Host refuses is shown through the Workspace notice and leaves the selection as it was.",
1535
1545
  parameters: [{
1536
1546
  name: "workspaceId",
1537
1547
  description: "explicit target; absent inherits the current or most recent Workspace."
1548
+ }, {
1549
+ name: "options",
1550
+ description: "initial content; existing text or attachments are preserved unless clearPreviousDraft is true."
1538
1551
  }]
1539
1552
  },
1540
1553
  {
@@ -1814,6 +1827,10 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1814
1827
  name: "ConnectionStateSource",
1815
1828
  declaration: "export interface ConnectionStateSource {\n getSnapshot(): ConnectionState | undefined;\n subscribe(listener: () => void): () => void;\n}"
1816
1829
  },
1830
+ {
1831
+ name: "DraftInitializationOptions",
1832
+ declaration: "export interface DraftInitializationOptions {\n readonly prompt?: string;\n readonly clearPreviousDraft?: boolean;\n}"
1833
+ },
1817
1834
  {
1818
1835
  name: "EntryKeyOf",
1819
1836
  declaration: "export type EntryKeyOf<K extends keyof SlotMap & string> = SlotMap[K] extends {\n kind: 'keyed';\n keyProps: infer P extends object;\n} ? keyof P & string : string;"
@@ -1838,6 +1855,18 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1838
1855
  name: "FactoryRegistrationPropsOf",
1839
1856
  declaration: "export type FactoryRegistrationPropsOf<F extends keyof SlotFactoryMap & string> = FactoryRenderPropsOf<F> & PropsStore<FactoryStoreOf<F>> & InjectFace<FactoryInjectOf<F>> & PropsLocale<FactoryLocaleOf<F>> & PropsRenderFactories;"
1840
1857
  },
1858
+ {
1859
+ name: "FontFamilies",
1860
+ declaration: "export type FontFamilies = Readonly<Record<FontRole, string>>;"
1861
+ },
1862
+ {
1863
+ name: "FontRole",
1864
+ declaration: "export type FontRole = typeof FONT_ROLES[number];"
1865
+ },
1866
+ {
1867
+ name: "FontSizes",
1868
+ declaration: "export type FontSizes = Readonly<Record<FontRole, number>>;"
1869
+ },
1841
1870
  {
1842
1871
  name: "GlobalStandardProps",
1843
1872
  declaration: "export interface GlobalStandardProps {\n}"
@@ -1866,6 +1895,10 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1866
1895
  name: "ISession",
1867
1896
  declaration: "export interface ISession {\n readonly sessionId: SessionId;\n readonly projections: ProjectionsFace;\n beginSubmission(input: BeginSubmissionInput): SubmissionHandle;\n prompt(content: PromptContentPart[], mode: 'queue' | 'steer', signal?: AbortSignal, requestId?: SessionRequestId): Promise<RemoteResult<{\n accepted: true;\n }>>;\n readAttachment(attachmentId: AttachmentIdType): Promise<RemoteResult<{\n attachment: ImageAttachmentRef;\n data: Uint8Array;\n }>>;\n updateQueue(itemId: MessageId, action: QueueAction): Promise<RemoteResult<{\n accepted: true;\n }>>;\n cancel(): Promise<RemoteResult<{\n accepted: true;\n }>>;\n rename(title: string): Promise<RemoteResult<{\n title: string;\n seq: SessionSeq;\n }>>;\n loadOlder(): Promise<void>;\n loadThrough(seq: SessionSeq): Promise<void>;\n command(line: string): Promise<RemoteResult<{\n matched: boolean;\n }>>;\n}"
1868
1897
  },
1898
+ {
1899
+ name: "ISessions",
1900
+ declaration: "export interface ISessions {\n readonly list: ObservableSnapshot<SessionListState>;\n retain(target: SessionTarget, options: SessionRetainOptions): SessionReference;\n using<T>(target: SessionTarget, options: SessionRetainOptions, operation: (reference: SessionReference) => T | Promise<T>): Promise<T>;\n retainInfo(id: SessionId): ObservableSnapshot<SessionRetainInfo>;\n readonly searchResultLimit: number;\n create(opts?: {\n workspaceId?: WorkspaceId;\n cwd?: string;\n sessionId?: SessionId;\n }): Promise<SessionId>;\n subagentAddress(id: SessionId): SubagentAddress | undefined;\n refreshProjections(sessionId: SessionId): Promise<void>;\n refresh(): Promise<void>;\n search(query: string, signal: AbortSignal): Promise<RemoteResult<{\n items: SessionSearchResultItem[];\n hasMore: boolean;\n }>>;\n fork(opts: {\n sessionId: SessionId;\n atSeq?: number;\n increaseTitle?: boolean;\n onCreated?: (childId: SessionId) => void;\n allowMigration?: boolean;\n }): Promise<SessionId>;\n scope(id: SessionId): AgentContext | undefined;\n scopeOf(ctx: Context): SessionId | undefined;\n sessionOf(ctx: Context): SessionFace | undefined;\n binding(id: SessionId): SessionBinding | undefined;\n}"
1901
+ },
1869
1902
  {
1870
1903
  name: "KeyedHooksSources",
1871
1904
  declaration: "export type KeyedHooksSources = Record<string, KeyedStandardSource>;"
@@ -2102,10 +2135,22 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2102
2135
  name: "SessionIdOf",
2103
2136
  declaration: "export type SessionIdOf = SessionStandardProps extends {\n sessionId: infer S;\n} ? S : string;"
2104
2137
  },
2138
+ {
2139
+ name: "SessionListPhase",
2140
+ declaration: "export type SessionListPhase = 'pending' | 'ready';"
2141
+ },
2142
+ {
2143
+ name: "SessionListState",
2144
+ declaration: "export interface SessionListState {\n ids: SessionId[];\n byId: Record<SessionId, SessionSummary>;\n phase: SessionListPhase;\n projectionsBySession: Readonly<Record<SessionId, SessionProjectionSnapshot>>;\n}"
2145
+ },
2105
2146
  {
2106
2147
  name: "SessionMaybeStandardProps",
2107
2148
  declaration: "export interface SessionMaybeStandardProps {\n}"
2108
2149
  },
2150
+ {
2151
+ name: "SessionProjectionSnapshot",
2152
+ declaration: "export interface SessionProjectionSnapshot {\n readonly values: Readonly<Partial<SessionProjectionMap>>;\n readonly state: 'idle' | 'loading' | 'ready' | 'migration-required' | 'error';\n readonly error: RemoteFailure | null;\n}"
2153
+ },
2109
2154
  {
2110
2155
  name: "SessionProviderComponent",
2111
2156
  declaration: "export type SessionProviderComponent = (props: SessionAreaProps) => ReactNode;"
@@ -2202,6 +2247,10 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2202
2247
  name: "SnapshotSelectorHook",
2203
2248
  declaration: "export type SnapshotSelectorHook<T> = <S>(sel: (s: T) => S, eq?: (a: S, b: S) => boolean) => S;"
2204
2249
  },
2250
+ {
2251
+ name: "StartSessionOptions",
2252
+ declaration: "export type StartSessionOptions = DraftInitializationOptions;"
2253
+ },
2205
2254
  {
2206
2255
  name: "StoreDecl",
2207
2256
  declaration: "export type StoreDecl = StoreHandle<any, any> | StoreFactory;"
@@ -2244,7 +2293,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2244
2293
  },
2245
2294
  {
2246
2295
  name: "ThemeSnapshot",
2247
- declaration: "export interface ThemeSnapshot {\n preference: ThemePreference;\n fontSize: number;\n active: ThemeDefinition;\n themes: readonly ThemeDefinition[];\n revision: number;\n}"
2296
+ declaration: "export interface ThemeSnapshot {\n preference: ThemePreference;\n fontSizes: FontSizes;\n fontFamilies: FontFamilies;\n active: ThemeDefinition;\n themes: readonly ThemeDefinition[];\n revision: number;\n}"
2248
2297
  },
2249
2298
  {
2250
2299
  name: "ThemeTokenModes",
@@ -2448,7 +2497,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2448
2497
  occupants: ["client-ui-message-feedback MessageFeedbackActions id 'feedback'"],
2449
2498
  replaceRisk: "none",
2450
2499
  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}",
2451
- source: "packages/client/ui-chat/src/client/contract/slots.ts:321"
2500
+ source: "packages/client/ui-chat/src/client/contract/slots.ts:414"
2452
2501
  },
2453
2502
  {
2454
2503
  key: "conversation.chat.commandview",
@@ -2492,7 +2541,46 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2492
2541
  occupants: [],
2493
2542
  replaceRisk: "none",
2494
2543
  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}",
2495
- source: "packages/client/ui-chat/src/client/contract/slots.ts:309"
2544
+ source: "packages/client/ui-chat/src/client/contract/slots.ts:396"
2545
+ },
2546
+ {
2547
+ key: "conversation.chat.flow",
2548
+ kind: "single",
2549
+ scope: "session",
2550
+ summary: "Ordered Chat rows and local echoes with viewport-bound visibility hooks.",
2551
+ doc: "Ordered Chat rows and local echoes with viewport-bound visibility hooks.",
2552
+ registerOptions: [],
2553
+ ownerProps: ["/** Ordered rows and reconciled local echoes rendered inside one Chat viewport. */\nexport interface ChatFlowOwnerProps extends Pick<ChatNodeOwnerProps,\n 'cwd' | 'openSkill' | 'openFile' | 'inspectCall' | 'forkAt' | 'loadImage' | 'fileMentions'> {\n readonly entries: readonly RenderEntry[]\n readonly pendingInputs: readonly (PendingSubmission | InboxState['next-step'][number])[]\n readonly lastInputTurn: number | undefined\n readonly deferCollapse: boolean\n}"],
2554
+ ownerPropsReferences: [
2555
+ "ChatNodeOwnerProps",
2556
+ "PendingSubmission",
2557
+ "RenderEntry"
2558
+ ],
2559
+ standardProps: [
2560
+ "useResource: UseResource",
2561
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2562
+ "usePanelInfo: UsePanelInfo",
2563
+ "useSessions: UseSessions",
2564
+ "useSessionStatus: UseSessionStatus",
2565
+ "useSessionRetainInfo: UseSessionRetainInfo",
2566
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2567
+ "useChat: UseChat",
2568
+ "useConversation: UseConversation",
2569
+ "useInput: SnapshotSelectorHook<InputState>",
2570
+ "inputActions: InputActions",
2571
+ "useSession: SessionSnapshotSelector",
2572
+ "sessionId: SessionId",
2573
+ "useProjection: UseProjection",
2574
+ "useTrajectory: UseTrajectory"
2575
+ ],
2576
+ keyDomain: "",
2577
+ hookContext: "ChatFlowHookContext",
2578
+ slotInject: "ChatFlowInjected",
2579
+ declaredBy: "an entry in 'conversation.view' (client-ui-chat), so it exists while that entry is mounted",
2580
+ occupants: ["client-ui-chat ChatFlow"],
2581
+ replaceRisk: "shadows-shipped-ui",
2582
+ example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.chat.flow', () => ctx.slots.register(\n { name: 'conversation.chat.flow' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2583
+ source: "packages/client/ui-chat/src/client/contract/slots.ts:365"
2496
2584
  },
2497
2585
  {
2498
2586
  key: "conversation.chat.node",
@@ -2535,7 +2623,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2535
2623
  keyDomain: "fixed by the owner's key table { [Kind in ChatNodeKind]: { node: ChatNode<Kind> } }, already taken: assistant-step, command, command-input, compaction, context, manual-compaction, model-retry, question-reply, steering, system-prompt, tool-call, turn-error, turn-max-tokens, turn-process, turn-tail, turn-trigger, unknown, user, workflow-run",
2536
2624
  hookContext: "ChatNodeHookContext",
2537
2625
  slotInject: "ChatNodeInjected",
2538
- declaredBy: "an entry in 'conversation.view' (client-ui-chat), so it exists while that entry is mounted",
2626
+ declaredBy: "an entry in 'conversation.chat.flow' (client-ui-chat), so it exists while that entry is mounted",
2539
2627
  occupants: [
2540
2628
  "client-ui-chat UserMessageNodeView key 'user'",
2541
2629
  "client-ui-chat UserMessageNodeView key 'steering'",
@@ -2559,7 +2647,42 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2559
2647
  ],
2560
2648
  replaceRisk: "shadows-shipped-ui",
2561
2649
  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}",
2562
- source: "packages/client/ui-chat/src/client/contract/slots.ts:290"
2650
+ source: "packages/client/ui-chat/src/client/contract/slots.ts:377"
2651
+ },
2652
+ {
2653
+ key: "conversation.chat.reasoning.body",
2654
+ kind: "single",
2655
+ scope: "session",
2656
+ summary: "Expanded reasoning body with the unchanged model text.",
2657
+ doc: "Expanded reasoning body with the unchanged model text. The official entry\nhas priority 100 and calls the reasoning Content Factory; smaller priority\nvalues replace it. Contributions must preserve access to the original text.",
2658
+ registerOptions: [],
2659
+ ownerProps: ["/** Original model-provided reasoning offered to the expanded Body Slot. */\nexport interface ReasoningBodyOwnerProps {\n /** Complete or streaming reasoning text. */\n readonly text: string\n /** Whether the reasoning tail is still streaming. */\n readonly running: boolean\n}"],
2660
+ ownerPropsReferences: [],
2661
+ standardProps: [
2662
+ "useResource: UseResource",
2663
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2664
+ "usePanelInfo: UsePanelInfo",
2665
+ "useSessions: UseSessions",
2666
+ "useSessionStatus: UseSessionStatus",
2667
+ "useSessionRetainInfo: UseSessionRetainInfo",
2668
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2669
+ "useChat: UseChat",
2670
+ "useConversation: UseConversation",
2671
+ "useInput: SnapshotSelectorHook<InputState>",
2672
+ "inputActions: InputActions",
2673
+ "useSession: SessionSnapshotSelector",
2674
+ "sessionId: SessionId",
2675
+ "useProjection: UseProjection",
2676
+ "useTrajectory: UseTrajectory"
2677
+ ],
2678
+ keyDomain: "",
2679
+ hookContext: "",
2680
+ slotInject: "",
2681
+ declaredBy: "an entry in 'conversation.chat.node' (client-ui-chat), so it exists while that entry is mounted",
2682
+ occupants: ["client-ui-chat DefaultReasoningBody", "experimental-client-ui-cot-translation TranslationBody"],
2683
+ replaceRisk: "shadows-shipped-ui",
2684
+ example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.chat.reasoning.body', () => ctx.slots.register(\n { name: 'conversation.chat.reasoning.body' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2685
+ source: "packages/client/ui-chat/src/client/contract/slots.ts:402"
2563
2686
  },
2564
2687
  {
2565
2688
  key: "conversation.chat.turnTail",
@@ -2617,7 +2740,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2617
2740
  ],
2618
2741
  replaceRisk: "none",
2619
2742
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.chat.turnTail', () => ctx.slots.register(\n { name: 'conversation.chat.turnTail', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2620
- source: "packages/client/ui-chat/src/client/contract/slots.ts:315"
2743
+ source: "packages/client/ui-chat/src/client/contract/slots.ts:408"
2621
2744
  },
2622
2745
  {
2623
2746
  key: "conversation.composer",
@@ -2749,7 +2872,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2749
2872
  hookContext: "",
2750
2873
  slotInject: "",
2751
2874
  declaredBy: "an entry in 'conversation.composer.bar' (client-ui-conversation), so it exists while that entry is mounted",
2752
- occupants: ["client-ui-chat StatsPills id 'stats'"],
2875
+ occupants: ["client-ui-chat ActivityPill id 'activity'", "client-ui-chat UsagePill id 'usage'"],
2753
2876
  replaceRisk: "none",
2754
2877
  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}",
2755
2878
  source: "packages/client/ui-conversation/src/client/contract/slots.ts:199"
@@ -2926,7 +3049,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2926
3049
  occupants: ["client-ui-directory-picker-browse BrowseDirectoryFlow", "client-ui-directory-picker-native NativeDirectoryFlow"],
2927
3050
  replaceRisk: "shadows-shipped-ui",
2928
3051
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.hero.workspace.directoryFlow', () => ctx.slots.register(\n { name: 'conversation.hero.workspace.directoryFlow' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2929
- source: "packages/client/ui-workspace/src/client/contract/slots.ts:117"
3052
+ source: "packages/client/ui-workspace/src/client/contract/slots.ts:118"
2930
3053
  },
2931
3054
  {
2932
3055
  key: "conversation.input.activity",
@@ -3052,7 +3175,8 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3052
3175
  occupants: [
3053
3176
  "client-ui-conversation QueueDock id 'queue'",
3054
3177
  "client-ui-conversation TodoDock id 'todo'",
3055
- "client-ui-goal GoalDock id 'goal'"
3178
+ "client-ui-goal GoalDock id 'goal'",
3179
+ "experimental-client-ui-claude-code-mods Band id 'claude-code-mods'"
3056
3180
  ],
3057
3181
  replaceRisk: "none",
3058
3182
  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}",
@@ -3362,11 +3486,11 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3362
3486
  keyDomain: "",
3363
3487
  hookContext: "",
3364
3488
  slotInject: "",
3365
- declaredBy: "an entry in 'conversation.view' (client-ui-chat), so it exists while that entry is mounted",
3489
+ declaredBy: "an entry in 'conversation.chat.flow' (client-ui-chat), so it exists while that entry is mounted",
3366
3490
  occupants: ["client-ui-attachment MessageImages"],
3367
3491
  replaceRisk: "shadows-shipped-ui",
3368
3492
  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}",
3369
- source: "packages/client/ui-chat/src/client/contract/slots.ts:303"
3493
+ source: "packages/client/ui-chat/src/client/contract/slots.ts:390"
3370
3494
  },
3371
3495
  {
3372
3496
  key: "conversation.plan-review.actions",
@@ -3716,7 +3840,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3716
3840
  occupants: ["client-ui-attachment MessageImages"],
3717
3841
  replaceRisk: "shadows-shipped-ui",
3718
3842
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.trajectory.images', () => ctx.slots.register(\n { name: 'conversation.trajectory.images' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
3719
- source: "packages/client/ui-trajectory/src/client/trajectory-contract.ts:98"
3843
+ source: "packages/client/ui-trajectory/src/client/trajectory-contract.ts:103"
3720
3844
  },
3721
3845
  {
3722
3846
  key: "conversation.view",
@@ -3949,6 +4073,52 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3949
4073
  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}",
3950
4074
  source: "packages/client/ui-conversation/src/client/contract/slots.ts:131"
3951
4075
  },
4076
+ {
4077
+ key: "plugins.add.actions",
4078
+ kind: "list",
4079
+ scope: "root",
4080
+ summary: "Additional MenuItemButton rows after installation: 72px high, with a title and a description capped at two lines.",
4081
+ doc: "Additional MenuItemButton rows after installation: 72px high, with a title and a description capped at two lines.",
4082
+ registerOptions: [
4083
+ {
4084
+ name: "id",
4085
+ requirement: "required",
4086
+ type: "string",
4087
+ doc: "Your cell key. Use an id of your own: a fresh id is added beside the shipped entries, while reusing a shipped id puts you in THAT cell and replaces it. Owners that filter by id address you by it."
4088
+ },
4089
+ {
4090
+ name: "order",
4091
+ requirement: "optional",
4092
+ type: "number",
4093
+ doc: "Position among the entries, ascending (default 0)."
4094
+ },
4095
+ {
4096
+ name: "label",
4097
+ requirement: "optional",
4098
+ type: "string | (() => string)",
4099
+ doc: "Display text where the owner projects one (nav rows, tabs). A thunk is re-read on every projection, so localized text follows the active locale without re-registering."
4100
+ }
4101
+ ],
4102
+ ownerProps: ["/** Add-plugin menu actions, independent of any selected bundle or Session. */\nexport interface PluginAddActionsProps {\n /** Close the add-plugin menu before starting the contributed action. */\n readonly onDismiss: () => void\n}"],
4103
+ ownerPropsReferences: [],
4104
+ standardProps: [
4105
+ "useResource: UseResource",
4106
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
4107
+ "usePanelInfo: UsePanelInfo",
4108
+ "useSessions: UseSessions",
4109
+ "useSessionStatus: UseSessionStatus",
4110
+ "useSessionRetainInfo: UseSessionRetainInfo",
4111
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>"
4112
+ ],
4113
+ keyDomain: "",
4114
+ hookContext: "",
4115
+ slotInject: "",
4116
+ declaredBy: "an entry in 'main' (client-ui-plugin-manager), so it exists while that entry is mounted",
4117
+ occupants: ["client-ui-agent-preset CreatePluginMenuItem id 'create-plugin'"],
4118
+ replaceRisk: "none",
4119
+ example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('plugins.add.actions', () => ctx.slots.register(\n { name: 'plugins.add.actions', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4120
+ source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:89"
4121
+ },
3952
4122
  {
3953
4123
  key: "plugins.bundle.activation",
3954
4124
  kind: "keyed",
@@ -3979,7 +4149,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3979
4149
  occupants: ["experimental-client-ui-voice-input VoiceSetupPrompt key '@deepseek-ai/dsh-experimental-voice-input-bundle'"],
3980
4150
  replaceRisk: "shadows-shipped-ui",
3981
4151
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('plugins.bundle.activation', () => ctx.slots.register(\n { name: 'plugins.bundle.activation', key: '<one key the owner dispatches>' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
3982
- source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:78"
4152
+ source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:91"
3983
4153
  },
3984
4154
  {
3985
4155
  key: "plugins.bundle.config",
@@ -4004,14 +4174,14 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4004
4174
  "useSessionRetainInfo: UseSessionRetainInfo",
4005
4175
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>"
4006
4176
  ],
4007
- keyDomain: "open: any string the owner dispatches (no compile-time key set), already taken: @deepseek-ai/dsh-experimental-voice-input-bundle",
4177
+ keyDomain: "open: any string the owner dispatches (no compile-time key set), already taken: @deepseek-ai/dsh-experimental-cot-translation-bundle, @deepseek-ai/dsh-experimental-voice-input-bundle",
4008
4178
  hookContext: "",
4009
4179
  slotInject: "",
4010
4180
  declaredBy: "an entry in 'main' (client-ui-plugin-manager), so it exists while that entry is mounted",
4011
- occupants: ["experimental-client-ui-voice-input VoicePreparation key '@deepseek-ai/dsh-experimental-voice-input-bundle'"],
4181
+ occupants: ["experimental-client-ui-cot-translation TranslationSettings key '@deepseek-ai/dsh-experimental-cot-translation-bundle'", "experimental-client-ui-voice-input VoicePreparation key '@deepseek-ai/dsh-experimental-voice-input-bundle'"],
4012
4182
  replaceRisk: "shadows-shipped-ui",
4013
4183
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('plugins.bundle.config', () => ctx.slots.register(\n { name: 'plugins.bundle.config', key: '<one key the owner dispatches>' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4014
- source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:94"
4184
+ source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:107"
4015
4185
  },
4016
4186
  {
4017
4187
  key: "plugins.detail.actions",
@@ -4057,7 +4227,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4057
4227
  occupants: [],
4058
4228
  replaceRisk: "none",
4059
4229
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('plugins.detail.actions', () => ctx.slots.register(\n { name: 'plugins.detail.actions', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4060
- source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:108"
4230
+ source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:121"
4061
4231
  },
4062
4232
  {
4063
4233
  key: "plugins.detail.badge",
@@ -4103,7 +4273,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4103
4273
  occupants: [],
4104
4274
  replaceRisk: "none",
4105
4275
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('plugins.detail.badge', () => ctx.slots.register(\n { name: 'plugins.detail.badge', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4106
- source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:113"
4276
+ source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:126"
4107
4277
  },
4108
4278
  {
4109
4279
  key: "plugins.detail.section",
@@ -4149,7 +4319,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4149
4319
  occupants: [],
4150
4320
  replaceRisk: "none",
4151
4321
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('plugins.detail.section', () => ctx.slots.register(\n { name: 'plugins.detail.section', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4152
- source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:120"
4322
+ source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:133"
4153
4323
  },
4154
4324
  {
4155
4325
  key: "plugins.item",
@@ -4200,7 +4370,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4200
4370
  ],
4201
4371
  replaceRisk: "none",
4202
4372
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('plugins.item', () => ctx.slots.register(\n { name: 'plugins.item', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4203
- source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:88"
4373
+ source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:101"
4204
4374
  },
4205
4375
  {
4206
4376
  key: "plugins.row.config",
@@ -4232,7 +4402,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4232
4402
  occupants: [],
4233
4403
  replaceRisk: "none",
4234
4404
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('plugins.row.config', () => ctx.slots.register(\n { name: 'plugins.row.config', key: '<one key the owner dispatches>' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4235
- source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:102"
4405
+ source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:115"
4236
4406
  },
4237
4407
  {
4238
4408
  key: "rightbar",
@@ -4449,7 +4619,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4449
4619
  "client-ui-settings-session-log UploadRow",
4450
4620
  "client-ui-shortcuts ShortcutsRow id 'shortcuts'",
4451
4621
  "client-ui-theme AppearanceRow id 'appearance'",
4452
- "client-ui-theme FontSizeRow id 'font-size'"
4622
+ "client-ui-theme FontSettingsGroup id 'font-size'"
4453
4623
  ],
4454
4624
  replaceRisk: "none",
4455
4625
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('settings.general.item', () => ctx.slots.register(\n { name: 'settings.general.item', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
@@ -4785,6 +4955,33 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4785
4955
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('settings.trigger', () => ctx.slots.register(\n { name: 'settings.trigger' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4786
4956
  source: "packages/client/ui-settings/src/client/contract/slots.ts:27"
4787
4957
  },
4958
+ {
4959
+ key: "shell.bottom",
4960
+ kind: "single",
4961
+ scope: "root",
4962
+ summary: "Full-width bottom content below all three columns.",
4963
+ doc: "Full-width bottom content below all three columns. Its rendered height\nreduces the columns' available height; empty content reserves no space.\nThe occupant owns its height, visibility, and controls. It receives no\nSession binding and remains mounted across main-panel navigation.",
4964
+ registerOptions: [],
4965
+ ownerProps: [],
4966
+ ownerPropsReferences: [],
4967
+ standardProps: [
4968
+ "useResource: UseResource",
4969
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
4970
+ "usePanelInfo: UsePanelInfo",
4971
+ "useSessions: UseSessions",
4972
+ "useSessionStatus: UseSessionStatus",
4973
+ "useSessionRetainInfo: UseSessionRetainInfo",
4974
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>"
4975
+ ],
4976
+ keyDomain: "",
4977
+ hookContext: "",
4978
+ slotInject: "",
4979
+ declaredBy: "an entry in 'root' (client-ui-layout), so it exists while that entry is mounted",
4980
+ occupants: ["experimental-inspector InspectorPage"],
4981
+ replaceRisk: "shadows-shipped-ui",
4982
+ example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('shell.bottom', () => ctx.slots.register(\n { name: 'shell.bottom' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4983
+ source: "packages/client/ui-layout/src/client/index.ts:94"
4984
+ },
4788
4985
  {
4789
4986
  key: "shell.leading",
4790
4987
  kind: "single",
@@ -4810,7 +5007,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4810
5007
  occupants: ["client-ui-sidebar HeaderLeadingControls"],
4811
5008
  replaceRisk: "shadows-shipped-ui",
4812
5009
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('shell.leading', () => ctx.slots.register(\n { name: 'shell.leading' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4813
- source: "packages/client/ui-layout/src/client/index.ts:112"
5010
+ source: "packages/client/ui-layout/src/client/index.ts:119"
4814
5011
  },
4815
5012
  {
4816
5013
  key: "shell.overlay",
@@ -4867,7 +5064,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4867
5064
  ],
4868
5065
  replaceRisk: "none",
4869
5066
  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}",
4870
- source: "packages/client/ui-layout/src/client/index.ts:98"
5067
+ source: "packages/client/ui-layout/src/client/index.ts:105"
4871
5068
  },
4872
5069
  {
4873
5070
  key: "shell.quota-notice",
@@ -4899,7 +5096,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4899
5096
  occupants: ["client-ui-settings-account AccountQuotaNotice"],
4900
5097
  replaceRisk: "none",
4901
5098
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('shell.quota-notice', () => ctx.slots.register(\n { name: 'shell.quota-notice', select: owner => null },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4902
- source: "packages/client/ui-chat/src/client/contract/slots.ts:329"
5099
+ source: "packages/client/ui-chat/src/client/contract/slots.ts:422"
4903
5100
  },
4904
5101
  {
4905
5102
  key: "sidebar",
@@ -5153,7 +5350,8 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
5153
5350
  "client-ui-sidebar-files FilesBody",
5154
5351
  "client-ui-sidebar-right GuideBody",
5155
5352
  "client-ui-sidebar-terminal LazyTerminalBody",
5156
- "client-ui-subagent SidebarChatTab"
5353
+ "client-ui-subagent SidebarChatTab",
5354
+ "experimental-session-inspector SessionInspectorView"
5157
5355
  ],
5158
5356
  replaceRisk: "none",
5159
5357
  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}",
@@ -5676,7 +5874,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
5676
5874
  occupants: ["client-ui-schedule SessionScheduleHover id 'schedule-tasks'"],
5677
5875
  replaceRisk: "none",
5678
5876
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('sidebar.session.row.hover', () => ctx.slots.register(\n { name: 'sidebar.session.row.hover', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
5679
- source: "packages/client/ui-workspace/src/client/contract/slots.ts:134"
5877
+ source: "packages/client/ui-workspace/src/client/contract/slots.ts:135"
5680
5878
  },
5681
5879
  {
5682
5880
  key: "sidebar.session.row.leading",
@@ -5722,7 +5920,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
5722
5920
  occupants: ["client-ui-schedule SessionScheduleMark id 'schedule-mark'"],
5723
5921
  replaceRisk: "none",
5724
5922
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('sidebar.session.row.leading', () => ctx.slots.register(\n { name: 'sidebar.session.row.leading', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
5725
- source: "packages/client/ui-workspace/src/client/contract/slots.ts:129"
5923
+ source: "packages/client/ui-workspace/src/client/contract/slots.ts:130"
5726
5924
  },
5727
5925
  {
5728
5926
  key: "sidebar.settings",
@@ -5830,7 +6028,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
5830
6028
  occupants: ["client-ui-directory-picker-browse BrowseDirectoryFlow", "client-ui-directory-picker-native NativeDirectoryFlow"],
5831
6029
  replaceRisk: "shadows-shipped-ui",
5832
6030
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('sidebar.workspaces.directoryFlow', () => ctx.slots.register(\n { name: 'sidebar.workspaces.directoryFlow' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
5833
- source: "packages/client/ui-workspace/src/client/contract/slots.ts:119"
6031
+ source: "packages/client/ui-workspace/src/client/contract/slots.ts:120"
5834
6032
  },
5835
6033
  {
5836
6034
  key: "sidebar.workspaces.session.menu.item",
@@ -5881,7 +6079,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
5881
6079
  ],
5882
6080
  replaceRisk: "none",
5883
6081
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n const copyLabel = 'Copy Session ID' // Localize in the contributing package.\n ctx.slots.inject('sidebar.workspaces.session.menu.item', () => ctx.slots.register(\n { name: 'sidebar.workspaces.session.menu.item', id: 'copy-session-id', order: 500 },\n ({ sessionId, useMenuOpenState }) => {\n const [, setMenuOpen] = useMenuOpenState()\n return React.createElement(\n 'button',\n { type: 'button', role: 'menuitem', onClick: () => { setMenuOpen(false); void navigator.clipboard.writeText(sessionId) } },\n copyLabel,\n )\n },\n ))\n },\n}",
5884
- source: "packages/client/ui-workspace/src/client/contract/slots.ts:166"
6082
+ source: "packages/client/ui-workspace/src/client/contract/slots.ts:167"
5885
6083
  },
5886
6084
  {
5887
6085
  key: "sidebar.workspaces.session.row.action",
@@ -5927,7 +6125,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
5927
6125
  occupants: ["client-ui-workspace ArchiveSessionRowButton id 'archive'", "client-ui-workspace PinSessionRowButton id 'pin'"],
5928
6126
  replaceRisk: "none",
5929
6127
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('sidebar.workspaces.session.row.action', () => ctx.slots.register(\n { name: 'sidebar.workspaces.session.row.action', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
5930
- source: "packages/client/ui-workspace/src/client/contract/slots.ts:184"
6128
+ source: "packages/client/ui-workspace/src/client/contract/slots.ts:185"
5931
6129
  },
5932
6130
  {
5933
6131
  key: "tool.call.images",
@@ -5962,14 +6160,14 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
5962
6160
  occupants: ["client-ui-attachment MessageImages"],
5963
6161
  replaceRisk: "shadows-shipped-ui",
5964
6162
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('tool.call.images', () => ctx.slots.register(\n { name: 'tool.call.images' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
5965
- source: "packages/client/ui-tool/src/client/contract/slots.ts:46"
6163
+ source: "packages/client/ui-tool/src/client/contract/slots.ts:44"
5966
6164
  },
5967
6165
  {
5968
6166
  key: "tool.call.toolview",
5969
6167
  kind: "keyed",
5970
6168
  scope: "session",
5971
6169
  summary: "Keyed Tool call view dispatched by wire Tool name.",
5972
- doc: "Keyed Tool call view dispatched by wire Tool name. Any name is allowed,\nincluding tools registered by your package. Register with\n`key: '<tool name>'`; a typo never renders.\n\nRegistering an occupied key replaces its view; unclaimed keys use the\ngeneric row. The owner supplies the call identity and frozen running\nor settled node through explicit phase props. Preparing blocks have no dispatched\narguments; useToolCallArgumentsPartial optionally subscribes to their raw prefix.",
6170
+ doc: "Keyed Tool call view dispatched by wire Tool name. Any name is allowed,\nincluding tools registered by your package. Register with\n`key: '<tool name>'`; a typo never renders.\n\nRegistering an occupied key replaces its view; unclaimed keys use the\ngeneric row. The owner supplies the call identity and running\nor settled node through explicit phase props. Every stage supplies\n`name` and a lazy `args` view; preparing arguments may be incomplete.",
5973
6171
  registerOptions: [{
5974
6172
  name: "key",
5975
6173
  requirement: "required",
@@ -6007,8 +6205,8 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
6007
6205
  "useTrajectory: UseTrajectory"
6008
6206
  ],
6009
6207
  keyDomain: "open: any string the owner dispatches (no compile-time key set), already taken: ask_user_question, bash, cordis_define, cordis_inspect_list, cordis_inspect_query, cordis_inspect_self, cordis_run, cordis_stop, cordis_undefine, create_goal, edit, get_goal, glob, grep, interrupt_agent, job_kill, job_list, job_output, list_agents, list_subagent_models, lsp, present, ralph, read, read_image, schedule_create, schedule_delete, schedule_list, schedule_update, send_message, session_event_read, session_event_search, session_event_trace, session_search, session_trace, skill, spawn_teammate, subagent, team_task_create, team_task_get, team_task_list, team_task_update, terminal_close, terminal_list, terminal_open, terminal_read, terminal_signal, todo_write, update_goal, wait_agent, web_fetch, web_search, workflow, write",
6010
- hookContext: "ToolCallHookContext",
6011
- slotInject: "ToolCallInjected",
6208
+ hookContext: "",
6209
+ slotInject: "",
6012
6210
  declaredBy: "an entry in 'conversation.chat.node' (client-ui-tool), so it exists while that entry is mounted",
6013
6211
  occupants: [
6014
6212
  "client-ui-deliverables PresentRow key 'present'",
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.2.0-rc.2",
4
+ "version": "0.2.1-alpha.2",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -38,18 +38,18 @@
38
38
  },
39
39
  "license": "MIT",
40
40
  "peerDependencies": {
41
- "@deepseek-ai/cordis": "~4.0.4"
41
+ "@deepseek-ai/cordis": "~4.0.5-alpha.1"
42
42
  },
43
43
  "devDependencies": {
44
+ "@deepseek-ai/cordis-plugin-loader": "~1.0.6-alpha.1",
45
+ "@deepseek-ai/dsh-api-remotes": "0.2.1-alpha.2",
46
+ "@deepseek-ai/dsh-client-modules": "0.2.1-alpha.2",
47
+ "@deepseek-ai/dsh-client-ui-renderer": "0.2.1-alpha.2",
48
+ "@deepseek-ai/dsh-client-ui-theme": "0.2.1-alpha.2",
44
49
  "@types/react": "~18.3.1",
50
+ "@deepseek-ai/cordis": "~4.0.5-alpha.1",
45
51
  "react": "^18.2.0",
46
- "@deepseek-ai/cordis-plugin-loader": "~1.0.5",
47
- "@deepseek-ai/dsh-client-modules": "0.2.0-rc.2",
48
- "@deepseek-ai/dsh-api-remotes": "0.2.0-rc.2",
49
- "@deepseek-ai/dsh-client-ui-renderer": "0.2.0-rc.2",
50
- "@deepseek-ai/cordis": "~4.0.4",
51
- "@deepseek-ai/dsh-client-ui-theme": "0.2.0-rc.2",
52
- "@deepseek-ai/dsh-util-values": "0.2.0-rc.2"
52
+ "@deepseek-ai/dsh-util-values": "0.2.1-alpha.2"
53
53
  },
54
54
  "files": [
55
55
  "lib/index.js",