@deepseek-ai/dsh-cordis-client-runner 0.1.2-rc.1 → 0.1.5-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.i18n.yaml CHANGED
@@ -2,5 +2,5 @@
2
2
  # side as of the last confirmed-consistent state. Both languages carry equal authority;
3
3
  # after editing either side, bring the other along and re-record with:
4
4
  # pnpm run verify-translation-pairing --write packages/extensions/cordis-client-runner/README.md
5
- README.md: 3b5762786e0f5b00fc80533ca4fa97a3d4cd0a4b
6
- README.zh.md: d68dc218f75e65c9a1787a5e43f018c9cdfa3383
5
+ README.md: 260d4703bda2560a4254962d7b868221d0328ec8
6
+ README.zh.md: a74128508c5b6a81d0600452b6ec5301bf7c8dcb
package/README.md CHANGED
@@ -83,7 +83,6 @@ Read these pages when the package-level contract is not enough. They move from t
83
83
  - [Tool package](../tool-cordis/README.md) — the model-facing tools whose run requests reach this page.
84
84
  - [UI package](../ui-cordis/README.md) — the panel and cards that operate this face.
85
85
  - [Extensions subsystem](../../../docs/subsystems/extensions.md) — the generated `ctx.dynamicCordisRunner` API and `cordis/*` events.
86
- - [Dynamic client render and attachment ownership Agent Note](../../../.agents/notes/implemented/architecture/2026-08-17-dynamic-client-render-and-attachment-ownership.md) — how browser plugins own their rendering and CSS.
87
86
  - [Client shells and dynamic packages Agent Note](../../../.agents/notes/implemented/architecture/2026-08-15-client-shells-and-dynamic-packages.md) — package placement and build faces for the client halves.
88
87
 
89
88
  -----
package/README.zh.md CHANGED
@@ -83,7 +83,6 @@ kind: "package-reference"
83
83
  - [工具包](../tool-cordis/README.zh.md)——运行请求到达本页的模型侧工具。
84
84
  - [UI 包](../ui-cordis/README.zh.md)——操作这个面的面板与卡片。
85
85
  - [extensions 子系统](../../../docs/subsystems/extensions.zh.md)——生成的 `ctx.dynamicCordisRunner` API 与 `cordis/*` 事件。
86
- - [动态客户端渲染与附件归属 Agent Note](../../../.agents/notes/implemented/architecture/2026-08-17-dynamic-client-render-and-attachment-ownership.zh.md)——浏览器插件如何拥有自己的渲染与 CSS。
87
86
  - [客户端外壳与动态包 Agent Note](../../../.agents/notes/implemented/architecture/2026-08-15-client-shells-and-dynamic-packages.zh.md)——浏览器半的包归属与构建面。
88
87
 
89
88
  -----
package/lib/client.js CHANGED
@@ -1123,13 +1123,19 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1123
1123
  parameters: []
1124
1124
  },
1125
1125
  {
1126
- signature: "openDetails(): void",
1127
- description: "Open the details panel (no-op when already open).",
1128
- parameters: []
1126
+ signature: "openRightbar(track: boolean, fullscreen: boolean): void",
1127
+ description: "Report the right panel's presentation without changing its expanded state.",
1128
+ parameters: [{
1129
+ name: "track",
1130
+ description: "whether the normal panel width reserves a grid track, including beneath a fullscreen overlay."
1131
+ }, {
1132
+ name: "fullscreen",
1133
+ description: "whether the panel covers the frame and hides its outer resize handle; independent of the underlying grid track."
1134
+ }]
1129
1135
  },
1130
1136
  {
1131
- signature: "closeDetails(): void",
1132
- description: "Close the details panel.",
1137
+ signature: "closeRightbar(): void",
1138
+ description: "Report the right panel as hidden: no track, no handle.",
1133
1139
  parameters: []
1134
1140
  }
1135
1141
  ]
@@ -1602,13 +1608,17 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1602
1608
  name: "AgentContext",
1603
1609
  declaration: "export type AgentContext = Omit<Context, 'remote'> & {\n readonly remote: ClientRemote & TypertRemoteScopeApi<'agent'>;\n};"
1604
1610
  },
1611
+ {
1612
+ name: "AssistantLiveChunkEvent",
1613
+ declaration: "export interface AssistantLiveChunkEvent {\n readonly type: 'assistant/live-chunk';\n readonly seq: number;\n readonly time: number;\n readonly data: {\n readonly attemptId: LlmAttemptId;\n readonly turn: number;\n readonly step: number;\n readonly chunk: StreamChunk;\n };\n}"
1614
+ },
1605
1615
  {
1606
1616
  name: "BakedActions",
1607
1617
  declaration: "export type BakedActions<T, A extends ActionsDecl<T>> = {\n [K in keyof A]: A[K] extends (draft: T, ...params: infer P) => void ? (...params: P) => void : never;\n};"
1608
1618
  },
1609
1619
  {
1610
1620
  name: "BeginSubmissionInput",
1611
- declaration: "export interface BeginSubmissionInput {\n readonly mode: 'queue' | 'steer';\n readonly text: string;\n readonly images: readonly PendingSubmissionImage[];\n readonly onRetire?: (retirement: PendingSubmissionRetirement) => void;\n}"
1621
+ declaration: "export interface BeginSubmissionInput {\n readonly mode: 'queue' | 'steer';\n readonly text: string;\n readonly attachments: readonly PendingSubmissionAttachment[];\n readonly onRetire?: (retirement: PendingSubmissionRetirement) => void;\n}"
1612
1622
  },
1613
1623
  {
1614
1624
  name: "BoundActions",
@@ -1630,10 +1640,6 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1630
1640
  name: "ChildrenDecl",
1631
1641
  declaration: "export type ChildrenDecl = {\n [P in keyof SlotMap & string]?: SlotSpec<SlotMap[P]>;\n};"
1632
1642
  },
1633
- {
1634
- name: "ChunkRowEvent",
1635
- declaration: "export type ChunkRowEvent = {\n [Kind in ChunkRow['type']]: {\n readonly type: `chunkrow/${Kind}`;\n readonly seq: number;\n readonly time: number;\n readonly data: Extract<ChunkRow, {\n readonly type: Kind;\n }>['data'];\n };\n}[ChunkRow['type']];"
1636
- },
1637
1643
  {
1638
1644
  name: "ClientConnectionRpc",
1639
1645
  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}"
@@ -1650,10 +1656,6 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1650
1656
  name: "ComposedProps",
1651
1657
  declaration: "export type ComposedProps<K extends keyof SlotMap & string, EntryKey extends EntryKeyOf<K>, S extends keyof SlotMap & string, H, I extends object, M = never, N = undefined> = PropsRuntime<K, EntryKey> & PropsRenderSlots<S> & PropsStore<H> & InjectFace<I> & MatchedShare<SlotMap[K], M> & PropsLocale<N>;"
1652
1658
  },
1653
- {
1654
- name: "ConnectionConfig",
1655
- declaration: "export interface ConnectionConfig {\n backoffBaseMs?: number;\n backoffFactor?: number;\n backoffMaxMs?: number;\n generationReadyTimeoutMs?: number;\n}"
1656
- },
1657
1659
  {
1658
1660
  name: "ConnectionGeneration",
1659
1661
  declaration: "export interface ConnectionGeneration {\n readonly id: number;\n readonly host: ConnectionHostInfo;\n}"
@@ -1668,7 +1670,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1668
1670
  },
1669
1671
  {
1670
1672
  name: "ConnectionHandle",
1671
- declaration: "export interface ConnectionHandle {\n readonly isLoopback: boolean;\n readonly generation: ConnectionGenerationState;\n readonly state: ConnectionStateSource;\n readonly rpc: ClientConnectionRpc;\n reconnect(): void;\n registerGenerationSource(source: ConnectionGenerationSource): () => void;\n start(sinks: ConnectionSinks, config?: ConnectionConfig): ConnectionLoop;\n}"
1673
+ declaration: "export interface ConnectionHandle {\n readonly isLoopback: boolean;\n readonly generation: ConnectionGenerationState;\n readonly state: ConnectionStateSource;\n readonly rpc: ClientConnectionRpc;\n reconnect(): void;\n registerGenerationSource(source: ConnectionGenerationSource): () => void;\n start(sinks: ConnectionSinks, config?: ConnectionRecoveryConfig): ConnectionLoop;\n}"
1672
1674
  },
1673
1675
  {
1674
1676
  name: "ConnectionHostInfo",
@@ -1678,6 +1680,10 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1678
1680
  name: "ConnectionLoop",
1679
1681
  declaration: "export interface ConnectionLoop {\n stop(): void;\n}"
1680
1682
  },
1683
+ {
1684
+ name: "ConnectionRecoveryConfig",
1685
+ declaration: "export interface ConnectionRecoveryConfig {\n backoffBaseMs?: number;\n backoffFactor?: number;\n backoffMaxMs?: number;\n generationReadyWarnMs?: number;\n generationReadyTimeoutMs?: number;\n}"
1686
+ },
1681
1687
  {
1682
1688
  name: "ConnectionRpcFailure",
1683
1689
  declaration: "export interface ConnectionRpcFailure {\n readonly code: string;\n readonly message: string;\n readonly details: object;\n}"
@@ -1796,19 +1802,31 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1796
1802
  },
1797
1803
  {
1798
1804
  name: "PendingSubmission",
1799
- declaration: "export interface PendingSubmission {\n readonly requestId: SessionRequestId;\n readonly placement: PendingSubmissionPlacement;\n readonly time: number;\n readonly text: string;\n readonly images: readonly PendingSubmissionImage[];\n}"
1805
+ declaration: "export interface PendingSubmission {\n readonly requestId: SessionRequestId;\n readonly placement: PendingSubmissionPlacement;\n readonly time: number;\n readonly text: string;\n readonly attachments: readonly PendingSubmissionAttachment[];\n}"
1806
+ },
1807
+ {
1808
+ name: "PendingSubmissionAttachment",
1809
+ declaration: "export type PendingSubmissionAttachment = PendingSubmissionImageAttachment | PendingSubmissionFileAttachment;"
1810
+ },
1811
+ {
1812
+ name: "PendingSubmissionFileAttachment",
1813
+ declaration: "export interface PendingSubmissionFileAttachment {\n readonly type: 'file';\n readonly value: FileAttachmentRef;\n}"
1800
1814
  },
1801
1815
  {
1802
1816
  name: "PendingSubmissionImage",
1803
1817
  declaration: "export interface PendingSubmissionImage {\n readonly previewUrl: string;\n readonly name?: string;\n readonly width?: number;\n readonly height?: number;\n}"
1804
1818
  },
1819
+ {
1820
+ name: "PendingSubmissionImageAttachment",
1821
+ declaration: "export interface PendingSubmissionImageAttachment {\n readonly type: 'image';\n readonly value: PendingSubmissionImage;\n}"
1822
+ },
1805
1823
  {
1806
1824
  name: "PendingSubmissionPlacement",
1807
1825
  declaration: "export type PendingSubmissionPlacement = 'transcript' | 'queued' | 'steering';"
1808
1826
  },
1809
1827
  {
1810
1828
  name: "PendingSubmissionRetirement",
1811
- declaration: "export type PendingSubmissionRetirement = {\n readonly reason: 'observed';\n readonly attachments: readonly ImageAttachmentRef[];\n} | {\n readonly reason: 'failed';\n};"
1829
+ declaration: "export type PendingSubmissionRetirement = {\n readonly reason: 'observed';\n readonly attachments: readonly (ImageAttachmentRef | FileAttachmentRef)[];\n} | {\n readonly reason: 'failed';\n};"
1812
1830
  },
1813
1831
  {
1814
1832
  name: "ProjectionsFace",
@@ -1816,7 +1834,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1816
1834
  },
1817
1835
  {
1818
1836
  name: "PromptContentPart",
1819
- declaration: "export type PromptContentPart = {\n readonly type: 'text';\n readonly text: string;\n} | {\n readonly type: 'image';\n readonly mediaType: ImageMediaType;\n readonly data: string;\n readonly name?: string;\n};"
1837
+ declaration: "export type PromptContentPart = {\n readonly type: 'text';\n readonly text: string;\n} | {\n readonly type: 'image';\n readonly mediaType: ImageMediaType;\n readonly data: string;\n readonly name?: string;\n} | {\n readonly type: 'file';\n readonly receiptId: Branded<'file-upload-receipt-id'>;\n};"
1820
1838
  },
1821
1839
  {
1822
1840
  name: "PromptError",
@@ -1878,17 +1896,21 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1878
1896
  name: "SessionAreaProps",
1879
1897
  declaration: "export interface SessionAreaProps {\n empty?: (() => ReactNode) | undefined;\n children: ReactNode;\n}"
1880
1898
  },
1899
+ {
1900
+ name: "SessionAssistantSettlementEntry",
1901
+ declaration: "export interface SessionAssistantSettlementEntry {\n readonly type: 'event';\n readonly event: SessionEvent<'assistant/message'> | SessionEvent<'assistant/attempt'>;\n}"
1902
+ },
1881
1903
  {
1882
1904
  name: "SessionBinding",
1883
1905
  declaration: "export interface SessionBinding {\n readonly sessionId: SessionId;\n readonly session: SessionFace;\n readonly eventSource: SessionEventSource;\n readonly ctx: AgentContext;\n}"
1884
1906
  },
1885
1907
  {
1886
1908
  name: "SessionEventChange",
1887
- declaration: "export type SessionEventChange = {\n readonly kind: 'replace';\n readonly entries: readonly SessionEventLikeEntry[];\n} | {\n readonly kind: 'prepend';\n readonly entries: readonly SessionEventLikeEntry[];\n} | {\n readonly kind: 'append';\n readonly entries: readonly SessionLiveEventEntry[];\n};"
1909
+ declaration: "export type SessionEventChange = {\n readonly kind: 'replace';\n readonly entries: readonly SessionEventLikeEntry[];\n} | {\n readonly kind: 'prepend';\n readonly entries: readonly SessionEventLikeEntry[];\n} | {\n readonly kind: 'append';\n readonly entries: readonly SessionEventLikeEntry[];\n} | {\n readonly kind: 'settle-assistant';\n readonly attemptId: LlmAttemptId;\n readonly entry?: SessionAssistantSettlementEntry;\n};"
1888
1910
  },
1889
1911
  {
1890
1912
  name: "SessionEventLikeEntry",
1891
- declaration: "export type SessionEventLikeEntry = {\n readonly type: 'event';\n readonly event: SessionEvent;\n} | {\n readonly type: 'chunks';\n readonly event: ChunkRowEvent;\n};"
1913
+ declaration: "export type SessionEventLikeEntry = {\n readonly type: 'event';\n readonly event: SessionEvent;\n} | {\n readonly type: 'transient';\n readonly event: AssistantLiveChunkEvent;\n};"
1892
1914
  },
1893
1915
  {
1894
1916
  name: "SessionEventSource",
@@ -1906,10 +1928,6 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
1906
1928
  name: "SessionIdOf",
1907
1929
  declaration: "export type SessionIdOf = SessionStandardProps extends {\n sessionId: infer S;\n} ? S : string;"
1908
1930
  },
1909
- {
1910
- name: "SessionLiveEventEntry",
1911
- declaration: "export type SessionLiveEventEntry = Extract<SessionEventLikeEntry, {\n readonly type: 'event';\n}>;"
1912
- },
1913
1931
  {
1914
1932
  name: "SessionMaybeStandardProps",
1915
1933
  declaration: "export interface SessionMaybeStandardProps {\n}"
@@ -2143,6 +2161,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2143
2161
  ownerProps: ["/** Conversation owner share: business state and actions belong to the registrant. */\nexport interface ConvOwnerProps {}"],
2144
2162
  ownerPropsReferences: [],
2145
2163
  standardProps: [
2164
+ "useResource: UseResource",
2146
2165
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2147
2166
  "useSessions: UseSessions",
2148
2167
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -2173,6 +2192,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2173
2192
  ownerProps: ["/** Stable identity handed to an optional approval-detail renderer. */\nexport interface ApprovalDetailOwnerProps {\n /** Tool call correlated with the request. */\n callId: ToolCallId\n}"],
2174
2193
  ownerPropsReferences: [],
2175
2194
  standardProps: [
2195
+ "useResource: UseResource",
2176
2196
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2177
2197
  "useSessions: UseSessions",
2178
2198
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -2224,6 +2244,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2224
2244
  ownerProps: ["/** Owner currency of finalized-assistant actions. */\nexport interface AssistantActionOwnerProps {\n messageId: MessageId\n}"],
2225
2245
  ownerPropsReferences: ["MessageId"],
2226
2246
  standardProps: [
2247
+ "useResource: UseResource",
2227
2248
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2228
2249
  "useSessions: UseSessions",
2229
2250
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -2244,7 +2265,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2244
2265
  occupants: ["client-ui-message-feedback MessageFeedbackActions id 'feedback'"],
2245
2266
  replaceRisk: "none",
2246
2267
  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}",
2247
- source: "packages/client/ui-chat/src/client/contract/slots.ts:221"
2268
+ source: "packages/client/ui-chat/src/client/contract/slots.ts:212"
2248
2269
  },
2249
2270
  {
2250
2271
  key: "conversation.chat.commandview",
@@ -2265,6 +2286,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2265
2286
  "CompactionSummaryNode"
2266
2287
  ],
2267
2288
  standardProps: [
2289
+ "useResource: UseResource",
2268
2290
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2269
2291
  "useSessions: UseSessions",
2270
2292
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -2285,7 +2307,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2285
2307
  occupants: [],
2286
2308
  replaceRisk: "none",
2287
2309
  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}",
2288
- source: "packages/client/ui-chat/src/client/contract/slots.ts:209"
2310
+ source: "packages/client/ui-chat/src/client/contract/slots.ts:200"
2289
2311
  },
2290
2312
  {
2291
2313
  key: "conversation.chat.node",
@@ -2299,14 +2321,17 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2299
2321
  type: "string",
2300
2322
  doc: "Your cell key: the entry renders where the owner dispatches this exact key. Registering an already-occupied key replaces that occupant."
2301
2323
  }],
2302
- ownerProps: ["/** Stable owner currency delivered to a keyed Chat renderer. */\nexport interface ChatNodeOwnerProps {\n selectedCallId?: ToolCallId | undefined\n cwd?: string | undefined\n openFile: (path: string) => void\n inspectCall: (callId: ToolCallId) => void\n forkAt: (seq: number) => void\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}"],
2324
+ ownerProps: ["/** Stable owner currency delivered to a keyed Chat renderer. */\nexport interface ChatNodeOwnerProps {\n cwd?: string | undefined\n openFile: (path: string, options?: OpenFileOptions) => void\n inspectCall: (callId: ToolCallId) => void\n forkAt: (seq: number) => void\n /**\n * Session-authorized image loader, down-threaded from the Chat view so a\n * chat-node renderer can render the attachment presentation slot directly\n * with only the durable references plus this loader, instead of receiving a\n * rendering closure.\n */\n loadImage: MessageImageLoader\n renderMessageImages: RenderMessageImages\n fileMentions: (owner: TurnTailOwnerProps) => MarkdownFileMentions | undefined\n /** Turn-process state when this Node belongs to a projected Turn. */\n turnProcess?: TurnProcessOwnerProps | undefined\n}"],
2303
2325
  ownerPropsReferences: [
2304
2326
  "MarkdownFileMentions",
2327
+ "MessageImageLoader",
2328
+ "OpenFileOptions",
2305
2329
  "RenderMessageImages",
2306
2330
  "TurnProcessOwnerProps",
2307
2331
  "TurnTailOwnerProps"
2308
2332
  ],
2309
2333
  standardProps: [
2334
+ "useResource: UseResource",
2310
2335
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2311
2336
  "useSessions: UseSessions",
2312
2337
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -2345,7 +2370,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2345
2370
  ],
2346
2371
  replaceRisk: "shadows-shipped-ui",
2347
2372
  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}",
2348
- source: "packages/client/ui-chat/src/client/contract/slots.ts:190"
2373
+ source: "packages/client/ui-chat/src/client/contract/slots.ts:181"
2349
2374
  },
2350
2375
  {
2351
2376
  key: "conversation.chat.turnTail",
@@ -2362,6 +2387,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2362
2387
  ownerProps: ["/** Owner currency of the completed-Turn extension chain. */\nexport interface TurnTailOwnerProps {\n turn: TurnLocation\n seq: number\n openFile: (path: string) => void\n}"],
2363
2388
  ownerPropsReferences: ["TurnLocation"],
2364
2389
  standardProps: [
2390
+ "useResource: UseResource",
2365
2391
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2366
2392
  "useSessions: UseSessions",
2367
2393
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -2382,7 +2408,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2382
2408
  occupants: ["client-ui-deliverables ProducedFiles"],
2383
2409
  replaceRisk: "none",
2384
2410
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.chat.turnTail', () => ctx.slots.register(\n { name: 'conversation.chat.turnTail', select: owner => null },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2385
- source: "packages/client/ui-chat/src/client/contract/slots.ts:215"
2411
+ source: "packages/client/ui-chat/src/client/contract/slots.ts:206"
2386
2412
  },
2387
2413
  {
2388
2414
  key: "conversation.composer",
@@ -2403,6 +2429,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2403
2429
  "SessionSnapshot"
2404
2430
  ],
2405
2431
  standardProps: [
2432
+ "useResource: UseResource",
2406
2433
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2407
2434
  "useSessions: UseSessions",
2408
2435
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -2427,7 +2454,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2427
2454
  ],
2428
2455
  replaceRisk: "none",
2429
2456
  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}",
2430
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:119"
2457
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:157"
2431
2458
  },
2432
2459
  {
2433
2460
  key: "conversation.composer.bar",
@@ -2439,6 +2466,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2439
2466
  ownerProps: ["/** Owner share of the resident composer bar. */\nexport interface ComposerBarOwnerProps {\n /** Hero uses centered placement; composer uses the active bottom placement. */\n variant: 'hero' | 'composer'\n /** A feature-owned reason that makes message input inert while leaving model selection live. */\n blocked?: { readonly reason: string }\n /** Lock all message actions while preserving the resident composer surface. */\n disabled?: boolean\n /** Whether the shared Workspace picker is expanded. */\n workspacePickerOpen?: boolean\n /** Open the Workspace picker from the inert composer surface. */\n onRequestWorkspace?: () => void\n placeholder?: string\n /** Optional content rendered above the composer surface. */\n accessory?: ReactNode\n}"],
2440
2467
  ownerPropsReferences: ["Workspace"],
2441
2468
  standardProps: [
2469
+ "useResource: UseResource",
2442
2470
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2443
2471
  "useSessions: UseSessions",
2444
2472
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -2457,7 +2485,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2457
2485
  occupants: ["client-ui-conversation InputBar"],
2458
2486
  replaceRisk: "shadows-shipped-ui",
2459
2487
  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}",
2460
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:137"
2488
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:175"
2461
2489
  },
2462
2490
  {
2463
2491
  key: "conversation.composer.dock",
@@ -2488,6 +2516,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2488
2516
  ownerProps: [],
2489
2517
  ownerPropsReferences: [],
2490
2518
  standardProps: [
2519
+ "useResource: UseResource",
2491
2520
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2492
2521
  "useSessions: UseSessions",
2493
2522
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -2505,42 +2534,10 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2505
2534
  hookContext: "",
2506
2535
  slotInject: "",
2507
2536
  declaredBy: "an entry in 'conversation.composer.bar' (client-ui-conversation), so it exists while that entry is mounted",
2508
- occupants: ["client-ui-chat StatsLine id 'stats'"],
2537
+ occupants: ["client-ui-chat StatsPills id 'stats'"],
2509
2538
  replaceRisk: "none",
2510
2539
  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}",
2511
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:131"
2512
- },
2513
- {
2514
- key: "conversation.details.tool",
2515
- kind: "single",
2516
- scope: "session",
2517
- summary: "Whole details-panel body for the selected Tool call.",
2518
- doc: "Whole details-panel body for the selected Tool call. The component receives\nthe running or settled block and optional workspace root. A registration\nreplaces the shipped Tool details renderer; absence uses the raw fallback.",
2519
- registerOptions: [],
2520
- ownerProps: ["/** Tool block rendered in the details panel. */\nexport interface DetailsToolOwnerProps {\n block: ToolCallBlock\n cwd?: string | undefined\n}"],
2521
- ownerPropsReferences: [],
2522
- standardProps: [
2523
- "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2524
- "useSessions: UseSessions",
2525
- "useSessionPendingInteraction: UseSessionPendingInteraction",
2526
- "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2527
- "useChat: UseChat",
2528
- "useConversation: UseConversation",
2529
- "useInput: SnapshotSelectorHook<InputState>",
2530
- "inputActions: InputActions",
2531
- "useSession: SessionSnapshotSelector",
2532
- "sessionId: SessionId",
2533
- "useProjection: UseProjection",
2534
- "useTrajectory: UseTrajectory"
2535
- ],
2536
- keyDomain: "",
2537
- hookContext: "",
2538
- slotInject: "",
2539
- declaredBy: "an entry in 'details' (client-ui-chat), so it exists while that entry is mounted",
2540
- occupants: ["client-ui-tool ToolDetails"],
2541
- replaceRisk: "shadows-shipped-ui",
2542
- example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.details.tool', () => ctx.slots.register(\n { name: 'conversation.details.tool' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
2543
- source: "packages/client/ui-chat/src/client/contract/slots.ts:227"
2540
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:169"
2544
2541
  },
2545
2542
  {
2546
2543
  key: "conversation.hero.agentPreset",
@@ -2552,6 +2549,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2552
2549
  ownerProps: ["/** Owner share of the Hero agent-preset control. */\nexport interface HeroAgentPresetOwnerProps {\n /** Marker field: the occupant owns its roster and staged selection. */\n children?: never\n}"],
2553
2550
  ownerPropsReferences: [],
2554
2551
  standardProps: [
2552
+ "useResource: UseResource",
2555
2553
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2556
2554
  "useSessions: UseSessions",
2557
2555
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -2564,7 +2562,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2564
2562
  occupants: ["client-ui-agent-preset AgentPresetSeat"],
2565
2563
  replaceRisk: "shadows-shipped-ui",
2566
2564
  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}",
2567
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:125"
2565
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:163"
2568
2566
  },
2569
2567
  {
2570
2568
  key: "conversation.hero.brand.mark",
@@ -2576,6 +2574,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2576
2574
  ownerProps: ["/** Presentation props supplied to the blank-session brand mark. */\nexport interface HeroBrandMarkOwnerProps {\n /** Requested square edge in pixels. */\n size: number\n /** Host class preserving the surrounding mark geometry. */\n className?: string | undefined\n}"],
2577
2575
  ownerPropsReferences: [],
2578
2576
  standardProps: [
2577
+ "useResource: UseResource",
2579
2578
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2580
2579
  "useSessions: UseSessions",
2581
2580
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -2588,7 +2587,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2588
2587
  occupants: [],
2589
2588
  replaceRisk: "none",
2590
2589
  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}",
2591
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:123"
2590
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:161"
2592
2591
  },
2593
2592
  {
2594
2593
  key: "conversation.hero.workspace",
@@ -2600,6 +2599,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2600
2599
  ownerProps: ["/** Owner share common to blank-session Workspace pickers. */\nexport interface EmptyWorkspaceOwnerProps {\n open: boolean\n anchorRef?: RefObject<HTMLElement>\n /** Currently selected Workspace, when available. */\n selectedId?: WorkspaceId | undefined\n onPick: (workspaceId: WorkspaceId) => void\n onClose: () => void\n}"],
2601
2600
  ownerPropsReferences: ["Workspace"],
2602
2601
  standardProps: [
2602
+ "useResource: UseResource",
2603
2603
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2604
2604
  "useSessions: UseSessions",
2605
2605
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -2612,7 +2612,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2612
2612
  occupants: ["client-ui-workspace WorkspacePicker"],
2613
2613
  replaceRisk: "shadows-shipped-ui",
2614
2614
  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}",
2615
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:121"
2615
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:159"
2616
2616
  },
2617
2617
  {
2618
2618
  key: "conversation.hero.workspace.directoryFlow",
@@ -2624,6 +2624,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2624
2624
  ownerProps: ["/**\n * Owner share of the directory-flow holes: the complete conversation between\n * the trigger surface and the picking interaction. The occupant reads `open`\n * to run/render its interaction and reports exactly one outcome per open.\n */\nexport interface DirectoryFlowOwnerProps {\n /** True while a picking interaction is requested; flipping back to false withdraws the request. */\n open: boolean\n /** True while the owner adopts a picked path (`createWorkspace` in flight); occupants disable their commit affordances. */\n busy: boolean\n /** The operator picked a directory (absolute host path); the owner adopts it. */\n onPicked: (path: string) => void\n /** The operator dismissed the interaction; the owner just closes the flow. */\n onCancel: () => void\n /** The interaction itself failed (chooser missing, listing denied); the owner shows its error surface. */\n onError: (message: string) => void\n}"],
2625
2625
  ownerPropsReferences: [],
2626
2626
  standardProps: [
2627
+ "useResource: UseResource",
2627
2628
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2628
2629
  "useSessions: UseSessions",
2629
2630
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -2642,12 +2643,17 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2642
2643
  key: "conversation.input.attachments",
2643
2644
  kind: "single",
2644
2645
  scope: "session-maybe",
2645
- summary: "Optional draft-image rail and drop target.",
2646
- doc: "Optional draft-image rail and drop target.",
2646
+ summary: "Optional draft-attachment rail and drop target.",
2647
+ doc: "Optional draft-attachment rail and drop target.",
2647
2648
  registerOptions: [],
2648
- ownerProps: ["/** Input state handed to the optional attachment presentation plugin. */\nexport interface ComposerAttachmentsOwnerProps {\n /** Browser-owned draft images in input order. */\n attachments: readonly ComposerAttachment[]\n /** Whether a document-level file drop may add images now. */\n canAcceptDrop: boolean\n /** Add one dropped batch through the composer's validation path. */\n onAddImages: (files: readonly File[]) => void\n /** Remove one draft image through the Conversation service. */\n onRemoveImage: (id: DraftAttachmentId) => void\n /** Display-ready limits for the drop invitation. */\n dropLimits?: { readonly count: number; readonly size: string } | undefined\n}"],
2649
- ownerPropsReferences: ["ComposerAttachment", "DraftAttachmentId"],
2649
+ 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}"],
2650
+ ownerPropsReferences: [
2651
+ "ComposerAttachment",
2652
+ "DraftAttachmentId",
2653
+ "DraftFileUploads"
2654
+ ],
2650
2655
  standardProps: [
2656
+ "useResource: UseResource",
2651
2657
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2652
2658
  "useSessions: UseSessions",
2653
2659
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -2666,7 +2672,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2666
2672
  occupants: ["client-ui-attachment ComposerAttachments"],
2667
2673
  replaceRisk: "shadows-shipped-ui",
2668
2674
  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}",
2669
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:139"
2675
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:177"
2670
2676
  },
2671
2677
  {
2672
2678
  key: "conversation.input.dock",
@@ -2697,6 +2703,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2697
2703
  ownerProps: ["/** Point-in-time owner values for composer extension entries. */\nexport interface InputZone {\n readonly session: SessionSnapshot\n readonly input: InputState\n}"],
2698
2704
  ownerPropsReferences: ["InputState", "SessionSnapshot"],
2699
2705
  standardProps: [
2706
+ "useResource: UseResource",
2700
2707
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2701
2708
  "useSessions: UseSessions",
2702
2709
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -2721,7 +2728,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2721
2728
  ],
2722
2729
  replaceRisk: "none",
2723
2730
  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}",
2724
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:127"
2731
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:165"
2725
2732
  },
2726
2733
  {
2727
2734
  key: "conversation.input.left",
@@ -2752,6 +2759,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2752
2759
  ownerProps: [],
2753
2760
  ownerPropsReferences: [],
2754
2761
  standardProps: [
2762
+ "useResource: UseResource",
2755
2763
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2756
2764
  "useSessions: UseSessions",
2757
2765
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -2772,7 +2780,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2772
2780
  occupants: [],
2773
2781
  replaceRisk: "none",
2774
2782
  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}",
2775
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:133"
2783
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:171"
2776
2784
  },
2777
2785
  {
2778
2786
  key: "conversation.input.model",
@@ -2784,6 +2792,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2784
2792
  ownerProps: ["/** Owner share of the named plan and model controls. */\nexport interface InputControlOwnerProps {\n /** Whether the composer currently refuses interaction. */\n locked: boolean\n}"],
2785
2793
  ownerPropsReferences: [],
2786
2794
  standardProps: [
2795
+ "useResource: UseResource",
2787
2796
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2788
2797
  "useSessions: UseSessions",
2789
2798
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -2804,7 +2813,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2804
2813
  occupants: ["client-ui-model-selection ModelSelect"],
2805
2814
  replaceRisk: "shadows-shipped-ui",
2806
2815
  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}",
2807
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:147"
2816
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:185"
2808
2817
  },
2809
2818
  {
2810
2819
  key: "conversation.input.overlay",
@@ -2835,6 +2844,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2835
2844
  ownerProps: [],
2836
2845
  ownerPropsReferences: [],
2837
2846
  standardProps: [
2847
+ "useResource: UseResource",
2838
2848
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2839
2849
  "useSessions: UseSessions",
2840
2850
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -2855,7 +2865,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2855
2865
  occupants: ["client-ui-commands PopupSelectView id 'command-popup'", "client-ui-input-trigger MenuView id 'slash-menu'"],
2856
2866
  replaceRisk: "none",
2857
2867
  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}",
2858
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:129"
2868
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:167"
2859
2869
  },
2860
2870
  {
2861
2871
  key: "conversation.input.plan",
@@ -2867,6 +2877,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2867
2877
  ownerProps: ["/** Owner share of the named plan and model controls. */\nexport interface InputControlOwnerProps {\n /** Whether the composer currently refuses interaction. */\n locked: boolean\n}"],
2868
2878
  ownerPropsReferences: [],
2869
2879
  standardProps: [
2880
+ "useResource: UseResource",
2870
2881
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2871
2882
  "useSessions: UseSessions",
2872
2883
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -2887,7 +2898,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2887
2898
  occupants: ["client-ui-plan PlanChip"],
2888
2899
  replaceRisk: "shadows-shipped-ui",
2889
2900
  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}",
2890
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:145"
2901
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:183"
2891
2902
  },
2892
2903
  {
2893
2904
  key: "conversation.input.right",
@@ -2918,6 +2929,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2918
2929
  ownerProps: [],
2919
2930
  ownerPropsReferences: [],
2920
2931
  standardProps: [
2932
+ "useResource: UseResource",
2921
2933
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2922
2934
  "useSessions: UseSessions",
2923
2935
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -2938,7 +2950,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2938
2950
  occupants: [],
2939
2951
  replaceRisk: "none",
2940
2952
  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}",
2941
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:135"
2953
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:173"
2942
2954
  },
2943
2955
  {
2944
2956
  key: "conversation.message.images",
@@ -2947,13 +2959,14 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2947
2959
  summary: "Renderer for one consecutive group of durable message images.",
2948
2960
  doc: "Renderer for one consecutive group of durable message images. The owner\nsupplies image references, an authorized loader, and alignment. A\nregistration replaces the shipped gallery; without one, images are omitted.",
2949
2961
  registerOptions: [],
2950
- ownerProps: ["/** Message image group handed to the optional attachment presentation plugin. */\nexport interface MessageImagesOwnerProps {\n /** Durable references or submission-echo previews in source order. */\n images: readonly MessageImageSource[]\n /** Session-authorized image URL loader for the durable arm. */\n loadImage: MessageImageLoader\n /** Horizontal placement inside the owning record. */\n align: 'start' | 'end'\n}"],
2962
+ ownerProps: ["/** Message image group handed to the optional attachment presentation plugin. */\nexport interface MessageImagesOwnerProps {\n /** Durable references or submission-echo previews in source order. */\n images: readonly MessageImageSource[]\n /** Session-authorized image URL loader for the durable arm. */\n loadImage: MessageImageLoader\n /** Horizontal placement inside the owning record. */\n align: 'start' | 'end'\n /** Force every image into the compact message-attachment tile size. */\n compact?: boolean\n}"],
2951
2963
  ownerPropsReferences: [
2952
2964
  "Message",
2953
2965
  "MessageImageLoader",
2954
2966
  "MessageImageSource"
2955
2967
  ],
2956
2968
  standardProps: [
2969
+ "useResource: UseResource",
2957
2970
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2958
2971
  "useSessions: UseSessions",
2959
2972
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -2974,7 +2987,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2974
2987
  occupants: ["client-ui-attachment MessageImages"],
2975
2988
  replaceRisk: "shadows-shipped-ui",
2976
2989
  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}",
2977
- source: "packages/client/ui-chat/src/client/contract/slots.ts:203"
2990
+ source: "packages/client/ui-chat/src/client/contract/slots.ts:194"
2978
2991
  },
2979
2992
  {
2980
2993
  key: "conversation.session",
@@ -2986,6 +2999,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
2986
2999
  ownerProps: [],
2987
3000
  ownerPropsReferences: [],
2988
3001
  standardProps: [
3002
+ "useResource: UseResource",
2989
3003
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
2990
3004
  "useSessions: UseSessions",
2991
3005
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3006,7 +3020,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3006
3020
  occupants: ["client-ui-conversation ConversationSession"],
3007
3021
  replaceRisk: "shadows-shipped-ui",
3008
3022
  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}",
3009
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:95"
3023
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:121"
3010
3024
  },
3011
3025
  {
3012
3026
  key: "conversation.session.header",
@@ -3018,6 +3032,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3018
3032
  ownerProps: [],
3019
3033
  ownerPropsReferences: [],
3020
3034
  standardProps: [
3035
+ "useResource: UseResource",
3021
3036
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3022
3037
  "useSessions: UseSessions",
3023
3038
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3038,7 +3053,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3038
3053
  occupants: ["client-ui-conversation ConversationSessionHeader"],
3039
3054
  replaceRisk: "shadows-shipped-ui",
3040
3055
  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}",
3041
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:97"
3056
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:123"
3042
3057
  },
3043
3058
  {
3044
3059
  key: "conversation.session.header.actions",
@@ -3069,6 +3084,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3069
3084
  ownerProps: ["/** Header actions derive their state from standard Session props. */\nexport interface ConversationHeaderActionOwnerProps {\n /** Marker field: entries receive no owner-specific values. */\n children?: never\n}"],
3070
3085
  ownerPropsReferences: [],
3071
3086
  standardProps: [
3087
+ "useResource: UseResource",
3072
3088
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3073
3089
  "useSessions: UseSessions",
3074
3090
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3094,7 +3110,40 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3094
3110
  ],
3095
3111
  replaceRisk: "none",
3096
3112
  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}",
3097
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:105"
3113
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:131"
3114
+ },
3115
+ {
3116
+ key: "conversation.session.header.corner",
3117
+ kind: "single",
3118
+ scope: "session",
3119
+ summary: "The header's far-right corner, past the utilities' edge and into the header's own padding, for one control that must keep its place whether or not it currently shows anything.",
3120
+ doc: "The header's far-right corner, past the utilities' edge and into the\nheader's own padding, for one control that must keep its place whether or\nnot it currently shows anything. The corner reserves its width while an\noccupant is registered, so the utilities beside it never move; an\noccupant with nothing to show renders a same-size placeholder.",
3121
+ registerOptions: [],
3122
+ ownerProps: ["/** The header corner's occupant derives its state from standard Session props. */\nexport interface ConversationHeaderCornerOwnerProps {\n /** Marker field: the occupant receives no owner-specific values. */\n children?: never\n}"],
3123
+ ownerPropsReferences: [],
3124
+ standardProps: [
3125
+ "useResource: UseResource",
3126
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3127
+ "useSessions: UseSessions",
3128
+ "useSessionPendingInteraction: UseSessionPendingInteraction",
3129
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3130
+ "useChat: UseChat",
3131
+ "useConversation: UseConversation",
3132
+ "useInput: SnapshotSelectorHook<InputState>",
3133
+ "inputActions: InputActions",
3134
+ "useSession: SessionSnapshotSelector",
3135
+ "sessionId: SessionId",
3136
+ "useProjection: UseProjection",
3137
+ "useTrajectory: UseTrajectory"
3138
+ ],
3139
+ keyDomain: "",
3140
+ hookContext: "",
3141
+ slotInject: "",
3142
+ declaredBy: "an entry in 'conversation.session.header' (client-ui-conversation), so it exists while that entry is mounted",
3143
+ occupants: ["client-ui-sidebar-right ExpandButton"],
3144
+ replaceRisk: "shadows-shipped-ui",
3145
+ 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}",
3146
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:149"
3098
3147
  },
3099
3148
  {
3100
3149
  key: "conversation.session.header.lineage",
@@ -3106,6 +3155,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3106
3155
  ownerProps: ["/** Plain breadcrumb data handed to the optional lineage renderer. */\nexport interface ConversationHeaderLineageOwnerProps {\n /** Session represented by this breadcrumb title. */\n lineageSessionId: SessionId\n /** Display title available to a combined title/control renderer. */\n displayTitle: string\n /** Navigate to an ancestor title when present. */\n openTitle?: () => void\n}"],
3107
3156
  ownerPropsReferences: ["SessionId"],
3108
3157
  standardProps: [
3158
+ "useResource: UseResource",
3109
3159
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3110
3160
  "useSessions: UseSessions",
3111
3161
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3126,7 +3176,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3126
3176
  occupants: ["client-ui-subagent SubagentHeaderLineage"],
3127
3177
  replaceRisk: "shadows-shipped-ui",
3128
3178
  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}",
3129
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:99"
3179
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:125"
3130
3180
  },
3131
3181
  {
3132
3182
  key: "conversation.session.header.utilities",
@@ -3157,6 +3207,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3157
3207
  ownerProps: ["/** Header actions derive their state from standard Session props. */\nexport interface ConversationHeaderActionOwnerProps {\n /** Marker field: entries receive no owner-specific values. */\n children?: never\n}"],
3158
3208
  ownerPropsReferences: [],
3159
3209
  standardProps: [
3210
+ "useResource: UseResource",
3160
3211
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3161
3212
  "useSessions: UseSessions",
3162
3213
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3174,10 +3225,10 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3174
3225
  hookContext: "",
3175
3226
  slotInject: "",
3176
3227
  declaredBy: "an entry in 'conversation.session.header' (client-ui-conversation), so it exists while that entry is mounted",
3177
- occupants: ["session-log-export SessionLogDownloadHeaderAction id 'session-log-download'"],
3228
+ occupants: ["client-ui-open-in-app OpenInAppAction id 'open-in-app'", "session-log-export SessionLogDownloadHeaderAction id 'session-log-download'"],
3178
3229
  replaceRisk: "none",
3179
3230
  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}",
3180
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:111"
3231
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:137"
3181
3232
  },
3182
3233
  {
3183
3234
  key: "conversation.trajectory.images",
@@ -3186,13 +3237,14 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3186
3237
  summary: "Renderer for one group of durable record images in the Trajectory ledger.",
3187
3238
  doc: "Renderer for one group of durable record images in the Trajectory\nledger. The owner supplies image references, an authorized loader, and\nalignment. A registration replaces the shipped gallery; without one,\nimages are omitted.",
3188
3239
  registerOptions: [],
3189
- ownerProps: ["/** Message image group handed to the optional attachment presentation plugin. */\nexport interface MessageImagesOwnerProps {\n /** Durable references or submission-echo previews in source order. */\n images: readonly MessageImageSource[]\n /** Session-authorized image URL loader for the durable arm. */\n loadImage: MessageImageLoader\n /** Horizontal placement inside the owning record. */\n align: 'start' | 'end'\n}"],
3240
+ ownerProps: ["/** Message image group handed to the optional attachment presentation plugin. */\nexport interface MessageImagesOwnerProps {\n /** Durable references or submission-echo previews in source order. */\n images: readonly MessageImageSource[]\n /** Session-authorized image URL loader for the durable arm. */\n loadImage: MessageImageLoader\n /** Horizontal placement inside the owning record. */\n align: 'start' | 'end'\n /** Force every image into the compact message-attachment tile size. */\n compact?: boolean\n}"],
3190
3241
  ownerPropsReferences: [
3191
3242
  "Message",
3192
3243
  "MessageImageLoader",
3193
3244
  "MessageImageSource"
3194
3245
  ],
3195
3246
  standardProps: [
3247
+ "useResource: UseResource",
3196
3248
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3197
3249
  "useSessions: UseSessions",
3198
3250
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3213,7 +3265,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3213
3265
  occupants: ["client-ui-attachment MessageImages"],
3214
3266
  replaceRisk: "shadows-shipped-ui",
3215
3267
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('conversation.trajectory.images', () => ctx.slots.register(\n { name: 'conversation.trajectory.images' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
3216
- source: "packages/client/ui-trajectory/src/client/trajectory-contract.ts:95"
3268
+ source: "packages/client/ui-trajectory/src/client/trajectory-contract.ts:98"
3217
3269
  },
3218
3270
  {
3219
3271
  key: "conversation.view",
@@ -3244,6 +3296,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3244
3296
  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}"],
3245
3297
  ownerPropsReferences: ["ConversationViewRequest"],
3246
3298
  standardProps: [
3299
+ "useResource: UseResource",
3247
3300
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3248
3301
  "useSessions: UseSessions",
3249
3302
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3264,18 +3317,19 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3264
3317
  occupants: ["client-ui-chat ChatView id 'chat'", "client-ui-trajectory TrajectoryView id 'trajectory'"],
3265
3318
  replaceRisk: "none",
3266
3319
  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}",
3267
- source: "packages/client/ui-conversation/src/client/contract/slots.ts:117"
3320
+ source: "packages/client/ui-conversation/src/client/contract/slots.ts:155"
3268
3321
  },
3269
3322
  {
3270
- key: "details",
3323
+ key: "rightbar",
3271
3324
  kind: "single",
3272
3325
  scope: "session",
3273
- summary: "The right details column, shown when the layout opens it.",
3274
- doc: "The right details column, shown when the layout opens it. OCCUPIED by\nui-conversation's DetailsPanel, which declares the tool-details seat\ninside it — registering here replaces the column and takes that seat\nwith it. Absent an occupant the column renders nothing.\n\nNo owner props: the framework injects the session id and hooks for the\n`session` scope, and `ctx.layout` owns whether the column is open.",
3326
+ summary: "The right column: a track the centre makes room for, or nothing.",
3327
+ doc: "The right column: a track the centre makes room for, or nothing. OCCUPIED\nby the right Sidebar, which uses the resolved column width in normal\nmode and covers the viewport in fullscreen, retaining the wide-screen\ncolumn reservation underneath.\n\nWhether the panel is shown, and whether it takes a track, is the\noccupant's own recorded business — it reports the composition of its\nexpanded and presentation state through `ctx.layout`, and the frame sizes\nthe track and places the resize handle from that. The expand control is\nnot this column's: it is a button in the conversation header. With no\ncurrent session nothing is mounted here.",
3275
3328
  registerOptions: [],
3276
- ownerProps: ["/** Details owner share: empty — sessionId arrives as a framework-standard prop. */\nexport interface DetailsOwnerProps {}"],
3329
+ 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}"],
3277
3330
  ownerPropsReferences: [],
3278
3331
  standardProps: [
3332
+ "useResource: UseResource",
3279
3333
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3280
3334
  "useSessions: UseSessions",
3281
3335
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3293,10 +3347,10 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3293
3347
  hookContext: "",
3294
3348
  slotInject: "",
3295
3349
  declaredBy: "an entry in 'root' (client-ui-layout), so it exists while that entry is mounted",
3296
- occupants: ["client-ui-chat DetailsPanel"],
3350
+ occupants: ["client-ui-sidebar-right RightbarSeat"],
3297
3351
  replaceRisk: "shadows-shipped-ui",
3298
- example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('details', () => ctx.slots.register(\n { name: 'details' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
3299
- source: "packages/client/ui-layout/src/client/index.ts:75"
3352
+ example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('rightbar', () => ctx.slots.register(\n { name: 'rightbar' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
3353
+ source: "packages/client/ui-layout/src/client/index.ts:79"
3300
3354
  },
3301
3355
  {
3302
3356
  key: "root",
@@ -3308,6 +3362,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3308
3362
  ownerProps: ["/** Root owner share: the shell supplies nothing — the frame is inject-assembled. */\nexport interface RootOwnerProps { children?: never }"],
3309
3363
  ownerPropsReferences: [],
3310
3364
  standardProps: [
3365
+ "useResource: UseResource",
3311
3366
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3312
3367
  "useSessions: UseSessions",
3313
3368
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3351,6 +3406,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3351
3406
  ownerProps: ["/** Owner share of the header title seat (the shell supplies nothing). */\nexport interface SettingsHeaderOwnerProps {\n /** Marker field: header owner props are intentionally empty. */\n children?: never\n}"],
3352
3407
  ownerPropsReferences: [],
3353
3408
  standardProps: [
3409
+ "useResource: UseResource",
3354
3410
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3355
3411
  "useSessions: UseSessions",
3356
3412
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3375,6 +3431,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3375
3431
  ownerProps: ["/** Owner share of the header title seat (the shell supplies nothing). */\nexport interface SettingsHeaderOwnerProps {\n /** Marker field: header owner props are intentionally empty. */\n children?: never\n}"],
3376
3432
  ownerPropsReferences: [],
3377
3433
  standardProps: [
3434
+ "useResource: UseResource",
3378
3435
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3379
3436
  "useSessions: UseSessions",
3380
3437
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3418,6 +3475,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3418
3475
  ownerProps: ["/** Owner share of a General preference row (the section supplies nothing). */\nexport interface SettingsGeneralItemOwnerProps {\n /** Marker field: item owner props are intentionally empty. */\n children?: never\n}"],
3419
3476
  ownerPropsReferences: [],
3420
3477
  standardProps: [
3478
+ "useResource: UseResource",
3421
3479
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3422
3480
  "useSessions: UseSessions",
3423
3481
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3449,6 +3507,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3449
3507
  ownerProps: ["/** Owner share of the header title seat (the shell supplies nothing). */\nexport interface SettingsHeaderOwnerProps {\n /** Marker field: header owner props are intentionally empty. */\n children?: never\n}"],
3450
3508
  ownerPropsReferences: [],
3451
3509
  standardProps: [
3510
+ "useResource: UseResource",
3452
3511
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3453
3512
  "useSessions: UseSessions",
3454
3513
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3492,6 +3551,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3492
3551
  ownerProps: ["/** Owner share of the footer area (the section supplies nothing). */\nexport interface ModelsFooterOwnerProps {\n /** Marker field: footer owner props are intentionally empty. */\n children?: never\n}"],
3493
3552
  ownerPropsReferences: [],
3494
3553
  standardProps: [
3554
+ "useResource: UseResource",
3495
3555
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3496
3556
  "useSessions: UseSessions",
3497
3557
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3521,6 +3581,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3521
3581
  ownerProps: ["/** Owner share of one provider-card extension occurrence. */\nexport interface ProviderCardExtrasOwnerProps {\n /** The card's directory row (route id, display name, settings address, live state). */\n provider: ProviderDirectoryEntry\n /** Whether any layer configures this provider (its profile resolves); `false` while the add-provider draft edits a dormant row. */\n configured: boolean\n /** Whether the row's referenced api-key credential is confirmed configured (the page's credential join). */\n keyConfigured: boolean\n}"],
3522
3582
  ownerPropsReferences: ["ProviderDirectoryEntry"],
3523
3583
  standardProps: [
3584
+ "useResource: UseResource",
3524
3585
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3525
3586
  "useSessions: UseSessions",
3526
3587
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3564,6 +3625,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3564
3625
  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}"],
3565
3626
  ownerPropsReferences: [],
3566
3627
  standardProps: [
3628
+ "useResource: UseResource",
3567
3629
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3568
3630
  "useSessions: UseSessions",
3569
3631
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3593,6 +3655,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3593
3655
  ownerProps: ["/** Owner share of a plugin card (the section supplies nothing). */\nexport interface SettingsPluginItemOwnerProps {\n /** Marker field: card owner props are intentionally empty. */\n children?: never\n}"],
3594
3656
  ownerPropsReferences: [],
3595
3657
  standardProps: [
3658
+ "useResource: UseResource",
3596
3659
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3597
3660
  "useSessions: UseSessions",
3598
3661
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3641,6 +3704,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3641
3704
  ownerProps: ["/** Owner share of a Plugins tab (the section supplies nothing). */\nexport interface SettingsPluginsTabOwnerProps {\n /** Marker field: tab owner props are intentionally empty. */\n children?: never\n}"],
3642
3705
  ownerPropsReferences: [],
3643
3706
  standardProps: [
3707
+ "useResource: UseResource",
3644
3708
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3645
3709
  "useSessions: UseSessions",
3646
3710
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3684,6 +3748,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3684
3748
  ownerProps: ["/**\n * Owner share of a settings section entry. The shell owns modal visibility\n * and navigation; a section's data arrives through its own inject faces and\n * stores. `close` is the one shell affordance a section receives, for flows\n * that leave settings altogether (starting a session from a section) — the\n * onboarding coordinator's `openSection`/`complete` precedent, inverted.\n */\nexport interface SettingsSectionOwnerProps {\n /** Close the settings panel (the shell owns the open state). */\n close: () => void\n}"],
3685
3749
  ownerPropsReferences: [],
3686
3750
  standardProps: [
3751
+ "useResource: UseResource",
3687
3752
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3688
3753
  "useSessions: UseSessions",
3689
3754
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3713,6 +3778,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3713
3778
  ownerProps: ["/** Owner share of the trigger content seat: the sidebar column state. */\nexport interface SettingsTriggerOwnerProps {\n /** Whether the sidebar renders wide content (false = 56px rail, icon only). */\n wide: boolean\n}"],
3714
3779
  ownerPropsReferences: [],
3715
3780
  standardProps: [
3781
+ "useResource: UseResource",
3716
3782
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3717
3783
  "useSessions: UseSessions",
3718
3784
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3756,6 +3822,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3756
3822
  ownerProps: [],
3757
3823
  ownerPropsReferences: [],
3758
3824
  standardProps: [
3825
+ "useResource: UseResource",
3759
3826
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3760
3827
  "useSessions: UseSessions",
3761
3828
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3768,7 +3835,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3768
3835
  occupants: [],
3769
3836
  replaceRisk: "none",
3770
3837
  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}",
3771
- source: "packages/client/ui-layout/src/client/index.ts:86"
3838
+ source: "packages/client/ui-layout/src/client/index.ts:90"
3772
3839
  },
3773
3840
  {
3774
3841
  key: "sidebar",
@@ -3780,6 +3847,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3780
3847
  ownerProps: ["/** Sidebar owner share: live column state from the frame's concession solve. */\nexport interface SidebarOwnerProps {\n /** True when the sidebar is closed (the column renders the compact control rail). */\n collapsed: boolean\n /** Rendered column width in px (SIDEBAR_COLLAPSED when collapsed). */\n width: number\n}"],
3781
3848
  ownerPropsReferences: [],
3782
3849
  standardProps: [
3850
+ "useResource: UseResource",
3783
3851
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3784
3852
  "useSessions: UseSessions",
3785
3853
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3804,6 +3872,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3804
3872
  ownerProps: ["/** Geometry supplied to the sidebar brand-mark occupant. */\nexport interface SidebarBrandMarkOwnerProps {\n /** Requested square edge in pixels. */\n size: number\n}"],
3805
3873
  ownerPropsReferences: [],
3806
3874
  standardProps: [
3875
+ "useResource: UseResource",
3807
3876
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3808
3877
  "useSessions: UseSessions",
3809
3878
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3828,6 +3897,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3828
3897
  ownerProps: ["/** Empty owner share for the sidebar brand-name occupant. */\nexport interface SidebarBrandNameOwnerProps {\n /** Marker field: the occupant owns its own content and width. */\n children?: never\n}"],
3829
3898
  ownerPropsReferences: [],
3830
3899
  standardProps: [
3900
+ "useResource: UseResource",
3831
3901
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3832
3902
  "useSessions: UseSessions",
3833
3903
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3871,6 +3941,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3871
3941
  ownerProps: ["/** Owner share of an action rendered beside Settings at the sidebar foot. */\nexport interface SidebarFooterActionOwnerProps {\n /** Whether the sidebar renders wide content (false = 56px rail). */\n wide: boolean\n}"],
3872
3942
  ownerPropsReferences: [],
3873
3943
  standardProps: [
3944
+ "useResource: UseResource",
3874
3945
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3875
3946
  "useSessions: UseSessions",
3876
3947
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3885,6 +3956,176 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3885
3956
  example: "return {\n inject: ['slots'],\n apply(ctx) {\n ctx.slots.inject('sidebar.footer.action', () => ctx.slots.register(\n { name: 'sidebar.footer.action', id: 'my-entry', order: 100, label: 'My entry' },\n () => React.createElement('div', null, 'hello'),\n ))\n },\n}",
3886
3957
  source: "packages/client/ui-sidebar/src/client/contract/slots.ts:46"
3887
3958
  },
3959
+ {
3960
+ key: "sidebar.right.pane.tab",
3961
+ kind: "keyed",
3962
+ scope: "session",
3963
+ summary: "One tab's body, dispatched with the `id` of the type in force for `tab.kind`.",
3964
+ doc: "One tab's body, dispatched with the `id` of the type in force for\n`tab.kind`. A tab type registers here under its definition's `id` and\nreceives every tab of that kind, in every pane, docked or floating. A kind\nwith no type in force renders the owner's \"nothing can view this\" notice\nrather than an empty pane.",
3965
+ registerOptions: [{
3966
+ name: "key",
3967
+ requirement: "required",
3968
+ type: "string",
3969
+ doc: "Your cell key: the entry renders where the owner dispatches this exact key. Registering an already-occupied key replaces that occupant."
3970
+ }],
3971
+ ownerProps: [],
3972
+ ownerPropsReferences: [],
3973
+ standardProps: [
3974
+ "useResource: UseResource",
3975
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3976
+ "useSessions: UseSessions",
3977
+ "useSessionPendingInteraction: UseSessionPendingInteraction",
3978
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3979
+ "useChat: UseChat",
3980
+ "useConversation: UseConversation",
3981
+ "useInput: SnapshotSelectorHook<InputState>",
3982
+ "inputActions: InputActions",
3983
+ "useSession: SessionSnapshotSelector",
3984
+ "sessionId: SessionId",
3985
+ "useProjection: UseProjection",
3986
+ "useTrajectory: UseTrajectory"
3987
+ ],
3988
+ keyDomain: "open: any string the owner dispatches (no compile-time key set), none are taken yet",
3989
+ hookContext: "TabHookContext",
3990
+ slotInject: "SidebarRightTabInjected",
3991
+ declaredBy: "an entry in 'rightbar' (client-ui-sidebar-right), so it exists while that entry is mounted",
3992
+ occupants: [
3993
+ "client-ui-sidebar-files FilesBody",
3994
+ "client-ui-sidebar-right GuideBody",
3995
+ "client-ui-sidebar-textpreview TextPreview"
3996
+ ],
3997
+ replaceRisk: "none",
3998
+ 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}",
3999
+ source: "packages/client/ui-sidebar-right/src/client/contract/slots.ts:47"
4000
+ },
4001
+ {
4002
+ key: "sidebar.right.pane.tab.title",
4003
+ kind: "keyed",
4004
+ scope: "session",
4005
+ summary: "A tab's title as its chip (and a floating panel's header) shows it, dispatched with the same key and information hook as the body.",
4006
+ doc: "A tab's title as its chip (and a floating panel's header) shows it,\ndispatched with the same key and information hook as the body. A type with a\nlive title — a terminal named after its shell, a chat after its first\nline — registers here and reads its own store; one without registers\nnothing and the chip shows the registry's `title(address)` text captured\nat open time.",
4007
+ registerOptions: [{
4008
+ name: "key",
4009
+ requirement: "required",
4010
+ type: "string",
4011
+ doc: "Your cell key: the entry renders where the owner dispatches this exact key. Registering an already-occupied key replaces that occupant."
4012
+ }],
4013
+ ownerProps: [],
4014
+ ownerPropsReferences: [],
4015
+ standardProps: [
4016
+ "useResource: UseResource",
4017
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
4018
+ "useSessions: UseSessions",
4019
+ "useSessionPendingInteraction: UseSessionPendingInteraction",
4020
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
4021
+ "useChat: UseChat",
4022
+ "useConversation: UseConversation",
4023
+ "useInput: SnapshotSelectorHook<InputState>",
4024
+ "inputActions: InputActions",
4025
+ "useSession: SessionSnapshotSelector",
4026
+ "sessionId: SessionId",
4027
+ "useProjection: UseProjection",
4028
+ "useTrajectory: UseTrajectory"
4029
+ ],
4030
+ keyDomain: "open: any string the owner dispatches (no compile-time key set), none are taken yet",
4031
+ hookContext: "TabHookContext",
4032
+ slotInject: "SidebarRightTabInjected",
4033
+ declaredBy: "an entry in 'rightbar' (client-ui-sidebar-right), so it exists while that entry is mounted",
4034
+ occupants: [],
4035
+ replaceRisk: "none",
4036
+ 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}",
4037
+ source: "packages/client/ui-sidebar-right/src/client/contract/slots.ts:61"
4038
+ },
4039
+ {
4040
+ key: "sidebar.right.tab.guide",
4041
+ kind: "chain",
4042
+ scope: "session",
4043
+ summary: "The guide tab's body.",
4044
+ doc: "The guide tab's body. Selectors run in chain order and the first\nnon-declining entry replaces the shipped guide entirely; with no entry, or\nwith every entry declining, the shipped guide renders.",
4045
+ registerOptions: [{
4046
+ name: "select",
4047
+ requirement: "required",
4048
+ type: "(owner) => unknown | null",
4049
+ doc: "Pure routing selector. Entries are tried in ascending order; the first non-null result wins and arrives as the component's `matched` prop. All-null falls through to the owner's fallback."
4050
+ }],
4051
+ ownerProps: [],
4052
+ ownerPropsReferences: [],
4053
+ standardProps: [
4054
+ "useResource: UseResource",
4055
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
4056
+ "useSessions: UseSessions",
4057
+ "useSessionPendingInteraction: UseSessionPendingInteraction",
4058
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
4059
+ "useChat: UseChat",
4060
+ "useConversation: UseConversation",
4061
+ "useInput: SnapshotSelectorHook<InputState>",
4062
+ "inputActions: InputActions",
4063
+ "useSession: SessionSnapshotSelector",
4064
+ "sessionId: SessionId",
4065
+ "useProjection: UseProjection",
4066
+ "useTrajectory: UseTrajectory"
4067
+ ],
4068
+ keyDomain: "",
4069
+ hookContext: "UseSidebarRightTabInfo",
4070
+ slotInject: "{ hooks: { tabInfo: SlotHookFactory<'sidebar.right.tab.guide', UseSidebarRightTabInfo> } }",
4071
+ declaredBy: "an entry in 'sidebar.right.pane.tab' (client-ui-sidebar-right), so it exists while that entry is mounted",
4072
+ occupants: [],
4073
+ replaceRisk: "none",
4074
+ 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}",
4075
+ source: "packages/client/ui-sidebar-right/src/client/contract/slots.ts:72"
4076
+ },
4077
+ {
4078
+ key: "sidebar.right.tab.menu.item",
4079
+ kind: "list",
4080
+ scope: "session",
4081
+ summary: "Extra items at the end of one tab's actions menu, in registration order.",
4082
+ doc: "Extra items at the end of one tab's actions menu, in registration order.\nEntries decide their own visibility from the tab they are given. Without a\nregistrant the menu shows only the kit's own layout actions.",
4083
+ registerOptions: [
4084
+ {
4085
+ name: "id",
4086
+ requirement: "required",
4087
+ type: "string",
4088
+ 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."
4089
+ },
4090
+ {
4091
+ name: "order",
4092
+ requirement: "optional",
4093
+ type: "number",
4094
+ doc: "Position among the entries, ascending (default 0)."
4095
+ },
4096
+ {
4097
+ name: "label",
4098
+ requirement: "optional",
4099
+ type: "string | (() => string)",
4100
+ 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."
4101
+ }
4102
+ ],
4103
+ ownerProps: ["/** Owner share of one tab-menu item occurrence. */\nexport interface SidebarRightTabMenuOwnerProps {\n /** The tab whose menu is open. */\n tab: TabRecord\n /**\n * Dismiss the menu.\n *\n * An item that acts MUST call this: the menu is the kit's, and it closes on\n * its own actions only. An item that leaves it open leaves a menu floating\n * over content the action may have just replaced.\n */\n dismiss: () => void\n}"],
4104
+ ownerPropsReferences: ["TabRecord"],
4105
+ standardProps: [
4106
+ "useResource: UseResource",
4107
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
4108
+ "useSessions: UseSessions",
4109
+ "useSessionPendingInteraction: UseSessionPendingInteraction",
4110
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
4111
+ "useChat: UseChat",
4112
+ "useConversation: UseConversation",
4113
+ "useInput: SnapshotSelectorHook<InputState>",
4114
+ "inputActions: InputActions",
4115
+ "useSession: SessionSnapshotSelector",
4116
+ "sessionId: SessionId",
4117
+ "useProjection: UseProjection",
4118
+ "useTrajectory: UseTrajectory"
4119
+ ],
4120
+ keyDomain: "",
4121
+ hookContext: "",
4122
+ slotInject: "",
4123
+ declaredBy: "an entry in 'rightbar' (client-ui-sidebar-right), so it exists while that entry is mounted",
4124
+ occupants: [],
4125
+ replaceRisk: "none",
4126
+ 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}",
4127
+ source: "packages/client/ui-sidebar-right/src/client/contract/slots.ts:83"
4128
+ },
3888
4129
  {
3889
4130
  key: "sidebar.settings",
3890
4131
  kind: "single",
@@ -3895,6 +4136,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3895
4136
  ownerProps: ["/**\n * Owner share of the sidebar settings seat: the column display state the\n * occupant's trigger row must render against (wide row vs rail icon).\n */\nexport interface SidebarSettingsOwnerProps {\n /** Whether the sidebar renders wide content (false = 56px rail). */\n wide: boolean\n}"],
3896
4137
  ownerPropsReferences: [],
3897
4138
  standardProps: [
4139
+ "useResource: UseResource",
3898
4140
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3899
4141
  "useSessions: UseSessions",
3900
4142
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3919,6 +4161,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3919
4161
  ownerProps: ["/**\n * Owner share of the browser hole — the only facts crossing the shell/region\n * boundary. Business data and actions arrive through the region's own inject.\n */\nexport interface SidebarSectionOwnerProps {\n /** Shell fold-state output: wide renders the full browser, rail the icon column. */\n wide: boolean\n /** Rail icons request expansion; the browser rides the wide flip for focus. */\n expandSidebar: () => void\n}"],
3920
4162
  ownerPropsReferences: [],
3921
4163
  standardProps: [
4164
+ "useResource: UseResource",
3922
4165
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3923
4166
  "useSessions: UseSessions",
3924
4167
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3943,6 +4186,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3943
4186
  ownerProps: ["/**\n * Owner share of the directory-flow holes: the complete conversation between\n * the trigger surface and the picking interaction. The occupant reads `open`\n * to run/render its interaction and reports exactly one outcome per open.\n */\nexport interface DirectoryFlowOwnerProps {\n /** True while a picking interaction is requested; flipping back to false withdraws the request. */\n open: boolean\n /** True while the owner adopts a picked path (`createWorkspace` in flight); occupants disable their commit affordances. */\n busy: boolean\n /** The operator picked a directory (absolute host path); the owner adopts it. */\n onPicked: (path: string) => void\n /** The operator dismissed the interaction; the owner just closes the flow. */\n onCancel: () => void\n /** The interaction itself failed (chooser missing, listing denied); the owner shows its error surface. */\n onError: (message: string) => void\n}"],
3944
4187
  ownerPropsReferences: [],
3945
4188
  standardProps: [
4189
+ "useResource: UseResource",
3946
4190
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3947
4191
  "useSessions: UseSessions",
3948
4192
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3957,6 +4201,39 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3957
4201
  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}",
3958
4202
  source: "packages/client/ui-workspace/src/client/contract/slots.ts:59"
3959
4203
  },
4204
+ {
4205
+ key: "tool.call.images",
4206
+ kind: "single",
4207
+ scope: "session",
4208
+ summary: "Durable images of a settled image-bearing Tool call, rendered through the attachment presentation plugin.",
4209
+ doc: "Durable images of a settled image-bearing Tool call, rendered through\nthe attachment presentation plugin. The Tool layer never imports an\nattachment implementation: a toolview declares this slot as a child and\nrenders it with the image card's references plus the session-authorized\nloader it received in its owner, and the attachment plugin fills the\ngallery. Composing no attachment presentation plugin renders nothing,\nwhich is why the image card keeps its own envelope text beside the\ngallery. A child slot is declared by exactly one entry: registering a\nsecond toolview that declares the same child throws at load, so a\nfuture image-bearing tool must reuse this entry or own a distinct\nslot.",
4210
+ registerOptions: [],
4211
+ ownerProps: ["/** Owner currency of the Tool image gallery slot: references plus the loader. */\nexport interface ToolImagesOwnerProps {\n /** Durable references or submission-echo previews in result order. */\n images: readonly MessageImageSource[]\n /** Session-authorized image URL loader for the durable arm. */\n loadImage: MessageImageLoader\n /** Horizontal placement inside the owning record. */\n align: 'start' | 'end'\n}"],
4212
+ ownerPropsReferences: ["MessageImageLoader", "MessageImageSource"],
4213
+ standardProps: [
4214
+ "useResource: UseResource",
4215
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
4216
+ "useSessions: UseSessions",
4217
+ "useSessionPendingInteraction: UseSessionPendingInteraction",
4218
+ "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
4219
+ "useChat: UseChat",
4220
+ "useConversation: UseConversation",
4221
+ "useInput: SnapshotSelectorHook<InputState>",
4222
+ "inputActions: InputActions",
4223
+ "useSession: SessionSnapshotSelector",
4224
+ "sessionId: SessionId",
4225
+ "useProjection: UseProjection",
4226
+ "useTrajectory: UseTrajectory"
4227
+ ],
4228
+ keyDomain: "",
4229
+ hookContext: "",
4230
+ slotInject: "",
4231
+ declaredBy: "an entry in 'tool.call.toolview' (client-ui-tool), so it exists while that entry is mounted",
4232
+ occupants: ["client-ui-attachment MessageImages"],
4233
+ replaceRisk: "shadows-shipped-ui",
4234
+ 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}",
4235
+ source: "packages/client/ui-tool/src/client/contract/slots.ts:40"
4236
+ },
3960
4237
  {
3961
4238
  key: "tool.call.toolview",
3962
4239
  kind: "keyed",
@@ -3969,9 +4246,14 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3969
4246
  type: "string",
3970
4247
  doc: "Your cell key: the entry renders where the owner dispatches this exact key. Registering an already-occupied key replaces that occupant."
3971
4248
  }],
3972
- 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 /** Open a Tool argument path through the Host. */\n openFile: (path: string) => void\n /** Inspect this call in the trajectory view when available. */\n inspect?: (() => void) | undefined\n}"],
3973
- ownerPropsReferences: [],
4249
+ 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}"],
4250
+ ownerPropsReferences: [
4251
+ "ChatNodeOwnerProps",
4252
+ "MessageImageLoader",
4253
+ "OpenFileOptions"
4254
+ ],
3974
4255
  standardProps: [
4256
+ "useResource: UseResource",
3975
4257
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
3976
4258
  "useSessions: UseSessions",
3977
4259
  "useSessionPendingInteraction: UseSessionPendingInteraction",
@@ -3985,7 +4267,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3985
4267
  "useProjection: UseProjection",
3986
4268
  "useTrajectory: UseTrajectory"
3987
4269
  ],
3988
- 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, read, skill, todo_write, web_fetch, web_search, write",
4270
+ 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, read, read_image, skill, todo_write, web_fetch, web_search, write",
3989
4271
  hookContext: "",
3990
4272
  slotInject: "",
3991
4273
  declaredBy: "an entry in 'conversation.chat.node' (client-ui-tool), so it exists while that entry is mounted",
@@ -3995,6 +4277,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
3995
4277
  "client-ui-tool BashRow key 'bash'",
3996
4278
  "client-ui-tool FileMutationRow key 'edit'",
3997
4279
  "client-ui-tool FileMutationRow key 'write'",
4280
+ "client-ui-tool ReadImageRow key 'read_image'",
3998
4281
  "client-ui-tool ReadRow key 'read'",
3999
4282
  "client-ui-tool SearchRow key 'grep'",
4000
4283
  "client-ui-tool SearchRow key 'glob'",
@@ -4029,6 +4312,7 @@ call: (method, args = null) => env.invoke(method, args) }, harnessTrap(), ...Obj
4029
4312
  "CordisDynamicPluginRunId"
4030
4313
  ],
4031
4314
  standardProps: [
4315
+ "useResource: UseResource",
4032
4316
  "useWorkspaces: SnapshotSelectorHook<WorkspaceSnapshot>",
4033
4317
  "useSessions: UseSessions",
4034
4318
  "useSessionPendingInteraction: UseSessionPendingInteraction",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-cordis-client-runner",
3
3
  "description": "Browser half of dynamic dual-half plugin packages: event subscription, closure evaluation, guard facade, and loader entries",
4
- "version": "0.1.2-rc.1",
4
+ "version": "0.1.5-alpha.1",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -44,12 +44,12 @@
44
44
  "@types/react": "~18.3.1",
45
45
  "react": "^18.2.0",
46
46
  "@deepseek-ai/cordis-plugin-loader": "^1.0.3",
47
- "@deepseek-ai/dsh-api-remotes": "^0.1.2-rc.1",
48
- "@deepseek-ai/dsh-client-ui-theme": "^0.1.2-rc.1",
47
+ "@deepseek-ai/dsh-api-remotes": "^0.1.5-alpha.1",
48
+ "@deepseek-ai/dsh-client-modules": "^0.1.5-alpha.1",
49
+ "@deepseek-ai/dsh-client-ui-renderer": "^0.1.5-alpha.1",
50
+ "@deepseek-ai/dsh-client-ui-theme": "^0.1.5-alpha.1",
49
51
  "@deepseek-ai/cordis": "^4.0.2",
50
- "@deepseek-ai/dsh-util-values": "^0.1.2-rc.1",
51
- "@deepseek-ai/dsh-client-modules": "^0.1.2-rc.1",
52
- "@deepseek-ai/dsh-client-ui-renderer": "^0.1.2-rc.1"
52
+ "@deepseek-ai/dsh-util-values": "^0.1.5-alpha.1"
53
53
  },
54
54
  "files": [
55
55
  "lib/index.js",