@ai-matrx/chat 0.4.22 → 0.4.26

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 (68) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/dist/agent-copy/RichCopySplit.d.ts +11 -1
  3. package/dist/agent-copy/RichCopySplit.js +9 -3
  4. package/dist/agents/components/chat/ChatConversationRoom.js +6 -4
  5. package/dist/agents/components/chat/ChatNewClient.js +7 -4
  6. package/dist/agents/components/chat/ChatNewHeader.js +3 -2
  7. package/dist/agents/components/chat/default-chat-mandate.d.ts +7 -0
  8. package/dist/agents/components/chat/default-chat-mandate.js +9 -0
  9. package/dist/agents/components/context-items/bodies/UnregisteredBody.d.ts +6 -3
  10. package/dist/agents/components/context-items/bodies/UnregisteredBody.js +3 -9
  11. package/dist/agents/components/inputs/resources/attach-resource.js +1 -0
  12. package/dist/agents/components/inputs/smart-input/SmartAgentInput.js +16 -1
  13. package/dist/agents/components/inputs/smart-input/composer/ComposerMenu.js +3 -2
  14. package/dist/agents/components/inputs/smart-input/composer/ComposerPlusMenu.js +41 -35
  15. package/dist/agents/components/messages-display/assistant/AgentAssistantMessage.js +29 -20
  16. package/dist/agents/components/messages-display/user/AgentUserMessage.js +3 -1
  17. package/dist/agents/components/shared/AgentConversationColumn.d.ts +10 -1
  18. package/dist/agents/components/shared/AgentConversationColumn.js +26 -2
  19. package/dist/agents/redux/execution-system/messages/messages.slice.js +6 -1
  20. package/dist/agents/redux/execution-system/thunks/await-launching-conversation.d.ts +16 -0
  21. package/dist/agents/redux/execution-system/thunks/await-launching-conversation.js +16 -0
  22. package/dist/agents/redux/execution-system/thunks/execute-instance.thunk.js +34 -1
  23. package/dist/agents/redux/execution-system/thunks/process-stream.js +11 -0
  24. package/dist/agents/redux/execution-system/thunks/smart-execute.thunk.js +10 -0
  25. package/dist/agents/redux/execution-system/utils/required-organization.js +2 -2
  26. package/dist/agents/ui-first-tools/redux/build-ambient-context.js +8 -7
  27. package/dist/host/app-data-slots.d.ts +0 -1
  28. package/dist/host/app-data-slots.js +25 -5
  29. package/dist/host/bare-host-chrome.js +4 -0
  30. package/dist/host/contract.d.ts +8 -2
  31. package/dist/host/contract.js +2 -1
  32. package/dist/host/conversation-hooks-react.d.ts +2 -0
  33. package/dist/host/conversation-hooks-react.js +12 -0
  34. package/dist/host/conversation-hooks.d.ts +79 -0
  35. package/dist/host/conversation-hooks.js +91 -0
  36. package/dist/host/defaults/bare-block-dispatch.d.ts +6 -0
  37. package/dist/host/defaults/bare-block-dispatch.js +60 -0
  38. package/dist/host/defaults/files-host.d.ts +26 -0
  39. package/dist/host/defaults/files-host.js +212 -0
  40. package/dist/host/defaults/memory-navigation.d.ts +12 -0
  41. package/dist/host/defaults/memory-navigation.js +102 -0
  42. package/dist/host/defaults/resource-picker-menu.d.ts +14 -0
  43. package/dist/host/defaults/resource-picker-menu.js +117 -0
  44. package/dist/host/defaults/setting-control-input.d.ts +11 -0
  45. package/dist/host/defaults/setting-control-input.js +91 -0
  46. package/dist/host/index.d.ts +2 -0
  47. package/dist/host/index.js +5 -0
  48. package/dist/host/react.d.ts +1 -0
  49. package/dist/host/react.js +2 -0
  50. package/dist/host/ui-slots.d.ts +25 -1
  51. package/dist/host/ui-slots.js +83 -25
  52. package/dist/host/window-openers.d.ts +2 -0
  53. package/dist/host/window-openers.js +4 -0
  54. package/dist/react.cjs +1 -1
  55. package/dist/react.cjs.map +1 -1
  56. package/dist/react.js +1 -1
  57. package/dist/react.js.map +1 -1
  58. package/dist/tool-call-visualization/registry/registry.js +4 -4
  59. package/dist/ui/aspect-ratio-options.d.ts +4 -26
  60. package/dist/ui/aspect-ratio-options.js +7 -75
  61. package/dist/ui/chat-panel/ChatPanel.d.ts +50 -0
  62. package/dist/ui/chat-panel/ChatPanel.js +175 -0
  63. package/dist/ui/chat-panel/drag.d.ts +87 -0
  64. package/dist/ui/chat-panel/drag.js +194 -0
  65. package/dist/window-panels/windows/agents/AgentRunWindow.js +17 -0
  66. package/dist/window-panels/windows/agents/agentRunWindowAddress.d.ts +19 -0
  67. package/dist/window-panels/windows/agents/agentRunWindowAddress.js +11 -1
  68. package/package.json +5 -5
@@ -1,12 +1,33 @@
1
1
  "use client";
2
2
  import { defaultResourcePickerItems } from "../agents/resources/default-picker-items.js";
3
3
  import { isRfc9562Uuid } from "@ai-matrx/kit/uuid";
4
- import { createElement, Fragment, useRef } from "react";
4
+ import { Component, createElement, Fragment, useRef } from "react";
5
5
  import { formatCost, usdToPoints } from "@ai-matrx/kit/format";
6
+ import { announceOnce } from "./errors.js";
6
7
  import { reportUnregisteredHostSlot as reportUnregistered } from "./diagnostics.js";
7
8
  import { DefaultWebpageSnapshotView } from "./defaults/webpage-snapshot-view.js";
8
9
  import { DefaultWorkspaceGate } from "./defaults/workspace-gate.js";
9
10
  import { DefaultFullScreenOverlay, DefaultWindowPanel } from "./defaults/window-panel.js";
11
+ import { DefaultSettingControlInput } from "./defaults/setting-control-input.js";
12
+ import { DefaultResourcePickerMenu } from "./defaults/resource-picker-menu.js";
13
+ import { captureReactRenderError } from "./diagnostics.js";
14
+ import {
15
+ ConfirmDialog as PackageConfirmDialog,
16
+ FloatingSheet as PackageFloatingSheet,
17
+ ReadFailure as PackageReadFailure,
18
+ TextInputDialog as PackageTextInputDialog,
19
+ UntrustedCount as PackageUntrustedCount
20
+ } from "@ai-matrx/design-system";
21
+ import {
22
+ AspectRatioSelect as PackageAspectRatioSelect,
23
+ ClampedNumberInput as PackageClampedNumberInput,
24
+ ConfigurationTable as PackageConfigurationTable,
25
+ ConfigurationTableRow as PackageConfigurationTableRow,
26
+ FieldHelp as PackageFieldHelp,
27
+ LightSwitchToggle as PackageLightSwitchToggle,
28
+ OptionCombobox as PackageOptionCombobox,
29
+ NumberStepper as PackageNumberStepper
30
+ } from "@ai-matrx/design-system/controls";
10
31
  const slots = {};
11
32
  function registerChatUi(next) {
12
33
  Object.assign(slots, next);
@@ -14,26 +35,48 @@ function registerChatUi(next) {
14
35
  function resetChatUiForTests() {
15
36
  for (const key of Object.keys(slots)) delete slots[key];
16
37
  }
38
+ function isHostSlotRegistered(name) {
39
+ return slots[name] !== void 0;
40
+ }
41
+ class SlotBoundary extends Component {
42
+ state = { failed: false };
43
+ static getDerivedStateFromError() {
44
+ return { failed: true };
45
+ }
46
+ componentDidCatch(error) {
47
+ if (announceOnce(`chat-host-slot-failed:${this.props.name}`, `The chat slot "${this.props.name}" failed to render, so it is left out.`)) {
48
+ captureReactRenderError(error, { boundary: `ChatUi(${this.props.name})` });
49
+ }
50
+ }
51
+ render() {
52
+ return this.state.failed ? null : this.props.children ?? null;
53
+ }
54
+ }
17
55
  function slotComponent(name, Fallback) {
18
56
  const Wrapper = (props) => {
19
57
  const Impl = slots[name];
20
58
  if (!Impl) {
21
59
  const absent = !Fallback || Fallback.optionalAbsent;
22
- reportUnregistered(name, absent ? "it renders nothing here" : "a plain stand-in is drawn");
23
- return Fallback ? createElement(Fallback, props) : null;
60
+ if (!Fallback?.isPackageDefault) {
61
+ reportUnregistered(name, absent ? "it renders nothing here" : "a plain stand-in is drawn");
62
+ }
63
+ return Fallback ? createElement(SlotBoundary, { name }, createElement(Fallback, props)) : null;
24
64
  }
25
- return createElement(Impl, props);
65
+ return createElement(SlotBoundary, { name }, createElement(Impl, props));
26
66
  };
27
67
  Wrapper.displayName = `ChatUi(${name})`;
28
68
  return Wrapper;
29
69
  }
70
+ function withPackageDefault(Component2) {
71
+ const PackageDefault = (props) => createElement(Component2, props);
72
+ PackageDefault.displayName = `PackageDefault(${Component2.displayName ?? Component2.name ?? "component"})`;
73
+ PackageDefault.isPackageDefault = true;
74
+ return PackageDefault;
75
+ }
30
76
  function unregisteredWidget(name) {
31
- const UnregisteredWidget = () => createElement(
32
- "span",
33
- { className: "text-[11px] text-muted-foreground", "data-chat-slot-fallback": name },
34
- `${name} is not set up here`
35
- );
77
+ const UnregisteredWidget = ({ children }) => createElement(Fragment, null, children ?? null);
36
78
  UnregisteredWidget.displayName = `UnregisteredWidget(${name})`;
79
+ UnregisteredWidget.optionalAbsent = true;
37
80
  return UnregisteredWidget;
38
81
  }
39
82
  function optionalWidget(name) {
@@ -241,7 +284,7 @@ const SystemInstructionModal = slotComponent("SystemInstructionModal", optionalW
241
284
  const WindowPanel = slotComponent("WindowPanel", DefaultWindowPanel);
242
285
  const FullScreenOverlay = slotComponent("FullScreenOverlay", DefaultFullScreenOverlay);
243
286
  const ResourcePickerWindow = slotComponent("ResourcePickerWindow", optionalWidget("ResourcePickerWindow"));
244
- const ResourcePickerMenu = slotComponent("ResourcePickerMenu", optionalWidget("ResourcePickerMenu"));
287
+ const ResourcePickerMenu = slotComponent("ResourcePickerMenu", (props) => createElement(DefaultResourcePickerMenu, props));
245
288
  const FilesResourcePicker = slotComponent("FilesResourcePicker", optionalWidget("FilesResourcePicker"));
246
289
  const NotePickerPopover = slotComponent("NotePickerPopover", optionalWidget("NotePickerPopover"));
247
290
  const SmartInputMessageTemplatePicker = slotComponent(
@@ -288,9 +331,9 @@ const useRecordAndTranscribe = slotFn("useRecordAndTranscribe");
288
331
  const requestScribeAudioSeek = slotFn("requestScribeAudioSeek", () => void 0);
289
332
  const resolvePdfSurfaceIds = slotFn("resolvePdfSurfaceIds");
290
333
  const readListRpc = slotFn("readListRpc");
291
- const ReadFailure = slotComponent("ReadFailure", unregisteredWidget("ReadFailure"));
334
+ const ReadFailure = slotComponent("ReadFailure", withPackageDefault(PackageReadFailure));
292
335
  const ItemRow = slotComponent("ItemRow", unregisteredWidget("ItemRow"));
293
- const UntrustedCount = slotComponent("UntrustedCount", unregisteredWidget("UntrustedCount"));
336
+ const UntrustedCount = slotComponent("UntrustedCount", withPackageDefault(PackageUntrustedCount));
294
337
  function PlainStaleDataNotice(props) {
295
338
  const what = props.what ?? "this";
296
339
  const sentence = props.hasData ? `Showing what was last read; ${what} could not be refreshed.` : `Could not read ${what}.`;
@@ -310,7 +353,7 @@ const StaleDataNotice = slotComponent("StaleDataNotice", PlainStaleDataNotice);
310
353
  const WorkspaceGate = slotComponent("WorkspaceGate", DefaultWorkspaceGate);
311
354
  const OrganizationContextNotice = slotComponent("OrganizationContextNotice", unregisteredWidget("OrganizationContextNotice"));
312
355
  const JsonInspector = slotComponent("JsonInspector", unregisteredWidget("JsonInspector"));
313
- const ConfirmDialog = slotComponent("ConfirmDialog", unregisteredWidget("ConfirmDialog"));
356
+ const ConfirmDialog = slotComponent("ConfirmDialog", withPackageDefault(PackageConfirmDialog));
314
357
  import { ModelListDropdown } from "@ai-matrx/agents/models/react";
315
358
  const TextWithDoors = slotComponent("TextWithDoors", unregisteredWidget("TextWithDoors"));
316
359
  const EntityDoorControls = slotComponent("EntityDoorControls", unregisteredWidget("EntityDoorControls"));
@@ -318,12 +361,12 @@ const StructuredValueView = slotComponent("StructuredValueView", unregisteredWid
318
361
  const KindValueFrontDoor = slotComponent("KindValueFrontDoor", unregisteredWidget("KindValueFrontDoor"));
319
362
  const KindDataGate = slotComponent("KindDataGate", unregisteredWidget("KindDataGate"));
320
363
  const ServerNotes = slotComponent("ServerNotes", unregisteredWidget("ServerNotes"));
321
- const OptionCombobox = slotComponent("OptionCombobox", unregisteredWidget("OptionCombobox"));
322
- const NumberStepper = slotComponent("NumberStepper", unregisteredWidget("NumberStepper"));
364
+ const OptionCombobox = slotComponent("OptionCombobox", withPackageDefault(PackageOptionCombobox));
365
+ const NumberStepper = slotComponent("NumberStepper", withPackageDefault(PackageNumberStepper));
323
366
  const MatrxFloatingFrame = slotComponent("MatrxFloatingFrame", unregisteredWidget("MatrxFloatingFrame"));
324
367
  const ItemMenu = slotComponent("ItemMenu", unregisteredWidget("ItemMenu"));
325
- const ClampedNumberInput = slotComponent("ClampedNumberInput", unregisteredWidget("ClampedNumberInput"));
326
- const AspectRatioSelect = slotComponent("AspectRatioSelect", unregisteredWidget("AspectRatioSelect"));
368
+ const ClampedNumberInput = slotComponent("ClampedNumberInput", withPackageDefault(PackageClampedNumberInput));
369
+ const AspectRatioSelect = slotComponent("AspectRatioSelect", withPackageDefault(PackageAspectRatioSelect));
327
370
  const AnswerTextPreview = slotComponent("AnswerTextPreview", unregisteredWidget("AnswerTextPreview"));
328
371
  const AccessGate = slotComponent("AccessGate", unregisteredWidget("AccessGate"));
329
372
  const ReferenceCopyMenuItem = slotComponent("ReferenceCopyMenuItem", unregisteredWidget("ReferenceCopyMenuItem"));
@@ -340,16 +383,16 @@ const VoiceTextarea = slotComponent("VoiceTextarea", (props) => {
340
383
  const { onChange, value, className, placeholder, rows, id, ref, autoFocus, disabled } = props;
341
384
  return createElement("textarea", { ref, id, value, onChange, className, placeholder, rows, autoFocus, disabled, "data-chat-slot-fallback": "textarea" });
342
385
  });
343
- const FloatingSheet = slotComponent("FloatingSheet", unregisteredWidget("FloatingSheet"));
386
+ const FloatingSheet = slotComponent("FloatingSheet", withPackageDefault(PackageFloatingSheet));
344
387
  const AppLink = slotComponent("AppLink", ({ href, children, className, ...rest }) => createElement("a", { href, className, ...rest }, children));
345
388
  const IconButton = slotComponent("IconButton", unregisteredWidget("IconButton"));
346
- const LightSwitchToggle = slotComponent("LightSwitchToggle", unregisteredWidget("LightSwitchToggle"));
389
+ const LightSwitchToggle = slotComponent("LightSwitchToggle", withPackageDefault(PackageLightSwitchToggle));
347
390
  const CitationChip = slotComponent("CitationChip", unregisteredWidget("CitationChip"));
348
391
  const MatrxEnvelopeBlock = slotComponent("MatrxEnvelopeBlock", unregisteredWidget("MatrxEnvelopeBlock"));
349
392
  const ErrorBoundaryWithCapture = slotComponent("ErrorBoundaryWithCapture", ({ children }) => children ?? null);
350
- const ConfigurationTable = slotComponent("ConfigurationTable", unregisteredWidget("ConfigurationTable"));
351
- const ConfigurationTableRow = slotComponent("ConfigurationTableRow", unregisteredWidget("ConfigurationTableRow"));
352
- const FieldHelp = slotComponent("FieldHelp", unregisteredWidget("FieldHelp"));
393
+ const ConfigurationTable = slotComponent("ConfigurationTable", withPackageDefault(PackageConfigurationTable));
394
+ const ConfigurationTableRow = slotComponent("ConfigurationTableRow", withPackageDefault(PackageConfigurationTableRow));
395
+ const FieldHelp = slotComponent("FieldHelp", withPackageDefault(PackageFieldHelp));
353
396
  const HtmlPreviewFullScreenEditor = slotComponent("HtmlPreviewFullScreenEditor", unregisteredWidget("HtmlPreviewFullScreenEditor"));
354
397
  const AgentEditAccessBadge = slotComponent("AgentEditAccessBadge", unregisteredWidget("AgentEditAccessBadge"));
355
398
  const DataRefPreviewContent = slotComponent("DataRefPreviewContent", unregisteredWidget("DataRefPreviewContent"));
@@ -377,7 +420,20 @@ const useSkills = slotFn("useSkills");
377
420
  const useAutoLabel = slotFn("useAutoLabel", () => void 0);
378
421
  const generateLabelFromContent = slotFn("generateLabelFromContent");
379
422
  const usePickListForSelection = slotFn("usePickListForSelection");
380
- const useGitHubConnection = slotFn("useGitHubConnection");
423
+ const NO_GITHUB = { connection: null, repositories: NONE, account: null, installations: NONE, syncedRepositoryCount: 0, lastSyncedAt: null };
424
+ const noGitHubAction = async () => void 0;
425
+ const useGitHubConnection = slotFn("useGitHubConnection", () => ({
426
+ inventory: NO_GITHUB,
427
+ loading: false,
428
+ busy: false,
429
+ error: null,
430
+ readError: null,
431
+ reload: noGitHubAction,
432
+ connect: noGitHubAction,
433
+ install: noGitHubAction,
434
+ sync: noGitHubAction,
435
+ disconnect: noGitHubAction
436
+ }));
381
437
  const useOutputFeedback = slotFn("useOutputFeedback");
382
438
  const saveOutputFeedback = slotFn("saveOutputFeedback");
383
439
  const precedingQuestion = slotFn("precedingQuestion");
@@ -451,13 +507,13 @@ const AgentSaveTapButton = slotComponent("AgentSaveTapButton");
451
507
  const AgentPeekDuplicateButton = slotComponent("AgentPeekDuplicateButton");
452
508
  const CreatorRunPanel = slotComponent("CreatorRunPanel");
453
509
  const AgentSettingsCore = slotComponent("AgentSettingsCore", unregisteredWidget("AgentSettingsCore"));
454
- const SettingControlInput = slotComponent("SettingControlInput", unregisteredWidget("SettingControlInput"));
510
+ const SettingControlInput = slotComponent("SettingControlInput", (props) => createElement(DefaultSettingControlInput, props));
455
511
  const InputCapabilitiesEditor = slotComponent("InputCapabilitiesEditor", unregisteredWidget("InputCapabilitiesEditor"));
456
512
  const CustomDataBindingSummary = slotComponent("CustomDataBindingSummary", unregisteredWidget("CustomDataBindingSummary"));
457
513
  const CustomDataBindingPreview = slotComponent("CustomDataBindingPreview", unregisteredWidget("CustomDataBindingPreview"));
458
514
  const AiModelRef = slotComponent("AiModelRef", unregisteredWidget("AiModelRef"));
459
515
  const AiToolRef = slotComponent("AiToolRef", unregisteredWidget("AiToolRef"));
460
- const TextInputDialog = slotComponent("TextInputDialog", unregisteredWidget("TextInputDialog"));
516
+ const TextInputDialog = slotComponent("TextInputDialog", withPackageDefault(PackageTextInputDialog));
461
517
  const ProInput = slotComponent("ProInput", (props) => createElement("input", { ...props, "data-chat-slot-fallback": "input" }));
462
518
  const MatrxDynamicPanelHost = slotComponent("MatrxDynamicPanelHost", unregisteredWidget("MatrxDynamicPanelHost"));
463
519
  const useClippedContentGuard = slotFn("useClippedContentGuard");
@@ -571,6 +627,7 @@ export {
571
627
  ShareButton,
572
628
  ShareModal,
573
629
  SimpleTerminal,
630
+ SlotBoundary,
574
631
  SmartInputMessageTemplatePicker,
575
632
  SpeakerButton,
576
633
  StaleDataNotice,
@@ -629,6 +686,7 @@ export {
629
686
  humanLines,
630
687
  invalidateCanvasItemCache,
631
688
  invalidateMandateCatalogueCache,
689
+ isHostSlotRegistered,
632
690
  isSkillStreamEvent,
633
691
  isUuidValue,
634
692
  isWarRoomThreadAgentSurface,
@@ -326,6 +326,8 @@ export interface ChatWindowOpeners {
326
326
  export type ChatWindowOpenerName = keyof ChatWindowOpeners;
327
327
  /** What a host that registers no openers gets — every one announces itself. */
328
328
  export declare const UNHOSTED_WINDOW_OPENERS: ChatWindowOpeners;
329
+ /** True when the host can actually open this window (a bare host has no window host: draw the surface inline instead). */
330
+ export declare function useHasChatWindowOpener(name: ChatWindowOpenerName): boolean;
329
331
  export declare function useOpenAgentAdminFindUsagesWindow(): (opts?: OpenAgentAdminFindUsagesWindowOptions) => ChatWindowHandle;
330
332
  export declare function useOpenAgentShortcutQuickCreateWindow(): (opts?: OpenAgentShortcutQuickCreateWindowOptions) => ChatWindowHandle;
331
333
  export declare function useOpenAgentContentWindow(): (opts?: OpenAgentContentWindowOptions) => ChatWindowHandle;
@@ -61,6 +61,9 @@ const UNHOSTED_WINDOW_OPENERS = {
61
61
  openWorkingDocumentPanel: unhosted("openWorkingDocumentPanel"),
62
62
  openWorkingDocumentWindow: unhosted("openWorkingDocumentWindow")
63
63
  };
64
+ function useHasChatWindowOpener(name) {
65
+ return Boolean(useChatWindows().openers?.[name]);
66
+ }
64
67
  function useOpener(name) {
65
68
  return useChatWindows().openers?.[name] ?? UNHOSTED_WINDOW_OPENERS[name];
66
69
  }
@@ -236,6 +239,7 @@ function useOpenWorkingDocumentWindow() {
236
239
  export {
237
240
  UNHOSTED_WINDOW_OPENERS,
238
241
  useFloatingLiveRun,
242
+ useHasChatWindowOpener,
239
243
  useOpenAgentAdminFindUsagesWindow,
240
244
  useOpenAgentContentWindow,
241
245
  useOpenAgentConvertSystemWindow,
package/dist/react.cjs CHANGED
@@ -3975,7 +3975,7 @@ function joinHeaderClass(...parts) {
3975
3975
  return parts.filter((part) => part !== void 0 && part !== "").join(" ");
3976
3976
  }
3977
3977
 
3978
- // src/compat/react/shells/drag.ts
3978
+ // src/ui/chat-panel/drag.ts
3979
3979
  var import_react18 = require("react");
3980
3980
  var KEYBOARD_STEP_PX = 24;
3981
3981
  function useResizableWidth(options) {