@ai-matrx/chat 0.4.0 → 0.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/dist/agent-copy/RichCopySplit.d.ts +17 -0
  3. package/dist/agent-copy/RichCopySplit.js +34 -0
  4. package/dist/agents/addressing/useAgentHref.js +4 -1
  5. package/dist/agents/api/submit-tool-results.js +11 -1
  6. package/dist/agents/components/agent-widgets/chat-assistant/AssistantMessageCard.js +1 -1
  7. package/dist/agents/components/chat/ConversationRecordsChip.js +1 -1
  8. package/dist/agents/components/chat/useCanvasScopedToConversation.js +1 -1
  9. package/dist/agents/components/context-items/bodies/WorkingDocumentBody.d.ts +5 -2
  10. package/dist/agents/components/context-items/bodies/WorkingDocumentBody.js +6 -1
  11. package/dist/agents/components/context-policies-display/ContextValueBody.js +1 -1
  12. package/dist/agents/components/context-preview/ContextCompareView.js +1 -1
  13. package/dist/agents/components/custom-agent/CustomAgentWindow.js +1 -1
  14. package/dist/agents/components/inputs/smart-input/AgentTextarea.d.ts +6 -1
  15. package/dist/agents/components/inputs/smart-input/AgentTextarea.js +2 -2
  16. package/dist/agents/components/inputs/smart-input/ComposerToolsNotice.d.ts +1 -0
  17. package/dist/agents/components/inputs/smart-input/ComposerToolsNotice.js +5 -0
  18. package/dist/agents/components/inputs/smart-input/ConversationContextRail.d.ts +5 -1
  19. package/dist/agents/components/inputs/smart-input/ConversationContextRail.js +6 -1
  20. package/dist/agents/components/inputs/smart-input/InboxQueueStrip.d.ts +6 -1
  21. package/dist/agents/components/inputs/smart-input/InboxQueueStrip.js +6 -1
  22. package/dist/agents/components/inputs/smart-input/InputActionButtons.js +8 -6
  23. package/dist/agents/components/inputs/smart-input/SmartInputFileDropTarget.d.ts +5 -1
  24. package/dist/agents/components/inputs/smart-input/SmartInputFileDropTarget.js +8 -1
  25. package/dist/agents/components/inputs/smart-input/composer/ComposerAgentPill.js +2 -2
  26. package/dist/agents/components/inputs/smart-input/composer/ComposerChipsRow.d.ts +5 -2
  27. package/dist/agents/components/inputs/smart-input/composer/ComposerChipsRow.js +6 -1
  28. package/dist/agents/components/inputs/smart-input/composer/ComposerMetaRow.d.ts +6 -8
  29. package/dist/agents/components/inputs/smart-input/composer/ComposerMetaRow.js +13 -1
  30. package/dist/agents/components/inputs/smart-input/composer/useOutputShapeCatalog.d.ts +1 -1
  31. package/dist/agents/components/inputs/smart-input/composer/useOutputShapeCatalog.js +1 -1
  32. package/dist/agents/components/live-run/LiveRunDisplay.js +1 -1
  33. package/dist/agents/components/live-run/RunSetDisplay.js +1 -1
  34. package/dist/agents/components/memory/components/AgentMemoryAllView.js +1 -1
  35. package/dist/agents/components/messages-display/AgentConversationDisplay.js +4 -1
  36. package/dist/agents/components/messages-display/assistant/AgentAssistantMessage.d.ts +1 -0
  37. package/dist/agents/components/messages-display/assistant/AgentAssistantMessage.js +4 -3
  38. package/dist/agents/components/messages-display/assistant/AgentEmptyMessageDisplay.js +1 -1
  39. package/dist/agents/components/messages-display/assistant/AssistantMessageFooter.d.ts +2 -2
  40. package/dist/agents/components/messages-display/assistant/AssistantMessageFooter.js +4 -7
  41. package/dist/agents/components/messages-display/assistant/InPlaceAnswerEditor.js +2 -2
  42. package/dist/agents/components/messages-display/citations/MessageSourcesRow.js +1 -1
  43. package/dist/agents/components/messages-display/rich-document/chat-message-source.d.ts +2 -0
  44. package/dist/agents/components/messages-display/rich-document/chat-message-source.js +41 -0
  45. package/dist/agents/components/messages-display/rich-document/chatMessageActions.d.ts +31 -0
  46. package/dist/agents/components/messages-display/rich-document/chatMessageActions.js +39 -0
  47. package/dist/agents/components/messages-display/user/AgentUserMessage.d.ts +1 -0
  48. package/dist/agents/components/messages-display/user/AgentUserMessage.js +7 -4
  49. package/dist/agents/components/messages-display/user/CollabNoteMessage.js +1 -1
  50. package/dist/agents/components/messages-display/user/UserActionBar.js +49 -39
  51. package/dist/agents/components/run-controls/panels/shared.d.ts +1 -0
  52. package/dist/agents/components/shared/AgentConversationColumn.js +3 -2
  53. package/dist/agents/components/working-document/WorkingDocumentEditor.d.ts +1 -1
  54. package/dist/agents/components/working-document/WorkingDocumentPanel.js +2 -1
  55. package/dist/agents/components/working-document/workingDocumentSurface.d.ts +1 -1
  56. package/dist/agents/identity/model-catalog.js +5 -3
  57. package/dist/agents/identity/run-tier-store.js +3 -0
  58. package/dist/agents/redux/agent-definition/cache-bust-middleware.js +2 -0
  59. package/dist/agents/redux/agent-definition/selectors.d.ts +237 -0
  60. package/dist/agents/redux/agent-settings/agentSettingsSlice.d.ts +0 -4
  61. package/dist/agents/redux/agent-settings/agentSettingsSlice.js +12 -5
  62. package/dist/agents/redux/agent-settings/selectors.d.ts +12 -0
  63. package/dist/agents/redux/agent-shortcut-categories/selectors.d.ts +50 -0
  64. package/dist/agents/redux/agent-shortcuts/selectors.d.ts +147 -0
  65. package/dist/agents/redux/conversation-history/selectors.d.ts +16 -0
  66. package/dist/agents/redux/conversation-list/conversation-list.selectors.d.ts +2 -0
  67. package/dist/agents/redux/execution-system/active-requests/active-requests.selectors.d.ts +54 -0
  68. package/dist/agents/redux/execution-system/context-state/context-state.selectors.d.ts +14 -0
  69. package/dist/agents/redux/execution-system/conversations/conversations.selectors.d.ts +5 -0
  70. package/dist/agents/redux/execution-system/host-conversations/conversation-abilities.d.ts +12 -0
  71. package/dist/agents/redux/execution-system/host-conversations/conversation-abilities.js +25 -0
  72. package/dist/agents/redux/execution-system/host-conversations/host-conversation.thunks.d.ts +53 -0
  73. package/dist/agents/redux/execution-system/host-conversations/host-conversation.thunks.js +412 -0
  74. package/dist/agents/redux/execution-system/host-conversations/host-conversations.selectors.d.ts +28 -0
  75. package/dist/agents/redux/execution-system/host-conversations/host-conversations.selectors.js +41 -0
  76. package/dist/agents/redux/execution-system/host-conversations/host-conversations.slice.d.ts +43 -0
  77. package/dist/agents/redux/execution-system/host-conversations/host-conversations.slice.js +38 -0
  78. package/dist/agents/redux/execution-system/host-conversations/source-registry.d.ts +9 -0
  79. package/dist/agents/redux/execution-system/host-conversations/source-registry.js +15 -0
  80. package/dist/agents/redux/execution-system/host-conversations/useHostConversation.d.ts +4 -0
  81. package/dist/agents/redux/execution-system/host-conversations/useHostConversation.js +24 -0
  82. package/dist/agents/redux/execution-system/inbox/inbox-turn-end.middleware.js +2 -1
  83. package/dist/agents/redux/execution-system/instance-context/instance-context.selectors.d.ts +3 -0
  84. package/dist/agents/redux/execution-system/instance-resources/default-remark-durability.d.ts +22 -0
  85. package/dist/agents/redux/execution-system/instance-resources/default-remark-durability.js +164 -0
  86. package/dist/agents/redux/execution-system/instance-resources/instance-resources.selectors.d.ts +8 -0
  87. package/dist/agents/redux/execution-system/instance-ui-state/instance-ui-state.selectors.d.ts +5 -0
  88. package/dist/agents/redux/execution-system/instance-ui-state/run-configuration-persist.js +2 -0
  89. package/dist/agents/redux/execution-system/instance-user-input/composer-draft-store.js +20 -0
  90. package/dist/agents/redux/execution-system/instance-user-input/useComposerDraftRestore.js +2 -1
  91. package/dist/agents/redux/execution-system/instance-variable-values/instance-variable-values.selectors.d.ts +7 -0
  92. package/dist/agents/redux/execution-system/messages/messages.selectors.d.ts +1 -0
  93. package/dist/agents/redux/execution-system/messages/messages.selectors.js +1 -1
  94. package/dist/agents/redux/execution-system/observability/observability.selectors.d.ts +7 -0
  95. package/dist/agents/redux/execution-system/observational-memory/observational-memory.selectors.d.ts +1 -0
  96. package/dist/agents/redux/execution-system/selectors/aggregate.selectors.d.ts +14 -0
  97. package/dist/agents/redux/execution-system/thunks/execute-instance.thunk.js +8 -1
  98. package/dist/agents/redux/execution-system/thunks/execute-manual-instance.thunk.js +2 -1
  99. package/dist/agents/redux/execution-system/thunks/load-conversation.thunk.js +6 -0
  100. package/dist/agents/redux/execution-system/thunks/load-older-messages.thunk.js +12 -0
  101. package/dist/agents/redux/execution-system/thunks/process-stream.js +6 -4
  102. package/dist/agents/redux/execution-system/thunks/resolve-base-url.js +1 -1
  103. package/dist/agents/redux/execution-system/thunks/smart-execute.thunk.js +43 -0
  104. package/dist/agents/redux/execution-system/utils/assemble-cx-content-blocks.js +2 -1
  105. package/dist/agents/redux/execution-system/utils/continuation-body.d.ts +1 -0
  106. package/dist/agents/redux/execution-system/utils/continuation-body.js +2 -1
  107. package/dist/agents/redux/execution-system/utils/inbound-render-block.d.ts +8 -0
  108. package/dist/agents/redux/execution-system/utils/inbound-render-block.js +17 -2
  109. package/dist/agents/redux/execution-system/utils/normalize-content-blocks.js +1 -1
  110. package/dist/agents/redux/execution-system/utils/progress-data-block.d.ts +11 -0
  111. package/dist/agents/redux/execution-system/utils/progress-data-block.js +37 -0
  112. package/dist/agents/redux/execution-system/utils/stream-block-accumulator.js +10 -8
  113. package/dist/agents/redux/mcp/mcp.slice.js +15 -7
  114. package/dist/agents/redux/proposed-directives/proposedDirectivesSlice.d.ts +1 -0
  115. package/dist/agents/redux/tools/tools.selectors.d.ts +1 -0
  116. package/dist/agents/redux/tools/tools.thunks.js +3 -0
  117. package/dist/agents/resources/default-picker-items.d.ts +17 -0
  118. package/dist/agents/resources/default-picker-items.js +48 -0
  119. package/dist/agents/runtime-reconnect/ServerOperationBanner.d.ts +6 -1
  120. package/dist/agents/runtime-reconnect/ServerOperationBanner.js +6 -1
  121. package/dist/agents/types/instance.types.d.ts +2 -1
  122. package/dist/agents/ui-first-tools/redux/agent-lists.selectors.d.ts +2 -0
  123. package/dist/agents/ui-first-tools/ui/ApprovalCard.js +1 -1
  124. package/dist/agents/ui-first-tools/ui/AskCard.js +1 -1
  125. package/dist/agents/ui-first-tools/ui/lists/TaskPanel.js +1 -1
  126. package/dist/conversation/hooks/useDomCapturePrint.js +1 -1
  127. package/dist/conversation/utils/markdown-print.js +1 -1
  128. package/dist/cx-chat/components/SsrSidebarChats.js +1 -1
  129. package/dist/cx-chat/components/messages/AssistantMessage.js +3 -5
  130. package/dist/cx-chat/components/sidebar/SidebarUserFooter.js +1 -1
  131. package/dist/cx-conversation/AssistantMessage.js +3 -5
  132. package/dist/host/app-data-slots.d.ts +85 -0
  133. package/dist/host/app-data-slots.js +42 -0
  134. package/dist/host/app-identity.d.ts +20 -0
  135. package/dist/host/app-identity.js +21 -0
  136. package/dist/host/bare-host-chrome.d.ts +14 -0
  137. package/dist/host/bare-host-chrome.js +45 -0
  138. package/dist/host/configure.d.ts +9 -1
  139. package/dist/host/configure.js +44 -8
  140. package/dist/host/contract.d.ts +39 -2
  141. package/dist/host/db-types.d.ts +99 -1
  142. package/dist/host/defaults/navigation-hooks.d.ts +2 -0
  143. package/dist/host/defaults/navigation-hooks.js +7 -1
  144. package/dist/host/defaults/navigation.d.ts +4 -3
  145. package/dist/host/defaults/navigation.js +38 -7
  146. package/dist/host/defaults/org.d.ts +12 -4
  147. package/dist/host/defaults/org.js +39 -1
  148. package/dist/host/defaults/prefs.d.ts +11 -0
  149. package/dist/host/defaults/prefs.js +43 -0
  150. package/dist/host/defaults/workspace-gate.d.ts +16 -0
  151. package/dist/host/defaults/workspace-gate.js +89 -0
  152. package/dist/host/diagnostics.d.ts +7 -2
  153. package/dist/host/diagnostics.js +6 -0
  154. package/dist/host/identity.js +2 -1
  155. package/dist/host/index.d.ts +6 -3
  156. package/dist/host/index.js +23 -2
  157. package/dist/host/no-database.d.ts +38 -0
  158. package/dist/host/no-database.js +107 -0
  159. package/dist/host/react.d.ts +1 -0
  160. package/dist/host/react.js +40 -2
  161. package/dist/host/registered-source.js +2 -2
  162. package/dist/host/source.d.ts +130 -0
  163. package/dist/host/source.js +86 -0
  164. package/dist/host/ui-slots.d.ts +9 -31
  165. package/dist/host/ui-slots.js +5 -37
  166. package/dist/mandates/useMandate.js +13 -0
  167. package/dist/public-chat/components/PublicMessageOptionsMenu.js +3 -2
  168. package/dist/store/create-chat-store.d.ts +4 -2
  169. package/dist/store/middlewares.d.ts +5 -0
  170. package/dist/store/slices.d.ts +1 -0
  171. package/dist/store/slices.js +4 -1
  172. package/dist/surfaces/redux/selectors.d.ts +2 -0
  173. package/dist/surfaces/redux/surfaceConfigSlice.js +2 -0
  174. package/dist/surfaces/redux/userStateSlice.js +3 -1
  175. package/dist/surfaces/runtime/agent-offer.js +1 -1
  176. package/dist/surfaces/runtime/surface-writeback.js +1 -1
  177. package/dist/testing/turn-harness.d.ts +35 -0
  178. package/dist/testing/turn-harness.js +85 -0
  179. package/dist/tool-call-visualization/db-renderer/fetchToolRendererRow.js +2 -0
  180. package/dist/tool-call-visualization/redux/selectors.d.ts +1 -0
  181. package/dist/tool-call-visualization/renderers/agent-call/AgentCallInline.js +1 -1
  182. package/dist/tool-call-visualization/renderers/agent-call/CollabCallCard.js +1 -1
  183. package/dist/tool-call-visualization/renderers/fs/FsInline.js +1 -1
  184. package/dist/tool-call-visualization/renderers/random-wheel/RandomWheelInline.js +1 -1
  185. package/dist/tool-call-visualization/renderers/research/ResearchOverlay.js +4 -4
  186. package/dist/tool-call-visualization/renderers/research/SubagentReportBlock.js +2 -2
  187. package/dist/tool-call-visualization/renderers/scrape/ScrapeOverlay.js +1 -1
  188. package/dist/tool-call-visualization/renderers/search/SearchInline.js +1 -1
  189. package/dist/tool-call-visualization/renderers/search/SearchOverlay.js +1 -1
  190. package/dist/tool-call-visualization/renderers/sql/SqlInline.js +1 -1
  191. package/dist/tool-call-visualization/result-fields/KeyValueGrid.js +1 -1
  192. package/dist/tool-call-visualization/result-fields/ResultMarkdown.js +1 -1
  193. package/dist/tool-call-visualization/result-fields/ResultValue.js +1 -1
  194. package/dist/tool-call-visualization/surface-write/SurfaceWriteDiff.js +1 -1
  195. package/dist/ui/AudioOutputBlockSkeleton.d.ts +17 -0
  196. package/dist/ui/AudioOutputBlockSkeleton.js +78 -0
  197. package/dist/ui/chat-protocol-from-stream.d.ts +60 -0
  198. package/dist/ui/chat-protocol-from-stream.js +135 -0
  199. package/dist/ui/markdown-stream/EnhancedChatMarkdown.d.ts +59 -0
  200. package/dist/ui/markdown-stream/EnhancedChatMarkdown.js +1108 -0
  201. package/dist/ui/markdown-stream/MarkdownStream.d.ts +88 -0
  202. package/dist/ui/markdown-stream/MarkdownStream.js +14 -0
  203. package/dist/ui/markdown-stream/MarkdownStreamImpl.d.ts +4 -0
  204. package/dist/ui/markdown-stream/MarkdownStreamImpl.js +86 -0
  205. package/dist/ui/markdown-stream/StreamAwareChatMarkdown.d.ts +58 -0
  206. package/dist/ui/markdown-stream/StreamAwareChatMarkdown.js +294 -0
  207. package/dist/ui/markdown-stream/internal-handlers/AgentCallChildTrace.d.ts +22 -0
  208. package/dist/ui/markdown-stream/internal-handlers/AgentCallChildTrace.js +128 -0
  209. package/dist/ui/markdown-stream/internal-handlers/InlineAssistantError.d.ts +3 -0
  210. package/dist/ui/markdown-stream/internal-handlers/InlineAssistantError.js +26 -0
  211. package/dist/ui/markdown-stream/internal-handlers/InlineThinkingSlot.d.ts +14 -0
  212. package/dist/ui/markdown-stream/internal-handlers/InlineThinkingSlot.js +23 -0
  213. package/dist/ui/markdown-stream/internal-handlers/ToolHandlers.d.ts +42 -0
  214. package/dist/ui/markdown-stream/internal-handlers/ToolHandlers.js +109 -0
  215. package/dist/ui/markdown-stream/useBoundAgentOutputSchema.d.ts +2 -0
  216. package/dist/ui/markdown-stream/useBoundAgentOutputSchema.js +33 -0
  217. package/dist/window-panels/windows/agents/AgentAssistantMarkdownDebugWindow.js +1 -1
  218. package/package.json +10 -5
  219. package/dist/host/content-ir-slots.d.ts +0 -231
  220. package/dist/host/content-ir-slots.js +0 -131
  221. package/dist/host/markdown-slots.d.ts +0 -53
  222. package/dist/host/markdown-slots.js +0 -32
  223. package/dist/host/rich-document-slots.d.ts +0 -123
  224. package/dist/host/rich-document-slots.js +0 -36
  225. package/dist/utils/content-ir/report-kind-at-raw-renderer.d.ts +0 -19
  226. package/dist/utils/content-ir/report-kind-at-raw-renderer.js +0 -32
package/CHANGELOG.md CHANGED
@@ -1,5 +1,85 @@
1
1
  # @ai-matrx/chat
2
2
 
3
+ ## 0.4.7
4
+
5
+ - The host-source column test gets an explicit 120s budget: the column now renders the real text engine
6
+ (rich-content / rich-editor imported directly), and a cold CI transform exceeded jest's 30s default (0.4.6's gate).
7
+
8
+ ## 0.4.6
9
+ ### Unreleased
10
+ ### Headless JSON: the server's `structured_output` wins; a one-typo document is recovered whole
11
+
12
+ - `processStream` records the server's successful `structured_output` payload as the first extracted JSON value at finalize (it outranks anything parsed from the answer text). Text parsing gets whole-document repair through kit `json-extract` (describe box, 2026-10-08: 8,363-char answer, `extractedCount` 0).
13
+ ### Chat renders formatted text on any host (P29a): the engine is a direct dependency
14
+
15
+ - The message renderer now lives in chat: `ui/markdown-stream/MarkdownStream` (+ `MarkdownStreamImpl`,
16
+ `StreamAwareChatMarkdown`, `EnhancedChatMarkdown`, `internal-handlers/{ToolHandlers, AgentCallChildTrace,
17
+ InlineAssistantError, InlineThinkingSlot}`, `useBoundAgentOutputSchema`), `ui/chat-protocol-from-stream`,
18
+ `ui/AudioOutputBlockSkeleton`, `agent-copy/RichCopySplit`, `agents/redux/execution-system/utils/progress-data-block`,
19
+ `agents/components/messages-display/rich-document/{chatMessageActions, chat-message-source}` (chat registers its
20
+ own `chat-message` rich-document source adapter). Moved from matrx-frontend; the shell is client-only via
21
+ `React.lazy` (no `next/dynamic`), so a plain React host renders it.
22
+ - Removed `host/markdown-slots`, `host/content-ir-slots`, `host/rich-document-slots`: chat imports the kind and
23
+ component registries, envelope memo, kind correctors, splitter and rich-document bars/menus from
24
+ `@ai-matrx/rich-content` (its host capabilities carry the app's registries with honest bare defaults).
25
+ - New `host/app-data-slots`: only app data stays a slot — `contentIrKindValidator`, `AnchorRecordsList`,
26
+ `useAnchorRecords`, `fetchShapePage`, `fetchShapeByKind`, `useOpenCitationSource`, `FullScreenMarkdownEditor`.
27
+ - `<ChatProvider>` mounts a diagnostics-only `AlchemyActionsProvider` when the host has none (the message bars need it).
28
+ - A host with no database never reads stored tool renderers (the generic card draws).
29
+ - Host action: delete `chatMarkdownRegistration`, `chatContentIrRegistration`, `chatRichDocumentRegistration`;
30
+ register the app-data slots; import moved modules from their chat paths.
31
+
32
+ ## 0.4.5
33
+
34
+ - 0.4.3's release gate stopped at the front-door canary: the host-source screen (`AgentConversationColumn`,
35
+ `host-conversations/useHostConversation`) is now in `FRONT_DOOR`. Carries 0.4.3 (chat imports rich-content /
36
+ rich-editor directly; package slots removed).
37
+
38
+ ## 0.4.4
39
+
40
+ Automatic changed-only republish (docs/metadata drift since the last tag — see
41
+ `git diff npm/chat/v0.4.2..npm/chat/v0.4.4 -- apps/shared/chat`).
42
+ No source changes intended and no consumer action required.
43
+
44
+ ## 0.4.3
45
+ ### Chat reaches the text engine directly, never through a slot
46
+
47
+ - `RichContent`, `RichDocument`, `copyRichContent`, `copyContent`, `CopySplit`, `InPlaceEditor`, `EditInPlace`,
48
+ `useInPlaceTrigger`, `useTextareaFormatting` (ui-slots) and `BasicMarkdownContent`, `renderAllDiagrams`,
49
+ `drawMermaidForPrint` (markdown-slots) are no longer host slots: chat imports them from
50
+ `@ai-matrx/rich-content` / `@ai-matrx/rich-editor` (now a dependency). A host must stop registering them.
51
+ - `utils/content-ir/report-kind-at-raw-renderer` is gone: the one "already reported" list is
52
+ `@ai-matrx/rich-content/utils/report-kind-at-raw-renderer`.
53
+ - Guard: `pnpm check:no-package-slots` (`--self-test`; `--host <dir>` checks a host's registrations) fails when a
54
+ slot is named for a rich-content / rich-editor export or a host registers one. Shrink-only allowlist:
55
+ `scripts/package-slots.allowlist.json`.
56
+
57
+ ## 0.4.2
58
+ ### P29a round 2 (a bare host is a real app)
59
+
60
+ - **Front door = the real screens.** `FRONT_DOOR` now names `agents/components/chat/ChatNewClient` and
61
+ `ChatConversationRoom`; the `cx-chat` demo screens are out. The default navigation port is
62
+ CLIENT-SIDE (history API + a notify event; same-origin `Link` clicks move the history, no page load);
63
+ `@ai-matrx/chat/host/react` exports `useRouter`/`usePathname`/`useSearchParams`/`Link` over the host's
64
+ navigation port. `check:front-door:canary` scans the canary.
65
+ - **A host names itself.** `ChatHost.app = { sourceApp, sourceFeature? }` stamps `source_app` /
66
+ `source_feature` on every send; absent = the neutral `chat` producer (said once), never matrx-frontend.
67
+ matrx-frontend sets `app: { sourceApp: "matrx-frontend" }` explicitly. Both names must be registered
68
+ with the server.
69
+ - **The model picker is the agents package's own** (`@ai-matrx/agents/models/react`); `ModelListDropdown` is
70
+ no longer a slot. A bare host's `BareHostChrome` mounts the catalog + favorites over `host.db`.
71
+ - **Unsent chips persist server-side in a bare host** (`default-remark-durability`: `block_state_set` /
72
+ `block_state_list_staged` / `block_state_dismiss_chip`), registered by `<ChatProvider>` for a private store.
73
+ - **Stand-ins report quietly.** An unregistered optional slot is one `console.info` line, once; only a
74
+ registration the package cannot run without (`SLOT_CANNOT_RUN`) warns and reaches diagnostics.
75
+ A bare host also gets the associations service (working document + scratchpad restore) from its own store.
76
+
77
+ ## 0.4.1
78
+
79
+ Automatic changed-only republish (docs/metadata drift since the last tag — see
80
+ `git diff npm/chat/v0.4.0..npm/chat/v0.4.1 -- apps/shared/chat`).
81
+ No source changes intended and no consumer action required.
82
+
3
83
  ## 0.4.0
4
84
 
5
85
  Agent core B3 + the B2 tail — every piece of agent and model state has one holder:
@@ -0,0 +1,17 @@
1
+ import * as React from "react";
2
+ import type { MatrxCopyMenuProps } from "@ai-matrx/alchemy/react/workspace";
3
+ export type RichCopySplitProps = MatrxCopyMenuProps & {
4
+ human: NonNullable<MatrxCopyMenuProps["human"]>;
5
+ };
6
+ /**
7
+ * THE split Copy of a markdown host (Arman, 2026-10-04: "one click to get either the markdown
8
+ * version or the no-markup version"). One click copies the person's flavor (`copy.default_flavor`);
9
+ * the chevron offers exactly Copy markdown and Copy plain text (2026-10-07). The Alchemy palette
10
+ * (formatted, JSON, download, AI, the host's record copies) is "Export…" — ONE row under a divider
11
+ * at the bottom of the chevron menu, since these hosts have no rich-document ⋯ of their own. The
12
+ * split stays the one visible copy control. The button and the rows end in
13
+ * `copyRichContent` over the same `human` — they cannot disagree.
14
+ * Guard: matrx-frontend components/matrx/buttons/__tests__/rich-copy-hosts.census.test.ts. The Export…
15
+ * palette is the host's `CopyButtons` (chat ui-slot); a host without it still copies both flavors.
16
+ */
17
+ export declare function RichCopySplit(props: RichCopySplitProps): React.JSX.Element;
@@ -0,0 +1,34 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { CopySplitButton } from "@ai-matrx/rich-content/copy/CopySplitButton";
5
+ import { copyRichContent } from "@ai-matrx/rich-content/copy/copy-commands";
6
+ import { ExportPaletteAnchor, openExportPalette, useExportPaletteKey } from "@ai-matrx/rich-content/copy/ExportPalette";
7
+ import { cn } from "@ai-matrx/design-system";
8
+ import { CopyButtons } from "../host/ui-slots.js";
9
+ function RichCopySplit(props) {
10
+ const { human, className, size } = props;
11
+ const palette = React.useRef(null);
12
+ const copy = React.useCallback(
13
+ (flavor) => copyRichContent(typeof human === "function" ? human() : human, flavor),
14
+ [human]
15
+ );
16
+ const splitSize = size === "xs" || size === "icon" ? "xs" : "sm";
17
+ const exportKey = useExportPaletteKey();
18
+ return /* @__PURE__ */ jsxs("span", { className: cn("inline-flex shrink-0 items-center", className), children: [
19
+ /* @__PURE__ */ jsx(
20
+ CopySplitButton,
21
+ {
22
+ copy,
23
+ size: splitSize,
24
+ label: `Copy ${props.label ?? ""}`.trim(),
25
+ onExport: () => void openExportPalette(exportKey)
26
+ }
27
+ ),
28
+ /* @__PURE__ */ jsx(ExportPaletteAnchor, { exportKey, controllerRef: palette }),
29
+ /* @__PURE__ */ jsx(CopyButtons, { ...props, className: void 0, contentFlavor: "markdown", richCopyFlavors: [], triggerHidden: true, controllerRef: palette })
30
+ ] });
31
+ }
32
+ export {
33
+ RichCopySplit
34
+ };
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  import { useContext, useEffect, useState, useSyncExternalStore } from "react";
3
3
  import { ReactReduxContext } from "react-redux";
4
+ import { ChatStoreContext } from "../../store/context.js";
4
5
  import {
5
6
  agentDoorFor,
6
7
  agentGoHref,
@@ -15,7 +16,9 @@ import { selectIsAdmin } from "../../host/identity.js";
15
16
  const noSubscribe = () => () => {
16
17
  };
17
18
  function useAgentAddressViewer() {
18
- const store = useContext(ReactReduxContext)?.store;
19
+ const chatStore = useContext(ChatStoreContext)?.store;
20
+ const hostStore = useContext(ReactReduxContext)?.store;
21
+ const store = chatStore ?? hostStore;
19
22
  const read = () => store ? selectIsAdmin(store.getState()) : void 0;
20
23
  const isAdmin = useSyncExternalStore(
21
24
  store ? store.subscribe : noSubscribe,
@@ -1,3 +1,5 @@
1
+ import { selectHostConversation } from "../redux/execution-system/host-conversations/host-conversations.selectors.js";
2
+ import { answerHostAsk } from "../redux/execution-system/host-conversations/host-conversation.thunks.js";
1
3
  import { callApi } from "../../host/server/call-api.js";
2
4
  import { toast } from "../../host/notify.js";
3
5
  import { formatDurationMs } from "@ai-matrx/kit/format";
@@ -232,7 +234,7 @@ async function failLifecycleForCalls(dispatch, getState, conversationId, results
232
234
  }
233
235
  }
234
236
  const submitToolResult = (pending) => {
235
- return (dispatch) => {
237
+ return (dispatch, getState) => {
236
238
  dispatch(settleClientToolCall(pending));
237
239
  if (!pending.is_error && nonErrorOutputReadsAsFailure(pending.output)) {
238
240
  console.error(
@@ -240,6 +242,14 @@ const submitToolResult = (pending) => {
240
242
  );
241
243
  }
242
244
  const { conversationId, ...rest } = pending;
245
+ if (selectHostConversation(conversationId)(getState())) {
246
+ void answerHostAsk(conversationId, rest.call_id, rest).catch((error) => {
247
+ toast.error("Your answer did not reach this chat", {
248
+ description: error instanceof Error ? error.message : String(error)
249
+ });
250
+ });
251
+ return;
252
+ }
243
253
  const bucket = queue.get(conversationId) ?? [];
244
254
  bucket.push(rest);
245
255
  queue.set(conversationId, bucket);
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { Webhook } from "lucide-react";
4
- import { RichDocument } from "../../../../host/ui-slots.js";
4
+ import { RichDocument } from "@ai-matrx/rich-content/rich-document/RichDocument";
5
5
  function AssistantMessageCard({
6
6
  content,
7
7
  timestamp,
@@ -8,7 +8,7 @@ import {
8
8
  AnchorRecordsList,
9
9
  CONVERSATION_ANCHOR_TYPE,
10
10
  useAnchorRecords
11
- } from "../../../host/content-ir-slots.js";
11
+ } from "../../../host/app-data-slots.js";
12
12
  function ConversationRecordsChip({
13
13
  conversationId
14
14
  }) {
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { useEffect } from "react";
3
- import { useStore } from "react-redux";
3
+ import { useAppStore as useStore } from "../../../store/hooks.js";
4
4
  import { useOptionalCanvas } from "@ai-matrx/canvas/react";
5
5
  import { selectCanvasIsHydrated } from "@ai-matrx/canvas";
6
6
  function canvasItemConversation(item, conversationOfMessage) {
@@ -1,6 +1,9 @@
1
1
  import { type WorkingDocumentKind } from "../../../redux/execution-system/instance-working-document/instance-working-document.slice.js";
2
2
  import type { ContextDrawerItem, ContextItemBodyProps } from "../types.js";
3
3
  export declare function buildWorkingDocumentDrawerItem(conversationId: string, title?: string, kind?: WorkingDocumentKind): ContextDrawerItem;
4
- export declare function WorkingDocumentBody({ item, setTitle, initialKind, }: ContextItemBodyProps & {
4
+ type WorkingDocumentBodyProps = ContextItemBodyProps & {
5
5
  initialKind?: WorkingDocumentKind;
6
- }): import("react").JSX.Element;
6
+ };
7
+ /** Working documents are database rows: absent on a host-owned conversation with none (G-DOOR gate). */
8
+ export declare function WorkingDocumentBody(props: WorkingDocumentBodyProps): import("react").JSX.Element | null;
9
+ export {};
@@ -11,6 +11,7 @@ import {
11
11
  selectWorkingDocTitle
12
12
  } from "../../../redux/execution-system/instance-working-document/instance-working-document.selectors.js";
13
13
  import { DocumentsWorkspace } from "../../working-document/documents-workspace/DocumentsWorkspace.js";
14
+ import { useConversationAbilities } from "../../../redux/execution-system/host-conversations/conversation-abilities.js";
14
15
  function buildWorkingDocumentDrawerItem(conversationId, title = "Working document", kind = "working") {
15
16
  const isScratch = kind === "scratch";
16
17
  return {
@@ -27,7 +28,11 @@ function buildWorkingDocumentDrawerItem(conversationId, title = "Working documen
27
28
  raw: null
28
29
  };
29
30
  }
30
- function WorkingDocumentBody({
31
+ function WorkingDocumentBody(props) {
32
+ const { database } = useConversationAbilities();
33
+ return database ? /* @__PURE__ */ jsx(WorkingDocumentBodyInner, { ...props }) : null;
34
+ }
35
+ function WorkingDocumentBodyInner({
31
36
  item,
32
37
  setTitle,
33
38
  initialKind = "working"
@@ -15,8 +15,8 @@ import {
15
15
  unwrapRichContextValue
16
16
  } from "./contextValueUtils.js";
17
17
  import { cn } from "@ai-matrx/design-system";
18
- import { RichContent } from "../../../host/ui-slots.js";
19
18
  import { JsonInspector } from "../../../host/ui-slots.js";
19
+ import { RichContent } from "@ai-matrx/rich-content/levels/RichContent";
20
20
  function ContextValueBody({
21
21
  type,
22
22
  contextKey,
@@ -10,7 +10,6 @@ import { Badge, Button, Chip } from "@ai-matrx/design-system/controls";
10
10
  import { Textarea } from "@ai-matrx/design-system";
11
11
  import { Tabs, TabsContent, TabsList, TabsTrigger } from "../../../ui/tabs.js";
12
12
  import { CopyButtons } from "../../../host/ui-slots.js";
13
- import { RichContent } from "../../../host/ui-slots.js";
14
13
  import { SystemItemsLine } from "./SystemItemsLine.js";
15
14
  import { useAppDispatch } from "../../../store/hooks.js";
16
15
  import { callApi } from "../../../host/server/call-api.js";
@@ -25,6 +24,7 @@ import { formatCount, formatDurationMs } from "@ai-matrx/kit/format";
25
24
  import { getUserId } from "../../../host/identity.js";
26
25
  import { humanizeIdentifier } from "@ai-matrx/kit/text-case";
27
26
  import { useAgentName } from "../../identity/agent-identity.js";
27
+ import { RichContent } from "@ai-matrx/rich-content/levels/RichContent";
28
28
  const CLASS_LOOK = {
29
29
  defect: {
30
30
  label: "Defect",
@@ -19,7 +19,7 @@ import { useAgentLauncher } from "../../hooks/useAgentLauncher.js";
19
19
  import { fetchAgentExecutionMinimal } from "../../redux/agent-definition/thunks.js";
20
20
  import { selectAgentVariableDefinitions } from "../../redux/agent-definition/selectors.js";
21
21
  import { AgentPickerFrame } from "../../../window-panels/windows/agents/AgentPickerFrame.js";
22
- import { bindConversationToApplyTarget } from "../../../host/rich-document-slots.js";
22
+ import { bindConversationToApplyTarget } from "@ai-matrx/rich-content/rich-document/review/applyTargets";
23
23
  import { ErrorAlchemyMenu } from "../../../host/ui-slots.js";
24
24
  import {
25
25
  SKIP,
@@ -58,7 +58,12 @@ interface AgentTextareaProps {
58
58
  * of 16/28. Touch layouts still get 16px from THE iOS ZOOM FLOOR (globals.css).
59
59
  */
60
60
  composerType?: boolean;
61
- /** With `composerType`: each text line is one 32px composer row (splash · page). */
61
+ /**
62
+ * With `composerType` (splash · page): the box holds two 32px composer rows
63
+ * empty and grows at the third line — but text keeps its normal 24px line
64
+ * (4px above, so the first line sits centred in the first row). A 32px LINE
65
+ * spaced every wrapped line like double spacing (Arman, 2026-10-07).
66
+ */
62
67
  composerRows?: boolean;
63
68
  }
64
69
  export declare function AgentTextarea({ conversationId, compact, singleRow, uploadRoot, uploadPath, surfaceKey, draftAlias, disableSend, initiallyExpanded, autoFocus, showExpandToggle, placeholder, minHeightPx, flush, composerType, composerRows, maxHeightPx, textMenu, }: AgentTextareaProps): React.JSX.Element;
@@ -33,13 +33,13 @@ import { useInstanceInputUndoRedo } from "../../../hooks/useInstanceInputUndoRed
33
33
  import { ComposerDraftNotice } from "./ComposerDraftNotice.js";
34
34
  import { ComposerToolsNotice } from "./ComposerToolsNotice.js";
35
35
  import { EditableContextMenu } from "../../../../host/ui-slots.js";
36
- import { useTextareaFormatting } from "../../../../host/ui-slots.js";
37
36
  import {
38
37
  smartExecute,
39
38
  interruptAndSend
40
39
  } from "../../../redux/execution-system/thunks/smart-execute.thunk.js";
41
40
  import { selectUserVariableValues } from "../../../redux/execution-system/instance-variable-values/instance-variable-values.selectors.js";
42
41
  import { Button } from "@ai-matrx/design-system/controls";
42
+ import { useTextareaFormatting } from "@ai-matrx/rich-editor/format/useTextareaFormatting";
43
43
  function AgentTextarea({
44
44
  conversationId,
45
45
  compact = false,
@@ -307,7 +307,7 @@ ${insert}${base.slice(at)}`
307
307
  onChange: (e) => handleTextChange(e.target.value),
308
308
  onKeyDown: handleKeyDown,
309
309
  placeholder: placeholderText,
310
- className: `w-full bg-transparent border-none outline-none ${composerType ? composerRows ? "text-[15px] leading-8 px-1.5" : "text-[15px] leading-6 px-2 py-1" : "text-base leading-7"} text-foreground placeholder:text-muted-foreground/60 resize-none overflow-y-auto scrollbar-hide ${// The height transition belongs to the expand/collapse toggles
310
+ className: `w-full bg-transparent border-none outline-none ${composerType ? composerRows ? "text-[15px] leading-6 px-1.5 py-1" : "text-[15px] leading-6 px-2 py-1" : "text-base leading-7"} text-foreground placeholder:text-muted-foreground/60 resize-none overflow-y-auto scrollbar-hide ${// The height transition belongs to the expand/collapse toggles
311
311
  // ONLY. While typing there is no transition class at all: a
312
312
  // line-count change snaps instantly, and an unchanged line count
313
313
  // writes nothing (see the auto-resize effect).
@@ -1,6 +1,7 @@
1
1
  import type { ChatRootState } from "../../../../store/root-state.js";
2
2
  /** True when something attached needs a tool the switch is keeping out. */
3
3
  export declare function selectAttachmentNeedsAutoTools(state: ChatRootState, conversationId: string): boolean;
4
+ /** Agent auto-tools are a database-backed run setting: absent on a host-owned conversation (G-DOOR gate). */
4
5
  export declare function ComposerToolsNotice({ conversationId }: {
5
6
  conversationId: string;
6
7
  }): import("react").JSX.Element | null;
@@ -6,6 +6,7 @@ import { selectEffectiveAutoTools } from "../../../redux/execution-system/utils/
6
6
  import { setBuilderAdvancedSettings } from "../../../redux/execution-system/instance-ui-state/instance-ui-state.slice.js";
7
7
  import { selectAgentAutoToolsDisabled } from "../../../redux/agent-definition/selectors.js";
8
8
  import { Button } from "@ai-matrx/design-system/controls";
9
+ import { useConversationAbilities } from "../../../redux/execution-system/host-conversations/conversation-abilities.js";
9
10
  const TOOL_BACKED_RESOURCE_TYPES = /* @__PURE__ */ new Set([
10
11
  "document",
11
12
  "input_document",
@@ -26,6 +27,10 @@ function selectAttachmentNeedsAutoTools(state, conversationId) {
26
27
  return Array.isArray(google) ? google.length > 0 : Boolean(google);
27
28
  }
28
29
  function ComposerToolsNotice({ conversationId }) {
30
+ const { database } = useConversationAbilities();
31
+ return database ? /* @__PURE__ */ jsx(ComposerToolsNoticeBody, { conversationId }) : null;
32
+ }
33
+ function ComposerToolsNoticeBody({ conversationId }) {
29
34
  const dispatch = useAppDispatch();
30
35
  const needsTools = useAppSelector(
31
36
  (s) => selectAttachmentNeedsAutoTools(s, conversationId)
@@ -40,5 +40,9 @@ export interface AttachedContextRailItem {
40
40
  */
41
41
  contextKey?: string;
42
42
  }
43
- export declare function ConversationContextRail({ conversationId, className, presentation, attachedItems, surfaceValueName, withAttachments, attachmentsSurfaceValueName, withValueGroupChip, }: ConversationContextRailProps): import("react").JSX.Element;
43
+ /**
44
+ * Context entries, saved context rules, working documents and attachments all live in the
45
+ * database, so the rail is ABSENT on a host-owned conversation with none (G-DOOR gate).
46
+ */
47
+ export declare function ConversationContextRail(props: ConversationContextRailProps): import("react").JSX.Element | null;
44
48
  export {};
@@ -92,6 +92,7 @@ import { selectAgentContextPolicies } from "../../../redux/agent-definition/sele
92
92
  import { ActiveContextLensChip } from "../../../../context/sources/scopes.js";
93
93
  import { selectActiveScopeIdsByType } from "../../../../context/sources/scopes.js";
94
94
  import { contextEntryLabel } from "../../context-policies-display/contextEntryLabel.js";
95
+ import { useConversationAbilities } from "../../../redux/execution-system/host-conversations/conversation-abilities.js";
95
96
  function entryHasValue(e) {
96
97
  const v = e.value;
97
98
  if (v === void 0 || v === null) return false;
@@ -100,7 +101,11 @@ function entryHasValue(e) {
100
101
  return false;
101
102
  return true;
102
103
  }
103
- function ConversationContextRail({
104
+ function ConversationContextRail(props) {
105
+ const { database } = useConversationAbilities();
106
+ return database ? /* @__PURE__ */ jsx(ConversationContextRailBody, { ...props }) : null;
107
+ }
108
+ function ConversationContextRailBody({
104
109
  conversationId,
105
110
  className,
106
111
  presentation = "default",
@@ -26,5 +26,10 @@ interface InboxQueueStripProps {
26
26
  * for the card label so the user sees WHO left the note, not raw plumbing.
27
27
  */
28
28
  export declare function parseCollabNoteAgent(text: string): string | null;
29
- export declare function InboxQueueStrip({ conversationId }: InboxQueueStripProps): React.JSX.Element | null;
29
+ /**
30
+ * The platform's Turn-Boundary Inbox (server-held queued / steering messages). A host-owned
31
+ * conversation queues through its own source and shows its own queue, so the strip is absent
32
+ * there (G-DOOR gate).
33
+ */
34
+ export declare function InboxQueueStrip(props: InboxQueueStripProps): React.JSX.Element | null;
30
35
  export {};
@@ -32,6 +32,7 @@ import {
32
32
  removeInboxItem
33
33
  } from "../../../redux/execution-system/inbox/inbox.slice.js";
34
34
  import { Button } from "@ai-matrx/design-system/controls";
35
+ import { useConversationAbilities } from "../../../redux/execution-system/host-conversations/conversation-abilities.js";
35
36
  const queueActionClassName = "h-11 w-11 min-h-11 min-w-11 shrink-0 rounded p-0 text-muted-foreground hover:bg-muted hover:text-foreground lg:h-8 lg:w-8 lg:min-h-8 lg:min-w-8";
36
37
  function statusLabel(item, running) {
37
38
  if (item.status === "failed") return item.error ?? "Failed to send";
@@ -51,7 +52,11 @@ function parseCollabNoteAgent(text) {
51
52
  const match = /^\[Collaboration note\]\s+Agent\s+'([^']+)'/.exec(text);
52
53
  return match?.[1] ?? null;
53
54
  }
54
- function InboxQueueStrip({ conversationId }) {
55
+ function InboxQueueStrip(props) {
56
+ const { hosted } = useConversationAbilities();
57
+ return hosted ? null : /* @__PURE__ */ jsx(InboxQueueStripBody, { ...props });
58
+ }
59
+ function InboxQueueStripBody({ conversationId }) {
55
60
  const dispatch = useAppDispatch();
56
61
  const items = useAppSelector(selectInboxItems(conversationId));
57
62
  const streamingHere = useAppSelector(selectIsExecuting(conversationId));
@@ -40,6 +40,7 @@ import { isMacLike } from "../../../utils/platform-keys.js";
40
40
  import { MicDeviceMenu } from "../../../../host/ui-slots.js";
41
41
  import { Button, SplitButton } from "@ai-matrx/design-system/controls";
42
42
  import { cn } from "@ai-matrx/design-system";
43
+ import { useConversationAbilities } from "../../../redux/execution-system/host-conversations/conversation-abilities.js";
43
44
  const INPUT_BUTTON_IDLE_TINT = "text-muted-foreground/60 hover:text-foreground hover:bg-muted/60";
44
45
  function InputButton({
45
46
  icon: Icon,
@@ -74,6 +75,7 @@ function InputActionButtons({
74
75
  composer
75
76
  }) {
76
77
  const dispatch = useAppDispatch();
78
+ const { database } = useConversationAbilities();
77
79
  const [voiceBusy, setVoiceBusy] = useState(false);
78
80
  const [liveAudioOn, setLiveAudioOn] = useState(composer.liveAudioStartsOn ?? false);
79
81
  const agentId = useAppSelector(selectAgentIdFromInstance(conversationId)) ?? null;
@@ -106,7 +108,7 @@ function InputActionButtons({
106
108
  const handleStop = useCallback(() => {
107
109
  dispatch(cancelExecution(executingConversationId ?? conversationId));
108
110
  }, [executingConversationId, conversationId, dispatch]);
109
- const liveAudioButton = showSendButton && agentId ? /* @__PURE__ */ jsx(
111
+ const liveAudioButton = database && showSendButton && agentId ? /* @__PURE__ */ jsx(
110
112
  VoiceRelayBar,
111
113
  {
112
114
  variant: "composer",
@@ -127,7 +129,7 @@ function InputActionButtons({
127
129
  active: showVariablePanel
128
130
  }
129
131
  ) : null;
130
- const plusMenu = /* @__PURE__ */ jsx(
132
+ const plusMenu = database ? /* @__PURE__ */ jsx(
131
133
  RunControlsMenu,
132
134
  {
133
135
  conversationId,
@@ -145,8 +147,8 @@ function InputActionButtons({
145
147
  onLiveAudio: () => setLiveAudioOn(true)
146
148
  }
147
149
  }
148
- );
149
- const micGroup = showMicrophone ? /* @__PURE__ */ jsxs(SplitButton, { className: "shrink-0", children: [
150
+ ) : null;
151
+ const micGroup = database && showMicrophone ? /* @__PURE__ */ jsxs(SplitButton, { className: "shrink-0", children: [
150
152
  /* @__PURE__ */ jsx(
151
153
  AgentMicrophoneButton,
152
154
  {
@@ -182,7 +184,7 @@ function InputActionButtons({
182
184
  return /* @__PURE__ */ jsxs("div", { "data-composer-row": "", className: "flex min-w-0 items-center justify-between gap-1.5 shrink-0", children: [
183
185
  /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 shrink-0 items-center gap-1.5", children: [
184
186
  plusMenu,
185
- /* @__PURE__ */ jsx(DesktopPresenceIndicator, { conversationId }),
187
+ database ? /* @__PURE__ */ jsx(DesktopPresenceIndicator, { conversationId }) : null,
186
188
  variablesToggle,
187
189
  micGroup,
188
190
  composer.folded && !liveAudioOn ? null : liveAudioButton,
@@ -199,7 +201,7 @@ function InputActionButtons({
199
201
  /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center justify-between gap-1.5 shrink-0 lg:h-8", children: [
200
202
  /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-1.5", children: [
201
203
  plusMenu,
202
- /* @__PURE__ */ jsx(DesktopPresenceIndicator, { conversationId }),
204
+ database ? /* @__PURE__ */ jsx(DesktopPresenceIndicator, { conversationId }) : null,
203
205
  variablesToggle
204
206
  ] }),
205
207
  /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-1.5", children: [
@@ -11,5 +11,9 @@ interface SmartInputFileDropTargetProps extends Omit<React.ComponentPropsWithout
11
11
  pasteFiles?: boolean;
12
12
  children: React.ReactNode;
13
13
  }
14
- export declare function SmartInputFileDropTarget({ conversationId, uploadRoot, uploadPath, pasteFiles, className, children, ...rootProps }: SmartInputFileDropTargetProps): import("react").JSX.Element;
14
+ /**
15
+ * Dropped and pasted files upload to the platform's file store. A host-owned conversation with
16
+ * no database has no store, so the card is a plain box there — no drop zone (G-DOOR gate).
17
+ */
18
+ export declare function SmartInputFileDropTarget(props: SmartInputFileDropTargetProps): import("react").JSX.Element;
15
19
  export {};
@@ -4,7 +4,14 @@ import { useDropzone } from "react-dropzone";
4
4
  import { Loader2, Upload } from "lucide-react";
5
5
  import { cn } from "@ai-matrx/design-system";
6
6
  import { useUploadAgentResources } from "../resources/usePasteImageResource.js";
7
- function SmartInputFileDropTarget({
7
+ import { useConversationAbilities } from "../../../redux/execution-system/host-conversations/conversation-abilities.js";
8
+ function SmartInputFileDropTarget(props) {
9
+ const { database } = useConversationAbilities();
10
+ if (database) return /* @__PURE__ */ jsx(SmartInputFileDropTargetBody, { ...props });
11
+ const { conversationId: _c, uploadRoot: _r, uploadPath: _p, pasteFiles: _f, className, children, ...rootProps } = props;
12
+ return /* @__PURE__ */ jsx("div", { ...rootProps, className: cn("relative", className), "data-agent-input-shell": true, children });
13
+ }
14
+ function SmartInputFileDropTargetBody({
8
15
  conversationId,
9
16
  uploadRoot,
10
17
  uploadPath,
@@ -280,13 +280,13 @@ function ChatPresetsPanel({
280
280
  /* @__PURE__ */ jsx("div", { className: "px-1.5 pb-1", children: info.isCustom ? /* @__PURE__ */ jsx(
281
281
  ModelListDropdown,
282
282
  {
283
- value: personalModelId,
283
+ value: personalModelId ?? info.effectiveModelId,
284
284
  onValueChange: (modelId) => void setPersonalModel(modelId),
285
285
  pinnedOfferingId,
286
286
  onOfferingPinChange: setPersonalClass,
287
287
  inputModalities: [],
288
288
  outputModalities: ["text"],
289
- placeholder: personalModelLabel ?? "Pick a model",
289
+ placeholder: personalModelLabel ?? info.effectiveModelLabel ?? "Pick a model",
290
290
  "aria-label": "Model for Custom",
291
291
  className: "w-full"
292
292
  }
@@ -1,9 +1,12 @@
1
1
  import type { ComposerMode } from "./composer-types.js";
2
- export declare function ComposerChipsRow({ conversationId, mode, menuSide, className, chipShape, }: {
2
+ type ComposerChipsRowProps = {
3
3
  conversationId: string;
4
4
  mode: ComposerMode;
5
5
  menuSide: "top" | "bottom";
6
6
  className?: string;
7
7
  /** Corner option under comparison (Arman, 2026-10-03): `soft` = 8px corners. */
8
8
  chipShape?: "md" | "soft";
9
- }): import("react").JSX.Element;
9
+ };
10
+ /** Environment + connections: database- and server-backed, so absent on a host-owned conversation (G-DOOR gate). */
11
+ export declare function ComposerChipsRow(props: ComposerChipsRowProps): import("react").JSX.Element | null;
12
+ export {};
@@ -13,7 +13,12 @@ import { ComposerEnvironmentPanel } from "./ComposerPlusMenu.js";
13
13
  import { COMPOSER_ROW_CLASS } from "./composer-chip.js";
14
14
  import { ComposerChip } from "../ComposerChip.js";
15
15
  import { composerShows } from "./composer-mode-visibility.js";
16
- function ComposerChipsRow({
16
+ import { useConversationAbilities } from "../../../../redux/execution-system/host-conversations/conversation-abilities.js";
17
+ function ComposerChipsRow(props) {
18
+ const { database } = useConversationAbilities();
19
+ return database ? /* @__PURE__ */ jsx(ComposerChipsRowBody, { ...props }) : null;
20
+ }
21
+ function ComposerChipsRowBody({
17
22
  conversationId,
18
23
  mode,
19
24
  menuSide,
@@ -1,8 +1,4 @@
1
1
  import type { ComposerPresentation } from "./composer-types.js";
2
- /**
3
- * The value-group chip, in the meta row beside Output (Arman, 2026-10-03): the
4
- * card never spends a whole row on this one chip. The rail is told not to draw it.
5
- */
6
2
  export declare function ComposerValueGroupChip({ conversationId }: {
7
3
  conversationId: string;
8
4
  }): import("react").JSX.Element | null;
@@ -15,21 +11,23 @@ export declare function ComposerScopeCluster({ conversationId, composer, folded,
15
11
  conversationId: string;
16
12
  composer: ComposerPresentation;
17
13
  folded?: boolean;
18
- }): import("react").JSX.Element;
14
+ }): import("react").JSX.Element | null;
19
15
  /**
20
16
  * Agent · Output · Effort (Work+) — the right cluster of the meta row and of
21
17
  * Compact's row. Narrow: Output and Effort ride the agent pill's menu.
22
18
  */
23
- export declare function ComposerPills({ conversationId, composer, menuSide, folded, }: {
19
+ type ComposerPillsProps = {
24
20
  conversationId: string;
25
21
  composer: ComposerPresentation;
26
22
  menuSide: "top" | "bottom";
27
23
  folded?: boolean;
28
- }): import("react").JSX.Element;
24
+ };
25
+ export declare function ComposerPills(props: ComposerPillsProps): import("react").JSX.Element | null;
29
26
  export declare function ComposerMetaRow({ conversationId, composer, menuSide, folded, }: {
30
27
  conversationId: string;
31
28
  composer: ComposerPresentation;
32
29
  menuSide: "top" | "bottom";
33
30
  /** Under 480px of composer width (useComposerFold). */
34
31
  folded?: boolean;
35
- }): import("react").JSX.Element;
32
+ }): import("react").JSX.Element | null;
33
+ export {};