@deepseek-ai/dsh-cordis-client-runner 0.1.6-alpha.2 → 0.1.7-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.
Files changed (2) hide show
  1. package/lib/client.js +874 -166
  2. package/package.json +9 -9
package/lib/client.js CHANGED
@@ -1308,22 +1308,11 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1308
1308
  returns: "a stable read-only source across same-id generations, with zero counts when none is live."
1309
1309
  },
1310
1310
  {
1311
- signature: "setSubagentCatalogOpen(parentSessionId: SessionId, open: boolean): void",
1312
- description: "Mark whether a catalog menu is consuming live membership updates.",
1311
+ signature: "refreshProjections(sessionId: SessionId): Promise<void>",
1312
+ description: "Load all Session projections once per connection; retry an unsuccessful initial read.",
1313
1313
  parameters: [{
1314
- name: "parentSessionId",
1315
- description: "catalog owner."
1316
- }, {
1317
- name: "open",
1318
- description: "current menu state."
1319
- }]
1320
- },
1321
- {
1322
- signature: "refreshSubagents(parentSessionId: SessionId): Promise<void>",
1323
- description: "Refresh one direct-child catalog.",
1324
- parameters: [{
1325
- name: "parentSessionId",
1326
- description: "catalog owner."
1314
+ name: "sessionId",
1315
+ description: "Session to inspect without opening its conversation."
1327
1316
  }],
1328
1317
  returns: "completion of the current or newly started refresh."
1329
1318
  },
@@ -1341,10 +1330,10 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1341
1330
  },
1342
1331
  {
1343
1332
  signature: "fork(opts: { sessionId: SessionId; atSeq?: number; increaseTitle?: boolean }): Promise<SessionId>",
1344
- description: "Fork a session from a completed-turn prefix of the source; on resolution the child is in the catalog and may be explicitly retained.",
1333
+ description: "Fork a session from an exact inclusive prefix of the source; on resolution the child is catalogued and can be explicitly retained.",
1345
1334
  parameters: [{
1346
1335
  name: "opts",
1347
- description: "source session id, the optional event seq anchoring the cut (the boundary is the first turn/end at or after it; an in-log anchor in an open turn is unavailable rather than clipped backward), and whether to increment an inherited durable title before resolving."
1336
+ description: "source session id, the optional exact inclusive boundary seq (a real event seq the caller already knows; a cut inside an open turn is balanced Host-side with synthetic closers, and omission selects the latest completed-turn prefix), and whether to increment an inherited durable title before resolving."
1348
1337
  }],
1349
1338
  returns: "the child session id.",
1350
1339
  throws: ["when the fork fails, or when a requested child-title rename fails after creation."]
@@ -1516,16 +1505,17 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1516
1505
  name: "beforeOpen",
1517
1506
  description: "optional synchronous preparation for the selected Session, skipped after supersession."
1518
1507
  }],
1519
- returns: "completion; a superseded request may create a Session but does not open it."
1508
+ returns: "completion; a superseded request may create a Session but does not open it.",
1509
+ throws: ["on failure; a refused creation is also shown through the Workspace notice unless a later navigation or disposal superseded the request."]
1520
1510
  },
1521
1511
  {
1522
1512
  signature: "forkSession(sessionId: SessionId): Promise<void>",
1523
- description: "Fork a Session and open the child unless a later navigation supersedes it.",
1513
+ description: "Fork a Session without changing the current selection.",
1524
1514
  parameters: [{
1525
1515
  name: "sessionId",
1526
1516
  description: "source Session."
1527
1517
  }],
1528
- returns: "completion; a superseded request leaves its child available without selecting it."
1518
+ returns: "completion after child creation and inherited-title increment."
1529
1519
  },
1530
1520
  {
1531
1521
  signature: "connectWorkspace(workspaceId: WorkspaceId): Promise<SessionId>",
@@ -1538,18 +1528,21 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1538
1528
  },
1539
1529
  {
1540
1530
  signature: "startSession(workspaceId?: WorkspaceId): void",
1541
- description: "Start a New Session flow and navigate to its Session.",
1531
+ 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.",
1542
1532
  parameters: [{
1543
1533
  name: "workspaceId",
1544
1534
  description: "explicit target; absent inherits the current or most recent Workspace."
1545
1535
  }]
1546
1536
  },
1547
1537
  {
1548
- signature: "archiveSession(sessionId: SessionId): Promise<void>",
1538
+ signature: "archiveSession(sessionId: SessionId, options?: { readonly stopActivity?: boolean }): Promise<void>",
1549
1539
  description: "Archive a Session and clear it when it is the current selection.",
1550
1540
  parameters: [{
1551
1541
  name: "sessionId",
1552
1542
  description: "Session to archive."
1543
+ }, {
1544
+ name: "options",
1545
+ description: "`stopActivity` asks the Host to stop the Session's running work instead of refusing."
1553
1546
  }]
1554
1547
  },
1555
1548
  {
@@ -1627,12 +1620,16 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1627
1620
  }]
1628
1621
  },
1629
1622
  {
1630
- signature: "archiveSession(sessionId: SessionId): Promise<void>",
1623
+ signature: "archiveSession(sessionId: SessionId, options?: { readonly stopActivity?: boolean }): Promise<void>",
1631
1624
  description: "Archive a Session from Workspace grouping surfaces.",
1632
1625
  parameters: [{
1633
1626
  name: "sessionId",
1634
1627
  description: "Session to archive."
1635
- }]
1628
+ }, {
1629
+ name: "options",
1630
+ description: "`stopActivity` asks the Host to stop the Session's running work instead of refusing."
1631
+ }],
1632
+ throws: ["{WorkspaceArchiveError} when the Host refuses; without `stopActivity` a Session with running work fails as `workspace/session-active`, its details naming what runs."]
1636
1633
  },
1637
1634
  {
1638
1635
  signature: "unarchiveSession(sessionId: SessionId): Promise<void>",
@@ -1752,7 +1749,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1752
1749
  },
1753
1750
  {
1754
1751
  name: "ClientConnectionRpc",
1755
- declaration: "export interface ClientConnectionRpc {\n call(channel: string, endpoint: string, payload: unknown, signal?: AbortSignal): Promise<ConnectionRpcResult<unknown>>;\n readonly open?: (channel: string, endpoint: string, payload: unknown, signal: AbortSignal) => AsyncIterable<unknown>;\n}"
1752
+ declaration: "export interface ClientConnectionRpc {\n call(channel: string, endpoint: string, payload: unknown, signal?: AbortSignal): Promise<ConnectionRpcResult<unknown>>;\n readonly open?: (channel: string, endpoint: string, payload: unknown, signal: AbortSignal, uplink?: AsyncIterable<unknown>) => AsyncIterable<unknown>;\n}"
1756
1753
  },
1757
1754
  {
1758
1755
  name: "ClientRemote",
@@ -2024,7 +2021,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2024
2021
  },
2025
2022
  {
2026
2023
  name: "QueueAction",
2027
- declaration: "export type QueueAction = {\n readonly kind: 'edit';\n readonly content: readonly ContentBlock[];\n} | {\n readonly kind: 'remove';\n} | {\n readonly kind: 'steer';\n};"
2024
+ declaration: "export type QueueAction = {\n readonly kind: 'edit';\n readonly content: readonly TextBlock[];\n} | {\n readonly kind: 'remove';\n} | {\n readonly kind: 'steer';\n};"
2028
2025
  },
2029
2026
  {
2030
2027
  name: "RegisterFactory",
@@ -2448,7 +2445,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2448
2445
  occupants: ["client-ui-message-feedback MessageFeedbackActions id 'feedback'"],
2449
2446
  replaceRisk: "none",
2450
2447
  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:219"
2448
+ source: "packages/client/ui-chat/src/client/contract/slots.ts:271"
2452
2449
  },
2453
2450
  {
2454
2451
  key: "conversation.chat.commandview",
@@ -2492,7 +2489,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2492
2489
  occupants: [],
2493
2490
  replaceRisk: "none",
2494
2491
  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:207"
2492
+ source: "packages/client/ui-chat/src/client/contract/slots.ts:259"
2496
2493
  },
2497
2494
  {
2498
2495
  key: "conversation.chat.node",
@@ -2506,7 +2503,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2506
2503
  type: "string",
2507
2504
  doc: "Your cell key: the entry renders where the owner dispatches this exact key. Registering an already-occupied key replaces that occupant."
2508
2505
  }],
2509
- 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}"],
2506
+ ownerProps: ["/** Stable owner currency delivered to a keyed Chat renderer. */\nexport interface ChatNodeOwnerProps {\n /** Renderer-owned Node portion selected by the grouping Definition. */\n groupPart?: string\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) | undefined\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}"],
2510
2507
  ownerPropsReferences: [
2511
2508
  "MarkdownFileMentions",
2512
2509
  "MessageImageLoader",
@@ -2532,14 +2529,15 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2532
2529
  "useProjection: UseProjection",
2533
2530
  "useTrajectory: UseTrajectory"
2534
2531
  ],
2535
- 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, steering, system-prompt, tool-call, turn-error, turn-max-tokens, turn-process, turn-tail, unknown, user, workflow-run",
2536
- hookContext: "ConversationLocationDataStore<ConversationTurnDataMap> | undefined",
2537
- slotInject: "ChatNodeTurnDataInjected",
2532
+ 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, steering, system-prompt, tool-call, turn-error, turn-max-tokens, turn-process, turn-tail, turn-trigger, unknown, user, workflow-run",
2533
+ hookContext: "ChatNodeHookContext",
2534
+ slotInject: "ChatNodeInjected",
2538
2535
  declaredBy: "an entry in 'conversation.view' (client-ui-chat), so it exists while that entry is mounted",
2539
2536
  occupants: [
2540
2537
  "client-ui-chat UserMessageNodeView key 'user'",
2541
2538
  "client-ui-chat UserMessageNodeView key 'steering'",
2542
2539
  "client-ui-chat ContextMessageNodeView key 'context'",
2540
+ "client-ui-chat TurnTriggerNodeView key 'turn-trigger'",
2543
2541
  "client-ui-chat SystemPromptNodeView key 'system-prompt'",
2544
2542
  "client-ui-chat AssistantNodeView key 'assistant-step'",
2545
2543
  "client-ui-chat CommandNodeView key 'command'",
@@ -2557,7 +2555,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2557
2555
  ],
2558
2556
  replaceRisk: "shadows-shipped-ui",
2559
2557
  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}",
2560
- source: "packages/client/ui-chat/src/client/contract/slots.ts:188"
2558
+ source: "packages/client/ui-chat/src/client/contract/slots.ts:240"
2561
2559
  },
2562
2560
  {
2563
2561
  key: "conversation.chat.turnTail",
@@ -2611,7 +2609,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2611
2609
  occupants: ["client-ui-deliverables DeliverablesTail id '@deepseek-ai/dsh-client-ui-deliverables'", "client-ui-plan PlanCards"],
2612
2610
  replaceRisk: "none",
2613
2611
  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}",
2614
- source: "packages/client/ui-chat/src/client/contract/slots.ts:213"
2612
+ source: "packages/client/ui-chat/src/client/contract/slots.ts:265"
2615
2613
  },
2616
2614
  {
2617
2615
  key: "conversation.composer",
@@ -2659,7 +2657,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2659
2657
  ],
2660
2658
  replaceRisk: "none",
2661
2659
  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}",
2662
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:180"
2660
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:187"
2663
2661
  },
2664
2662
  {
2665
2663
  key: "conversation.composer.bar",
@@ -2692,7 +2690,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2692
2690
  occupants: ["client-ui-conversation InputBar"],
2693
2691
  replaceRisk: "shadows-shipped-ui",
2694
2692
  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}",
2695
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:198"
2693
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:207"
2696
2694
  },
2697
2695
  {
2698
2696
  key: "conversation.composer.dock",
@@ -2746,7 +2744,67 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2746
2744
  occupants: ["client-ui-chat StatsPills id 'stats'"],
2747
2745
  replaceRisk: "none",
2748
2746
  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}",
2749
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:192"
2747
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:199"
2748
+ },
2749
+ {
2750
+ key: "conversation.header",
2751
+ kind: "single",
2752
+ scope: "session-maybe",
2753
+ summary: "Resident navigation container, including when no Session is selected.",
2754
+ doc: "Resident navigation container, including when no Session is selected.",
2755
+ registerOptions: [],
2756
+ ownerProps: [],
2757
+ ownerPropsReferences: [],
2758
+ standardProps: [
2759
+ "useResource: UseResource",
2760
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2761
+ "usePanelInfo: UsePanelInfo",
2762
+ "useSessions: UseSessions",
2763
+ "useSessionStatus: UseSessionStatus",
2764
+ "useSessionRetainInfo: UseSessionRetainInfo",
2765
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2766
+ "useConversation: MaybeSnapshotSelectorHook<ConversationSnapshot>",
2767
+ "useInput: MaybeSnapshotSelectorHook<InputState>",
2768
+ "inputActions: InputActions | undefined",
2769
+ "useSession: MaybeSnapshotSelectorHook<SessionSnapshot>",
2770
+ "sessionId: SessionId | undefined",
2771
+ "useProjection: UseProjection"
2772
+ ],
2773
+ keyDomain: "",
2774
+ hookContext: "",
2775
+ slotInject: "",
2776
+ declaredBy: "an entry in 'main.conversation' (client-ui-conversation), so it exists while that entry is mounted",
2777
+ occupants: ["client-ui-conversation ConversationHeader"],
2778
+ replaceRisk: "shadows-shipped-ui",
2779
+ example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.header', () => ctx.slots.register(\n { name: 'conversation.header' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2780
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:139"
2781
+ },
2782
+ {
2783
+ key: "conversation.header.leading",
2784
+ kind: "single",
2785
+ scope: "root",
2786
+ summary: "Global navigation before the Session title, available without a Session.",
2787
+ doc: "Global navigation before the Session title, available without a Session.",
2788
+ registerOptions: [],
2789
+ ownerProps: ["/** The leading seat exposes global navigation independently of a Session. */\nexport interface ConversationHeaderLeadingOwnerProps {\n /** Marker field: the occupant receives no owner-specific values. */\n children?: never\n}"],
2790
+ ownerPropsReferences: [],
2791
+ standardProps: [
2792
+ "useResource: UseResource",
2793
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2794
+ "usePanelInfo: UsePanelInfo",
2795
+ "useSessions: UseSessions",
2796
+ "useSessionStatus: UseSessionStatus",
2797
+ "useSessionRetainInfo: UseSessionRetainInfo",
2798
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>"
2799
+ ],
2800
+ keyDomain: "",
2801
+ hookContext: "",
2802
+ slotInject: "",
2803
+ declaredBy: "an entry in 'conversation.header' (client-ui-conversation), so it exists while that entry is mounted",
2804
+ occupants: [],
2805
+ replaceRisk: "none",
2806
+ example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.header.leading', () => ctx.slots.register(\n { name: 'conversation.header.leading' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2807
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:168"
2750
2808
  },
2751
2809
  {
2752
2810
  key: "conversation.hero.agentPreset",
@@ -2779,7 +2837,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2779
2837
  occupants: ["client-ui-agent-preset AgentPresetSeat"],
2780
2838
  replaceRisk: "shadows-shipped-ui",
2781
2839
  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}",
2782
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:186"
2840
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:193"
2783
2841
  },
2784
2842
  {
2785
2843
  key: "conversation.hero.brand.mark",
@@ -2806,7 +2864,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2806
2864
  occupants: [],
2807
2865
  replaceRisk: "none",
2808
2866
  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}",
2809
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:184"
2867
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:191"
2810
2868
  },
2811
2869
  {
2812
2870
  key: "conversation.hero.workspace",
@@ -2833,7 +2891,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2833
2891
  occupants: ["client-ui-workspace WorkspacePicker"],
2834
2892
  replaceRisk: "shadows-shipped-ui",
2835
2893
  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}",
2836
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:182"
2894
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:189"
2837
2895
  },
2838
2896
  {
2839
2897
  key: "conversation.hero.workspace.directoryFlow",
@@ -2860,7 +2918,42 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2860
2918
  occupants: ["client-ui-directory-picker-browse BrowseDirectoryFlow", "client-ui-directory-picker-native NativeDirectoryFlow"],
2861
2919
  replaceRisk: "shadows-shipped-ui",
2862
2920
  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}",
2863
- source: "packages/client/ui-workspace/src/client/contract/slots.ts:57"
2921
+ source: "packages/client/ui-workspace/src/client/contract/slots.ts:99"
2922
+ },
2923
+ {
2924
+ key: "conversation.input.activity",
2925
+ kind: "single",
2926
+ scope: "session",
2927
+ summary: "Compact action after the model selector; it can expand across the toolbar while retaining the editor and submit action.",
2928
+ doc: "Compact action after the model selector; it can expand across the toolbar while retaining the editor and submit action.",
2929
+ registerOptions: [],
2930
+ ownerProps: ["/** A toolbar activity hides ordinary accessory controls while expanded; its occupant must release expansion on unmount. */\nexport interface InputActivityOwnerProps extends InputControlOwnerProps {\n /** @param active - whether the occupant needs the toolbar width before the submit action. */\n onActiveChange: (active: boolean) => void\n}"],
2931
+ ownerPropsReferences: ["InputControlOwnerProps"],
2932
+ standardProps: [
2933
+ "useResource: UseResource",
2934
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2935
+ "usePanelInfo: UsePanelInfo",
2936
+ "useSessions: UseSessions",
2937
+ "useSessionStatus: UseSessionStatus",
2938
+ "useSessionRetainInfo: UseSessionRetainInfo",
2939
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2940
+ "useChat: UseChat",
2941
+ "useConversation: UseConversation",
2942
+ "useInput: SnapshotSelectorHook<InputState>",
2943
+ "inputActions: InputActions",
2944
+ "useSession: SessionSnapshotSelector",
2945
+ "sessionId: SessionId",
2946
+ "useProjection: UseProjection",
2947
+ "useTrajectory: UseTrajectory"
2948
+ ],
2949
+ keyDomain: "",
2950
+ hookContext: "",
2951
+ slotInject: "",
2952
+ declaredBy: "an entry in 'conversation.composer.bar' (client-ui-conversation), so it exists while that entry is mounted",
2953
+ occupants: ["experimental-client-ui-voice-input VoiceInput"],
2954
+ replaceRisk: "shadows-shipped-ui",
2955
+ example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.input.activity', () => ctx.slots.register(\n { name: 'conversation.input.activity' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2956
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:205"
2864
2957
  },
2865
2958
  {
2866
2959
  key: "conversation.input.attachments",
@@ -2869,7 +2962,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2869
2962
  summary: "Optional draft-attachment rail and drop target.",
2870
2963
  doc: "Optional draft-attachment rail and drop target.",
2871
2964
  registerOptions: [],
2872
- ownerProps: ["/** Input state handed to the optional attachment presentation plugin. */\nexport interface ComposerAttachmentsOwnerProps {\n /** Browser-owned draft attachments in input order. */\n attachments: readonly ComposerAttachment[]\n /** Whether a document-level file drop may add attachments now. */\n canAcceptDrop: boolean\n /** Add one dropped batch through the composer's validation path. */\n onAddFiles: (files: readonly File[]) => void\n /** Remove one draft attachment through the Conversation service. */\n onRemoveAttachment: (id: DraftAttachmentId) => void\n /** Current per-draft upload states for file-kind attachments. */\n uploads: DraftFileUploads\n /** Restart one failed file upload. */\n onRetryFile: (id: DraftAttachmentId) => void\n /** Display-ready limits for the drop invitation. */\n dropLimits?: { readonly count: number; readonly size: string } | undefined\n}"],
2965
+ ownerProps: ["/** Input state handed to the optional attachment presentation plugin. */\nexport interface ComposerAttachmentsOwnerProps {\n /** Browser-owned draft attachments in input order. */\n attachments: readonly ComposerAttachment[]\n /** Whether a document-level file drop may add attachments now. */\n canAcceptDrop: boolean\n /**\n * Add one dropped batch through the composer's validation path.\n * @param files - dropped, pasted, or picked browser files in source order.\n * @param directories - members of `files` the drop source identified as directories.\n */\n onAddFiles: (files: readonly File[], directories?: ReadonlySet<File>) => void\n /** Remove one draft attachment through the Conversation service. */\n onRemoveAttachment: (id: DraftAttachmentId) => void\n /** Current per-draft upload states for file-kind attachments. */\n uploads: DraftFileUploads\n /** Restart one failed file upload. */\n onRetryFile: (id: DraftAttachmentId) => void\n /** Display-ready limits for the drop invitation. */\n dropLimits?: { readonly count: number; readonly size: string } | undefined\n}"],
2873
2966
  ownerPropsReferences: [
2874
2967
  "ComposerAttachment",
2875
2968
  "DraftAttachmentId",
@@ -2897,7 +2990,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2897
2990
  occupants: ["client-ui-attachment ComposerAttachments"],
2898
2991
  replaceRisk: "shadows-shipped-ui",
2899
2992
  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}",
2900
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:200"
2993
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:209"
2901
2994
  },
2902
2995
  {
2903
2996
  key: "conversation.input.dock",
@@ -2955,7 +3048,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2955
3048
  ],
2956
3049
  replaceRisk: "none",
2957
3050
  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}",
2958
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:188"
3051
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:195"
2959
3052
  },
2960
3053
  {
2961
3054
  key: "conversation.input.left",
@@ -3009,14 +3102,14 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3009
3102
  occupants: [],
3010
3103
  replaceRisk: "none",
3011
3104
  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}",
3012
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:194"
3105
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:201"
3013
3106
  },
3014
3107
  {
3015
3108
  key: "conversation.input.model",
3016
3109
  kind: "single",
3017
3110
  scope: "session",
3018
3111
  summary: "Model selector inside the composer tool row.",
3019
- doc: "Model selector inside the composer tool row.",
3112
+ doc: "Model selector inside the composer tool row. When expanded controls cannot\nshare a line, the row sets --dsh-composer-model-text-display to none and\n--dsh-composer-model-icon-display to block for an occupant's compact display.",
3020
3113
  registerOptions: [],
3021
3114
  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}"],
3022
3115
  ownerPropsReferences: [],
@@ -3044,7 +3137,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3044
3137
  occupants: ["client-ui-model-selection ModelSelect"],
3045
3138
  replaceRisk: "shadows-shipped-ui",
3046
3139
  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}",
3047
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:210"
3140
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:223"
3048
3141
  },
3049
3142
  {
3050
3143
  key: "conversation.input.overlay",
@@ -3102,7 +3195,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3102
3195
  ],
3103
3196
  replaceRisk: "none",
3104
3197
  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}",
3105
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:190"
3198
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:197"
3106
3199
  },
3107
3200
  {
3108
3201
  key: "conversation.input.permission",
@@ -3137,7 +3230,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3137
3230
  occupants: ["client-ui-permission-presets PermissionSelect"],
3138
3231
  replaceRisk: "shadows-shipped-ui",
3139
3232
  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}",
3140
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:208"
3233
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:217"
3141
3234
  },
3142
3235
  {
3143
3236
  key: "conversation.input.plan",
@@ -3172,7 +3265,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3172
3265
  occupants: ["client-ui-plan PlanChip"],
3173
3266
  replaceRisk: "shadows-shipped-ui",
3174
3267
  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}",
3175
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:206"
3268
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:215"
3176
3269
  },
3177
3270
  {
3178
3271
  key: "conversation.input.right",
@@ -3226,7 +3319,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3226
3319
  occupants: [],
3227
3320
  replaceRisk: "none",
3228
3321
  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}",
3229
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:196"
3322
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:203"
3230
3323
  },
3231
3324
  {
3232
3325
  key: "conversation.message.images",
@@ -3265,7 +3358,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3265
3358
  occupants: ["client-ui-attachment MessageImages"],
3266
3359
  replaceRisk: "shadows-shipped-ui",
3267
3360
  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}",
3268
- source: "packages/client/ui-chat/src/client/contract/slots.ts:201"
3361
+ source: "packages/client/ui-chat/src/client/contract/slots.ts:253"
3269
3362
  },
3270
3363
  {
3271
3364
  key: "conversation.plan-review.actions",
@@ -3354,7 +3447,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3354
3447
  occupants: ["client-ui-conversation ConversationSession"],
3355
3448
  replaceRisk: "shadows-shipped-ui",
3356
3449
  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}",
3357
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:129"
3450
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:133"
3358
3451
  },
3359
3452
  {
3360
3453
  key: "conversation.session.header",
@@ -3385,11 +3478,11 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3385
3478
  keyDomain: "",
3386
3479
  hookContext: "",
3387
3480
  slotInject: "",
3388
- declaredBy: "an entry in 'main.conversation' (client-ui-conversation), so it exists while that entry is mounted",
3481
+ declaredBy: "an entry in 'conversation.header' (client-ui-conversation), so it exists while that entry is mounted",
3389
3482
  occupants: ["client-ui-conversation ConversationSessionHeader"],
3390
3483
  replaceRisk: "shadows-shipped-ui",
3391
3484
  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}",
3392
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:135"
3485
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:141"
3393
3486
  },
3394
3487
  {
3395
3488
  key: "conversation.session.header.actions",
@@ -3444,12 +3537,12 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3444
3537
  "client-ui-agent-preset AgentPresetLabel id 'agent-preset'",
3445
3538
  "client-ui-jobs JobListAction id 'job-list'",
3446
3539
  "client-ui-schedule ScheduleCatalogAction id 'schedule-catalog'",
3447
- "client-ui-sidebar-terminal TerminalRecovery",
3540
+ "client-ui-subagent SubagentCatalogAction id 'subagent-catalog'",
3448
3541
  "experimental-client-ui-agent-team TeamAction id 'agent-team'"
3449
3542
  ],
3450
3543
  replaceRisk: "none",
3451
3544
  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}",
3452
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:143"
3545
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:156"
3453
3546
  },
3454
3547
  {
3455
3548
  key: "conversation.session.header.corner",
@@ -3484,42 +3577,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3484
3577
  occupants: ["client-ui-sidebar-right ExpandButton"],
3485
3578
  replaceRisk: "shadows-shipped-ui",
3486
3579
  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}",
3487
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:172"
3488
- },
3489
- {
3490
- key: "conversation.session.header.leading",
3491
- kind: "single",
3492
- scope: "session",
3493
- summary: "Leading seat before the Session breadcrumbs, for window-chrome-adjacent controls (macOS desktop sidebar reopen and New Session while the sidebar is hidden).",
3494
- doc: "Leading seat before the Session breadcrumbs, for window-chrome-adjacent\ncontrols (macOS desktop sidebar reopen and New Session while the sidebar\nis hidden). The seat is laid out only while its occupant renders\nsomething, and it stays mounted through the blank-session state so a\nhidden sidebar always keeps a reopen control on screen.",
3495
- registerOptions: [],
3496
- ownerProps: ["/** The leading seat's occupant derives its state from standard Session props. */\nexport interface ConversationHeaderLeadingOwnerProps {\n /** Marker field: the occupant receives no owner-specific values. */\n children?: never\n}"],
3497
- ownerPropsReferences: [],
3498
- standardProps: [
3499
- "useResource: UseResource",
3500
- "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3501
- "usePanelInfo: UsePanelInfo",
3502
- "useSessions: UseSessions",
3503
- "useSessionStatus: UseSessionStatus",
3504
- "useSessionRetainInfo: UseSessionRetainInfo",
3505
- "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3506
- "useChat: UseChat",
3507
- "useConversation: UseConversation",
3508
- "useInput: SnapshotSelectorHook<InputState>",
3509
- "inputActions: InputActions",
3510
- "useSession: SessionSnapshotSelector",
3511
- "sessionId: SessionId",
3512
- "useProjection: UseProjection",
3513
- "useTrajectory: UseTrajectory"
3514
- ],
3515
- keyDomain: "",
3516
- hookContext: "",
3517
- slotInject: "",
3518
- declaredBy: "an entry in 'conversation.session.header' (client-ui-conversation), so it exists while that entry is mounted",
3519
- occupants: ["client-ui-sidebar HeaderLeadingControls"],
3520
- replaceRisk: "shadows-shipped-ui",
3521
- example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.session.header.leading', () => ctx.slots.register(\n { name: 'conversation.session.header.leading' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
3522
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:161"
3580
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:179"
3523
3581
  },
3524
3582
  {
3525
3583
  key: "conversation.session.header.lineage",
@@ -3554,7 +3612,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3554
3612
  occupants: ["client-ui-subagent SubagentHeaderLineage"],
3555
3613
  replaceRisk: "shadows-shipped-ui",
3556
3614
  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}",
3557
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:137"
3615
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:150"
3558
3616
  },
3559
3617
  {
3560
3618
  key: "conversation.session.header.utilities",
@@ -3608,7 +3666,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3608
3666
  occupants: ["client-ui-open-in-app OpenInAppAction id 'open-in-app'", "session-log-export SessionLogDownloadHeaderAction id 'session-log-download'"],
3609
3667
  replaceRisk: "none",
3610
3668
  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}",
3611
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:149"
3669
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:162"
3612
3670
  },
3613
3671
  {
3614
3672
  key: "conversation.trajectory.images",
@@ -3675,7 +3733,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3675
3733
  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."
3676
3734
  }
3677
3735
  ],
3678
- ownerProps: ["/** Conversation View entries obtain their data from registered standard hooks. */\nexport interface ConvViewOwnerProps {\n /** Focus request addressed to the selected View. */\n viewRequest: import('./views.ts').ConversationViewRequest | null\n /** Select a View and address one opaque focus identity to it. */\n openView: (view: string, focus: string) => void\n /** Acknowledge the current one-shot focus request. */\n completeViewRequest: () => void\n}"],
3736
+ ownerProps: ["/** Conversation View entries obtain their data from registered standard hooks. */\nexport interface ConvViewOwnerProps {\n /** Open a tool call's inspector when an inspection target is available. */\n inspectCall: ((callId: string) => void) | undefined\n /** Focus request addressed to the selected View. */\n viewRequest: import('./views.ts').ConversationViewRequest | null\n /** Select a View and address one opaque focus identity to it. */\n openView: (view: string, focus: string) => void\n /** Acknowledge the current one-shot focus request. */\n completeViewRequest: () => void\n}"],
3679
3737
  ownerPropsReferences: ["ConversationViewRequest"],
3680
3738
  standardProps: [
3681
3739
  "useResource: UseResource",
@@ -3701,7 +3759,115 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3701
3759
  occupants: ["client-ui-chat ChatView id 'chat'", "client-ui-trajectory TrajectoryView id 'trajectory'"],
3702
3760
  replaceRisk: "none",
3703
3761
  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}",
3704
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:178"
3762
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:185"
3763
+ },
3764
+ {
3765
+ key: "deliverables.file.actions",
3766
+ kind: "list",
3767
+ scope: "session",
3768
+ summary: "Open one file through its authorized Session event coordinates.",
3769
+ doc: "Open one file through its authorized Session event coordinates.",
3770
+ registerOptions: [
3771
+ {
3772
+ name: "id",
3773
+ requirement: "required",
3774
+ type: "string",
3775
+ 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."
3776
+ },
3777
+ {
3778
+ name: "order",
3779
+ requirement: "optional",
3780
+ type: "number",
3781
+ doc: "Position among the entries, ascending (default 0)."
3782
+ },
3783
+ {
3784
+ name: "label",
3785
+ requirement: "optional",
3786
+ type: "string | (() => string)",
3787
+ 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."
3788
+ }
3789
+ ],
3790
+ ownerProps: ["/** Native file action selected by an explicit user gesture. */\nexport type PresentedAction = 'open' | 'reveal'", "/** Failure feedback for the shared native opening control. */\nexport type PresentedOpenFailure = 'openError' | 'revealError' | null"],
3791
+ ownerPropsReferences: [],
3792
+ standardProps: [
3793
+ "useResource: UseResource",
3794
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3795
+ "usePanelInfo: UsePanelInfo",
3796
+ "useSessions: UseSessions",
3797
+ "useSessionStatus: UseSessionStatus",
3798
+ "useSessionRetainInfo: UseSessionRetainInfo",
3799
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3800
+ "useChat: UseChat",
3801
+ "useConversation: UseConversation",
3802
+ "useInput: SnapshotSelectorHook<InputState>",
3803
+ "inputActions: InputActions",
3804
+ "useSession: SessionSnapshotSelector",
3805
+ "sessionId: SessionId",
3806
+ "useProjection: UseProjection",
3807
+ "useTrajectory: UseTrajectory"
3808
+ ],
3809
+ keyDomain: "",
3810
+ hookContext: "",
3811
+ slotInject: "",
3812
+ declaredBy: "an entry in 'conversation.chat.turnTail' (client-ui-deliverables), so it exists while that entry is mounted",
3813
+ occupants: ["client-ui-open-in-app FileRouteAction id 'open-in-app'"],
3814
+ replaceRisk: "none",
3815
+ example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('deliverables.file.actions', () => ctx.slots.register(\n { name: 'deliverables.file.actions', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
3816
+ source: "packages/client/ui-deliverables/src/client/file-actions.ts:8"
3817
+ },
3818
+ {
3819
+ key: "deliverables.review.file.actions",
3820
+ kind: "list",
3821
+ scope: "session",
3822
+ summary: "The same file actions owned by a changed-file review tab.",
3823
+ doc: "The same file actions owned by a changed-file review tab.",
3824
+ registerOptions: [
3825
+ {
3826
+ name: "id",
3827
+ requirement: "required",
3828
+ type: "string",
3829
+ 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."
3830
+ },
3831
+ {
3832
+ name: "order",
3833
+ requirement: "optional",
3834
+ type: "number",
3835
+ doc: "Position among the entries, ascending (default 0)."
3836
+ },
3837
+ {
3838
+ name: "label",
3839
+ requirement: "optional",
3840
+ type: "string | (() => string)",
3841
+ 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."
3842
+ }
3843
+ ],
3844
+ ownerProps: ["/** Slot contract table. Owners extend via declaration merging; entries are {@link SlotEntryDef}. */\nexport interface SlotMap {}"],
3845
+ ownerPropsReferences: ["SlotEntryDef"],
3846
+ standardProps: [
3847
+ "useResource: UseResource",
3848
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3849
+ "usePanelInfo: UsePanelInfo",
3850
+ "useSessions: UseSessions",
3851
+ "useSessionStatus: UseSessionStatus",
3852
+ "useSessionRetainInfo: UseSessionRetainInfo",
3853
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3854
+ "useChat: UseChat",
3855
+ "useConversation: UseConversation",
3856
+ "useInput: SnapshotSelectorHook<InputState>",
3857
+ "inputActions: InputActions",
3858
+ "useSession: SessionSnapshotSelector",
3859
+ "sessionId: SessionId",
3860
+ "useProjection: UseProjection",
3861
+ "useTrajectory: UseTrajectory"
3862
+ ],
3863
+ keyDomain: "",
3864
+ hookContext: "",
3865
+ slotInject: "",
3866
+ declaredBy: "an entry in 'sidebar.right.pane.tab' (client-ui-deliverables), so it exists while that entry is mounted",
3867
+ occupants: ["client-ui-open-in-app FileRouteAction id 'open-in-app'"],
3868
+ replaceRisk: "none",
3869
+ example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('deliverables.review.file.actions', () => ctx.slots.register(\n { name: 'deliverables.review.file.actions', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
3870
+ source: "packages/client/ui-deliverables/src/client/file-actions.ts:21"
3705
3871
  },
3706
3872
  {
3707
3873
  key: "main",
@@ -3766,7 +3932,39 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3766
3932
  occupants: ["client-ui-conversation ConversationRoot"],
3767
3933
  replaceRisk: "shadows-shipped-ui",
3768
3934
  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}",
3769
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:127"
3935
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:131"
3936
+ },
3937
+ {
3938
+ key: "plugins.bundle.activation",
3939
+ kind: "keyed",
3940
+ scope: "root",
3941
+ summary: "Optional guidance after the user enables a bundle from the list, keyed by npm package name.",
3942
+ doc: "Optional guidance after the user enables a bundle from the list, keyed by npm package name.",
3943
+ registerOptions: [{
3944
+ name: "key",
3945
+ requirement: "required",
3946
+ type: "string",
3947
+ doc: "Your cell key: the entry renders where the owner dispatches this exact key. Registering an already-occupied key replaces that occupant."
3948
+ }],
3949
+ ownerProps: ["/** One user-requested bundle activation and navigation to its configuration page. */\nexport interface PluginActivationOwnerProps {\n readonly packageName: string\n /** Dismiss guidance for this activation. */\n readonly onDismiss: () => void\n /** Dismiss guidance and open this bundle's detail page. */\n readonly onOpenDetails: () => void\n}"],
3950
+ ownerPropsReferences: [],
3951
+ standardProps: [
3952
+ "useResource: UseResource",
3953
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3954
+ "usePanelInfo: UsePanelInfo",
3955
+ "useSessions: UseSessions",
3956
+ "useSessionStatus: UseSessionStatus",
3957
+ "useSessionRetainInfo: UseSessionRetainInfo",
3958
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>"
3959
+ ],
3960
+ keyDomain: "open: any string the owner dispatches (no compile-time key set), already taken: @deepseek-ai/dsh-experimental-voice-input-bundle",
3961
+ hookContext: "",
3962
+ slotInject: "",
3963
+ declaredBy: "an entry in 'main' (client-ui-plugin-manager), so it exists while that entry is mounted",
3964
+ occupants: ["experimental-client-ui-voice-input VoiceSetupPrompt key '@deepseek-ai/dsh-experimental-voice-input-bundle'"],
3965
+ replaceRisk: "shadows-shipped-ui",
3966
+ 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}",
3967
+ source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:78"
3770
3968
  },
3771
3969
  {
3772
3970
  key: "plugins.bundle.config",
@@ -3780,8 +3978,8 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3780
3978
  type: "string",
3781
3979
  doc: "Your cell key: the entry renders where the owner dispatches this exact key. Registering an already-occupied key replaces that occupant."
3782
3980
  }],
3783
- ownerProps: ["/** The view the page asks a configuration entry for. */\nexport interface PluginConfigViewProps {\n /** `summary` renders the one-liner alone, as text or inline nodes; `page` renders the form with its save control. */\n readonly view: 'summary' | 'page'\n}"],
3784
- ownerPropsReferences: [],
3981
+ ownerProps: ["/** The view the page asks a configuration entry for. */\nexport interface PluginConfigViewProps {\n /** `summary` renders the one-liner alone, as text or inline nodes; `page` renders the form with its save control. */\n readonly view: 'summary' | 'page'\n /** Host-owned configuration values and write actions for this page's entry. */\n readonly form?: ConfigPageForm | undefined\n}"],
3982
+ ownerPropsReferences: ["ConfigPageForm"],
3785
3983
  standardProps: [
3786
3984
  "useResource: UseResource",
3787
3985
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
@@ -3791,21 +3989,21 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3791
3989
  "useSessionRetainInfo: UseSessionRetainInfo",
3792
3990
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>"
3793
3991
  ],
3794
- keyDomain: "open: any string the owner dispatches (no compile-time key set), none are taken yet",
3992
+ keyDomain: "open: any string the owner dispatches (no compile-time key set), already taken: @deepseek-ai/dsh-experimental-voice-input-bundle",
3795
3993
  hookContext: "",
3796
3994
  slotInject: "",
3797
3995
  declaredBy: "an entry in 'main' (client-ui-plugin-manager), so it exists while that entry is mounted",
3798
- occupants: [],
3799
- replaceRisk: "none",
3996
+ occupants: ["experimental-client-ui-voice-input VoicePreparation key '@deepseek-ai/dsh-experimental-voice-input-bundle'"],
3997
+ replaceRisk: "shadows-shipped-ui",
3800
3998
  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}",
3801
- source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:38"
3999
+ source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:94"
3802
4000
  },
3803
4001
  {
3804
- key: "plugins.item",
4002
+ key: "plugins.detail.actions",
3805
4003
  kind: "list",
3806
4004
  scope: "root",
3807
- summary: "One official plugin the Plugins page lists in its Official group after the official bundles: `label` is the card's title and `order` its place.",
3808
- doc: "One official plugin the Plugins page lists in its Official group after\nthe official bundles: `label` is the card's title and `order` its place.\nThe page renders the entry as the card's one-liner (`view: 'summary'`)\nand, once the card is opened, as the body of the plugin's own page\n(`view: 'page'`). OCCUPIED by the host-plane configuration pages\n`ui-settings-plugins` ships; a bundle's configuration belongs in\n`plugins.bundle.config` or `plugins.row.config` instead.",
4005
+ summary: "Controls at the head of a detail page, before the page's own switch and uninstall, rendered with the page's subject.",
4006
+ doc: "Controls at the head of a detail page, before the page's own switch and\nuninstall, rendered with the page's subject. An entry renders null for a\nsubject it has no control for.",
3809
4007
  registerOptions: [
3810
4008
  {
3811
4009
  name: "id",
@@ -3826,8 +4024,8 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3826
4024
  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."
3827
4025
  }
3828
4026
  ],
3829
- ownerProps: ["/** The view the page asks a configuration entry for. */\nexport interface PluginConfigViewProps {\n /** `summary` renders the one-liner alone, as text or inline nodes; `page` renders the form with its save control. */\n readonly view: 'summary' | 'page'\n}"],
3830
- ownerPropsReferences: [],
4027
+ ownerProps: ["/** The owner props every detail contribution is rendered with. */\nexport interface PluginDetailProps {\n /** The subject of the open page; an entry renders null for a subject it has nothing for. */\n readonly subject: PluginsSubject\n}"],
4028
+ ownerPropsReferences: ["PluginsSubject"],
3831
4029
  standardProps: [
3832
4030
  "useResource: UseResource",
3833
4031
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
@@ -3841,33 +4039,171 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3841
4039
  hookContext: "",
3842
4040
  slotInject: "",
3843
4041
  declaredBy: "an entry in 'main' (client-ui-plugin-manager), so it exists while that entry is mounted",
3844
- occupants: [
3845
- "client-ui-settings-plugins BashCard id 'bash'",
3846
- "client-ui-settings-plugins AgentLoopCard id 'agent-loop'",
3847
- "client-ui-settings-plugins SubagentCard id 'subagent'",
3848
- "client-ui-settings-plugins WebSearchCard id 'web-search'"
3849
- ],
4042
+ occupants: [],
3850
4043
  replaceRisk: "none",
3851
- 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}",
3852
- source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:32"
4044
+ 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}",
4045
+ source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:108"
3853
4046
  },
3854
4047
  {
3855
- key: "plugins.row.config",
3856
- kind: "keyed",
4048
+ key: "plugins.detail.badge",
4049
+ kind: "list",
3857
4050
  scope: "root",
3858
- summary: "The configuration of one row a bundle declares, keyed by `<package name>#<row id>` with the row id as the bundle's patch declares it: the row on the bundle's page gains a configure control that opens the entry's page, headed by the row id and the entry's summary.",
3859
- doc: "The configuration of one row a bundle declares, keyed by\n`<package name>#<row id>` with the row id as the bundle's patch declares\nit: the row on the bundle's page gains a configure control that opens\nthe entry's page, headed by the row id and the entry's summary.",
3860
- registerOptions: [{
3861
- name: "key",
3862
- requirement: "required",
3863
- type: "string",
3864
- doc: "Your cell key: the entry renders where the owner dispatches this exact key. Registering an already-occupied key replaces that occupant."
3865
- }],
3866
- ownerProps: ["/** The view the page asks a configuration entry for. */\nexport interface PluginConfigViewProps {\n /** `summary` renders the one-liner alone, as text or inline nodes; `page` renders the form with its save control. */\n readonly view: 'summary' | 'page'\n}"],
3867
- ownerPropsReferences: [],
3868
- standardProps: [
3869
- "useResource: UseResource",
3870
- "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
4051
+ summary: "Tags beside a detail page's title, after the version, beta, and problem tags the page draws itself, rendered with the page's subject.",
4052
+ doc: "Tags beside a detail page's title, after the version, beta, and problem\ntags the page draws itself, rendered with the page's subject.",
4053
+ registerOptions: [
4054
+ {
4055
+ name: "id",
4056
+ requirement: "required",
4057
+ type: "string",
4058
+ 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."
4059
+ },
4060
+ {
4061
+ name: "order",
4062
+ requirement: "optional",
4063
+ type: "number",
4064
+ doc: "Position among the entries, ascending (default 0)."
4065
+ },
4066
+ {
4067
+ name: "label",
4068
+ requirement: "optional",
4069
+ type: "string | (() => string)",
4070
+ 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."
4071
+ }
4072
+ ],
4073
+ ownerProps: ["/** The owner props every detail contribution is rendered with. */\nexport interface PluginDetailProps {\n /** The subject of the open page; an entry renders null for a subject it has nothing for. */\n readonly subject: PluginsSubject\n}"],
4074
+ ownerPropsReferences: ["PluginsSubject"],
4075
+ standardProps: [
4076
+ "useResource: UseResource",
4077
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
4078
+ "usePanelInfo: UsePanelInfo",
4079
+ "useSessions: UseSessions",
4080
+ "useSessionStatus: UseSessionStatus",
4081
+ "useSessionRetainInfo: UseSessionRetainInfo",
4082
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>"
4083
+ ],
4084
+ keyDomain: "",
4085
+ hookContext: "",
4086
+ slotInject: "",
4087
+ declaredBy: "an entry in 'main' (client-ui-plugin-manager), so it exists while that entry is mounted",
4088
+ occupants: [],
4089
+ replaceRisk: "none",
4090
+ 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}",
4091
+ source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:113"
4092
+ },
4093
+ {
4094
+ key: "plugins.detail.section",
4095
+ kind: "list",
4096
+ scope: "root",
4097
+ summary: "Sections under a detail page's own content: after the rows on a bundle's page, after the configuration on a row's or an official plugin's page.",
4098
+ doc: "Sections under a detail page's own content: after the rows on a bundle's\npage, after the configuration on a row's or an official plugin's page.\nAn entry draws its own section chrome and renders null for a subject it\nhas nothing for.",
4099
+ registerOptions: [
4100
+ {
4101
+ name: "id",
4102
+ requirement: "required",
4103
+ type: "string",
4104
+ 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."
4105
+ },
4106
+ {
4107
+ name: "order",
4108
+ requirement: "optional",
4109
+ type: "number",
4110
+ doc: "Position among the entries, ascending (default 0)."
4111
+ },
4112
+ {
4113
+ name: "label",
4114
+ requirement: "optional",
4115
+ type: "string | (() => string)",
4116
+ 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."
4117
+ }
4118
+ ],
4119
+ ownerProps: ["/** The owner props every detail contribution is rendered with. */\nexport interface PluginDetailProps {\n /** The subject of the open page; an entry renders null for a subject it has nothing for. */\n readonly subject: PluginsSubject\n}"],
4120
+ ownerPropsReferences: ["PluginsSubject"],
4121
+ standardProps: [
4122
+ "useResource: UseResource",
4123
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
4124
+ "usePanelInfo: UsePanelInfo",
4125
+ "useSessions: UseSessions",
4126
+ "useSessionStatus: UseSessionStatus",
4127
+ "useSessionRetainInfo: UseSessionRetainInfo",
4128
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>"
4129
+ ],
4130
+ keyDomain: "",
4131
+ hookContext: "",
4132
+ slotInject: "",
4133
+ declaredBy: "an entry in 'main' (client-ui-plugin-manager), so it exists while that entry is mounted",
4134
+ occupants: [],
4135
+ replaceRisk: "none",
4136
+ 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}",
4137
+ source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:120"
4138
+ },
4139
+ {
4140
+ key: "plugins.item",
4141
+ kind: "list",
4142
+ scope: "root",
4143
+ summary: "One official plugin the Plugins page lists in its Official group after the official bundles: `label` is the card's title and `order` its place.",
4144
+ doc: "One official plugin the Plugins page lists in its Official group after\nthe official bundles: `label` is the card's title and `order` its place.\nThe page renders the entry as the card's one-liner (`view: 'summary'`)\nand, once the card is opened, as the body of the plugin's own page\n(`view: 'page'`). OCCUPIED by the official settings pages, one companion\npackage per host-plane namespace; a bundle's configuration belongs in\n`plugins.bundle.config` or `plugins.row.config` instead.",
4145
+ registerOptions: [
4146
+ {
4147
+ name: "id",
4148
+ requirement: "required",
4149
+ type: "string",
4150
+ 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."
4151
+ },
4152
+ {
4153
+ name: "order",
4154
+ requirement: "optional",
4155
+ type: "number",
4156
+ doc: "Position among the entries, ascending (default 0)."
4157
+ },
4158
+ {
4159
+ name: "label",
4160
+ requirement: "optional",
4161
+ type: "string | (() => string)",
4162
+ 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."
4163
+ }
4164
+ ],
4165
+ ownerProps: ["/** The view the page asks a configuration entry for. */\nexport interface PluginConfigViewProps {\n /** `summary` renders the one-liner alone, as text or inline nodes; `page` renders the form with its save control. */\n readonly view: 'summary' | 'page'\n /** Host-owned configuration values and write actions for this page's entry. */\n readonly form?: ConfigPageForm | undefined\n}"],
4166
+ ownerPropsReferences: ["ConfigPageForm"],
4167
+ standardProps: [
4168
+ "useResource: UseResource",
4169
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
4170
+ "usePanelInfo: UsePanelInfo",
4171
+ "useSessions: UseSessions",
4172
+ "useSessionStatus: UseSessionStatus",
4173
+ "useSessionRetainInfo: UseSessionRetainInfo",
4174
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>"
4175
+ ],
4176
+ keyDomain: "",
4177
+ hookContext: "",
4178
+ slotInject: "",
4179
+ declaredBy: "an entry in 'main' (client-ui-plugin-manager), so it exists while that entry is mounted",
4180
+ occupants: [
4181
+ "client-ui-settings-agent-loop AgentLoopCard id 'agent-loop'",
4182
+ "client-ui-settings-shell ShellCard id 'shell'",
4183
+ "client-ui-settings-subagent SubagentCard id 'subagent'",
4184
+ "client-ui-settings-web-search WebSearchCard id 'web-search'"
4185
+ ],
4186
+ replaceRisk: "none",
4187
+ 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}",
4188
+ source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:88"
4189
+ },
4190
+ {
4191
+ key: "plugins.row.config",
4192
+ kind: "keyed",
4193
+ scope: "root",
4194
+ summary: "The configuration of one row a bundle declares, keyed by `<package name>#<row id>` with the row id as the bundle's patch declares it: the row on the bundle's page gains a configure control that opens the entry's page, headed by the plugin's display title and description.",
4195
+ doc: "The configuration of one row a bundle declares, keyed by\n`<package name>#<row id>` with the row id as the bundle's patch declares\nit: the row on the bundle's page gains a configure control that opens\nthe entry's page, headed by the plugin's display title and description.\nAn absent description falls back to the entry's `view: 'summary'`.",
4196
+ registerOptions: [{
4197
+ name: "key",
4198
+ requirement: "required",
4199
+ type: "string",
4200
+ doc: "Your cell key: the entry renders where the owner dispatches this exact key. Registering an already-occupied key replaces that occupant."
4201
+ }],
4202
+ ownerProps: ["/** The view the page asks a configuration entry for. */\nexport interface PluginConfigViewProps {\n /** `summary` renders the one-liner alone, as text or inline nodes; `page` renders the form with its save control. */\n readonly view: 'summary' | 'page'\n /** Host-owned configuration values and write actions for this page's entry. */\n readonly form?: ConfigPageForm | undefined\n}"],
4203
+ ownerPropsReferences: ["ConfigPageForm"],
4204
+ standardProps: [
4205
+ "useResource: UseResource",
4206
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3871
4207
  "usePanelInfo: UsePanelInfo",
3872
4208
  "useSessions: UseSessions",
3873
4209
  "useSessionStatus: UseSessionStatus",
@@ -3881,7 +4217,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3881
4217
  occupants: [],
3882
4218
  replaceRisk: "none",
3883
4219
  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}",
3884
- source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:45"
4220
+ source: "packages/client/ui-plugin-manager/src/client/slot-contract.ts:102"
3885
4221
  },
3886
4222
  {
3887
4223
  key: "rightbar",
@@ -3917,8 +4253,8 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3917
4253
  summary: "Session content selected by the root-scoped right Sidebar controller.",
3918
4254
  doc: "Session content selected by the root-scoped right Sidebar controller.",
3919
4255
  registerOptions: [],
3920
- ownerProps: ["/** Right column owner share: resolved normal geometry and opening eligibility. */\nexport interface RightbarOwnerProps {\n /** Resolved normal panel width in px, not the saved preference; zero if it cannot fit. */\n width: number\n /** Current frame width in px. */\n viewportWidth: number\n /**\n * Whether a normal right panel can retain 300px beside a 400px center.\n * Before a narrow opening, includes the space from collapsing the left sidebar.\n */\n canShow: boolean\n}"],
3921
- ownerPropsReferences: [],
4256
+ ownerProps: ["/** Right column owner share: resolved normal geometry and opening eligibility. */\nexport interface RightbarOwnerProps {\n /** Resolved normal panel width in px, not the saved preference; zero if it cannot fit. */\n width: number\n /** Current frame width in px. */\n viewportWidth: number\n /**\n * Whether a normal right panel can retain 300px beside a 400px center.\n * Before a narrow opening, includes the space from collapsing the left sidebar.\n */\n canShow: boolean\n}", "/** Identity of one open tab; distinct copies of one content share `contentId`, never `TabId`. */\nexport type TabId = Branded<'TabId'>"],
4257
+ ownerPropsReferences: ["Branded"],
3922
4258
  standardProps: [
3923
4259
  "useResource: UseResource",
3924
4260
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
@@ -4016,7 +4352,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4016
4352
  occupants: ["client-ui-settings-general SettingsDocumentAction id 'open-document'"],
4017
4353
  replaceRisk: "none",
4018
4354
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('settings.action', () => ctx.slots.register(\n { name: 'settings.action', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4019
- source: "packages/client/ui-settings/src/client/contract/slots.ts:36"
4355
+ source: "packages/client/ui-settings/src/client/contract/slots.ts:39"
4020
4356
  },
4021
4357
  {
4022
4358
  key: "settings.close",
@@ -4043,14 +4379,14 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4043
4379
  occupants: ["client-ui-settings-general CloseLabel"],
4044
4380
  replaceRisk: "shadows-shipped-ui",
4045
4381
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('settings.close', () => ctx.slots.register(\n { name: 'settings.close' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4046
- source: "packages/client/ui-settings/src/client/contract/slots.ts:42"
4382
+ source: "packages/client/ui-settings/src/client/contract/slots.ts:45"
4047
4383
  },
4048
4384
  {
4049
4385
  key: "settings.general.item",
4050
4386
  kind: "list",
4051
4387
  scope: "root",
4052
4388
  summary: "One preference row inside the General section — the additive seat for a single setting that needs no page of its own (a whole page is `settings.section`), contributed by the feature plugin that owns the preference (locale → Language, ui-theme → Appearance, ui-conversation → Composer Enter).",
4053
- doc: "One preference row inside the General section — the additive seat for a\nsingle setting that needs no page of its own (a whole page is\n`settings.section`), contributed by the feature plugin that owns the\npreference (locale → Language, ui-theme → Appearance, ui-conversation →\nComposer Enter). Options: `id` (row key), `order` (row position). The\nsection column only stacks rows, so a row draws its own internals,\nincluding its label: nothing projects a `label` here and the owner passes\nno props at all — copy, current value, and the write path are all yours,\nthrough your own inject face and `host.call`. Declared at runtime by\nui-settings-general's General entry; the type lives here with every other\nsettings slot type, because this package is the settings domain's base\nlayer and every registrant already depends on it for `ctx.settingsScope`.",
4389
+ doc: "One preference row inside the General section — the additive seat for a\nsingle setting that needs no page of its own (a whole page is\n`settings.section`), contributed by the feature plugin that owns the\npreference (locale → Language, ui-theme → Appearance, ui-conversation →\nComposer Enter). Options: `id` (row key), `order` (row position). The\nsection column only stacks rows, so a row draws its own internals,\nincluding its label: nothing projects a `label` here and the owner passes\nno props at all — copy, current value, and the write path are all yours,\nthrough your own inject face and `host.call`. Declared at runtime by\nui-settings-general's General entry; the type lives here with every other\nsettings slot type, because this package is the settings domain's base\nlayer and every registrant already depends on it for `ctx.configForms`.",
4054
4390
  registerOptions: [
4055
4391
  {
4056
4392
  name: "id",
@@ -4088,15 +4424,19 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4088
4424
  declaredBy: "an entry in 'settings.section' (client-ui-settings-general), so it exists while that entry is mounted",
4089
4425
  occupants: [
4090
4426
  "client-locale LanguageRow id 'language'",
4427
+ "client-ui-chat LinkOpeningRow id 'link-opening'",
4428
+ "client-ui-chat PerformanceUsageRow id 'performance-usage'",
4091
4429
  "client-ui-chat TranscriptViewRow id 'transcript-view'",
4092
4430
  "client-ui-conversation EnterBehaviorRow id 'composer-enter'",
4093
4431
  "client-ui-permission-presets PermissionRow id 'permission'",
4432
+ "client-ui-settings-general DeveloperToolsRow id 'developer-tools'",
4433
+ "client-ui-settings-general CurrentVersionRow id 'current-version'",
4094
4434
  "client-ui-theme AppearanceRow id 'appearance'",
4095
4435
  "client-ui-theme FontSizeRow id 'font-size'"
4096
4436
  ],
4097
4437
  replaceRisk: "none",
4098
4438
  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}",
4099
- source: "packages/client/ui-settings/src/client/contract/slots.ts:89"
4439
+ source: "packages/client/ui-settings/src/client/contract/slots.ts:92"
4100
4440
  },
4101
4441
  {
4102
4442
  key: "settings.header",
@@ -4123,7 +4463,34 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4123
4463
  occupants: ["client-ui-settings-general HeaderContent"],
4124
4464
  replaceRisk: "shadows-shipped-ui",
4125
4465
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('settings.header', () => ctx.slots.register(\n { name: 'settings.header' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4126
- source: "packages/client/ui-settings/src/client/contract/slots.ts:30"
4466
+ source: "packages/client/ui-settings/src/client/contract/slots.ts:33"
4467
+ },
4468
+ {
4469
+ key: "settings.launcher",
4470
+ kind: "single",
4471
+ scope: "root",
4472
+ summary: "Optional sidebar account launcher; opens the shell-owned settings panel.",
4473
+ doc: "Optional sidebar account launcher; opens the shell-owned settings panel.",
4474
+ registerOptions: [],
4475
+ ownerProps: ["/** Sidebar launcher geometry and settings navigation. */\nexport interface SettingsLauncherOwnerProps {\n /** Whether the sidebar shows labels. */\n wide: boolean\n /** Open the settings panel. */\n openSettings: () => void\n /** @param id - registered onboarding editor to open explicitly. */\n openOnboarding: (id: string) => void\n}"],
4476
+ ownerPropsReferences: [],
4477
+ standardProps: [
4478
+ "useResource: UseResource",
4479
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
4480
+ "usePanelInfo: UsePanelInfo",
4481
+ "useSessions: UseSessions",
4482
+ "useSessionStatus: UseSessionStatus",
4483
+ "useSessionRetainInfo: UseSessionRetainInfo",
4484
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>"
4485
+ ],
4486
+ keyDomain: "",
4487
+ hookContext: "",
4488
+ slotInject: "",
4489
+ declaredBy: "an entry in 'sidebar.settings' (client-ui-settings-general), so it exists while that entry is mounted",
4490
+ occupants: ["client-ui-settings-account AccountMenu"],
4491
+ replaceRisk: "shadows-shipped-ui",
4492
+ example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('settings.launcher', () => ctx.slots.register(\n { name: 'settings.launcher' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4493
+ source: "packages/client/ui-settings/src/client/contract/slots.ts:17"
4127
4494
  },
4128
4495
  {
4129
4496
  key: "settings.models.footer",
@@ -4169,7 +4536,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4169
4536
  occupants: [],
4170
4537
  replaceRisk: "none",
4171
4538
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('settings.models.footer', () => ctx.slots.register(\n { name: 'settings.models.footer', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4172
- source: "packages/client/ui-settings-models/src/client/slot-contract.ts:38"
4539
+ source: "packages/client/ui-settings-models/src/client/slot-contract.ts:40"
4173
4540
  },
4174
4541
  {
4175
4542
  key: "settings.models.provider-card",
@@ -4203,6 +4570,33 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4203
4570
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('settings.models.provider-card', () => ctx.slots.register(\n { name: 'settings.models.provider-card', key: '<one key the owner dispatches>' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4204
4571
  source: "packages/client/ui-settings-models/src/client/slot-contract.ts:33"
4205
4572
  },
4573
+ {
4574
+ key: "settings.models.sign-in",
4575
+ kind: "single",
4576
+ scope: "root",
4577
+ summary: "Optional account login choice before the credential editor.",
4578
+ doc: "Optional account login choice before the credential editor.",
4579
+ registerOptions: [],
4580
+ ownerProps: [],
4581
+ ownerPropsReferences: [],
4582
+ standardProps: [
4583
+ "useResource: UseResource",
4584
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
4585
+ "usePanelInfo: UsePanelInfo",
4586
+ "useSessions: UseSessions",
4587
+ "useSessionStatus: UseSessionStatus",
4588
+ "useSessionRetainInfo: UseSessionRetainInfo",
4589
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>"
4590
+ ],
4591
+ keyDomain: "",
4592
+ hookContext: "",
4593
+ slotInject: "",
4594
+ declaredBy: "an entry in 'settings.onboarding' (client-ui-settings-models), so it exists while that entry is mounted",
4595
+ occupants: ["client-ui-settings-account AccountOnboarding"],
4596
+ replaceRisk: "shadows-shipped-ui",
4597
+ example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('settings.models.sign-in', () => ctx.slots.register(\n { name: 'settings.models.sign-in' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4598
+ source: "packages/client/ui-settings-models/src/client/slot-contract.ts:35"
4599
+ },
4206
4600
  {
4207
4601
  key: "settings.onboarding",
4208
4602
  kind: "list",
@@ -4229,7 +4623,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4229
4623
  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."
4230
4624
  }
4231
4625
  ],
4232
- ownerProps: ["/** Owner share of the currently active settings-backed onboarding step. */\nexport interface SettingsOnboardingOwnerProps {\n /** Stable id of the step currently selected by the coordinator. */\n stepId: string\n /** Complete or skip this step and transfer ownership to the next entry. */\n complete: () => void\n /** Open the settings panel directly on one registered section. */\n openSection: (id: string) => void\n}"],
4626
+ ownerProps: ["/** Owner share of the currently active settings-backed onboarding step. */\nexport interface SettingsOnboardingOwnerProps {\n /** Stable id of the step currently selected by the coordinator. */\n stepId: string\n /** User explicitly reopened this step outside first-run onboarding. */\n explicit?: boolean\n /** Complete or skip this step and transfer ownership to the next entry. */\n complete: () => void\n /** Open the settings panel directly on one registered section. */\n openSection: (id: string) => void\n}"],
4233
4627
  ownerPropsReferences: [],
4234
4628
  standardProps: [
4235
4629
  "useResource: UseResource",
@@ -4247,7 +4641,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4247
4641
  occupants: ["client-ui-settings-models WelcomeNotice id 'welcome-notice'", "client-ui-settings-models DeepSeekOnboardingDialog id 'deepseek-official'"],
4248
4642
  replaceRisk: "none",
4249
4643
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('settings.onboarding', () => ctx.slots.register(\n { name: 'settings.onboarding', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4250
- source: "packages/client/ui-settings/src/client/contract/slots.ts:74"
4644
+ source: "packages/client/ui-settings/src/client/contract/slots.ts:77"
4251
4645
  },
4252
4646
  {
4253
4647
  key: "settings.plugins.tab",
@@ -4293,7 +4687,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4293
4687
  occupants: ["client-ui-settings-plugin-inventory PluginInventorySettingsTab id 'all'"],
4294
4688
  replaceRisk: "none",
4295
4689
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('settings.plugins.tab', () => ctx.slots.register(\n { name: 'settings.plugins.tab', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4296
- source: "packages/client/ui-settings/src/client/contract/slots.ts:63"
4690
+ source: "packages/client/ui-settings/src/client/contract/slots.ts:66"
4297
4691
  },
4298
4692
  {
4299
4693
  key: "settings.section",
@@ -4338,14 +4732,14 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4338
4732
  declaredBy: "an entry in 'sidebar.settings' (client-ui-settings-general), so it exists while that entry is mounted",
4339
4733
  occupants: [
4340
4734
  "client-ui-agent-preset AgentPresetSection id 'agent-presets'",
4735
+ "client-ui-settings-account AccountSection id 'account'",
4341
4736
  "client-ui-settings-general GeneralSection id 'general'",
4342
4737
  "client-ui-settings-models ModelsSection id 'models'",
4343
- "client-ui-settings-plugins PluginsSettingsSection id 'plugins'",
4344
- "client-ui-settings-unarchive-sessions ArchivedSessionsSection id 'archived-sessions'"
4738
+ "client-ui-settings-plugins PluginsSettingsSection id 'plugins'"
4345
4739
  ],
4346
4740
  replaceRisk: "none",
4347
4741
  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}",
4348
- source: "packages/client/ui-settings/src/client/contract/slots.ts:54"
4742
+ source: "packages/client/ui-settings/src/client/contract/slots.ts:57"
4349
4743
  },
4350
4744
  {
4351
4745
  key: "settings.trigger",
@@ -4372,7 +4766,34 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4372
4766
  occupants: ["client-ui-settings-general TriggerContent"],
4373
4767
  replaceRisk: "shadows-shipped-ui",
4374
4768
  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}",
4375
- source: "packages/client/ui-settings/src/client/contract/slots.ts:24"
4769
+ source: "packages/client/ui-settings/src/client/contract/slots.ts:27"
4770
+ },
4771
+ {
4772
+ key: "shell.leading",
4773
+ kind: "single",
4774
+ scope: "root",
4775
+ summary: "Window-chrome seat at the frame's top-left, over every main panel.",
4776
+ doc: "Window-chrome seat at the frame's top-left, over every main panel.\nMounted only while the sidebar column is fully hidden (macOS desktop\ncollapse; other platforms keep the rail), so the occupant can assume the\nframe edge is the window edge and the macOS traffic lights sit before it.\nOCCUPIED by ui-sidebar's reopen/New Session controls.\n\nWhile the seat is mounted the frame publishes\n`--dsh-frame-leading-clearance` (the inline inset the seat's band\noccupies, measured from the frame's left edge); a main panel whose\ncontent reaches the top-left corner pads by it so nothing lands under\nthe lights or the controls.",
4777
+ registerOptions: [],
4778
+ ownerProps: [],
4779
+ ownerPropsReferences: [],
4780
+ standardProps: [
4781
+ "useResource: UseResource",
4782
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
4783
+ "usePanelInfo: UsePanelInfo",
4784
+ "useSessions: UseSessions",
4785
+ "useSessionStatus: UseSessionStatus",
4786
+ "useSessionRetainInfo: UseSessionRetainInfo",
4787
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>"
4788
+ ],
4789
+ keyDomain: "",
4790
+ hookContext: "",
4791
+ slotInject: "",
4792
+ declaredBy: "an entry in 'root' (client-ui-layout), so it exists while that entry is mounted",
4793
+ occupants: ["client-ui-sidebar HeaderLeadingControls"],
4794
+ replaceRisk: "shadows-shipped-ui",
4795
+ 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}",
4796
+ source: "packages/client/ui-layout/src/client/index.ts:105"
4376
4797
  },
4377
4798
  {
4378
4799
  key: "shell.overlay",
@@ -4415,7 +4836,11 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4415
4836
  hookContext: "",
4416
4837
  slotInject: "",
4417
4838
  declaredBy: "an entry in 'root' (client-ui-layout), so it exists while that entry is mounted",
4418
- occupants: ["client-ui-sidebar-terminal TerminalCleanup"],
4839
+ occupants: [
4840
+ "client-ui-workspace SessionRenameDialog id 'workspace.session-rename'",
4841
+ "client-ui-workspace SessionArchiveConfirmDialog id 'workspace.session-archive'",
4842
+ "client-ui-workspace RowActionToast id 'workspace.row-toast'"
4843
+ ],
4419
4844
  replaceRisk: "none",
4420
4845
  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}",
4421
4846
  source: "packages/client/ui-layout/src/client/index.ts:91"
@@ -4675,7 +5100,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4675
5100
  ],
4676
5101
  replaceRisk: "none",
4677
5102
  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}",
4678
- source: "packages/client/ui-sidebar-right/src/client/contract/slots.ts:50"
5103
+ source: "packages/client/ui-sidebar-right/src/client/contract/slots.ts:58"
4679
5104
  },
4680
5105
  {
4681
5106
  key: "sidebar.right.pane.tab.title",
@@ -4722,7 +5147,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4722
5147
  ],
4723
5148
  replaceRisk: "none",
4724
5149
  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}",
4725
- source: "packages/client/ui-sidebar-right/src/client/contract/slots.ts:64"
5150
+ source: "packages/client/ui-sidebar-right/src/client/contract/slots.ts:72"
4726
5151
  },
4727
5152
  {
4728
5153
  key: "sidebar.right.tab.document",
@@ -4736,7 +5161,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4736
5161
  type: "string",
4737
5162
  doc: "Your cell key: the entry renders where the owner dispatches this exact key. Registering an already-occupied key replaces that occupant."
4738
5163
  }],
4739
- ownerProps: ["/** Content and viewing inputs shared by document bodies and nested PDF presentation. */\nexport interface DocumentBodyOwner {\n /** Original file address, also readable through the standard useResource hook. */\n readonly resourceAddress: string\n /** Ordinary file content or a renderer-owned loading request; text accumulates until eof. */\n readonly content: DocumentContent\n /** The document toolbar's current wrapping preference. */\n readonly wrap: boolean\n /** Report a renderer-owned scrollport; passing `null` restores the shared body as the owner. */\n readonly scrollportRef: RefCallback<HTMLElement>\n}"],
5164
+ ownerProps: ["/** Content and viewing inputs shared by document bodies and nested PDF presentation. */\nexport interface DocumentBodyOwner {\n /** Observe a file read by this renderer. @param address - complete file resource address. */\n readonly addResource: (address: string) => void\n /** Replace this renderer's dependencies. @param addresses - complete file resource addresses. */\n readonly setResources: (addresses: readonly string[]) => void\n /** Original file address, also readable through the standard useResource hook. */\n readonly resourceAddress: string\n /** Ordinary file content or a renderer-owned loading request; text accumulates until eof. */\n readonly content: DocumentContent\n /** The document toolbar's current wrapping preference. */\n readonly wrap: boolean\n /** Report a renderer-owned scrollport; passing `null` restores the shared body as the owner. */\n readonly scrollportRef: RefCallback<HTMLElement>\n}"],
4740
5165
  ownerPropsReferences: ["DocumentContent"],
4741
5166
  standardProps: [
4742
5167
  "useResource: UseResource",
@@ -4761,6 +5186,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4761
5186
  declaredBy: "an entry in 'sidebar.right.pane.tab' (client-ui-sidebar-documentpreview), so it exists while that entry is mounted",
4762
5187
  occupants: [
4763
5188
  "client-ui-sidebar-documentpreview CodeBody",
5189
+ "client-ui-sidebar-documentpreview LazyExcelBody",
4764
5190
  "client-ui-sidebar-documentpreview HtmlBody",
4765
5191
  "client-ui-sidebar-documentpreview ImageBody",
4766
5192
  "client-ui-sidebar-documentpreview MarkdownBody",
@@ -4770,7 +5196,101 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4770
5196
  ],
4771
5197
  replaceRisk: "none",
4772
5198
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('sidebar.right.tab.document', () => ctx.slots.register(\n { name: 'sidebar.right.tab.document', key: '<one key the owner dispatches>' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4773
- source: "packages/client/ui-sidebar-documentpreview/src/client/document/contract.ts:45"
5199
+ source: "packages/client/ui-sidebar-documentpreview/src/client/document/contract.ts:51"
5200
+ },
5201
+ {
5202
+ key: "sidebar.right.tab.document.action",
5203
+ kind: "keyed",
5204
+ scope: "session",
5205
+ summary: "Renderer-specific controls before the document toolbar's reload button.",
5206
+ doc: "Renderer-specific controls before the document toolbar's reload button.",
5207
+ registerOptions: [{
5208
+ name: "key",
5209
+ requirement: "required",
5210
+ type: "string",
5211
+ doc: "Your cell key: the entry renders where the owner dispatches this exact key. Registering an already-occupied key replaces that occupant."
5212
+ }],
5213
+ ownerProps: ["/**\n * Ordinary file contents, or a request for the selected renderer to load its content.\n * Byte arrays are transient UI input, never persisted layout or Session data.\n */\nexport type DocumentContent =\n | { readonly kind: 'text'; readonly text: string; readonly pages: readonly DocumentTextPage[]; readonly eof: boolean }\n | { readonly kind: 'bytes'; readonly data: Uint8Array<ArrayBuffer> }\n | {\n readonly kind: 'renderer'\n /** Changes on reload or implementation replacement; retained contents belong to one revision. */\n readonly revision: number\n /** Report the displayed source version; stale revisions cannot update the owner. @param version - loaded source version. */\n readonly loaded: (version: string) => void\n /** End a failed load; a later file change can start another revision. */\n readonly failed: () => void\n /** Cancel the current load and start a new revision. */\n readonly reload: () => void\n }"],
5214
+ ownerPropsReferences: ["DocumentTextPage"],
5215
+ standardProps: [
5216
+ "useResource: UseResource",
5217
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
5218
+ "usePanelInfo: UsePanelInfo",
5219
+ "useSessions: UseSessions",
5220
+ "useSessionStatus: UseSessionStatus",
5221
+ "useSessionRetainInfo: UseSessionRetainInfo",
5222
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
5223
+ "useChat: UseChat",
5224
+ "useConversation: UseConversation",
5225
+ "useInput: SnapshotSelectorHook<InputState>",
5226
+ "inputActions: InputActions",
5227
+ "useSession: SessionSnapshotSelector",
5228
+ "sessionId: SessionId",
5229
+ "useProjection: UseProjection",
5230
+ "useTrajectory: UseTrajectory"
5231
+ ],
5232
+ keyDomain: "open: any string the owner dispatches (no compile-time key set), none are taken yet",
5233
+ hookContext: "UseSidebarRightTabInfo",
5234
+ slotInject: "{ hooks: { tabInfo: SlotHookFactory<'sidebar.right.tab.document', UseSidebarRightTabInfo> } }",
5235
+ declaredBy: "an entry in 'sidebar.right.pane.tab' (client-ui-sidebar-documentpreview), so it exists while that entry is mounted",
5236
+ occupants: ["client-ui-sidebar-documentpreview OfficeFontAction"],
5237
+ replaceRisk: "none",
5238
+ example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('sidebar.right.tab.document.action', () => ctx.slots.register(\n { name: 'sidebar.right.tab.document.action', key: '<one key the owner dispatches>' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
5239
+ source: "packages/client/ui-sidebar-documentpreview/src/client/document/contract.ts:87"
5240
+ },
5241
+ {
5242
+ key: "sidebar.right.tab.document.actions",
5243
+ kind: "list",
5244
+ scope: "session",
5245
+ summary: "Header toolbar contributions acting on the previewed file, rendered after the preview's own controls once the file's Host path is known.",
5246
+ doc: "Header toolbar contributions acting on the previewed file, rendered\nafter the preview's own controls once the file's Host path is known.",
5247
+ registerOptions: [
5248
+ {
5249
+ name: "id",
5250
+ requirement: "required",
5251
+ type: "string",
5252
+ 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."
5253
+ },
5254
+ {
5255
+ name: "order",
5256
+ requirement: "optional",
5257
+ type: "number",
5258
+ doc: "Position among the entries, ascending (default 0)."
5259
+ },
5260
+ {
5261
+ name: "label",
5262
+ requirement: "optional",
5263
+ type: "string | (() => string)",
5264
+ 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."
5265
+ }
5266
+ ],
5267
+ ownerProps: [],
5268
+ ownerPropsReferences: [],
5269
+ standardProps: [
5270
+ "useResource: UseResource",
5271
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
5272
+ "usePanelInfo: UsePanelInfo",
5273
+ "useSessions: UseSessions",
5274
+ "useSessionStatus: UseSessionStatus",
5275
+ "useSessionRetainInfo: UseSessionRetainInfo",
5276
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
5277
+ "useChat: UseChat",
5278
+ "useConversation: UseConversation",
5279
+ "useInput: SnapshotSelectorHook<InputState>",
5280
+ "inputActions: InputActions",
5281
+ "useSession: SessionSnapshotSelector",
5282
+ "sessionId: SessionId",
5283
+ "useProjection: UseProjection",
5284
+ "useTrajectory: UseTrajectory"
5285
+ ],
5286
+ keyDomain: "",
5287
+ hookContext: "",
5288
+ slotInject: "",
5289
+ declaredBy: "an entry in 'sidebar.right.pane.tab' (client-ui-sidebar-documentpreview), so it exists while that entry is mounted",
5290
+ occupants: ["client-ui-open-in-app OpenPathAction id 'open-in-app'"],
5291
+ replaceRisk: "none",
5292
+ example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('sidebar.right.tab.document.actions', () => ctx.slots.register(\n { name: 'sidebar.right.tab.document.actions', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
5293
+ source: "packages/client/ui-sidebar-documentpreview/src/client/document/contract.ts:66"
4774
5294
  },
4775
5295
  {
4776
5296
  key: "sidebar.right.tab.document.office.pdf",
@@ -4784,7 +5304,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4784
5304
  type: "string",
4785
5305
  doc: "Your cell key: the entry renders where the owner dispatches this exact key. Registering an already-occupied key replaces that occupant."
4786
5306
  }],
4787
- ownerProps: ["/** Content and viewing inputs shared by document bodies and nested PDF presentation. */\nexport interface DocumentBodyOwner {\n /** Original file address, also readable through the standard useResource hook. */\n readonly resourceAddress: string\n /** Ordinary file content or a renderer-owned loading request; text accumulates until eof. */\n readonly content: DocumentContent\n /** The document toolbar's current wrapping preference. */\n readonly wrap: boolean\n /** Report a renderer-owned scrollport; passing `null` restores the shared body as the owner. */\n readonly scrollportRef: RefCallback<HTMLElement>\n}"],
5307
+ ownerProps: ["/** Content and viewing inputs shared by document bodies and nested PDF presentation. */\nexport interface DocumentBodyOwner {\n /** Observe a file read by this renderer. @param address - complete file resource address. */\n readonly addResource: (address: string) => void\n /** Replace this renderer's dependencies. @param addresses - complete file resource addresses. */\n readonly setResources: (addresses: readonly string[]) => void\n /** Original file address, also readable through the standard useResource hook. */\n readonly resourceAddress: string\n /** Ordinary file content or a renderer-owned loading request; text accumulates until eof. */\n readonly content: DocumentContent\n /** The document toolbar's current wrapping preference. */\n readonly wrap: boolean\n /** Report a renderer-owned scrollport; passing `null` restores the shared body as the owner. */\n readonly scrollportRef: RefCallback<HTMLElement>\n}"],
4788
5308
  ownerPropsReferences: ["DocumentContent"],
4789
5309
  standardProps: [
4790
5310
  "useResource: UseResource",
@@ -4810,7 +5330,61 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4810
5330
  occupants: ["client-ui-sidebar-documentpreview LazyPdfBody"],
4811
5331
  replaceRisk: "none",
4812
5332
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('sidebar.right.tab.document.office.pdf', () => ctx.slots.register(\n { name: 'sidebar.right.tab.document.office.pdf', key: '<one key the owner dispatches>' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
4813
- source: "packages/client/ui-sidebar-documentpreview/src/client/office/OfficeBody.tsx:21"
5333
+ source: "packages/client/ui-sidebar-documentpreview/src/client/office/OfficeBody.tsx:19"
5334
+ },
5335
+ {
5336
+ key: "sidebar.right.tab.document.unpreviewable",
5337
+ kind: "list",
5338
+ scope: "session",
5339
+ summary: "Empty-state contributions for a file this preview cannot render, offered where Retry would stand once the file's Host path is known.",
5340
+ doc: "Empty-state contributions for a file this preview cannot render,\noffered where Retry would stand once the file's Host path is known.",
5341
+ registerOptions: [
5342
+ {
5343
+ name: "id",
5344
+ requirement: "required",
5345
+ type: "string",
5346
+ 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."
5347
+ },
5348
+ {
5349
+ name: "order",
5350
+ requirement: "optional",
5351
+ type: "number",
5352
+ doc: "Position among the entries, ascending (default 0)."
5353
+ },
5354
+ {
5355
+ name: "label",
5356
+ requirement: "optional",
5357
+ type: "string | (() => string)",
5358
+ 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."
5359
+ }
5360
+ ],
5361
+ ownerProps: [],
5362
+ ownerPropsReferences: [],
5363
+ standardProps: [
5364
+ "useResource: UseResource",
5365
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
5366
+ "usePanelInfo: UsePanelInfo",
5367
+ "useSessions: UseSessions",
5368
+ "useSessionStatus: UseSessionStatus",
5369
+ "useSessionRetainInfo: UseSessionRetainInfo",
5370
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
5371
+ "useChat: UseChat",
5372
+ "useConversation: UseConversation",
5373
+ "useInput: SnapshotSelectorHook<InputState>",
5374
+ "inputActions: InputActions",
5375
+ "useSession: SessionSnapshotSelector",
5376
+ "sessionId: SessionId",
5377
+ "useProjection: UseProjection",
5378
+ "useTrajectory: UseTrajectory"
5379
+ ],
5380
+ keyDomain: "",
5381
+ hookContext: "",
5382
+ slotInject: "",
5383
+ declaredBy: "an entry in 'sidebar.right.pane.tab' (client-ui-sidebar-documentpreview), so it exists while that entry is mounted",
5384
+ occupants: ["client-ui-open-in-app OpenPathEmptyAction id 'open-in-app'"],
5385
+ replaceRisk: "none",
5386
+ example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('sidebar.right.tab.document.unpreviewable', () => ctx.slots.register(\n { name: 'sidebar.right.tab.document.unpreviewable', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
5387
+ source: "packages/client/ui-sidebar-documentpreview/src/client/document/contract.ts:78"
4814
5388
  },
4815
5389
  {
4816
5390
  key: "sidebar.right.tab.guide",
@@ -4850,7 +5424,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4850
5424
  occupants: [],
4851
5425
  replaceRisk: "none",
4852
5426
  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}",
4853
- source: "packages/client/ui-sidebar-right/src/client/contract/slots.ts:75"
5427
+ source: "packages/client/ui-sidebar-right/src/client/contract/slots.ts:83"
4854
5428
  },
4855
5429
  {
4856
5430
  key: "sidebar.right.tab.guide.entry",
@@ -4890,7 +5464,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4890
5464
  occupants: ["client-ui-sidebar-terminal TerminalGuide"],
4891
5465
  replaceRisk: "none",
4892
5466
  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}",
4893
- source: "packages/client/ui-sidebar-right/src/client/contract/slots.ts:82"
5467
+ source: "packages/client/ui-sidebar-right/src/client/contract/slots.ts:90"
4894
5468
  },
4895
5469
  {
4896
5470
  key: "sidebar.right.tab.menu.item",
@@ -4944,7 +5518,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4944
5518
  occupants: [],
4945
5519
  replaceRisk: "none",
4946
5520
  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}",
4947
- source: "packages/client/ui-sidebar-right/src/client/contract/slots.ts:94"
5521
+ source: "packages/client/ui-sidebar-right/src/client/contract/slots.ts:102"
4948
5522
  },
4949
5523
  {
4950
5524
  key: "sidebar.settings",
@@ -5052,7 +5626,104 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
5052
5626
  occupants: ["client-ui-directory-picker-browse BrowseDirectoryFlow", "client-ui-directory-picker-native NativeDirectoryFlow"],
5053
5627
  replaceRisk: "shadows-shipped-ui",
5054
5628
  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}",
5055
- source: "packages/client/ui-workspace/src/client/contract/slots.ts:59"
5629
+ source: "packages/client/ui-workspace/src/client/contract/slots.ts:101"
5630
+ },
5631
+ {
5632
+ key: "sidebar.workspaces.session.menu.item",
5633
+ kind: "list",
5634
+ scope: "root",
5635
+ summary: "The rows of one Session's \"...\" menu, in ascending `order`.",
5636
+ doc: "The rows of one Session's \"...\" menu, in ascending `order`. ui-workspace\nregisters the shipped rows here — `pin` (100), `rename` (200), `fork`\n(300), `archive` (400) — so a plugin row is placed by its own `order`\namong them. Use a package-namespaced `id`; reusing a shipped id at\nanother `priority` shadows that row. Each entry renders one\n`role=\"menuitem\"` `<button>` (the shipped rows use ui-primitives'\n`MenuItemButton`, which adds the host styling and `separatorBefore`),\ndecides its own visibility from its own state, and dismisses the menu\nthrough the injected `useMenuOpenState` hook after acting; the list's\nkeyboard walk and focus return read the DOM, so any such button joins\nthem. Labels come from the contributing package's locale namespace.",
5637
+ registerOptions: [
5638
+ {
5639
+ name: "id",
5640
+ requirement: "required",
5641
+ type: "string",
5642
+ 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."
5643
+ },
5644
+ {
5645
+ name: "order",
5646
+ requirement: "optional",
5647
+ type: "number",
5648
+ doc: "Position among the entries, ascending (default 0)."
5649
+ },
5650
+ {
5651
+ name: "label",
5652
+ requirement: "optional",
5653
+ type: "string | (() => string)",
5654
+ 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."
5655
+ }
5656
+ ],
5657
+ ownerProps: ["/** Owner share of one Session row action occurrence: the row the action belongs to. */\nexport interface SessionRowOwnerProps {\n /** Session the row shows. */\n sessionId: SessionId\n /** Row display title: persisted title, project basename, or Session id. */\n displayTitle: string\n}"],
5658
+ ownerPropsReferences: ["SessionId"],
5659
+ standardProps: [
5660
+ "useResource: UseResource",
5661
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
5662
+ "usePanelInfo: UsePanelInfo",
5663
+ "useSessions: UseSessions",
5664
+ "useSessionStatus: UseSessionStatus",
5665
+ "useSessionRetainInfo: UseSessionRetainInfo",
5666
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>"
5667
+ ],
5668
+ keyDomain: "",
5669
+ hookContext: "MenuOpenState",
5670
+ slotInject: "{ hooks: { menuOpenState: SlotHookFactory<'sidebar.workspaces.session.menu.item', UseMenuOpenState> } }",
5671
+ declaredBy: "an entry in 'sidebar.workspaces' (client-ui-workspace), so it exists while that entry is mounted",
5672
+ occupants: [
5673
+ "client-ui-workspace PinSessionMenuItem id 'pin'",
5674
+ "client-ui-workspace RenameSessionMenuItem id 'rename'",
5675
+ "client-ui-workspace ForkSessionMenuItem id 'fork'",
5676
+ "client-ui-workspace ArchiveSessionMenuItem id 'archive'"
5677
+ ],
5678
+ replaceRisk: "none",
5679
+ 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}",
5680
+ source: "packages/client/ui-workspace/src/client/contract/slots.ts:133"
5681
+ },
5682
+ {
5683
+ key: "sidebar.workspaces.session.row.action",
5684
+ kind: "list",
5685
+ scope: "root",
5686
+ summary: "The hover buttons at the end of one Session row, in ascending `order`, after the \"...\" menu trigger.",
5687
+ doc: "The hover buttons at the end of one Session row, in ascending `order`,\nafter the \"...\" menu trigger. ui-workspace registers `archive` (100) and\n`pin` (200) here. An entry renders one icon button (or nothing, when its\naction does not apply to the row) and owns the action it performs. Clicks\ninside the strip stay in the strip, so the button needs no propagation\nhandling to keep the row from opening.",
5688
+ registerOptions: [
5689
+ {
5690
+ name: "id",
5691
+ requirement: "required",
5692
+ type: "string",
5693
+ 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."
5694
+ },
5695
+ {
5696
+ name: "order",
5697
+ requirement: "optional",
5698
+ type: "number",
5699
+ doc: "Position among the entries, ascending (default 0)."
5700
+ },
5701
+ {
5702
+ name: "label",
5703
+ requirement: "optional",
5704
+ type: "string | (() => string)",
5705
+ 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."
5706
+ }
5707
+ ],
5708
+ ownerProps: ["/** Owner share of one Session row action occurrence: the row the action belongs to. */\nexport interface SessionRowOwnerProps {\n /** Session the row shows. */\n sessionId: SessionId\n /** Row display title: persisted title, project basename, or Session id. */\n displayTitle: string\n}"],
5709
+ ownerPropsReferences: ["SessionId"],
5710
+ standardProps: [
5711
+ "useResource: UseResource",
5712
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
5713
+ "usePanelInfo: UsePanelInfo",
5714
+ "useSessions: UseSessions",
5715
+ "useSessionStatus: UseSessionStatus",
5716
+ "useSessionRetainInfo: UseSessionRetainInfo",
5717
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>"
5718
+ ],
5719
+ keyDomain: "",
5720
+ hookContext: "",
5721
+ slotInject: "",
5722
+ declaredBy: "an entry in 'sidebar.workspaces' (client-ui-workspace), so it exists while that entry is mounted",
5723
+ occupants: ["client-ui-workspace ArchiveSessionRowButton id 'archive'", "client-ui-workspace PinSessionRowButton id 'pin'"],
5724
+ replaceRisk: "none",
5725
+ 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}",
5726
+ source: "packages/client/ui-workspace/src/client/contract/slots.ts:148"
5056
5727
  },
5057
5728
  {
5058
5729
  key: "tool.call.images",
@@ -5087,25 +5758,26 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
5087
5758
  occupants: ["client-ui-attachment MessageImages"],
5088
5759
  replaceRisk: "shadows-shipped-ui",
5089
5760
  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}",
5090
- source: "packages/client/ui-tool/src/client/contract/slots.ts:40"
5761
+ source: "packages/client/ui-tool/src/client/contract/slots.ts:35"
5091
5762
  },
5092
5763
  {
5093
5764
  key: "tool.call.toolview",
5094
5765
  kind: "keyed",
5095
5766
  scope: "session",
5096
- summary: "Keyed atomic Tool call view, dispatched by the wire Tool name.",
5097
- doc: "Keyed atomic Tool call view, dispatched by the wire Tool name. Register\nwith `key: '<tool name>'` to own how one tool's calls render inside a\nturn — the key domain is open (any wire tool name, including a tool your\nown package registered), so there is no compile-time key set to pick\nfrom and a typo simply never renders.\n\nA key the shipped composition already covers is replaced, not shared;\nan unclaimed key falls back to the generic tool row, so registering is\nadditive for your own tool and a takeover for a shipped one. The owner\npasses the call's identity, its frozen running-or-settled node, and the\nexpansion state (see ToolCallOwnerProps), so the view stays a pure\nfunction of what the turn already knows.",
5767
+ summary: "Keyed Tool call view dispatched by wire Tool name.",
5768
+ 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 ToolCallOwnerProps.",
5098
5769
  registerOptions: [{
5099
5770
  name: "key",
5100
5771
  requirement: "required",
5101
5772
  type: "string",
5102
5773
  doc: "Your cell key: the entry renders where the owner dispatches this exact key. Registering an already-occupied key replaces that occupant."
5103
5774
  }],
5104
- ownerProps: ["/** Standard owner currency supplied to every atomic Tool view. */\nexport interface ToolCallOwnerProps {\n /** Tool call identity, stable across running and settled forms. */\n callId: string\n /** Wire Tool name and keyed dispatch value. */\n toolName: string\n /** Frozen running call or settled result node. */\n block: ToolCallBlock\n /** Session workspace root for relative summaries. */\n cwd?: string | undefined\n /** Host account home; POSIX home-rooted summaries display as `~`. */\n home?: string | undefined\n /**\n * Open a Tool argument path. A view that knows which line the call was about\n * passes it, and the opened surface lands there.\n */\n openFile: (path: string, options?: OpenFileOptions) => void\n /**\n * Session-authorized image loader for the `tool.call.images` slot, supplied\n * by the chat node that owns this call. A composed chat node always\n * supplies it (`ChatNodeOwnerProps.loadImage` is required), so the tool\n * layer never imports an attachment implementation nor handles URL\n * authorization.\n */\n loadImage: MessageImageLoader\n /** Inspect this call in the trajectory view when available. */\n inspect?: (() => void) | undefined\n}"],
5775
+ ownerProps: ["/** Standard owner currency supplied to every atomic Tool view. */\nexport interface ToolCallOwnerProps {\n /** Stable injected Hook; each invocation owns its open state and subscribes to enclosing-Turn resets. */\n useDisclosure: UseDisclosure\n /** Tool call identity, stable across running and settled forms. */\n callId: string\n /** Wire Tool name and keyed dispatch value. */\n toolName: string\n /** Frozen running call or settled result node. */\n block: ToolCallBlock\n /** Session workspace root for relative summaries. */\n cwd?: string | undefined\n /** Host account home; POSIX home-rooted summaries display as `~`. */\n home?: string | undefined\n /**\n * Open a Tool argument path. A view that knows which line the call was about\n * passes it, and the opened surface lands there.\n */\n openFile: (path: string, options?: OpenFileOptions) => void\n /**\n * Session-authorized image loader for the `tool.call.images` slot, supplied\n * by the chat node that owns this call. A composed chat node always\n * supplies it (`ChatNodeOwnerProps.loadImage` is required), so the tool\n * layer never imports an attachment implementation nor handles URL\n * authorization.\n */\n loadIm /* …truncated full shape in source */"],
5105
5776
  ownerPropsReferences: [
5106
5777
  "ChatNodeOwnerProps",
5107
5778
  "MessageImageLoader",
5108
- "OpenFileOptions"
5779
+ "OpenFileOptions",
5780
+ "UseDisclosure"
5109
5781
  ],
5110
5782
  standardProps: [
5111
5783
  "useResource: UseResource",
@@ -5124,7 +5796,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
5124
5796
  "useProjection: UseProjection",
5125
5797
  "useTrajectory: UseTrajectory"
5126
5798
  ],
5127
- keyDomain: "open: any string the owner dispatches (no compile-time key set), already taken: ask_user_question, bash, cordis_define, cordis_run, cordis_stop, cordis_undefine, edit, glob, grep, present, read, read_image, skill, todo_write, web_fetch, web_search, write",
5799
+ 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, 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",
5128
5800
  hookContext: "",
5129
5801
  slotInject: "",
5130
5802
  declaredBy: "an entry in 'conversation.chat.node' (client-ui-tool), so it exists while that entry is mounted",
@@ -5133,6 +5805,42 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
5133
5805
  "client-ui-skill SkillRow key 'skill'",
5134
5806
  "client-ui-tool AskQuestionRow key 'ask_user_question'",
5135
5807
  "client-ui-tool BashRow key 'bash'",
5808
+ "client-ui-tool DetailsRow key 'create_goal'",
5809
+ "client-ui-tool DetailsRow key 'get_goal'",
5810
+ "client-ui-tool DetailsRow key 'update_goal'",
5811
+ "client-ui-tool DetailsRow key 'schedule_create'",
5812
+ "client-ui-tool DetailsRow key 'schedule_list'",
5813
+ "client-ui-tool DetailsRow key 'schedule_delete'",
5814
+ "client-ui-tool DetailsRow key 'cordis_inspect_list'",
5815
+ "client-ui-tool DetailsRow key 'cordis_inspect_query'",
5816
+ "client-ui-tool DetailsRow key 'cordis_inspect_self'",
5817
+ "client-ui-tool DetailsRow key 'workflow'",
5818
+ "client-ui-tool DetailsRow key 'ralph'",
5819
+ "client-ui-tool DetailsRow key 'session_event_read'",
5820
+ "client-ui-tool DetailsRow key 'session_event_search'",
5821
+ "client-ui-tool DetailsRow key 'session_event_trace'",
5822
+ "client-ui-tool DetailsRow key 'session_search'",
5823
+ "client-ui-tool DetailsRow key 'session_trace'",
5824
+ "client-ui-tool DetailsRow key 'list_subagent_models'",
5825
+ "client-ui-tool DetailsRow key 'subagent'",
5826
+ "client-ui-tool DetailsRow key 'list_agents'",
5827
+ "client-ui-tool DetailsRow key 'send_message'",
5828
+ "client-ui-tool DetailsRow key 'interrupt_agent'",
5829
+ "client-ui-tool DetailsRow key 'job_list'",
5830
+ "client-ui-tool DetailsRow key 'job_output'",
5831
+ "client-ui-tool DetailsRow key 'job_kill'",
5832
+ "client-ui-tool DetailsRow key 'terminal_open'",
5833
+ "client-ui-tool DetailsRow key 'terminal_read'",
5834
+ "client-ui-tool DetailsRow key 'terminal_list'",
5835
+ "client-ui-tool DetailsRow key 'terminal_signal'",
5836
+ "client-ui-tool DetailsRow key 'terminal_close'",
5837
+ "client-ui-tool DetailsRow key 'lsp'",
5838
+ "client-ui-tool DetailsRow key 'spawn_teammate'",
5839
+ "client-ui-tool DetailsRow key 'team_task_create'",
5840
+ "client-ui-tool DetailsRow key 'team_task_get'",
5841
+ "client-ui-tool DetailsRow key 'team_task_update'",
5842
+ "client-ui-tool DetailsRow key 'team_task_list'",
5843
+ "client-ui-tool DetailsRow key 'wait_agent'",
5136
5844
  "client-ui-tool FileMutationRow key 'edit'",
5137
5845
  "client-ui-tool FileMutationRow key 'write'",
5138
5846
  "client-ui-tool ReadImageRow key 'read_image'",
@@ -5149,7 +5857,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
5149
5857
  ],
5150
5858
  replaceRisk: "shadows-shipped-ui",
5151
5859
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('tool.call.toolview', () => ctx.slots.register(\n { name: 'tool.call.toolview', key: '<one key the owner dispatches>' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
5152
- source: "packages/client/ui-tool/src/client/contract/slots.ts:26"
5860
+ source: "packages/client/ui-tool/src/client/contract/slots.ts:21"
5153
5861
  },
5154
5862
  {
5155
5863
  key: "tool.view.cordis",