@athenaintel/react 0.20.0 → 0.21.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 +74 -0
- package/dist/assets/use-asset-embed.cjs +8 -0
- package/dist/assets/use-asset-embed.cjs.map +1 -1
- package/dist/assets/use-asset-embed.js +8 -0
- package/dist/assets/use-asset-embed.js.map +1 -1
- package/dist/chat/StatewireApprovalCard.cjs +22 -4
- package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
- package/dist/chat/StatewireApprovalCard.d.ts +14 -0
- package/dist/chat/StatewireApprovalCard.js +23 -5
- package/dist/chat/StatewireApprovalCard.js.map +1 -1
- package/dist/chat/StatewireClientToolBridge.cjs +2 -1
- package/dist/chat/StatewireClientToolBridge.cjs.map +1 -1
- package/dist/chat/StatewireClientToolBridge.js +2 -1
- package/dist/chat/StatewireClientToolBridge.js.map +1 -1
- package/dist/chat/StatewireQueuedMessages.cjs +2 -1
- package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
- package/dist/chat/StatewireQueuedMessages.js +2 -1
- package/dist/chat/StatewireQueuedMessages.js.map +1 -1
- package/dist/chat/athena-citation-links.cjs +17 -1
- package/dist/chat/athena-citation-links.cjs.map +1 -1
- package/dist/chat/athena-citation-links.js +17 -1
- package/dist/chat/athena-citation-links.js.map +1 -1
- package/dist/chat/statewire-client-tools.cjs +2 -1
- package/dist/chat/statewire-client-tools.cjs.map +1 -1
- package/dist/chat/statewire-client-tools.js +2 -1
- package/dist/chat/statewire-client-tools.js.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingCard.cjs +69 -187
- package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingCard.d.ts +10 -6
- package/dist/chat/super-grouping/SuperGroupingCard.js +73 -191
- package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
- package/dist/chat/super-grouping/ToolTimeline.cjs +131 -0
- package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -0
- package/dist/chat/super-grouping/ToolTimeline.d.ts +16 -0
- package/dist/chat/super-grouping/ToolTimeline.js +131 -0
- package/dist/chat/super-grouping/ToolTimeline.js.map +1 -0
- package/dist/chat/super-grouping/activity-timeline.cjs +14 -8
- package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
- package/dist/chat/super-grouping/activity-timeline.d.ts +3 -0
- package/dist/chat/super-grouping/activity-timeline.js +14 -8
- package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
- package/dist/chat/super-grouping/timeline-step.cjs +65 -0
- package/dist/chat/super-grouping/timeline-step.cjs.map +1 -0
- package/dist/chat/super-grouping/timeline-step.d.ts +17 -0
- package/dist/chat/super-grouping/timeline-step.js +65 -0
- package/dist/chat/super-grouping/timeline-step.js.map +1 -0
- package/dist/chat/tiptap-text.cjs +8 -8
- package/dist/chat/tiptap-text.cjs.map +1 -1
- package/dist/chat/use-athena-run-live.cjs +2 -1
- package/dist/chat/use-athena-run-live.cjs.map +1 -1
- package/dist/chat/use-athena-run-live.js +2 -1
- package/dist/chat/use-athena-run-live.js.map +1 -1
- package/dist/chat/use-statewire-approval-request.cjs +7 -2
- package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
- package/dist/chat/use-statewire-approval-request.d.ts +12 -2
- package/dist/chat/use-statewire-approval-request.js +8 -3
- package/dist/chat/use-statewire-approval-request.js.map +1 -1
- package/dist/chat-ui/composer/tiptap-composer.cjs +24 -65
- package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
- package/dist/chat-ui/composer/tiptap-composer.js +24 -65
- package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
- package/dist/chat-ui/index.cjs +2 -1
- package/dist/chat-ui/index.cjs.map +1 -1
- package/dist/chat-ui/index.js +2 -1
- package/dist/chat-ui/index.js.map +1 -1
- package/dist/chat-ui/mentions/mention-chip.cjs +49 -4
- package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
- package/dist/chat-ui/mentions/mention-chip.d.ts +11 -0
- package/dist/chat-ui/mentions/mention-chip.js +50 -5
- package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
- package/dist/chat-ui/mentions/mention-extension.cjs +18 -6
- package/dist/chat-ui/mentions/mention-extension.cjs.map +1 -1
- package/dist/chat-ui/mentions/mention-extension.d.ts +2 -0
- package/dist/chat-ui/mentions/mention-extension.js +18 -6
- package/dist/chat-ui/mentions/mention-extension.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs +1 -1
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js +1 -1
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/menu-item.cjs +9 -6
- package/dist/chat-ui/mentions/suggestions/components/menu-item.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/menu-item.d.ts +2 -2
- package/dist/chat-ui/mentions/suggestions/components/menu-item.js +10 -7
- package/dist/chat-ui/mentions/suggestions/components/menu-item.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs +2 -2
- package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/menu-list.d.ts +2 -2
- package/dist/chat-ui/mentions/suggestions/components/menu-list.js +2 -2
- package/dist/chat-ui/mentions/suggestions/components/menu-list.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +2 -1
- package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/api-client.d.ts +3 -2
- package/dist/chat-ui/mentions/suggestions/data/api-client.js +2 -1
- package/dist/chat-ui/mentions/suggestions/data/api-client.js.map +1 -1
- package/dist/chat-ui/messages/message-components.cjs +6 -29
- package/dist/chat-ui/messages/message-components.cjs.map +1 -1
- package/dist/chat-ui/messages/message-components.d.ts +1 -13
- package/dist/chat-ui/messages/message-components.js +8 -31
- package/dist/chat-ui/messages/message-components.js.map +1 -1
- package/dist/chat-ui/messages/runtime-message.cjs +3 -2
- package/dist/chat-ui/messages/runtime-message.cjs.map +1 -1
- package/dist/chat-ui/messages/runtime-message.js +3 -2
- package/dist/chat-ui/messages/runtime-message.js.map +1 -1
- package/dist/chat-ui/messages/statewire-continue-run.cjs +23 -8
- package/dist/chat-ui/messages/statewire-continue-run.cjs.map +1 -1
- package/dist/chat-ui/messages/statewire-continue-run.d.ts +14 -4
- package/dist/chat-ui/messages/statewire-continue-run.js +23 -8
- package/dist/chat-ui/messages/statewire-continue-run.js.map +1 -1
- package/dist/chat-ui/messages/user-edit-composer.cjs +2 -1
- package/dist/chat-ui/messages/user-edit-composer.cjs.map +1 -1
- package/dist/chat-ui/messages/user-edit-composer.js +2 -1
- package/dist/chat-ui/messages/user-edit-composer.js.map +1 -1
- package/dist/chat-ui/rich-text/chat-message-body.cjs +76 -0
- package/dist/chat-ui/rich-text/chat-message-body.cjs.map +1 -0
- package/dist/chat-ui/rich-text/chat-message-body.d.ts +5 -0
- package/dist/chat-ui/rich-text/chat-message-body.js +76 -0
- package/dist/chat-ui/rich-text/chat-message-body.js.map +1 -0
- package/dist/chat-ui/rich-text/chat-node-views.cjs +51 -0
- package/dist/chat-ui/rich-text/chat-node-views.cjs.map +1 -0
- package/dist/chat-ui/rich-text/chat-node-views.d.ts +13 -0
- package/dist/chat-ui/rich-text/chat-node-views.js +51 -0
- package/dist/chat-ui/rich-text/chat-node-views.js.map +1 -0
- package/dist/chat-ui/rich-text/chat-text-schema.cjs +70 -0
- package/dist/chat-ui/rich-text/chat-text-schema.cjs.map +1 -0
- package/dist/chat-ui/rich-text/chat-text-schema.d.ts +7 -0
- package/dist/chat-ui/rich-text/chat-text-schema.js +70 -0
- package/dist/chat-ui/rich-text/chat-text-schema.js.map +1 -0
- package/dist/chat-ui/rich-text/dom-output-spec.cjs +83 -0
- package/dist/chat-ui/rich-text/dom-output-spec.cjs.map +1 -0
- package/dist/chat-ui/rich-text/dom-output-spec.d.ts +11 -0
- package/dist/chat-ui/rich-text/dom-output-spec.js +83 -0
- package/dist/chat-ui/rich-text/dom-output-spec.js.map +1 -0
- package/dist/chat-ui/statewire.cjs +2 -1
- package/dist/chat-ui/statewire.cjs.map +1 -1
- package/dist/chat-ui/statewire.js +2 -1
- package/dist/chat-ui/statewire.js.map +1 -1
- package/dist/chat-ui/thread/statewire-history-edge.cjs +2 -1
- package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
- package/dist/chat-ui/thread/statewire-history-edge.js +2 -1
- package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
- package/dist/index.cjs +2 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/node_modules/qrcode-generator/dist/qrcode.cjs +32 -0
- package/dist/node_modules/qrcode-generator/dist/qrcode.cjs.map +1 -0
- package/dist/node_modules/qrcode-generator/dist/qrcode.js +31 -0
- package/dist/node_modules/qrcode-generator/dist/qrcode.js.map +1 -0
- package/dist/node_modules/zod/v4/classic/errors.cjs +44 -0
- package/dist/node_modules/zod/v4/classic/errors.cjs.map +1 -0
- package/dist/node_modules/zod/v4/classic/errors.js +44 -0
- package/dist/node_modules/zod/v4/classic/errors.js.map +1 -0
- package/dist/node_modules/zod/v4/classic/iso.cjs +43 -0
- package/dist/node_modules/zod/v4/classic/iso.cjs.map +1 -0
- package/dist/node_modules/zod/v4/classic/iso.js +43 -0
- package/dist/node_modules/zod/v4/classic/iso.js.map +1 -0
- package/dist/node_modules/zod/v4/classic/parse.cjs +29 -0
- package/dist/node_modules/zod/v4/classic/parse.cjs.map +1 -0
- package/dist/node_modules/zod/v4/classic/parse.js +29 -0
- package/dist/node_modules/zod/v4/classic/parse.js.map +1 -0
- package/dist/node_modules/zod/v4/classic/schemas.cjs +871 -0
- package/dist/node_modules/zod/v4/classic/schemas.cjs.map +1 -0
- package/dist/node_modules/zod/v4/classic/schemas.js +871 -0
- package/dist/node_modules/zod/v4/classic/schemas.js.map +1 -0
- package/dist/node_modules/zod/v4/core/api.cjs +570 -0
- package/dist/node_modules/zod/v4/core/api.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/api.js +570 -0
- package/dist/node_modules/zod/v4/core/api.js.map +1 -0
- package/dist/node_modules/zod/v4/core/checks.cjs +411 -0
- package/dist/node_modules/zod/v4/core/checks.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/checks.js +411 -0
- package/dist/node_modules/zod/v4/core/checks.js.map +1 -0
- package/dist/node_modules/zod/v4/core/core.cjs +77 -0
- package/dist/node_modules/zod/v4/core/core.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/core.js +77 -0
- package/dist/node_modules/zod/v4/core/core.js.map +1 -0
- package/dist/node_modules/zod/v4/core/doc.cjs +38 -0
- package/dist/node_modules/zod/v4/core/doc.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/doc.js +38 -0
- package/dist/node_modules/zod/v4/core/doc.js.map +1 -0
- package/dist/node_modules/zod/v4/core/errors.cjs +76 -0
- package/dist/node_modules/zod/v4/core/errors.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/errors.js +76 -0
- package/dist/node_modules/zod/v4/core/errors.js.map +1 -0
- package/dist/node_modules/zod/v4/core/json-schema-processors.cjs +312 -0
- package/dist/node_modules/zod/v4/core/json-schema-processors.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/json-schema-processors.js +312 -0
- package/dist/node_modules/zod/v4/core/json-schema-processors.js.map +1 -0
- package/dist/node_modules/zod/v4/core/parse.cjs +96 -0
- package/dist/node_modules/zod/v4/core/parse.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/parse.js +96 -0
- package/dist/node_modules/zod/v4/core/parse.js.map +1 -0
- package/dist/node_modules/zod/v4/core/regexes.cjs +86 -0
- package/dist/node_modules/zod/v4/core/regexes.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/regexes.js +86 -0
- package/dist/node_modules/zod/v4/core/regexes.js.map +1 -0
- package/dist/node_modules/zod/v4/core/registries.cjs +52 -0
- package/dist/node_modules/zod/v4/core/registries.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/registries.js +52 -0
- package/dist/node_modules/zod/v4/core/registries.js.map +1 -0
- package/dist/node_modules/zod/v4/core/schemas.cjs +1412 -0
- package/dist/node_modules/zod/v4/core/schemas.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/schemas.js +1413 -0
- package/dist/node_modules/zod/v4/core/schemas.js.map +1 -0
- package/dist/node_modules/zod/v4/core/to-json-schema.cjs +370 -0
- package/dist/node_modules/zod/v4/core/to-json-schema.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/to-json-schema.js +370 -0
- package/dist/node_modules/zod/v4/core/to-json-schema.js.map +1 -0
- package/dist/node_modules/zod/v4/core/util.cjs +444 -0
- package/dist/node_modules/zod/v4/core/util.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/util.js +444 -0
- package/dist/node_modules/zod/v4/core/util.js.map +1 -0
- package/dist/node_modules/zod/v4/core/versions.cjs +9 -0
- package/dist/node_modules/zod/v4/core/versions.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/versions.js +9 -0
- package/dist/node_modules/zod/v4/core/versions.js.map +1 -0
- package/dist/packages/agent-runtime/src/client-tool-bridge.cjs +7 -1
- package/dist/packages/agent-runtime/src/client-tool-bridge.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/client-tool-bridge.js +7 -1
- package/dist/packages/agent-runtime/src/client-tool-bridge.js.map +1 -1
- package/dist/packages/agent-runtime/src/conversation-list.cjs +4 -0
- package/dist/packages/agent-runtime/src/conversation-list.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/conversation-list.js +4 -0
- package/dist/packages/agent-runtime/src/conversation-list.js.map +1 -1
- package/dist/packages/agent-runtime/src/edit-command.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/edit-command.js.map +1 -1
- package/dist/packages/agent-runtime/src/generated/runconfig-contract.cjs +2 -0
- package/dist/packages/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/generated/runconfig-contract.js +2 -0
- package/dist/packages/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
- package/dist/packages/agent-runtime/src/interrupts.cjs +31 -7
- package/dist/packages/agent-runtime/src/interrupts.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/interrupts.js +31 -7
- package/dist/packages/agent-runtime/src/interrupts.js.map +1 -1
- package/dist/packages/agent-runtime/src/messages.cjs +35 -5
- package/dist/packages/agent-runtime/src/messages.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/messages.js +35 -5
- package/dist/packages/agent-runtime/src/messages.js.map +1 -1
- package/dist/packages/agent-runtime/src/protocol.cjs +4 -6
- package/dist/packages/agent-runtime/src/protocol.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/protocol.js +4 -6
- package/dist/packages/agent-runtime/src/protocol.js.map +1 -1
- package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.cjs +296 -14
- package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.js +293 -11
- package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.js.map +1 -1
- package/dist/packages/agent-runtime/src/screen-point.cjs +68 -0
- package/dist/packages/agent-runtime/src/screen-point.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/screen-point.js +68 -0
- package/dist/packages/agent-runtime/src/screen-point.js.map +1 -0
- package/dist/packages/agent-runtime/src/statewire-transport.cjs +6 -1
- package/dist/packages/agent-runtime/src/statewire-transport.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/statewire-transport.js +6 -1
- package/dist/packages/agent-runtime/src/statewire-transport.js.map +1 -1
- package/dist/packages/agent-runtime/src/thread-handoff.cjs +85 -0
- package/dist/packages/agent-runtime/src/thread-handoff.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/thread-handoff.js +85 -0
- package/dist/packages/agent-runtime/src/thread-handoff.js.map +1 -0
- package/dist/packages/agent-runtime/src/thread-snapshot-cache.cjs +1 -1
- package/dist/packages/agent-runtime/src/thread-snapshot-cache.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/thread-snapshot-cache.js +1 -1
- package/dist/packages/agent-runtime/src/thread-snapshot-cache.js.map +1 -1
- package/dist/packages/agent-runtime/src/tool-metadata.cjs +0 -8
- package/dist/packages/agent-runtime/src/tool-metadata.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/tool-metadata.js +0 -8
- package/dist/packages/agent-runtime/src/tool-metadata.js.map +1 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-config.cjs +14 -0
- package/dist/packages/agent-runtime/src/use-deep-agent-config.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/use-deep-agent-config.js +14 -0
- package/dist/packages/agent-runtime/src/use-deep-agent-config.js.map +1 -0
- package/dist/packages/agent-runtime/src/use-deep-agent-edit-submit.cjs +21 -5
- package/dist/packages/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-edit-submit.js +21 -5
- package/dist/packages/agent-runtime/src/use-deep-agent-edit-submit.js.map +1 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-runtime.cjs +13 -3
- package/dist/packages/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-runtime.js +14 -4
- package/dist/packages/agent-runtime/src/use-deep-agent-runtime.js.map +1 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-thread.cjs +35 -15
- package/dist/packages/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-thread.js +35 -15
- package/dist/packages/agent-runtime/src/use-deep-agent-thread.js.map +1 -1
- package/dist/packages/agent-runtime/src/voice-presentation.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/voice-presentation.js.map +1 -1
- package/dist/packages/react/package.json.cjs +1 -1
- package/dist/packages/react/package.json.js +1 -1
- package/dist/provider/AthenaProvider.cjs +2 -1
- package/dist/provider/AthenaProvider.cjs.map +1 -1
- package/dist/provider/AthenaProvider.js +2 -1
- package/dist/provider/AthenaProvider.js.map +1 -1
- package/dist/runtime/statewire-lifecycle.cjs +2 -1
- package/dist/runtime/statewire-lifecycle.cjs.map +1 -1
- package/dist/runtime/statewire-lifecycle.js +2 -1
- package/dist/runtime/statewire-lifecycle.js.map +1 -1
- package/dist/runtime/useAthenaStatewireRuntime.cjs +2 -1
- package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
- package/dist/runtime/useAthenaStatewireRuntime.js +2 -1
- package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/threads/conversation-list-fetcher.cjs +4 -0
- package/dist/threads/conversation-list-fetcher.cjs.map +1 -1
- package/dist/threads/conversation-list-fetcher.js +4 -0
- package/dist/threads/conversation-list-fetcher.js.map +1 -1
- package/dist/threads/statewire-thread-list.cjs +2 -1
- package/dist/threads/statewire-thread-list.cjs.map +1 -1
- package/dist/threads/statewire-thread-list.js +2 -1
- package/dist/threads/statewire-thread-list.js.map +1 -1
- package/dist/threads/use-rest-conversation-history.cjs +2 -1
- package/dist/threads/use-rest-conversation-history.cjs.map +1 -1
- package/dist/threads/use-rest-conversation-history.js +2 -1
- package/dist/threads/use-rest-conversation-history.js.map +1 -1
- package/dist/threads/use-statewire-conversation-history.cjs +2 -1
- package/dist/threads/use-statewire-conversation-history.cjs.map +1 -1
- package/dist/threads/use-statewire-conversation-history.d.ts +1 -0
- package/dist/threads/use-statewire-conversation-history.js +2 -1
- package/dist/threads/use-statewire-conversation-history.js.map +1 -1
- package/dist/tools/index.cjs +2 -1
- package/dist/tools/index.cjs.map +1 -1
- package/dist/tools/index.js +2 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/misc-tool-uis.cjs +2 -1
- package/dist/tools/misc-tool-uis.cjs.map +1 -1
- package/dist/tools/misc-tool-uis.js +2 -1
- package/dist/tools/misc-tool-uis.js.map +1 -1
- package/dist/tools/primitives.cjs +2 -1
- package/dist/tools/primitives.cjs.map +1 -1
- package/dist/tools/primitives.js +2 -1
- package/dist/tools/primitives.js.map +1 -1
- package/dist/tools/tool-fallback.cjs +2 -1
- package/dist/tools/tool-fallback.cjs.map +1 -1
- package/dist/tools/tool-fallback.js +2 -1
- package/dist/tools/tool-fallback.js.map +1 -1
- package/dist/tools/voice-update-tool-ui.cjs +2 -1
- package/dist/tools/voice-update-tool-ui.cjs.map +1 -1
- package/dist/tools/voice-update-tool-ui.js +2 -1
- package/dist/tools/voice-update-tool-ui.js.map +1 -1
- package/dist/voice/index.cjs +6 -0
- package/dist/voice/index.cjs.map +1 -0
- package/dist/voice/index.d.ts +2 -0
- package/dist/voice/index.js +6 -0
- package/dist/voice/index.js.map +1 -0
- package/dist/voice/use-athena-voice-session.cjs +315 -0
- package/dist/voice/use-athena-voice-session.cjs.map +1 -0
- package/dist/voice/use-athena-voice-session.d.ts +145 -0
- package/dist/voice/use-athena-voice-session.js +315 -0
- package/dist/voice/use-athena-voice-session.js.map +1 -0
- package/package.json +17 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-fallback.js","sources":["../../src/tools/tool-fallback.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n type ComponentProps,\n type ElementType,\n memo,\n type ReactNode,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n AlertCircleIcon,\n CheckCircle2Icon,\n ChevronDownIcon,\n ExternalLinkIcon,\n LinkIcon,\n LoaderIcon,\n PauseIcon,\n ShieldAlertIcon,\n XCircleIcon,\n} from \"lucide-react\";\nimport {\n useScrollLock,\n type ToolCallMessagePartStatus,\n type ToolCallMessagePartComponent,\n} from \"@assistant-ui/react\";\nimport {\n classifyToolResult,\n describeToolArgs,\n getToolDisplayMeta,\n resultMessage,\n toolStatusLabel,\n type RejectedToolResult,\n type ToolResultClassification,\n} from \"@athenaintel/agent-runtime\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"../ui/collapsible\";\nimport { cn } from \"../lib/utils\";\nimport { useAssetPanelStore, type AssetType } from \"../assets/asset-panel-store\";\nimport { NestedPtcMessages, useNestedPtcComponents } from \"./NestedPtcMessages\";\nimport { CopyToolSpecButton, tryParseJson } from \"./primitives\";\nimport { toolIcon } from \"./tool-icons\";\n\n/**\n * The generic tool-call card every Athena chat surface renders for a tool\n * without a dedicated UI — the SDK's `AthenaChat`, the Chrome side panel, the\n * Office task pane, and Olympus. Names, icons, and running copy come from the\n * shared tool display registry; success/failure comes from the shared result\n * classifier; hosts add what only they know through the seams on\n * {@link ToolFallbackOptions} (a registry-resolved display name, an Excel\n * range jump, a rich result renderer, where \"open asset\" goes).\n *\n * Also exported as composable parts (`ToolFallback.Root` … `.Notice`) for a\n * host that lays its own row out but wants the same pieces.\n */\n\nconst ANIMATION_DURATION = 200;\n\ntype ToolCallPartProps = ComponentProps<ToolCallMessagePartComponent>;\n\n/** What a host slot sees about the call it decorates. */\nexport interface ToolFallbackContext {\n toolName: string;\n args: Record<string, unknown> | undefined;\n argsText: string | undefined;\n result: unknown;\n status: ToolCallMessagePartStatus | undefined;\n classification: ToolResultClassification;\n /** An `asset_…` id found on the result or the arguments, if any. */\n assetId: string | null;\n}\n\nexport interface ToolFallbackOptions {\n /** Row title for a settled call (defaults to the registry's `displayName`). */\n displayName?: string;\n /** Row title while running (defaults to the registry's `activeLabel`). */\n activeLabel?: string;\n /** Row icon (defaults to the registry's icon for the tool). */\n icon?: ElementType;\n /**\n * Hide arguments that are internal identifiers (`asset_id`, `catalog_id`,\n * `workspace_id`, `user_id`, and any `asset_…`-shaped value) from the\n * disclosure. On by default — they mean nothing to a reader; a surface that\n * needs them for review (an approval) turns it off.\n */\n hideInternalIdArgs?: boolean;\n /** An extra control in the header row, outside the toggle (an Excel range jump, a thumbnail). */\n extraAction?: ReactNode | ((context: ToolFallbackContext) => ReactNode);\n /** A notice under the header (a prompt-injection warning, a policy note). */\n notice?: ReactNode;\n /** Replace the default raw result disclosure with a host renderer (Genie SQL, a table). */\n renderResult?: (context: ToolFallbackContext) => ReactNode;\n /** Where \"Open\" / the asset link goes; defaults to the SDK asset panel. */\n onOpenAsset?: (assetId: string, meta: { name?: string; type: AssetType }) => void;\n /** Extra content in the expanded body (a screenshot, a preview). */\n children?: ReactNode;\n /** Start expanded. */\n defaultOpen?: boolean;\n className?: string;\n /** Extra attributes on the card element (`data-testid`, `data-tool-name`). */\n rootProps?: Omit<ComponentProps<\"div\">, \"className\" | \"children\"> &\n Record<`data-${string}`, string | undefined>;\n}\n\nexport type ToolFallbackProps = ToolCallPartProps & ToolFallbackOptions;\n\n// ─── Outcome ─────────────────────────────────────────────────────────\n\n/**\n * A gated call the user refused at the approval gate is neither a success nor\n * a failure: the shared classifier reads the refusal off the tool message\n * first (`rejected`), so a declined call never borrows the success treatment\n * (check mark, completed wording) or the failure one (the red error notice).\n */\nfunction rejectedOutcome(classification: ToolResultClassification): RejectedToolResult | null {\n return classification.state === \"rejected\" ? classification.rejection : null;\n}\n\n// ─── Asset detection ─────────────────────────────────────────────────\n\nfunction extractAssetId(result: unknown): string | null {\n if (!result) return null;\n try {\n const obj = typeof result === \"string\" ? JSON.parse(result) : result;\n if (typeof obj === \"object\" && obj !== null) {\n const record = obj as Record<string, unknown>;\n const id = record.asset_id ?? record.assetId ?? record.id;\n if (typeof id === \"string\" && id.startsWith(\"asset_\")) return id;\n }\n } catch { /* ignore */ }\n return null;\n}\n\n/** Extract asset_id from tool args (e.g. open_asset_in_workspace passes it as an arg). */\nfunction extractAssetIdFromArgs(argsText: string | undefined): string | null {\n if (!argsText) return null;\n const parsed = tryParseJson(argsText);\n if (!parsed) return null;\n const id = (parsed.asset_id ?? parsed.assetId) as string | undefined;\n if (typeof id === \"string\" && id.startsWith(\"asset_\")) return id;\n return null;\n}\n\nfunction toolMetaToAssetType(toolName: string): AssetType {\n const lower = toolName.toLowerCase();\n if (lower.includes(\"presentation\") || lower.includes(\"pptx\") || lower.includes(\"slide\") || lower.includes(\"powerpoint\"))\n return \"presentation\";\n if (lower.includes(\"sheet\") || lower.includes(\"spreadsheet\"))\n return \"spreadsheet\";\n if (lower.includes(\"document\") || lower.includes(\"doc\") || lower.includes(\"markdown\"))\n return \"document\";\n if (lower.includes(\"notebook\"))\n return \"notebook\";\n return \"unknown\";\n}\n\nconst CREATE_ASSET_TOOLS = [\n \"create_powerpoint_deck\",\n \"create_document_from_markdown\",\n \"create_new_document\",\n \"create_new_sheet\",\n \"create_new_notebook\",\n];\n\nfunction isAssetTool(toolName: string, result: unknown): boolean {\n return CREATE_ASSET_TOOLS.includes(toolName.toLowerCase()) || extractAssetId(result) !== null;\n}\n\nfunction extractTitle(argsText: string | undefined, result: unknown): string | null {\n if (argsText) {\n const args = tryParseJson(argsText);\n if (args) {\n const t = (args.title ?? args.name ?? args.filename ?? args.sheet_name) as string | undefined;\n if (t) return t;\n }\n }\n if (result) {\n try {\n const obj = typeof result === \"string\" ? JSON.parse(result) : result;\n if (typeof obj === \"object\" && obj !== null) {\n return ((obj as Record<string, unknown>).title ?? (obj as Record<string, unknown>).name) as string | null;\n }\n } catch { /* ignore */ }\n }\n return null;\n}\n\nexport function clearAutoOpenedAssets() {\n useAssetPanelStore.getState().resetAutoOpen();\n}\n\n/** Keys whose values are internal identifiers a reader gains nothing from. */\nconst HIDDEN_ARG_KEYS = new Set([\"catalog_id\", \"asset_id\", \"workspace_id\", \"user_id\"]);\n\n/** `asset_abc-123…`-shaped values: internal ids, hidden from the disclosure by default. */\nfunction looksLikeInternalId(value: unknown): boolean {\n if (typeof value !== \"string\") return false;\n return /^(asset|catalog|user|workspace)_[a-f0-9-]{8,}$/i.test(value);\n}\n\nfunction useOpenAsset(\n onOpenAsset: ToolFallbackOptions[\"onOpenAsset\"],\n): NonNullable<ToolFallbackOptions[\"onOpenAsset\"]> {\n const storeOpenAsset = useAssetPanelStore((s) => s.openAsset);\n return onOpenAsset ?? storeOpenAsset;\n}\n\n// ─── Composable primitives ───────────────────────────────────────────\n\nexport type ToolFallbackRootProps = Omit<\n React.ComponentProps<typeof Collapsible>,\n \"open\" | \"onOpenChange\"\n> & {\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n defaultOpen?: boolean;\n};\n\nfunction ToolFallbackRoot({\n className,\n open: controlledOpen,\n onOpenChange: controlledOnOpenChange,\n defaultOpen = false,\n children,\n ...props\n}: ToolFallbackRootProps) {\n const collapsibleRef = useRef<HTMLDivElement>(null);\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const lockScroll = useScrollLock(collapsibleRef, ANIMATION_DURATION);\n\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : uncontrolledOpen;\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (!open) {\n lockScroll();\n }\n if (!isControlled) {\n setUncontrolledOpen(open);\n }\n controlledOnOpenChange?.(open);\n },\n [lockScroll, isControlled, controlledOnOpenChange],\n );\n\n return (\n <Collapsible\n ref={collapsibleRef}\n data-slot=\"tool-fallback-root\"\n open={isOpen}\n onOpenChange={handleOpenChange}\n className={cn(\n \"aui-tool-fallback-root group/tool-fallback-root my-3 w-full rounded-xl border border-border/60 bg-background py-2.5 shadow-sm\",\n className,\n )}\n style={\n {\n \"--animation-duration\": `${ANIMATION_DURATION}ms`,\n } as React.CSSProperties\n }\n {...props}\n >\n {children}\n </Collapsible>\n );\n}\n\nexport interface ToolFallbackTriggerProps\n extends Omit<React.ComponentProps<typeof CollapsibleTrigger>, \"children\"> {\n toolName: string;\n argsText?: string;\n result?: unknown;\n status?: ToolCallMessagePartStatus;\n isError?: boolean;\n /** Pre-computed classification (else derived from status/result/isError). */\n classification?: ToolResultClassification;\n displayName?: string;\n activeLabel?: string;\n icon?: ElementType;\n}\n\nfunction ToolFallbackTrigger({\n toolName,\n argsText,\n result,\n status,\n isError,\n classification: givenClassification,\n displayName,\n activeLabel,\n icon,\n className,\n ...props\n}: ToolFallbackTriggerProps) {\n const classification =\n givenClassification ?? classifyToolResult({ status, result, isError });\n const state = classification.state;\n const isRunning = state === \"running\";\n const isCancelled = status?.type === \"incomplete\" && status.reason === \"cancelled\";\n\n const meta = getToolDisplayMeta(toolName);\n const ToolIcon = icon ?? toolIcon(meta.icon);\n const title = displayName ?? meta.displayName;\n const running = activeLabel ?? meta.activeLabel;\n\n const summary = useMemo(() => {\n if (isRunning || !argsText) return null;\n const parsed = tryParseJson(argsText);\n return parsed ? (describeToolArgs({ toolName, args: parsed }) ?? null) : null;\n }, [toolName, argsText, isRunning]);\n\n const message = useMemo(\n () => (state === \"complete\" ? resultMessage(result) : null),\n [result, state],\n );\n\n const rejection = rejectedOutcome(classification);\n const headline = rejection\n ? toolStatusLabel(toolName, \"rejected\", displayName)\n : state === \"error\"\n ? `Failed: ${title}`\n : state === \"paused\"\n ? `Paused: ${title}`\n : title;\n const secondary = rejection ? rejection.reason : message || summary;\n\n return (\n <CollapsibleTrigger\n data-slot=\"tool-fallback-trigger\"\n data-tool-outcome={state}\n className={cn(\n \"aui-tool-fallback-trigger group/trigger flex w-full items-center gap-2.5 px-3 text-sm transition-colors\",\n className,\n )}\n {...props}\n >\n <div\n className={cn(\n \"flex size-7 shrink-0 items-center justify-center rounded-lg\",\n isRunning && \"bg-blue-50 text-blue-600\",\n state === \"complete\" && \"bg-emerald-50 text-emerald-600\",\n state === \"error\" && \"bg-red-50 text-red-500\",\n (state === \"requires-action\" || state === \"paused\" || state === \"rejected\") &&\n \"bg-amber-50 text-amber-500\",\n )}\n >\n {isRunning ? (\n <LoaderIcon className=\"size-3.5 animate-spin\" />\n ) : rejection ? (\n <XCircleIcon className=\"size-3.5\" />\n ) : state === \"error\" ? (\n isCancelled ? (\n <XCircleIcon className=\"size-3.5\" />\n ) : (\n <AlertCircleIcon className=\"size-3.5\" />\n )\n ) : state === \"paused\" ? (\n <PauseIcon className=\"size-3.5\" />\n ) : state === \"requires-action\" ? (\n <ShieldAlertIcon className=\"size-3.5\" />\n ) : (\n <ToolIcon className=\"size-3.5\" />\n )}\n </div>\n\n <div className=\"flex min-w-0 grow flex-col items-start gap-0.5 text-left\">\n <span\n className={cn(\n \"relative inline-block text-[13px] font-medium leading-tight\",\n isCancelled && \"text-muted-foreground line-through\",\n )}\n >\n <span>{isRunning ? `${running}...` : headline}</span>\n {isRunning && (\n <span\n aria-hidden\n className=\"shimmer pointer-events-none absolute inset-0 motion-reduce:animate-none\"\n >\n {running}...\n </span>\n )}\n </span>\n {!isRunning && secondary && (\n <span className=\"truncate text-xs text-muted-foreground leading-snug max-w-full\">\n {secondary}\n </span>\n )}\n </div>\n\n {state === \"complete\" && (\n <CheckCircle2Icon className=\"size-3.5 shrink-0 text-emerald-500\" />\n )}\n\n <ChevronDownIcon\n className={cn(\n \"size-4 shrink-0 text-muted-foreground\",\n \"transition-transform duration-(--animation-duration) ease-out\",\n \"group-data-[state=closed]/trigger:-rotate-90\",\n \"group-data-[state=open]/trigger:rotate-0\",\n )}\n />\n </CollapsibleTrigger>\n );\n}\n\nfunction ToolFallbackContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof CollapsibleContent>) {\n return (\n <CollapsibleContent\n data-slot=\"tool-fallback-content\"\n className={cn(\n \"aui-tool-fallback-content relative overflow-hidden text-sm outline-none\",\n \"group/collapsible-content ease-out\",\n \"data-[state=closed]:animate-collapsible-up\",\n \"data-[state=open]:animate-collapsible-down\",\n \"data-[state=closed]:fill-mode-forwards\",\n \"data-[state=closed]:pointer-events-none\",\n \"data-[state=open]:duration-(--animation-duration)\",\n \"data-[state=closed]:duration-(--animation-duration)\",\n className,\n )}\n {...props}\n >\n <div className=\"mt-2.5 flex flex-col gap-2 border-t border-border/50 pt-2\">{children}</div>\n </CollapsibleContent>\n );\n}\n\nfunction ToolFallbackArgs({\n argsText,\n hideInternalIdArgs = true,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n argsText?: string;\n hideInternalIdArgs?: boolean;\n}) {\n if (!argsText) return null;\n\n const parsed = tryParseJson(argsText);\n if (!parsed) {\n return (\n <div className={cn(\"px-3\", className)} {...props}>\n <p className=\"text-xs font-medium text-muted-foreground\">Arguments</p>\n <pre className=\"mt-1 whitespace-pre-wrap text-xs text-muted-foreground\">{argsText}</pre>\n </div>\n );\n }\n\n const entries = Object.entries(parsed).filter(\n ([key, value]) =>\n !hideInternalIdArgs || (!HIDDEN_ARG_KEYS.has(key) && !looksLikeInternalId(value)),\n );\n if (entries.length === 0) return null;\n\n return (\n <div\n data-slot=\"tool-fallback-args\"\n className={cn(\"aui-tool-fallback-args flex flex-col gap-1.5 px-3\", className)}\n {...props}\n >\n <p className=\"text-xs font-medium text-muted-foreground\">Arguments</p>\n {entries.map(([key, value]) => {\n const strValue = typeof value === \"string\" ? value : JSON.stringify(value, null, 2);\n const isLong = typeof value === \"string\" && value.length > 80;\n\n return (\n <div key={key}>\n <span className=\"text-xs font-medium text-muted-foreground\">{key}</span>\n {isLong ? (\n <p className=\"mt-0.5 text-xs leading-relaxed text-foreground/80\">{strValue}</p>\n ) : (\n <span className=\"ml-1.5 text-xs text-foreground/80\">{strValue}</span>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction ToolFallbackResult({\n result,\n classification,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n result?: unknown;\n classification?: ToolResultClassification;\n}) {\n const message = resultMessage(result);\n const succeeded =\n (classification ?? classifyToolResult({ status: { type: \"complete\" }, result })).state ===\n \"complete\";\n\n const displayValue = useMemo(() => {\n if (result === undefined) return \"\";\n if (typeof result === \"string\") {\n const parsed = tryParseJson(result);\n return parsed ? JSON.stringify(parsed, null, 2) : result;\n }\n return JSON.stringify(result, null, 2);\n }, [result]);\n\n if (result === undefined) return null;\n // The header already carries a success message; nothing to disclose.\n if (message && succeeded) return null;\n\n return (\n <div\n data-slot=\"tool-fallback-result\"\n className={cn(\"border-t border-dashed border-border/50 px-3 pt-2\", className)}\n {...props}\n >\n <p className=\"text-xs font-medium text-muted-foreground\">Result</p>\n <pre className=\"mt-1 max-h-72 overflow-auto whitespace-pre-wrap break-words rounded-md bg-muted/20 p-2 text-[11px] text-foreground/80\">\n {message ?? displayValue}\n </pre>\n </div>\n );\n}\n\n/**\n * The failure a status-incomplete call carries, for the expanded body. The\n * always-visible failure line is {@link ToolFallbackNotice}; this repeats the\n * raw error text with the details.\n */\nfunction ToolFallbackError({\n status,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n status?: ToolCallMessagePartStatus;\n}) {\n if (status?.type !== \"incomplete\") return null;\n\n const error = status.error;\n const errorText = error\n ? typeof error === \"string\"\n ? error\n : JSON.stringify(error)\n : null;\n\n if (!errorText) return null;\n\n const isCancelled = status.reason === \"cancelled\";\n const headerText = isCancelled ? \"Cancelled\" : \"Error\";\n\n return (\n <div className={cn(\"px-3\", className)} {...props}>\n <p className=\"text-xs font-medium text-destructive\">{headerText}</p>\n <p className=\"mt-0.5 text-xs text-destructive/80\">{errorText}</p>\n </div>\n );\n}\n\n/**\n * The always-visible line under the header for a failed or paused call — the\n * failure's code and message, or the runtime's pause notice — so a reader\n * never has to expand a card to learn a step went wrong.\n */\nfunction ToolFallbackNotice({\n classification,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & { classification: ToolResultClassification }) {\n if (classification.state === \"error\") {\n const { failure } = classification;\n return (\n <div\n data-slot=\"tool-fallback-notice\"\n className={cn(\n \"mt-2 border-t border-red-200/80 px-3 pt-1.5 text-[11px] text-red-700\",\n className,\n )}\n {...props}\n >\n <span className=\"font-medium\">{failure.code ? `${failure.code}: ` : \"Error: \"}</span>\n {failure.message}\n </div>\n );\n }\n if (classification.state === \"paused\") {\n return (\n <div\n data-slot=\"tool-fallback-notice\"\n className={cn(\n \"mt-2 border-t border-amber-200/80 px-3 pt-1.5 text-[11px] text-amber-800\",\n className,\n )}\n {...props}\n >\n {classification.notice}\n </div>\n );\n }\n return null;\n}\n\n// ─── Asset Tool Card ────────────────────────────────────────────────\n\nfunction AssetToolCard({\n toolName,\n argsText,\n result,\n status,\n classification,\n context,\n displayName,\n activeLabel,\n icon,\n hideInternalIdArgs,\n action,\n notice,\n renderResult,\n onOpenAsset,\n children,\n defaultOpen,\n className,\n rootProps,\n}: {\n toolName: string;\n argsText?: string;\n result?: unknown;\n status?: ToolCallMessagePartStatus;\n classification: ToolResultClassification;\n context: ToolFallbackContext;\n displayName?: string;\n activeLabel?: string;\n icon?: ElementType;\n hideInternalIdArgs?: boolean;\n /** The host's `extraAction`, already resolved against the context. */\n action?: ReactNode;\n notice?: ReactNode;\n renderResult?: ToolFallbackOptions[\"renderResult\"];\n onOpenAsset?: ToolFallbackOptions[\"onOpenAsset\"];\n children?: ReactNode;\n defaultOpen?: boolean;\n className?: string;\n rootProps?: ToolFallbackOptions[\"rootProps\"];\n}) {\n const [detailsOpen, setDetailsOpen] = useState(defaultOpen ?? false);\n const openAsset = useOpenAsset(onOpenAsset);\n const meta = getToolDisplayMeta(toolName);\n const ToolIcon = icon ?? toolIcon(meta.icon);\n const title = displayName ?? meta.displayName;\n const state = classification.state;\n const isRunning = state === \"running\";\n const isCancelled = status?.type === \"incomplete\" && status.reason === \"cancelled\";\n const assetId = extractAssetId(result);\n const assetTitle = extractTitle(argsText, result);\n const assetType = toolMetaToAssetType(toolName);\n const rejection = rejectedOutcome(classification);\n\n return (\n <div\n {...rootProps}\n data-slot=\"tool-fallback-root\"\n data-tool-outcome={state}\n className={cn(\n \"aui-tool-fallback-root my-3 w-full rounded-xl border border-border/60 bg-background py-2.5 shadow-sm\",\n isCancelled && \"border-muted-foreground/30 bg-muted/30\",\n className,\n )}\n >\n <div className=\"flex items-center gap-2.5 px-3 text-sm\">\n <div\n className={cn(\n \"flex size-7 shrink-0 items-center justify-center rounded-lg\",\n isRunning && \"bg-blue-50 text-blue-600\",\n state === \"complete\" && \"bg-emerald-50 text-emerald-600\",\n state === \"error\" && \"bg-red-50 text-red-500\",\n state === \"rejected\" && \"bg-amber-50 text-amber-500\",\n )}\n >\n {isRunning ? (\n <LoaderIcon className=\"size-3.5 animate-spin\" />\n ) : rejection ? (\n <XCircleIcon className=\"size-3.5\" />\n ) : state === \"error\" ? (\n <AlertCircleIcon className=\"size-3.5\" />\n ) : (\n <ToolIcon className=\"size-3.5\" />\n )}\n </div>\n\n <div className=\"flex min-w-0 grow flex-col items-start gap-0.5 text-left\">\n <span className=\"leading-tight font-medium\">\n {isRunning\n ? `${activeLabel ?? meta.activeLabel}...`\n : rejection\n ? toolStatusLabel(toolName, \"rejected\", displayName)\n : state === \"error\"\n ? `Failed: ${title}`\n : title}\n </span>\n {!isRunning && assetTitle && (\n <span className=\"max-w-full truncate text-xs leading-snug text-muted-foreground\">\n {assetTitle}\n </span>\n )}\n </div>\n\n {assetId && state === \"complete\" && CREATE_ASSET_TOOLS.includes(toolName.toLowerCase()) && (\n <button\n type=\"button\"\n onClick={() => openAsset(assetId, { name: assetTitle ?? undefined, type: assetType })}\n className=\"flex shrink-0 items-center gap-1 rounded-md border border-border/60 px-2 py-0.5 text-[11px] font-medium text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n >\n <ExternalLinkIcon className=\"size-2.5\" />\n Open\n </button>\n )}\n\n {action}\n\n {state === \"complete\" && (\n <CheckCircle2Icon className=\"size-3.5 shrink-0 text-emerald-500\" />\n )}\n\n {!isCancelled && (\n <button\n type=\"button\"\n onClick={() => setDetailsOpen((o) => !o)}\n className={cn(\n \"flex size-5 shrink-0 items-center justify-center rounded transition-all\",\n detailsOpen\n ? \"bg-primary/5 text-primary\"\n : \"text-muted-foreground/40 hover:bg-muted/50 hover:text-muted-foreground\",\n )}\n title=\"Show details\"\n >\n <ChevronDownIcon\n className={cn(\n \"size-3 transition-transform duration-200\",\n detailsOpen && \"rotate-180\",\n )}\n />\n </button>\n )}\n </div>\n\n {notice}\n <ToolFallbackNotice classification={classification} />\n\n {detailsOpen && !isCancelled && (\n <div className=\"mt-2.5 flex flex-col gap-2 border-t border-border/50 px-3 pt-2\">\n {children}\n <ToolFallbackArgs argsText={argsText} hideInternalIdArgs={hideInternalIdArgs} />\n {renderResult ? (\n renderResult(context)\n ) : (\n <ToolFallbackResult result={result} classification={classification} />\n )}\n <div className=\"flex justify-end pt-1\">\n <CopyToolSpecButton toolName={toolName} argsText={argsText} result={result} className=\"px-0 pb-0\" />\n </div>\n </div>\n )}\n </div>\n );\n}\n\n/** Subtle \"open in panel\" button for any tool that has an asset_id */\nfunction AssetOpenLink({\n assetId,\n toolName,\n onOpenAsset,\n}: {\n assetId: string;\n toolName: string;\n onOpenAsset?: ToolFallbackOptions[\"onOpenAsset\"];\n}) {\n const openAsset = useOpenAsset(onOpenAsset);\n const assetType = toolMetaToAssetType(toolName);\n return (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n openAsset(assetId, { type: assetType });\n }}\n className=\"flex size-5 shrink-0 items-center justify-center rounded text-muted-foreground/50 transition-colors hover:bg-muted/50 hover:text-foreground\"\n title=\"Open asset\"\n >\n <LinkIcon className=\"size-3\" />\n </button>\n );\n}\n\nconst ToolFallbackImpl = ({\n toolName,\n args,\n argsText,\n result,\n status,\n isError,\n displayName,\n activeLabel,\n icon,\n hideInternalIdArgs = true,\n extraAction,\n notice,\n renderResult,\n onOpenAsset,\n children,\n defaultOpen,\n className,\n rootProps,\n}: ToolFallbackProps) => {\n const classification = classifyToolResult({ status, result, isError });\n const isCancelled =\n status?.type === \"incomplete\" && status.reason === \"cancelled\";\n const nestedComponents = useNestedPtcComponents(ToolFallback);\n const resultAssetId = extractAssetId(result);\n const argsAssetId = extractAssetIdFromArgs(argsText);\n const assetId = resultAssetId ?? argsAssetId;\n const context: ToolFallbackContext = {\n toolName,\n args: (args as Record<string, unknown> | undefined) ?? undefined,\n argsText,\n result,\n status,\n classification,\n assetId,\n };\n const action = typeof extraAction === \"function\" ? extraAction(context) : extraAction;\n\n // Use compact AssetToolCard for asset-creating tools\n if (isAssetTool(toolName, result)) {\n return (\n <>\n <AssetToolCard\n toolName={toolName}\n argsText={argsText}\n result={result}\n status={status}\n classification={classification}\n context={context}\n displayName={displayName}\n activeLabel={activeLabel}\n icon={icon}\n hideInternalIdArgs={hideInternalIdArgs}\n action={action}\n notice={notice}\n renderResult={renderResult}\n onOpenAsset={onOpenAsset}\n defaultOpen={defaultOpen}\n className={className}\n rootProps={rootProps}\n >\n {children}\n </AssetToolCard>\n <NestedPtcMessages components={nestedComponents} />\n </>\n );\n }\n\n const isComplete = classification.state === \"complete\";\n\n return (\n <ToolFallbackRoot\n {...rootProps}\n defaultOpen={defaultOpen}\n className={cn(isCancelled && \"border-muted-foreground/30 bg-muted/30\", className)}\n >\n <div className=\"flex items-center\">\n <div className=\"min-w-0 flex-1\">\n <ToolFallbackTrigger\n toolName={toolName}\n argsText={argsText}\n result={result}\n status={status}\n classification={classification}\n displayName={displayName}\n activeLabel={activeLabel}\n icon={icon}\n />\n </div>\n {action ? <div className=\"shrink-0 pr-2\">{action}</div> : null}\n {assetId && isComplete && !action && (\n <div className=\"shrink-0 pr-2\">\n <AssetOpenLink assetId={assetId} toolName={toolName} onOpenAsset={onOpenAsset} />\n </div>\n )}\n </div>\n {notice}\n <ToolFallbackNotice classification={classification} />\n <ToolFallbackContent>\n {children}\n <ToolFallbackError status={status} />\n <ToolFallbackArgs\n argsText={argsText}\n hideInternalIdArgs={hideInternalIdArgs}\n className={cn(isCancelled && \"opacity-60\")}\n />\n {!isCancelled &&\n (renderResult ? (\n renderResult(context)\n ) : (\n <ToolFallbackResult result={result} classification={classification} />\n ))}\n <NestedPtcMessages components={nestedComponents} />\n {!isCancelled && (\n <div className=\"flex justify-end px-3 pt-1\">\n <CopyToolSpecButton\n toolName={toolName}\n argsText={argsText}\n result={result}\n className=\"px-0 pb-0\"\n />\n </div>\n )}\n </ToolFallbackContent>\n </ToolFallbackRoot>\n );\n};\n\nconst ToolFallback = memo(\n ToolFallbackImpl,\n) as unknown as ToolCallMessagePartComponent &\n ((props: ToolFallbackProps) => ReactNode) & {\n Root: typeof ToolFallbackRoot;\n Trigger: typeof ToolFallbackTrigger;\n Content: typeof ToolFallbackContent;\n Args: typeof ToolFallbackArgs;\n Result: typeof ToolFallbackResult;\n Error: typeof ToolFallbackError;\n Notice: typeof ToolFallbackNotice;\n };\n\nToolFallback.displayName = \"ToolFallback\";\nToolFallback.Root = ToolFallbackRoot;\nToolFallback.Trigger = ToolFallbackTrigger;\nToolFallback.Content = ToolFallbackContent;\nToolFallback.Args = ToolFallbackArgs;\nToolFallback.Result = ToolFallbackResult;\nToolFallback.Error = ToolFallbackError;\nToolFallback.Notice = ToolFallbackNotice;\n\nexport {\n ToolFallback,\n ToolFallbackRoot,\n ToolFallbackTrigger,\n ToolFallbackContent,\n ToolFallbackArgs,\n ToolFallbackResult,\n ToolFallbackError,\n ToolFallbackNotice,\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tool-fallback.js","sources":["../../src/tools/tool-fallback.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n type ComponentProps,\n type ElementType,\n memo,\n type ReactNode,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n AlertCircleIcon,\n CheckCircle2Icon,\n ChevronDownIcon,\n ExternalLinkIcon,\n LinkIcon,\n LoaderIcon,\n PauseIcon,\n ShieldAlertIcon,\n XCircleIcon,\n} from \"lucide-react\";\nimport {\n useScrollLock,\n type ToolCallMessagePartStatus,\n type ToolCallMessagePartComponent,\n} from \"@assistant-ui/react\";\nimport {\n classifyToolResult,\n describeToolArgs,\n getToolDisplayMeta,\n resultMessage,\n toolStatusLabel,\n type RejectedToolResult,\n type ToolResultClassification,\n} from \"@athenaintel/agent-runtime\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"../ui/collapsible\";\nimport { cn } from \"../lib/utils\";\nimport { useAssetPanelStore, type AssetType } from \"../assets/asset-panel-store\";\nimport { NestedPtcMessages, useNestedPtcComponents } from \"./NestedPtcMessages\";\nimport { CopyToolSpecButton, tryParseJson } from \"./primitives\";\nimport { toolIcon } from \"./tool-icons\";\n\n/**\n * The generic tool-call card every Athena chat surface renders for a tool\n * without a dedicated UI — the SDK's `AthenaChat`, the Chrome side panel, the\n * Office task pane, and Olympus. Names, icons, and running copy come from the\n * shared tool display registry; success/failure comes from the shared result\n * classifier; hosts add what only they know through the seams on\n * {@link ToolFallbackOptions} (a registry-resolved display name, an Excel\n * range jump, a rich result renderer, where \"open asset\" goes).\n *\n * Also exported as composable parts (`ToolFallback.Root` … `.Notice`) for a\n * host that lays its own row out but wants the same pieces.\n */\n\nconst ANIMATION_DURATION = 200;\n\ntype ToolCallPartProps = ComponentProps<ToolCallMessagePartComponent>;\n\n/** What a host slot sees about the call it decorates. */\nexport interface ToolFallbackContext {\n toolName: string;\n args: Record<string, unknown> | undefined;\n argsText: string | undefined;\n result: unknown;\n status: ToolCallMessagePartStatus | undefined;\n classification: ToolResultClassification;\n /** An `asset_…` id found on the result or the arguments, if any. */\n assetId: string | null;\n}\n\nexport interface ToolFallbackOptions {\n /** Row title for a settled call (defaults to the registry's `displayName`). */\n displayName?: string;\n /** Row title while running (defaults to the registry's `activeLabel`). */\n activeLabel?: string;\n /** Row icon (defaults to the registry's icon for the tool). */\n icon?: ElementType;\n /**\n * Hide arguments that are internal identifiers (`asset_id`, `catalog_id`,\n * `workspace_id`, `user_id`, and any `asset_…`-shaped value) from the\n * disclosure. On by default — they mean nothing to a reader; a surface that\n * needs them for review (an approval) turns it off.\n */\n hideInternalIdArgs?: boolean;\n /** An extra control in the header row, outside the toggle (an Excel range jump, a thumbnail). */\n extraAction?: ReactNode | ((context: ToolFallbackContext) => ReactNode);\n /** A notice under the header (a prompt-injection warning, a policy note). */\n notice?: ReactNode;\n /** Replace the default raw result disclosure with a host renderer (Genie SQL, a table). */\n renderResult?: (context: ToolFallbackContext) => ReactNode;\n /** Where \"Open\" / the asset link goes; defaults to the SDK asset panel. */\n onOpenAsset?: (assetId: string, meta: { name?: string; type: AssetType }) => void;\n /** Extra content in the expanded body (a screenshot, a preview). */\n children?: ReactNode;\n /** Start expanded. */\n defaultOpen?: boolean;\n className?: string;\n /** Extra attributes on the card element (`data-testid`, `data-tool-name`). */\n rootProps?: Omit<ComponentProps<\"div\">, \"className\" | \"children\"> &\n Record<`data-${string}`, string | undefined>;\n}\n\nexport type ToolFallbackProps = ToolCallPartProps & ToolFallbackOptions;\n\n// ─── Outcome ─────────────────────────────────────────────────────────\n\n/**\n * A gated call the user refused at the approval gate is neither a success nor\n * a failure: the shared classifier reads the refusal off the tool message\n * first (`rejected`), so a declined call never borrows the success treatment\n * (check mark, completed wording) or the failure one (the red error notice).\n */\nfunction rejectedOutcome(classification: ToolResultClassification): RejectedToolResult | null {\n return classification.state === \"rejected\" ? classification.rejection : null;\n}\n\n// ─── Asset detection ─────────────────────────────────────────────────\n\nfunction extractAssetId(result: unknown): string | null {\n if (!result) return null;\n try {\n const obj = typeof result === \"string\" ? JSON.parse(result) : result;\n if (typeof obj === \"object\" && obj !== null) {\n const record = obj as Record<string, unknown>;\n const id = record.asset_id ?? record.assetId ?? record.id;\n if (typeof id === \"string\" && id.startsWith(\"asset_\")) return id;\n }\n } catch { /* ignore */ }\n return null;\n}\n\n/** Extract asset_id from tool args (e.g. open_asset_in_workspace passes it as an arg). */\nfunction extractAssetIdFromArgs(argsText: string | undefined): string | null {\n if (!argsText) return null;\n const parsed = tryParseJson(argsText);\n if (!parsed) return null;\n const id = (parsed.asset_id ?? parsed.assetId) as string | undefined;\n if (typeof id === \"string\" && id.startsWith(\"asset_\")) return id;\n return null;\n}\n\nfunction toolMetaToAssetType(toolName: string): AssetType {\n const lower = toolName.toLowerCase();\n if (lower.includes(\"presentation\") || lower.includes(\"pptx\") || lower.includes(\"slide\") || lower.includes(\"powerpoint\"))\n return \"presentation\";\n if (lower.includes(\"sheet\") || lower.includes(\"spreadsheet\"))\n return \"spreadsheet\";\n if (lower.includes(\"document\") || lower.includes(\"doc\") || lower.includes(\"markdown\"))\n return \"document\";\n if (lower.includes(\"notebook\"))\n return \"notebook\";\n return \"unknown\";\n}\n\nconst CREATE_ASSET_TOOLS = [\n \"create_powerpoint_deck\",\n \"create_document_from_markdown\",\n \"create_new_document\",\n \"create_new_sheet\",\n \"create_new_notebook\",\n];\n\nfunction isAssetTool(toolName: string, result: unknown): boolean {\n return CREATE_ASSET_TOOLS.includes(toolName.toLowerCase()) || extractAssetId(result) !== null;\n}\n\nfunction extractTitle(argsText: string | undefined, result: unknown): string | null {\n if (argsText) {\n const args = tryParseJson(argsText);\n if (args) {\n const t = (args.title ?? args.name ?? args.filename ?? args.sheet_name) as string | undefined;\n if (t) return t;\n }\n }\n if (result) {\n try {\n const obj = typeof result === \"string\" ? JSON.parse(result) : result;\n if (typeof obj === \"object\" && obj !== null) {\n return ((obj as Record<string, unknown>).title ?? (obj as Record<string, unknown>).name) as string | null;\n }\n } catch { /* ignore */ }\n }\n return null;\n}\n\nexport function clearAutoOpenedAssets() {\n useAssetPanelStore.getState().resetAutoOpen();\n}\n\n/** Keys whose values are internal identifiers a reader gains nothing from. */\nconst HIDDEN_ARG_KEYS = new Set([\"catalog_id\", \"asset_id\", \"workspace_id\", \"user_id\"]);\n\n/** `asset_abc-123…`-shaped values: internal ids, hidden from the disclosure by default. */\nfunction looksLikeInternalId(value: unknown): boolean {\n if (typeof value !== \"string\") return false;\n return /^(asset|catalog|user|workspace)_[a-f0-9-]{8,}$/i.test(value);\n}\n\nfunction useOpenAsset(\n onOpenAsset: ToolFallbackOptions[\"onOpenAsset\"],\n): NonNullable<ToolFallbackOptions[\"onOpenAsset\"]> {\n const storeOpenAsset = useAssetPanelStore((s) => s.openAsset);\n return onOpenAsset ?? storeOpenAsset;\n}\n\n// ─── Composable primitives ───────────────────────────────────────────\n\nexport type ToolFallbackRootProps = Omit<\n React.ComponentProps<typeof Collapsible>,\n \"open\" | \"onOpenChange\"\n> & {\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n defaultOpen?: boolean;\n};\n\nfunction ToolFallbackRoot({\n className,\n open: controlledOpen,\n onOpenChange: controlledOnOpenChange,\n defaultOpen = false,\n children,\n ...props\n}: ToolFallbackRootProps) {\n const collapsibleRef = useRef<HTMLDivElement>(null);\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const lockScroll = useScrollLock(collapsibleRef, ANIMATION_DURATION);\n\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : uncontrolledOpen;\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (!open) {\n lockScroll();\n }\n if (!isControlled) {\n setUncontrolledOpen(open);\n }\n controlledOnOpenChange?.(open);\n },\n [lockScroll, isControlled, controlledOnOpenChange],\n );\n\n return (\n <Collapsible\n ref={collapsibleRef}\n data-slot=\"tool-fallback-root\"\n open={isOpen}\n onOpenChange={handleOpenChange}\n className={cn(\n \"aui-tool-fallback-root group/tool-fallback-root my-3 w-full rounded-xl border border-border/60 bg-background py-2.5 shadow-sm\",\n className,\n )}\n style={\n {\n \"--animation-duration\": `${ANIMATION_DURATION}ms`,\n } as React.CSSProperties\n }\n {...props}\n >\n {children}\n </Collapsible>\n );\n}\n\nexport interface ToolFallbackTriggerProps\n extends Omit<React.ComponentProps<typeof CollapsibleTrigger>, \"children\"> {\n toolName: string;\n argsText?: string;\n result?: unknown;\n status?: ToolCallMessagePartStatus;\n isError?: boolean;\n /** Pre-computed classification (else derived from status/result/isError). */\n classification?: ToolResultClassification;\n displayName?: string;\n activeLabel?: string;\n icon?: ElementType;\n}\n\nfunction ToolFallbackTrigger({\n toolName,\n argsText,\n result,\n status,\n isError,\n classification: givenClassification,\n displayName,\n activeLabel,\n icon,\n className,\n ...props\n}: ToolFallbackTriggerProps) {\n const classification =\n givenClassification ?? classifyToolResult({ status, result, isError });\n const state = classification.state;\n const isRunning = state === \"running\";\n const isCancelled = status?.type === \"incomplete\" && status.reason === \"cancelled\";\n\n const meta = getToolDisplayMeta(toolName);\n const ToolIcon = icon ?? toolIcon(meta.icon);\n const title = displayName ?? meta.displayName;\n const running = activeLabel ?? meta.activeLabel;\n\n const summary = useMemo(() => {\n if (isRunning || !argsText) return null;\n const parsed = tryParseJson(argsText);\n return parsed ? (describeToolArgs({ toolName, args: parsed }) ?? null) : null;\n }, [toolName, argsText, isRunning]);\n\n const message = useMemo(\n () => (state === \"complete\" ? resultMessage(result) : null),\n [result, state],\n );\n\n const rejection = rejectedOutcome(classification);\n const headline = rejection\n ? toolStatusLabel(toolName, \"rejected\", displayName)\n : state === \"error\"\n ? `Failed: ${title}`\n : state === \"paused\"\n ? `Paused: ${title}`\n : title;\n const secondary = rejection ? rejection.reason : message || summary;\n\n return (\n <CollapsibleTrigger\n data-slot=\"tool-fallback-trigger\"\n data-tool-outcome={state}\n className={cn(\n \"aui-tool-fallback-trigger group/trigger flex w-full items-center gap-2.5 px-3 text-sm transition-colors\",\n className,\n )}\n {...props}\n >\n <div\n className={cn(\n \"flex size-7 shrink-0 items-center justify-center rounded-lg\",\n isRunning && \"bg-blue-50 text-blue-600\",\n state === \"complete\" && \"bg-emerald-50 text-emerald-600\",\n state === \"error\" && \"bg-red-50 text-red-500\",\n (state === \"requires-action\" || state === \"paused\" || state === \"rejected\") &&\n \"bg-amber-50 text-amber-500\",\n )}\n >\n {isRunning ? (\n <LoaderIcon className=\"size-3.5 animate-spin\" />\n ) : rejection ? (\n <XCircleIcon className=\"size-3.5\" />\n ) : state === \"error\" ? (\n isCancelled ? (\n <XCircleIcon className=\"size-3.5\" />\n ) : (\n <AlertCircleIcon className=\"size-3.5\" />\n )\n ) : state === \"paused\" ? (\n <PauseIcon className=\"size-3.5\" />\n ) : state === \"requires-action\" ? (\n <ShieldAlertIcon className=\"size-3.5\" />\n ) : (\n <ToolIcon className=\"size-3.5\" />\n )}\n </div>\n\n <div className=\"flex min-w-0 grow flex-col items-start gap-0.5 text-left\">\n <span\n className={cn(\n \"relative inline-block text-[13px] font-medium leading-tight\",\n isCancelled && \"text-muted-foreground line-through\",\n )}\n >\n <span>{isRunning ? `${running}...` : headline}</span>\n {isRunning && (\n <span\n aria-hidden\n className=\"shimmer pointer-events-none absolute inset-0 motion-reduce:animate-none\"\n >\n {running}...\n </span>\n )}\n </span>\n {!isRunning && secondary && (\n <span className=\"truncate text-xs text-muted-foreground leading-snug max-w-full\">\n {secondary}\n </span>\n )}\n </div>\n\n {state === \"complete\" && (\n <CheckCircle2Icon className=\"size-3.5 shrink-0 text-emerald-500\" />\n )}\n\n <ChevronDownIcon\n className={cn(\n \"size-4 shrink-0 text-muted-foreground\",\n \"transition-transform duration-(--animation-duration) ease-out\",\n \"group-data-[state=closed]/trigger:-rotate-90\",\n \"group-data-[state=open]/trigger:rotate-0\",\n )}\n />\n </CollapsibleTrigger>\n );\n}\n\nfunction ToolFallbackContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof CollapsibleContent>) {\n return (\n <CollapsibleContent\n data-slot=\"tool-fallback-content\"\n className={cn(\n \"aui-tool-fallback-content relative overflow-hidden text-sm outline-none\",\n \"group/collapsible-content ease-out\",\n \"data-[state=closed]:animate-collapsible-up\",\n \"data-[state=open]:animate-collapsible-down\",\n \"data-[state=closed]:fill-mode-forwards\",\n \"data-[state=closed]:pointer-events-none\",\n \"data-[state=open]:duration-(--animation-duration)\",\n \"data-[state=closed]:duration-(--animation-duration)\",\n className,\n )}\n {...props}\n >\n <div className=\"mt-2.5 flex flex-col gap-2 border-t border-border/50 pt-2\">{children}</div>\n </CollapsibleContent>\n );\n}\n\nfunction ToolFallbackArgs({\n argsText,\n hideInternalIdArgs = true,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n argsText?: string;\n hideInternalIdArgs?: boolean;\n}) {\n if (!argsText) return null;\n\n const parsed = tryParseJson(argsText);\n if (!parsed) {\n return (\n <div className={cn(\"px-3\", className)} {...props}>\n <p className=\"text-xs font-medium text-muted-foreground\">Arguments</p>\n <pre className=\"mt-1 whitespace-pre-wrap text-xs text-muted-foreground\">{argsText}</pre>\n </div>\n );\n }\n\n const entries = Object.entries(parsed).filter(\n ([key, value]) =>\n !hideInternalIdArgs || (!HIDDEN_ARG_KEYS.has(key) && !looksLikeInternalId(value)),\n );\n if (entries.length === 0) return null;\n\n return (\n <div\n data-slot=\"tool-fallback-args\"\n className={cn(\"aui-tool-fallback-args flex flex-col gap-1.5 px-3\", className)}\n {...props}\n >\n <p className=\"text-xs font-medium text-muted-foreground\">Arguments</p>\n {entries.map(([key, value]) => {\n const strValue = typeof value === \"string\" ? value : JSON.stringify(value, null, 2);\n const isLong = typeof value === \"string\" && value.length > 80;\n\n return (\n <div key={key}>\n <span className=\"text-xs font-medium text-muted-foreground\">{key}</span>\n {isLong ? (\n <p className=\"mt-0.5 text-xs leading-relaxed text-foreground/80\">{strValue}</p>\n ) : (\n <span className=\"ml-1.5 text-xs text-foreground/80\">{strValue}</span>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction ToolFallbackResult({\n result,\n classification,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n result?: unknown;\n classification?: ToolResultClassification;\n}) {\n const message = resultMessage(result);\n const succeeded =\n (classification ?? classifyToolResult({ status: { type: \"complete\" }, result })).state ===\n \"complete\";\n\n const displayValue = useMemo(() => {\n if (result === undefined) return \"\";\n if (typeof result === \"string\") {\n const parsed = tryParseJson(result);\n return parsed ? JSON.stringify(parsed, null, 2) : result;\n }\n return JSON.stringify(result, null, 2);\n }, [result]);\n\n if (result === undefined) return null;\n // The header already carries a success message; nothing to disclose.\n if (message && succeeded) return null;\n\n return (\n <div\n data-slot=\"tool-fallback-result\"\n className={cn(\"border-t border-dashed border-border/50 px-3 pt-2\", className)}\n {...props}\n >\n <p className=\"text-xs font-medium text-muted-foreground\">Result</p>\n <pre className=\"mt-1 max-h-72 overflow-auto whitespace-pre-wrap break-words rounded-md bg-muted/20 p-2 text-[11px] text-foreground/80\">\n {message ?? displayValue}\n </pre>\n </div>\n );\n}\n\n/**\n * The failure a status-incomplete call carries, for the expanded body. The\n * always-visible failure line is {@link ToolFallbackNotice}; this repeats the\n * raw error text with the details.\n */\nfunction ToolFallbackError({\n status,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n status?: ToolCallMessagePartStatus;\n}) {\n if (status?.type !== \"incomplete\") return null;\n\n const error = status.error;\n const errorText = error\n ? typeof error === \"string\"\n ? error\n : JSON.stringify(error)\n : null;\n\n if (!errorText) return null;\n\n const isCancelled = status.reason === \"cancelled\";\n const headerText = isCancelled ? \"Cancelled\" : \"Error\";\n\n return (\n <div className={cn(\"px-3\", className)} {...props}>\n <p className=\"text-xs font-medium text-destructive\">{headerText}</p>\n <p className=\"mt-0.5 text-xs text-destructive/80\">{errorText}</p>\n </div>\n );\n}\n\n/**\n * The always-visible line under the header for a failed or paused call — the\n * failure's code and message, or the runtime's pause notice — so a reader\n * never has to expand a card to learn a step went wrong.\n */\nfunction ToolFallbackNotice({\n classification,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & { classification: ToolResultClassification }) {\n if (classification.state === \"error\") {\n const { failure } = classification;\n return (\n <div\n data-slot=\"tool-fallback-notice\"\n className={cn(\n \"mt-2 border-t border-red-200/80 px-3 pt-1.5 text-[11px] text-red-700\",\n className,\n )}\n {...props}\n >\n <span className=\"font-medium\">{failure.code ? `${failure.code}: ` : \"Error: \"}</span>\n {failure.message}\n </div>\n );\n }\n if (classification.state === \"paused\") {\n return (\n <div\n data-slot=\"tool-fallback-notice\"\n className={cn(\n \"mt-2 border-t border-amber-200/80 px-3 pt-1.5 text-[11px] text-amber-800\",\n className,\n )}\n {...props}\n >\n {classification.notice}\n </div>\n );\n }\n return null;\n}\n\n// ─── Asset Tool Card ────────────────────────────────────────────────\n\nfunction AssetToolCard({\n toolName,\n argsText,\n result,\n status,\n classification,\n context,\n displayName,\n activeLabel,\n icon,\n hideInternalIdArgs,\n action,\n notice,\n renderResult,\n onOpenAsset,\n children,\n defaultOpen,\n className,\n rootProps,\n}: {\n toolName: string;\n argsText?: string;\n result?: unknown;\n status?: ToolCallMessagePartStatus;\n classification: ToolResultClassification;\n context: ToolFallbackContext;\n displayName?: string;\n activeLabel?: string;\n icon?: ElementType;\n hideInternalIdArgs?: boolean;\n /** The host's `extraAction`, already resolved against the context. */\n action?: ReactNode;\n notice?: ReactNode;\n renderResult?: ToolFallbackOptions[\"renderResult\"];\n onOpenAsset?: ToolFallbackOptions[\"onOpenAsset\"];\n children?: ReactNode;\n defaultOpen?: boolean;\n className?: string;\n rootProps?: ToolFallbackOptions[\"rootProps\"];\n}) {\n const [detailsOpen, setDetailsOpen] = useState(defaultOpen ?? false);\n const openAsset = useOpenAsset(onOpenAsset);\n const meta = getToolDisplayMeta(toolName);\n const ToolIcon = icon ?? toolIcon(meta.icon);\n const title = displayName ?? meta.displayName;\n const state = classification.state;\n const isRunning = state === \"running\";\n const isCancelled = status?.type === \"incomplete\" && status.reason === \"cancelled\";\n const assetId = extractAssetId(result);\n const assetTitle = extractTitle(argsText, result);\n const assetType = toolMetaToAssetType(toolName);\n const rejection = rejectedOutcome(classification);\n\n return (\n <div\n {...rootProps}\n data-slot=\"tool-fallback-root\"\n data-tool-outcome={state}\n className={cn(\n \"aui-tool-fallback-root my-3 w-full rounded-xl border border-border/60 bg-background py-2.5 shadow-sm\",\n isCancelled && \"border-muted-foreground/30 bg-muted/30\",\n className,\n )}\n >\n <div className=\"flex items-center gap-2.5 px-3 text-sm\">\n <div\n className={cn(\n \"flex size-7 shrink-0 items-center justify-center rounded-lg\",\n isRunning && \"bg-blue-50 text-blue-600\",\n state === \"complete\" && \"bg-emerald-50 text-emerald-600\",\n state === \"error\" && \"bg-red-50 text-red-500\",\n state === \"rejected\" && \"bg-amber-50 text-amber-500\",\n )}\n >\n {isRunning ? (\n <LoaderIcon className=\"size-3.5 animate-spin\" />\n ) : rejection ? (\n <XCircleIcon className=\"size-3.5\" />\n ) : state === \"error\" ? (\n <AlertCircleIcon className=\"size-3.5\" />\n ) : (\n <ToolIcon className=\"size-3.5\" />\n )}\n </div>\n\n <div className=\"flex min-w-0 grow flex-col items-start gap-0.5 text-left\">\n <span className=\"leading-tight font-medium\">\n {isRunning\n ? `${activeLabel ?? meta.activeLabel}...`\n : rejection\n ? toolStatusLabel(toolName, \"rejected\", displayName)\n : state === \"error\"\n ? `Failed: ${title}`\n : title}\n </span>\n {!isRunning && assetTitle && (\n <span className=\"max-w-full truncate text-xs leading-snug text-muted-foreground\">\n {assetTitle}\n </span>\n )}\n </div>\n\n {assetId && state === \"complete\" && CREATE_ASSET_TOOLS.includes(toolName.toLowerCase()) && (\n <button\n type=\"button\"\n onClick={() => openAsset(assetId, { name: assetTitle ?? undefined, type: assetType })}\n className=\"flex shrink-0 items-center gap-1 rounded-md border border-border/60 px-2 py-0.5 text-[11px] font-medium text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n >\n <ExternalLinkIcon className=\"size-2.5\" />\n Open\n </button>\n )}\n\n {action}\n\n {state === \"complete\" && (\n <CheckCircle2Icon className=\"size-3.5 shrink-0 text-emerald-500\" />\n )}\n\n {!isCancelled && (\n <button\n type=\"button\"\n onClick={() => setDetailsOpen((o) => !o)}\n className={cn(\n \"flex size-5 shrink-0 items-center justify-center rounded transition-all\",\n detailsOpen\n ? \"bg-primary/5 text-primary\"\n : \"text-muted-foreground/40 hover:bg-muted/50 hover:text-muted-foreground\",\n )}\n title=\"Show details\"\n >\n <ChevronDownIcon\n className={cn(\n \"size-3 transition-transform duration-200\",\n detailsOpen && \"rotate-180\",\n )}\n />\n </button>\n )}\n </div>\n\n {notice}\n <ToolFallbackNotice classification={classification} />\n\n {detailsOpen && !isCancelled && (\n <div className=\"mt-2.5 flex flex-col gap-2 border-t border-border/50 px-3 pt-2\">\n {children}\n <ToolFallbackArgs argsText={argsText} hideInternalIdArgs={hideInternalIdArgs} />\n {renderResult ? (\n renderResult(context)\n ) : (\n <ToolFallbackResult result={result} classification={classification} />\n )}\n <div className=\"flex justify-end pt-1\">\n <CopyToolSpecButton toolName={toolName} argsText={argsText} result={result} className=\"px-0 pb-0\" />\n </div>\n </div>\n )}\n </div>\n );\n}\n\n/** Subtle \"open in panel\" button for any tool that has an asset_id */\nfunction AssetOpenLink({\n assetId,\n toolName,\n onOpenAsset,\n}: {\n assetId: string;\n toolName: string;\n onOpenAsset?: ToolFallbackOptions[\"onOpenAsset\"];\n}) {\n const openAsset = useOpenAsset(onOpenAsset);\n const assetType = toolMetaToAssetType(toolName);\n return (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n openAsset(assetId, { type: assetType });\n }}\n className=\"flex size-5 shrink-0 items-center justify-center rounded text-muted-foreground/50 transition-colors hover:bg-muted/50 hover:text-foreground\"\n title=\"Open asset\"\n >\n <LinkIcon className=\"size-3\" />\n </button>\n );\n}\n\nconst ToolFallbackImpl = ({\n toolName,\n args,\n argsText,\n result,\n status,\n isError,\n displayName,\n activeLabel,\n icon,\n hideInternalIdArgs = true,\n extraAction,\n notice,\n renderResult,\n onOpenAsset,\n children,\n defaultOpen,\n className,\n rootProps,\n}: ToolFallbackProps) => {\n const classification = classifyToolResult({ status, result, isError });\n const isCancelled =\n status?.type === \"incomplete\" && status.reason === \"cancelled\";\n const nestedComponents = useNestedPtcComponents(ToolFallback);\n const resultAssetId = extractAssetId(result);\n const argsAssetId = extractAssetIdFromArgs(argsText);\n const assetId = resultAssetId ?? argsAssetId;\n const context: ToolFallbackContext = {\n toolName,\n args: (args as Record<string, unknown> | undefined) ?? undefined,\n argsText,\n result,\n status,\n classification,\n assetId,\n };\n const action = typeof extraAction === \"function\" ? extraAction(context) : extraAction;\n\n // Use compact AssetToolCard for asset-creating tools\n if (isAssetTool(toolName, result)) {\n return (\n <>\n <AssetToolCard\n toolName={toolName}\n argsText={argsText}\n result={result}\n status={status}\n classification={classification}\n context={context}\n displayName={displayName}\n activeLabel={activeLabel}\n icon={icon}\n hideInternalIdArgs={hideInternalIdArgs}\n action={action}\n notice={notice}\n renderResult={renderResult}\n onOpenAsset={onOpenAsset}\n defaultOpen={defaultOpen}\n className={className}\n rootProps={rootProps}\n >\n {children}\n </AssetToolCard>\n <NestedPtcMessages components={nestedComponents} />\n </>\n );\n }\n\n const isComplete = classification.state === \"complete\";\n\n return (\n <ToolFallbackRoot\n {...rootProps}\n defaultOpen={defaultOpen}\n className={cn(isCancelled && \"border-muted-foreground/30 bg-muted/30\", className)}\n >\n <div className=\"flex items-center\">\n <div className=\"min-w-0 flex-1\">\n <ToolFallbackTrigger\n toolName={toolName}\n argsText={argsText}\n result={result}\n status={status}\n classification={classification}\n displayName={displayName}\n activeLabel={activeLabel}\n icon={icon}\n />\n </div>\n {action ? <div className=\"shrink-0 pr-2\">{action}</div> : null}\n {assetId && isComplete && !action && (\n <div className=\"shrink-0 pr-2\">\n <AssetOpenLink assetId={assetId} toolName={toolName} onOpenAsset={onOpenAsset} />\n </div>\n )}\n </div>\n {notice}\n <ToolFallbackNotice classification={classification} />\n <ToolFallbackContent>\n {children}\n <ToolFallbackError status={status} />\n <ToolFallbackArgs\n argsText={argsText}\n hideInternalIdArgs={hideInternalIdArgs}\n className={cn(isCancelled && \"opacity-60\")}\n />\n {!isCancelled &&\n (renderResult ? (\n renderResult(context)\n ) : (\n <ToolFallbackResult result={result} classification={classification} />\n ))}\n <NestedPtcMessages components={nestedComponents} />\n {!isCancelled && (\n <div className=\"flex justify-end px-3 pt-1\">\n <CopyToolSpecButton\n toolName={toolName}\n argsText={argsText}\n result={result}\n className=\"px-0 pb-0\"\n />\n </div>\n )}\n </ToolFallbackContent>\n </ToolFallbackRoot>\n );\n};\n\nconst ToolFallback = memo(\n ToolFallbackImpl,\n) as unknown as ToolCallMessagePartComponent &\n ((props: ToolFallbackProps) => ReactNode) & {\n Root: typeof ToolFallbackRoot;\n Trigger: typeof ToolFallbackTrigger;\n Content: typeof ToolFallbackContent;\n Args: typeof ToolFallbackArgs;\n Result: typeof ToolFallbackResult;\n Error: typeof ToolFallbackError;\n Notice: typeof ToolFallbackNotice;\n };\n\nToolFallback.displayName = \"ToolFallback\";\nToolFallback.Root = ToolFallbackRoot;\nToolFallback.Trigger = ToolFallbackTrigger;\nToolFallback.Content = ToolFallbackContent;\nToolFallback.Args = ToolFallbackArgs;\nToolFallback.Result = ToolFallbackResult;\nToolFallback.Error = ToolFallbackError;\nToolFallback.Notice = ToolFallbackNotice;\n\nexport {\n ToolFallback,\n ToolFallbackRoot,\n ToolFallbackTrigger,\n ToolFallbackContent,\n ToolFallbackArgs,\n ToolFallbackResult,\n ToolFallbackError,\n ToolFallbackNotice,\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -12,11 +12,12 @@ require("../packages/agent-runtime/src/statewire-state.cjs");
|
|
|
12
12
|
require("../packages/agent-runtime/src/messages.cjs");
|
|
13
13
|
require("@assistant-ui/react-statewire");
|
|
14
14
|
require("@assistant-ui/store");
|
|
15
|
-
require("
|
|
15
|
+
require("../packages/agent-runtime/src/quota-safe-local-storage-session.cjs");
|
|
16
16
|
require("../packages/agent-runtime/src/statewire-attach-observer.cjs");
|
|
17
17
|
require("../packages/agent-runtime/src/thread-status.cjs");
|
|
18
18
|
const voicePresentation = require("../packages/agent-runtime/src/voice-presentation.cjs");
|
|
19
19
|
require("@assistant-ui/core");
|
|
20
|
+
require("../packages/agent-runtime/src/thread-handoff.cjs");
|
|
20
21
|
const lucideReact = require("lucide-react");
|
|
21
22
|
const cnfast = require("cnfast");
|
|
22
23
|
const VoiceUpdateCard = ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"voice-update-tool-ui.cjs","sources":["../../src/tools/voice-update-tool-ui.tsx"],"sourcesContent":["\"use client\";\n\nimport { makeAssistantToolUI } from \"@assistant-ui/react\";\nimport {\n describeVoiceUpdateToolCall,\n VOICE_UPDATE_TOOL_NAME,\n voiceUpdateStatusLabel,\n} from \"@athenaintel/agent-runtime\";\nimport { AudioLinesIcon, LoaderIcon, MessageSquareTextIcon } from \"lucide-react\";\nimport type { FC } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport interface VoiceUpdateCardProps {\n /** The update's words. */\n text: string;\n /** Read aloud to the user (`mode: \"speak\"`) vs. a silent progress note. */\n spoken: boolean;\n /** \"Said aloud\", \"Noting progress…\", \"Could not say this to you\", … */\n statusLabel: string;\n /** The live session refused or never received the update. */\n failed: boolean;\n /** The tool call is still running. */\n pending: boolean;\n className?: string;\n}\n\n/**\n * The card for a delegated run's interim voice update (`send_voice_update`):\n * one line saying whether the words were said aloud or noted silently, and\n * the words themselves — instead of a generic tool row with JSON arguments.\n * Shared by every surface so the same update reads the same everywhere.\n */\nexport const VoiceUpdateCard: FC<VoiceUpdateCardProps> = ({\n text,\n spoken,\n statusLabel,\n failed,\n pending,\n className,\n}) => {\n const Icon = pending ? LoaderIcon : spoken ? AudioLinesIcon : MessageSquareTextIcon;\n return (\n <div\n className={cn(\n \"my-1 flex items-start gap-2 rounded-lg border px-3 py-2 text-sm\",\n failed\n ? \"border-amber-200 bg-amber-50 text-amber-900\"\n : \"border-primary/20 bg-primary/5 text-foreground\",\n className,\n )}\n data-testid=\"voice-update-card\"\n data-voice-update-spoken={spoken ? \"true\" : \"false\"}\n data-voice-update-failed={failed ? \"true\" : \"false\"}\n >\n <Icon\n className={cn(\n \"mt-0.5 size-3.5 shrink-0\",\n pending && \"animate-spin\",\n failed ? \"text-amber-700\" : \"text-primary\",\n )}\n aria-hidden\n />\n <div className=\"min-w-0 flex-1\">\n <div\n className={cn(\n \"text-[10px] font-medium uppercase tracking-wide\",\n failed ? \"text-amber-700\" : \"text-primary\",\n )}\n >\n {statusLabel}\n </div>\n {text ? <div className=\"whitespace-pre-wrap break-words\">{text}</div> : null}\n </div>\n </div>\n );\n};\n\n/**\n * The `send_voice_update` tool UI. Registered by every host that renders\n * deep-agent threads (Olympus, the Chrome side panel; mobile has its own\n * React Native presenter over the same shared description).\n */\nexport const VoiceUpdateToolUI = makeAssistantToolUI<Record<string, unknown>, unknown>({\n toolName: VOICE_UPDATE_TOOL_NAME,\n render: ({ args, result, status }) => {\n const call = describeVoiceUpdateToolCall({ args, result });\n return (\n <VoiceUpdateCard\n text={call.text}\n spoken={call.spoken}\n statusLabel={voiceUpdateStatusLabel(call, status?.type)}\n failed={call.delivered === false || status?.type === \"incomplete\"}\n pending={status?.type === \"running\"}\n />\n );\n },\n});\n"],"names":["LoaderIcon","AudioLinesIcon","MessageSquareTextIcon","jsxs","cn","jsx","makeAssistantToolUI","VOICE_UPDATE_TOOL_NAME","describeVoiceUpdateToolCall","voiceUpdateStatusLabel"],"mappings":"
|
|
1
|
+
{"version":3,"file":"voice-update-tool-ui.cjs","sources":["../../src/tools/voice-update-tool-ui.tsx"],"sourcesContent":["\"use client\";\n\nimport { makeAssistantToolUI } from \"@assistant-ui/react\";\nimport {\n describeVoiceUpdateToolCall,\n VOICE_UPDATE_TOOL_NAME,\n voiceUpdateStatusLabel,\n} from \"@athenaintel/agent-runtime\";\nimport { AudioLinesIcon, LoaderIcon, MessageSquareTextIcon } from \"lucide-react\";\nimport type { FC } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport interface VoiceUpdateCardProps {\n /** The update's words. */\n text: string;\n /** Read aloud to the user (`mode: \"speak\"`) vs. a silent progress note. */\n spoken: boolean;\n /** \"Said aloud\", \"Noting progress…\", \"Could not say this to you\", … */\n statusLabel: string;\n /** The live session refused or never received the update. */\n failed: boolean;\n /** The tool call is still running. */\n pending: boolean;\n className?: string;\n}\n\n/**\n * The card for a delegated run's interim voice update (`send_voice_update`):\n * one line saying whether the words were said aloud or noted silently, and\n * the words themselves — instead of a generic tool row with JSON arguments.\n * Shared by every surface so the same update reads the same everywhere.\n */\nexport const VoiceUpdateCard: FC<VoiceUpdateCardProps> = ({\n text,\n spoken,\n statusLabel,\n failed,\n pending,\n className,\n}) => {\n const Icon = pending ? LoaderIcon : spoken ? AudioLinesIcon : MessageSquareTextIcon;\n return (\n <div\n className={cn(\n \"my-1 flex items-start gap-2 rounded-lg border px-3 py-2 text-sm\",\n failed\n ? \"border-amber-200 bg-amber-50 text-amber-900\"\n : \"border-primary/20 bg-primary/5 text-foreground\",\n className,\n )}\n data-testid=\"voice-update-card\"\n data-voice-update-spoken={spoken ? \"true\" : \"false\"}\n data-voice-update-failed={failed ? \"true\" : \"false\"}\n >\n <Icon\n className={cn(\n \"mt-0.5 size-3.5 shrink-0\",\n pending && \"animate-spin\",\n failed ? \"text-amber-700\" : \"text-primary\",\n )}\n aria-hidden\n />\n <div className=\"min-w-0 flex-1\">\n <div\n className={cn(\n \"text-[10px] font-medium uppercase tracking-wide\",\n failed ? \"text-amber-700\" : \"text-primary\",\n )}\n >\n {statusLabel}\n </div>\n {text ? <div className=\"whitespace-pre-wrap break-words\">{text}</div> : null}\n </div>\n </div>\n );\n};\n\n/**\n * The `send_voice_update` tool UI. Registered by every host that renders\n * deep-agent threads (Olympus, the Chrome side panel; mobile has its own\n * React Native presenter over the same shared description).\n */\nexport const VoiceUpdateToolUI = makeAssistantToolUI<Record<string, unknown>, unknown>({\n toolName: VOICE_UPDATE_TOOL_NAME,\n render: ({ args, result, status }) => {\n const call = describeVoiceUpdateToolCall({ args, result });\n return (\n <VoiceUpdateCard\n text={call.text}\n spoken={call.spoken}\n statusLabel={voiceUpdateStatusLabel(call, status?.type)}\n failed={call.delivered === false || status?.type === \"incomplete\"}\n pending={status?.type === \"running\"}\n />\n );\n },\n});\n"],"names":["LoaderIcon","AudioLinesIcon","MessageSquareTextIcon","jsxs","cn","jsx","makeAssistantToolUI","VOICE_UPDATE_TOOL_NAME","describeVoiceUpdateToolCall","voiceUpdateStatusLabel"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAgCO,MAAM,kBAA4C,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,OAAO,UAAUA,YAAAA,aAAa,SAASC,YAAAA,iBAAiBC,YAAAA;AAC9D,SACEC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,OAAAA;AAAAA,QACT;AAAA,QACA,SACI,gDACA;AAAA,QACJ;AAAA,MAAA;AAAA,MAEF,eAAY;AAAA,MACZ,4BAA0B,SAAS,SAAS;AAAA,MAC5C,4BAA0B,SAAS,SAAS;AAAA,MAE5C,UAAA;AAAA,QAAAC,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD,OAAAA;AAAAA,cACT;AAAA,cACA,WAAW;AAAA,cACX,SAAS,mBAAmB;AAAA,YAAA;AAAA,YAE9B,eAAW;AAAA,UAAA;AAAA,QAAA;AAAA,QAEbD,2BAAAA,KAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,UAAAE,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWD,OAAAA;AAAAA,gBACT;AAAA,gBACA,SAAS,mBAAmB;AAAA,cAAA;AAAA,cAG7B,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAEF,OAAOC,2BAAAA,IAAC,OAAA,EAAI,WAAU,mCAAmC,gBAAK,IAAS;AAAA,QAAA,EAAA,CAC1E;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AAOO,MAAM,oBAAoBC,MAAAA,oBAAsD;AAAA,EACrF,UAAUC,kBAAAA;AAAAA,EACV,QAAQ,CAAC,EAAE,MAAM,QAAQ,aAAa;AACpC,UAAM,OAAOC,kBAAAA,4BAA4B,EAAE,MAAM,QAAQ;AACzD,WACEH,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAM,KAAK;AAAA,QACX,QAAQ,KAAK;AAAA,QACb,aAAaI,kBAAAA,uBAAuB,MAAM,iCAAQ,IAAI;AAAA,QACtD,QAAQ,KAAK,cAAc,UAAS,iCAAQ,UAAS;AAAA,QACrD,UAAS,iCAAQ,UAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EAGhC;AACF,CAAC;;;"}
|
|
@@ -10,11 +10,12 @@ import "../packages/agent-runtime/src/statewire-state.js";
|
|
|
10
10
|
import "../packages/agent-runtime/src/messages.js";
|
|
11
11
|
import "@assistant-ui/react-statewire";
|
|
12
12
|
import "@assistant-ui/store";
|
|
13
|
-
import "
|
|
13
|
+
import "../packages/agent-runtime/src/quota-safe-local-storage-session.js";
|
|
14
14
|
import "../packages/agent-runtime/src/statewire-attach-observer.js";
|
|
15
15
|
import "../packages/agent-runtime/src/thread-status.js";
|
|
16
16
|
import { VOICE_UPDATE_TOOL_NAME, describeVoiceUpdateToolCall, voiceUpdateStatusLabel } from "../packages/agent-runtime/src/voice-presentation.js";
|
|
17
17
|
import "@assistant-ui/core";
|
|
18
|
+
import "../packages/agent-runtime/src/thread-handoff.js";
|
|
18
19
|
import { LoaderIcon, AudioLinesIcon, MessageSquareTextIcon } from "lucide-react";
|
|
19
20
|
import { cn } from "cnfast";
|
|
20
21
|
const VoiceUpdateCard = ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"voice-update-tool-ui.js","sources":["../../src/tools/voice-update-tool-ui.tsx"],"sourcesContent":["\"use client\";\n\nimport { makeAssistantToolUI } from \"@assistant-ui/react\";\nimport {\n describeVoiceUpdateToolCall,\n VOICE_UPDATE_TOOL_NAME,\n voiceUpdateStatusLabel,\n} from \"@athenaintel/agent-runtime\";\nimport { AudioLinesIcon, LoaderIcon, MessageSquareTextIcon } from \"lucide-react\";\nimport type { FC } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport interface VoiceUpdateCardProps {\n /** The update's words. */\n text: string;\n /** Read aloud to the user (`mode: \"speak\"`) vs. a silent progress note. */\n spoken: boolean;\n /** \"Said aloud\", \"Noting progress…\", \"Could not say this to you\", … */\n statusLabel: string;\n /** The live session refused or never received the update. */\n failed: boolean;\n /** The tool call is still running. */\n pending: boolean;\n className?: string;\n}\n\n/**\n * The card for a delegated run's interim voice update (`send_voice_update`):\n * one line saying whether the words were said aloud or noted silently, and\n * the words themselves — instead of a generic tool row with JSON arguments.\n * Shared by every surface so the same update reads the same everywhere.\n */\nexport const VoiceUpdateCard: FC<VoiceUpdateCardProps> = ({\n text,\n spoken,\n statusLabel,\n failed,\n pending,\n className,\n}) => {\n const Icon = pending ? LoaderIcon : spoken ? AudioLinesIcon : MessageSquareTextIcon;\n return (\n <div\n className={cn(\n \"my-1 flex items-start gap-2 rounded-lg border px-3 py-2 text-sm\",\n failed\n ? \"border-amber-200 bg-amber-50 text-amber-900\"\n : \"border-primary/20 bg-primary/5 text-foreground\",\n className,\n )}\n data-testid=\"voice-update-card\"\n data-voice-update-spoken={spoken ? \"true\" : \"false\"}\n data-voice-update-failed={failed ? \"true\" : \"false\"}\n >\n <Icon\n className={cn(\n \"mt-0.5 size-3.5 shrink-0\",\n pending && \"animate-spin\",\n failed ? \"text-amber-700\" : \"text-primary\",\n )}\n aria-hidden\n />\n <div className=\"min-w-0 flex-1\">\n <div\n className={cn(\n \"text-[10px] font-medium uppercase tracking-wide\",\n failed ? \"text-amber-700\" : \"text-primary\",\n )}\n >\n {statusLabel}\n </div>\n {text ? <div className=\"whitespace-pre-wrap break-words\">{text}</div> : null}\n </div>\n </div>\n );\n};\n\n/**\n * The `send_voice_update` tool UI. Registered by every host that renders\n * deep-agent threads (Olympus, the Chrome side panel; mobile has its own\n * React Native presenter over the same shared description).\n */\nexport const VoiceUpdateToolUI = makeAssistantToolUI<Record<string, unknown>, unknown>({\n toolName: VOICE_UPDATE_TOOL_NAME,\n render: ({ args, result, status }) => {\n const call = describeVoiceUpdateToolCall({ args, result });\n return (\n <VoiceUpdateCard\n text={call.text}\n spoken={call.spoken}\n statusLabel={voiceUpdateStatusLabel(call, status?.type)}\n failed={call.delivered === false || status?.type === \"incomplete\"}\n pending={status?.type === \"running\"}\n />\n );\n },\n});\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"voice-update-tool-ui.js","sources":["../../src/tools/voice-update-tool-ui.tsx"],"sourcesContent":["\"use client\";\n\nimport { makeAssistantToolUI } from \"@assistant-ui/react\";\nimport {\n describeVoiceUpdateToolCall,\n VOICE_UPDATE_TOOL_NAME,\n voiceUpdateStatusLabel,\n} from \"@athenaintel/agent-runtime\";\nimport { AudioLinesIcon, LoaderIcon, MessageSquareTextIcon } from \"lucide-react\";\nimport type { FC } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport interface VoiceUpdateCardProps {\n /** The update's words. */\n text: string;\n /** Read aloud to the user (`mode: \"speak\"`) vs. a silent progress note. */\n spoken: boolean;\n /** \"Said aloud\", \"Noting progress…\", \"Could not say this to you\", … */\n statusLabel: string;\n /** The live session refused or never received the update. */\n failed: boolean;\n /** The tool call is still running. */\n pending: boolean;\n className?: string;\n}\n\n/**\n * The card for a delegated run's interim voice update (`send_voice_update`):\n * one line saying whether the words were said aloud or noted silently, and\n * the words themselves — instead of a generic tool row with JSON arguments.\n * Shared by every surface so the same update reads the same everywhere.\n */\nexport const VoiceUpdateCard: FC<VoiceUpdateCardProps> = ({\n text,\n spoken,\n statusLabel,\n failed,\n pending,\n className,\n}) => {\n const Icon = pending ? LoaderIcon : spoken ? AudioLinesIcon : MessageSquareTextIcon;\n return (\n <div\n className={cn(\n \"my-1 flex items-start gap-2 rounded-lg border px-3 py-2 text-sm\",\n failed\n ? \"border-amber-200 bg-amber-50 text-amber-900\"\n : \"border-primary/20 bg-primary/5 text-foreground\",\n className,\n )}\n data-testid=\"voice-update-card\"\n data-voice-update-spoken={spoken ? \"true\" : \"false\"}\n data-voice-update-failed={failed ? \"true\" : \"false\"}\n >\n <Icon\n className={cn(\n \"mt-0.5 size-3.5 shrink-0\",\n pending && \"animate-spin\",\n failed ? \"text-amber-700\" : \"text-primary\",\n )}\n aria-hidden\n />\n <div className=\"min-w-0 flex-1\">\n <div\n className={cn(\n \"text-[10px] font-medium uppercase tracking-wide\",\n failed ? \"text-amber-700\" : \"text-primary\",\n )}\n >\n {statusLabel}\n </div>\n {text ? <div className=\"whitespace-pre-wrap break-words\">{text}</div> : null}\n </div>\n </div>\n );\n};\n\n/**\n * The `send_voice_update` tool UI. Registered by every host that renders\n * deep-agent threads (Olympus, the Chrome side panel; mobile has its own\n * React Native presenter over the same shared description).\n */\nexport const VoiceUpdateToolUI = makeAssistantToolUI<Record<string, unknown>, unknown>({\n toolName: VOICE_UPDATE_TOOL_NAME,\n render: ({ args, result, status }) => {\n const call = describeVoiceUpdateToolCall({ args, result });\n return (\n <VoiceUpdateCard\n text={call.text}\n spoken={call.spoken}\n statusLabel={voiceUpdateStatusLabel(call, status?.type)}\n failed={call.delivered === false || status?.type === \"incomplete\"}\n pending={status?.type === \"running\"}\n />\n );\n },\n});\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAgCO,MAAM,kBAA4C,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,OAAO,UAAU,aAAa,SAAS,iBAAiB;AAC9D,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,SACI,gDACA;AAAA,QACJ;AAAA,MAAA;AAAA,MAEF,eAAY;AAAA,MACZ,4BAA0B,SAAS,SAAS;AAAA,MAC5C,4BAA0B,SAAS,SAAS;AAAA,MAE5C,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,WAAW;AAAA,cACX,SAAS,mBAAmB;AAAA,YAAA;AAAA,YAE9B,eAAW;AAAA,UAAA;AAAA,QAAA;AAAA,QAEb,qBAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,SAAS,mBAAmB;AAAA,cAAA;AAAA,cAG7B,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAEF,OAAO,oBAAC,OAAA,EAAI,WAAU,mCAAmC,gBAAK,IAAS;AAAA,QAAA,EAAA,CAC1E;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AAOO,MAAM,oBAAoB,oBAAsD;AAAA,EACrF,UAAU;AAAA,EACV,QAAQ,CAAC,EAAE,MAAM,QAAQ,aAAa;AACpC,UAAM,OAAO,4BAA4B,EAAE,MAAM,QAAQ;AACzD,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAM,KAAK;AAAA,QACX,QAAQ,KAAK;AAAA,QACb,aAAa,uBAAuB,MAAM,iCAAQ,IAAI;AAAA,QACtD,QAAQ,KAAK,cAAc,UAAS,iCAAQ,UAAS;AAAA,QACrD,UAAS,iCAAQ,UAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EAGhC;AACF,CAAC;"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const useAthenaVoiceSession = require("./use-athena-voice-session.cjs");
|
|
4
|
+
exports.createAthenaVoiceSession = useAthenaVoiceSession.createAthenaVoiceSession;
|
|
5
|
+
exports.useAthenaVoiceSession = useAthenaVoiceSession.useAthenaVoiceSession;
|
|
6
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { createAthenaVoiceSession, useAthenaVoiceSession, } from './use-athena-voice-session';
|
|
2
|
+
export type { AthenaVoiceSessionConfig, AthenaVoiceSessionCredentials, AthenaVoiceSessionStatus, AthenaVoiceSpeaker, AthenaVoiceTranscriptTurn, UseAthenaVoiceSessionOptions, UseAthenaVoiceSessionReturn, } from './use-athena-voice-session';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|