@athenaintel/react 0.23.2 → 0.24.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 +46 -1
- package/dist/assets/AssetPanel.cjs +1 -1
- package/dist/assets/AssetPanel.cjs.map +1 -1
- package/dist/assets/AssetPanel.js +1 -1
- package/dist/assets/AssetPanel.js.map +1 -1
- package/dist/assets/AthenaAssetEmbed.cjs +1 -1
- package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
- package/dist/assets/AthenaAssetEmbed.js +1 -1
- package/dist/assets/AthenaAssetEmbed.js.map +1 -1
- package/dist/chat/AthenaChat.cjs +138 -46
- package/dist/chat/AthenaChat.cjs.map +1 -1
- package/dist/chat/AthenaChat.d.ts +37 -1
- package/dist/chat/AthenaChat.js +139 -47
- package/dist/chat/AthenaChat.js.map +1 -1
- package/dist/chat/StatewireApprovalCard.cjs +3 -18
- package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
- package/dist/chat/StatewireApprovalCard.js +3 -18
- package/dist/chat/StatewireApprovalCard.js.map +1 -1
- package/dist/chat/StatewireClientToolBridge.cjs +2 -16
- package/dist/chat/StatewireClientToolBridge.cjs.map +1 -1
- package/dist/chat/StatewireClientToolBridge.js +2 -16
- package/dist/chat/StatewireClientToolBridge.js.map +1 -1
- package/dist/chat/StatewireQueuedMessages.cjs +5 -16
- package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
- package/dist/chat/StatewireQueuedMessages.js +5 -16
- package/dist/chat/StatewireQueuedMessages.js.map +1 -1
- package/dist/chat/WaitingOnYouBanner.cjs +3 -18
- package/dist/chat/WaitingOnYouBanner.cjs.map +1 -1
- package/dist/chat/WaitingOnYouBanner.js +3 -18
- package/dist/chat/WaitingOnYouBanner.js.map +1 -1
- package/dist/chat/athena-composer-controls.js +1 -1
- package/dist/chat/run-activity.cjs +0 -16
- package/dist/chat/run-activity.cjs.map +1 -1
- package/dist/chat/run-activity.js +0 -16
- package/dist/chat/run-activity.js.map +1 -1
- package/dist/chat/statewire-client-tools.cjs +21 -17
- package/dist/chat/statewire-client-tools.cjs.map +1 -1
- package/dist/chat/statewire-client-tools.d.ts +27 -0
- package/dist/chat/statewire-client-tools.js +21 -17
- package/dist/chat/statewire-client-tools.js.map +1 -1
- package/dist/chat/super-grouping/activity-timeline.cjs +0 -16
- package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
- package/dist/chat/super-grouping/activity-timeline.js +0 -16
- package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
- package/dist/chat/tiptap-text.cjs +1 -17
- package/dist/chat/tiptap-text.cjs.map +1 -1
- package/dist/chat/tiptap-text.js +1 -17
- package/dist/chat/tiptap-text.js.map +1 -1
- package/dist/chat/use-athena-run-live.cjs +0 -15
- package/dist/chat/use-athena-run-live.cjs.map +1 -1
- package/dist/chat/use-athena-run-live.d.ts +7 -0
- package/dist/chat/use-athena-run-live.js +0 -15
- package/dist/chat/use-athena-run-live.js.map +1 -1
- package/dist/chat/use-statewire-approval-request.cjs +4 -16
- package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
- package/dist/chat/use-statewire-approval-request.d.ts +2 -0
- package/dist/chat/use-statewire-approval-request.js +4 -16
- package/dist/chat/use-statewire-approval-request.js.map +1 -1
- package/dist/chat-ui/composer/tiptap-composer.cjs +17 -17
- package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
- package/dist/chat-ui/composer/tiptap-composer.js +17 -17
- package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
- package/dist/chat-ui/index.cjs +0 -16
- package/dist/chat-ui/index.cjs.map +1 -1
- package/dist/chat-ui/index.js +0 -16
- package/dist/chat-ui/index.js.map +1 -1
- package/dist/chat-ui/mentions/mention-chip.cjs +1 -16
- package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
- package/dist/chat-ui/mentions/mention-chip.js +1 -16
- package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.cjs +4 -6
- package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.js +4 -6
- package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +2 -9
- package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/sources/index.js +2 -9
- package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
- package/dist/chat-ui/messages/message-components.cjs +5 -19
- package/dist/chat-ui/messages/message-components.cjs.map +1 -1
- package/dist/chat-ui/messages/message-components.js +5 -19
- package/dist/chat-ui/messages/message-components.js.map +1 -1
- package/dist/chat-ui/messages/runtime-message.cjs +1 -16
- package/dist/chat-ui/messages/runtime-message.cjs.map +1 -1
- package/dist/chat-ui/messages/runtime-message.js +1 -16
- package/dist/chat-ui/messages/runtime-message.js.map +1 -1
- package/dist/chat-ui/messages/statewire-continue-run.cjs +3 -15
- package/dist/chat-ui/messages/statewire-continue-run.cjs.map +1 -1
- package/dist/chat-ui/messages/statewire-continue-run.js +3 -15
- package/dist/chat-ui/messages/statewire-continue-run.js.map +1 -1
- package/dist/chat-ui/messages/user-edit-composer.cjs +0 -16
- package/dist/chat-ui/messages/user-edit-composer.cjs.map +1 -1
- package/dist/chat-ui/messages/user-edit-composer.js +0 -16
- package/dist/chat-ui/messages/user-edit-composer.js.map +1 -1
- package/dist/chat-ui/messages/wake-marker.cjs +1 -16
- package/dist/chat-ui/messages/wake-marker.cjs.map +1 -1
- package/dist/chat-ui/messages/wake-marker.js +1 -16
- package/dist/chat-ui/messages/wake-marker.js.map +1 -1
- package/dist/chat-ui/statewire.cjs +0 -16
- package/dist/chat-ui/statewire.cjs.map +1 -1
- package/dist/chat-ui/statewire.js +0 -16
- package/dist/chat-ui/statewire.js.map +1 -1
- package/dist/chat-ui/thread/statewire-history-edge.cjs +2 -17
- package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
- package/dist/chat-ui/thread/statewire-history-edge.js +2 -17
- package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
- package/dist/composer/composer-handoff.cjs +121 -0
- package/dist/composer/composer-handoff.cjs.map +1 -0
- package/dist/composer/composer-handoff.d.ts +89 -0
- package/dist/composer/composer-handoff.js +121 -0
- package/dist/composer/composer-handoff.js.map +1 -0
- package/dist/composer/index.d.ts +2 -0
- package/dist/composer/useAppendToComposer.cjs +19 -7
- package/dist/composer/useAppendToComposer.cjs.map +1 -1
- package/dist/composer/useAppendToComposer.d.ts +22 -4
- package/dist/composer/useAppendToComposer.js +20 -8
- package/dist/composer/useAppendToComposer.js.map +1 -1
- package/dist/composer/useSendMessage.cjs +26 -8
- package/dist/composer/useSendMessage.cjs.map +1 -1
- package/dist/composer/useSendMessage.d.ts +8 -0
- package/dist/composer/useSendMessage.js +27 -9
- package/dist/composer/useSendMessage.js.map +1 -1
- package/dist/diagnostics/athena-diagnostics.cjs.map +1 -1
- package/dist/diagnostics/athena-diagnostics.d.ts +1 -1
- package/dist/diagnostics/athena-diagnostics.js.map +1 -1
- package/dist/diagnostics/errors.cjs +2 -0
- package/dist/diagnostics/errors.cjs.map +1 -1
- package/dist/diagnostics/errors.d.ts +2 -0
- package/dist/diagnostics/errors.js +2 -0
- package/dist/diagnostics/errors.js.map +1 -1
- package/dist/dictation/DictationStrip.cjs +61 -0
- package/dist/dictation/DictationStrip.cjs.map +1 -0
- package/dist/dictation/DictationStrip.d.ts +27 -0
- package/dist/dictation/DictationStrip.js +61 -0
- package/dist/dictation/DictationStrip.js.map +1 -0
- package/dist/dictation/audio-level-history.cjs +68 -0
- package/dist/dictation/audio-level-history.cjs.map +1 -0
- package/dist/dictation/audio-level-history.d.ts +27 -0
- package/dist/dictation/audio-level-history.js +68 -0
- package/dist/dictation/audio-level-history.js.map +1 -0
- package/dist/dictation/dictation-controls.cjs +60 -0
- package/dist/dictation/dictation-controls.cjs.map +1 -0
- package/dist/dictation/dictation-controls.d.ts +15 -0
- package/dist/dictation/dictation-controls.js +60 -0
- package/dist/dictation/dictation-controls.js.map +1 -0
- package/dist/dictation/dictation-engine.cjs +128 -0
- package/dist/dictation/dictation-engine.cjs.map +1 -0
- package/dist/dictation/dictation-engine.d.ts +95 -0
- package/dist/dictation/dictation-engine.js +128 -0
- package/dist/dictation/dictation-engine.js.map +1 -0
- package/dist/dictation/dictation-state.cjs +68 -0
- package/dist/dictation/dictation-state.cjs.map +1 -0
- package/dist/dictation/dictation-state.d.ts +58 -0
- package/dist/dictation/dictation-state.js +68 -0
- package/dist/dictation/dictation-state.js.map +1 -0
- package/dist/dictation/recorded-dictation-engine.cjs +153 -0
- package/dist/dictation/recorded-dictation-engine.cjs.map +1 -0
- package/dist/dictation/recorded-dictation-engine.d.ts +66 -0
- package/dist/dictation/recorded-dictation-engine.js +153 -0
- package/dist/dictation/recorded-dictation-engine.js.map +1 -0
- package/dist/dictation/use-athena-dictation-engine.cjs +64 -0
- package/dist/dictation/use-athena-dictation-engine.cjs.map +1 -0
- package/dist/dictation/use-athena-dictation-engine.d.ts +25 -0
- package/dist/dictation/use-athena-dictation-engine.js +64 -0
- package/dist/dictation/use-athena-dictation-engine.js.map +1 -0
- package/dist/dictation/use-dictation.cjs +215 -0
- package/dist/dictation/use-dictation.cjs.map +1 -0
- package/dist/dictation/use-dictation.d.ts +63 -0
- package/dist/dictation/use-dictation.js +215 -0
- package/dist/dictation/use-dictation.js.map +1 -0
- package/dist/index.cjs +41 -39
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +14 -0
- package/dist/index.js +23 -21
- package/dist/index.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/errors.cjs +18 -0
- package/dist/packages/agent-runtime/src/errors.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/errors.js +19 -1
- package/dist/packages/agent-runtime/src/errors.js.map +1 -1
- package/dist/packages/agent-runtime/src/generated/runconfig-contract.cjs +1 -0
- package/dist/packages/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/generated/runconfig-contract.js +1 -0
- package/dist/packages/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
- package/dist/packages/agent-runtime/src/interrupts.cjs +61 -12
- package/dist/packages/agent-runtime/src/interrupts.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/interrupts.js +61 -12
- package/dist/packages/agent-runtime/src/interrupts.js.map +1 -1
- package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.cjs +49 -0
- 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 +49 -0
- package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.js.map +1 -1
- package/dist/packages/agent-runtime/src/thread-status.js +1 -1
- package/dist/packages/agent-runtime/src/tool-metadata.cjs +1 -37
- package/dist/packages/agent-runtime/src/tool-metadata.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/tool-metadata.js +1 -37
- package/dist/packages/agent-runtime/src/tool-metadata.js.map +1 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-config.cjs +0 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-config.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-config.js +0 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-config.js.map +1 -1
- 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.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 +45 -20
- package/dist/provider/AthenaProvider.cjs.map +1 -1
- package/dist/provider/AthenaProvider.d.ts +1 -1
- package/dist/provider/AthenaProvider.js +46 -21
- package/dist/provider/AthenaProvider.js.map +1 -1
- package/dist/runtime/statewire-lifecycle.cjs +0 -16
- package/dist/runtime/statewire-lifecycle.cjs.map +1 -1
- package/dist/runtime/statewire-lifecycle.js +0 -16
- package/dist/runtime/statewire-lifecycle.js.map +1 -1
- package/dist/runtime/useAthenaStatewireRuntime.cjs +3 -17
- package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
- package/dist/runtime/useAthenaStatewireRuntime.js +3 -17
- package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/threads/statewire-thread-list.cjs +4 -17
- package/dist/threads/statewire-thread-list.cjs.map +1 -1
- package/dist/threads/statewire-thread-list.js +4 -17
- package/dist/threads/statewire-thread-list.js.map +1 -1
- package/dist/threads/use-rest-conversation-history.cjs +2 -16
- package/dist/threads/use-rest-conversation-history.cjs.map +1 -1
- package/dist/threads/use-rest-conversation-history.js +2 -16
- package/dist/threads/use-rest-conversation-history.js.map +1 -1
- package/dist/threads/use-statewire-conversation-history.cjs +2 -16
- package/dist/threads/use-statewire-conversation-history.cjs.map +1 -1
- package/dist/threads/use-statewire-conversation-history.js +2 -16
- package/dist/threads/use-statewire-conversation-history.js.map +1 -1
- package/dist/toolkits/index.cjs +0 -7
- package/dist/toolkits/index.cjs.map +1 -1
- package/dist/toolkits/index.d.ts +0 -2
- package/dist/toolkits/index.js +0 -7
- package/dist/toolkits/index.js.map +1 -1
- package/dist/tools/index.cjs +4 -20
- package/dist/tools/index.cjs.map +1 -1
- package/dist/tools/index.js +1 -17
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/misc-tool-uis.cjs +2 -17
- package/dist/tools/misc-tool-uis.cjs.map +1 -1
- package/dist/tools/misc-tool-uis.js +2 -17
- package/dist/tools/misc-tool-uis.js.map +1 -1
- package/dist/tools/primitives.cjs +1 -16
- package/dist/tools/primitives.cjs.map +1 -1
- package/dist/tools/primitives.js +1 -16
- package/dist/tools/primitives.js.map +1 -1
- package/dist/tools/tool-fallback.cjs +2 -17
- package/dist/tools/tool-fallback.cjs.map +1 -1
- package/dist/tools/tool-fallback.js +2 -17
- package/dist/tools/tool-fallback.js.map +1 -1
- package/dist/tools/voice-update-tool-ui.cjs +1 -17
- package/dist/tools/voice-update-tool-ui.cjs.map +1 -1
- package/dist/tools/voice-update-tool-ui.js +1 -17
- package/dist/tools/voice-update-tool-ui.js.map +1 -1
- package/package.json +1 -1
- package/dist/node_modules/qrcode-generator/dist/qrcode.cjs +0 -32
- package/dist/node_modules/qrcode-generator/dist/qrcode.cjs.map +0 -1
- package/dist/node_modules/qrcode-generator/dist/qrcode.js +0 -31
- package/dist/node_modules/qrcode-generator/dist/qrcode.js.map +0 -1
- package/dist/node_modules/zod/v4/classic/errors.cjs +0 -44
- package/dist/node_modules/zod/v4/classic/errors.cjs.map +0 -1
- package/dist/node_modules/zod/v4/classic/errors.js +0 -44
- package/dist/node_modules/zod/v4/classic/errors.js.map +0 -1
- package/dist/node_modules/zod/v4/classic/iso.cjs +0 -43
- package/dist/node_modules/zod/v4/classic/iso.cjs.map +0 -1
- package/dist/node_modules/zod/v4/classic/iso.js +0 -43
- package/dist/node_modules/zod/v4/classic/iso.js.map +0 -1
- package/dist/node_modules/zod/v4/classic/parse.cjs +0 -29
- package/dist/node_modules/zod/v4/classic/parse.cjs.map +0 -1
- package/dist/node_modules/zod/v4/classic/parse.js +0 -29
- package/dist/node_modules/zod/v4/classic/parse.js.map +0 -1
- package/dist/node_modules/zod/v4/classic/schemas.cjs +0 -871
- package/dist/node_modules/zod/v4/classic/schemas.cjs.map +0 -1
- package/dist/node_modules/zod/v4/classic/schemas.js +0 -871
- package/dist/node_modules/zod/v4/classic/schemas.js.map +0 -1
- package/dist/node_modules/zod/v4/core/api.cjs +0 -570
- package/dist/node_modules/zod/v4/core/api.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/api.js +0 -570
- package/dist/node_modules/zod/v4/core/api.js.map +0 -1
- package/dist/node_modules/zod/v4/core/checks.cjs +0 -411
- package/dist/node_modules/zod/v4/core/checks.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/checks.js +0 -411
- package/dist/node_modules/zod/v4/core/checks.js.map +0 -1
- package/dist/node_modules/zod/v4/core/core.cjs +0 -77
- package/dist/node_modules/zod/v4/core/core.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/core.js +0 -77
- package/dist/node_modules/zod/v4/core/core.js.map +0 -1
- package/dist/node_modules/zod/v4/core/doc.cjs +0 -38
- package/dist/node_modules/zod/v4/core/doc.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/doc.js +0 -38
- package/dist/node_modules/zod/v4/core/doc.js.map +0 -1
- package/dist/node_modules/zod/v4/core/errors.cjs +0 -76
- package/dist/node_modules/zod/v4/core/errors.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/errors.js +0 -76
- package/dist/node_modules/zod/v4/core/errors.js.map +0 -1
- package/dist/node_modules/zod/v4/core/json-schema-processors.cjs +0 -312
- package/dist/node_modules/zod/v4/core/json-schema-processors.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/json-schema-processors.js +0 -312
- package/dist/node_modules/zod/v4/core/json-schema-processors.js.map +0 -1
- package/dist/node_modules/zod/v4/core/parse.cjs +0 -96
- package/dist/node_modules/zod/v4/core/parse.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/parse.js +0 -96
- package/dist/node_modules/zod/v4/core/parse.js.map +0 -1
- package/dist/node_modules/zod/v4/core/regexes.cjs +0 -86
- package/dist/node_modules/zod/v4/core/regexes.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/regexes.js +0 -86
- package/dist/node_modules/zod/v4/core/regexes.js.map +0 -1
- package/dist/node_modules/zod/v4/core/registries.cjs +0 -52
- package/dist/node_modules/zod/v4/core/registries.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/registries.js +0 -52
- package/dist/node_modules/zod/v4/core/registries.js.map +0 -1
- package/dist/node_modules/zod/v4/core/schemas.cjs +0 -1412
- package/dist/node_modules/zod/v4/core/schemas.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/schemas.js +0 -1413
- package/dist/node_modules/zod/v4/core/schemas.js.map +0 -1
- package/dist/node_modules/zod/v4/core/to-json-schema.cjs +0 -370
- package/dist/node_modules/zod/v4/core/to-json-schema.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/to-json-schema.js +0 -370
- package/dist/node_modules/zod/v4/core/to-json-schema.js.map +0 -1
- package/dist/node_modules/zod/v4/core/util.cjs +0 -444
- package/dist/node_modules/zod/v4/core/util.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/util.js +0 -444
- package/dist/node_modules/zod/v4/core/util.js.map +0 -1
- package/dist/node_modules/zod/v4/core/versions.cjs +0 -9
- package/dist/node_modules/zod/v4/core/versions.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/versions.js +0 -9
- package/dist/node_modules/zod/v4/core/versions.js.map +0 -1
- package/dist/packages/agent-runtime/src/thread-handoff.cjs +0 -85
- package/dist/packages/agent-runtime/src/thread-handoff.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/thread-handoff.js +0 -85
- package/dist/packages/agent-runtime/src/thread-handoff.js.map +0 -1
|
@@ -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 CheckIcon,\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, type ToolCardProps, tryParseJson } from \"./primitives\";\nimport {\n ToolAppearanceContext,\n type ToolAppearance,\n type ToolAppearanceContextValue,\n useToolAppearance,\n} from \"./tool-appearance\";\nimport { toolIcon } from \"./tool-icons\";\nimport { elapsedSuffix, useElapsedSeconds } from \"./use-elapsed-seconds\";\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 * Two appearances (see {@link ToolAppearance}): the boxed `card` the hosts\n * above render by default, and the SDK thread's one-line `thread` row, chosen\n * per card through the `appearance` option or for a whole subtree through\n * {@link ToolFallbackAppearanceProvider}. The default markup is pinned by\n * `mount-tests/tool-fallback-default-markup.mount.test.tsx`.\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 * The anatomy to render with; defaults to the nearest\n * {@link ToolFallbackAppearanceProvider}, else `card` (the host card).\n */\n appearance?: ToolAppearance;\n}\n\nexport type ToolFallbackProps = ToolCallPartProps & ToolFallbackOptions;\n\n// ─── Thread appearance ───────────────────────────────────────────────\n\nconst THREAD_ROOT_CLASS =\n \"aui-tool-fallback-root group/tool-fallback-root my-1.5 w-full rounded-lg border border-border/50 bg-background\";\n\n/** The one-line row's status glyph: the same states as the card, without the tinted box. */\nfunction ThreadStatusGlyph({\n classification,\n isCancelled,\n}: {\n classification: ToolResultClassification;\n isCancelled: boolean;\n}) {\n const state = classification.state;\n const glyph =\n state === \"running\" ? (\n <LoaderIcon className=\"size-3.5 animate-spin text-muted-foreground motion-reduce:animate-none\" />\n ) : state === \"rejected\" ? (\n <XCircleIcon className=\"size-3.5 text-amber-600\" />\n ) : state === \"error\" ? (\n isCancelled ? (\n <XCircleIcon className=\"size-3.5 text-muted-foreground\" />\n ) : (\n <AlertCircleIcon className=\"size-3.5 text-destructive\" />\n )\n ) : state === \"paused\" ? (\n <PauseIcon className=\"size-3.5 text-amber-600\" />\n ) : state === \"requires-action\" ? (\n <ShieldAlertIcon className=\"size-3.5 text-amber-600\" />\n ) : (\n <CheckIcon className=\"size-3.5 text-emerald-600\" />\n );\n return (\n <span\n data-slot=\"tool-fallback-status\"\n data-tool-outcome={state}\n aria-hidden=\"true\"\n className=\"flex size-4 shrink-0 items-center justify-center\"\n >\n {glyph}\n </span>\n );\n}\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 appearance?: ToolAppearance;\n};\n\nfunction ToolFallbackRoot({\n className,\n open: controlledOpen,\n onOpenChange: controlledOnOpenChange,\n defaultOpen = false,\n appearance: appearanceProp,\n children,\n ...props\n}: ToolFallbackRootProps) {\n const appearance = useToolAppearance(appearanceProp);\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 {...(appearance === \"thread\" ? { \"data-appearance\": \"thread\" } : {})}\n open={isOpen}\n onOpenChange={handleOpenChange}\n className={cn(\n appearance === \"thread\"\n ? THREAD_ROOT_CLASS\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 appearance?: ToolAppearance;\n /** Replaces the derived target text (a result message or the args summary). */\n secondary?: string;\n /** A short count or state chip after the target (\"8 results\"). */\n badge?: string;\n}\n\nfunction ToolFallbackTrigger({\n toolName,\n argsText,\n result,\n status,\n isError,\n classification: givenClassification,\n displayName,\n activeLabel,\n icon,\n appearance: appearanceProp,\n secondary: secondaryProp,\n badge,\n className,\n ...props\n}: ToolFallbackTriggerProps) {\n const appearance = useToolAppearance(appearanceProp);\n const isThread = appearance === \"thread\";\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 const elapsed = elapsedSuffix(useElapsedSeconds(isThread && isRunning));\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 // The row names the target while the call runs too; the card waits for the\n // call to settle. Streaming arguments do not parse, so nothing shows early.\n const summary = useMemo(() => {\n if ((isRunning && !isThread) || !argsText) return null;\n const parsed = tryParseJson(argsText);\n return parsed ? (describeToolArgs({ toolName, args: parsed }) ?? null) : null;\n }, [toolName, argsText, isRunning, isThread]);\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 =\n secondaryProp ?? (rejection ? rejection.reason : message || summary);\n\n if (isThread) {\n return (\n <CollapsibleTrigger\n data-slot=\"tool-fallback-trigger\"\n data-tool-outcome={state}\n data-appearance=\"thread\"\n className={cn(\n \"aui-tool-fallback-trigger group/trigger flex w-full min-w-0 items-center gap-2 rounded-lg px-2.5 py-1.5 text-left text-[13px] leading-snug transition-colors hover:bg-muted/40\",\n className,\n )}\n {...props}\n >\n <ThreadStatusGlyph classification={classification} isCancelled={isCancelled} />\n <span className=\"flex min-w-0 flex-1 items-baseline gap-1.5\">\n <span\n data-slot=\"tool-fallback-verb\"\n className={cn(\n \"shrink-0 font-medium\",\n state === \"error\" && !isCancelled && \"text-destructive\",\n isCancelled && \"text-muted-foreground line-through\",\n )}\n >\n {isRunning ? running : headline}\n </span>\n {isRunning && elapsed ? (\n <span\n data-slot=\"tool-fallback-elapsed\"\n className=\"shrink-0 tabular-nums text-muted-foreground\"\n >\n <span aria-hidden=\"true\">· </span>\n {elapsed}\n </span>\n ) : null}\n {secondary ? (\n <span\n data-slot=\"tool-fallback-target\"\n className=\"min-w-0 truncate text-muted-foreground\"\n >\n <span aria-hidden=\"true\">· </span>\n {secondary}\n </span>\n ) : null}\n {badge ? (\n <span className=\"shrink-0 rounded-full bg-muted px-1.5 py-px text-[10px] font-medium text-muted-foreground\">\n {badge}\n </span>\n ) : null}\n </span>\n <ChevronDownIcon\n className={cn(\n \"size-3.5 shrink-0 text-muted-foreground/60\",\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\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 appearance: appearanceProp,\n ...props\n}: React.ComponentProps<typeof CollapsibleContent> & { appearance?: ToolAppearance }) {\n const appearance = useToolAppearance(appearanceProp);\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\n className={\n appearance === \"thread\"\n ? \"mt-1 flex flex-col gap-2 border-t border-border/40 pt-2 pb-1\"\n : \"mt-2.5 flex flex-col gap-2 border-t border-border/50 pt-2\"\n }\n >\n {children}\n </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 appearance: appearanceProp,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n classification: ToolResultClassification;\n appearance?: ToolAppearance;\n}) {\n const isThread = useToolAppearance(appearanceProp) === \"thread\";\n if (classification.state === \"error\") {\n const { failure } = classification;\n return (\n <div\n data-slot=\"tool-fallback-notice\"\n className={cn(\n isThread\n ? \"mt-1 border-t border-destructive/20 px-3 pt-1.5 pb-1 text-[11px] text-destructive\"\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 isThread\n ? \"mt-1 border-t border-amber-200/80 px-3 pt-1.5 pb-1 text-[11px] text-amber-800\"\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 appearance: appearanceProp,\n}: ToolFallbackProps) => {\n const appearance = useToolAppearance(appearanceProp);\n const isThread = appearance === \"thread\";\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. The thread row keeps\n // one anatomy for every call; its asset link is the row's trailing action.\n if (!isThread && 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 const isFailure = classification.state === \"error\" && !isCancelled;\n\n return (\n <ToolFallbackRoot\n {...rootProps}\n {...(isThread ? { \"data-tool-outcome\": classification.state } : {})}\n appearance={appearance}\n defaultOpen={defaultOpen}\n className={cn(\n isThread && isFailure && \"border-destructive/30 bg-destructive/5\",\n isCancelled && \"border-muted-foreground/30 bg-muted/30\",\n className,\n )}\n >\n <div className=\"flex items-center\">\n <div className=\"min-w-0 flex-1\">\n <ToolFallbackTrigger\n appearance={appearance}\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 appearance={appearance} classification={classification} />\n <ToolFallbackContent appearance={appearance}>\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\n/** Trailing \"...\" / \"…\" a dedicated UI puts on its running title; the row's spinner says it instead. */\nfunction stripTrailingEllipsis(title: string): string {\n return title.replace(/(\\.{3}|…)\\s*$/u, \"\");\n}\n\n/**\n * A dedicated tool UI's `ToolCard`, rendered as the thread row: the UI's\n * title / subtitle / badge become the verb, target and chip, its body renders\n * inside the disclosure above the arguments, and the raw result shows only\n * when the UI drew no body of its own. The tool-id caption the card carries\n * is dropped — a reader gains nothing from `search` under \"Web search\".\n */\nfunction ThreadToolCard({\n status,\n title,\n subtitle,\n toolName,\n badge,\n error,\n children,\n args,\n result,\n}: ToolCardProps) {\n const isRunning = status === \"running\";\n const isError = status === \"incomplete\";\n const partStatus: ToolCallMessagePartStatus =\n status === \"running\"\n ? { type: \"running\" }\n : status === \"requires-action\"\n ? { type: \"requires-action\", reason: \"interrupt\" }\n : status === \"incomplete\"\n ? { type: \"incomplete\", reason: \"error\", ...(error ? { error } : {}) }\n : { type: \"complete\" };\n // The dedicated UI already judged its result (that is what `status` is):\n // classify from the status alone so a result shape the shared classifier\n // reads as a failure cannot overrule a UI that rendered it as a success.\n const classification = classifyToolResult({ status: partStatus, result: undefined, isError });\n const argsText = useMemo(() => (args ? JSON.stringify(args) : undefined), [args]);\n const name = toolName ?? title;\n\n return (\n <ToolFallbackRoot\n appearance=\"thread\"\n data-tool-outcome={classification.state}\n className={cn(isError && \"border-destructive/30 bg-destructive/5\")}\n >\n <ToolFallbackTrigger\n appearance=\"thread\"\n toolName={name}\n status={partStatus}\n classification={classification}\n displayName={title}\n activeLabel={isRunning ? stripTrailingEllipsis(title) : undefined}\n secondary={subtitle}\n badge={badge}\n />\n {error ? (\n <div\n data-slot=\"tool-fallback-notice\"\n className=\"mt-1 border-t border-destructive/20 px-3 pt-1.5 pb-1 text-[11px] text-destructive\"\n >\n {error}\n </div>\n ) : null}\n <ToolFallbackContent appearance=\"thread\">\n {children}\n <ToolFallbackArgs argsText={argsText} />\n {children == null ? (\n <ToolFallbackResult result={result} classification={classification} />\n ) : null}\n {toolName && !isRunning ? (\n <div className=\"flex justify-end px-3 pt-1\">\n <CopyToolSpecButton\n toolName={toolName}\n args={args}\n result={result}\n className=\"px-0 pb-0\"\n />\n </div>\n ) : null}\n </ToolFallbackContent>\n </ToolFallbackRoot>\n );\n}\n\n/**\n * Sets the tool-card anatomy for every tool call rendered below it — generic\n * fallbacks, dedicated tool UIs built on `ToolCard`, nested PTC sub-calls.\n * `AthenaChat` mounts it with `thread`; hosts that render their own thread\n * keep the `card` default by not mounting it.\n */\nexport function ToolFallbackAppearanceProvider({\n appearance,\n children,\n}: {\n appearance: ToolAppearance;\n children?: ReactNode;\n}) {\n const value = useMemo<ToolAppearanceContextValue>(\n () => ({\n appearance,\n ToolCard: appearance === \"thread\" ? ThreadToolCard : undefined,\n }),\n [appearance],\n );\n return (\n <ToolAppearanceContext.Provider value={value}>{children}</ToolAppearanceContext.Provider>\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};\nexport type { ToolAppearance } from \"./tool-appearance\";\nexport { useToolAppearance } from \"./tool-appearance\";\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 CheckIcon,\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, type ToolCardProps, tryParseJson } from \"./primitives\";\nimport {\n ToolAppearanceContext,\n type ToolAppearance,\n type ToolAppearanceContextValue,\n useToolAppearance,\n} from \"./tool-appearance\";\nimport { toolIcon } from \"./tool-icons\";\nimport { elapsedSuffix, useElapsedSeconds } from \"./use-elapsed-seconds\";\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 * Two appearances (see {@link ToolAppearance}): the boxed `card` the hosts\n * above render by default, and the SDK thread's one-line `thread` row, chosen\n * per card through the `appearance` option or for a whole subtree through\n * {@link ToolFallbackAppearanceProvider}. The default markup is pinned by\n * `mount-tests/tool-fallback-default-markup.mount.test.tsx`.\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 * The anatomy to render with; defaults to the nearest\n * {@link ToolFallbackAppearanceProvider}, else `card` (the host card).\n */\n appearance?: ToolAppearance;\n}\n\nexport type ToolFallbackProps = ToolCallPartProps & ToolFallbackOptions;\n\n// ─── Thread appearance ───────────────────────────────────────────────\n\nconst THREAD_ROOT_CLASS =\n \"aui-tool-fallback-root group/tool-fallback-root my-1.5 w-full rounded-lg border border-border/50 bg-background\";\n\n/** The one-line row's status glyph: the same states as the card, without the tinted box. */\nfunction ThreadStatusGlyph({\n classification,\n isCancelled,\n}: {\n classification: ToolResultClassification;\n isCancelled: boolean;\n}) {\n const state = classification.state;\n const glyph =\n state === \"running\" ? (\n <LoaderIcon className=\"size-3.5 animate-spin text-muted-foreground motion-reduce:animate-none\" />\n ) : state === \"rejected\" ? (\n <XCircleIcon className=\"size-3.5 text-amber-600\" />\n ) : state === \"error\" ? (\n isCancelled ? (\n <XCircleIcon className=\"size-3.5 text-muted-foreground\" />\n ) : (\n <AlertCircleIcon className=\"size-3.5 text-destructive\" />\n )\n ) : state === \"paused\" ? (\n <PauseIcon className=\"size-3.5 text-amber-600\" />\n ) : state === \"requires-action\" ? (\n <ShieldAlertIcon className=\"size-3.5 text-amber-600\" />\n ) : (\n <CheckIcon className=\"size-3.5 text-emerald-600\" />\n );\n return (\n <span\n data-slot=\"tool-fallback-status\"\n data-tool-outcome={state}\n aria-hidden=\"true\"\n className=\"flex size-4 shrink-0 items-center justify-center\"\n >\n {glyph}\n </span>\n );\n}\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 appearance?: ToolAppearance;\n};\n\nfunction ToolFallbackRoot({\n className,\n open: controlledOpen,\n onOpenChange: controlledOnOpenChange,\n defaultOpen = false,\n appearance: appearanceProp,\n children,\n ...props\n}: ToolFallbackRootProps) {\n const appearance = useToolAppearance(appearanceProp);\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 {...(appearance === \"thread\" ? { \"data-appearance\": \"thread\" } : {})}\n open={isOpen}\n onOpenChange={handleOpenChange}\n className={cn(\n appearance === \"thread\"\n ? THREAD_ROOT_CLASS\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 appearance?: ToolAppearance;\n /** Replaces the derived target text (a result message or the args summary). */\n secondary?: string;\n /** A short count or state chip after the target (\"8 results\"). */\n badge?: string;\n}\n\nfunction ToolFallbackTrigger({\n toolName,\n argsText,\n result,\n status,\n isError,\n classification: givenClassification,\n displayName,\n activeLabel,\n icon,\n appearance: appearanceProp,\n secondary: secondaryProp,\n badge,\n className,\n ...props\n}: ToolFallbackTriggerProps) {\n const appearance = useToolAppearance(appearanceProp);\n const isThread = appearance === \"thread\";\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 const elapsed = elapsedSuffix(useElapsedSeconds(isThread && isRunning));\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 // The row names the target while the call runs too; the card waits for the\n // call to settle. Streaming arguments do not parse, so nothing shows early.\n const summary = useMemo(() => {\n if ((isRunning && !isThread) || !argsText) return null;\n const parsed = tryParseJson(argsText);\n return parsed ? (describeToolArgs({ toolName, args: parsed }) ?? null) : null;\n }, [toolName, argsText, isRunning, isThread]);\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 =\n secondaryProp ?? (rejection ? rejection.reason : message || summary);\n\n if (isThread) {\n return (\n <CollapsibleTrigger\n data-slot=\"tool-fallback-trigger\"\n data-tool-outcome={state}\n data-appearance=\"thread\"\n className={cn(\n \"aui-tool-fallback-trigger group/trigger flex w-full min-w-0 items-center gap-2 rounded-lg px-2.5 py-1.5 text-left text-[13px] leading-snug transition-colors hover:bg-muted/40\",\n className,\n )}\n {...props}\n >\n <ThreadStatusGlyph classification={classification} isCancelled={isCancelled} />\n <span className=\"flex min-w-0 flex-1 items-baseline gap-1.5\">\n <span\n data-slot=\"tool-fallback-verb\"\n className={cn(\n \"shrink-0 font-medium\",\n state === \"error\" && !isCancelled && \"text-destructive\",\n isCancelled && \"text-muted-foreground line-through\",\n )}\n >\n {isRunning ? running : headline}\n </span>\n {isRunning && elapsed ? (\n <span\n data-slot=\"tool-fallback-elapsed\"\n className=\"shrink-0 tabular-nums text-muted-foreground\"\n >\n <span aria-hidden=\"true\">· </span>\n {elapsed}\n </span>\n ) : null}\n {secondary ? (\n <span\n data-slot=\"tool-fallback-target\"\n className=\"min-w-0 truncate text-muted-foreground\"\n >\n <span aria-hidden=\"true\">· </span>\n {secondary}\n </span>\n ) : null}\n {badge ? (\n <span className=\"shrink-0 rounded-full bg-muted px-1.5 py-px text-[10px] font-medium text-muted-foreground\">\n {badge}\n </span>\n ) : null}\n </span>\n <ChevronDownIcon\n className={cn(\n \"size-3.5 shrink-0 text-muted-foreground/60\",\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\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 appearance: appearanceProp,\n ...props\n}: React.ComponentProps<typeof CollapsibleContent> & { appearance?: ToolAppearance }) {\n const appearance = useToolAppearance(appearanceProp);\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\n className={\n appearance === \"thread\"\n ? \"mt-1 flex flex-col gap-2 border-t border-border/40 pt-2 pb-1\"\n : \"mt-2.5 flex flex-col gap-2 border-t border-border/50 pt-2\"\n }\n >\n {children}\n </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 appearance: appearanceProp,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n classification: ToolResultClassification;\n appearance?: ToolAppearance;\n}) {\n const isThread = useToolAppearance(appearanceProp) === \"thread\";\n if (classification.state === \"error\") {\n const { failure } = classification;\n return (\n <div\n data-slot=\"tool-fallback-notice\"\n className={cn(\n isThread\n ? \"mt-1 border-t border-destructive/20 px-3 pt-1.5 pb-1 text-[11px] text-destructive\"\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 isThread\n ? \"mt-1 border-t border-amber-200/80 px-3 pt-1.5 pb-1 text-[11px] text-amber-800\"\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 appearance: appearanceProp,\n}: ToolFallbackProps) => {\n const appearance = useToolAppearance(appearanceProp);\n const isThread = appearance === \"thread\";\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. The thread row keeps\n // one anatomy for every call; its asset link is the row's trailing action.\n if (!isThread && 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 const isFailure = classification.state === \"error\" && !isCancelled;\n\n return (\n <ToolFallbackRoot\n {...rootProps}\n {...(isThread ? { \"data-tool-outcome\": classification.state } : {})}\n appearance={appearance}\n defaultOpen={defaultOpen}\n className={cn(\n isThread && isFailure && \"border-destructive/30 bg-destructive/5\",\n isCancelled && \"border-muted-foreground/30 bg-muted/30\",\n className,\n )}\n >\n <div className=\"flex items-center\">\n <div className=\"min-w-0 flex-1\">\n <ToolFallbackTrigger\n appearance={appearance}\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 appearance={appearance} classification={classification} />\n <ToolFallbackContent appearance={appearance}>\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\n/** Trailing \"...\" / \"…\" a dedicated UI puts on its running title; the row's spinner says it instead. */\nfunction stripTrailingEllipsis(title: string): string {\n return title.replace(/(\\.{3}|…)\\s*$/u, \"\");\n}\n\n/**\n * A dedicated tool UI's `ToolCard`, rendered as the thread row: the UI's\n * title / subtitle / badge become the verb, target and chip, its body renders\n * inside the disclosure above the arguments, and the raw result shows only\n * when the UI drew no body of its own. The tool-id caption the card carries\n * is dropped — a reader gains nothing from `search` under \"Web search\".\n */\nfunction ThreadToolCard({\n status,\n title,\n subtitle,\n toolName,\n badge,\n error,\n children,\n args,\n result,\n}: ToolCardProps) {\n const isRunning = status === \"running\";\n const isError = status === \"incomplete\";\n const partStatus: ToolCallMessagePartStatus =\n status === \"running\"\n ? { type: \"running\" }\n : status === \"requires-action\"\n ? { type: \"requires-action\", reason: \"interrupt\" }\n : status === \"incomplete\"\n ? { type: \"incomplete\", reason: \"error\", ...(error ? { error } : {}) }\n : { type: \"complete\" };\n // The dedicated UI already judged its result (that is what `status` is):\n // classify from the status alone so a result shape the shared classifier\n // reads as a failure cannot overrule a UI that rendered it as a success.\n const classification = classifyToolResult({ status: partStatus, result: undefined, isError });\n const argsText = useMemo(() => (args ? JSON.stringify(args) : undefined), [args]);\n const name = toolName ?? title;\n\n return (\n <ToolFallbackRoot\n appearance=\"thread\"\n data-tool-outcome={classification.state}\n className={cn(isError && \"border-destructive/30 bg-destructive/5\")}\n >\n <ToolFallbackTrigger\n appearance=\"thread\"\n toolName={name}\n status={partStatus}\n classification={classification}\n displayName={title}\n activeLabel={isRunning ? stripTrailingEllipsis(title) : undefined}\n secondary={subtitle}\n badge={badge}\n />\n {error ? (\n <div\n data-slot=\"tool-fallback-notice\"\n className=\"mt-1 border-t border-destructive/20 px-3 pt-1.5 pb-1 text-[11px] text-destructive\"\n >\n {error}\n </div>\n ) : null}\n <ToolFallbackContent appearance=\"thread\">\n {children}\n <ToolFallbackArgs argsText={argsText} />\n {children == null ? (\n <ToolFallbackResult result={result} classification={classification} />\n ) : null}\n {toolName && !isRunning ? (\n <div className=\"flex justify-end px-3 pt-1\">\n <CopyToolSpecButton\n toolName={toolName}\n args={args}\n result={result}\n className=\"px-0 pb-0\"\n />\n </div>\n ) : null}\n </ToolFallbackContent>\n </ToolFallbackRoot>\n );\n}\n\n/**\n * Sets the tool-card anatomy for every tool call rendered below it — generic\n * fallbacks, dedicated tool UIs built on `ToolCard`, nested PTC sub-calls.\n * `AthenaChat` mounts it with `thread`; hosts that render their own thread\n * keep the `card` default by not mounting it.\n */\nexport function ToolFallbackAppearanceProvider({\n appearance,\n children,\n}: {\n appearance: ToolAppearance;\n children?: ReactNode;\n}) {\n const value = useMemo<ToolAppearanceContextValue>(\n () => ({\n appearance,\n ToolCard: appearance === \"thread\" ? ThreadToolCard : undefined,\n }),\n [appearance],\n );\n return (\n <ToolAppearanceContext.Provider value={value}>{children}</ToolAppearanceContext.Provider>\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};\nexport type { ToolAppearance } from \"./tool-appearance\";\nexport { useToolAppearance } from \"./tool-appearance\";\n"],"names":[],"mappings":"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"}
|
|
@@ -2,24 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
4
|
const react = require("@assistant-ui/react");
|
|
5
|
-
require("../packages/agent-runtime/src/generated/runconfig-contract.cjs");
|
|
6
|
-
require("react");
|
|
7
|
-
require("@assistant-ui/tap");
|
|
8
|
-
require("statewire");
|
|
9
|
-
require("../packages/agent-runtime/src/statewire-suspended.cjs");
|
|
10
|
-
require("../packages/agent-runtime/src/conversation-list.cjs");
|
|
11
|
-
require("@tanstack/react-query");
|
|
12
|
-
require("../packages/agent-runtime/src/statewire-state.cjs");
|
|
13
|
-
require("../packages/agent-runtime/src/messages.cjs");
|
|
14
|
-
require("@assistant-ui/store");
|
|
15
|
-
require("../packages/agent-runtime/src/quota-safe-local-storage-session.cjs");
|
|
16
|
-
require("../packages/agent-runtime/src/statewire-attach-observer.cjs");
|
|
17
|
-
require("../packages/agent-runtime/src/thread-status.cjs");
|
|
18
|
-
require("@assistant-ui/react-statewire");
|
|
19
|
-
const voicePresentation = require("../packages/agent-runtime/src/voice-presentation.cjs");
|
|
20
|
-
require("@assistant-ui/core");
|
|
21
|
-
require("../packages/agent-runtime/src/thread-handoff.cjs");
|
|
22
5
|
const lucideReact = require("lucide-react");
|
|
6
|
+
const voicePresentation = require("../packages/agent-runtime/src/voice-presentation.cjs");
|
|
23
7
|
const cnfast = require("cnfast");
|
|
24
8
|
const VoiceUpdateCard = ({
|
|
25
9
|
text,
|
|
@@ -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;;;"}
|
|
@@ -1,23 +1,7 @@
|
|
|
1
1
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
2
|
import { makeAssistantToolUI } from "@assistant-ui/react";
|
|
3
|
-
import "../packages/agent-runtime/src/generated/runconfig-contract.js";
|
|
4
|
-
import "react";
|
|
5
|
-
import "@assistant-ui/tap";
|
|
6
|
-
import "statewire";
|
|
7
|
-
import "../packages/agent-runtime/src/statewire-suspended.js";
|
|
8
|
-
import "../packages/agent-runtime/src/conversation-list.js";
|
|
9
|
-
import "@tanstack/react-query";
|
|
10
|
-
import "../packages/agent-runtime/src/statewire-state.js";
|
|
11
|
-
import "../packages/agent-runtime/src/messages.js";
|
|
12
|
-
import "@assistant-ui/store";
|
|
13
|
-
import "../packages/agent-runtime/src/quota-safe-local-storage-session.js";
|
|
14
|
-
import "../packages/agent-runtime/src/statewire-attach-observer.js";
|
|
15
|
-
import "../packages/agent-runtime/src/thread-status.js";
|
|
16
|
-
import "@assistant-ui/react-statewire";
|
|
17
|
-
import { VOICE_UPDATE_TOOL_NAME, describeVoiceUpdateToolCall, voiceUpdateStatusLabel } from "../packages/agent-runtime/src/voice-presentation.js";
|
|
18
|
-
import "@assistant-ui/core";
|
|
19
|
-
import "../packages/agent-runtime/src/thread-handoff.js";
|
|
20
3
|
import { LoaderIcon, AudioLinesIcon, MessageSquareTextIcon } from "lucide-react";
|
|
4
|
+
import { VOICE_UPDATE_TOOL_NAME, describeVoiceUpdateToolCall, voiceUpdateStatusLabel } from "../packages/agent-runtime/src/voice-presentation.js";
|
|
21
5
|
import { cn } from "cnfast";
|
|
22
6
|
const VoiceUpdateCard = ({
|
|
23
7
|
text,
|
|
@@ -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;"}
|
package/package.json
CHANGED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
(function() {
|
|
3
|
-
const EXP_TABLE = new Array(256);
|
|
4
|
-
const LOG_TABLE = new Array(256);
|
|
5
|
-
for (let i = 0; i < 8; i += 1) {
|
|
6
|
-
EXP_TABLE[i] = 1 << i;
|
|
7
|
-
}
|
|
8
|
-
for (let i = 8; i < 256; i += 1) {
|
|
9
|
-
EXP_TABLE[i] = EXP_TABLE[i - 4] ^ EXP_TABLE[i - 5] ^ EXP_TABLE[i - 6] ^ EXP_TABLE[i - 8];
|
|
10
|
-
}
|
|
11
|
-
for (let i = 0; i < 255; i += 1) {
|
|
12
|
-
LOG_TABLE[EXP_TABLE[i]] = i;
|
|
13
|
-
}
|
|
14
|
-
const _this = {};
|
|
15
|
-
_this.glog = function(n) {
|
|
16
|
-
if (n < 1) {
|
|
17
|
-
throw "glog(" + n + ")";
|
|
18
|
-
}
|
|
19
|
-
return LOG_TABLE[n];
|
|
20
|
-
};
|
|
21
|
-
_this.gexp = function(n) {
|
|
22
|
-
while (n < 0) {
|
|
23
|
-
n += 255;
|
|
24
|
-
}
|
|
25
|
-
while (n >= 256) {
|
|
26
|
-
n -= 255;
|
|
27
|
-
}
|
|
28
|
-
return EXP_TABLE[n];
|
|
29
|
-
};
|
|
30
|
-
return _this;
|
|
31
|
-
})();
|
|
32
|
-
//# sourceMappingURL=qrcode.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"qrcode.cjs","sources":["../../../../../../node_modules/qrcode-generator/dist/qrcode.mjs"],"sourcesContent":["//---------------------------------------------------------------------\n//\n// QR Code Generator for JavaScript\n//\n// Copyright (c) 2009 Kazuhiko Arase\n//\n// URL: http://www.d-project.com/\n//\n// Licensed under the MIT license:\n// http://www.opensource.org/licenses/mit-license.php\n//\n// The word 'QR Code' is registered trademark of\n// DENSO WAVE INCORPORATED\n// http://www.denso-wave.com/qrcode/faqpatent-e.html\n//\n//---------------------------------------------------------------------\n\n//---------------------------------------------------------------------\n// qrcode\n//---------------------------------------------------------------------\n\n/**\n * qrcode\n * @param typeNumber 1 to 40\n * @param errorCorrectionLevel 'L','M','Q','H'\n */\nexport const qrcode = function(typeNumber, errorCorrectionLevel) {\n\n const PAD0 = 0xEC;\n const PAD1 = 0x11;\n\n let _typeNumber = typeNumber;\n const _errorCorrectionLevel = QRErrorCorrectionLevel[errorCorrectionLevel];\n let _modules = null;\n let _moduleCount = 0;\n let _dataCache = null;\n const _dataList = [];\n\n const _this = {};\n\n const makeImpl = function(test, maskPattern) {\n\n _moduleCount = _typeNumber * 4 + 17;\n _modules = function(moduleCount) {\n const modules = new Array(moduleCount);\n for (let row = 0; row < moduleCount; row += 1) {\n modules[row] = new Array(moduleCount);\n for (let col = 0; col < moduleCount; col += 1) {\n modules[row][col] = null;\n }\n }\n return modules;\n }(_moduleCount);\n\n setupPositionProbePattern(0, 0);\n setupPositionProbePattern(_moduleCount - 7, 0);\n setupPositionProbePattern(0, _moduleCount - 7);\n setupPositionAdjustPattern();\n setupTimingPattern();\n setupTypeInfo(test, maskPattern);\n\n if (_typeNumber >= 7) {\n setupTypeNumber(test);\n }\n\n if (_dataCache == null) {\n _dataCache = createData(_typeNumber, _errorCorrectionLevel, _dataList);\n }\n\n mapData(_dataCache, maskPattern);\n };\n\n const setupPositionProbePattern = function(row, col) {\n\n for (let r = -1; r <= 7; r += 1) {\n\n if (row + r <= -1 || _moduleCount <= row + r) continue;\n\n for (let c = -1; c <= 7; c += 1) {\n\n if (col + c <= -1 || _moduleCount <= col + c) continue;\n\n if ( (0 <= r && r <= 6 && (c == 0 || c == 6) )\n || (0 <= c && c <= 6 && (r == 0 || r == 6) )\n || (2 <= r && r <= 4 && 2 <= c && c <= 4) ) {\n _modules[row + r][col + c] = true;\n } else {\n _modules[row + r][col + c] = false;\n }\n }\n }\n };\n\n const getBestMaskPattern = function() {\n\n let minLostPoint = 0;\n let pattern = 0;\n\n for (let i = 0; i < 8; i += 1) {\n\n makeImpl(true, i);\n\n const lostPoint = QRUtil.getLostPoint(_this);\n\n if (i == 0 || minLostPoint > lostPoint) {\n minLostPoint = lostPoint;\n pattern = i;\n }\n }\n\n return pattern;\n };\n\n const setupTimingPattern = function() {\n\n for (let r = 8; r < _moduleCount - 8; r += 1) {\n if (_modules[r][6] != null) {\n continue;\n }\n _modules[r][6] = (r % 2 == 0);\n }\n\n for (let c = 8; c < _moduleCount - 8; c += 1) {\n if (_modules[6][c] != null) {\n continue;\n }\n _modules[6][c] = (c % 2 == 0);\n }\n };\n\n const setupPositionAdjustPattern = function() {\n\n const pos = QRUtil.getPatternPosition(_typeNumber);\n\n for (let i = 0; i < pos.length; i += 1) {\n\n for (let j = 0; j < pos.length; j += 1) {\n\n const row = pos[i];\n const col = pos[j];\n\n if (_modules[row][col] != null) {\n continue;\n }\n\n for (let r = -2; r <= 2; r += 1) {\n\n for (let c = -2; c <= 2; c += 1) {\n\n if (r == -2 || r == 2 || c == -2 || c == 2\n || (r == 0 && c == 0) ) {\n _modules[row + r][col + c] = true;\n } else {\n _modules[row + r][col + c] = false;\n }\n }\n }\n }\n }\n };\n\n const setupTypeNumber = function(test) {\n\n const bits = QRUtil.getBCHTypeNumber(_typeNumber);\n\n for (let i = 0; i < 18; i += 1) {\n const mod = (!test && ( (bits >> i) & 1) == 1);\n _modules[Math.floor(i / 3)][i % 3 + _moduleCount - 8 - 3] = mod;\n }\n\n for (let i = 0; i < 18; i += 1) {\n const mod = (!test && ( (bits >> i) & 1) == 1);\n _modules[i % 3 + _moduleCount - 8 - 3][Math.floor(i / 3)] = mod;\n }\n };\n\n const setupTypeInfo = function(test, maskPattern) {\n\n const data = (_errorCorrectionLevel << 3) | maskPattern;\n const bits = QRUtil.getBCHTypeInfo(data);\n\n // vertical\n for (let i = 0; i < 15; i += 1) {\n\n const mod = (!test && ( (bits >> i) & 1) == 1);\n\n if (i < 6) {\n _modules[i][8] = mod;\n } else if (i < 8) {\n _modules[i + 1][8] = mod;\n } else {\n _modules[_moduleCount - 15 + i][8] = mod;\n }\n }\n\n // horizontal\n for (let i = 0; i < 15; i += 1) {\n\n const mod = (!test && ( (bits >> i) & 1) == 1);\n\n if (i < 8) {\n _modules[8][_moduleCount - i - 1] = mod;\n } else if (i < 9) {\n _modules[8][15 - i - 1 + 1] = mod;\n } else {\n _modules[8][15 - i - 1] = mod;\n }\n }\n\n // fixed module\n _modules[_moduleCount - 8][8] = (!test);\n };\n\n const mapData = function(data, maskPattern) {\n\n let inc = -1;\n let row = _moduleCount - 1;\n let bitIndex = 7;\n let byteIndex = 0;\n const maskFunc = QRUtil.getMaskFunction(maskPattern);\n\n for (let col = _moduleCount - 1; col > 0; col -= 2) {\n\n if (col == 6) col -= 1;\n\n while (true) {\n\n for (let c = 0; c < 2; c += 1) {\n\n if (_modules[row][col - c] == null) {\n\n let dark = false;\n\n if (byteIndex < data.length) {\n dark = ( ( (data[byteIndex] >>> bitIndex) & 1) == 1);\n }\n\n const mask = maskFunc(row, col - c);\n\n if (mask) {\n dark = !dark;\n }\n\n _modules[row][col - c] = dark;\n bitIndex -= 1;\n\n if (bitIndex == -1) {\n byteIndex += 1;\n bitIndex = 7;\n }\n }\n }\n\n row += inc;\n\n if (row < 0 || _moduleCount <= row) {\n row -= inc;\n inc = -inc;\n break;\n }\n }\n }\n };\n\n const createBytes = function(buffer, rsBlocks) {\n\n let offset = 0;\n\n let maxDcCount = 0;\n let maxEcCount = 0;\n\n const dcdata = new Array(rsBlocks.length);\n const ecdata = new Array(rsBlocks.length);\n\n for (let r = 0; r < rsBlocks.length; r += 1) {\n\n const dcCount = rsBlocks[r].dataCount;\n const ecCount = rsBlocks[r].totalCount - dcCount;\n\n maxDcCount = Math.max(maxDcCount, dcCount);\n maxEcCount = Math.max(maxEcCount, ecCount);\n\n dcdata[r] = new Array(dcCount);\n\n for (let i = 0; i < dcdata[r].length; i += 1) {\n dcdata[r][i] = 0xff & buffer.getBuffer()[i + offset];\n }\n offset += dcCount;\n\n const rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);\n const rawPoly = qrPolynomial(dcdata[r], rsPoly.getLength() - 1);\n\n const modPoly = rawPoly.mod(rsPoly);\n ecdata[r] = new Array(rsPoly.getLength() - 1);\n for (let i = 0; i < ecdata[r].length; i += 1) {\n const modIndex = i + modPoly.getLength() - ecdata[r].length;\n ecdata[r][i] = (modIndex >= 0)? modPoly.getAt(modIndex) : 0;\n }\n }\n\n let totalCodeCount = 0;\n for (let i = 0; i < rsBlocks.length; i += 1) {\n totalCodeCount += rsBlocks[i].totalCount;\n }\n\n const data = new Array(totalCodeCount);\n let index = 0;\n\n for (let i = 0; i < maxDcCount; i += 1) {\n for (let r = 0; r < rsBlocks.length; r += 1) {\n if (i < dcdata[r].length) {\n data[index] = dcdata[r][i];\n index += 1;\n }\n }\n }\n\n for (let i = 0; i < maxEcCount; i += 1) {\n for (let r = 0; r < rsBlocks.length; r += 1) {\n if (i < ecdata[r].length) {\n data[index] = ecdata[r][i];\n index += 1;\n }\n }\n }\n\n return data;\n };\n\n const createData = function(typeNumber, errorCorrectionLevel, dataList) {\n\n const rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectionLevel);\n\n const buffer = qrBitBuffer();\n\n for (let i = 0; i < dataList.length; i += 1) {\n const data = dataList[i];\n buffer.put(data.getMode(), 4);\n buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber) );\n data.write(buffer);\n }\n\n // calc num max data.\n let totalDataCount = 0;\n for (let i = 0; i < rsBlocks.length; i += 1) {\n totalDataCount += rsBlocks[i].dataCount;\n }\n\n if (buffer.getLengthInBits() > totalDataCount * 8) {\n throw 'code length overflow. ('\n + buffer.getLengthInBits()\n + '>'\n + totalDataCount * 8\n + ')';\n }\n\n // end code\n if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {\n buffer.put(0, 4);\n }\n\n // padding\n while (buffer.getLengthInBits() % 8 != 0) {\n buffer.putBit(false);\n }\n\n // padding\n while (true) {\n\n if (buffer.getLengthInBits() >= totalDataCount * 8) {\n break;\n }\n buffer.put(PAD0, 8);\n\n if (buffer.getLengthInBits() >= totalDataCount * 8) {\n break;\n }\n buffer.put(PAD1, 8);\n }\n\n return createBytes(buffer, rsBlocks);\n };\n\n _this.addData = function(data, mode) {\n\n mode = mode || 'Byte';\n\n let newData = null;\n\n switch(mode) {\n case 'Numeric' :\n newData = qrNumber(data);\n break;\n case 'Alphanumeric' :\n newData = qrAlphaNum(data);\n break;\n case 'Byte' :\n newData = qr8BitByte(data);\n break;\n case 'Kanji' :\n newData = qrKanji(data);\n break;\n default :\n throw 'mode:' + mode;\n }\n\n _dataList.push(newData);\n _dataCache = null;\n };\n\n _this.isDark = function(row, col) {\n if (row < 0 || _moduleCount <= row || col < 0 || _moduleCount <= col) {\n throw row + ',' + col;\n }\n return _modules[row][col];\n };\n\n _this.getModuleCount = function() {\n return _moduleCount;\n };\n\n _this.make = function() {\n if (_typeNumber < 1) {\n let typeNumber = 1;\n\n for (; typeNumber < 40; typeNumber++) {\n const rsBlocks = QRRSBlock.getRSBlocks(typeNumber, _errorCorrectionLevel);\n const buffer = qrBitBuffer();\n\n for (let i = 0; i < _dataList.length; i++) {\n const data = _dataList[i];\n buffer.put(data.getMode(), 4);\n buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber) );\n data.write(buffer);\n }\n\n let totalDataCount = 0;\n for (let i = 0; i < rsBlocks.length; i++) {\n totalDataCount += rsBlocks[i].dataCount;\n }\n\n if (buffer.getLengthInBits() <= totalDataCount * 8) {\n break;\n }\n }\n\n _typeNumber = typeNumber;\n }\n\n makeImpl(false, getBestMaskPattern() );\n };\n\n _this.createTableTag = function(cellSize, margin) {\n\n cellSize = cellSize || 2;\n margin = (typeof margin == 'undefined')? cellSize * 4 : margin;\n\n let qrHtml = '';\n\n qrHtml += '<table style=\"';\n qrHtml += ' border-width: 0px; border-style: none;';\n qrHtml += ' border-collapse: collapse;';\n qrHtml += ' padding: 0px; margin: ' + margin + 'px;';\n qrHtml += '\">';\n qrHtml += '<tbody>';\n\n for (let r = 0; r < _this.getModuleCount(); r += 1) {\n\n qrHtml += '<tr>';\n\n for (let c = 0; c < _this.getModuleCount(); c += 1) {\n qrHtml += '<td style=\"';\n qrHtml += ' border-width: 0px; border-style: none;';\n qrHtml += ' border-collapse: collapse;';\n qrHtml += ' padding: 0px; margin: 0px;';\n qrHtml += ' width: ' + cellSize + 'px;';\n qrHtml += ' height: ' + cellSize + 'px;';\n qrHtml += ' background-color: ';\n qrHtml += _this.isDark(r, c)? '#000000' : '#ffffff';\n qrHtml += ';';\n qrHtml += '\"/>';\n }\n\n qrHtml += '</tr>';\n }\n\n qrHtml += '</tbody>';\n qrHtml += '</table>';\n\n return qrHtml;\n };\n\n _this.createSvgTag = function(cellSize, margin, alt, title) {\n\n let opts = {};\n if (typeof arguments[0] == 'object') {\n // Called by options.\n opts = arguments[0];\n // overwrite cellSize and margin.\n cellSize = opts.cellSize;\n margin = opts.margin;\n alt = opts.alt;\n title = opts.title;\n }\n\n cellSize = cellSize || 2;\n margin = (typeof margin == 'undefined')? cellSize * 4 : margin;\n\n // Compose alt property surrogate\n alt = (typeof alt === 'string') ? {text: alt} : alt || {};\n alt.text = alt.text || null;\n alt.id = (alt.text) ? alt.id || 'qrcode-description' : null;\n\n // Compose title property surrogate\n title = (typeof title === 'string') ? {text: title} : title || {};\n title.text = title.text || null;\n title.id = (title.text) ? title.id || 'qrcode-title' : null;\n\n const size = _this.getModuleCount() * cellSize + margin * 2;\n let c, mc, r, mr, qrSvg='', rect;\n\n rect = 'l' + cellSize + ',0 0,' + cellSize +\n ' -' + cellSize + ',0 0,-' + cellSize + 'z ';\n\n qrSvg += '<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"';\n qrSvg += !opts.scalable ? ' width=\"' + size + 'px\" height=\"' + size + 'px\"' : '';\n qrSvg += ' viewBox=\"0 0 ' + size + ' ' + size + '\" ';\n qrSvg += ' preserveAspectRatio=\"xMinYMin meet\"';\n qrSvg += (title.text || alt.text) ? ' role=\"img\" aria-labelledby=\"' +\n escapeXml([title.id, alt.id].join(' ').trim() ) + '\"' : '';\n qrSvg += '>';\n qrSvg += (title.text) ? '<title id=\"' + escapeXml(title.id) + '\">' +\n escapeXml(title.text) + '</title>' : '';\n qrSvg += (alt.text) ? '<description id=\"' + escapeXml(alt.id) + '\">' +\n escapeXml(alt.text) + '</description>' : '';\n qrSvg += '<rect width=\"100%\" height=\"100%\" fill=\"white\" cx=\"0\" cy=\"0\"/>';\n qrSvg += '<path d=\"';\n\n for (r = 0; r < _this.getModuleCount(); r += 1) {\n mr = r * cellSize + margin;\n for (c = 0; c < _this.getModuleCount(); c += 1) {\n if (_this.isDark(r, c) ) {\n mc = c*cellSize+margin;\n qrSvg += 'M' + mc + ',' + mr + rect;\n }\n }\n }\n\n qrSvg += '\" stroke=\"transparent\" fill=\"black\"/>';\n qrSvg += '</svg>';\n\n return qrSvg;\n };\n\n _this.createDataURL = function(cellSize, margin) {\n\n cellSize = cellSize || 2;\n margin = (typeof margin == 'undefined')? cellSize * 4 : margin;\n\n const size = _this.getModuleCount() * cellSize + margin * 2;\n const min = margin;\n const max = size - margin;\n\n return createDataURL(size, size, function(x, y) {\n if (min <= x && x < max && min <= y && y < max) {\n const c = Math.floor( (x - min) / cellSize);\n const r = Math.floor( (y - min) / cellSize);\n return _this.isDark(r, c)? 0 : 1;\n } else {\n return 1;\n }\n } );\n };\n\n _this.createImgTag = function(cellSize, margin, alt) {\n\n cellSize = cellSize || 2;\n margin = (typeof margin == 'undefined')? cellSize * 4 : margin;\n\n const size = _this.getModuleCount() * cellSize + margin * 2;\n\n let img = '';\n img += '<img';\n img += '\\u0020src=\"';\n img += _this.createDataURL(cellSize, margin);\n img += '\"';\n img += '\\u0020width=\"';\n img += size;\n img += '\"';\n img += '\\u0020height=\"';\n img += size;\n img += '\"';\n if (alt) {\n img += '\\u0020alt=\"';\n img += escapeXml(alt);\n img += '\"';\n }\n img += '/>';\n\n return img;\n };\n\n const escapeXml = function(s) {\n let escaped = '';\n for (let i = 0; i < s.length; i += 1) {\n const c = s.charAt(i);\n switch(c) {\n case '<': escaped += '<'; break;\n case '>': escaped += '>'; break;\n case '&': escaped += '&'; break;\n case '\"': escaped += '"'; break;\n default : escaped += c; break;\n }\n }\n return escaped;\n };\n\n const _createHalfASCII = function(margin) {\n const cellSize = 1;\n margin = (typeof margin == 'undefined')? cellSize * 2 : margin;\n\n const size = _this.getModuleCount() * cellSize + margin * 2;\n const min = margin;\n const max = size - margin;\n\n let y, x, r1, r2, p;\n\n const blocks = {\n '██': '█',\n '█ ': '▀',\n ' █': '▄',\n ' ': ' '\n };\n\n const blocksLastLineNoMargin = {\n '██': '▀',\n '█ ': '▀',\n ' █': ' ',\n ' ': ' '\n };\n\n let ascii = '';\n for (y = 0; y < size; y += 2) {\n r1 = Math.floor((y - min) / cellSize);\n r2 = Math.floor((y + 1 - min) / cellSize);\n for (x = 0; x < size; x += 1) {\n p = '█';\n\n if (min <= x && x < max && min <= y && y < max && _this.isDark(r1, Math.floor((x - min) / cellSize))) {\n p = ' ';\n }\n\n if (min <= x && x < max && min <= y+1 && y+1 < max && _this.isDark(r2, Math.floor((x - min) / cellSize))) {\n p += ' ';\n }\n else {\n p += '█';\n }\n\n // Output 2 characters per pixel, to create full square. 1 character per pixels gives only half width of square.\n ascii += (margin < 1 && y+1 >= max) ? blocksLastLineNoMargin[p] : blocks[p];\n }\n\n ascii += '\\n';\n }\n\n if (size % 2 && margin > 0) {\n return ascii.substring(0, ascii.length - size - 1) + Array(size+1).join('▀');\n }\n\n return ascii.substring(0, ascii.length-1);\n };\n\n _this.createASCII = function(cellSize, margin) {\n cellSize = cellSize || 1;\n\n if (cellSize < 2) {\n return _createHalfASCII(margin);\n }\n\n cellSize -= 1;\n margin = (typeof margin == 'undefined')? cellSize * 2 : margin;\n\n const size = _this.getModuleCount() * cellSize + margin * 2;\n const min = margin;\n const max = size - margin;\n\n let y, x, r, p;\n\n const white = Array(cellSize+1).join('██');\n const black = Array(cellSize+1).join(' ');\n\n let ascii = '';\n let line = '';\n for (y = 0; y < size; y += 1) {\n r = Math.floor( (y - min) / cellSize);\n line = '';\n for (x = 0; x < size; x += 1) {\n p = 1;\n\n if (min <= x && x < max && min <= y && y < max && _this.isDark(r, Math.floor((x - min) / cellSize))) {\n p = 0;\n }\n\n // Output 2 characters per pixel, to create full square. 1 character per pixels gives only half width of square.\n line += p ? white : black;\n }\n\n for (r = 0; r < cellSize; r += 1) {\n ascii += line + '\\n';\n }\n }\n\n return ascii.substring(0, ascii.length-1);\n };\n\n _this.renderTo2dContext = function(context, cellSize) {\n cellSize = cellSize || 2;\n const length = _this.getModuleCount();\n for (let row = 0; row < length; row++) {\n for (let col = 0; col < length; col++) {\n context.fillStyle = _this.isDark(row, col) ? 'black' : 'white';\n context.fillRect(col * cellSize, row * cellSize, cellSize, cellSize);\n }\n }\n }\n\n return _this;\n};\n\n//---------------------------------------------------------------------\n// qrcode.stringToBytes\n//---------------------------------------------------------------------\n\nqrcode.stringToBytes = function(s) {\n const bytes = [];\n for (let i = 0; i < s.length; i += 1) {\n const c = s.charCodeAt(i);\n bytes.push(c & 0xff);\n }\n return bytes;\n};\n\n//---------------------------------------------------------------------\n// qrcode.createStringToBytes\n//---------------------------------------------------------------------\n\n/**\n * @param unicodeData base64 string of byte array.\n * [16bit Unicode],[16bit Bytes], ...\n * @param numChars\n */\nqrcode.createStringToBytes = function(unicodeData, numChars) {\n\n // create conversion map.\n\n const unicodeMap = function() {\n\n const bin = base64DecodeInputStream(unicodeData);\n const read = function() {\n const b = bin.read();\n if (b == -1) throw 'eof';\n return b;\n };\n\n let count = 0;\n const unicodeMap = {};\n while (true) {\n const b0 = bin.read();\n if (b0 == -1) break;\n const b1 = read();\n const b2 = read();\n const b3 = read();\n const k = String.fromCharCode( (b0 << 8) | b1);\n const v = (b2 << 8) | b3;\n unicodeMap[k] = v;\n count += 1;\n }\n if (count != numChars) {\n throw count + ' != ' + numChars;\n }\n\n return unicodeMap;\n }();\n\n const unknownChar = '?'.charCodeAt(0);\n\n return function(s) {\n const bytes = [];\n for (let i = 0; i < s.length; i += 1) {\n const c = s.charCodeAt(i);\n if (c < 128) {\n bytes.push(c);\n } else {\n const b = unicodeMap[s.charAt(i)];\n if (typeof b == 'number') {\n if ( (b & 0xff) == b) {\n // 1byte\n bytes.push(b);\n } else {\n // 2bytes\n bytes.push(b >>> 8);\n bytes.push(b & 0xff);\n }\n } else {\n bytes.push(unknownChar);\n }\n }\n }\n return bytes;\n };\n};\n\n//---------------------------------------------------------------------\n// QRMode\n//---------------------------------------------------------------------\n\nconst QRMode = {\n MODE_NUMBER : 1 << 0,\n MODE_ALPHA_NUM : 1 << 1,\n MODE_8BIT_BYTE : 1 << 2,\n MODE_KANJI : 1 << 3\n};\n\n//---------------------------------------------------------------------\n// QRErrorCorrectionLevel\n//---------------------------------------------------------------------\n\nconst QRErrorCorrectionLevel = {\n L : 1,\n M : 0,\n Q : 3,\n H : 2\n};\n\n//---------------------------------------------------------------------\n// QRMaskPattern\n//---------------------------------------------------------------------\n\nconst QRMaskPattern = {\n PATTERN000 : 0,\n PATTERN001 : 1,\n PATTERN010 : 2,\n PATTERN011 : 3,\n PATTERN100 : 4,\n PATTERN101 : 5,\n PATTERN110 : 6,\n PATTERN111 : 7\n};\n\n//---------------------------------------------------------------------\n// QRUtil\n//---------------------------------------------------------------------\n\nconst QRUtil = function() {\n\n const PATTERN_POSITION_TABLE = [\n [],\n [6, 18],\n [6, 22],\n [6, 26],\n [6, 30],\n [6, 34],\n [6, 22, 38],\n [6, 24, 42],\n [6, 26, 46],\n [6, 28, 50],\n [6, 30, 54],\n [6, 32, 58],\n [6, 34, 62],\n [6, 26, 46, 66],\n [6, 26, 48, 70],\n [6, 26, 50, 74],\n [6, 30, 54, 78],\n [6, 30, 56, 82],\n [6, 30, 58, 86],\n [6, 34, 62, 90],\n [6, 28, 50, 72, 94],\n [6, 26, 50, 74, 98],\n [6, 30, 54, 78, 102],\n [6, 28, 54, 80, 106],\n [6, 32, 58, 84, 110],\n [6, 30, 58, 86, 114],\n [6, 34, 62, 90, 118],\n [6, 26, 50, 74, 98, 122],\n [6, 30, 54, 78, 102, 126],\n [6, 26, 52, 78, 104, 130],\n [6, 30, 56, 82, 108, 134],\n [6, 34, 60, 86, 112, 138],\n [6, 30, 58, 86, 114, 142],\n [6, 34, 62, 90, 118, 146],\n [6, 30, 54, 78, 102, 126, 150],\n [6, 24, 50, 76, 102, 128, 154],\n [6, 28, 54, 80, 106, 132, 158],\n [6, 32, 58, 84, 110, 136, 162],\n [6, 26, 54, 82, 110, 138, 166],\n [6, 30, 58, 86, 114, 142, 170]\n ];\n const G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0);\n const G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0);\n const G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1);\n\n const _this = {};\n\n const getBCHDigit = function(data) {\n let digit = 0;\n while (data != 0) {\n digit += 1;\n data >>>= 1;\n }\n return digit;\n };\n\n _this.getBCHTypeInfo = function(data) {\n let d = data << 10;\n while (getBCHDigit(d) - getBCHDigit(G15) >= 0) {\n d ^= (G15 << (getBCHDigit(d) - getBCHDigit(G15) ) );\n }\n return ( (data << 10) | d) ^ G15_MASK;\n };\n\n _this.getBCHTypeNumber = function(data) {\n let d = data << 12;\n while (getBCHDigit(d) - getBCHDigit(G18) >= 0) {\n d ^= (G18 << (getBCHDigit(d) - getBCHDigit(G18) ) );\n }\n return (data << 12) | d;\n };\n\n _this.getPatternPosition = function(typeNumber) {\n return PATTERN_POSITION_TABLE[typeNumber - 1];\n };\n\n _this.getMaskFunction = function(maskPattern) {\n\n switch (maskPattern) {\n\n case QRMaskPattern.PATTERN000 :\n return function(i, j) { return (i + j) % 2 == 0; };\n case QRMaskPattern.PATTERN001 :\n return function(i, j) { return i % 2 == 0; };\n case QRMaskPattern.PATTERN010 :\n return function(i, j) { return j % 3 == 0; };\n case QRMaskPattern.PATTERN011 :\n return function(i, j) { return (i + j) % 3 == 0; };\n case QRMaskPattern.PATTERN100 :\n return function(i, j) { return (Math.floor(i / 2) + Math.floor(j / 3) ) % 2 == 0; };\n case QRMaskPattern.PATTERN101 :\n return function(i, j) { return (i * j) % 2 + (i * j) % 3 == 0; };\n case QRMaskPattern.PATTERN110 :\n return function(i, j) { return ( (i * j) % 2 + (i * j) % 3) % 2 == 0; };\n case QRMaskPattern.PATTERN111 :\n return function(i, j) { return ( (i * j) % 3 + (i + j) % 2) % 2 == 0; };\n\n default :\n throw 'bad maskPattern:' + maskPattern;\n }\n };\n\n _this.getErrorCorrectPolynomial = function(errorCorrectLength) {\n let a = qrPolynomial([1], 0);\n for (let i = 0; i < errorCorrectLength; i += 1) {\n a = a.multiply(qrPolynomial([1, QRMath.gexp(i)], 0) );\n }\n return a;\n };\n\n _this.getLengthInBits = function(mode, type) {\n\n if (1 <= type && type < 10) {\n\n // 1 - 9\n\n switch(mode) {\n case QRMode.MODE_NUMBER : return 10;\n case QRMode.MODE_ALPHA_NUM : return 9;\n case QRMode.MODE_8BIT_BYTE : return 8;\n case QRMode.MODE_KANJI : return 8;\n default :\n throw 'mode:' + mode;\n }\n\n } else if (type < 27) {\n\n // 10 - 26\n\n switch(mode) {\n case QRMode.MODE_NUMBER : return 12;\n case QRMode.MODE_ALPHA_NUM : return 11;\n case QRMode.MODE_8BIT_BYTE : return 16;\n case QRMode.MODE_KANJI : return 10;\n default :\n throw 'mode:' + mode;\n }\n\n } else if (type < 41) {\n\n // 27 - 40\n\n switch(mode) {\n case QRMode.MODE_NUMBER : return 14;\n case QRMode.MODE_ALPHA_NUM : return 13;\n case QRMode.MODE_8BIT_BYTE : return 16;\n case QRMode.MODE_KANJI : return 12;\n default :\n throw 'mode:' + mode;\n }\n\n } else {\n throw 'type:' + type;\n }\n };\n\n _this.getLostPoint = function(qrcode) {\n\n const moduleCount = qrcode.getModuleCount();\n\n let lostPoint = 0;\n\n // LEVEL1\n\n for (let row = 0; row < moduleCount; row += 1) {\n for (let col = 0; col < moduleCount; col += 1) {\n\n let sameCount = 0;\n const dark = qrcode.isDark(row, col);\n\n for (let r = -1; r <= 1; r += 1) {\n\n if (row + r < 0 || moduleCount <= row + r) {\n continue;\n }\n\n for (let c = -1; c <= 1; c += 1) {\n\n if (col + c < 0 || moduleCount <= col + c) {\n continue;\n }\n\n if (r == 0 && c == 0) {\n continue;\n }\n\n if (dark == qrcode.isDark(row + r, col + c) ) {\n sameCount += 1;\n }\n }\n }\n\n if (sameCount > 5) {\n lostPoint += (3 + sameCount - 5);\n }\n }\n };\n\n // LEVEL2\n\n for (let row = 0; row < moduleCount - 1; row += 1) {\n for (let col = 0; col < moduleCount - 1; col += 1) {\n let count = 0;\n if (qrcode.isDark(row, col) ) count += 1;\n if (qrcode.isDark(row + 1, col) ) count += 1;\n if (qrcode.isDark(row, col + 1) ) count += 1;\n if (qrcode.isDark(row + 1, col + 1) ) count += 1;\n if (count == 0 || count == 4) {\n lostPoint += 3;\n }\n }\n }\n\n // LEVEL3\n\n for (let row = 0; row < moduleCount; row += 1) {\n for (let col = 0; col < moduleCount - 6; col += 1) {\n if (qrcode.isDark(row, col)\n && !qrcode.isDark(row, col + 1)\n && qrcode.isDark(row, col + 2)\n && qrcode.isDark(row, col + 3)\n && qrcode.isDark(row, col + 4)\n && !qrcode.isDark(row, col + 5)\n && qrcode.isDark(row, col + 6) ) {\n lostPoint += 40;\n }\n }\n }\n\n for (let col = 0; col < moduleCount; col += 1) {\n for (let row = 0; row < moduleCount - 6; row += 1) {\n if (qrcode.isDark(row, col)\n && !qrcode.isDark(row + 1, col)\n && qrcode.isDark(row + 2, col)\n && qrcode.isDark(row + 3, col)\n && qrcode.isDark(row + 4, col)\n && !qrcode.isDark(row + 5, col)\n && qrcode.isDark(row + 6, col) ) {\n lostPoint += 40;\n }\n }\n }\n\n // LEVEL4\n\n let darkCount = 0;\n\n for (let col = 0; col < moduleCount; col += 1) {\n for (let row = 0; row < moduleCount; row += 1) {\n if (qrcode.isDark(row, col) ) {\n darkCount += 1;\n }\n }\n }\n\n const ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;\n lostPoint += ratio * 10;\n\n return lostPoint;\n };\n\n return _this;\n}();\n\n//---------------------------------------------------------------------\n// QRMath\n//---------------------------------------------------------------------\n\nconst QRMath = function() {\n\n const EXP_TABLE = new Array(256);\n const LOG_TABLE = new Array(256);\n\n // initialize tables\n for (let i = 0; i < 8; i += 1) {\n EXP_TABLE[i] = 1 << i;\n }\n for (let i = 8; i < 256; i += 1) {\n EXP_TABLE[i] = EXP_TABLE[i - 4]\n ^ EXP_TABLE[i - 5]\n ^ EXP_TABLE[i - 6]\n ^ EXP_TABLE[i - 8];\n }\n for (let i = 0; i < 255; i += 1) {\n LOG_TABLE[EXP_TABLE[i] ] = i;\n }\n\n const _this = {};\n\n _this.glog = function(n) {\n\n if (n < 1) {\n throw 'glog(' + n + ')';\n }\n\n return LOG_TABLE[n];\n };\n\n _this.gexp = function(n) {\n\n while (n < 0) {\n n += 255;\n }\n\n while (n >= 256) {\n n -= 255;\n }\n\n return EXP_TABLE[n];\n };\n\n return _this;\n}();\n\n//---------------------------------------------------------------------\n// qrPolynomial\n//---------------------------------------------------------------------\n\nconst qrPolynomial = function(num, shift) {\n\n if (typeof num.length == 'undefined') {\n throw num.length + '/' + shift;\n }\n\n const _num = function() {\n let offset = 0;\n while (offset < num.length && num[offset] == 0) {\n offset += 1;\n }\n const _num = new Array(num.length - offset + shift);\n for (let i = 0; i < num.length - offset; i += 1) {\n _num[i] = num[i + offset];\n }\n return _num;\n }();\n\n const _this = {};\n\n _this.getAt = function(index) {\n return _num[index];\n };\n\n _this.getLength = function() {\n return _num.length;\n };\n\n _this.multiply = function(e) {\n\n const num = new Array(_this.getLength() + e.getLength() - 1);\n\n for (let i = 0; i < _this.getLength(); i += 1) {\n for (let j = 0; j < e.getLength(); j += 1) {\n num[i + j] ^= QRMath.gexp(QRMath.glog(_this.getAt(i) ) + QRMath.glog(e.getAt(j) ) );\n }\n }\n\n return qrPolynomial(num, 0);\n };\n\n _this.mod = function(e) {\n\n if (_this.getLength() - e.getLength() < 0) {\n return _this;\n }\n\n const ratio = QRMath.glog(_this.getAt(0) ) - QRMath.glog(e.getAt(0) );\n\n const num = new Array(_this.getLength() );\n for (let i = 0; i < _this.getLength(); i += 1) {\n num[i] = _this.getAt(i);\n }\n\n for (let i = 0; i < e.getLength(); i += 1) {\n num[i] ^= QRMath.gexp(QRMath.glog(e.getAt(i) ) + ratio);\n }\n\n // recursive call\n return qrPolynomial(num, 0).mod(e);\n };\n\n return _this;\n};\n\n//---------------------------------------------------------------------\n// QRRSBlock\n//---------------------------------------------------------------------\n\nconst QRRSBlock = function() {\n\n const RS_BLOCK_TABLE = [\n\n // L\n // M\n // Q\n // H\n\n // 1\n [1, 26, 19],\n [1, 26, 16],\n [1, 26, 13],\n [1, 26, 9],\n\n // 2\n [1, 44, 34],\n [1, 44, 28],\n [1, 44, 22],\n [1, 44, 16],\n\n // 3\n [1, 70, 55],\n [1, 70, 44],\n [2, 35, 17],\n [2, 35, 13],\n\n // 4\n [1, 100, 80],\n [2, 50, 32],\n [2, 50, 24],\n [4, 25, 9],\n\n // 5\n [1, 134, 108],\n [2, 67, 43],\n [2, 33, 15, 2, 34, 16],\n [2, 33, 11, 2, 34, 12],\n\n // 6\n [2, 86, 68],\n [4, 43, 27],\n [4, 43, 19],\n [4, 43, 15],\n\n // 7\n [2, 98, 78],\n [4, 49, 31],\n [2, 32, 14, 4, 33, 15],\n [4, 39, 13, 1, 40, 14],\n\n // 8\n [2, 121, 97],\n [2, 60, 38, 2, 61, 39],\n [4, 40, 18, 2, 41, 19],\n [4, 40, 14, 2, 41, 15],\n\n // 9\n [2, 146, 116],\n [3, 58, 36, 2, 59, 37],\n [4, 36, 16, 4, 37, 17],\n [4, 36, 12, 4, 37, 13],\n\n // 10\n [2, 86, 68, 2, 87, 69],\n [4, 69, 43, 1, 70, 44],\n [6, 43, 19, 2, 44, 20],\n [6, 43, 15, 2, 44, 16],\n\n // 11\n [4, 101, 81],\n [1, 80, 50, 4, 81, 51],\n [4, 50, 22, 4, 51, 23],\n [3, 36, 12, 8, 37, 13],\n\n // 12\n [2, 116, 92, 2, 117, 93],\n [6, 58, 36, 2, 59, 37],\n [4, 46, 20, 6, 47, 21],\n [7, 42, 14, 4, 43, 15],\n\n // 13\n [4, 133, 107],\n [8, 59, 37, 1, 60, 38],\n [8, 44, 20, 4, 45, 21],\n [12, 33, 11, 4, 34, 12],\n\n // 14\n [3, 145, 115, 1, 146, 116],\n [4, 64, 40, 5, 65, 41],\n [11, 36, 16, 5, 37, 17],\n [11, 36, 12, 5, 37, 13],\n\n // 15\n [5, 109, 87, 1, 110, 88],\n [5, 65, 41, 5, 66, 42],\n [5, 54, 24, 7, 55, 25],\n [11, 36, 12, 7, 37, 13],\n\n // 16\n [5, 122, 98, 1, 123, 99],\n [7, 73, 45, 3, 74, 46],\n [15, 43, 19, 2, 44, 20],\n [3, 45, 15, 13, 46, 16],\n\n // 17\n [1, 135, 107, 5, 136, 108],\n [10, 74, 46, 1, 75, 47],\n [1, 50, 22, 15, 51, 23],\n [2, 42, 14, 17, 43, 15],\n\n // 18\n [5, 150, 120, 1, 151, 121],\n [9, 69, 43, 4, 70, 44],\n [17, 50, 22, 1, 51, 23],\n [2, 42, 14, 19, 43, 15],\n\n // 19\n [3, 141, 113, 4, 142, 114],\n [3, 70, 44, 11, 71, 45],\n [17, 47, 21, 4, 48, 22],\n [9, 39, 13, 16, 40, 14],\n\n // 20\n [3, 135, 107, 5, 136, 108],\n [3, 67, 41, 13, 68, 42],\n [15, 54, 24, 5, 55, 25],\n [15, 43, 15, 10, 44, 16],\n\n // 21\n [4, 144, 116, 4, 145, 117],\n [17, 68, 42],\n [17, 50, 22, 6, 51, 23],\n [19, 46, 16, 6, 47, 17],\n\n // 22\n [2, 139, 111, 7, 140, 112],\n [17, 74, 46],\n [7, 54, 24, 16, 55, 25],\n [34, 37, 13],\n\n // 23\n [4, 151, 121, 5, 152, 122],\n [4, 75, 47, 14, 76, 48],\n [11, 54, 24, 14, 55, 25],\n [16, 45, 15, 14, 46, 16],\n\n // 24\n [6, 147, 117, 4, 148, 118],\n [6, 73, 45, 14, 74, 46],\n [11, 54, 24, 16, 55, 25],\n [30, 46, 16, 2, 47, 17],\n\n // 25\n [8, 132, 106, 4, 133, 107],\n [8, 75, 47, 13, 76, 48],\n [7, 54, 24, 22, 55, 25],\n [22, 45, 15, 13, 46, 16],\n\n // 26\n [10, 142, 114, 2, 143, 115],\n [19, 74, 46, 4, 75, 47],\n [28, 50, 22, 6, 51, 23],\n [33, 46, 16, 4, 47, 17],\n\n // 27\n [8, 152, 122, 4, 153, 123],\n [22, 73, 45, 3, 74, 46],\n [8, 53, 23, 26, 54, 24],\n [12, 45, 15, 28, 46, 16],\n\n // 28\n [3, 147, 117, 10, 148, 118],\n [3, 73, 45, 23, 74, 46],\n [4, 54, 24, 31, 55, 25],\n [11, 45, 15, 31, 46, 16],\n\n // 29\n [7, 146, 116, 7, 147, 117],\n [21, 73, 45, 7, 74, 46],\n [1, 53, 23, 37, 54, 24],\n [19, 45, 15, 26, 46, 16],\n\n // 30\n [5, 145, 115, 10, 146, 116],\n [19, 75, 47, 10, 76, 48],\n [15, 54, 24, 25, 55, 25],\n [23, 45, 15, 25, 46, 16],\n\n // 31\n [13, 145, 115, 3, 146, 116],\n [2, 74, 46, 29, 75, 47],\n [42, 54, 24, 1, 55, 25],\n [23, 45, 15, 28, 46, 16],\n\n // 32\n [17, 145, 115],\n [10, 74, 46, 23, 75, 47],\n [10, 54, 24, 35, 55, 25],\n [19, 45, 15, 35, 46, 16],\n\n // 33\n [17, 145, 115, 1, 146, 116],\n [14, 74, 46, 21, 75, 47],\n [29, 54, 24, 19, 55, 25],\n [11, 45, 15, 46, 46, 16],\n\n // 34\n [13, 145, 115, 6, 146, 116],\n [14, 74, 46, 23, 75, 47],\n [44, 54, 24, 7, 55, 25],\n [59, 46, 16, 1, 47, 17],\n\n // 35\n [12, 151, 121, 7, 152, 122],\n [12, 75, 47, 26, 76, 48],\n [39, 54, 24, 14, 55, 25],\n [22, 45, 15, 41, 46, 16],\n\n // 36\n [6, 151, 121, 14, 152, 122],\n [6, 75, 47, 34, 76, 48],\n [46, 54, 24, 10, 55, 25],\n [2, 45, 15, 64, 46, 16],\n\n // 37\n [17, 152, 122, 4, 153, 123],\n [29, 74, 46, 14, 75, 47],\n [49, 54, 24, 10, 55, 25],\n [24, 45, 15, 46, 46, 16],\n\n // 38\n [4, 152, 122, 18, 153, 123],\n [13, 74, 46, 32, 75, 47],\n [48, 54, 24, 14, 55, 25],\n [42, 45, 15, 32, 46, 16],\n\n // 39\n [20, 147, 117, 4, 148, 118],\n [40, 75, 47, 7, 76, 48],\n [43, 54, 24, 22, 55, 25],\n [10, 45, 15, 67, 46, 16],\n\n // 40\n [19, 148, 118, 6, 149, 119],\n [18, 75, 47, 31, 76, 48],\n [34, 54, 24, 34, 55, 25],\n [20, 45, 15, 61, 46, 16]\n ];\n\n const qrRSBlock = function(totalCount, dataCount) {\n const _this = {};\n _this.totalCount = totalCount;\n _this.dataCount = dataCount;\n return _this;\n };\n\n const _this = {};\n\n const getRsBlockTable = function(typeNumber, errorCorrectionLevel) {\n\n switch(errorCorrectionLevel) {\n case QRErrorCorrectionLevel.L :\n return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];\n case QRErrorCorrectionLevel.M :\n return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];\n case QRErrorCorrectionLevel.Q :\n return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];\n case QRErrorCorrectionLevel.H :\n return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];\n default :\n return undefined;\n }\n };\n\n _this.getRSBlocks = function(typeNumber, errorCorrectionLevel) {\n\n const rsBlock = getRsBlockTable(typeNumber, errorCorrectionLevel);\n\n if (typeof rsBlock == 'undefined') {\n throw 'bad rs block @ typeNumber:' + typeNumber +\n '/errorCorrectionLevel:' + errorCorrectionLevel;\n }\n\n const length = rsBlock.length / 3;\n\n const list = [];\n\n for (let i = 0; i < length; i += 1) {\n\n const count = rsBlock[i * 3 + 0];\n const totalCount = rsBlock[i * 3 + 1];\n const dataCount = rsBlock[i * 3 + 2];\n\n for (let j = 0; j < count; j += 1) {\n list.push(qrRSBlock(totalCount, dataCount) );\n }\n }\n\n return list;\n };\n\n return _this;\n}();\n\n//---------------------------------------------------------------------\n// qrBitBuffer\n//---------------------------------------------------------------------\n\nconst qrBitBuffer = function() {\n\n const _buffer = [];\n let _length = 0;\n\n const _this = {};\n\n _this.getBuffer = function() {\n return _buffer;\n };\n\n _this.getAt = function(index) {\n const bufIndex = Math.floor(index / 8);\n return ( (_buffer[bufIndex] >>> (7 - index % 8) ) & 1) == 1;\n };\n\n _this.put = function(num, length) {\n for (let i = 0; i < length; i += 1) {\n _this.putBit( ( (num >>> (length - i - 1) ) & 1) == 1);\n }\n };\n\n _this.getLengthInBits = function() {\n return _length;\n };\n\n _this.putBit = function(bit) {\n\n const bufIndex = Math.floor(_length / 8);\n if (_buffer.length <= bufIndex) {\n _buffer.push(0);\n }\n\n if (bit) {\n _buffer[bufIndex] |= (0x80 >>> (_length % 8) );\n }\n\n _length += 1;\n };\n\n return _this;\n};\n\n//---------------------------------------------------------------------\n// qrNumber\n//---------------------------------------------------------------------\n\nconst qrNumber = function(data) {\n\n const _mode = QRMode.MODE_NUMBER;\n const _data = data;\n\n const _this = {};\n\n _this.getMode = function() {\n return _mode;\n };\n\n _this.getLength = function(buffer) {\n return _data.length;\n };\n\n _this.write = function(buffer) {\n\n const data = _data;\n\n let i = 0;\n\n while (i + 2 < data.length) {\n buffer.put(strToNum(data.substring(i, i + 3) ), 10);\n i += 3;\n }\n\n if (i < data.length) {\n if (data.length - i == 1) {\n buffer.put(strToNum(data.substring(i, i + 1) ), 4);\n } else if (data.length - i == 2) {\n buffer.put(strToNum(data.substring(i, i + 2) ), 7);\n }\n }\n };\n\n const strToNum = function(s) {\n let num = 0;\n for (let i = 0; i < s.length; i += 1) {\n num = num * 10 + chatToNum(s.charAt(i) );\n }\n return num;\n };\n\n const chatToNum = function(c) {\n if ('0' <= c && c <= '9') {\n return c.charCodeAt(0) - '0'.charCodeAt(0);\n }\n throw 'illegal char :' + c;\n };\n\n return _this;\n};\n\n//---------------------------------------------------------------------\n// qrAlphaNum\n//---------------------------------------------------------------------\n\nconst qrAlphaNum = function(data) {\n\n const _mode = QRMode.MODE_ALPHA_NUM;\n const _data = data;\n\n const _this = {};\n\n _this.getMode = function() {\n return _mode;\n };\n\n _this.getLength = function(buffer) {\n return _data.length;\n };\n\n _this.write = function(buffer) {\n\n const s = _data;\n\n let i = 0;\n\n while (i + 1 < s.length) {\n buffer.put(\n getCode(s.charAt(i) ) * 45 +\n getCode(s.charAt(i + 1) ), 11);\n i += 2;\n }\n\n if (i < s.length) {\n buffer.put(getCode(s.charAt(i) ), 6);\n }\n };\n\n const getCode = function(c) {\n\n if ('0' <= c && c <= '9') {\n return c.charCodeAt(0) - '0'.charCodeAt(0);\n } else if ('A' <= c && c <= 'Z') {\n return c.charCodeAt(0) - 'A'.charCodeAt(0) + 10;\n } else {\n switch (c) {\n case '\\u0020' : return 36;\n case '$' : return 37;\n case '%' : return 38;\n case '*' : return 39;\n case '+' : return 40;\n case '-' : return 41;\n case '.' : return 42;\n case '/' : return 43;\n case ':' : return 44;\n default :\n throw 'illegal char :' + c;\n }\n }\n };\n\n return _this;\n};\n\n//---------------------------------------------------------------------\n// qr8BitByte\n//---------------------------------------------------------------------\n\nconst qr8BitByte = function(data) {\n\n const _mode = QRMode.MODE_8BIT_BYTE;\n const _data = data;\n const _bytes = qrcode.stringToBytes(data);\n\n const _this = {};\n\n _this.getMode = function() {\n return _mode;\n };\n\n _this.getLength = function(buffer) {\n return _bytes.length;\n };\n\n _this.write = function(buffer) {\n for (let i = 0; i < _bytes.length; i += 1) {\n buffer.put(_bytes[i], 8);\n }\n };\n\n return _this;\n};\n\n//---------------------------------------------------------------------\n// qrKanji\n//---------------------------------------------------------------------\n\nconst qrKanji = function(data) {\n\n const _mode = QRMode.MODE_KANJI;\n const _data = data;\n\n const stringToBytes = qrcode.stringToBytes;\n !function(c, code) {\n // self test for sjis support.\n const test = stringToBytes(c);\n if (test.length != 2 || ( (test[0] << 8) | test[1]) != code) {\n throw 'sjis not supported.';\n }\n }('\\u53cb', 0x9746);\n\n const _bytes = stringToBytes(data);\n\n const _this = {};\n\n _this.getMode = function() {\n return _mode;\n };\n\n _this.getLength = function(buffer) {\n return ~~(_bytes.length / 2);\n };\n\n _this.write = function(buffer) {\n\n const data = _bytes;\n\n let i = 0;\n\n while (i + 1 < data.length) {\n\n let c = ( (0xff & data[i]) << 8) | (0xff & data[i + 1]);\n\n if (0x8140 <= c && c <= 0x9FFC) {\n c -= 0x8140;\n } else if (0xE040 <= c && c <= 0xEBBF) {\n c -= 0xC140;\n } else {\n throw 'illegal char at ' + (i + 1) + '/' + c;\n }\n\n c = ( (c >>> 8) & 0xff) * 0xC0 + (c & 0xff);\n\n buffer.put(c, 13);\n\n i += 2;\n }\n\n if (i < data.length) {\n throw 'illegal char at ' + (i + 1);\n }\n };\n\n return _this;\n};\n\n//=====================================================================\n// GIF Support etc.\n//\n\n//---------------------------------------------------------------------\n// byteArrayOutputStream\n//---------------------------------------------------------------------\n\nconst byteArrayOutputStream = function() {\n\n const _bytes = [];\n\n const _this = {};\n\n _this.writeByte = function(b) {\n _bytes.push(b & 0xff);\n };\n\n _this.writeShort = function(i) {\n _this.writeByte(i);\n _this.writeByte(i >>> 8);\n };\n\n _this.writeBytes = function(b, off, len) {\n off = off || 0;\n len = len || b.length;\n for (let i = 0; i < len; i += 1) {\n _this.writeByte(b[i + off]);\n }\n };\n\n _this.writeString = function(s) {\n for (let i = 0; i < s.length; i += 1) {\n _this.writeByte(s.charCodeAt(i) );\n }\n };\n\n _this.toByteArray = function() {\n return _bytes;\n };\n\n _this.toString = function() {\n let s = '';\n s += '[';\n for (let i = 0; i < _bytes.length; i += 1) {\n if (i > 0) {\n s += ',';\n }\n s += _bytes[i];\n }\n s += ']';\n return s;\n };\n\n return _this;\n};\n\n//---------------------------------------------------------------------\n// base64EncodeOutputStream\n//---------------------------------------------------------------------\n\nconst base64EncodeOutputStream = function() {\n\n let _buffer = 0;\n let _buflen = 0;\n let _length = 0;\n let _base64 = '';\n\n const _this = {};\n\n const writeEncoded = function(b) {\n _base64 += String.fromCharCode(encode(b & 0x3f) );\n };\n\n const encode = function(n) {\n if (n < 0) {\n throw 'n:' + n;\n } else if (n < 26) {\n return 0x41 + n;\n } else if (n < 52) {\n return 0x61 + (n - 26);\n } else if (n < 62) {\n return 0x30 + (n - 52);\n } else if (n == 62) {\n return 0x2b;\n } else if (n == 63) {\n return 0x2f;\n } else {\n throw 'n:' + n;\n }\n };\n\n _this.writeByte = function(n) {\n\n _buffer = (_buffer << 8) | (n & 0xff);\n _buflen += 8;\n _length += 1;\n\n while (_buflen >= 6) {\n writeEncoded(_buffer >>> (_buflen - 6) );\n _buflen -= 6;\n }\n };\n\n _this.flush = function() {\n\n if (_buflen > 0) {\n writeEncoded(_buffer << (6 - _buflen) );\n _buffer = 0;\n _buflen = 0;\n }\n\n if (_length % 3 != 0) {\n // padding\n const padlen = 3 - _length % 3;\n for (let i = 0; i < padlen; i += 1) {\n _base64 += '=';\n }\n }\n };\n\n _this.toString = function() {\n return _base64;\n };\n\n return _this;\n};\n\n//---------------------------------------------------------------------\n// base64DecodeInputStream\n//---------------------------------------------------------------------\n\nconst base64DecodeInputStream = function(str) {\n\n const _str = str;\n let _pos = 0;\n let _buffer = 0;\n let _buflen = 0;\n\n const _this = {};\n\n _this.read = function() {\n\n while (_buflen < 8) {\n\n if (_pos >= _str.length) {\n if (_buflen == 0) {\n return -1;\n }\n throw 'unexpected end of file./' + _buflen;\n }\n\n const c = _str.charAt(_pos);\n _pos += 1;\n\n if (c == '=') {\n _buflen = 0;\n return -1;\n } else if (c.match(/^\\s$/) ) {\n // ignore if whitespace.\n continue;\n }\n\n _buffer = (_buffer << 6) | decode(c.charCodeAt(0) );\n _buflen += 6;\n }\n\n const n = (_buffer >>> (_buflen - 8) ) & 0xff;\n _buflen -= 8;\n return n;\n };\n\n const decode = function(c) {\n if (0x41 <= c && c <= 0x5a) {\n return c - 0x41;\n } else if (0x61 <= c && c <= 0x7a) {\n return c - 0x61 + 26;\n } else if (0x30 <= c && c <= 0x39) {\n return c - 0x30 + 52;\n } else if (c == 0x2b) {\n return 62;\n } else if (c == 0x2f) {\n return 63;\n } else {\n throw 'c:' + c;\n }\n };\n\n return _this;\n};\n\n//---------------------------------------------------------------------\n// gifImage (B/W)\n//---------------------------------------------------------------------\n\nconst gifImage = function(width, height) {\n\n const _width = width;\n const _height = height;\n const _data = new Array(width * height);\n\n const _this = {};\n\n _this.setPixel = function(x, y, pixel) {\n _data[y * _width + x] = pixel;\n };\n\n _this.write = function(out) {\n\n //---------------------------------\n // GIF Signature\n\n out.writeString('GIF87a');\n\n //---------------------------------\n // Screen Descriptor\n\n out.writeShort(_width);\n out.writeShort(_height);\n\n out.writeByte(0x80); // 2bit\n out.writeByte(0);\n out.writeByte(0);\n\n //---------------------------------\n // Global Color Map\n\n // black\n out.writeByte(0x00);\n out.writeByte(0x00);\n out.writeByte(0x00);\n\n // white\n out.writeByte(0xff);\n out.writeByte(0xff);\n out.writeByte(0xff);\n\n //---------------------------------\n // Image Descriptor\n\n out.writeString(',');\n out.writeShort(0);\n out.writeShort(0);\n out.writeShort(_width);\n out.writeShort(_height);\n out.writeByte(0);\n\n //---------------------------------\n // Local Color Map\n\n //---------------------------------\n // Raster Data\n\n const lzwMinCodeSize = 2;\n const raster = getLZWRaster(lzwMinCodeSize);\n\n out.writeByte(lzwMinCodeSize);\n\n let offset = 0;\n\n while (raster.length - offset > 255) {\n out.writeByte(255);\n out.writeBytes(raster, offset, 255);\n offset += 255;\n }\n\n out.writeByte(raster.length - offset);\n out.writeBytes(raster, offset, raster.length - offset);\n out.writeByte(0x00);\n\n //---------------------------------\n // GIF Terminator\n out.writeString(';');\n };\n\n const bitOutputStream = function(out) {\n\n const _out = out;\n let _bitLength = 0;\n let _bitBuffer = 0;\n\n const _this = {};\n\n _this.write = function(data, length) {\n\n if ( (data >>> length) != 0) {\n throw 'length over';\n }\n\n while (_bitLength + length >= 8) {\n _out.writeByte(0xff & ( (data << _bitLength) | _bitBuffer) );\n length -= (8 - _bitLength);\n data >>>= (8 - _bitLength);\n _bitBuffer = 0;\n _bitLength = 0;\n }\n\n _bitBuffer = (data << _bitLength) | _bitBuffer;\n _bitLength = _bitLength + length;\n };\n\n _this.flush = function() {\n if (_bitLength > 0) {\n _out.writeByte(_bitBuffer);\n }\n };\n\n return _this;\n };\n\n const getLZWRaster = function(lzwMinCodeSize) {\n\n const clearCode = 1 << lzwMinCodeSize;\n const endCode = (1 << lzwMinCodeSize) + 1;\n let bitLength = lzwMinCodeSize + 1;\n\n // Setup LZWTable\n const table = lzwTable();\n\n for (let i = 0; i < clearCode; i += 1) {\n table.add(String.fromCharCode(i) );\n }\n table.add(String.fromCharCode(clearCode) );\n table.add(String.fromCharCode(endCode) );\n\n const byteOut = byteArrayOutputStream();\n const bitOut = bitOutputStream(byteOut);\n\n // clear code\n bitOut.write(clearCode, bitLength);\n\n let dataIndex = 0;\n\n let s = String.fromCharCode(_data[dataIndex]);\n dataIndex += 1;\n\n while (dataIndex < _data.length) {\n\n const c = String.fromCharCode(_data[dataIndex]);\n dataIndex += 1;\n\n if (table.contains(s + c) ) {\n\n s = s + c;\n\n } else {\n\n bitOut.write(table.indexOf(s), bitLength);\n\n if (table.size() < 0xfff) {\n\n if (table.size() == (1 << bitLength) ) {\n bitLength += 1;\n }\n\n table.add(s + c);\n }\n\n s = c;\n }\n }\n\n bitOut.write(table.indexOf(s), bitLength);\n\n // end code\n bitOut.write(endCode, bitLength);\n\n bitOut.flush();\n\n return byteOut.toByteArray();\n };\n\n const lzwTable = function() {\n\n const _map = {};\n let _size = 0;\n\n const _this = {};\n\n _this.add = function(key) {\n if (_this.contains(key) ) {\n throw 'dup key:' + key;\n }\n _map[key] = _size;\n _size += 1;\n };\n\n _this.size = function() {\n return _size;\n };\n\n _this.indexOf = function(key) {\n return _map[key];\n };\n\n _this.contains = function(key) {\n return typeof _map[key] != 'undefined';\n };\n\n return _this;\n };\n\n return _this;\n};\n\nconst createDataURL = function(width, height, getPixel) {\n const gif = gifImage(width, height);\n for (let y = 0; y < height; y += 1) {\n for (let x = 0; x < width; x += 1) {\n gif.setPixel(x, y, getPixel(x, y) );\n }\n }\n\n const b = byteArrayOutputStream();\n gif.write(b);\n\n const base64 = base64EncodeOutputStream();\n const bytes = b.toByteArray();\n for (let i = 0; i < bytes.length; i += 1) {\n base64.writeByte(bytes[i]);\n }\n base64.flush();\n\n return 'data:image/gif;base64,' + base64;\n};\n\nexport default qrcode;\n\nexport const stringToBytes = qrcode.stringToBytes;\n"],"names":[],"mappings":";CAqmCe,WAAW;AAExB,QAAM,YAAY,IAAI,MAAM,GAAG;AAC/B,QAAM,YAAY,IAAI,MAAM,GAAG;AAG/B,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;AAC7B,cAAU,CAAC,IAAI,KAAK;AAAA,EACtB;AACA,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK,GAAG;AAC/B,cAAU,CAAC,IAAI,UAAU,IAAI,CAAC,IAC1B,UAAU,IAAI,CAAC,IACf,UAAU,IAAI,CAAC,IACf,UAAU,IAAI,CAAC;AAAA,EACrB;AACA,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK,GAAG;AAC/B,cAAU,UAAU,CAAC,CAAC,IAAK;AAAA,EAC7B;AAEA,QAAM,QAAQ,CAAA;AAEd,QAAM,OAAO,SAAS,GAAG;AAEvB,QAAI,IAAI,GAAG;AACT,YAAM,UAAU,IAAI;AAAA,IACtB;AAEA,WAAO,UAAU,CAAC;AAAA,EACpB;AAEA,QAAM,OAAO,SAAS,GAAG;AAEvB,WAAO,IAAI,GAAG;AACZ,WAAK;AAAA,IACP;AAEA,WAAO,KAAK,KAAK;AACf,WAAK;AAAA,IACP;AAEA,WAAO,UAAU,CAAC;AAAA,EACpB;AAEA,SAAO;AACT,GAAC;","x_google_ignoreList":[0]}
|