@athenaintel/react 0.28.1 → 0.32.0
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.md +479 -10
- package/dist/agent-runtime/src/asset-attachment.cjs.map +1 -0
- package/dist/agent-runtime/src/asset-attachment.js.map +1 -0
- package/dist/agent-runtime/src/athena-asset-drag.cjs +44 -0
- package/dist/agent-runtime/src/athena-asset-drag.cjs.map +1 -0
- package/dist/agent-runtime/src/athena-asset-drag.js +44 -0
- package/dist/agent-runtime/src/athena-asset-drag.js.map +1 -0
- package/dist/agent-runtime/src/auth-denial.cjs.map +1 -0
- package/dist/agent-runtime/src/auth-denial.js.map +1 -0
- package/dist/agent-runtime/src/client-tool-bridge.cjs.map +1 -0
- package/dist/agent-runtime/src/client-tool-bridge.js.map +1 -0
- package/dist/agent-runtime/src/client-tools.cjs.map +1 -0
- package/dist/agent-runtime/src/client-tools.js.map +1 -0
- package/dist/agent-runtime/src/composer-markdown.cjs +124 -0
- package/dist/agent-runtime/src/composer-markdown.cjs.map +1 -0
- package/dist/agent-runtime/src/composer-markdown.js +124 -0
- package/dist/agent-runtime/src/composer-markdown.js.map +1 -0
- package/dist/agent-runtime/src/config-mutations.cjs +59 -0
- package/dist/agent-runtime/src/config-mutations.cjs.map +1 -0
- package/dist/agent-runtime/src/config-mutations.js +59 -0
- package/dist/agent-runtime/src/config-mutations.js.map +1 -0
- package/dist/agent-runtime/src/conversation-index.cjs.map +1 -0
- package/dist/agent-runtime/src/conversation-index.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/conversation-list.cjs +36 -0
- package/dist/agent-runtime/src/conversation-list.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/conversation-list.js +36 -0
- package/dist/agent-runtime/src/conversation-list.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/deep-agent-transport-recipe.cjs +5 -3
- package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/deep-agent-transport-recipe.js +6 -4
- package/dist/agent-runtime/src/deep-agent-transport-recipe.js.map +1 -0
- package/dist/agent-runtime/src/edit-command.cjs.map +1 -0
- package/dist/agent-runtime/src/edit-command.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/errors.cjs +23 -0
- package/dist/agent-runtime/src/errors.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/errors.js +23 -0
- package/dist/agent-runtime/src/errors.js.map +1 -0
- package/dist/agent-runtime/src/execute-output.cjs +41 -0
- package/dist/agent-runtime/src/execute-output.cjs.map +1 -0
- package/dist/agent-runtime/src/execute-output.js +41 -0
- package/dist/agent-runtime/src/execute-output.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/generated/runconfig-contract.cjs +16 -2
- package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/generated/runconfig-contract.js +16 -2
- package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -0
- package/dist/agent-runtime/src/github-wake-event.cjs.map +1 -0
- package/dist/agent-runtime/src/github-wake-event.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/interrupts.cjs +24 -1
- package/dist/agent-runtime/src/interrupts.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/interrupts.js +24 -1
- package/dist/agent-runtime/src/interrupts.js.map +1 -0
- package/dist/agent-runtime/src/message-author.cjs.map +1 -0
- package/dist/agent-runtime/src/message-author.js.map +1 -0
- package/dist/agent-runtime/src/message-window.cjs.map +1 -0
- package/dist/agent-runtime/src/message-window.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/messages.cjs +8 -4
- package/dist/agent-runtime/src/messages.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/messages.js +6 -2
- package/dist/agent-runtime/src/messages.js.map +1 -0
- package/dist/agent-runtime/src/model-context.cjs.map +1 -0
- package/dist/agent-runtime/src/model-context.js.map +1 -0
- package/dist/agent-runtime/src/optimistic-content.cjs.map +1 -0
- package/dist/agent-runtime/src/optimistic-content.js.map +1 -0
- package/dist/agent-runtime/src/protocol.cjs.map +1 -0
- package/dist/agent-runtime/src/protocol.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/queue.cjs +23 -2
- package/dist/agent-runtime/src/queue.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/queue.js +23 -2
- package/dist/agent-runtime/src/queue.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/quota-safe-local-storage-session.cjs +71 -13
- package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/quota-safe-local-storage-session.js +73 -15
- package/dist/agent-runtime/src/quota-safe-local-storage-session.js.map +1 -0
- package/dist/agent-runtime/src/runtime-messages.cjs.map +1 -0
- package/dist/agent-runtime/src/runtime-messages.js.map +1 -0
- package/dist/agent-runtime/src/screen-point.cjs.map +1 -0
- package/dist/agent-runtime/src/screen-point.js.map +1 -0
- package/dist/agent-runtime/src/send-recovery.cjs.map +1 -0
- package/dist/agent-runtime/src/send-recovery.js.map +1 -0
- package/dist/agent-runtime/src/statewire-attach-observer.cjs.map +1 -0
- package/dist/agent-runtime/src/statewire-attach-observer.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/statewire-state.cjs +8 -0
- package/dist/agent-runtime/src/statewire-state.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/statewire-state.js +8 -0
- package/dist/agent-runtime/src/statewire-state.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/statewire-suspended.cjs +4 -0
- package/dist/agent-runtime/src/statewire-suspended.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/statewire-suspended.js +4 -0
- package/dist/agent-runtime/src/statewire-suspended.js.map +1 -0
- package/dist/agent-runtime/src/statewire-transport.cjs +43 -0
- package/dist/agent-runtime/src/statewire-transport.cjs.map +1 -0
- package/dist/agent-runtime/src/statewire-transport.js +43 -0
- package/dist/agent-runtime/src/statewire-transport.js.map +1 -0
- package/dist/agent-runtime/src/streaming-markdown.cjs.map +1 -0
- package/dist/agent-runtime/src/streaming-markdown.js.map +1 -0
- package/dist/agent-runtime/src/subscription-wake-event.cjs +252 -0
- package/dist/agent-runtime/src/subscription-wake-event.cjs.map +1 -0
- package/dist/agent-runtime/src/subscription-wake-event.js +252 -0
- package/dist/agent-runtime/src/subscription-wake-event.js.map +1 -0
- package/dist/agent-runtime/src/thread-extras.cjs.map +1 -0
- package/dist/agent-runtime/src/thread-extras.js.map +1 -0
- package/dist/agent-runtime/src/thread-snapshot-cache.cjs.map +1 -0
- package/dist/agent-runtime/src/thread-snapshot-cache.js.map +1 -0
- package/dist/agent-runtime/src/thread-status.cjs.map +1 -0
- package/dist/agent-runtime/src/thread-status.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/tool-metadata.cjs +304 -9
- package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/tool-metadata.js +304 -9
- package/dist/agent-runtime/src/tool-metadata.js.map +1 -0
- package/dist/agent-runtime/src/tool-names.cjs +5 -0
- package/dist/agent-runtime/src/tool-names.cjs.map +1 -0
- package/dist/agent-runtime/src/tool-names.js +5 -0
- package/dist/agent-runtime/src/tool-names.js.map +1 -0
- package/dist/agent-runtime/src/tool-outputs.cjs.map +1 -0
- package/dist/agent-runtime/src/tool-outputs.js.map +1 -0
- package/dist/agent-runtime/src/tool-result.cjs.map +1 -0
- package/dist/agent-runtime/src/tool-result.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/use-conversation-list.cjs +33 -22
- package/dist/agent-runtime/src/use-conversation-list.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/use-conversation-list.js +34 -23
- package/dist/agent-runtime/src/use-conversation-list.js.map +1 -0
- package/dist/agent-runtime/src/use-deep-agent-config.cjs +129 -0
- package/dist/agent-runtime/src/use-deep-agent-config.cjs.map +1 -0
- package/dist/agent-runtime/src/use-deep-agent-config.js +129 -0
- package/dist/agent-runtime/src/use-deep-agent-config.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-edit-submit.cjs +2 -0
- package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-edit-submit.js +2 -0
- package/dist/agent-runtime/src/use-deep-agent-edit-submit.js.map +1 -0
- package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -0
- package/dist/agent-runtime/src/use-deep-agent-runtime.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-thread.cjs +1 -0
- package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-thread.js +2 -1
- package/dist/agent-runtime/src/use-deep-agent-thread.js.map +1 -0
- package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs.map +1 -0
- package/dist/agent-runtime/src/use-deep-agent-window-sync.js.map +1 -0
- package/dist/agent-runtime/src/use-historical-edit-attachments.cjs +52 -0
- package/dist/agent-runtime/src/use-historical-edit-attachments.cjs.map +1 -0
- package/dist/agent-runtime/src/use-historical-edit-attachments.js +52 -0
- package/dist/agent-runtime/src/use-historical-edit-attachments.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/voice-presentation.cjs +14 -0
- package/dist/agent-runtime/src/voice-presentation.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/voice-presentation.js +14 -0
- package/dist/agent-runtime/src/voice-presentation.js.map +1 -0
- package/dist/agent-runtime/src/voice-turn-grouping.cjs.map +1 -0
- package/dist/agent-runtime/src/voice-turn-grouping.js.map +1 -0
- package/dist/assets/AthenaAssetEmbed.cjs +13 -2
- package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
- package/dist/assets/AthenaAssetEmbed.d.ts +10 -0
- package/dist/assets/AthenaAssetEmbed.js +14 -3
- package/dist/assets/AthenaAssetEmbed.js.map +1 -1
- package/dist/assets/AthenaLayout.cjs +97 -31
- package/dist/assets/AthenaLayout.cjs.map +1 -1
- package/dist/assets/AthenaLayout.d.ts +13 -0
- package/dist/assets/AthenaLayout.js +98 -32
- package/dist/assets/AthenaLayout.js.map +1 -1
- package/dist/assets/asset-embed-messages.cjs +6 -0
- package/dist/assets/asset-embed-messages.cjs.map +1 -1
- package/dist/assets/asset-embed-messages.d.ts +13 -0
- package/dist/assets/asset-embed-messages.js +6 -0
- package/dist/assets/asset-embed-messages.js.map +1 -1
- package/dist/assets/asset-panel-store.cjs +68 -32
- package/dist/assets/asset-panel-store.cjs.map +1 -1
- package/dist/assets/asset-panel-store.d.ts +47 -1
- package/dist/assets/asset-panel-store.js +68 -32
- package/dist/assets/asset-panel-store.js.map +1 -1
- package/dist/assets/use-asset-embed.cjs +29 -8
- package/dist/assets/use-asset-embed.cjs.map +1 -1
- package/dist/assets/use-asset-embed.d.ts +7 -0
- package/dist/assets/use-asset-embed.js +29 -8
- package/dist/assets/use-asset-embed.js.map +1 -1
- package/dist/catalog/chat-pickers.cjs +152 -0
- package/dist/catalog/chat-pickers.cjs.map +1 -0
- package/dist/catalog/chat-pickers.d.ts +22 -0
- package/dist/catalog/chat-pickers.js +152 -0
- package/dist/catalog/chat-pickers.js.map +1 -0
- package/dist/catalog/runtime-catalog.cjs +181 -0
- package/dist/catalog/runtime-catalog.cjs.map +1 -0
- package/dist/catalog/runtime-catalog.d.ts +100 -0
- package/dist/catalog/runtime-catalog.js +181 -0
- package/dist/catalog/runtime-catalog.js.map +1 -0
- package/dist/chat/AthenaChat.cjs +122 -67
- package/dist/chat/AthenaChat.cjs.map +1 -1
- package/dist/chat/AthenaChat.d.ts +21 -4
- package/dist/chat/AthenaChat.js +124 -69
- package/dist/chat/AthenaChat.js.map +1 -1
- package/dist/chat/StatewireApprovalCard.cjs +38 -37
- package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
- package/dist/chat/StatewireApprovalCard.d.ts +2 -0
- package/dist/chat/StatewireApprovalCard.js +39 -38
- package/dist/chat/StatewireApprovalCard.js.map +1 -1
- package/dist/chat/StatewireClientToolBridge.cjs +2 -2
- package/dist/chat/StatewireClientToolBridge.js +2 -2
- package/dist/chat/StatewireQueuedMessages.cjs +15 -12
- package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
- package/dist/chat/StatewireQueuedMessages.d.ts +22 -2
- package/dist/chat/StatewireQueuedMessages.js +15 -12
- package/dist/chat/StatewireQueuedMessages.js.map +1 -1
- package/dist/chat/StatewireRunRefusalNotice.cjs +48 -0
- package/dist/chat/StatewireRunRefusalNotice.cjs.map +1 -0
- package/dist/chat/StatewireRunRefusalNotice.d.ts +25 -0
- package/dist/chat/StatewireRunRefusalNotice.js +48 -0
- package/dist/chat/StatewireRunRefusalNotice.js.map +1 -0
- package/dist/chat/WaitingOnYouBanner.cjs +2 -2
- package/dist/chat/WaitingOnYouBanner.js +2 -2
- package/dist/chat/athena-citation-links.cjs +19 -15
- package/dist/chat/athena-citation-links.cjs.map +1 -1
- package/dist/chat/athena-citation-links.js +19 -15
- package/dist/chat/athena-citation-links.js.map +1 -1
- package/dist/chat/run-activity.cjs +9 -1
- package/dist/chat/run-activity.cjs.map +1 -1
- package/dist/chat/run-activity.d.ts +6 -0
- package/dist/chat/run-activity.js +10 -2
- package/dist/chat/run-activity.js.map +1 -1
- package/dist/chat/statewire-banners.cjs +30 -1
- package/dist/chat/statewire-banners.cjs.map +1 -1
- package/dist/chat/statewire-banners.d.ts +20 -1
- package/dist/chat/statewire-banners.js +32 -3
- package/dist/chat/statewire-banners.js.map +1 -1
- package/dist/chat/statewire-client-tools.cjs +1 -1
- package/dist/chat/statewire-client-tools.js +1 -1
- package/dist/chat/super-grouping/CollapsibleGroup.cjs +1 -1
- package/dist/chat/super-grouping/CollapsibleGroup.cjs.map +1 -1
- package/dist/chat/super-grouping/CollapsibleGroup.js +1 -1
- package/dist/chat/super-grouping/CollapsibleGroup.js.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingCard.cjs +38 -16
- package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingCard.d.ts +21 -4
- package/dist/chat/super-grouping/SuperGroupingCard.js +39 -17
- package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingTranscript.cjs +377 -0
- package/dist/chat/super-grouping/SuperGroupingTranscript.cjs.map +1 -0
- package/dist/chat/super-grouping/SuperGroupingTranscript.d.ts +31 -0
- package/dist/chat/super-grouping/SuperGroupingTranscript.js +377 -0
- package/dist/chat/super-grouping/SuperGroupingTranscript.js.map +1 -0
- package/dist/chat/super-grouping/ToolTimeline.cjs +13 -2
- package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -1
- package/dist/chat/super-grouping/ToolTimeline.d.ts +10 -3
- package/dist/chat/super-grouping/ToolTimeline.js +13 -2
- package/dist/chat/super-grouping/ToolTimeline.js.map +1 -1
- package/dist/chat/super-grouping/activity-timeline.cjs +69 -29
- package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
- package/dist/chat/super-grouping/activity-timeline.d.ts +60 -9
- package/dist/chat/super-grouping/activity-timeline.js +70 -30
- package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
- package/dist/chat/super-grouping/index.cjs +14 -0
- package/dist/chat/super-grouping/index.cjs.map +1 -1
- package/dist/chat/super-grouping/index.d.ts +7 -2
- package/dist/chat/super-grouping/index.js +16 -2
- package/dist/chat/super-grouping/index.js.map +1 -1
- package/dist/chat/super-grouping/timeline-step.cjs +14 -5
- package/dist/chat/super-grouping/timeline-step.cjs.map +1 -1
- package/dist/chat/super-grouping/timeline-step.d.ts +10 -1
- package/dist/chat/super-grouping/timeline-step.js +15 -6
- package/dist/chat/super-grouping/timeline-step.js.map +1 -1
- package/dist/chat/super-grouping/toolkit-map.cjs +1 -0
- package/dist/chat/super-grouping/toolkit-map.cjs.map +1 -1
- package/dist/chat/super-grouping/toolkit-map.js +1 -0
- package/dist/chat/super-grouping/toolkit-map.js.map +1 -1
- package/dist/chat/super-grouping/turn-segments.cjs +82 -0
- package/dist/chat/super-grouping/turn-segments.cjs.map +1 -0
- package/dist/chat/super-grouping/turn-segments.d.ts +69 -0
- package/dist/chat/super-grouping/turn-segments.js +82 -0
- package/dist/chat/super-grouping/turn-segments.js.map +1 -0
- package/dist/chat/super-grouping/turn-timing.cjs +110 -0
- package/dist/chat/super-grouping/turn-timing.cjs.map +1 -0
- package/dist/chat/super-grouping/turn-timing.d.ts +52 -0
- package/dist/chat/super-grouping/turn-timing.js +110 -0
- package/dist/chat/super-grouping/turn-timing.js.map +1 -0
- package/dist/chat/tiptap-text.cjs +1 -1
- package/dist/chat/tiptap-text.js +1 -1
- package/dist/chat/use-athena-run-live.cjs +1 -1
- package/dist/chat/use-athena-run-live.js +1 -1
- package/dist/chat/use-statewire-approval-request.cjs +73 -4
- package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
- package/dist/chat/use-statewire-approval-request.js +74 -5
- package/dist/chat/use-statewire-approval-request.js.map +1 -1
- package/dist/chat-ui/composer/composer-message.cjs +284 -0
- package/dist/chat-ui/composer/composer-message.cjs.map +1 -0
- package/dist/chat-ui/composer/composer-message.d.ts +152 -0
- package/dist/chat-ui/composer/composer-message.js +284 -0
- package/dist/chat-ui/composer/composer-message.js.map +1 -0
- package/dist/chat-ui/composer/tiptap-composer.cjs +97 -15
- package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
- package/dist/chat-ui/composer/tiptap-composer.d.ts +34 -6
- package/dist/chat-ui/composer/tiptap-composer.js +97 -15
- package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
- package/dist/chat-ui/index.cjs +4 -1
- package/dist/chat-ui/index.cjs.map +1 -1
- package/dist/chat-ui/index.d.ts +3 -2
- package/dist/chat-ui/index.js +5 -2
- package/dist/chat-ui/index.js.map +1 -1
- package/dist/chat-ui/mentions/mention-chip.cjs +31 -3
- package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
- package/dist/chat-ui/mentions/mention-chip.d.ts +2 -5
- package/dist/chat-ui/mentions/mention-chip.js +33 -5
- package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
- package/dist/chat-ui/mentions/mention-extension.cjs +9 -3
- package/dist/chat-ui/mentions/mention-extension.cjs.map +1 -1
- package/dist/chat-ui/mentions/mention-extension.js +9 -3
- package/dist/chat-ui/mentions/mention-extension.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs +3 -1
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.js +3 -1
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +65 -19
- package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +15 -0
- package/dist/chat-ui/mentions/suggestions/data/sources/index.js +67 -21
- package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs +4 -2
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.d.ts +2 -1
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js +5 -3
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js.map +1 -1
- package/dist/chat-ui/mentions/use-account-workspace-id.cjs +61 -0
- package/dist/chat-ui/mentions/use-account-workspace-id.cjs.map +1 -0
- package/dist/chat-ui/mentions/use-account-workspace-id.d.ts +3 -0
- package/dist/chat-ui/mentions/use-account-workspace-id.js +61 -0
- package/dist/chat-ui/mentions/use-account-workspace-id.js.map +1 -0
- package/dist/chat-ui/mentions/use-member-avatar.cjs +75 -0
- package/dist/chat-ui/mentions/use-member-avatar.cjs.map +1 -0
- package/dist/chat-ui/mentions/use-member-avatar.d.ts +2 -0
- package/dist/chat-ui/mentions/use-member-avatar.js +75 -0
- package/dist/chat-ui/mentions/use-member-avatar.js.map +1 -0
- package/dist/chat-ui/messages/message-components.cjs +30 -10
- package/dist/chat-ui/messages/message-components.cjs.map +1 -1
- package/dist/chat-ui/messages/message-components.d.ts +21 -1
- package/dist/chat-ui/messages/message-components.js +30 -10
- package/dist/chat-ui/messages/message-components.js.map +1 -1
- package/dist/chat-ui/messages/runtime-message.cjs +1 -1
- package/dist/chat-ui/messages/runtime-message.js +1 -1
- package/dist/chat-ui/messages/statewire-continue-run.cjs +5 -5
- package/dist/chat-ui/messages/statewire-continue-run.js +5 -5
- package/dist/chat-ui/messages/user-edit-composer.cjs +1 -1
- package/dist/chat-ui/messages/user-edit-composer.js +1 -1
- package/dist/chat-ui/messages/wake-marker.cjs +39 -4
- package/dist/chat-ui/messages/wake-marker.cjs.map +1 -1
- package/dist/chat-ui/messages/wake-marker.d.ts +16 -5
- package/dist/chat-ui/messages/wake-marker.js +40 -5
- package/dist/chat-ui/messages/wake-marker.js.map +1 -1
- package/dist/chat-ui/rich-text/chat-message-body.cjs +12 -8
- package/dist/chat-ui/rich-text/chat-message-body.cjs.map +1 -1
- package/dist/chat-ui/rich-text/chat-message-body.d.ts +6 -1
- package/dist/chat-ui/rich-text/chat-message-body.js +13 -9
- package/dist/chat-ui/rich-text/chat-message-body.js.map +1 -1
- package/dist/chat-ui/rich-text/chat-text-schema.cjs +64 -6
- package/dist/chat-ui/rich-text/chat-text-schema.cjs.map +1 -1
- package/dist/chat-ui/rich-text/chat-text-schema.d.ts +5 -0
- package/dist/chat-ui/rich-text/chat-text-schema.js +66 -8
- package/dist/chat-ui/rich-text/chat-text-schema.js.map +1 -1
- package/dist/chat-ui/statewire.cjs +1 -1
- package/dist/chat-ui/statewire.d.ts +1 -1
- package/dist/chat-ui/statewire.js +1 -1
- package/dist/chat-ui/thread/statewire-history-edge.cjs +2 -2
- package/dist/chat-ui/thread/statewire-history-edge.js +2 -2
- package/dist/collab/client.cjs +282 -16
- package/dist/collab/client.cjs.map +1 -1
- package/dist/collab/client.d.ts +127 -2
- package/dist/collab/client.js +285 -20
- package/dist/collab/client.js.map +1 -1
- package/dist/collab/index.cjs +2 -0
- package/dist/collab/index.cjs.map +1 -1
- package/dist/collab/index.d.ts +1 -1
- package/dist/collab/index.js +3 -1
- package/dist/composer/AttachmentContext.cjs +38 -12
- package/dist/composer/AttachmentContext.cjs.map +1 -1
- package/dist/composer/AttachmentContext.d.ts +22 -1
- package/dist/composer/AttachmentContext.js +40 -14
- package/dist/composer/AttachmentContext.js.map +1 -1
- package/dist/composer/QuoteContext.cjs +80 -28
- package/dist/composer/QuoteContext.cjs.map +1 -1
- package/dist/composer/QuoteContext.d.ts +35 -6
- package/dist/composer/QuoteContext.js +82 -30
- package/dist/composer/QuoteContext.js.map +1 -1
- package/dist/composer/build-composed-message.cjs +27 -0
- package/dist/composer/build-composed-message.cjs.map +1 -1
- package/dist/composer/build-composed-message.d.ts +21 -0
- package/dist/composer/build-composed-message.js +28 -1
- package/dist/composer/build-composed-message.js.map +1 -1
- package/dist/composer/composer-handoff.cjs +13 -1
- package/dist/composer/composer-handoff.cjs.map +1 -1
- package/dist/composer/composer-handoff.d.ts +12 -0
- package/dist/composer/composer-handoff.js +15 -3
- package/dist/composer/composer-handoff.js.map +1 -1
- package/dist/composer/index.d.ts +6 -3
- package/dist/composer/useReadComposerDraft.cjs +16 -0
- package/dist/composer/useReadComposerDraft.cjs.map +1 -0
- package/dist/composer/useReadComposerDraft.d.ts +6 -0
- package/dist/composer/useReadComposerDraft.js +16 -0
- package/dist/composer/useReadComposerDraft.js.map +1 -0
- package/dist/diagnostics/athena-diagnostics.cjs.map +1 -1
- package/dist/diagnostics/athena-diagnostics.d.ts +3 -1
- package/dist/diagnostics/athena-diagnostics.js.map +1 -1
- package/dist/diagnostics/errors.cjs +6 -0
- package/dist/diagnostics/errors.cjs.map +1 -1
- package/dist/diagnostics/errors.d.ts +6 -0
- package/dist/diagnostics/errors.js +6 -0
- package/dist/diagnostics/errors.js.map +1 -1
- package/dist/index.cjs +163 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +55 -12
- package/dist/index.js +170 -14
- package/dist/index.js.map +1 -1
- package/dist/lib/owner-document.cjs +32 -0
- package/dist/lib/owner-document.cjs.map +1 -0
- package/dist/lib/owner-document.d.ts +17 -0
- package/dist/lib/owner-document.js +32 -0
- package/dist/lib/owner-document.js.map +1 -0
- package/dist/lib/portal-surface.cjs +55 -0
- package/dist/lib/portal-surface.cjs.map +1 -0
- package/dist/lib/portal-surface.d.ts +37 -0
- package/dist/lib/portal-surface.js +55 -0
- package/dist/lib/portal-surface.js.map +1 -0
- package/dist/lib/use-athena-rest-query.cjs +34 -0
- package/dist/lib/use-athena-rest-query.cjs.map +1 -0
- package/dist/lib/use-athena-rest-query.d.ts +31 -0
- package/dist/lib/use-athena-rest-query.js +34 -0
- package/dist/lib/use-athena-rest-query.js.map +1 -0
- package/dist/provider/AthenaProvider.cjs +70 -10
- package/dist/provider/AthenaProvider.cjs.map +1 -1
- package/dist/provider/AthenaProvider.d.ts +27 -2
- package/dist/provider/AthenaProvider.js +74 -14
- package/dist/provider/AthenaProvider.js.map +1 -1
- package/dist/provider/citation-links.d.ts +10 -2
- package/dist/{packages/react → react}/package.json.cjs +1 -1
- package/dist/{packages/react → react}/package.json.js +1 -1
- package/dist/runtime/StatewireModelLaneSync.cjs +96 -0
- package/dist/runtime/StatewireModelLaneSync.cjs.map +1 -0
- package/dist/runtime/StatewireModelLaneSync.d.ts +45 -0
- package/dist/runtime/StatewireModelLaneSync.js +96 -0
- package/dist/runtime/StatewireModelLaneSync.js.map +1 -0
- package/dist/runtime/statewire-lifecycle.cjs +20 -5
- package/dist/runtime/statewire-lifecycle.cjs.map +1 -1
- package/dist/runtime/statewire-lifecycle.d.ts +11 -0
- package/dist/runtime/statewire-lifecycle.js +20 -5
- package/dist/runtime/statewire-lifecycle.js.map +1 -1
- package/dist/runtime/statewire-model-lane.cjs +28 -0
- package/dist/runtime/statewire-model-lane.cjs.map +1 -0
- package/dist/runtime/statewire-model-lane.d.ts +64 -0
- package/dist/runtime/statewire-model-lane.js +28 -0
- package/dist/runtime/statewire-model-lane.js.map +1 -0
- package/dist/runtime/statewire-run-config.cjs +16 -2
- package/dist/runtime/statewire-run-config.cjs.map +1 -1
- package/dist/runtime/statewire-run-config.d.ts +10 -0
- package/dist/runtime/statewire-run-config.js +16 -2
- package/dist/runtime/statewire-run-config.js.map +1 -1
- package/dist/runtime/statewire-server-lane-context.cjs +24 -0
- package/dist/runtime/statewire-server-lane-context.cjs.map +1 -0
- package/dist/runtime/statewire-server-lane-context.d.ts +30 -0
- package/dist/runtime/statewire-server-lane-context.js +24 -0
- package/dist/runtime/statewire-server-lane-context.js.map +1 -0
- package/dist/runtime/useAthenaStatewireRuntime.cjs +47 -23
- package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
- package/dist/runtime/useAthenaStatewireRuntime.d.ts +8 -1
- package/dist/runtime/useAthenaStatewireRuntime.js +48 -24
- package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
- package/dist/search/useAthenaRepoSearch.cjs +5 -13
- package/dist/search/useAthenaRepoSearch.cjs.map +1 -1
- package/dist/search/useAthenaRepoSearch.d.ts +3 -3
- package/dist/search/useAthenaRepoSearch.js +6 -14
- package/dist/search/useAthenaRepoSearch.js.map +1 -1
- package/dist/sheet-range/a1.cjs +162 -0
- package/dist/sheet-range/a1.cjs.map +1 -0
- package/dist/sheet-range/a1.d.ts +91 -0
- package/dist/sheet-range/a1.js +162 -0
- package/dist/sheet-range/a1.js.map +1 -0
- package/dist/sheet-range/index.cjs +22 -0
- package/dist/sheet-range/index.cjs.map +1 -0
- package/dist/sheet-range/index.d.ts +12 -0
- package/dist/sheet-range/index.js +22 -0
- package/dist/sheet-range/index.js.map +1 -0
- package/dist/sheet-range/range-preview-table.cjs +75 -0
- package/dist/sheet-range/range-preview-table.cjs.map +1 -0
- package/dist/sheet-range/range-preview-table.d.ts +20 -0
- package/dist/sheet-range/range-preview-table.js +75 -0
- package/dist/sheet-range/range-preview-table.js.map +1 -0
- package/dist/sheet-range/range-preview.cjs +116 -0
- package/dist/sheet-range/range-preview.cjs.map +1 -0
- package/dist/sheet-range/range-preview.d.ts +67 -0
- package/dist/sheet-range/range-preview.js +116 -0
- package/dist/sheet-range/range-preview.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/threads/Inbox.cjs +289 -0
- package/dist/threads/Inbox.cjs.map +1 -0
- package/dist/threads/Inbox.d.ts +46 -0
- package/dist/threads/Inbox.js +289 -0
- package/dist/threads/Inbox.js.map +1 -0
- package/dist/threads/SessionList.cjs +51 -126
- package/dist/threads/SessionList.cjs.map +1 -1
- package/dist/threads/SessionList.d.ts +26 -1
- package/dist/threads/SessionList.js +45 -120
- package/dist/threads/SessionList.js.map +1 -1
- package/dist/threads/SessionsPage.cjs +753 -0
- package/dist/threads/SessionsPage.cjs.map +1 -0
- package/dist/threads/SessionsPage.d.ts +35 -0
- package/dist/threads/SessionsPage.js +753 -0
- package/dist/threads/SessionsPage.js.map +1 -0
- package/dist/threads/api.cjs +23 -2
- package/dist/threads/api.cjs.map +1 -1
- package/dist/threads/api.d.ts +60 -0
- package/dist/threads/api.js +23 -2
- package/dist/threads/api.js.map +1 -1
- package/dist/threads/conversation-list-fetcher.cjs +9 -2
- package/dist/threads/conversation-list-fetcher.cjs.map +1 -1
- package/dist/threads/conversation-list-fetcher.d.ts +14 -1
- package/dist/threads/conversation-list-fetcher.js +9 -2
- package/dist/threads/conversation-list-fetcher.js.map +1 -1
- package/dist/threads/index.d.ts +2 -1
- package/dist/threads/pull-request-display.cjs +25 -0
- package/dist/threads/pull-request-display.cjs.map +1 -0
- package/dist/threads/pull-request-display.d.ts +15 -0
- package/dist/threads/pull-request-display.js +25 -0
- package/dist/threads/pull-request-display.js.map +1 -0
- package/dist/threads/session-list-model.cjs +16 -2
- package/dist/threads/session-list-model.cjs.map +1 -1
- package/dist/threads/session-list-model.d.ts +10 -0
- package/dist/threads/session-list-model.js +16 -2
- package/dist/threads/session-list-model.js.map +1 -1
- package/dist/threads/session-row-parts.cjs +152 -0
- package/dist/threads/session-row-parts.cjs.map +1 -0
- package/dist/threads/session-row-parts.d.ts +50 -0
- package/dist/threads/session-row-parts.js +152 -0
- package/dist/threads/session-row-parts.js.map +1 -0
- package/dist/threads/sessions-page-model.cjs +305 -0
- package/dist/threads/sessions-page-model.cjs.map +1 -0
- package/dist/threads/sessions-page-model.d.ts +86 -0
- package/dist/threads/sessions-page-model.js +305 -0
- package/dist/threads/sessions-page-model.js.map +1 -0
- package/dist/threads/sessions-page-storage.cjs +93 -0
- package/dist/threads/sessions-page-storage.cjs.map +1 -0
- package/dist/threads/sessions-page-storage.d.ts +23 -0
- package/dist/threads/sessions-page-storage.js +93 -0
- package/dist/threads/sessions-page-storage.js.map +1 -0
- package/dist/threads/sessions-query.cjs +235 -0
- package/dist/threads/sessions-query.cjs.map +1 -0
- package/dist/threads/sessions-query.d.ts +119 -0
- package/dist/threads/sessions-query.js +235 -0
- package/dist/threads/sessions-query.js.map +1 -0
- package/dist/threads/statewire-thread-list.cjs +133 -40
- package/dist/threads/statewire-thread-list.cjs.map +1 -1
- package/dist/threads/statewire-thread-list.d.ts +83 -2
- package/dist/threads/statewire-thread-list.js +134 -41
- package/dist/threads/statewire-thread-list.js.map +1 -1
- package/dist/threads/use-athena-sessions.cjs +198 -0
- package/dist/threads/use-athena-sessions.cjs.map +1 -0
- package/dist/threads/use-athena-sessions.d.ts +81 -0
- package/dist/threads/use-athena-sessions.js +198 -0
- package/dist/threads/use-athena-sessions.js.map +1 -0
- package/dist/threads/use-athena-thread-model.cjs +14 -0
- package/dist/threads/use-athena-thread-model.cjs.map +1 -0
- package/dist/threads/use-athena-thread-model.d.ts +22 -0
- package/dist/threads/use-athena-thread-model.js +14 -0
- package/dist/threads/use-athena-thread-model.js.map +1 -0
- package/dist/threads/use-rest-conversation-history.cjs +1 -1
- package/dist/threads/use-rest-conversation-history.js +1 -1
- package/dist/threads/use-statewire-conversation-history.cjs +1 -1
- package/dist/threads/use-statewire-conversation-history.d.ts +3 -0
- package/dist/threads/use-statewire-conversation-history.js +1 -1
- package/dist/threads/use-thread-read-state.cjs +73 -0
- package/dist/threads/use-thread-read-state.cjs.map +1 -0
- package/dist/threads/use-thread-read-state.d.ts +51 -0
- package/dist/threads/use-thread-read-state.js +73 -0
- package/dist/threads/use-thread-read-state.js.map +1 -0
- package/dist/tiptap-markdown-table/src/markdown-table-serializer.cjs.map +1 -0
- package/dist/tiptap-markdown-table/src/markdown-table-serializer.js.map +1 -0
- package/dist/tools/auto-open-tools.cjs +2 -0
- package/dist/tools/auto-open-tools.cjs.map +1 -1
- package/dist/tools/auto-open-tools.js +2 -0
- package/dist/tools/auto-open-tools.js.map +1 -1
- package/dist/tools/file-tool-uis.cjs +18 -43
- package/dist/tools/file-tool-uis.cjs.map +1 -1
- package/dist/tools/file-tool-uis.d.ts +1 -2
- package/dist/tools/file-tool-uis.js +18 -42
- package/dist/tools/file-tool-uis.js.map +1 -1
- package/dist/tools/index.cjs +6 -2
- package/dist/tools/index.cjs.map +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.js +6 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/misc-tool-uis.cjs +2 -2
- package/dist/tools/misc-tool-uis.js +2 -2
- package/dist/tools/primitives.cjs +1 -1
- package/dist/tools/primitives.js +1 -1
- package/dist/tools/read-asset-tool-ui.cjs +21 -70
- package/dist/tools/read-asset-tool-ui.cjs.map +1 -1
- package/dist/tools/read-asset-tool-ui.js +21 -70
- package/dist/tools/read-asset-tool-ui.js.map +1 -1
- package/dist/tools/step-text.cjs +21 -0
- package/dist/tools/step-text.cjs.map +1 -0
- package/dist/tools/step-text.d.ts +10 -0
- package/dist/tools/step-text.js +21 -0
- package/dist/tools/step-text.js.map +1 -0
- package/dist/tools/tool-fallback.cjs +24 -5
- package/dist/tools/tool-fallback.cjs.map +1 -1
- package/dist/tools/tool-fallback.d.ts +3 -1
- package/dist/tools/tool-fallback.js +24 -5
- package/dist/tools/tool-fallback.js.map +1 -1
- package/dist/tools/tool-summary.cjs +661 -0
- package/dist/tools/tool-summary.cjs.map +1 -0
- package/dist/tools/tool-summary.d.ts +99 -0
- package/dist/tools/tool-summary.js +661 -0
- package/dist/tools/tool-summary.js.map +1 -0
- package/dist/tools/tool-uis.cjs +37 -95
- package/dist/tools/tool-uis.cjs.map +1 -1
- package/dist/tools/tool-uis.js +37 -95
- package/dist/tools/tool-uis.js.map +1 -1
- package/dist/tools/voice-update-tool-ui.cjs +1 -1
- package/dist/tools/voice-update-tool-ui.js +1 -1
- package/dist/tools/write-todos-tool-ui.cjs +3 -2
- package/dist/tools/write-todos-tool-ui.cjs.map +1 -1
- package/dist/tools/write-todos-tool-ui.d.ts +5 -0
- package/dist/tools/write-todos-tool-ui.js +5 -4
- package/dist/tools/write-todos-tool-ui.js.map +1 -1
- package/dist/ui/popover.cjs +6 -6
- package/dist/ui/popover.cjs.map +1 -1
- package/dist/ui/popover.js +6 -6
- package/dist/ui/popover.js.map +1 -1
- package/dist/ui/tooltip.cjs +16 -2
- package/dist/ui/tooltip.cjs.map +1 -1
- package/dist/ui/tooltip.d.ts +1 -1
- package/dist/ui/tooltip.js +16 -2
- package/dist/ui/tooltip.js.map +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.js +1 -1
- package/dist/voice/use-athena-voice-session.cjs.map +1 -1
- package/dist/voice/use-athena-voice-session.d.ts +3 -3
- package/dist/voice/use-athena-voice-session.js.map +1 -1
- package/dist/workbench/SessionWorkbench.cjs +378 -0
- package/dist/workbench/SessionWorkbench.cjs.map +1 -0
- package/dist/workbench/SessionWorkbench.d.ts +30 -0
- package/dist/workbench/SessionWorkbench.js +378 -0
- package/dist/workbench/SessionWorkbench.js.map +1 -0
- package/dist/workbench/session-workbench-context.cjs +26 -0
- package/dist/workbench/session-workbench-context.cjs.map +1 -0
- package/dist/workbench/session-workbench-context.d.ts +55 -0
- package/dist/workbench/session-workbench-context.js +26 -0
- package/dist/workbench/session-workbench-context.js.map +1 -0
- package/dist/workbench/session-workbench-model.cjs +288 -0
- package/dist/workbench/session-workbench-model.cjs.map +1 -0
- package/dist/workbench/session-workbench-model.d.ts +168 -0
- package/dist/workbench/session-workbench-model.js +288 -0
- package/dist/workbench/session-workbench-model.js.map +1 -0
- package/dist/workbench/session-workbench-panes.cjs +580 -0
- package/dist/workbench/session-workbench-panes.cjs.map +1 -0
- package/dist/workbench/session-workbench-panes.d.ts +16 -0
- package/dist/workbench/session-workbench-panes.js +580 -0
- package/dist/workbench/session-workbench-panes.js.map +1 -0
- package/dist/workbench/session-workspace-api.cjs +157 -0
- package/dist/workbench/session-workspace-api.cjs.map +1 -0
- package/dist/workbench/session-workspace-api.d.ts +70 -0
- package/dist/workbench/session-workspace-api.js +157 -0
- package/dist/workbench/session-workspace-api.js.map +1 -0
- package/dist/workbench/use-session-workspace.cjs +100 -0
- package/dist/workbench/use-session-workspace.cjs.map +1 -0
- package/dist/workbench/use-session-workspace.d.ts +45 -0
- package/dist/workbench/use-session-workspace.js +100 -0
- package/dist/workbench/use-session-workspace.js.map +1 -0
- package/dist/workbench/workbench-layout-context.cjs +10 -0
- package/dist/workbench/workbench-layout-context.cjs.map +1 -0
- package/dist/workbench/workbench-layout-context.d.ts +17 -0
- package/dist/workbench/workbench-layout-context.js +10 -0
- package/dist/workbench/workbench-layout-context.js.map +1 -0
- package/package.json +21 -10
- package/dist/node_modules/@assistant-ui/react-langchain/dist/converter.cjs +0 -77
- package/dist/node_modules/@assistant-ui/react-langchain/dist/converter.cjs.map +0 -1
- package/dist/node_modules/@assistant-ui/react-langchain/dist/converter.js +0 -77
- package/dist/node_modules/@assistant-ui/react-langchain/dist/converter.js.map +0 -1
- package/dist/node_modules/@assistant-ui/react-langgraph/dist/convertLangChainMessages.cjs +0 -181
- package/dist/node_modules/@assistant-ui/react-langgraph/dist/convertLangChainMessages.cjs.map +0 -1
- package/dist/node_modules/@assistant-ui/react-langgraph/dist/convertLangChainMessages.js +0 -181
- package/dist/node_modules/@assistant-ui/react-langgraph/dist/convertLangChainMessages.js.map +0 -1
- package/dist/packages/agent-runtime/src/asset-attachment.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/asset-attachment.js.map +0 -1
- package/dist/packages/agent-runtime/src/auth-denial.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/auth-denial.js.map +0 -1
- package/dist/packages/agent-runtime/src/client-tool-bridge.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/client-tool-bridge.js.map +0 -1
- package/dist/packages/agent-runtime/src/client-tools.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/client-tools.js.map +0 -1
- package/dist/packages/agent-runtime/src/conversation-index.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/conversation-index.js.map +0 -1
- package/dist/packages/agent-runtime/src/conversation-list.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/conversation-list.js.map +0 -1
- package/dist/packages/agent-runtime/src/deep-agent-transport-recipe.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/deep-agent-transport-recipe.js.map +0 -1
- package/dist/packages/agent-runtime/src/edit-command.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/edit-command.js.map +0 -1
- package/dist/packages/agent-runtime/src/errors.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/errors.js.map +0 -1
- package/dist/packages/agent-runtime/src/generated/runconfig-contract.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/generated/runconfig-contract.js.map +0 -1
- package/dist/packages/agent-runtime/src/github-wake-event.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/github-wake-event.js.map +0 -1
- package/dist/packages/agent-runtime/src/interrupts.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/interrupts.js.map +0 -1
- package/dist/packages/agent-runtime/src/message-author.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/message-author.js.map +0 -1
- package/dist/packages/agent-runtime/src/message-window.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/message-window.js.map +0 -1
- package/dist/packages/agent-runtime/src/messages.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/messages.js.map +0 -1
- package/dist/packages/agent-runtime/src/model-context.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/model-context.js.map +0 -1
- package/dist/packages/agent-runtime/src/optimistic-content.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/optimistic-content.js.map +0 -1
- package/dist/packages/agent-runtime/src/protocol.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/protocol.js.map +0 -1
- package/dist/packages/agent-runtime/src/queue.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/queue.js.map +0 -1
- package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.js.map +0 -1
- package/dist/packages/agent-runtime/src/runtime-messages.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/runtime-messages.js.map +0 -1
- package/dist/packages/agent-runtime/src/screen-point.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/screen-point.js.map +0 -1
- package/dist/packages/agent-runtime/src/send-recovery.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/send-recovery.js.map +0 -1
- package/dist/packages/agent-runtime/src/statewire-attach-observer.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/statewire-attach-observer.js.map +0 -1
- package/dist/packages/agent-runtime/src/statewire-state.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/statewire-state.js.map +0 -1
- package/dist/packages/agent-runtime/src/statewire-suspended.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/statewire-suspended.js.map +0 -1
- package/dist/packages/agent-runtime/src/statewire-transport.cjs +0 -11
- package/dist/packages/agent-runtime/src/statewire-transport.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/statewire-transport.js +0 -11
- package/dist/packages/agent-runtime/src/statewire-transport.js.map +0 -1
- package/dist/packages/agent-runtime/src/streaming-markdown.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/streaming-markdown.js.map +0 -1
- package/dist/packages/agent-runtime/src/thread-extras.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/thread-extras.js.map +0 -1
- package/dist/packages/agent-runtime/src/thread-snapshot-cache.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/thread-snapshot-cache.js.map +0 -1
- package/dist/packages/agent-runtime/src/thread-status.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/thread-status.js.map +0 -1
- package/dist/packages/agent-runtime/src/tool-metadata.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/tool-metadata.js.map +0 -1
- package/dist/packages/agent-runtime/src/tool-outputs.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/tool-outputs.js.map +0 -1
- package/dist/packages/agent-runtime/src/tool-result.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/tool-result.js.map +0 -1
- package/dist/packages/agent-runtime/src/use-conversation-list.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/use-conversation-list.js.map +0 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-config.cjs +0 -13
- package/dist/packages/agent-runtime/src/use-deep-agent-config.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-config.js +0 -13
- package/dist/packages/agent-runtime/src/use-deep-agent-config.js.map +0 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-edit-submit.js.map +0 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-runtime.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-runtime.js.map +0 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-thread.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-thread.js.map +0 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-window-sync.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-window-sync.js.map +0 -1
- package/dist/packages/agent-runtime/src/voice-presentation.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/voice-presentation.js.map +0 -1
- package/dist/packages/agent-runtime/src/voice-turn-grouping.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/voice-turn-grouping.js.map +0 -1
- package/dist/packages/tiptap-markdown-table/src/markdown-table-serializer.cjs.map +0 -1
- package/dist/packages/tiptap-markdown-table/src/markdown-table-serializer.js.map +0 -1
- /package/dist/{packages/agent-runtime → agent-runtime}/src/asset-attachment.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/asset-attachment.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/auth-denial.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/auth-denial.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/client-tool-bridge.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/client-tool-bridge.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/client-tools.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/client-tools.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/conversation-index.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/conversation-index.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/edit-command.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/edit-command.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/github-wake-event.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/github-wake-event.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/message-author.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/message-author.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/message-window.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/message-window.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/model-context.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/model-context.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/optimistic-content.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/optimistic-content.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/protocol.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/protocol.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/runtime-messages.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/runtime-messages.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/screen-point.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/screen-point.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/send-recovery.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/send-recovery.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/statewire-attach-observer.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/statewire-attach-observer.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/streaming-markdown.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/streaming-markdown.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/thread-extras.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/thread-extras.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/thread-snapshot-cache.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/thread-snapshot-cache.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/thread-status.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/thread-status.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/tool-outputs.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/tool-outputs.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/tool-result.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/tool-result.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-runtime.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-runtime.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-window-sync.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-window-sync.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/voice-turn-grouping.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/voice-turn-grouping.js +0 -0
- /package/dist/{packages/react → react}/package.json.cjs.map +0 -0
- /package/dist/{packages/react → react}/package.json.js.map +0 -0
- /package/dist/{packages/tiptap-markdown-table → tiptap-markdown-table}/src/markdown-table-serializer.cjs +0 -0
- /package/dist/{packages/tiptap-markdown-table → tiptap-markdown-table}/src/markdown-table-serializer.js +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tool-metadata.js","sources":["../../../../../agent-runtime/src/tool-metadata.ts"],"sourcesContent":["/**\n * Tool display metadata — the one registry of how a backend tool is presented\n * to a person: its noun label, its present-tense activity, its category, its\n * icon (as a key the UI layer maps to an icon component), its emoji for\n * text-only surfaces, and how to summarize a call from its arguments.\n *\n * Every tool card, activity timeline, and approval summary on every surface\n * (the React SDK, Olympus, the Chrome extension, the Office add-in, mobile)\n * reads from here, so a tool cannot be \"Web Search\" on one screen and\n * \"Searching the web\" plus a different icon on another. React-free on purpose:\n * mobile shares it, and icon *components* are the UI layer's business.\n *\n * Unknown names never fail: {@link getToolDisplayMeta} derives a readable\n * default from the name, so a new backend tool renders acceptably before it\n * has an entry here. Add the entry when the default copy is not good enough.\n */\n\nexport type ToolCategory =\n | 'Web'\n | 'Email'\n | 'Document'\n | 'Spreadsheet'\n | 'SQL'\n | 'Database'\n | 'Python'\n | 'Spaces'\n | 'Visualization'\n | 'Canvas'\n | 'Presentation'\n | 'UI'\n | 'Notebook'\n | 'AOP'\n | 'Browser'\n | 'Computer'\n | 'Drive'\n | 'Comments'\n | 'Meetings'\n | 'Analysis'\n | 'Memory'\n | 'Brand'\n | 'Playbook'\n | 'GitHub'\n | 'Ontology'\n | 'Project Manager'\n | 'Agent'\n | 'Files'\n | 'Media'\n | 'Integrations'\n | 'Tool';\n\n/** Icon identifiers the UI layer maps to icon components (lucide on web). */\nexport type ToolIconKey =\n | 'search'\n | 'globe'\n | 'mail'\n | 'calendar'\n | 'file-text'\n | 'pen-line'\n | 'bar-chart'\n | 'table'\n | 'presentation'\n | 'monitor'\n | 'code'\n | 'terminal'\n | 'database'\n | 'book-open'\n | 'brain'\n | 'folder-open'\n | 'folder'\n | 'save'\n | 'wrench'\n | 'image'\n | 'camera'\n | 'trending-up'\n | 'palette'\n | 'microscope'\n | 'message-square'\n | 'hard-drive'\n | 'git-pull-request'\n | 'boxes'\n | 'scroll-text'\n | 'clipboard-list'\n | 'cpu'\n | 'bot'\n | 'link'\n | 'package'\n | 'play'\n | 'trash'\n | 'star'\n | 'sparkles'\n | 'list-checks'\n | 'mouse-pointer'\n | 'scan-search'\n | 'settings'\n | 'phone'\n | 'video'\n | 'users'\n | 'layout-dashboard'\n | 'workflow'\n | 'circle-help'\n | 'flag'\n | 'hash';\n\n/** Summarize a call from its arguments in one line, or nothing when there is nothing salient. */\nexport type ToolArgsDescriber = (args: Record<string, unknown>) => string | undefined;\n\nexport interface ToolDisplayMeta {\n /** Noun label for headers, lists, and completed rows (\"Web Search\"). */\n displayName: string;\n /** Present-tense activity for a running call, without trailing punctuation (\"Searching the web\"). */\n activeLabel: string;\n /**\n * Completed-row copy when the product wording is not the past tense of\n * `activeLabel` (\"Web search complete\"); {@link toolStatusLabel} derives\n * the past tense when this is absent.\n */\n completedLabel?: string;\n /** Copy for a call the user declined at an approval gate (\"Email not sent (rejected)\"). */\n rejectedLabel?: string;\n category: ToolCategory;\n icon: ToolIconKey;\n /** Emoji for text-only surfaces (mobile rows, notifications). */\n emoji: string;\n /** One-line detail from the call's arguments, for a subtitle or the running label. */\n describe?: ToolArgsDescriber;\n /**\n * The tool is not something a person picks — a runtime internal (deepagents\n * built-ins) or a nested SDK sub-call surfaced by programmatic tool calling.\n * Hosts leave these out of tool menus and mention pickers; they still render.\n */\n internal?: boolean;\n}\n\n/** A registry entry; `emoji` defaults to the category's. */\nexport type ToolDisplayMetaEntry = Omit<ToolDisplayMeta, 'emoji'> & { emoji?: string };\n\nexport const CATEGORY_EMOJI: Record<ToolCategory, string> = {\n Web: '🌐',\n Email: '📧',\n Document: '📄',\n Spreadsheet: '📊',\n SQL: '🗄️',\n Database: '🗄️',\n Python: '🐍',\n Spaces: '📂',\n Visualization: '📊',\n Canvas: '🎨',\n Presentation: '📽️',\n UI: '🖥️',\n Notebook: '📓',\n AOP: '📋',\n Browser: '🌐',\n Computer: '💻',\n Drive: '💾',\n Comments: '💬',\n Meetings: '📅',\n Analysis: '🔬',\n Memory: '💾',\n Brand: '🎨',\n Playbook: '📘',\n GitHub: '🔀',\n Ontology: '🗂️',\n 'Project Manager': '📋',\n Agent: '🤖',\n Files: '📁',\n Media: '📸',\n Integrations: '🔌',\n Tool: '🔧',\n};\n\nconst DEFAULT_EMOJI = CATEGORY_EMOJI.Tool;\n\n// ─── Describers ───────────────────────────────────────────────────────\n\nfunction nonBlank(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction quoted(value: string | undefined): string | undefined {\n return value === undefined ? undefined : `\"${value}\"`;\n}\n\n/** Collapse whitespace to a single-line summary capped at `max` chars. */\nexport function truncateLine(text: string, max = 70): string {\n const oneLine = text.replace(/\\s+/g, ' ').trim();\n return oneLine.length > max ? `${oneLine.slice(0, max)}...` : oneLine;\n}\n\n/** The search term a call carries (`query` / `search_query` / `term`), quoted. */\nexport const describeQuery: ToolArgsDescriber = (args) =>\n quoted(nonBlank(args.query) ?? nonBlank(args.search_query) ?? nonBlank(args.term));\n\n/** The URL a call targets. */\nexport const describeUrl: ToolArgsDescriber = (args) => nonBlank(args.url);\n\n/** The name a call creates or targets (`field`, falling back to `title`), quoted. */\nexport function describeNamed(field = 'name'): ToolArgsDescriber {\n return (args) => quoted(nonBlank(args[field]) ?? nonBlank(args.title));\n}\n\n/** The SQL a call runs (`sql_query` / `query` / `sql`), on one line, quoted. */\nexport const describeSql: ToolArgsDescriber = (args) => {\n const sql = nonBlank(args.sql_query) ?? nonBlank(args.query) ?? nonBlank(args.sql);\n return sql === undefined ? undefined : quoted(truncateLine(sql));\n};\n\n/** A spreadsheet range plus the call's own explanation of the edit. */\nexport const describeRange: ToolArgsDescriber = (args) => {\n const range = nonBlank(args.range);\n const explanation = nonBlank(args.explanation);\n if (range && explanation) return `${range}: ${truncateLine(explanation)}`;\n return range ?? (explanation ? truncateLine(explanation) : undefined);\n};\n\nexport const describeTable: ToolArgsDescriber = (args) => nonBlank(args.table_name);\n\nexport const describePackage: ToolArgsDescriber = (args) =>\n nonBlank(args.package_name) ?? nonBlank(args.package);\n\n/** A workspace file path (`file_path` / `path`). */\nexport const describePath: ToolArgsDescriber = (args) =>\n nonBlank(args.file_path) ?? nonBlank(args.path);\n\n/** Where a Slack send goes (`to`, one entry or several people), on one line. */\nexport const describeSlackDestination: ToolArgsDescriber = (args) => {\n const to = args.to;\n if (typeof to === 'string') return nonBlank(to);\n if (!Array.isArray(to)) return undefined;\n const entries = to.map(nonBlank).filter((entry): entry is string => entry !== undefined);\n return entries.length > 0 ? truncateLine(entries.join(', ')) : undefined;\n};\n\n/** The subagent a delegation targets and what it was asked, on one line. */\nexport const describeDelegation: ToolArgsDescriber = (args) => {\n const subagent = nonBlank(args.subagent_type);\n const description = nonBlank(args.description);\n if (subagent && description) return `${subagent}: ${truncateLine(description)}`;\n return subagent ?? (description ? truncateLine(description) : undefined);\n};\n\n// ─── Registry ─────────────────────────────────────────────────────────\n\n/**\n * Keyed by the tool name as it appears on the wire. Grouped by category;\n * within a group, aliases of one capability share copy so history renders the\n * same whatever name the backend used that day.\n */\nexport const TOOL_DISPLAY_META: Record<string, ToolDisplayMetaEntry> = {\n // ── Web search & browse ──\n search: {\n displayName: 'Web Search',\n activeLabel: 'Searching the web',\n completedLabel: 'Web search complete',\n category: 'Web',\n icon: 'search',\n emoji: '🔍',\n describe: describeQuery,\n },\n exa_search: {\n displayName: 'Web Search',\n activeLabel: 'Searching the web',\n category: 'Web',\n icon: 'search',\n emoji: '🔍',\n describe: describeQuery,\n },\n perplexity_search: {\n displayName: 'Web Search',\n activeLabel: 'Searching the web',\n category: 'Web',\n icon: 'search',\n emoji: '🔍',\n describe: describeQuery,\n },\n grounded_search: {\n displayName: 'Grounded Search',\n activeLabel: 'Searching',\n category: 'Web',\n icon: 'search',\n emoji: '🔍',\n describe: describeQuery,\n },\n deep_research: {\n displayName: 'Deep Research',\n activeLabel: 'Researching',\n category: 'Web',\n icon: 'microscope',\n emoji: '🔬',\n describe: describeQuery,\n },\n browse: {\n displayName: 'Browse Web Page',\n activeLabel: 'Reading webpage',\n completedLabel: 'Read webpage',\n category: 'Web',\n icon: 'globe',\n describe: describeUrl,\n },\n open_browser: {\n displayName: 'Open Browser',\n activeLabel: 'Opening browser',\n category: 'Web',\n icon: 'globe',\n describe: describeUrl,\n },\n map_urls_in_website: {\n displayName: 'Map Website',\n activeLabel: 'Mapping website',\n category: 'Web',\n icon: 'globe',\n describe: describeUrl,\n },\n track_website_changes: {\n displayName: 'Track Website Changes',\n activeLabel: 'Tracking website changes',\n category: 'Web',\n icon: 'globe',\n describe: describeUrl,\n },\n get_youtube_transcript: {\n displayName: 'YouTube Transcript',\n activeLabel: 'Fetching transcript',\n category: 'Web',\n icon: 'video',\n emoji: '🎬',\n describe: describeUrl,\n },\n\n // ── Email & calendar ──\n search_email: {\n displayName: 'Search Email',\n activeLabel: 'Searching email',\n completedLabel: 'Email search complete',\n category: 'Email',\n icon: 'mail',\n describe: describeQuery,\n },\n unified_email_search: {\n displayName: 'Search Email',\n activeLabel: 'Searching email',\n completedLabel: 'Email search complete',\n category: 'Email',\n icon: 'mail',\n describe: describeQuery,\n },\n search_gmail: {\n displayName: 'Search Email',\n activeLabel: 'Searching emails',\n category: 'Email',\n icon: 'mail',\n describe: describeQuery,\n },\n send_direct_email: {\n displayName: 'Send Email',\n activeLabel: 'Sending email',\n category: 'Email',\n icon: 'mail',\n emoji: '📤',\n },\n unified_email_send: {\n displayName: 'Send Email',\n activeLabel: 'Sending email',\n completedLabel: 'Email sent',\n rejectedLabel: 'Email not sent (rejected)',\n category: 'Email',\n icon: 'mail',\n emoji: '📤',\n },\n send_email_from_athena: {\n displayName: 'Send Email',\n activeLabel: 'Sending email',\n category: 'Email',\n icon: 'mail',\n emoji: '📤',\n },\n create_email_draft: {\n displayName: 'Create Draft',\n activeLabel: 'Drafting email',\n completedLabel: 'Email drafted',\n category: 'Email',\n icon: 'mail',\n emoji: '✉️',\n },\n unified_email_create_draft: {\n displayName: 'Create Draft',\n activeLabel: 'Drafting email',\n completedLabel: 'Email drafted',\n category: 'Email',\n icon: 'mail',\n emoji: '✉️',\n },\n edit_email_draft: {\n displayName: 'Edit Draft',\n activeLabel: 'Editing email draft',\n completedLabel: 'Draft updated',\n category: 'Email',\n icon: 'pen-line',\n emoji: '✏️',\n },\n unified_email_edit_draft: {\n displayName: 'Edit Draft',\n activeLabel: 'Editing email draft',\n completedLabel: 'Draft updated',\n category: 'Email',\n icon: 'pen-line',\n emoji: '✏️',\n },\n unified_email_get_thread: {\n displayName: 'Get Email Thread',\n activeLabel: 'Loading email thread',\n category: 'Email',\n icon: 'mail',\n },\n unified_email_get_message: {\n displayName: 'Get Email',\n activeLabel: 'Loading email',\n category: 'Email',\n icon: 'mail',\n },\n unified_email_list_accounts: {\n displayName: 'List Email Accounts',\n activeLabel: 'Checking email accounts',\n category: 'Email',\n icon: 'mail',\n },\n email_list_accounts: {\n displayName: 'List Email Accounts',\n activeLabel: 'Checking email accounts',\n category: 'Email',\n icon: 'mail',\n },\n unified_email_set_default: {\n displayName: 'Set Default Account',\n activeLabel: 'Setting default email account',\n category: 'Email',\n icon: 'mail',\n },\n fetch_email_attachments: {\n displayName: 'Fetch Attachments',\n activeLabel: 'Fetching email attachments',\n category: 'Email',\n icon: 'mail',\n emoji: '📎',\n },\n unified_email_fetch_attachments: {\n displayName: 'Fetch Attachments',\n activeLabel: 'Fetching email attachments',\n category: 'Email',\n icon: 'mail',\n emoji: '📎',\n },\n forward_email: {\n displayName: 'Forward Email',\n activeLabel: 'Forwarding email',\n category: 'Email',\n icon: 'mail',\n emoji: '📤',\n },\n unified_email_forward: {\n displayName: 'Forward Email',\n activeLabel: 'Forwarding email',\n completedLabel: 'Email forwarded',\n rejectedLabel: 'Email not forwarded (rejected)',\n category: 'Email',\n icon: 'mail',\n emoji: '📤',\n },\n search_calendar_events: {\n displayName: 'Search Calendar',\n activeLabel: 'Checking calendar',\n category: 'Email',\n icon: 'calendar',\n emoji: '📅',\n describe: describeQuery,\n },\n unified_search_calendar_events: {\n displayName: 'Search Calendar',\n activeLabel: 'Searching calendar',\n category: 'Email',\n icon: 'calendar',\n emoji: '📅',\n describe: describeQuery,\n },\n create_calendar_event_draft: {\n displayName: 'Create Calendar Event Draft',\n activeLabel: 'Creating calendar event',\n completedLabel: 'Calendar event created',\n rejectedLabel: 'Calendar event not created (rejected)',\n category: 'Email',\n icon: 'calendar',\n emoji: '📅',\n },\n unified_create_calendar_event_draft: {\n displayName: 'Create Calendar Event Draft',\n activeLabel: 'Creating calendar event',\n completedLabel: 'Calendar event created',\n rejectedLabel: 'Calendar event not created (rejected)',\n category: 'Email',\n icon: 'calendar',\n emoji: '📅',\n },\n create_google_calendar_event: {\n displayName: 'Create Calendar Event',\n activeLabel: 'Creating calendar event',\n category: 'Email',\n icon: 'calendar',\n emoji: '📅',\n },\n unified_create_calendar_event: {\n displayName: 'Create Calendar Event',\n activeLabel: 'Creating calendar event',\n completedLabel: 'Calendar event created',\n rejectedLabel: 'Calendar event not created (rejected)',\n category: 'Email',\n icon: 'calendar',\n emoji: '📅',\n },\n unified_update_calendar_event: {\n displayName: 'Update Calendar Event',\n activeLabel: 'Updating calendar event',\n category: 'Email',\n icon: 'calendar',\n emoji: '📅',\n },\n unified_calendar_get_event: {\n displayName: 'Get Calendar Event',\n activeLabel: 'Loading calendar event',\n category: 'Email',\n icon: 'calendar',\n emoji: '📅',\n },\n unified_get_free_busy: {\n displayName: 'Check Availability',\n activeLabel: 'Checking availability',\n category: 'Email',\n icon: 'calendar',\n emoji: '📅',\n },\n\n // ── Messaging & meetings ──\n send_slack_message: {\n displayName: 'Send Slack Message',\n activeLabel: 'Sending Slack message',\n category: 'Integrations',\n icon: 'message-square',\n emoji: '💬',\n },\n read_slack_channel: {\n displayName: 'Read Slack Channel',\n activeLabel: 'Reading Slack channel',\n category: 'Integrations',\n icon: 'message-square',\n emoji: '💬',\n },\n send_teams_message: {\n displayName: 'Send Teams Message',\n activeLabel: 'Sending Teams message',\n category: 'Integrations',\n icon: 'message-square',\n emoji: '💬',\n },\n // Slack as the member (slack_direct_toolkit); the writes are approval-gated.\n slack_list_workspaces: {\n displayName: 'List Slack Workspaces',\n activeLabel: 'Checking your Slack workspaces',\n category: 'Integrations',\n icon: 'hash',\n emoji: '💬',\n },\n slack_list_conversations: {\n displayName: 'List Slack Conversations',\n activeLabel: 'Listing your Slack conversations',\n category: 'Integrations',\n icon: 'hash',\n emoji: '💬',\n },\n slack_read_conversation: {\n displayName: 'Read Slack Conversation',\n activeLabel: 'Reading Slack conversation',\n category: 'Integrations',\n icon: 'message-square',\n emoji: '💬',\n describe: (args) => nonBlank(args.conversation),\n },\n slack_read_thread: {\n displayName: 'Read Slack Thread',\n activeLabel: 'Reading Slack thread',\n category: 'Integrations',\n icon: 'message-square',\n emoji: '🧵',\n describe: (args) => nonBlank(args.conversation),\n },\n slack_search_messages: {\n displayName: 'Search Slack',\n activeLabel: 'Searching Slack',\n category: 'Integrations',\n icon: 'search',\n emoji: '🔎',\n describe: describeQuery,\n },\n slack_find_user: {\n displayName: 'Find Slack User',\n activeLabel: 'Looking people up in Slack',\n category: 'Integrations',\n icon: 'users',\n emoji: '🧑',\n describe: describeQuery,\n },\n slack_send_message: {\n displayName: 'Send Slack Message as You',\n activeLabel: 'Sending Slack message',\n completedLabel: 'Slack message sent',\n rejectedLabel: 'Slack message not sent (rejected)',\n category: 'Integrations',\n icon: 'message-square',\n emoji: '📤',\n describe: describeSlackDestination,\n },\n slack_add_reaction: {\n displayName: 'Add Slack Reaction',\n activeLabel: 'Adding Slack reaction',\n completedLabel: 'Slack reaction added',\n rejectedLabel: 'Slack reaction not added (rejected)',\n category: 'Integrations',\n icon: 'message-square',\n emoji: '👍',\n describe: (args) => nonBlank(args.conversation),\n },\n // ServiceNow as the member (servicenow_toolkit); the writes are approval-gated.\n servicenow_list_instances: {\n displayName: 'List ServiceNow Instances',\n activeLabel: 'Checking your ServiceNow instances',\n category: 'Integrations',\n icon: 'clipboard-list',\n emoji: '🎫',\n },\n servicenow_search_records: {\n displayName: 'Search ServiceNow Records',\n activeLabel: 'Searching ServiceNow',\n category: 'Integrations',\n icon: 'search',\n emoji: '🔎',\n describe: (args) => nonBlank(args.table),\n },\n servicenow_get_record: {\n displayName: 'Get ServiceNow Record',\n activeLabel: 'Reading ServiceNow record',\n category: 'Integrations',\n icon: 'clipboard-list',\n emoji: '🎫',\n describe: (args) => nonBlank(args.record),\n },\n servicenow_search_knowledge: {\n displayName: 'Search ServiceNow Knowledge',\n activeLabel: 'Searching ServiceNow knowledge',\n category: 'Integrations',\n icon: 'book-open',\n emoji: '📚',\n describe: describeQuery,\n },\n servicenow_search_catalog_items: {\n displayName: 'Search ServiceNow Catalog',\n activeLabel: 'Searching the ServiceNow catalog',\n category: 'Integrations',\n icon: 'package',\n emoji: '🛒',\n describe: describeQuery,\n },\n servicenow_get_catalog_item: {\n displayName: 'Get ServiceNow Catalog Item',\n activeLabel: 'Reading ServiceNow catalog item',\n category: 'Integrations',\n icon: 'package',\n emoji: '📋',\n },\n servicenow_create_record: {\n displayName: 'Create ServiceNow Record',\n activeLabel: 'Creating ServiceNow record',\n completedLabel: 'ServiceNow record created',\n rejectedLabel: 'ServiceNow record not created (rejected)',\n category: 'Integrations',\n icon: 'clipboard-list',\n emoji: '🆕',\n describe: (args) => nonBlank(args.table),\n },\n servicenow_update_record: {\n displayName: 'Update ServiceNow Record',\n activeLabel: 'Updating ServiceNow record',\n completedLabel: 'ServiceNow record updated',\n rejectedLabel: 'ServiceNow record not updated (rejected)',\n category: 'Integrations',\n icon: 'pen-line',\n emoji: '✏️',\n describe: (args) => nonBlank(args.record),\n },\n servicenow_add_comment: {\n displayName: 'Add ServiceNow Comment',\n activeLabel: 'Adding ServiceNow comment',\n completedLabel: 'ServiceNow comment added',\n rejectedLabel: 'ServiceNow comment not added (rejected)',\n category: 'Integrations',\n icon: 'message-square',\n emoji: '🗨️',\n describe: (args) => nonBlank(args.record),\n },\n servicenow_order_catalog_item: {\n displayName: 'Order ServiceNow Catalog Item',\n activeLabel: 'Ordering from the ServiceNow catalog',\n completedLabel: 'ServiceNow order placed',\n rejectedLabel: 'ServiceNow order not placed (rejected)',\n category: 'Integrations',\n icon: 'package',\n emoji: '🛍️',\n },\n query_meetings: {\n displayName: 'Query Meetings',\n activeLabel: 'Searching meetings',\n category: 'Meetings',\n icon: 'calendar',\n describe: describeQuery,\n },\n\n // ── Documents ──\n create_new_document: {\n displayName: 'Create Document',\n activeLabel: 'Creating document',\n completedLabel: 'Created document',\n category: 'Document',\n icon: 'file-text',\n describe: describeNamed(),\n },\n create_document_from_markdown: {\n displayName: 'Create Document from Markdown',\n activeLabel: 'Creating document',\n completedLabel: 'Created document',\n category: 'Document',\n icon: 'file-text',\n describe: describeNamed(),\n },\n append_markdown_to_athena_document: {\n displayName: 'Append to Document',\n activeLabel: 'Updating document',\n completedLabel: 'Updated document',\n category: 'Document',\n icon: 'pen-line',\n emoji: '📝',\n },\n replace_markdown_in_athena_document: {\n displayName: 'Replace in Document',\n activeLabel: 'Updating document',\n completedLabel: 'Updated document',\n category: 'Document',\n icon: 'pen-line',\n emoji: '📝',\n },\n insert_markdown_before_block: {\n displayName: 'Insert Before Block',\n activeLabel: 'Inserting content',\n category: 'Document',\n icon: 'pen-line',\n emoji: '📝',\n },\n insert_markdown_after_block: {\n displayName: 'Insert After Block',\n activeLabel: 'Inserting content',\n category: 'Document',\n icon: 'pen-line',\n emoji: '📝',\n },\n delete_blocks_from_athena_document: {\n displayName: 'Delete Blocks',\n activeLabel: 'Deleting blocks',\n category: 'Document',\n icon: 'trash',\n emoji: '🗑️',\n },\n clear_athena_document: {\n displayName: 'Clear Document',\n activeLabel: 'Clearing document',\n category: 'Document',\n icon: 'trash',\n emoji: '🗑️',\n },\n execute_word_document_code: {\n displayName: 'Edit Word Document',\n activeLabel: 'Editing Word document',\n category: 'Document',\n icon: 'file-text',\n },\n read_full_asset: {\n displayName: 'Read Asset',\n activeLabel: 'Reviewing asset content',\n completedLabel: 'Asset content reviewed',\n category: 'Spaces',\n icon: 'book-open',\n emoji: '📖',\n },\n read_asset: {\n displayName: 'Read Asset',\n activeLabel: 'Reviewing asset content',\n completedLabel: 'Asset content reviewed',\n category: 'Spaces',\n icon: 'book-open',\n emoji: '📖',\n },\n convert_athena_doc_to_pdf: {\n displayName: 'Convert to PDF',\n activeLabel: 'Converting to PDF',\n completedLabel: 'Converted to PDF',\n category: 'Document',\n icon: 'file-text',\n },\n convert_to_pdf: {\n displayName: 'Convert to PDF',\n activeLabel: 'Converting to PDF',\n completedLabel: 'Converted to PDF',\n category: 'Document',\n icon: 'file-text',\n },\n\n // ── Spreadsheets ──\n create_new_sheet: {\n displayName: 'Create Spreadsheet',\n activeLabel: 'Creating spreadsheet',\n completedLabel: 'Created spreadsheet',\n category: 'Spreadsheet',\n icon: 'bar-chart',\n describe: describeNamed(),\n },\n update_sheet_range: {\n displayName: 'Update Cells',\n activeLabel: 'Updating spreadsheet',\n completedLabel: 'Updated spreadsheet',\n category: 'Spreadsheet',\n icon: 'bar-chart',\n describe: describeRange,\n },\n bulk_format_sheet_range: {\n displayName: 'Format Cells',\n activeLabel: 'Formatting spreadsheet ranges',\n completedLabel: 'Formatted spreadsheet ranges',\n category: 'Spreadsheet',\n icon: 'bar-chart',\n emoji: '🎨',\n describe: describeRange,\n },\n format_sheet_range: {\n displayName: 'Format Cells',\n activeLabel: 'Formatting spreadsheet',\n completedLabel: 'Formatted spreadsheet',\n category: 'Spreadsheet',\n icon: 'bar-chart',\n emoji: '🎨',\n describe: describeRange,\n },\n set_row_column_dimensions: {\n displayName: 'Resize Rows and Columns',\n activeLabel: 'Resizing rows and columns',\n category: 'Spreadsheet',\n icon: 'table',\n },\n query_sheet_range: {\n displayName: 'Query Sheet',\n activeLabel: 'Querying spreadsheet',\n category: 'Spreadsheet',\n icon: 'search',\n emoji: '🔍',\n describe: describeRange,\n },\n create_chart: {\n displayName: 'Create Chart',\n activeLabel: 'Creating chart',\n completedLabel: 'Created chart',\n category: 'Spreadsheet',\n icon: 'trending-up',\n emoji: '📈',\n },\n execute_spreadsheet_code: {\n displayName: 'Execute Spreadsheet Code',\n activeLabel: 'Editing spreadsheet',\n category: 'Spreadsheet',\n icon: 'bar-chart',\n },\n execute_spreadsheet_commands: {\n displayName: 'Edit Spreadsheet',\n activeLabel: 'Editing spreadsheet',\n category: 'Spreadsheet',\n icon: 'bar-chart',\n },\n capture_sheet_screenshot: {\n displayName: 'Capture Sheet',\n activeLabel: 'Capturing sheet screenshot',\n category: 'Spreadsheet',\n icon: 'camera',\n emoji: '📸',\n },\n create_table: {\n displayName: 'Create Table',\n activeLabel: 'Creating table',\n completedLabel: 'Created table',\n category: 'Spreadsheet',\n icon: 'table',\n },\n update_table: {\n displayName: 'Update Table',\n activeLabel: 'Updating table',\n completedLabel: 'Updated table',\n category: 'Spreadsheet',\n icon: 'table',\n },\n table: {\n displayName: 'Table',\n activeLabel: 'Updating table',\n completedLabel: 'Updated table',\n category: 'Spreadsheet',\n icon: 'table',\n },\n update_sheet_cell: {\n displayName: 'Update Cells',\n activeLabel: 'Updating cells',\n completedLabel: 'Updated cells',\n category: 'Spreadsheet',\n icon: 'bar-chart',\n },\n\n // ── SQL & databases ──\n create_new_query_snippet: {\n displayName: 'Create Query',\n activeLabel: 'Creating query',\n category: 'SQL',\n icon: 'database',\n describe: describeNamed(),\n },\n execute_query_snippet: {\n displayName: 'Execute Query',\n activeLabel: 'Executing query',\n category: 'SQL',\n icon: 'play',\n emoji: '▶️',\n },\n update_query_snippet: {\n displayName: 'Update Query',\n activeLabel: 'Updating query',\n category: 'SQL',\n icon: 'pen-line',\n emoji: '✏️',\n },\n get_database_connection_details: {\n displayName: 'Get DB Connection',\n activeLabel: 'Loading connection details',\n category: 'SQL',\n icon: 'database',\n emoji: '🔌',\n },\n run_sql: {\n displayName: 'Run SQL Query',\n activeLabel: 'Running database query',\n completedLabel: 'Query complete',\n category: 'Database',\n icon: 'database',\n describe: describeSql,\n },\n run_database_sql: {\n displayName: 'Run SQL Query',\n activeLabel: 'Running database query',\n completedLabel: 'Query complete',\n category: 'Database',\n icon: 'database',\n describe: describeSql,\n },\n run_sql_query_tool: {\n displayName: 'Run SQL Query',\n activeLabel: 'Running database query',\n completedLabel: 'Query complete',\n category: 'Database',\n icon: 'database',\n describe: describeSql,\n },\n create_database: {\n displayName: 'Create Database',\n activeLabel: 'Setting up database',\n category: 'Database',\n icon: 'database',\n describe: describeNamed(),\n },\n create_database_table: {\n displayName: 'Create Table',\n activeLabel: 'Creating table',\n category: 'Database',\n icon: 'table',\n describe: describeTable,\n },\n describe_database: {\n displayName: 'Describe Database',\n activeLabel: 'Inspecting database',\n category: 'Database',\n icon: 'database',\n },\n list_database_schemas: {\n displayName: 'List Schemas',\n activeLabel: 'Loading schemas',\n category: 'Database',\n icon: 'database',\n },\n list_database_tables: {\n displayName: 'List Tables',\n activeLabel: 'Listing database tables',\n category: 'Database',\n icon: 'database',\n },\n get_database_table_schema: {\n displayName: 'Get Table Schema',\n activeLabel: 'Reading table schema',\n category: 'Database',\n icon: 'database',\n describe: describeTable,\n },\n load_tool_result_to_database: {\n displayName: 'Load Result to Database',\n activeLabel: 'Loading result into database',\n category: 'Database',\n icon: 'database',\n },\n list_databricks_tables: {\n displayName: 'List Databricks Tables',\n activeLabel: 'Listing Databricks tables',\n category: 'Database',\n icon: 'database',\n },\n describe_databricks_table: {\n displayName: 'Describe Databricks Table',\n activeLabel: 'Inspecting Databricks table',\n category: 'Database',\n icon: 'database',\n describe: describeTable,\n },\n execute_databricks_query: {\n displayName: 'Run Databricks Query',\n activeLabel: 'Running Databricks query',\n category: 'Database',\n icon: 'database',\n describe: describeSql,\n },\n\n // ── Python ──\n run_python_code: {\n displayName: 'Run Python',\n activeLabel: 'Running Python code',\n completedLabel: 'Python execution complete',\n category: 'Python',\n icon: 'code',\n },\n install_pip_package: {\n displayName: 'Install Package',\n activeLabel: 'Installing package',\n category: 'Python',\n icon: 'package',\n emoji: '📦',\n describe: describePackage,\n },\n get_installed_packages: {\n displayName: 'List Packages',\n activeLabel: 'Loading installed packages',\n category: 'Python',\n icon: 'package',\n emoji: '📦',\n },\n create_new_python_script: {\n displayName: 'Create Script',\n activeLabel: 'Creating Python script',\n category: 'Python',\n icon: 'code',\n describe: describeNamed(),\n },\n update_python_script: {\n displayName: 'Update Script',\n activeLabel: 'Updating Python script',\n category: 'Python',\n icon: 'code',\n },\n run_python_script: {\n displayName: 'Run Script',\n activeLabel: 'Running Python script',\n category: 'Python',\n icon: 'play',\n emoji: '▶️',\n },\n\n // ── Spaces & assets ──\n open_asset_in_workspace: {\n displayName: 'Open Asset',\n activeLabel: 'Opening in workspace',\n completedLabel: 'Opened in workspace',\n category: 'Spaces',\n icon: 'folder-open',\n },\n list_contents: {\n displayName: 'List Contents',\n activeLabel: 'Browsing files',\n category: 'Spaces',\n icon: 'folder',\n emoji: '📁',\n },\n create_new_folder: {\n displayName: 'Create Folder',\n activeLabel: 'Creating folder',\n category: 'Spaces',\n icon: 'folder',\n emoji: '📁',\n describe: describeNamed(),\n },\n create_new_project: {\n displayName: 'Create Project',\n activeLabel: 'Creating project',\n category: 'Spaces',\n icon: 'clipboard-list',\n emoji: '📋',\n describe: describeNamed(),\n },\n update_project: {\n displayName: 'Update Project',\n activeLabel: 'Updating project',\n category: 'Spaces',\n icon: 'clipboard-list',\n emoji: '📋',\n },\n project_links: {\n displayName: 'Project Links',\n activeLabel: 'Managing project links',\n category: 'Spaces',\n icon: 'link',\n emoji: '🔗',\n },\n search_assets: {\n displayName: 'Search Assets',\n activeLabel: 'Searching files',\n category: 'Spaces',\n icon: 'search',\n emoji: '🔍',\n describe: describeQuery,\n },\n rename_assets: {\n displayName: 'Rename Assets',\n activeLabel: 'Renaming assets',\n category: 'Spaces',\n icon: 'pen-line',\n emoji: '✏️',\n },\n duplicate_asset: {\n displayName: 'Duplicate Asset',\n activeLabel: 'Duplicating asset',\n category: 'Spaces',\n icon: 'folder-open',\n emoji: '📋',\n },\n move_assets_to_folder: {\n displayName: 'Move Assets',\n activeLabel: 'Moving assets',\n category: 'Spaces',\n icon: 'folder-open',\n },\n create_collection: {\n displayName: 'Create Collection',\n activeLabel: 'Creating collection',\n completedLabel: 'Created collection',\n category: 'Spaces',\n icon: 'book-open',\n emoji: '📚',\n describe: describeNamed(),\n },\n update_collection: {\n displayName: 'Update Collection',\n activeLabel: 'Updating collection',\n completedLabel: 'Updated collection',\n category: 'Spaces',\n icon: 'book-open',\n emoji: '📚',\n },\n add_assets_to_collection: {\n displayName: 'Add to Collection',\n activeLabel: 'Organizing assets',\n completedLabel: 'Assets organized',\n category: 'Spaces',\n icon: 'book-open',\n emoji: '📚',\n },\n remove_assets_from_collection: {\n displayName: 'Remove from Collection',\n activeLabel: 'Removing assets',\n category: 'Spaces',\n icon: 'book-open',\n emoji: '📚',\n },\n add_assets_to_favorites: {\n displayName: 'Add to Favorites',\n activeLabel: 'Adding to favorites',\n category: 'Spaces',\n icon: 'star',\n emoji: '⭐',\n },\n\n // ── Visualizations & canvas ──\n create_new_figure: {\n displayName: 'Create Figure',\n activeLabel: 'Creating figure',\n category: 'Visualization',\n icon: 'trending-up',\n describe: describeNamed(),\n },\n create_new_dashboard: {\n displayName: 'Create Dashboard',\n activeLabel: 'Creating dashboard',\n category: 'Visualization',\n icon: 'layout-dashboard',\n describe: describeNamed(),\n },\n update_figure_asset: {\n displayName: 'Update Figure',\n activeLabel: 'Updating figure',\n category: 'Visualization',\n icon: 'trending-up',\n },\n update_dashboard_asset: {\n displayName: 'Update Dashboard',\n activeLabel: 'Updating dashboard',\n category: 'Visualization',\n icon: 'layout-dashboard',\n },\n CreateNewCanvas: {\n displayName: 'Create Canvas',\n activeLabel: 'Creating canvas',\n category: 'Canvas',\n icon: 'palette',\n describe: describeNamed(),\n },\n UpdateCanvasAsset: {\n displayName: 'Update Canvas',\n activeLabel: 'Updating canvas',\n category: 'Canvas',\n icon: 'palette',\n },\n generate_image: {\n displayName: 'Generate Image',\n activeLabel: 'Generating image',\n category: 'Media',\n icon: 'image',\n emoji: '🖼️',\n },\n query_single_image: {\n displayName: 'Analyze Image',\n activeLabel: 'Analyzing image',\n category: 'Media',\n icon: 'image',\n emoji: '🖼️',\n },\n capture_moment: {\n displayName: 'Capture Moment',\n activeLabel: 'Capturing moment',\n completedLabel: 'Moment captured',\n category: 'Media',\n icon: 'camera',\n },\n\n // ── Presentations ──\n create_powerpoint_deck: {\n displayName: 'Create Presentation',\n activeLabel: 'Creating presentation',\n completedLabel: 'Created presentation',\n category: 'Presentation',\n icon: 'presentation',\n describe: describeNamed(),\n },\n create_presentation_pptx_studio: {\n displayName: 'Create Presentation',\n activeLabel: 'Creating presentation',\n completedLabel: 'Created presentation',\n category: 'Presentation',\n icon: 'presentation',\n describe: describeNamed(),\n },\n capture_slide_screenshot: {\n displayName: 'Capture Slide',\n activeLabel: 'Capturing slide',\n completedLabel: 'Slide captured',\n category: 'Presentation',\n icon: 'camera',\n emoji: '📸',\n },\n execute_presentation_code: {\n displayName: 'Execute Presentation Code',\n activeLabel: 'Updating presentation',\n completedLabel: 'Updated presentation',\n category: 'Presentation',\n icon: 'presentation',\n emoji: '▶️',\n },\n get_template_placeholders: {\n displayName: 'Get Placeholders',\n activeLabel: 'Loading template placeholders',\n category: 'Presentation',\n icon: 'presentation',\n },\n\n // ── User interfaces ──\n create_new_user_interface: {\n displayName: 'Create UI',\n activeLabel: 'Creating user interface',\n category: 'UI',\n icon: 'monitor',\n describe: describeNamed(),\n },\n update_user_interface_code: {\n displayName: 'Update UI Code',\n activeLabel: 'Updating UI code',\n category: 'UI',\n icon: 'monitor',\n },\n patch_user_interface_code: {\n displayName: 'Patch UI Code',\n activeLabel: 'Patching UI code',\n category: 'UI',\n icon: 'monitor',\n },\n\n // ── Notebooks ──\n create_new_notebook: {\n displayName: 'Create Notebook',\n activeLabel: 'Creating notebook',\n completedLabel: 'Created notebook',\n category: 'Notebook',\n icon: 'book-open',\n describe: describeNamed(),\n },\n execute_cell: {\n displayName: 'Execute Cell',\n activeLabel: 'Running notebook cell',\n category: 'Notebook',\n icon: 'code',\n emoji: '▶️',\n },\n add_cell_content: {\n displayName: 'Add Cell',\n activeLabel: 'Adding cell',\n category: 'Notebook',\n icon: 'book-open',\n },\n replace_cell_content: {\n displayName: 'Replace Cell',\n activeLabel: 'Replacing cell content',\n category: 'Notebook',\n icon: 'book-open',\n },\n\n // ── Workflows (AOP) ──\n create_new_aop: {\n displayName: 'Create AOP',\n activeLabel: 'Creating workflow',\n category: 'AOP',\n icon: 'brain',\n describe: describeNamed(),\n },\n update_aop: {\n displayName: 'Update AOP',\n activeLabel: 'Updating workflow',\n category: 'AOP',\n icon: 'brain',\n },\n execute_aop: {\n displayName: 'Execute AOP',\n activeLabel: 'Running workflow',\n category: 'AOP',\n icon: 'brain',\n emoji: '▶️',\n },\n\n // ── Browser & computer ──\n create_new_browse_session: {\n displayName: 'Open Browser',\n activeLabel: 'Opening browser session',\n category: 'Browser',\n icon: 'globe',\n },\n go_to_url: {\n displayName: 'Navigate',\n activeLabel: 'Navigating',\n category: 'Browser',\n icon: 'globe',\n describe: describeUrl,\n },\n get_page_text: {\n displayName: 'Read Page',\n activeLabel: 'Reading page content',\n category: 'Browser',\n icon: 'file-text',\n emoji: '📖',\n },\n computer: {\n displayName: 'Computer Action',\n activeLabel: 'Using computer',\n completedLabel: 'Computer action complete',\n category: 'Browser',\n icon: 'mouse-pointer',\n emoji: '🖱️',\n },\n computer_asset_create: {\n displayName: 'Create Computer',\n activeLabel: 'Creating computer asset',\n category: 'Computer',\n icon: 'monitor',\n },\n\n // ── External drives ──\n search_sharepoint: {\n displayName: 'Search SharePoint',\n activeLabel: 'Searching SharePoint',\n category: 'Drive',\n icon: 'search',\n emoji: '🔍',\n describe: describeQuery,\n },\n search_onedrive: {\n displayName: 'Search OneDrive',\n activeLabel: 'Searching OneDrive',\n category: 'Drive',\n icon: 'search',\n emoji: '🔍',\n describe: describeQuery,\n },\n fetch_onedrive_url: {\n displayName: 'Fetch OneDrive File',\n activeLabel: 'Fetching OneDrive file',\n category: 'Drive',\n icon: 'file-text',\n emoji: '📄',\n describe: describeUrl,\n },\n search_imanage: {\n displayName: 'Search iManage',\n activeLabel: 'Searching iManage',\n category: 'Drive',\n icon: 'search',\n emoji: '🔍',\n describe: describeQuery,\n },\n fetch_imanage: {\n displayName: 'Fetch iManage',\n activeLabel: 'Reading iManage',\n category: 'Drive',\n icon: 'file-text',\n emoji: '📄',\n },\n search_google_drive: {\n displayName: 'Search Google Drive',\n activeLabel: 'Searching Google Drive',\n category: 'Drive',\n icon: 'search',\n emoji: '🔍',\n describe: describeQuery,\n },\n\n // ── Comments ──\n list_comment_threads: {\n displayName: 'List Comments',\n activeLabel: 'Loading comments',\n category: 'Comments',\n icon: 'message-square',\n },\n add_comment: {\n displayName: 'Add Comment',\n activeLabel: 'Adding comment',\n category: 'Comments',\n icon: 'message-square',\n },\n reply_to_comment: {\n displayName: 'Reply to Comment',\n activeLabel: 'Replying to comment',\n category: 'Comments',\n icon: 'message-square',\n },\n\n // ── Analysis ──\n in_depth_analysis: {\n displayName: 'In-Depth Analysis',\n activeLabel: 'Analyzing',\n category: 'Analysis',\n icon: 'microscope',\n describe: describeQuery,\n },\n\n // ── Playbooks, GitHub, ontology, scripts, project manager ──\n create_new_playbook: {\n displayName: 'Create Playbook',\n activeLabel: 'Creating playbook',\n category: 'Playbook',\n icon: 'book-open',\n describe: describeNamed(),\n },\n update_playbook: {\n displayName: 'Update Playbook',\n activeLabel: 'Updating playbook',\n category: 'Playbook',\n icon: 'book-open',\n },\n github_fetch_file: {\n displayName: 'Fetch File',\n activeLabel: 'Fetching file from GitHub',\n category: 'GitHub',\n icon: 'file-text',\n emoji: '📄',\n describe: describePath,\n },\n github_list_directory: {\n displayName: 'List Directory',\n activeLabel: 'Listing GitHub directory',\n category: 'GitHub',\n icon: 'folder',\n emoji: '📁',\n describe: describePath,\n },\n github_get_pull_request: {\n displayName: 'Get Pull Request',\n activeLabel: 'Loading pull request',\n category: 'GitHub',\n icon: 'git-pull-request',\n },\n github_list_pull_requests: {\n displayName: 'List Pull Requests',\n activeLabel: 'Loading pull requests',\n category: 'GitHub',\n icon: 'git-pull-request',\n },\n list_object_types: {\n displayName: 'List Object Types',\n activeLabel: 'Reading object types',\n category: 'Ontology',\n icon: 'boxes',\n },\n create_object_type: {\n displayName: 'Create Object Type',\n activeLabel: 'Creating object type',\n category: 'Ontology',\n icon: 'boxes',\n emoji: '🧩',\n describe: describeNamed(),\n },\n update_object_type: {\n displayName: 'Update Object Type',\n activeLabel: 'Updating object type',\n category: 'Ontology',\n icon: 'boxes',\n emoji: '🧩',\n },\n search_objects: {\n displayName: 'Search Objects',\n activeLabel: 'Searching objects',\n category: 'Ontology',\n icon: 'search',\n emoji: '🔎',\n describe: describeQuery,\n },\n create_object: {\n displayName: 'Create Object',\n activeLabel: 'Creating object',\n category: 'Ontology',\n icon: 'package',\n emoji: '📦',\n describe: describeNamed(),\n },\n create_objects: {\n displayName: 'Create Objects',\n activeLabel: 'Creating objects',\n category: 'Ontology',\n icon: 'package',\n emoji: '📦',\n },\n update_object: {\n displayName: 'Update Object',\n activeLabel: 'Updating object',\n category: 'Ontology',\n icon: 'package',\n emoji: '📦',\n },\n archive_object: {\n displayName: 'Archive Object',\n activeLabel: 'Archiving object',\n category: 'Ontology',\n icon: 'package',\n },\n get_object_links: {\n displayName: 'Get Object Links',\n activeLabel: 'Reading links',\n category: 'Ontology',\n icon: 'link',\n emoji: '🔗',\n },\n link_objects: {\n displayName: 'Link Objects',\n activeLabel: 'Linking objects',\n category: 'Ontology',\n icon: 'link',\n emoji: '🔗',\n },\n unlink_objects: {\n displayName: 'Unlink Objects',\n activeLabel: 'Removing link',\n category: 'Ontology',\n icon: 'link',\n emoji: '🔗',\n },\n create_project_with_manager: {\n displayName: 'Create Managed Project',\n activeLabel: 'Creating managed project',\n category: 'Project Manager',\n icon: 'clipboard-list',\n describe: describeNamed(),\n },\n get_pm_roadmap: {\n displayName: 'Get Roadmap',\n activeLabel: 'Loading roadmap',\n category: 'Project Manager',\n icon: 'clipboard-list',\n emoji: '🗺️',\n },\n\n // ── Voice mode (a run delegated from a live GPT Live conversation) ──\n send_voice_update: {\n displayName: 'Voice Update',\n activeLabel: 'Speaking to you',\n completedLabel: 'Voice update sent',\n category: 'Agent',\n internal: true,\n icon: 'message-square',\n emoji: '🗣️',\n describe: (args) => (typeof args.text === 'string' && args.text ? args.text : undefined),\n },\n\n // ── Agent runtime & workspace files (deepagents built-ins) ──\n task: {\n displayName: 'Delegate to Subagent',\n activeLabel: 'Delegating to a subagent',\n category: 'Agent',\n internal: true,\n icon: 'bot',\n describe: describeDelegation,\n },\n start_async_task: {\n displayName: 'Start Background Task',\n activeLabel: 'Starting background task',\n category: 'Agent',\n internal: true,\n icon: 'bot',\n describe: describeDelegation,\n },\n check_async_task: {\n displayName: 'Check Background Task',\n activeLabel: 'Checking background task',\n category: 'Agent',\n internal: true,\n icon: 'bot',\n },\n update_async_task: {\n displayName: 'Update Background Task',\n activeLabel: 'Updating background task',\n category: 'Agent',\n internal: true,\n icon: 'bot',\n },\n cancel_async_task: {\n displayName: 'Cancel Background Task',\n activeLabel: 'Cancelling background task',\n category: 'Agent',\n internal: true,\n icon: 'bot',\n },\n list_async_tasks: {\n displayName: 'List Background Tasks',\n activeLabel: 'Listing background tasks',\n category: 'Agent',\n internal: true,\n icon: 'bot',\n },\n write_todos: {\n displayName: 'Plan',\n activeLabel: 'Planning',\n category: 'Agent',\n internal: true,\n icon: 'list-checks',\n emoji: '📝',\n },\n ask: {\n displayName: 'Ask a Question',\n activeLabel: 'Waiting for your input',\n completedLabel: 'Input received',\n category: 'Agent',\n internal: true,\n icon: 'circle-help',\n emoji: '❓',\n },\n final_response: {\n displayName: 'Final Response',\n activeLabel: 'Finishing up',\n category: 'Agent',\n internal: true,\n icon: 'flag',\n emoji: '🏁',\n },\n execute: {\n displayName: 'Run Command',\n activeLabel: 'Running a command',\n category: 'Files',\n internal: true,\n icon: 'terminal',\n emoji: '⌨️',\n },\n eval: {\n displayName: 'Evaluate Code',\n activeLabel: 'Evaluating code',\n category: 'Files',\n internal: true,\n icon: 'code',\n },\n read_file: {\n displayName: 'Review Working Files',\n activeLabel: 'Reviewing working files',\n category: 'Files',\n internal: true,\n icon: 'scan-search',\n describe: describePath,\n },\n ls: {\n displayName: 'Check Workspace',\n activeLabel: 'Checking the workspace',\n category: 'Files',\n internal: true,\n icon: 'folder-open',\n describe: describePath,\n },\n write_file: {\n displayName: 'Save Working Files',\n activeLabel: 'Saving working files',\n category: 'Files',\n internal: true,\n icon: 'file-text',\n describe: describePath,\n },\n edit_file: {\n displayName: 'Update Working Files',\n activeLabel: 'Updating working files',\n category: 'Files',\n internal: true,\n icon: 'pen-line',\n describe: describePath,\n },\n glob: {\n displayName: 'Search Working Files',\n activeLabel: 'Searching working files',\n category: 'Files',\n internal: true,\n icon: 'search',\n describe: (args) => nonBlank(args.pattern) ?? nonBlank(args.query) ?? nonBlank(args.path),\n },\n grep: {\n displayName: 'Search Working Files',\n activeLabel: 'Searching working files',\n category: 'Files',\n internal: true,\n icon: 'search',\n describe: (args) => nonBlank(args.pattern) ?? nonBlank(args.query) ?? nonBlank(args.path),\n },\n\n // ── Athena Studio SDK sub-calls (programmatic tool calling) ──\n CreateWorkbook: {\n displayName: 'Create Workbook',\n activeLabel: 'Creating workbook',\n category: 'Spreadsheet',\n internal: true,\n icon: 'bar-chart',\n describe: describeNamed(),\n },\n AddSheet: {\n displayName: 'Add Sheet',\n activeLabel: 'Adding sheet',\n category: 'Spreadsheet',\n internal: true,\n icon: 'table',\n describe: describeNamed(),\n },\n OpenWorkbook: {\n displayName: 'Open Workbook',\n activeLabel: 'Opening workbook',\n category: 'Spreadsheet',\n internal: true,\n icon: 'folder-open',\n },\n WriteCells: {\n displayName: 'Write Cells',\n activeLabel: 'Writing cells',\n category: 'Spreadsheet',\n internal: true,\n icon: 'bar-chart',\n describe: describeRange,\n },\n CreatePresentation: {\n displayName: 'Create Presentation',\n activeLabel: 'Creating presentation',\n category: 'Presentation',\n internal: true,\n icon: 'presentation',\n describe: describeNamed(),\n },\n OpenPresentation: {\n displayName: 'Open Presentation',\n activeLabel: 'Opening presentation',\n category: 'Presentation',\n internal: true,\n icon: 'folder-open',\n },\n AddSlide: {\n displayName: 'Add Slide',\n activeLabel: 'Adding slide',\n category: 'Presentation',\n internal: true,\n icon: 'presentation',\n },\n CreateDocument: {\n displayName: 'Create Document',\n activeLabel: 'Creating document',\n category: 'Document',\n internal: true,\n icon: 'file-text',\n describe: describeNamed(),\n },\n OpenDocument: {\n displayName: 'Open Document',\n activeLabel: 'Opening document',\n category: 'Document',\n internal: true,\n icon: 'folder-open',\n },\n CreateParagraph: {\n displayName: 'Write Paragraph',\n activeLabel: 'Writing paragraph',\n category: 'Document',\n internal: true,\n icon: 'pen-line',\n },\n CreateHeading: {\n displayName: 'Write Heading',\n activeLabel: 'Writing heading',\n category: 'Document',\n internal: true,\n icon: 'pen-line',\n },\n CreateTable: {\n displayName: 'Insert Table',\n activeLabel: 'Inserting table',\n category: 'Document',\n internal: true,\n icon: 'table',\n },\n AddCitation: {\n displayName: 'Add Citation',\n activeLabel: 'Adding citation',\n category: 'Document',\n internal: true,\n icon: 'link',\n },\n\n // ── Chrome extension (device tools) ──\n chrome_tabs_context: {\n displayName: 'Open Tabs',\n activeLabel: 'Checking open tabs',\n completedLabel: 'Checked open tabs',\n category: 'Browser',\n icon: 'globe',\n },\n chrome_tabs_create: {\n displayName: 'New Tab',\n activeLabel: 'Opening a new tab',\n completedLabel: 'Opened a new tab',\n category: 'Browser',\n icon: 'globe',\n },\n chrome_batch: {\n displayName: 'Chrome Actions',\n activeLabel: 'Working in Chrome',\n completedLabel: 'Chrome actions complete',\n category: 'Browser',\n icon: 'list-checks',\n },\n chrome_computer: {\n displayName: 'Page Interaction',\n activeLabel: 'Interacting with the page',\n completedLabel: 'Page interaction complete',\n category: 'Browser',\n icon: 'mouse-pointer',\n emoji: '🖱️',\n },\n chrome_navigate: {\n displayName: 'Navigate Page',\n activeLabel: 'Navigating the page',\n completedLabel: 'Page navigation complete',\n category: 'Browser',\n icon: 'globe',\n },\n chrome_read_page: {\n displayName: 'Read Page',\n activeLabel: 'Reading the page',\n completedLabel: 'Read the page',\n category: 'Browser',\n icon: 'file-text',\n emoji: '📖',\n },\n chrome_find: {\n displayName: 'Find on Page',\n activeLabel: 'Finding page content',\n completedLabel: 'Found page content',\n category: 'Browser',\n icon: 'scan-search',\n emoji: '🔍',\n },\n chrome_form_input: {\n displayName: 'Fill Form',\n activeLabel: 'Filling in the page',\n completedLabel: 'Updated the page',\n category: 'Browser',\n icon: 'pen-line',\n },\n chrome_get_page_text: {\n displayName: 'Page Text',\n activeLabel: 'Reading page text',\n completedLabel: 'Read page text',\n category: 'Browser',\n icon: 'file-text',\n emoji: '📖',\n },\n chrome_javascript: {\n displayName: 'Page JavaScript',\n activeLabel: 'Running page JavaScript',\n completedLabel: 'Page JavaScript complete',\n category: 'Browser',\n icon: 'code',\n },\n chrome_read_console: {\n displayName: 'Browser Console',\n activeLabel: 'Checking the console',\n completedLabel: 'Checked the console',\n category: 'Browser',\n icon: 'terminal',\n },\n chrome_read_network: {\n displayName: 'Network Activity',\n activeLabel: 'Checking network activity',\n completedLabel: 'Checked network activity',\n category: 'Browser',\n icon: 'link',\n },\n chrome_wait_for: {\n displayName: 'Wait for Page',\n activeLabel: 'Waiting for the page',\n completedLabel: 'Page is ready',\n category: 'Browser',\n icon: 'play',\n },\n chrome_gif_creator: {\n displayName: 'Create GIF',\n activeLabel: 'Creating a GIF',\n completedLabel: 'Created a GIF',\n category: 'Browser',\n icon: 'image',\n emoji: '🎞️',\n },\n chrome_shortcuts_list: {\n displayName: 'Browser Shortcuts',\n activeLabel: 'Checking browser shortcuts',\n completedLabel: 'Checked browser shortcuts',\n category: 'Browser',\n icon: 'list-checks',\n },\n chrome_shortcuts_execute: {\n displayName: 'Run Browser Shortcut',\n activeLabel: 'Using a browser shortcut',\n completedLabel: 'Browser shortcut complete',\n category: 'Browser',\n icon: 'play',\n },\n chrome_handle_dialog: {\n displayName: 'Browser Dialog',\n activeLabel: 'Handling the browser dialog',\n completedLabel: 'Handled the browser dialog',\n category: 'Browser',\n icon: 'message-square',\n },\n\n\n // ── Tool management ──\n toggle_toolkit: {\n displayName: 'Toggle Toolkit',\n activeLabel: 'Toggling toolkit',\n category: 'Tool',\n icon: 'settings',\n emoji: '🧰',\n },\n enable_tool_by_id: {\n displayName: 'Enable Tool',\n activeLabel: 'Enabling tool',\n category: 'Tool',\n icon: 'settings',\n emoji: '🧰',\n },\n};\n\n// ─── Public API ────────────────────────────────────────────────────────\n\n/**\n * Humanize a `snake_case` / `camelCase` tool name into a Title Case label\n * (`create_new_sheet` → \"Create New Sheet\", `CreateWorkbook` → \"Create Workbook\").\n */\nexport function formatToolName(toolName: string): string {\n return toolName\n .replace(/_/g, ' ')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/\\b\\w/g, (char) => char.toUpperCase())\n .trim();\n}\n\n/** The generic presentation for a tool with no registry entry. */\nexport function defaultToolDisplayMeta(toolName: string): ToolDisplayMeta {\n const displayName = formatToolName(toolName);\n return {\n displayName,\n activeLabel: `Running ${displayName}`,\n category: 'Tool',\n icon: 'wrench',\n emoji: DEFAULT_EMOJI,\n };\n}\n\n/** True when the registry has an entry for `toolName`. */\nexport function hasToolDisplayMeta(toolName: string): boolean {\n return Object.hasOwn(TOOL_DISPLAY_META, toolName);\n}\n\n/** Display metadata for `toolName` — the registry entry, else a readable default. Never throws. */\nexport function getToolDisplayMeta(toolName: string): ToolDisplayMeta {\n const entry = TOOL_DISPLAY_META[toolName];\n if (!entry) return defaultToolDisplayMeta(toolName);\n return { ...entry, emoji: entry.emoji ?? CATEGORY_EMOJI[entry.category] };\n}\n\n/** Every tool name with a registry entry. */\nexport function knownToolNames(): string[] {\n return Object.keys(TOOL_DISPLAY_META);\n}\n\n/** The emoji for a category (the wrench for anything unknown). */\nexport function getCategoryEmoji(category: string): string {\n return (CATEGORY_EMOJI as Record<string, string>)[category] ?? DEFAULT_EMOJI;\n}\n\n/**\n * The one-line summary of a call's arguments, when the tool knows how to\n * summarize them (`args` may be undefined or unparsed while streaming).\n */\nexport function describeToolArgs({\n toolName,\n args,\n}: {\n toolName: string;\n args: Record<string, unknown> | undefined;\n}): string | undefined {\n const describe = getToolDisplayMeta(toolName).describe;\n if (!describe || !args) return undefined;\n const summary = describe(args);\n return summary?.trim() ? summary : undefined;\n}\n\n/**\n * The running-row label: the activity plus the call's own summary\n * (\"Searching the web: \\\"quarterly revenue\\\"\"), without trailing punctuation.\n */\nexport function toolActiveLabel({\n toolName,\n args,\n}: {\n toolName: string;\n args: Record<string, unknown> | undefined;\n}): string {\n const meta = getToolDisplayMeta(toolName);\n const summary = describeToolArgs({ toolName, args });\n return summary ? `${meta.activeLabel}: ${summary}` : meta.activeLabel;\n}\n\nconst PAST_TENSE_IRREGULARS: readonly [RegExp, string][] = [\n [/^Taking\\b/, 'Took'],\n [/^Getting\\b/, 'Got'],\n [/^Running\\b/, 'Ran'],\n [/^Reading\\b/, 'Read'],\n [/^Finding\\b/, 'Found'],\n [/^Writing\\b/, 'Wrote'],\n [/^Building\\b/, 'Built'],\n [/^Setting\\b/, 'Set'],\n [/^Sending\\b/, 'Sent'],\n];\n\n/**\n * Turn a present-tense activity label into its completed form\n * (\"Taking screenshot\" → \"Took screenshot\", \"Navigating to x\" → \"Navigated to x\").\n * Labels that do not open with an \"-ing\" verb come back unchanged.\n */\nexport function toolCompletedLabel(activeLabel: string): string {\n for (const [pattern, replacement] of PAST_TENSE_IRREGULARS) {\n if (pattern.test(activeLabel)) return activeLabel.replace(pattern, replacement);\n }\n return activeLabel.replace(/^(\\w+)ing\\b/, (_match, base: string) =>\n /[^aeiou]y$/.test(base) ? `${base.slice(0, -1)}ied` : `${base}ed`,\n );\n}\n\n/** The step states an activity row can be in; the tool card's own states plus the approval outcomes. */\nexport type ToolStatusLabelState =\n | 'running'\n | 'complete'\n | 'rejected'\n | 'cancelled'\n | 'paused'\n | 'error'\n | 'waiting';\n\n/**\n * The status-row copy for a tool call in a given state — the one wording the\n * SDK's activity card, Olympus's, and the Chrome extension's all render:\n *\n * - `running` is the registry activity (\"Searching the web\");\n * - `complete` is the curated `completedLabel` (\"Web search complete\"), else\n * the activity's past tense (\"Created computer asset\"), else the tool's\n * name;\n * - `rejected` is the curated `rejectedLabel` (\"Email not sent (rejected)\"),\n * else \"<name> — rejected\", so a call the user declined never borrows the\n * success wording;\n * - `cancelled` / `paused` / `error` / `waiting` read the same on every\n * surface.\n *\n * `displayName` lets a host with a richer tool catalog (Olympus's registry\n * names) label tools this registry has no entry for; entries always win.\n */\nexport function toolStatusLabel(\n toolName: string,\n state: ToolStatusLabelState,\n displayName?: string,\n): string {\n const known = hasToolDisplayMeta(toolName);\n const meta = getToolDisplayMeta(toolName);\n const name = known ? meta.displayName : (displayName ?? meta.displayName);\n switch (state) {\n case 'running':\n return known || !displayName ? meta.activeLabel : `Running ${displayName}`;\n case 'complete':\n if (meta.completedLabel) return meta.completedLabel;\n return known ? toolCompletedLabel(meta.activeLabel) : name;\n case 'rejected':\n return meta.rejectedLabel ?? `${name} — rejected`;\n case 'cancelled':\n return `${name} — cancelled`;\n case 'paused':\n return `${name} — paused`;\n case 'error':\n return `${name} failed`;\n case 'waiting':\n return 'Waiting for your input';\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tool-outputs.cjs","sources":["../../../../../agent-runtime/src/tool-outputs.ts"],"sourcesContent":["/**\n * Full tool outputs fetched back for messages the windowed wire carried cut\n * (`history/tool_output`), keyed by tool message id.\n *\n * The converter substitutes an entry into the wire message before the shared\n * lift pipeline runs (`convertDeepAgentState({ toolOutputs })`), so every tool\n * card downstream sees the whole output without knowing it was ever cut. An\n * entry records the `chars` of the output it was fetched for: the wire's cut\n * marker carries the output's full length, so an output the host has since\n * replaced under the same message id (a rerun, a rewrite) mismatches and is\n * fetched again instead of showing the stale text. The store is subscribable\n * so the thread re-converts when an output lands; hosts keep one per tab (a\n * message id is unique across threads) and clear it when the acting identity\n * changes, like the snapshot cache.\n */\nexport interface DeepAgentToolOutputEntry {\n content: unknown;\n /** The full length the wire's cut marker reported when this was fetched. */\n chars: number;\n}\n\nexport interface DeepAgentToolOutputStore {\n entry(messageId: string): DeepAgentToolOutputEntry | undefined;\n set(messageId: string, entry: DeepAgentToolOutputEntry): void;\n /** Ids requested but not answered yet — the loader's dedupe. */\n isPending(messageId: string): boolean;\n markPending(messageId: string): void;\n clearPending(messageId: string): void;\n subscribe(listener: () => void): () => void;\n clear(): void;\n}\n\nexport interface DeepAgentToolOutputStoreOptions {\n /** Outputs retained; the least-recently set entry evicts beyond this. */\n maxEntries?: number;\n}\n\nconst DEFAULT_MAX_ENTRIES = 200;\n\nexport function createDeepAgentToolOutputStore(\n options: DeepAgentToolOutputStoreOptions = {}\n): DeepAgentToolOutputStore {\n const maxEntries = options.maxEntries ?? DEFAULT_MAX_ENTRIES;\n const outputs = new Map<string, DeepAgentToolOutputEntry>();\n const pending = new Set<string>();\n const listeners = new Set<() => void>();\n const notify = () => {\n for (const listener of listeners) listener();\n };\n return {\n entry: (messageId) => outputs.get(messageId),\n set(messageId, entry) {\n pending.delete(messageId);\n outputs.delete(messageId);\n outputs.set(messageId, entry);\n while (outputs.size > maxEntries) {\n const oldest = outputs.keys().next().value;\n if (oldest === undefined) break;\n outputs.delete(oldest);\n }\n notify();\n },\n isPending: (messageId) => pending.has(messageId),\n markPending(messageId) {\n pending.add(messageId);\n },\n clearPending(messageId) {\n pending.delete(messageId);\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n clear() {\n outputs.clear();\n pending.clear();\n notify();\n },\n };\n}\n"],"names":[],"mappings":";;AAqCA,MAAM,sBAAsB;AAErB,SAAS,+BACd,UAA2C,IACjB;AAC1B,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,8BAAc,IAAA;AACpB,QAAM,8BAAc,IAAA;AACpB,QAAM,gCAAgB,IAAA;AACtB,QAAM,SAAS,MAAM;AACnB,eAAW,YAAY,UAAW,UAAA;AAAA,EACpC;AACA,SAAO;AAAA,IACL,OAAO,CAAC,cAAc,QAAQ,IAAI,SAAS;AAAA,IAC3C,IAAI,WAAW,OAAO;AACpB,cAAQ,OAAO,SAAS;AACxB,cAAQ,OAAO,SAAS;AACxB,cAAQ,IAAI,WAAW,KAAK;AAC5B,aAAO,QAAQ,OAAO,YAAY;AAChC,cAAM,SAAS,QAAQ,KAAA,EAAO,OAAO;AACrC,YAAI,WAAW,OAAW;AAC1B,gBAAQ,OAAO,MAAM;AAAA,MACvB;AACA,aAAA;AAAA,IACF;AAAA,IACA,WAAW,CAAC,cAAc,QAAQ,IAAI,SAAS;AAAA,IAC/C,YAAY,WAAW;AACrB,cAAQ,IAAI,SAAS;AAAA,IACvB;AAAA,IACA,aAAa,WAAW;AACtB,cAAQ,OAAO,SAAS;AAAA,IAC1B;AAAA,IACA,UAAU,UAAU;AAClB,gBAAU,IAAI,QAAQ;AACtB,aAAO,MAAM;AACX,kBAAU,OAAO,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,QAAQ;AACN,cAAQ,MAAA;AACR,cAAQ,MAAA;AACR,aAAA;AAAA,IACF;AAAA,EAAA;AAEJ;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tool-outputs.js","sources":["../../../../../agent-runtime/src/tool-outputs.ts"],"sourcesContent":["/**\n * Full tool outputs fetched back for messages the windowed wire carried cut\n * (`history/tool_output`), keyed by tool message id.\n *\n * The converter substitutes an entry into the wire message before the shared\n * lift pipeline runs (`convertDeepAgentState({ toolOutputs })`), so every tool\n * card downstream sees the whole output without knowing it was ever cut. An\n * entry records the `chars` of the output it was fetched for: the wire's cut\n * marker carries the output's full length, so an output the host has since\n * replaced under the same message id (a rerun, a rewrite) mismatches and is\n * fetched again instead of showing the stale text. The store is subscribable\n * so the thread re-converts when an output lands; hosts keep one per tab (a\n * message id is unique across threads) and clear it when the acting identity\n * changes, like the snapshot cache.\n */\nexport interface DeepAgentToolOutputEntry {\n content: unknown;\n /** The full length the wire's cut marker reported when this was fetched. */\n chars: number;\n}\n\nexport interface DeepAgentToolOutputStore {\n entry(messageId: string): DeepAgentToolOutputEntry | undefined;\n set(messageId: string, entry: DeepAgentToolOutputEntry): void;\n /** Ids requested but not answered yet — the loader's dedupe. */\n isPending(messageId: string): boolean;\n markPending(messageId: string): void;\n clearPending(messageId: string): void;\n subscribe(listener: () => void): () => void;\n clear(): void;\n}\n\nexport interface DeepAgentToolOutputStoreOptions {\n /** Outputs retained; the least-recently set entry evicts beyond this. */\n maxEntries?: number;\n}\n\nconst DEFAULT_MAX_ENTRIES = 200;\n\nexport function createDeepAgentToolOutputStore(\n options: DeepAgentToolOutputStoreOptions = {}\n): DeepAgentToolOutputStore {\n const maxEntries = options.maxEntries ?? DEFAULT_MAX_ENTRIES;\n const outputs = new Map<string, DeepAgentToolOutputEntry>();\n const pending = new Set<string>();\n const listeners = new Set<() => void>();\n const notify = () => {\n for (const listener of listeners) listener();\n };\n return {\n entry: (messageId) => outputs.get(messageId),\n set(messageId, entry) {\n pending.delete(messageId);\n outputs.delete(messageId);\n outputs.set(messageId, entry);\n while (outputs.size > maxEntries) {\n const oldest = outputs.keys().next().value;\n if (oldest === undefined) break;\n outputs.delete(oldest);\n }\n notify();\n },\n isPending: (messageId) => pending.has(messageId),\n markPending(messageId) {\n pending.add(messageId);\n },\n clearPending(messageId) {\n pending.delete(messageId);\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n clear() {\n outputs.clear();\n pending.clear();\n notify();\n },\n };\n}\n"],"names":[],"mappings":"AAqCA,MAAM,sBAAsB;AAErB,SAAS,+BACd,UAA2C,IACjB;AAC1B,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,8BAAc,IAAA;AACpB,QAAM,8BAAc,IAAA;AACpB,QAAM,gCAAgB,IAAA;AACtB,QAAM,SAAS,MAAM;AACnB,eAAW,YAAY,UAAW,UAAA;AAAA,EACpC;AACA,SAAO;AAAA,IACL,OAAO,CAAC,cAAc,QAAQ,IAAI,SAAS;AAAA,IAC3C,IAAI,WAAW,OAAO;AACpB,cAAQ,OAAO,SAAS;AACxB,cAAQ,OAAO,SAAS;AACxB,cAAQ,IAAI,WAAW,KAAK;AAC5B,aAAO,QAAQ,OAAO,YAAY;AAChC,cAAM,SAAS,QAAQ,KAAA,EAAO,OAAO;AACrC,YAAI,WAAW,OAAW;AAC1B,gBAAQ,OAAO,MAAM;AAAA,MACvB;AACA,aAAA;AAAA,IACF;AAAA,IACA,WAAW,CAAC,cAAc,QAAQ,IAAI,SAAS;AAAA,IAC/C,YAAY,WAAW;AACrB,cAAQ,IAAI,SAAS;AAAA,IACvB;AAAA,IACA,aAAa,WAAW;AACtB,cAAQ,OAAO,SAAS;AAAA,IAC1B;AAAA,IACA,UAAU,UAAU;AAClB,gBAAU,IAAI,QAAQ;AACtB,aAAO,MAAM;AACX,kBAAU,OAAO,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,QAAQ;AACN,cAAQ,MAAA;AACR,cAAQ,MAAA;AACR,aAAA;AAAA,IACF;AAAA,EAAA;AAEJ;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tool-result.cjs","sources":["../../../../../agent-runtime/src/tool-result.ts"],"sourcesContent":["/**\n * Tool-result classification shared by every tool card and activity timeline\n * (the React SDK fallback, Olympus, the Chrome extension, the Office add-in,\n * mobile). One rule set for \"did this call succeed?\", so a result that reads\n * as a failure on one surface cannot read as a success on another.\n *\n * The rules, in order:\n *\n * 1. An `incomplete` status is a failure; a `cancelled` reason reads as\n * \"Cancelled\".\n * 2. A string result opening with \"⏸️ Interrupted —\" is a **paused** call (the\n * runtime parked it), not a failure.\n * 2b. A result that records the user's refusal at the approval gate (see\n * {@link readRejectedToolResult}) is a **rejected** call — neither a success\n * nor a failure. It is read before the failure rules because the HITL\n * runtime answers a refused call with an error-status tool message whose\n * content is the refusal, which would otherwise read as a plain failure.\n * Never applied to a pass-through payload: page JavaScript relays whatever\n * the page returned, and a `{ status: \"rejected\" }` from a fetched API is\n * the page's business, not a human decision.\n * 3. A result record whose `success` or `ok` is `false` is a failure, with\n * the best message available (`error`, `message`, `reason`, or a\n * `data.humanIntervention` detail). Athena tools report failures this way\n * — the sheet tools answer `{ success: false, message: \"…\" }` — so a bare\n * flag must read as a failure. The one exception is a **pass-through\n * payload** (`passThroughPayload: true`): page JavaScript relays whatever\n * the page returned, and `{ success: false, message: \"Payment required\" }`\n * from a fetched API is the page's business, not the tool failing, so there\n * the flag counts only alongside an error detail (`error`, `errorCode`,\n * `error_code`, or a `humanIntervention` message / reason / code). The\n * Chrome extension opts its `chrome_javascript` tool in; everything else\n * takes the default.\n * 4. A result record with a non-empty `error` string is a failure regardless\n * of flags — every Athena tool contract uses that field only on failure.\n * 5. A plain-string result opening with an explicit error prefix (`Error:`,\n * `Tool execution failed`, `Failed to route tool call`) is a failure —\n * device-tunnel failures arrive in successful ToolMessages, so the prefix\n * is the authoritative signal there. A bare leading \"Error\" word is not\n * (an \"Error handling guide\" is content). A batch report that stopped at a\n * step reads its header and failing step.\n * 6. assistant-ui's own `isError` flag is a failure with the best message\n * available.\n * 7. `requires-action` and a result-less non-complete status read as such;\n * everything else is a success.\n */\n\n/** The status shape a tool-call message part carries (structurally typed so this module stays UI-library-free). */\nexport interface ToolCallStatusLike {\n type: 'running' | 'complete' | 'incomplete' | 'requires-action';\n reason?: string;\n error?: unknown;\n}\n\nexport interface ToolFailure {\n message: string;\n code?: string;\n}\n\nexport type ToolResultClassification =\n | { state: 'running' }\n | { state: 'complete' }\n | { state: 'requires-action' }\n | { state: 'paused'; notice: string }\n | { state: 'rejected'; rejection: RejectedToolResult }\n | { state: 'error'; failure: ToolFailure };\n\nexport type ToolResultState = ToolResultClassification['state'];\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Parse a JSON string into a record, or `null` when it is not one. */\nexport function parseJsonRecord(value: string): Record<string, unknown> | null {\n try {\n const parsed: unknown = JSON.parse(value);\n return isRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\n/** The result as a record: parsed when it arrived as a JSON string. */\nexport function resultRecord(result: unknown): Record<string, unknown> | null {\n if (typeof result === 'string') return parseJsonRecord(result);\n return isRecord(result) ? result : null;\n}\n\n/** The first non-blank string among `keys` on `record`, or `null`. */\nexport function stringField(\n record: Record<string, unknown> | null | undefined,\n keys: readonly string[],\n): string | null {\n if (!record) return null;\n for (const key of keys) {\n const value = record[key];\n if (typeof value === 'string' && value.trim()) return value;\n }\n return null;\n}\n\n/** The `message` a result carries, when it does (the row's completion summary). */\nexport function resultMessage(result: unknown): string | null {\n return stringField(resultRecord(result), ['message']);\n}\n\nconst FAILURE_DETAIL_KEYS = ['error', 'errorCode', 'error_code'] as const;\nconst INTERVENTION_DETAIL_KEYS = ['message', 'reason', 'errorCode', 'error_code'] as const;\nconst FAILURE_CODE_KEYS = ['errorCode', 'error_code', 'code'] as const;\nconst FAILURE_MESSAGE_KEYS = ['error', 'message', 'reason'] as const;\n\nfunction batchReportFailure(trimmed: string): string | null {\n const lines = trimmed.split('\\n');\n const header = lines[0]?.trim() ?? '';\n if (!/^[\\w.-]*batch: \\d+\\/\\d+ ok — STOPPED at step \\d+/.test(header)) {\n return null;\n }\n const stepError = lines\n .map((line) => line.trim())\n .find(\n (line) =>\n /^\\d+\\.\\s/.test(line) && (line.includes(' ERROR — ') || line.endsWith(' ERROR')),\n );\n return stepError ? `${header}\\n${stepError}` : header;\n}\n\nconst STRING_ERROR_PREFIX = /^(?:Error:|Tool execution failed\\b|Failed to route tool call\\b)\\s*/;\n\nfunction plainStringError(result: unknown): string | null {\n if (typeof result !== 'string') return null;\n const trimmed = result.trim();\n if (!trimmed || parseJsonRecord(trimmed)) return null;\n if (STRING_ERROR_PREFIX.test(trimmed)) {\n return trimmed.replace(STRING_ERROR_PREFIX, '').trim() || trimmed;\n }\n return batchReportFailure(trimmed);\n}\n\nfunction pausedNotice(result: unknown): string | null {\n if (typeof result !== 'string') return null;\n const trimmed = result.trim();\n return /^⏸️?\\s*Interrupted —/.test(trimmed) ? trimmed : null;\n}\n\nfunction stringifyUnknown(value: unknown): string | null {\n if (value == null) return null;\n if (typeof value === 'string') return value;\n if (value instanceof Error) return value.message;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\n/** The failure a tool call reports, or `null` when it succeeded (rules 1, 3-6). */\nexport function toolFailure({\n status,\n result,\n isError,\n passThroughPayload = false,\n}: {\n status?: ToolCallStatusLike;\n result?: unknown;\n isError?: boolean;\n /** The result is an application payload relayed verbatim (rule 3): a flag needs an error detail to count. */\n passThroughPayload?: boolean;\n}): ToolFailure | null {\n if (status?.type === 'incomplete') {\n const errorText = stringifyUnknown(status.error);\n return {\n message:\n errorText ??\n (status.reason === 'cancelled' ? 'Cancelled' : `Tool stopped: ${status.reason}`),\n };\n }\n\n const record = resultRecord(result);\n const data = isRecord(record?.data) ? record.data : null;\n const humanIntervention = isRecord(data?.humanIntervention) ? data.humanIntervention : null;\n const failureDetail =\n stringField(record, FAILURE_DETAIL_KEYS) ??\n stringField(humanIntervention, INTERVENTION_DETAIL_KEYS);\n const flagged = record?.success === false || record?.ok === false;\n const flaggedFailure = flagged && (!passThroughPayload || failureDetail !== null);\n const errorField = stringField(record, ['error']) !== null;\n const stringError = plainStringError(result);\n\n if (!isError && !flaggedFailure && !errorField && !stringError) return null;\n\n const code =\n stringField(record, FAILURE_CODE_KEYS) ??\n stringField(humanIntervention, FAILURE_CODE_KEYS) ??\n undefined;\n const message =\n stringField(record, FAILURE_MESSAGE_KEYS) ??\n stringField(humanIntervention, FAILURE_MESSAGE_KEYS) ??\n stringError ??\n (typeof result === 'string' && !parseJsonRecord(result) ? result : null) ??\n 'Tool execution failed';\n\n return { message, code };\n}\n\n/** Classify a tool call for rendering (see the module docs for the rules). */\nexport function classifyToolResult({\n status,\n result,\n isError,\n passThroughPayload,\n}: {\n status?: ToolCallStatusLike;\n result?: unknown;\n isError?: boolean;\n /** The result is an application payload relayed verbatim (rule 3): a flag needs an error detail to count. */\n passThroughPayload?: boolean;\n}): ToolResultClassification {\n const notice = pausedNotice(result);\n if (notice) return { state: 'paused', notice };\n\n const rejection = passThroughPayload ? null : readRejectedToolResult(result);\n if (rejection) return { state: 'rejected', rejection };\n\n const failure = toolFailure({ status, result, isError, passThroughPayload });\n if (failure) return { state: 'error', failure };\n if (status?.type === 'requires-action') return { state: 'requires-action' };\n if (result === undefined && status?.type !== 'complete') {\n return { state: 'running' };\n }\n return { state: 'complete' };\n}\n\n/** True when a completed call reads as a success under the shared rules. */\nexport function isToolResultSuccess(result: unknown): boolean {\n return classifyToolResult({ status: { type: 'complete' }, result }).state === 'complete';\n}\n\n/**\n * A gated tool call the user rejected still \"completes\": both HITL runtimes\n * answer the rejected call with a `ToolMessage` whose text is the rejection\n * (\"Tool call rejected by user. Reason: …\"), and device tools may answer with\n * a structured decision (`{ status: 'rejected' }`, `{ action: 'reject' }`,\n * `{ decision: 'rejected' }`). Anything that labels a finished call has to\n * read that, or a rejected email send reports itself as sent. The read is\n * content-based, so it is scoped to where a rejection can appear: the opening\n * of a string result, never deep inside returned content, and never a\n * pass-through page payload (see {@link classifyToolResult}).\n */\nexport interface RejectedToolResult {\n /** The feedback the user typed, when they gave one. */\n reason: string | null;\n}\n\n/**\n * Phrasings the HITL runtimes use for a *human* rejection. Matching on these\n * rather than the word \"reject\" keeps deterministic failures out — argument\n * validation answers a call with \"Tool call rejected — ValidationError: …\",\n * which never involved the user and stays a plain failure.\n */\nconst USER_REJECTION_PATTERNS: readonly RegExp[] = [/rejected by (?:the )?user/i, /user rejected/i];\n\n/**\n * A rejection IS the tool message, so the phrasing opens it: \"The user rejected\n * this action. …\" (`hitl_bridge.py`), \"Tool call rejected by user. Reason: …\",\n * \"Tool 'x' execution rejected by user. …\", \"[INTERRUPT] Custom interrupt\n * '<uuid>' rejected by user. …\". Content a tool merely *returned* — a page read\n * or a document whose text happens to say a user rejected something — carries\n * the phrase deeper in, so only a match starting within this many characters\n * of the first line counts.\n */\nconst USER_REJECTION_LEAD_CHARS = 100;\n\n/** Whether `result` opens with a human-rejection phrasing (see {@link USER_REJECTION_LEAD_CHARS}). */\nfunction opensWithUserRejection(result: string): boolean {\n const firstLine = result.trimStart().split('\\n', 1)[0] ?? '';\n return USER_REJECTION_PATTERNS.some((pattern) => {\n const index = firstLine.search(pattern);\n return index !== -1 && index < USER_REJECTION_LEAD_CHARS;\n });\n}\n\n/** Reject-with-no-feedback placeholder the legacy approval editor sends. */\nconst NO_REASON = 'no reason provided';\n\n/**\n * Model-facing guidance the legacy HITL node appends on the same line after\n * the reason (\"… Reason: <reason> Acknowledge in one short sentence. Do not\n * retry…\"). It is instruction for the model, not the user's feedback.\n */\nconst TRAILING_GUIDANCE = /\\s*Acknowledge in one short sentence\\..*$/i;\n\n/**\n * How LangChain's HITL middleware answers a refused call: \"User rejected the\n * tool call for `x` with reason: <message>\", where <message> is the one the\n * deep-agent bridge (`hitl_bridge.py`) handed it.\n */\nconst MIDDLEWARE_ENVELOPE = /^User rejected the tool call for `[^`]*` with reason:\\s*/i;\n\n/**\n * The bridge's refusal, which opens its message. Inside the middleware envelope\n * it is scaffolding, not feedback; the member's own reason, when they gave one,\n * follows it as \"Reason: …\". Outside the envelope the text after \"Reason:\" is\n * the member's, whatever it says.\n */\nconst BRIDGE_REFUSAL = /^The user rejected this action\\.\\s*/i;\n\n/** Everything after \"Reason:\"; feedback typed in the approval editor can span lines. */\nconst REASON_TAIL = /Reason:\\s*([\\s\\S]+)/i;\n\nfunction readRejectionReason(result: string): string | null {\n const text = result.trim();\n const envelope = MIDDLEWARE_ENVELOPE.exec(text);\n let reason: string | undefined;\n if (envelope) {\n const message = text.slice(envelope[0].length).replace(TRAILING_GUIDANCE, '').trim();\n reason = BRIDGE_REFUSAL.test(message)\n ? message.replace(BRIDGE_REFUSAL, '').match(/^Reason:\\s*([\\s\\S]+)/i)?.[1]\n : message;\n } else {\n reason = text.match(REASON_TAIL)?.[1]?.replace(TRAILING_GUIDANCE, '');\n }\n reason = reason?.trim();\n if (!reason || reason.toLowerCase() === NO_REASON) return null;\n return reason;\n}\n\n/**\n * Read a rejection out of a completed tool call's result, or `null` when the\n * call actually ran (or failed for a non-approval reason).\n */\nexport function readRejectedToolResult(result: unknown): RejectedToolResult | null {\n if (typeof result === 'string') {\n if (!opensWithUserRejection(result)) return null;\n return { reason: readRejectionReason(result) };\n }\n if (!isRecord(result)) return null;\n if (result.status === 'rejected' || result.action === 'reject' || result.decision === 'rejected') {\n return { reason: stringField(result, ['reason']) };\n }\n return null;\n}\n\n/** True when a completed call's result records that the user rejected it. */\nexport function isRejectedToolResult(result: unknown): boolean {\n return readRejectedToolResult(result) !== null;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tool-result.js","sources":["../../../../../agent-runtime/src/tool-result.ts"],"sourcesContent":["/**\n * Tool-result classification shared by every tool card and activity timeline\n * (the React SDK fallback, Olympus, the Chrome extension, the Office add-in,\n * mobile). One rule set for \"did this call succeed?\", so a result that reads\n * as a failure on one surface cannot read as a success on another.\n *\n * The rules, in order:\n *\n * 1. An `incomplete` status is a failure; a `cancelled` reason reads as\n * \"Cancelled\".\n * 2. A string result opening with \"⏸️ Interrupted —\" is a **paused** call (the\n * runtime parked it), not a failure.\n * 2b. A result that records the user's refusal at the approval gate (see\n * {@link readRejectedToolResult}) is a **rejected** call — neither a success\n * nor a failure. It is read before the failure rules because the HITL\n * runtime answers a refused call with an error-status tool message whose\n * content is the refusal, which would otherwise read as a plain failure.\n * Never applied to a pass-through payload: page JavaScript relays whatever\n * the page returned, and a `{ status: \"rejected\" }` from a fetched API is\n * the page's business, not a human decision.\n * 3. A result record whose `success` or `ok` is `false` is a failure, with\n * the best message available (`error`, `message`, `reason`, or a\n * `data.humanIntervention` detail). Athena tools report failures this way\n * — the sheet tools answer `{ success: false, message: \"…\" }` — so a bare\n * flag must read as a failure. The one exception is a **pass-through\n * payload** (`passThroughPayload: true`): page JavaScript relays whatever\n * the page returned, and `{ success: false, message: \"Payment required\" }`\n * from a fetched API is the page's business, not the tool failing, so there\n * the flag counts only alongside an error detail (`error`, `errorCode`,\n * `error_code`, or a `humanIntervention` message / reason / code). The\n * Chrome extension opts its `chrome_javascript` tool in; everything else\n * takes the default.\n * 4. A result record with a non-empty `error` string is a failure regardless\n * of flags — every Athena tool contract uses that field only on failure.\n * 5. A plain-string result opening with an explicit error prefix (`Error:`,\n * `Tool execution failed`, `Failed to route tool call`) is a failure —\n * device-tunnel failures arrive in successful ToolMessages, so the prefix\n * is the authoritative signal there. A bare leading \"Error\" word is not\n * (an \"Error handling guide\" is content). A batch report that stopped at a\n * step reads its header and failing step.\n * 6. assistant-ui's own `isError` flag is a failure with the best message\n * available.\n * 7. `requires-action` and a result-less non-complete status read as such;\n * everything else is a success.\n */\n\n/** The status shape a tool-call message part carries (structurally typed so this module stays UI-library-free). */\nexport interface ToolCallStatusLike {\n type: 'running' | 'complete' | 'incomplete' | 'requires-action';\n reason?: string;\n error?: unknown;\n}\n\nexport interface ToolFailure {\n message: string;\n code?: string;\n}\n\nexport type ToolResultClassification =\n | { state: 'running' }\n | { state: 'complete' }\n | { state: 'requires-action' }\n | { state: 'paused'; notice: string }\n | { state: 'rejected'; rejection: RejectedToolResult }\n | { state: 'error'; failure: ToolFailure };\n\nexport type ToolResultState = ToolResultClassification['state'];\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Parse a JSON string into a record, or `null` when it is not one. */\nexport function parseJsonRecord(value: string): Record<string, unknown> | null {\n try {\n const parsed: unknown = JSON.parse(value);\n return isRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\n/** The result as a record: parsed when it arrived as a JSON string. */\nexport function resultRecord(result: unknown): Record<string, unknown> | null {\n if (typeof result === 'string') return parseJsonRecord(result);\n return isRecord(result) ? result : null;\n}\n\n/** The first non-blank string among `keys` on `record`, or `null`. */\nexport function stringField(\n record: Record<string, unknown> | null | undefined,\n keys: readonly string[],\n): string | null {\n if (!record) return null;\n for (const key of keys) {\n const value = record[key];\n if (typeof value === 'string' && value.trim()) return value;\n }\n return null;\n}\n\n/** The `message` a result carries, when it does (the row's completion summary). */\nexport function resultMessage(result: unknown): string | null {\n return stringField(resultRecord(result), ['message']);\n}\n\nconst FAILURE_DETAIL_KEYS = ['error', 'errorCode', 'error_code'] as const;\nconst INTERVENTION_DETAIL_KEYS = ['message', 'reason', 'errorCode', 'error_code'] as const;\nconst FAILURE_CODE_KEYS = ['errorCode', 'error_code', 'code'] as const;\nconst FAILURE_MESSAGE_KEYS = ['error', 'message', 'reason'] as const;\n\nfunction batchReportFailure(trimmed: string): string | null {\n const lines = trimmed.split('\\n');\n const header = lines[0]?.trim() ?? '';\n if (!/^[\\w.-]*batch: \\d+\\/\\d+ ok — STOPPED at step \\d+/.test(header)) {\n return null;\n }\n const stepError = lines\n .map((line) => line.trim())\n .find(\n (line) =>\n /^\\d+\\.\\s/.test(line) && (line.includes(' ERROR — ') || line.endsWith(' ERROR')),\n );\n return stepError ? `${header}\\n${stepError}` : header;\n}\n\nconst STRING_ERROR_PREFIX = /^(?:Error:|Tool execution failed\\b|Failed to route tool call\\b)\\s*/;\n\nfunction plainStringError(result: unknown): string | null {\n if (typeof result !== 'string') return null;\n const trimmed = result.trim();\n if (!trimmed || parseJsonRecord(trimmed)) return null;\n if (STRING_ERROR_PREFIX.test(trimmed)) {\n return trimmed.replace(STRING_ERROR_PREFIX, '').trim() || trimmed;\n }\n return batchReportFailure(trimmed);\n}\n\nfunction pausedNotice(result: unknown): string | null {\n if (typeof result !== 'string') return null;\n const trimmed = result.trim();\n return /^⏸️?\\s*Interrupted —/.test(trimmed) ? trimmed : null;\n}\n\nfunction stringifyUnknown(value: unknown): string | null {\n if (value == null) return null;\n if (typeof value === 'string') return value;\n if (value instanceof Error) return value.message;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\n/** The failure a tool call reports, or `null` when it succeeded (rules 1, 3-6). */\nexport function toolFailure({\n status,\n result,\n isError,\n passThroughPayload = false,\n}: {\n status?: ToolCallStatusLike;\n result?: unknown;\n isError?: boolean;\n /** The result is an application payload relayed verbatim (rule 3): a flag needs an error detail to count. */\n passThroughPayload?: boolean;\n}): ToolFailure | null {\n if (status?.type === 'incomplete') {\n const errorText = stringifyUnknown(status.error);\n return {\n message:\n errorText ??\n (status.reason === 'cancelled' ? 'Cancelled' : `Tool stopped: ${status.reason}`),\n };\n }\n\n const record = resultRecord(result);\n const data = isRecord(record?.data) ? record.data : null;\n const humanIntervention = isRecord(data?.humanIntervention) ? data.humanIntervention : null;\n const failureDetail =\n stringField(record, FAILURE_DETAIL_KEYS) ??\n stringField(humanIntervention, INTERVENTION_DETAIL_KEYS);\n const flagged = record?.success === false || record?.ok === false;\n const flaggedFailure = flagged && (!passThroughPayload || failureDetail !== null);\n const errorField = stringField(record, ['error']) !== null;\n const stringError = plainStringError(result);\n\n if (!isError && !flaggedFailure && !errorField && !stringError) return null;\n\n const code =\n stringField(record, FAILURE_CODE_KEYS) ??\n stringField(humanIntervention, FAILURE_CODE_KEYS) ??\n undefined;\n const message =\n stringField(record, FAILURE_MESSAGE_KEYS) ??\n stringField(humanIntervention, FAILURE_MESSAGE_KEYS) ??\n stringError ??\n (typeof result === 'string' && !parseJsonRecord(result) ? result : null) ??\n 'Tool execution failed';\n\n return { message, code };\n}\n\n/** Classify a tool call for rendering (see the module docs for the rules). */\nexport function classifyToolResult({\n status,\n result,\n isError,\n passThroughPayload,\n}: {\n status?: ToolCallStatusLike;\n result?: unknown;\n isError?: boolean;\n /** The result is an application payload relayed verbatim (rule 3): a flag needs an error detail to count. */\n passThroughPayload?: boolean;\n}): ToolResultClassification {\n const notice = pausedNotice(result);\n if (notice) return { state: 'paused', notice };\n\n const rejection = passThroughPayload ? null : readRejectedToolResult(result);\n if (rejection) return { state: 'rejected', rejection };\n\n const failure = toolFailure({ status, result, isError, passThroughPayload });\n if (failure) return { state: 'error', failure };\n if (status?.type === 'requires-action') return { state: 'requires-action' };\n if (result === undefined && status?.type !== 'complete') {\n return { state: 'running' };\n }\n return { state: 'complete' };\n}\n\n/** True when a completed call reads as a success under the shared rules. */\nexport function isToolResultSuccess(result: unknown): boolean {\n return classifyToolResult({ status: { type: 'complete' }, result }).state === 'complete';\n}\n\n/**\n * A gated tool call the user rejected still \"completes\": both HITL runtimes\n * answer the rejected call with a `ToolMessage` whose text is the rejection\n * (\"Tool call rejected by user. Reason: …\"), and device tools may answer with\n * a structured decision (`{ status: 'rejected' }`, `{ action: 'reject' }`,\n * `{ decision: 'rejected' }`). Anything that labels a finished call has to\n * read that, or a rejected email send reports itself as sent. The read is\n * content-based, so it is scoped to where a rejection can appear: the opening\n * of a string result, never deep inside returned content, and never a\n * pass-through page payload (see {@link classifyToolResult}).\n */\nexport interface RejectedToolResult {\n /** The feedback the user typed, when they gave one. */\n reason: string | null;\n}\n\n/**\n * Phrasings the HITL runtimes use for a *human* rejection. Matching on these\n * rather than the word \"reject\" keeps deterministic failures out — argument\n * validation answers a call with \"Tool call rejected — ValidationError: …\",\n * which never involved the user and stays a plain failure.\n */\nconst USER_REJECTION_PATTERNS: readonly RegExp[] = [/rejected by (?:the )?user/i, /user rejected/i];\n\n/**\n * A rejection IS the tool message, so the phrasing opens it: \"The user rejected\n * this action. …\" (`hitl_bridge.py`), \"Tool call rejected by user. Reason: …\",\n * \"Tool 'x' execution rejected by user. …\", \"[INTERRUPT] Custom interrupt\n * '<uuid>' rejected by user. …\". Content a tool merely *returned* — a page read\n * or a document whose text happens to say a user rejected something — carries\n * the phrase deeper in, so only a match starting within this many characters\n * of the first line counts.\n */\nconst USER_REJECTION_LEAD_CHARS = 100;\n\n/** Whether `result` opens with a human-rejection phrasing (see {@link USER_REJECTION_LEAD_CHARS}). */\nfunction opensWithUserRejection(result: string): boolean {\n const firstLine = result.trimStart().split('\\n', 1)[0] ?? '';\n return USER_REJECTION_PATTERNS.some((pattern) => {\n const index = firstLine.search(pattern);\n return index !== -1 && index < USER_REJECTION_LEAD_CHARS;\n });\n}\n\n/** Reject-with-no-feedback placeholder the legacy approval editor sends. */\nconst NO_REASON = 'no reason provided';\n\n/**\n * Model-facing guidance the legacy HITL node appends on the same line after\n * the reason (\"… Reason: <reason> Acknowledge in one short sentence. Do not\n * retry…\"). It is instruction for the model, not the user's feedback.\n */\nconst TRAILING_GUIDANCE = /\\s*Acknowledge in one short sentence\\..*$/i;\n\n/**\n * How LangChain's HITL middleware answers a refused call: \"User rejected the\n * tool call for `x` with reason: <message>\", where <message> is the one the\n * deep-agent bridge (`hitl_bridge.py`) handed it.\n */\nconst MIDDLEWARE_ENVELOPE = /^User rejected the tool call for `[^`]*` with reason:\\s*/i;\n\n/**\n * The bridge's refusal, which opens its message. Inside the middleware envelope\n * it is scaffolding, not feedback; the member's own reason, when they gave one,\n * follows it as \"Reason: …\". Outside the envelope the text after \"Reason:\" is\n * the member's, whatever it says.\n */\nconst BRIDGE_REFUSAL = /^The user rejected this action\\.\\s*/i;\n\n/** Everything after \"Reason:\"; feedback typed in the approval editor can span lines. */\nconst REASON_TAIL = /Reason:\\s*([\\s\\S]+)/i;\n\nfunction readRejectionReason(result: string): string | null {\n const text = result.trim();\n const envelope = MIDDLEWARE_ENVELOPE.exec(text);\n let reason: string | undefined;\n if (envelope) {\n const message = text.slice(envelope[0].length).replace(TRAILING_GUIDANCE, '').trim();\n reason = BRIDGE_REFUSAL.test(message)\n ? message.replace(BRIDGE_REFUSAL, '').match(/^Reason:\\s*([\\s\\S]+)/i)?.[1]\n : message;\n } else {\n reason = text.match(REASON_TAIL)?.[1]?.replace(TRAILING_GUIDANCE, '');\n }\n reason = reason?.trim();\n if (!reason || reason.toLowerCase() === NO_REASON) return null;\n return reason;\n}\n\n/**\n * Read a rejection out of a completed tool call's result, or `null` when the\n * call actually ran (or failed for a non-approval reason).\n */\nexport function readRejectedToolResult(result: unknown): RejectedToolResult | null {\n if (typeof result === 'string') {\n if (!opensWithUserRejection(result)) return null;\n return { reason: readRejectionReason(result) };\n }\n if (!isRecord(result)) return null;\n if (result.status === 'rejected' || result.action === 'reject' || result.decision === 'rejected') {\n return { reason: stringField(result, ['reason']) };\n }\n return null;\n}\n\n/** True when a completed call's result records that the user rejected it. */\nexport function isRejectedToolResult(result: unknown): boolean {\n return readRejectedToolResult(result) !== null;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-conversation-list.cjs","sources":["../../../../../agent-runtime/src/use-conversation-list.ts"],"sourcesContent":["import {\n type InfiniteData,\n useInfiniteQuery,\n useQuery,\n useQueryClient,\n} from '@tanstack/react-query';\nimport { useCallback, useMemo, useRef } from 'react';\nimport {\n CONVERSATION_LIST_DEFAULT_SCOPE_KEY,\n type ConversationListFetcher,\n type ConversationListFilter,\n type ConversationListPage,\n type ConversationSummary,\n conversationListFilterKey,\n conversationListQueryKeys,\n invalidateConversationListCaches,\n mergeConversationPages,\n normalizeConversationListFilter,\n patchConversationsInPage,\n prependConversationToPage,\n removeConversationFromPage,\n} from './conversation-list';\n\nconst DEFAULT_PAGE_SIZE = 20;\nconst DEFAULT_STALE_TIME_MS = 30_000;\nconst DEFAULT_GC_TIME_MS = 10 * 60 * 1000;\n\nexport interface UseConversationListOptions {\n /**\n * Transport adapter for one page (GraphQL `listConversations`, the REST\n * thread list, …). Captured in a ref — identity changes do not re-key the\n * cache, so pair a changing fetcher with a changing `scopeKey`.\n */\n fetchPage: ConversationListFetcher;\n filter?: ConversationListFilter;\n pageSize?: number;\n /**\n * Cache identity beyond the filter. MUST include everything that changes\n * whose list this is — principal/user id, backend base URL — so a\n * credential swap can never serve another identity's rows from the cache.\n */\n scopeKey?: string;\n enabled?: boolean;\n staleTime?: number;\n gcTime?: number;\n refetchOnMount?: boolean | 'always';\n refetchOnWindowFocus?: boolean;\n /**\n * Newest-page freshness is push-based by default (the conversation-index\n * statewire invalidates these caches), so no timer runs unless asked.\n */\n refetchInterval?: number | false;\n retry?: boolean | number | ((failureCount: number, error: Error) => boolean);\n}\n\nexport interface ConversationListController {\n /** Merged newest-first rows: live first page + retained history pages. */\n conversations: ConversationSummary[];\n /** Advisory total from the live first page, when the transport counts. */\n totalCount: number | null;\n isLoading: boolean;\n isFetching: boolean;\n /** True once the live first page has resolved at least once. */\n hasResolvedFirstPage: boolean;\n hasNextPage: boolean;\n isFetchingNextPage: boolean;\n /** True while the last next-page request failed (cleared by a successful one). */\n isFetchNextPageError: boolean;\n fetchNextPage: () => Promise<unknown>;\n /** Refetch the live first page (history pages stay frozen). */\n refresh: () => Promise<unknown>;\n /** Invalidate every conversation-list cache in this scope (all filters). */\n invalidate: () => Promise<void>;\n /** Optimistically show a new conversation at the top of THIS filter view. */\n prependConversation: (item: ConversationSummary) => void;\n /** Optimistically drop a conversation from THIS filter view. */\n removeConversation: (threadId: string) => void;\n /** Optimistically patch a conversation's row in THIS filter view. */\n patchConversation: (threadId: string, patch: Partial<ConversationSummary>) => void;\n}\n\n/**\n * The shared headless conversation-list pager (chat-stack unification —\n * thread-list-contract-convergence).\n *\n * Implements, once, the two-tier TanStack Query pattern Olympus and mobile\n * each hand-rolled:\n *\n * - a LIVE first-page query — the only observer that refetches on\n * invalidation/focus, so push-driven freshness costs one page, and\n * - a permanently-disabled infinite \"history\" query whose pages are fetched\n * only by explicit `fetchNextPage()` calls and retained without replay\n * (invalidation/polling never refetches every loaded page).\n *\n * Rows merge newest-first with the live page winning duplicate threads.\n */\nexport function useConversationList(options: UseConversationListOptions): ConversationListController {\n const {\n filter,\n pageSize = DEFAULT_PAGE_SIZE,\n scopeKey = CONVERSATION_LIST_DEFAULT_SCOPE_KEY,\n enabled,\n staleTime = DEFAULT_STALE_TIME_MS,\n gcTime = DEFAULT_GC_TIME_MS,\n refetchOnMount,\n refetchOnWindowFocus,\n refetchInterval = false,\n retry,\n } = options;\n const queryClient = useQueryClient();\n\n const fetchPageRef = useRef(options.fetchPage);\n fetchPageRef.current = options.fetchPage;\n\n // The normalized filter is both the cache identity (via the key) and what\n // queryFn closures fetch, so a cache entry holds exactly what it claims —\n // fresh-but-equal filter objects from the caller never re-key or refetch.\n // (Plain per-render values: only the serialized key participates in\n // identity, so object freshness here is irrelevant.)\n const normalizedFilter = normalizeConversationListFilter(filter ?? {});\n const filterKey = conversationListFilterKey(normalizedFilter);\n\n const firstPageKey = useMemo(\n () => conversationListQueryKeys.firstPage(scopeKey, filterKey, pageSize),\n [scopeKey, filterKey, pageSize]\n );\n const historyKey = useMemo(\n () => conversationListQueryKeys.history(scopeKey, filterKey, pageSize),\n [scopeKey, filterKey, pageSize]\n );\n\n // React Query merges per-query options OVER the client's defaultOptions with\n // Object.assign, which copies explicitly-`undefined` keys — so passing\n // `refetchOnWindowFocus: undefined` CLOBBERS a consumer's\n // `refetchOnWindowFocus: false` default and silently re-enables focus\n // refetching. Options the caller did not set must therefore be omitted, not\n // forwarded as undefined, so they fall through to the consuming app's client.\n const passthrough = {\n ...(enabled !== undefined ? { enabled } : {}),\n ...(refetchOnMount !== undefined ? { refetchOnMount } : {}),\n ...(refetchOnWindowFocus !== undefined ? { refetchOnWindowFocus } : {}),\n ...(retry !== undefined ? { retry } : {}),\n };\n\n const firstPage = useQuery({\n queryKey: firstPageKey,\n queryFn: ({ signal }) =>\n fetchPageRef.current({ limit: pageSize, offset: 0, filter: normalizedFilter, signal }),\n staleTime,\n gcTime,\n refetchInterval,\n ...passthrough,\n });\n\n const history = useInfiniteQuery({\n queryKey: historyKey,\n initialPageParam: pageSize,\n gcTime,\n queryFn: ({ pageParam, signal }) =>\n fetchPageRef.current({ limit: pageSize, offset: pageParam, filter: normalizedFilter, signal }),\n getNextPageParam: (lastPage, _allPages, lastOffset) =>\n lastPage.hasMore ? lastOffset + pageSize : undefined,\n ...passthrough,\n // fetchNextPage/refetch still perform explicit fetches for disabled\n // queries. Keeping this observer disabled prevents focus, invalidation,\n // and polling from replaying every retained historical page. This must\n // win over `passthrough.enabled`, so it is spread last.\n enabled: false,\n });\n\n const historyPages = history.data?.pages;\n const hasLoadedHistory = (historyPages?.length ?? 0) > 0;\n\n const conversations = useMemo(\n () =>\n mergeConversationPages([\n ...(firstPage.data ? [firstPage.data] : []),\n ...(historyPages ?? []),\n ]),\n [firstPage.data, historyPages]\n );\n\n const fetchNextHistoryPage = history.fetchNextPage;\n const refetchHistoryFirstPage = history.refetch;\n const fetchNextPage = useCallback(\n () => (hasLoadedHistory ? fetchNextHistoryPage() : refetchHistoryFirstPage()),\n [hasLoadedHistory, fetchNextHistoryPage, refetchHistoryFirstPage]\n );\n\n const refresh = useCallback(() => firstPage.refetch(), [firstPage.refetch]);\n\n const invalidate = useCallback(\n () => invalidateConversationListCaches(queryClient, { scopeKey }),\n [queryClient, scopeKey]\n );\n\n const prependConversation = useCallback(\n (item: ConversationSummary) => {\n queryClient.setQueryData<ConversationListPage>(firstPageKey, (page) =>\n page ? prependConversationToPage(page, item) : page\n );\n },\n [queryClient, firstPageKey]\n );\n\n const removeConversation = useCallback(\n (threadId: string) => {\n queryClient.setQueryData<ConversationListPage>(firstPageKey, (page) =>\n page ? removeConversationFromPage(page, threadId) : page\n );\n queryClient.setQueryData<InfiniteData<ConversationListPage, number>>(historyKey, (data) =>\n data\n ? { ...data, pages: data.pages.map((page) => removeConversationFromPage(page, threadId)) }\n : data\n );\n },\n [queryClient, firstPageKey, historyKey]\n );\n\n const patchConversation = useCallback(\n (threadId: string, patch: Partial<ConversationSummary>) => {\n const match = (item: ConversationSummary) => item.threadId === threadId;\n queryClient.setQueryData<ConversationListPage>(firstPageKey, (page) =>\n page ? patchConversationsInPage(page, match, patch) : page\n );\n queryClient.setQueryData<InfiniteData<ConversationListPage, number>>(historyKey, (data) =>\n data\n ? {\n ...data,\n pages: data.pages.map((page) => patchConversationsInPage(page, match, patch)),\n }\n : data\n );\n },\n [queryClient, firstPageKey, historyKey]\n );\n\n return {\n conversations,\n totalCount: firstPage.data?.totalCount ?? null,\n isLoading: firstPage.isLoading,\n isFetching: firstPage.isFetching || history.isFetching,\n hasResolvedFirstPage: firstPage.data !== undefined,\n hasNextPage: hasLoadedHistory\n ? (history.hasNextPage ?? false)\n : (firstPage.data?.hasMore ?? false),\n isFetchingNextPage: history.isFetchingNextPage || (!hasLoadedHistory && history.isFetching),\n isFetchNextPageError: history.isError,\n fetchNextPage,\n refresh,\n invalidate,\n prependConversation,\n removeConversation,\n patchConversation,\n };\n}\n"],"names":["CONVERSATION_LIST_DEFAULT_SCOPE_KEY","useQueryClient","useRef","normalizeConversationListFilter","conversationListFilterKey","useMemo","conversationListQueryKeys","useQuery","useInfiniteQuery","mergeConversationPages","useCallback","invalidateConversationListCaches","prependConversationToPage","removeConversationFromPage","patchConversationsInPage"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-conversation-list.js","sources":["../../../../../agent-runtime/src/use-conversation-list.ts"],"sourcesContent":["import {\n type InfiniteData,\n useInfiniteQuery,\n useQuery,\n useQueryClient,\n} from '@tanstack/react-query';\nimport { useCallback, useMemo, useRef } from 'react';\nimport {\n CONVERSATION_LIST_DEFAULT_SCOPE_KEY,\n type ConversationListFetcher,\n type ConversationListFilter,\n type ConversationListPage,\n type ConversationSummary,\n conversationListFilterKey,\n conversationListQueryKeys,\n invalidateConversationListCaches,\n mergeConversationPages,\n normalizeConversationListFilter,\n patchConversationsInPage,\n prependConversationToPage,\n removeConversationFromPage,\n} from './conversation-list';\n\nconst DEFAULT_PAGE_SIZE = 20;\nconst DEFAULT_STALE_TIME_MS = 30_000;\nconst DEFAULT_GC_TIME_MS = 10 * 60 * 1000;\n\nexport interface UseConversationListOptions {\n /**\n * Transport adapter for one page (GraphQL `listConversations`, the REST\n * thread list, …). Captured in a ref — identity changes do not re-key the\n * cache, so pair a changing fetcher with a changing `scopeKey`.\n */\n fetchPage: ConversationListFetcher;\n filter?: ConversationListFilter;\n pageSize?: number;\n /**\n * Cache identity beyond the filter. MUST include everything that changes\n * whose list this is — principal/user id, backend base URL — so a\n * credential swap can never serve another identity's rows from the cache.\n */\n scopeKey?: string;\n enabled?: boolean;\n staleTime?: number;\n gcTime?: number;\n refetchOnMount?: boolean | 'always';\n refetchOnWindowFocus?: boolean;\n /**\n * Newest-page freshness is push-based by default (the conversation-index\n * statewire invalidates these caches), so no timer runs unless asked.\n */\n refetchInterval?: number | false;\n retry?: boolean | number | ((failureCount: number, error: Error) => boolean);\n}\n\nexport interface ConversationListController {\n /** Merged newest-first rows: live first page + retained history pages. */\n conversations: ConversationSummary[];\n /** Advisory total from the live first page, when the transport counts. */\n totalCount: number | null;\n isLoading: boolean;\n isFetching: boolean;\n /** True once the live first page has resolved at least once. */\n hasResolvedFirstPage: boolean;\n hasNextPage: boolean;\n isFetchingNextPage: boolean;\n /** True while the last next-page request failed (cleared by a successful one). */\n isFetchNextPageError: boolean;\n fetchNextPage: () => Promise<unknown>;\n /** Refetch the live first page (history pages stay frozen). */\n refresh: () => Promise<unknown>;\n /** Invalidate every conversation-list cache in this scope (all filters). */\n invalidate: () => Promise<void>;\n /** Optimistically show a new conversation at the top of THIS filter view. */\n prependConversation: (item: ConversationSummary) => void;\n /** Optimistically drop a conversation from THIS filter view. */\n removeConversation: (threadId: string) => void;\n /** Optimistically patch a conversation's row in THIS filter view. */\n patchConversation: (threadId: string, patch: Partial<ConversationSummary>) => void;\n}\n\n/**\n * The shared headless conversation-list pager (chat-stack unification —\n * thread-list-contract-convergence).\n *\n * Implements, once, the two-tier TanStack Query pattern Olympus and mobile\n * each hand-rolled:\n *\n * - a LIVE first-page query — the only observer that refetches on\n * invalidation/focus, so push-driven freshness costs one page, and\n * - a permanently-disabled infinite \"history\" query whose pages are fetched\n * only by explicit `fetchNextPage()` calls and retained without replay\n * (invalidation/polling never refetches every loaded page).\n *\n * Rows merge newest-first with the live page winning duplicate threads.\n */\nexport function useConversationList(options: UseConversationListOptions): ConversationListController {\n const {\n filter,\n pageSize = DEFAULT_PAGE_SIZE,\n scopeKey = CONVERSATION_LIST_DEFAULT_SCOPE_KEY,\n enabled,\n staleTime = DEFAULT_STALE_TIME_MS,\n gcTime = DEFAULT_GC_TIME_MS,\n refetchOnMount,\n refetchOnWindowFocus,\n refetchInterval = false,\n retry,\n } = options;\n const queryClient = useQueryClient();\n\n const fetchPageRef = useRef(options.fetchPage);\n fetchPageRef.current = options.fetchPage;\n\n // The normalized filter is both the cache identity (via the key) and what\n // queryFn closures fetch, so a cache entry holds exactly what it claims —\n // fresh-but-equal filter objects from the caller never re-key or refetch.\n // (Plain per-render values: only the serialized key participates in\n // identity, so object freshness here is irrelevant.)\n const normalizedFilter = normalizeConversationListFilter(filter ?? {});\n const filterKey = conversationListFilterKey(normalizedFilter);\n\n const firstPageKey = useMemo(\n () => conversationListQueryKeys.firstPage(scopeKey, filterKey, pageSize),\n [scopeKey, filterKey, pageSize]\n );\n const historyKey = useMemo(\n () => conversationListQueryKeys.history(scopeKey, filterKey, pageSize),\n [scopeKey, filterKey, pageSize]\n );\n\n // React Query merges per-query options OVER the client's defaultOptions with\n // Object.assign, which copies explicitly-`undefined` keys — so passing\n // `refetchOnWindowFocus: undefined` CLOBBERS a consumer's\n // `refetchOnWindowFocus: false` default and silently re-enables focus\n // refetching. Options the caller did not set must therefore be omitted, not\n // forwarded as undefined, so they fall through to the consuming app's client.\n const passthrough = {\n ...(enabled !== undefined ? { enabled } : {}),\n ...(refetchOnMount !== undefined ? { refetchOnMount } : {}),\n ...(refetchOnWindowFocus !== undefined ? { refetchOnWindowFocus } : {}),\n ...(retry !== undefined ? { retry } : {}),\n };\n\n const firstPage = useQuery({\n queryKey: firstPageKey,\n queryFn: ({ signal }) =>\n fetchPageRef.current({ limit: pageSize, offset: 0, filter: normalizedFilter, signal }),\n staleTime,\n gcTime,\n refetchInterval,\n ...passthrough,\n });\n\n const history = useInfiniteQuery({\n queryKey: historyKey,\n initialPageParam: pageSize,\n gcTime,\n queryFn: ({ pageParam, signal }) =>\n fetchPageRef.current({ limit: pageSize, offset: pageParam, filter: normalizedFilter, signal }),\n getNextPageParam: (lastPage, _allPages, lastOffset) =>\n lastPage.hasMore ? lastOffset + pageSize : undefined,\n ...passthrough,\n // fetchNextPage/refetch still perform explicit fetches for disabled\n // queries. Keeping this observer disabled prevents focus, invalidation,\n // and polling from replaying every retained historical page. This must\n // win over `passthrough.enabled`, so it is spread last.\n enabled: false,\n });\n\n const historyPages = history.data?.pages;\n const hasLoadedHistory = (historyPages?.length ?? 0) > 0;\n\n const conversations = useMemo(\n () =>\n mergeConversationPages([\n ...(firstPage.data ? [firstPage.data] : []),\n ...(historyPages ?? []),\n ]),\n [firstPage.data, historyPages]\n );\n\n const fetchNextHistoryPage = history.fetchNextPage;\n const refetchHistoryFirstPage = history.refetch;\n const fetchNextPage = useCallback(\n () => (hasLoadedHistory ? fetchNextHistoryPage() : refetchHistoryFirstPage()),\n [hasLoadedHistory, fetchNextHistoryPage, refetchHistoryFirstPage]\n );\n\n const refresh = useCallback(() => firstPage.refetch(), [firstPage.refetch]);\n\n const invalidate = useCallback(\n () => invalidateConversationListCaches(queryClient, { scopeKey }),\n [queryClient, scopeKey]\n );\n\n const prependConversation = useCallback(\n (item: ConversationSummary) => {\n queryClient.setQueryData<ConversationListPage>(firstPageKey, (page) =>\n page ? prependConversationToPage(page, item) : page\n );\n },\n [queryClient, firstPageKey]\n );\n\n const removeConversation = useCallback(\n (threadId: string) => {\n queryClient.setQueryData<ConversationListPage>(firstPageKey, (page) =>\n page ? removeConversationFromPage(page, threadId) : page\n );\n queryClient.setQueryData<InfiniteData<ConversationListPage, number>>(historyKey, (data) =>\n data\n ? { ...data, pages: data.pages.map((page) => removeConversationFromPage(page, threadId)) }\n : data\n );\n },\n [queryClient, firstPageKey, historyKey]\n );\n\n const patchConversation = useCallback(\n (threadId: string, patch: Partial<ConversationSummary>) => {\n const match = (item: ConversationSummary) => item.threadId === threadId;\n queryClient.setQueryData<ConversationListPage>(firstPageKey, (page) =>\n page ? patchConversationsInPage(page, match, patch) : page\n );\n queryClient.setQueryData<InfiniteData<ConversationListPage, number>>(historyKey, (data) =>\n data\n ? {\n ...data,\n pages: data.pages.map((page) => patchConversationsInPage(page, match, patch)),\n }\n : data\n );\n },\n [queryClient, firstPageKey, historyKey]\n );\n\n return {\n conversations,\n totalCount: firstPage.data?.totalCount ?? null,\n isLoading: firstPage.isLoading,\n isFetching: firstPage.isFetching || history.isFetching,\n hasResolvedFirstPage: firstPage.data !== undefined,\n hasNextPage: hasLoadedHistory\n ? (history.hasNextPage ?? false)\n : (firstPage.data?.hasMore ?? false),\n isFetchingNextPage: history.isFetchingNextPage || (!hasLoadedHistory && history.isFetching),\n isFetchNextPageError: history.isError,\n fetchNextPage,\n refresh,\n invalidate,\n prependConversation,\n removeConversation,\n patchConversation,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
require("@assistant-ui/react-statewire");
|
|
4
|
-
require("react");
|
|
5
|
-
const errors = require("./errors.cjs");
|
|
6
|
-
function isConfigSyncUnavailableRejection(error) {
|
|
7
|
-
const payload = errors.statewireRejectionPayload(error);
|
|
8
|
-
if ((payload == null ? void 0 : payload.status) !== 400) return false;
|
|
9
|
-
const detail = payload.detail;
|
|
10
|
-
return (detail == null ? void 0 : detail.code) === "config_sync_unavailable";
|
|
11
|
-
}
|
|
12
|
-
exports.isConfigSyncUnavailableRejection = isConfigSyncUnavailableRejection;
|
|
13
|
-
//# sourceMappingURL=use-deep-agent-config.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-deep-agent-config.cjs","sources":["../../../../../agent-runtime/src/use-deep-agent-config.ts"],"sourcesContent":["import { useStatewireSendCommand, useStatewireState } from '@assistant-ui/react-statewire';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n applyConfigPatch,\n applyToolsDisable,\n applyToolsEnable,\n type ThreadConfigCustom,\n type ThreadConfigPatch,\n} from './config-mutations';\nimport { statewireRejectionPayload } from './errors';\nimport { DEEP_AGENT_CONFIG_COMMANDS } from './generated/runconfig-contract';\n\ndeclare module '@assistant-ui/core' {\n namespace Assistant {\n interface Commands {\n /** Set / unset top-level keys of the thread's server config (`null` unsets). */\n configPatch: {\n type: typeof DEEP_AGENT_CONFIG_COMMANDS.patch;\n patch: Record<string, unknown>;\n };\n /** Append ids to the thread's `enabled_tools`. */\n configToolsEnable: {\n type: typeof DEEP_AGENT_CONFIG_COMMANDS.toolsEnable;\n toolIds: string[];\n };\n /** Remove ids from the thread's `enabled_tools`. */\n configToolsDisable: {\n type: typeof DEEP_AGENT_CONFIG_COMMANDS.toolsDisable;\n toolIds: string[];\n };\n }\n }\n}\n\n/**\n * The replicated `state.config` lane of a thread with server-authoritative\n * run config. Absent — and `readServerConfig` returns `null` — while the\n * thread has never been configured (version 0: a brand-new thread, or one\n * created by a client predating the lane).\n */\nexport interface DeepAgentServerConfig {\n /** Monotonic server-incremented version; always >= 1 when the lane exists. */\n version: number;\n /** The thread-config keys every run on this thread uses as its base. */\n custom: ThreadConfigCustom;\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\n/**\n * Read the server-config lane off a raw statewire state.\n *\n * Identity-preserving (returns the raw `state.config` reference), so it is\n * safe as a `useStatewireState` selector: the reference only changes when the\n * server writes the lane.\n */\nexport function readServerConfig(state: unknown): DeepAgentServerConfig | null {\n const config = (state as { config?: unknown } | null | undefined)?.config;\n if (!isRecord(config)) return null;\n const version = config.version;\n if (typeof version !== 'number' || !Number.isInteger(version) || version <= 0) return null;\n if (!isRecord(config.custom)) return null;\n return config as unknown as DeepAgentServerConfig;\n}\n\n/** The thread's server config version: 0 while the thread has never been configured. */\nexport function readConfigVersion(state: unknown): number {\n return readServerConfig(state)?.version ?? 0;\n}\n\n/**\n * The 403 rejection codes a view-only collaborator's `config/*` write can\n * come back with: `config_write_forbidden` from the config host's own gate,\n * or `thread_write_forbidden` from the host-wide mutation gate that runs\n * ahead of it and refuses every thread-mutating command on a view grant.\n */\nconst CONFIG_WRITE_FORBIDDEN_CODES: ReadonlySet<string> = new Set([\n 'config_write_forbidden',\n 'thread_write_forbidden',\n]);\n\n/**\n * Whether a rejected `config/*` command was refused because the submitter\n * only has view access to the session. The write is not retriable by that\n * user; hosts disable their config controls.\n */\nexport function isConfigWriteForbiddenRejection(error: unknown): boolean {\n const payload = statewireRejectionPayload(error);\n if (payload?.status !== 403) return false;\n const detail = payload.detail as { code?: unknown } | undefined;\n return typeof detail?.code === 'string' && CONFIG_WRITE_FORBIDDEN_CODES.has(detail.code);\n}\n\n/**\n * Whether a rejected `config/*` command was refused because the thread's\n * workspace cannot hold server config at all (`config_sync_unavailable`, a\n * regionally-pinned workspace). No write will ever succeed on the thread;\n * hosts stop issuing them and send their full config per run instead.\n */\nexport function isConfigSyncUnavailableRejection(error: unknown): boolean {\n const payload = statewireRejectionPayload(error);\n if (payload?.status !== 400) return false;\n const detail = payload.detail as { code?: unknown } | undefined;\n return detail?.code === 'config_sync_unavailable';\n}\n\n/** The settled result of a `config/*` command: the new server config. */\nexport interface DeepAgentConfigWriteResult {\n version: number;\n custom: ThreadConfigCustom;\n}\n\n/** An observed server-config version, delivered to the host callback. */\nexport interface DeepAgentServerConfigEvent {\n version: number;\n /** The server config with this client's still-pending writes folded over. */\n custom: ThreadConfigCustom;\n}\n\ninterface PendingOp {\n id: number;\n apply: (custom: ThreadConfigCustom) => ThreadConfigCustom;\n /** The version the server assigned this op; retired once the lane reaches it. */\n settledVersion: number | null;\n}\n\n/**\n * Fold the pending optimistic ops over the server config — the effective\n * config a client shows and sends against. Pure, for the tests.\n */\nexport function foldPendingConfigOps(\n serverConfig: DeepAgentServerConfig | null,\n ops: readonly Pick<PendingOp, 'apply' | 'settledVersion'>[]\n): ThreadConfigCustom {\n const version = serverConfig?.version ?? 0;\n let custom: ThreadConfigCustom = serverConfig?.custom ?? {};\n for (const op of ops) {\n if (op.settledVersion !== null && op.settledVersion <= version) continue;\n custom = op.apply(custom);\n }\n return custom;\n}\n\nexport interface UseDeepAgentConfigOptions {\n /**\n * Fired whenever the server writes a new version of the lane (another\n * device, the seed, or the echo of our own command), with this client's\n * still-pending writes folded over — hosts mirror it into their local\n * store; nothing is ever clobbered because pending edits stay on top.\n */\n onServerConfig?: (event: DeepAgentServerConfigEvent) => void;\n}\n\nexport interface UseDeepAgentConfigResult {\n /** Reactive server config version (0 while the thread has never been configured). */\n configVersion: number;\n /** Reactive server-config lane, or `null` at version 0. */\n serverConfig: DeepAgentServerConfig | null;\n /**\n * The effective thread config: the server lane with this client's pending\n * writes folded over. `{}` at version 0 with nothing pending.\n */\n custom: ThreadConfigCustom;\n /** `true` while at least one `config/*` command is unacknowledged by the server. */\n hasPendingWrites: boolean;\n /** `config/patch` — set / unset top-level keys; `null` unsets. */\n patchConfig: (patch: ThreadConfigPatch) => Promise<DeepAgentConfigWriteResult>;\n /** `config/tools/enable`. */\n enableTools: (toolIds: readonly string[]) => Promise<DeepAgentConfigWriteResult>;\n /** `config/tools/disable`. */\n disableTools: (toolIds: readonly string[]) => Promise<DeepAgentConfigWriteResult>;\n}\n\ntype ConfigCommand =\n | { type: typeof DEEP_AGENT_CONFIG_COMMANDS.patch; patch: Record<string, unknown> }\n | { type: typeof DEEP_AGENT_CONFIG_COMMANDS.toolsEnable; toolIds: string[] }\n | { type: typeof DEEP_AGENT_CONFIG_COMMANDS.toolsDisable; toolIds: string[] };\n\n/**\n * The server-authoritative thread config of a deep-agent thread.\n *\n * Every capability a run depends on — model, agent binding, enabled tools,\n * sandbox, environment, … — lives on the thread's server config lane and is\n * changed only through the `config/*` commands. Sends carry per-send keys\n * only (`pickPerSendCustom`). The commands are applied optimistically: each\n * one folds its transform over the server config the moment it is issued\n * (`custom`), and retires once the lane reaches the version the server\n * assigned it; a rejection drops it, so the UI snaps back to the truth.\n *\n * Must be mounted under the thread's statewire context (an `AuiProvider`\n * holding `useDeepAgentThread`'s element), keyed by the thread identity so a\n * thread switch remounts it with an empty pending set.\n */\nexport function useDeepAgentConfig(\n options: UseDeepAgentConfigOptions = {}\n): UseDeepAgentConfigResult {\n const sendCommand = useStatewireSendCommand();\n const serverConfig = useStatewireState(readServerConfig);\n return useDeepAgentConfigController({\n serverConfig,\n sendCommand: (command) => Promise.resolve(sendCommand(command as never)),\n ...options,\n });\n}\n\nexport interface DeepAgentConfigControllerInputs extends UseDeepAgentConfigOptions {\n serverConfig: DeepAgentServerConfig | null;\n sendCommand: (command: ConfigCommand) => Promise<unknown>;\n}\n\n/**\n * The transport-agnostic body of {@link useDeepAgentConfig}, with the reactive\n * inputs injected — so the optimistic-overlay behavior is testable without a\n * statewire session.\n */\nexport function useDeepAgentConfigController({\n serverConfig,\n sendCommand,\n onServerConfig,\n}: DeepAgentConfigControllerInputs): UseDeepAgentConfigResult {\n const [ops, setOps] = useState<readonly PendingOp[]>([]);\n const nextOpIdRef = useRef(1);\n const sendCommandRef = useRef(sendCommand);\n sendCommandRef.current = sendCommand;\n const onServerConfigRef = useRef(onServerConfig);\n onServerConfigRef.current = onServerConfig;\n\n const custom = useMemo(() => foldPendingConfigOps(serverConfig, ops), [serverConfig, ops]);\n\n // Retire ops the lane has caught up with (their transform is now part of\n // the server config itself).\n const serverVersion = serverConfig?.version ?? 0;\n const serverVersionRef = useRef(serverVersion);\n serverVersionRef.current = serverVersion;\n useEffect(() => {\n setOps((current) => {\n const kept = current.filter(\n (op) => op.settledVersion === null || op.settledVersion > serverVersion\n );\n return kept.length === current.length ? current : kept;\n });\n }, [serverVersion]);\n\n const lastNotifiedRef = useRef<DeepAgentServerConfig | null>(null);\n useEffect(() => {\n if (serverConfig === null || serverConfig === lastNotifiedRef.current) return;\n lastNotifiedRef.current = serverConfig;\n onServerConfigRef.current?.({ version: serverConfig.version, custom });\n }, [serverConfig, custom]);\n\n const run = useCallback(\n async (\n command: ConfigCommand,\n apply: PendingOp['apply']\n ): Promise<DeepAgentConfigWriteResult> => {\n const id = nextOpIdRef.current++;\n setOps((current) => [...current, { id, apply, settledVersion: null }]);\n try {\n const raw = (await sendCommandRef.current(command)) as\n | { version?: unknown; custom?: unknown }\n | null\n | undefined;\n const version = typeof raw?.version === 'number' ? raw.version : Number.POSITIVE_INFINITY;\n // The lane echo may have landed before the acknowledgement: retire\n // now if so, otherwise stamp the version for the retire effect.\n setOps((current) =>\n version <= serverVersionRef.current\n ? current.filter((op) => op.id !== id)\n : current.map((op) => (op.id === id ? { ...op, settledVersion: version } : op))\n );\n return {\n version: Number.isFinite(version) ? version : 0,\n custom: isRecord(raw?.custom) ? raw.custom : apply({}),\n };\n } catch (error) {\n setOps((current) => current.filter((op) => op.id !== id));\n throw error;\n }\n },\n []\n );\n\n const patchConfig = useCallback(\n (patch: ThreadConfigPatch) =>\n run({ type: DEEP_AGENT_CONFIG_COMMANDS.patch, patch }, (base) =>\n applyConfigPatch(base, patch)\n ),\n [run]\n );\n const enableTools = useCallback(\n (toolIds: readonly string[]) =>\n run({ type: DEEP_AGENT_CONFIG_COMMANDS.toolsEnable, toolIds: [...toolIds] }, (base) =>\n applyToolsEnable(base, toolIds)\n ),\n [run]\n );\n const disableTools = useCallback(\n (toolIds: readonly string[]) =>\n run({ type: DEEP_AGENT_CONFIG_COMMANDS.toolsDisable, toolIds: [...toolIds] }, (base) =>\n applyToolsDisable(base, toolIds)\n ),\n [run]\n );\n\n return {\n configVersion: serverVersion,\n serverConfig,\n custom,\n hasPendingWrites: ops.some((op) => op.settledVersion === null),\n patchConfig,\n enableTools,\n disableTools,\n };\n}\n"],"names":["statewireRejectionPayload"],"mappings":";;;;;AAoGO,SAAS,iCAAiC,OAAyB;AACxE,QAAM,UAAUA,OAAAA,0BAA0B,KAAK;AAC/C,OAAI,mCAAS,YAAW,IAAK,QAAO;AACpC,QAAM,SAAS,QAAQ;AACvB,UAAO,iCAAQ,UAAS;AAC1B;;"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import "@assistant-ui/react-statewire";
|
|
2
|
-
import "react";
|
|
3
|
-
import { statewireRejectionPayload } from "./errors.js";
|
|
4
|
-
function isConfigSyncUnavailableRejection(error) {
|
|
5
|
-
const payload = statewireRejectionPayload(error);
|
|
6
|
-
if ((payload == null ? void 0 : payload.status) !== 400) return false;
|
|
7
|
-
const detail = payload.detail;
|
|
8
|
-
return (detail == null ? void 0 : detail.code) === "config_sync_unavailable";
|
|
9
|
-
}
|
|
10
|
-
export {
|
|
11
|
-
isConfigSyncUnavailableRejection
|
|
12
|
-
};
|
|
13
|
-
//# sourceMappingURL=use-deep-agent-config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-deep-agent-config.js","sources":["../../../../../agent-runtime/src/use-deep-agent-config.ts"],"sourcesContent":["import { useStatewireSendCommand, useStatewireState } from '@assistant-ui/react-statewire';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n applyConfigPatch,\n applyToolsDisable,\n applyToolsEnable,\n type ThreadConfigCustom,\n type ThreadConfigPatch,\n} from './config-mutations';\nimport { statewireRejectionPayload } from './errors';\nimport { DEEP_AGENT_CONFIG_COMMANDS } from './generated/runconfig-contract';\n\ndeclare module '@assistant-ui/core' {\n namespace Assistant {\n interface Commands {\n /** Set / unset top-level keys of the thread's server config (`null` unsets). */\n configPatch: {\n type: typeof DEEP_AGENT_CONFIG_COMMANDS.patch;\n patch: Record<string, unknown>;\n };\n /** Append ids to the thread's `enabled_tools`. */\n configToolsEnable: {\n type: typeof DEEP_AGENT_CONFIG_COMMANDS.toolsEnable;\n toolIds: string[];\n };\n /** Remove ids from the thread's `enabled_tools`. */\n configToolsDisable: {\n type: typeof DEEP_AGENT_CONFIG_COMMANDS.toolsDisable;\n toolIds: string[];\n };\n }\n }\n}\n\n/**\n * The replicated `state.config` lane of a thread with server-authoritative\n * run config. Absent — and `readServerConfig` returns `null` — while the\n * thread has never been configured (version 0: a brand-new thread, or one\n * created by a client predating the lane).\n */\nexport interface DeepAgentServerConfig {\n /** Monotonic server-incremented version; always >= 1 when the lane exists. */\n version: number;\n /** The thread-config keys every run on this thread uses as its base. */\n custom: ThreadConfigCustom;\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\n/**\n * Read the server-config lane off a raw statewire state.\n *\n * Identity-preserving (returns the raw `state.config` reference), so it is\n * safe as a `useStatewireState` selector: the reference only changes when the\n * server writes the lane.\n */\nexport function readServerConfig(state: unknown): DeepAgentServerConfig | null {\n const config = (state as { config?: unknown } | null | undefined)?.config;\n if (!isRecord(config)) return null;\n const version = config.version;\n if (typeof version !== 'number' || !Number.isInteger(version) || version <= 0) return null;\n if (!isRecord(config.custom)) return null;\n return config as unknown as DeepAgentServerConfig;\n}\n\n/** The thread's server config version: 0 while the thread has never been configured. */\nexport function readConfigVersion(state: unknown): number {\n return readServerConfig(state)?.version ?? 0;\n}\n\n/**\n * The 403 rejection codes a view-only collaborator's `config/*` write can\n * come back with: `config_write_forbidden` from the config host's own gate,\n * or `thread_write_forbidden` from the host-wide mutation gate that runs\n * ahead of it and refuses every thread-mutating command on a view grant.\n */\nconst CONFIG_WRITE_FORBIDDEN_CODES: ReadonlySet<string> = new Set([\n 'config_write_forbidden',\n 'thread_write_forbidden',\n]);\n\n/**\n * Whether a rejected `config/*` command was refused because the submitter\n * only has view access to the session. The write is not retriable by that\n * user; hosts disable their config controls.\n */\nexport function isConfigWriteForbiddenRejection(error: unknown): boolean {\n const payload = statewireRejectionPayload(error);\n if (payload?.status !== 403) return false;\n const detail = payload.detail as { code?: unknown } | undefined;\n return typeof detail?.code === 'string' && CONFIG_WRITE_FORBIDDEN_CODES.has(detail.code);\n}\n\n/**\n * Whether a rejected `config/*` command was refused because the thread's\n * workspace cannot hold server config at all (`config_sync_unavailable`, a\n * regionally-pinned workspace). No write will ever succeed on the thread;\n * hosts stop issuing them and send their full config per run instead.\n */\nexport function isConfigSyncUnavailableRejection(error: unknown): boolean {\n const payload = statewireRejectionPayload(error);\n if (payload?.status !== 400) return false;\n const detail = payload.detail as { code?: unknown } | undefined;\n return detail?.code === 'config_sync_unavailable';\n}\n\n/** The settled result of a `config/*` command: the new server config. */\nexport interface DeepAgentConfigWriteResult {\n version: number;\n custom: ThreadConfigCustom;\n}\n\n/** An observed server-config version, delivered to the host callback. */\nexport interface DeepAgentServerConfigEvent {\n version: number;\n /** The server config with this client's still-pending writes folded over. */\n custom: ThreadConfigCustom;\n}\n\ninterface PendingOp {\n id: number;\n apply: (custom: ThreadConfigCustom) => ThreadConfigCustom;\n /** The version the server assigned this op; retired once the lane reaches it. */\n settledVersion: number | null;\n}\n\n/**\n * Fold the pending optimistic ops over the server config — the effective\n * config a client shows and sends against. Pure, for the tests.\n */\nexport function foldPendingConfigOps(\n serverConfig: DeepAgentServerConfig | null,\n ops: readonly Pick<PendingOp, 'apply' | 'settledVersion'>[]\n): ThreadConfigCustom {\n const version = serverConfig?.version ?? 0;\n let custom: ThreadConfigCustom = serverConfig?.custom ?? {};\n for (const op of ops) {\n if (op.settledVersion !== null && op.settledVersion <= version) continue;\n custom = op.apply(custom);\n }\n return custom;\n}\n\nexport interface UseDeepAgentConfigOptions {\n /**\n * Fired whenever the server writes a new version of the lane (another\n * device, the seed, or the echo of our own command), with this client's\n * still-pending writes folded over — hosts mirror it into their local\n * store; nothing is ever clobbered because pending edits stay on top.\n */\n onServerConfig?: (event: DeepAgentServerConfigEvent) => void;\n}\n\nexport interface UseDeepAgentConfigResult {\n /** Reactive server config version (0 while the thread has never been configured). */\n configVersion: number;\n /** Reactive server-config lane, or `null` at version 0. */\n serverConfig: DeepAgentServerConfig | null;\n /**\n * The effective thread config: the server lane with this client's pending\n * writes folded over. `{}` at version 0 with nothing pending.\n */\n custom: ThreadConfigCustom;\n /** `true` while at least one `config/*` command is unacknowledged by the server. */\n hasPendingWrites: boolean;\n /** `config/patch` — set / unset top-level keys; `null` unsets. */\n patchConfig: (patch: ThreadConfigPatch) => Promise<DeepAgentConfigWriteResult>;\n /** `config/tools/enable`. */\n enableTools: (toolIds: readonly string[]) => Promise<DeepAgentConfigWriteResult>;\n /** `config/tools/disable`. */\n disableTools: (toolIds: readonly string[]) => Promise<DeepAgentConfigWriteResult>;\n}\n\ntype ConfigCommand =\n | { type: typeof DEEP_AGENT_CONFIG_COMMANDS.patch; patch: Record<string, unknown> }\n | { type: typeof DEEP_AGENT_CONFIG_COMMANDS.toolsEnable; toolIds: string[] }\n | { type: typeof DEEP_AGENT_CONFIG_COMMANDS.toolsDisable; toolIds: string[] };\n\n/**\n * The server-authoritative thread config of a deep-agent thread.\n *\n * Every capability a run depends on — model, agent binding, enabled tools,\n * sandbox, environment, … — lives on the thread's server config lane and is\n * changed only through the `config/*` commands. Sends carry per-send keys\n * only (`pickPerSendCustom`). The commands are applied optimistically: each\n * one folds its transform over the server config the moment it is issued\n * (`custom`), and retires once the lane reaches the version the server\n * assigned it; a rejection drops it, so the UI snaps back to the truth.\n *\n * Must be mounted under the thread's statewire context (an `AuiProvider`\n * holding `useDeepAgentThread`'s element), keyed by the thread identity so a\n * thread switch remounts it with an empty pending set.\n */\nexport function useDeepAgentConfig(\n options: UseDeepAgentConfigOptions = {}\n): UseDeepAgentConfigResult {\n const sendCommand = useStatewireSendCommand();\n const serverConfig = useStatewireState(readServerConfig);\n return useDeepAgentConfigController({\n serverConfig,\n sendCommand: (command) => Promise.resolve(sendCommand(command as never)),\n ...options,\n });\n}\n\nexport interface DeepAgentConfigControllerInputs extends UseDeepAgentConfigOptions {\n serverConfig: DeepAgentServerConfig | null;\n sendCommand: (command: ConfigCommand) => Promise<unknown>;\n}\n\n/**\n * The transport-agnostic body of {@link useDeepAgentConfig}, with the reactive\n * inputs injected — so the optimistic-overlay behavior is testable without a\n * statewire session.\n */\nexport function useDeepAgentConfigController({\n serverConfig,\n sendCommand,\n onServerConfig,\n}: DeepAgentConfigControllerInputs): UseDeepAgentConfigResult {\n const [ops, setOps] = useState<readonly PendingOp[]>([]);\n const nextOpIdRef = useRef(1);\n const sendCommandRef = useRef(sendCommand);\n sendCommandRef.current = sendCommand;\n const onServerConfigRef = useRef(onServerConfig);\n onServerConfigRef.current = onServerConfig;\n\n const custom = useMemo(() => foldPendingConfigOps(serverConfig, ops), [serverConfig, ops]);\n\n // Retire ops the lane has caught up with (their transform is now part of\n // the server config itself).\n const serverVersion = serverConfig?.version ?? 0;\n const serverVersionRef = useRef(serverVersion);\n serverVersionRef.current = serverVersion;\n useEffect(() => {\n setOps((current) => {\n const kept = current.filter(\n (op) => op.settledVersion === null || op.settledVersion > serverVersion\n );\n return kept.length === current.length ? current : kept;\n });\n }, [serverVersion]);\n\n const lastNotifiedRef = useRef<DeepAgentServerConfig | null>(null);\n useEffect(() => {\n if (serverConfig === null || serverConfig === lastNotifiedRef.current) return;\n lastNotifiedRef.current = serverConfig;\n onServerConfigRef.current?.({ version: serverConfig.version, custom });\n }, [serverConfig, custom]);\n\n const run = useCallback(\n async (\n command: ConfigCommand,\n apply: PendingOp['apply']\n ): Promise<DeepAgentConfigWriteResult> => {\n const id = nextOpIdRef.current++;\n setOps((current) => [...current, { id, apply, settledVersion: null }]);\n try {\n const raw = (await sendCommandRef.current(command)) as\n | { version?: unknown; custom?: unknown }\n | null\n | undefined;\n const version = typeof raw?.version === 'number' ? raw.version : Number.POSITIVE_INFINITY;\n // The lane echo may have landed before the acknowledgement: retire\n // now if so, otherwise stamp the version for the retire effect.\n setOps((current) =>\n version <= serverVersionRef.current\n ? current.filter((op) => op.id !== id)\n : current.map((op) => (op.id === id ? { ...op, settledVersion: version } : op))\n );\n return {\n version: Number.isFinite(version) ? version : 0,\n custom: isRecord(raw?.custom) ? raw.custom : apply({}),\n };\n } catch (error) {\n setOps((current) => current.filter((op) => op.id !== id));\n throw error;\n }\n },\n []\n );\n\n const patchConfig = useCallback(\n (patch: ThreadConfigPatch) =>\n run({ type: DEEP_AGENT_CONFIG_COMMANDS.patch, patch }, (base) =>\n applyConfigPatch(base, patch)\n ),\n [run]\n );\n const enableTools = useCallback(\n (toolIds: readonly string[]) =>\n run({ type: DEEP_AGENT_CONFIG_COMMANDS.toolsEnable, toolIds: [...toolIds] }, (base) =>\n applyToolsEnable(base, toolIds)\n ),\n [run]\n );\n const disableTools = useCallback(\n (toolIds: readonly string[]) =>\n run({ type: DEEP_AGENT_CONFIG_COMMANDS.toolsDisable, toolIds: [...toolIds] }, (base) =>\n applyToolsDisable(base, toolIds)\n ),\n [run]\n );\n\n return {\n configVersion: serverVersion,\n serverConfig,\n custom,\n hasPendingWrites: ops.some((op) => op.settledVersion === null),\n patchConfig,\n enableTools,\n disableTools,\n };\n}\n"],"names":[],"mappings":";;;AAoGO,SAAS,iCAAiC,OAAyB;AACxE,QAAM,UAAU,0BAA0B,KAAK;AAC/C,OAAI,mCAAS,YAAW,IAAK,QAAO;AACpC,QAAM,SAAS,QAAQ;AACvB,UAAO,iCAAQ,UAAS;AAC1B;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-deep-agent-edit-submit.cjs","sources":["../../../../../agent-runtime/src/use-deep-agent-edit-submit.ts"],"sourcesContent":["import { useAui } from '@assistant-ui/store';\nimport type { StatewireThread } from '@assistant-ui/react-statewire';\nimport { useCallback, useEffect, useRef } from 'react';\nimport { readDeepAgentStatewireExtras, resolveDeepAgentEditCommand } from './edit-command';\n\n/**\n * The submit handler of a message's edit composer on a deep-agent thread: the\n * edited text leaves as a `run/edit` anchored on the host's own parent of the\n * message (see `edit-command.ts`) — older pages stated first for a message at\n * or below the loaded window's edge — instead of the library's\n * converted-message anchor, which the host rejects `wrong-anchor` after a\n * chunked assistant turn and at the window edge.\n *\n * Read inside the message scope (`aui.message()`): the library's optimistic\n * fold shows the edited bubble and rewinds the visible history the moment the\n * command is dispatched, so the edit composer closes right away. Falls back\n * to the composer's own `send()` when the thread is not a statewire thread or\n * the host has not settled the message yet. Resolves `false` for an empty\n * draft, a duplicate submission, or an edit cancelled during preparation.\n */\nexport function useDeepAgentMessageEditSubmit(): () => Promise<boolean> {\n const aui = useAui();\n const alive = useRef(true);\n const submitting = useRef(false);\n useEffect(() => {\n alive.current = true;\n return () => {\n alive.current = false;\n };\n }, []);\n return useCallback(async () => {\n if (submitting.current) return false;\n const composer = aui.message().composer();\n const draft = composer.getState();\n const text = draft.text.trim();\n if (!text && draft.attachments.length === 0) return false;\n const files: StatewireThread.FilePart[] = [];\n const texts = text ? [text] : [];\n // beginEdit lifts original inline images/files into completed composer\n // attachments. The anchored command must carry those too: a text-only\n // reconstruction silently deleted them when editing a cross-device turn.\n for (const attachment of draft.attachments) {\n if (attachment.status.type !== 'complete')\n throw new Error('Wait for attachments to finish before sending your edit.');\n for (const part of attachment.content ?? []) {\n if (part.type === 'text') texts.push(part.text);\n else if (part.type === 'image')\n files.push({ type: 'file', mediaType: 'image/*', url: part.image });\n else if (part.type === 'file')\n files.push({\n type: 'file',\n mediaType: part.mimeType,\n url: part.data,\n ...(part.filename && { filename: part.filename }),\n });\n else throw new Error('This attachment cannot be edited here.');\n }\n }\n submitting.current = true;\n try {\n const sourceId = aui.message().getState().id;\n const readExtras = () =>\n alive.current ? readDeepAgentStatewireExtras(aui.thread().getState().extras) : null;\n const extras = readExtras();\n if (extras) {\n const preparedMetadata = extras.prepareMessageMetadata?.();\n try {\n const command = await resolveDeepAgentEditCommand({\n readExtras,\n sourceId,\n text,\n });\n if (!alive.current || !composer.getState().isEditing) {\n if (preparedMetadata) extras.discardPreparedMessageMetadata?.(preparedMetadata);\n return false;\n }\n if (command) {\n void Promise.resolve(\n extras.sendCommand(\n {\n ...command,\n message: {\n ...command.message,\n parts: [\n ...files,\n ...(texts.length\n ? [{ type: 'text' as const, text: texts.join('\\n\\n') }]\n : []),\n ],\n },\n },\n preparedMetadata === undefined ? undefined : { preparedMetadata },\n ),\n ).catch(() => undefined);\n composer.cancel();\n return true;\n }\n if (preparedMetadata && extras.sendPreparedEdit) {\n extras.sendPreparedEdit(sourceId, preparedMetadata);\n return true;\n }\n } catch (error) {\n if (preparedMetadata) extras.discardPreparedMessageMetadata?.(preparedMetadata);\n throw error;\n }\n }\n composer.send();\n return true;\n } finally {\n submitting.current = false;\n }\n }, [aui]);\n}\n"],"names":["useAui","useRef","useEffect","useCallback","readDeepAgentStatewireExtras","resolveDeepAgentEditCommand"],"mappings":";;;;;AAoBO,SAAS,gCAAwD;AACtE,QAAM,MAAMA,MAAAA,OAAA;AACZ,QAAM,QAAQC,MAAAA,OAAO,IAAI;AACzB,QAAM,aAAaA,MAAAA,OAAO,KAAK;AAC/BC,QAAAA,UAAU,MAAM;AACd,UAAM,UAAU;AAChB,WAAO,MAAM;AACX,YAAM,UAAU;AAAA,IAClB;AAAA,EACF,GAAG,CAAA,CAAE;AACL,SAAOC,MAAAA,YAAY,YAAY;;AAC7B,QAAI,WAAW,QAAS,QAAO;AAC/B,UAAM,WAAW,IAAI,QAAA,EAAU,SAAA;AAC/B,UAAM,QAAQ,SAAS,SAAA;AACvB,UAAM,OAAO,MAAM,KAAK,KAAA;AACxB,QAAI,CAAC,QAAQ,MAAM,YAAY,WAAW,EAAG,QAAO;AACpD,UAAM,QAAoC,CAAA;AAC1C,UAAM,QAAQ,OAAO,CAAC,IAAI,IAAI,CAAA;AAI9B,eAAW,cAAc,MAAM,aAAa;AAC1C,UAAI,WAAW,OAAO,SAAS;AAC7B,cAAM,IAAI,MAAM,0DAA0D;AAC5E,iBAAW,QAAQ,WAAW,WAAW,CAAA,GAAI;AAC3C,YAAI,KAAK,SAAS,OAAQ,OAAM,KAAK,KAAK,IAAI;AAAA,iBACrC,KAAK,SAAS;AACrB,gBAAM,KAAK,EAAE,MAAM,QAAQ,WAAW,WAAW,KAAK,KAAK,OAAO;AAAA,iBAC3D,KAAK,SAAS;AACrB,gBAAM,KAAK;AAAA,YACT,MAAM;AAAA,YACN,WAAW,KAAK;AAAA,YAChB,KAAK,KAAK;AAAA,YACV,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,SAAA;AAAA,UAAS,CAChD;AAAA,YACE,OAAM,IAAI,MAAM,wCAAwC;AAAA,MAC/D;AAAA,IACF;AACA,eAAW,UAAU;AACrB,QAAI;AACF,YAAM,WAAW,IAAI,QAAA,EAAU,WAAW;AAC1C,YAAM,aAAa,MACjB,MAAM,UAAUC,YAAAA,6BAA6B,IAAI,SAAS,WAAW,MAAM,IAAI;AACjF,YAAM,SAAS,WAAA;AACf,UAAI,QAAQ;AACV,cAAM,oBAAmB,YAAO,2BAAP;AACzB,YAAI;AACF,gBAAM,UAAU,MAAMC,wCAA4B;AAAA,YAChD;AAAA,YACA;AAAA,YACA;AAAA,UAAA,CACD;AACD,cAAI,CAAC,MAAM,WAAW,CAAC,SAAS,SAAA,EAAW,WAAW;AACpD,gBAAI,iBAAkB,cAAO,mCAAP,gCAAwC;AAC9D,mBAAO;AAAA,UACT;AACA,cAAI,SAAS;AACX,iBAAK,QAAQ;AAAA,cACX,OAAO;AAAA,gBACL;AAAA,kBACE,GAAG;AAAA,kBACH,SAAS;AAAA,oBACP,GAAG,QAAQ;AAAA,oBACX,OAAO;AAAA,sBACL,GAAG;AAAA,sBACH,GAAI,MAAM,SACN,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,MAAM,EAAA,CAAG,IACpD,CAAA;AAAA,oBAAC;AAAA,kBACP;AAAA,gBACF;AAAA,gBAEF,qBAAqB,SAAY,SAAY,EAAE,iBAAA;AAAA,cAAiB;AAAA,YAClE,EACA,MAAM,MAAM,MAAS;AACvB,qBAAS,OAAA;AACT,mBAAO;AAAA,UACT;AACA,cAAI,oBAAoB,OAAO,kBAAkB;AAC/C,mBAAO,iBAAiB,UAAU,gBAAgB;AAClD,mBAAO;AAAA,UACT;AAAA,QACF,SAAS,OAAO;AACd,cAAI,iBAAkB,cAAO,mCAAP,gCAAwC;AAC9D,gBAAM;AAAA,QACR;AAAA,MACF;AACA,eAAS,KAAA;AACT,aAAO;AAAA,IACT,UAAA;AACE,iBAAW,UAAU;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,GAAG,CAAC;AACV;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-deep-agent-edit-submit.js","sources":["../../../../../agent-runtime/src/use-deep-agent-edit-submit.ts"],"sourcesContent":["import { useAui } from '@assistant-ui/store';\nimport type { StatewireThread } from '@assistant-ui/react-statewire';\nimport { useCallback, useEffect, useRef } from 'react';\nimport { readDeepAgentStatewireExtras, resolveDeepAgentEditCommand } from './edit-command';\n\n/**\n * The submit handler of a message's edit composer on a deep-agent thread: the\n * edited text leaves as a `run/edit` anchored on the host's own parent of the\n * message (see `edit-command.ts`) — older pages stated first for a message at\n * or below the loaded window's edge — instead of the library's\n * converted-message anchor, which the host rejects `wrong-anchor` after a\n * chunked assistant turn and at the window edge.\n *\n * Read inside the message scope (`aui.message()`): the library's optimistic\n * fold shows the edited bubble and rewinds the visible history the moment the\n * command is dispatched, so the edit composer closes right away. Falls back\n * to the composer's own `send()` when the thread is not a statewire thread or\n * the host has not settled the message yet. Resolves `false` for an empty\n * draft, a duplicate submission, or an edit cancelled during preparation.\n */\nexport function useDeepAgentMessageEditSubmit(): () => Promise<boolean> {\n const aui = useAui();\n const alive = useRef(true);\n const submitting = useRef(false);\n useEffect(() => {\n alive.current = true;\n return () => {\n alive.current = false;\n };\n }, []);\n return useCallback(async () => {\n if (submitting.current) return false;\n const composer = aui.message().composer();\n const draft = composer.getState();\n const text = draft.text.trim();\n if (!text && draft.attachments.length === 0) return false;\n const files: StatewireThread.FilePart[] = [];\n const texts = text ? [text] : [];\n // beginEdit lifts original inline images/files into completed composer\n // attachments. The anchored command must carry those too: a text-only\n // reconstruction silently deleted them when editing a cross-device turn.\n for (const attachment of draft.attachments) {\n if (attachment.status.type !== 'complete')\n throw new Error('Wait for attachments to finish before sending your edit.');\n for (const part of attachment.content ?? []) {\n if (part.type === 'text') texts.push(part.text);\n else if (part.type === 'image')\n files.push({ type: 'file', mediaType: 'image/*', url: part.image });\n else if (part.type === 'file')\n files.push({\n type: 'file',\n mediaType: part.mimeType,\n url: part.data,\n ...(part.filename && { filename: part.filename }),\n });\n else throw new Error('This attachment cannot be edited here.');\n }\n }\n submitting.current = true;\n try {\n const sourceId = aui.message().getState().id;\n const readExtras = () =>\n alive.current ? readDeepAgentStatewireExtras(aui.thread().getState().extras) : null;\n const extras = readExtras();\n if (extras) {\n const preparedMetadata = extras.prepareMessageMetadata?.();\n try {\n const command = await resolveDeepAgentEditCommand({\n readExtras,\n sourceId,\n text,\n });\n if (!alive.current || !composer.getState().isEditing) {\n if (preparedMetadata) extras.discardPreparedMessageMetadata?.(preparedMetadata);\n return false;\n }\n if (command) {\n void Promise.resolve(\n extras.sendCommand(\n {\n ...command,\n message: {\n ...command.message,\n parts: [\n ...files,\n ...(texts.length\n ? [{ type: 'text' as const, text: texts.join('\\n\\n') }]\n : []),\n ],\n },\n },\n preparedMetadata === undefined ? undefined : { preparedMetadata },\n ),\n ).catch(() => undefined);\n composer.cancel();\n return true;\n }\n if (preparedMetadata && extras.sendPreparedEdit) {\n extras.sendPreparedEdit(sourceId, preparedMetadata);\n return true;\n }\n } catch (error) {\n if (preparedMetadata) extras.discardPreparedMessageMetadata?.(preparedMetadata);\n throw error;\n }\n }\n composer.send();\n return true;\n } finally {\n submitting.current = false;\n }\n }, [aui]);\n}\n"],"names":[],"mappings":";;;AAoBO,SAAS,gCAAwD;AACtE,QAAM,MAAM,OAAA;AACZ,QAAM,QAAQ,OAAO,IAAI;AACzB,QAAM,aAAa,OAAO,KAAK;AAC/B,YAAU,MAAM;AACd,UAAM,UAAU;AAChB,WAAO,MAAM;AACX,YAAM,UAAU;AAAA,IAClB;AAAA,EACF,GAAG,CAAA,CAAE;AACL,SAAO,YAAY,YAAY;;AAC7B,QAAI,WAAW,QAAS,QAAO;AAC/B,UAAM,WAAW,IAAI,QAAA,EAAU,SAAA;AAC/B,UAAM,QAAQ,SAAS,SAAA;AACvB,UAAM,OAAO,MAAM,KAAK,KAAA;AACxB,QAAI,CAAC,QAAQ,MAAM,YAAY,WAAW,EAAG,QAAO;AACpD,UAAM,QAAoC,CAAA;AAC1C,UAAM,QAAQ,OAAO,CAAC,IAAI,IAAI,CAAA;AAI9B,eAAW,cAAc,MAAM,aAAa;AAC1C,UAAI,WAAW,OAAO,SAAS;AAC7B,cAAM,IAAI,MAAM,0DAA0D;AAC5E,iBAAW,QAAQ,WAAW,WAAW,CAAA,GAAI;AAC3C,YAAI,KAAK,SAAS,OAAQ,OAAM,KAAK,KAAK,IAAI;AAAA,iBACrC,KAAK,SAAS;AACrB,gBAAM,KAAK,EAAE,MAAM,QAAQ,WAAW,WAAW,KAAK,KAAK,OAAO;AAAA,iBAC3D,KAAK,SAAS;AACrB,gBAAM,KAAK;AAAA,YACT,MAAM;AAAA,YACN,WAAW,KAAK;AAAA,YAChB,KAAK,KAAK;AAAA,YACV,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,SAAA;AAAA,UAAS,CAChD;AAAA,YACE,OAAM,IAAI,MAAM,wCAAwC;AAAA,MAC/D;AAAA,IACF;AACA,eAAW,UAAU;AACrB,QAAI;AACF,YAAM,WAAW,IAAI,QAAA,EAAU,WAAW;AAC1C,YAAM,aAAa,MACjB,MAAM,UAAU,6BAA6B,IAAI,SAAS,WAAW,MAAM,IAAI;AACjF,YAAM,SAAS,WAAA;AACf,UAAI,QAAQ;AACV,cAAM,oBAAmB,YAAO,2BAAP;AACzB,YAAI;AACF,gBAAM,UAAU,MAAM,4BAA4B;AAAA,YAChD;AAAA,YACA;AAAA,YACA;AAAA,UAAA,CACD;AACD,cAAI,CAAC,MAAM,WAAW,CAAC,SAAS,SAAA,EAAW,WAAW;AACpD,gBAAI,iBAAkB,cAAO,mCAAP,gCAAwC;AAC9D,mBAAO;AAAA,UACT;AACA,cAAI,SAAS;AACX,iBAAK,QAAQ;AAAA,cACX,OAAO;AAAA,gBACL;AAAA,kBACE,GAAG;AAAA,kBACH,SAAS;AAAA,oBACP,GAAG,QAAQ;AAAA,oBACX,OAAO;AAAA,sBACL,GAAG;AAAA,sBACH,GAAI,MAAM,SACN,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,MAAM,EAAA,CAAG,IACpD,CAAA;AAAA,oBAAC;AAAA,kBACP;AAAA,gBACF;AAAA,gBAEF,qBAAqB,SAAY,SAAY,EAAE,iBAAA;AAAA,cAAiB;AAAA,YAClE,EACA,MAAM,MAAM,MAAS;AACvB,qBAAS,OAAA;AACT,mBAAO;AAAA,UACT;AACA,cAAI,oBAAoB,OAAO,kBAAkB;AAC/C,mBAAO,iBAAiB,UAAU,gBAAgB;AAClD,mBAAO;AAAA,UACT;AAAA,QACF,SAAS,OAAO;AACd,cAAI,iBAAkB,cAAO,mCAAP,gCAAwC;AAC9D,gBAAM;AAAA,QACR;AAAA,MACF;AACA,eAAS,KAAA;AACT,aAAO;AAAA,IACT,UAAA;AACE,iBAAW,UAAU;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,GAAG,CAAC;AACV;"}
|