@mastra/react 1.7.3-alpha.3 → 1.8.0-alpha.4
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/dist/accumulator-B1MuNX3j.js +1668 -0
- package/dist/accumulator-B1MuNX3j.js.map +1 -0
- package/dist/accumulator-CsUGDUHk.cjs +1709 -0
- package/dist/accumulator-CsUGDUHk.cjs.map +1 -0
- package/dist/agent/hooks.d.ts.map +1 -1
- package/dist/agent/user-message.d.ts +4 -0
- package/dist/agent/user-message.d.ts.map +1 -0
- package/dist/chat/index.cjs +3 -0
- package/dist/chat/index.d.ts +3 -0
- package/dist/chat/index.d.ts.map +1 -0
- package/dist/chat/index.js +2 -0
- package/dist/feedback-refetch-interval-DLHzQoVV.js +12 -0
- package/dist/feedback-refetch-interval-DLHzQoVV.js.map +1 -0
- package/dist/feedback-refetch-interval-XD5FVc2k.cjs +17 -0
- package/dist/feedback-refetch-interval-XD5FVc2k.cjs.map +1 -0
- package/dist/hooks/agents/index.cjs +988 -0
- package/dist/hooks/agents/index.cjs.map +1 -0
- package/dist/hooks/agents/index.d.ts +19 -0
- package/dist/hooks/agents/index.d.ts.map +1 -0
- package/dist/hooks/agents/index.js +952 -0
- package/dist/hooks/agents/index.js.map +1 -0
- package/dist/hooks/agents/is-model-not-allowed.d.ts +15 -0
- package/dist/hooks/agents/is-model-not-allowed.d.ts.map +1 -0
- package/dist/hooks/agents/use-agent-messages.d.ts +18 -0
- package/dist/hooks/agents/use-agent-messages.d.ts.map +1 -0
- package/dist/hooks/agents/use-agent-plan.d.ts +14 -0
- package/dist/hooks/agents/use-agent-plan.d.ts.map +1 -0
- package/dist/hooks/agents/use-agent-skills.d.ts +2021 -0
- package/dist/hooks/agents/use-agent-skills.d.ts.map +1 -0
- package/dist/hooks/agents/use-agent-versions.d.ts +72 -0
- package/dist/hooks/agents/use-agent-versions.d.ts.map +1 -0
- package/dist/hooks/agents/use-agent-working-memory.d.ts +11 -0
- package/dist/hooks/agents/use-agent-working-memory.d.ts.map +1 -0
- package/dist/hooks/agents/use-agent-workspace.d.ts +2022 -0
- package/dist/hooks/agents/use-agent-workspace.d.ts.map +1 -0
- package/dist/hooks/agents/use-agent.d.ts +12 -0
- package/dist/hooks/agents/use-agent.d.ts.map +1 -0
- package/dist/hooks/agents/use-agents-model-providers.d.ts +9 -0
- package/dist/hooks/agents/use-agents-model-providers.d.ts.map +1 -0
- package/dist/hooks/agents/use-agents.d.ts +28 -0
- package/dist/hooks/agents/use-agents.d.ts.map +1 -0
- package/dist/hooks/agents/use-background-tasks.d.ts +51 -0
- package/dist/hooks/agents/use-background-tasks.d.ts.map +1 -0
- package/dist/hooks/agents/use-browser-session-probe.d.ts +34 -0
- package/dist/hooks/agents/use-browser-session-probe.d.ts.map +1 -0
- package/dist/hooks/agents/use-channels.d.ts +34 -0
- package/dist/hooks/agents/use-channels.d.ts.map +1 -0
- package/dist/hooks/agents/use-close-browser.d.ts +17 -0
- package/dist/hooks/agents/use-close-browser.d.ts.map +1 -0
- package/dist/hooks/agents/use-execute-agent-tool.d.ts +14 -0
- package/dist/hooks/agents/use-execute-agent-tool.d.ts.map +1 -0
- package/dist/hooks/agents/use-preview-instructions.d.ts +20 -0
- package/dist/hooks/agents/use-preview-instructions.d.ts.map +1 -0
- package/dist/hooks/agents/use-stored-agents.d.ts +8023 -0
- package/dist/hooks/agents/use-stored-agents.d.ts.map +1 -0
- package/dist/hooks/agents/use-stored-skills.d.ts +8 -0
- package/dist/hooks/agents/use-stored-skills.d.ts.map +1 -0
- package/dist/hooks/auth/fetch-with-refresh.d.ts +28 -0
- package/dist/hooks/auth/fetch-with-refresh.d.ts.map +1 -0
- package/dist/hooks/auth/get-client-query-key.d.ts +7 -0
- package/dist/hooks/auth/get-client-query-key.d.ts.map +1 -0
- package/dist/hooks/auth/index.cjs +492 -0
- package/dist/hooks/auth/index.cjs.map +1 -0
- package/dist/hooks/auth/index.d.ts +11 -0
- package/dist/hooks/auth/index.d.ts.map +1 -0
- package/dist/hooks/auth/index.js +474 -0
- package/dist/hooks/auth/index.js.map +1 -0
- package/dist/hooks/auth/sso-login.d.ts +8 -0
- package/dist/hooks/auth/sso-login.d.ts.map +1 -0
- package/dist/hooks/auth/types.d.ts +107 -0
- package/dist/hooks/auth/types.d.ts.map +1 -0
- package/dist/hooks/auth/use-auth-actions.d.ts +99 -0
- package/dist/hooks/auth/use-auth-actions.d.ts.map +1 -0
- package/dist/hooks/auth/use-auth-capabilities.d.ts +43 -0
- package/dist/hooks/auth/use-auth-capabilities.d.ts.map +1 -0
- package/dist/hooks/auth/use-credentials-login.d.ts +63 -0
- package/dist/hooks/auth/use-credentials-login.d.ts.map +1 -0
- package/dist/hooks/auth/use-credentials-signup.d.ts +66 -0
- package/dist/hooks/auth/use-credentials-signup.d.ts.map +1 -0
- package/dist/hooks/auth/use-current-user.d.ts +40 -0
- package/dist/hooks/auth/use-current-user.d.ts.map +1 -0
- package/dist/hooks/auth/use-permission-patterns.d.ts +24 -0
- package/dist/hooks/auth/use-permission-patterns.d.ts.map +1 -0
- package/dist/hooks/capabilities/index.cjs +47 -0
- package/dist/hooks/capabilities/index.cjs.map +1 -0
- package/dist/hooks/capabilities/index.d.ts +4 -0
- package/dist/hooks/capabilities/index.d.ts.map +1 -0
- package/dist/hooks/capabilities/index.js +44 -0
- package/dist/hooks/capabilities/index.js.map +1 -0
- package/dist/hooks/capabilities/use-feedback-available.d.ts +9 -0
- package/dist/hooks/capabilities/use-feedback-available.d.ts.map +1 -0
- package/dist/hooks/capabilities/use-observability-capabilities.d.ts +9 -0
- package/dist/hooks/capabilities/use-observability-capabilities.d.ts.map +1 -0
- package/dist/hooks/capabilities/use-trace-query-available.d.ts +9 -0
- package/dist/hooks/capabilities/use-trace-query-available.d.ts.map +1 -0
- package/dist/hooks/configuration/index.cjs +18 -0
- package/dist/hooks/configuration/index.cjs.map +1 -0
- package/dist/hooks/configuration/index.d.ts +2 -0
- package/dist/hooks/configuration/index.d.ts.map +1 -0
- package/dist/hooks/configuration/index.js +17 -0
- package/dist/hooks/configuration/index.js.map +1 -0
- package/dist/hooks/configuration/use-mastra-packages.d.ts +9 -0
- package/dist/hooks/configuration/use-mastra-packages.d.ts.map +1 -0
- package/dist/hooks/datasets/index.cjs +615 -0
- package/dist/hooks/datasets/index.cjs.map +1 -0
- package/dist/hooks/datasets/index.d.ts +10 -0
- package/dist/hooks/datasets/index.d.ts.map +1 -0
- package/dist/hooks/datasets/index.js +600 -0
- package/dist/hooks/datasets/index.js.map +1 -0
- package/dist/hooks/datasets/use-compare-experiments.d.ts +23 -0
- package/dist/hooks/datasets/use-compare-experiments.d.ts.map +1 -0
- package/dist/hooks/datasets/use-dataset-experiments.d.ts +49 -0
- package/dist/hooks/datasets/use-dataset-experiments.d.ts.map +1 -0
- package/dist/hooks/datasets/use-dataset-item-versions.d.ts +31 -0
- package/dist/hooks/datasets/use-dataset-item-versions.d.ts.map +1 -0
- package/dist/hooks/datasets/use-dataset-items.d.ts +38 -0
- package/dist/hooks/datasets/use-dataset-items.d.ts.map +1 -0
- package/dist/hooks/datasets/use-dataset-mutations.d.ts +362 -0
- package/dist/hooks/datasets/use-dataset-mutations.d.ts.map +1 -0
- package/dist/hooks/datasets/use-dataset-versions.d.ts +23 -0
- package/dist/hooks/datasets/use-dataset-versions.d.ts.map +1 -0
- package/dist/hooks/datasets/use-datasets.d.ts +44 -0
- package/dist/hooks/datasets/use-datasets.d.ts.map +1 -0
- package/dist/hooks/datasets/use-experiments.d.ts +16 -0
- package/dist/hooks/datasets/use-experiments.d.ts.map +1 -0
- package/dist/hooks/datasets/use-workflow-schema.d.ts +16 -0
- package/dist/hooks/datasets/use-workflow-schema.d.ts.map +1 -0
- package/dist/hooks/embedders/index.cjs +19 -0
- package/dist/hooks/embedders/index.cjs.map +1 -0
- package/dist/hooks/embedders/index.d.ts +2 -0
- package/dist/hooks/embedders/index.d.ts.map +1 -0
- package/dist/hooks/embedders/index.js +18 -0
- package/dist/hooks/embedders/index.js.map +1 -0
- package/dist/hooks/embedders/use-embedders.d.ts +17 -0
- package/dist/hooks/embedders/use-embedders.d.ts.map +1 -0
- package/dist/hooks/experiments/index.cjs +152 -0
- package/dist/hooks/experiments/index.cjs.map +1 -0
- package/dist/hooks/experiments/index.d.ts +5 -0
- package/dist/hooks/experiments/index.d.ts.map +1 -0
- package/dist/hooks/experiments/index.js +146 -0
- package/dist/hooks/experiments/index.js.map +1 -0
- package/dist/hooks/experiments/use-experiment-metrics.d.ts +30 -0
- package/dist/hooks/experiments/use-experiment-metrics.d.ts.map +1 -0
- package/dist/hooks/experiments/use-experiment-trace.d.ts +13 -0
- package/dist/hooks/experiments/use-experiment-trace.d.ts.map +1 -0
- package/dist/hooks/experiments/use-experiments-for-dataset-filter.d.ts +22 -0
- package/dist/hooks/experiments/use-experiments-for-dataset-filter.d.ts.map +1 -0
- package/dist/hooks/experiments/use-infinite-experiments.d.ts +22 -0
- package/dist/hooks/experiments/use-infinite-experiments.d.ts.map +1 -0
- package/dist/hooks/feedback/feedback-refetch-interval.d.ts +7 -0
- package/dist/hooks/feedback/feedback-refetch-interval.d.ts.map +1 -0
- package/dist/hooks/feedback/index.cjs +22 -0
- package/dist/hooks/feedback/index.cjs.map +1 -0
- package/dist/hooks/feedback/index.d.ts +3 -0
- package/dist/hooks/feedback/index.d.ts.map +1 -0
- package/dist/hooks/feedback/index.js +20 -0
- package/dist/hooks/feedback/index.js.map +1 -0
- package/dist/hooks/feedback/use-feedback.d.ts +56 -0
- package/dist/hooks/feedback/use-feedback.d.ts.map +1 -0
- package/dist/hooks/llm/index.cjs +17 -0
- package/dist/hooks/llm/index.cjs.map +1 -0
- package/dist/hooks/llm/index.d.ts +2 -0
- package/dist/hooks/llm/index.d.ts.map +1 -0
- package/dist/hooks/llm/index.js +16 -0
- package/dist/hooks/llm/index.js.map +1 -0
- package/dist/hooks/llm/use-llm-providers.d.ts +7 -0
- package/dist/hooks/llm/use-llm-providers.d.ts.map +1 -0
- package/dist/hooks/logs/index.cjs +84 -0
- package/dist/hooks/logs/index.cjs.map +1 -0
- package/dist/hooks/logs/index.d.ts +4 -0
- package/dist/hooks/logs/index.d.ts.map +1 -0
- package/dist/hooks/logs/index.js +82 -0
- package/dist/hooks/logs/index.js.map +1 -0
- package/dist/hooks/logs/types.d.ts +36 -0
- package/dist/hooks/logs/types.d.ts.map +1 -0
- package/dist/hooks/logs/use-logs.d.ts +79 -0
- package/dist/hooks/logs/use-logs.d.ts.map +1 -0
- package/dist/hooks/mcps/index.cjs +215 -0
- package/dist/hooks/mcps/index.cjs.map +1 -0
- package/dist/hooks/mcps/index.d.ts +7 -0
- package/dist/hooks/mcps/index.d.ts.map +1 -0
- package/dist/hooks/mcps/index.js +208 -0
- package/dist/hooks/mcps/index.js.map +1 -0
- package/dist/hooks/mcps/use-mcp-app-tools.d.ts +21 -0
- package/dist/hooks/mcps/use-mcp-app-tools.d.ts.map +1 -0
- package/dist/hooks/mcps/use-mcp-server-tool.d.ts +25 -0
- package/dist/hooks/mcps/use-mcp-server-tool.d.ts.map +1 -0
- package/dist/hooks/mcps/use-mcp-server-tools-by-id.d.ts +13 -0
- package/dist/hooks/mcps/use-mcp-server-tools-by-id.d.ts.map +1 -0
- package/dist/hooks/mcps/use-mcp-server-tools.d.ts +9 -0
- package/dist/hooks/mcps/use-mcp-server-tools.d.ts.map +1 -0
- package/dist/hooks/mcps/use-mcp-servers.d.ts +8 -0
- package/dist/hooks/mcps/use-mcp-servers.d.ts.map +1 -0
- package/dist/hooks/mcps/use-try-connect-mcp.d.ts +15 -0
- package/dist/hooks/mcps/use-try-connect-mcp.d.ts.map +1 -0
- package/dist/hooks/memory/index.cjs +328 -0
- package/dist/hooks/memory/index.cjs.map +1 -0
- package/dist/hooks/memory/index.d.ts +5 -0
- package/dist/hooks/memory/index.d.ts.map +1 -0
- package/dist/hooks/memory/index.js +312 -0
- package/dist/hooks/memory/index.js.map +1 -0
- package/dist/hooks/memory/use-memory-status.d.ts +12 -0
- package/dist/hooks/memory/use-memory-status.d.ts.map +1 -0
- package/dist/hooks/memory/use-memory-thread-messages.d.ts +13 -0
- package/dist/hooks/memory/use-memory-thread-messages.d.ts.map +1 -0
- package/dist/hooks/memory/use-memory.d.ts +159 -0
- package/dist/hooks/memory/use-memory.d.ts.map +1 -0
- package/dist/hooks/memory/use-observational-memory.d.ts +13 -0
- package/dist/hooks/memory/use-observational-memory.d.ts.map +1 -0
- package/dist/hooks/metrics/index.cjs +997 -0
- package/dist/hooks/metrics/index.cjs.map +1 -0
- package/dist/hooks/metrics/index.d.ts +16 -0
- package/dist/hooks/metrics/index.d.ts.map +1 -0
- package/dist/hooks/metrics/index.js +981 -0
- package/dist/hooks/metrics/index.js.map +1 -0
- package/dist/hooks/metrics/metrics-interval.d.ts +8 -0
- package/dist/hooks/metrics/metrics-interval.d.ts.map +1 -0
- package/dist/hooks/metrics/metrics-query-filters.d.ts +62 -0
- package/dist/hooks/metrics/metrics-query-filters.d.ts.map +1 -0
- package/dist/hooks/metrics/use-active-resources-kpi-metrics.d.ts +12 -0
- package/dist/hooks/metrics/use-active-resources-kpi-metrics.d.ts.map +1 -0
- package/dist/hooks/metrics/use-active-threads-kpi-metrics.d.ts +12 -0
- package/dist/hooks/metrics/use-active-threads-kpi-metrics.d.ts.map +1 -0
- package/dist/hooks/metrics/use-agent-runs-kpi-metrics.d.ts +9 -0
- package/dist/hooks/metrics/use-agent-runs-kpi-metrics.d.ts.map +1 -0
- package/dist/hooks/metrics/use-latency-metrics.d.ts +23 -0
- package/dist/hooks/metrics/use-latency-metrics.d.ts.map +1 -0
- package/dist/hooks/metrics/use-model-cost-kpi-metrics.d.ts +14 -0
- package/dist/hooks/metrics/use-model-cost-kpi-metrics.d.ts.map +1 -0
- package/dist/hooks/metrics/use-model-usage-cost-metrics.d.ts +16 -0
- package/dist/hooks/metrics/use-model-usage-cost-metrics.d.ts.map +1 -0
- package/dist/hooks/metrics/use-scores-metrics.d.ts +24 -0
- package/dist/hooks/metrics/use-scores-metrics.d.ts.map +1 -0
- package/dist/hooks/metrics/use-token-usage-by-agent-metrics.d.ts +15 -0
- package/dist/hooks/metrics/use-token-usage-by-agent-metrics.d.ts.map +1 -0
- package/dist/hooks/metrics/use-token-usage-timeseries.d.ts +22 -0
- package/dist/hooks/metrics/use-token-usage-timeseries.d.ts.map +1 -0
- package/dist/hooks/metrics/use-top-active-threads-metrics.d.ts +21 -0
- package/dist/hooks/metrics/use-top-active-threads-metrics.d.ts.map +1 -0
- package/dist/hooks/metrics/use-top-resources-by-threads-metrics.d.ts +20 -0
- package/dist/hooks/metrics/use-top-resources-by-threads-metrics.d.ts.map +1 -0
- package/dist/hooks/metrics/use-total-tokens-kpi-metrics.d.ts +13 -0
- package/dist/hooks/metrics/use-total-tokens-kpi-metrics.d.ts.map +1 -0
- package/dist/hooks/metrics/use-trace-volume-metrics.d.ts +17 -0
- package/dist/hooks/metrics/use-trace-volume-metrics.d.ts.map +1 -0
- package/dist/hooks/processors/index.cjs +43 -0
- package/dist/hooks/processors/index.cjs.map +1 -0
- package/dist/hooks/processors/index.d.ts +2 -0
- package/dist/hooks/processors/index.d.ts.map +1 -0
- package/dist/hooks/processors/index.js +40 -0
- package/dist/hooks/processors/index.js.map +1 -0
- package/dist/hooks/processors/use-processors.d.ts +64 -0
- package/dist/hooks/processors/use-processors.d.ts.map +1 -0
- package/dist/hooks/prompt-blocks/index.cjs +181 -0
- package/dist/hooks/prompt-blocks/index.cjs.map +1 -0
- package/dist/hooks/prompt-blocks/index.d.ts +3 -0
- package/dist/hooks/prompt-blocks/index.d.ts.map +1 -0
- package/dist/hooks/prompt-blocks/index.js +172 -0
- package/dist/hooks/prompt-blocks/index.js.map +1 -0
- package/dist/hooks/prompt-blocks/use-prompt-block-versions.d.ts +59 -0
- package/dist/hooks/prompt-blocks/use-prompt-block-versions.d.ts.map +1 -0
- package/dist/hooks/prompt-blocks/use-stored-prompt-blocks.d.ts +180 -0
- package/dist/hooks/prompt-blocks/use-stored-prompt-blocks.d.ts.map +1 -0
- package/dist/hooks/query/index.cjs +34 -0
- package/dist/hooks/query/index.cjs.map +1 -0
- package/dist/hooks/query/index.d.ts +4 -0
- package/dist/hooks/query/index.d.ts.map +1 -0
- package/dist/hooks/query/index.js +25 -0
- package/dist/hooks/query/index.js.map +1 -0
- package/dist/hooks/query/query-client-provider.d.ts +8 -0
- package/dist/hooks/query/query-client-provider.d.ts.map +1 -0
- package/dist/hooks/query/query-utils.d.ts +48 -0
- package/dist/hooks/query/query-utils.d.ts.map +1 -0
- package/dist/hooks/review/index.cjs +89 -0
- package/dist/hooks/review/index.cjs.map +1 -0
- package/dist/hooks/review/index.d.ts +4 -0
- package/dist/hooks/review/index.d.ts.map +1 -0
- package/dist/hooks/review/index.js +86 -0
- package/dist/hooks/review/index.js.map +1 -0
- package/dist/hooks/review/types.d.ts +21 -0
- package/dist/hooks/review/types.d.ts.map +1 -0
- package/dist/hooks/review/use-dataset-review-items.d.ts +19 -0
- package/dist/hooks/review/use-dataset-review-items.d.ts.map +1 -0
- package/dist/hooks/review/use-review-summary.d.ts +9 -0
- package/dist/hooks/review/use-review-summary.d.ts.map +1 -0
- package/dist/hooks/schedules/index.cjs +110 -0
- package/dist/hooks/schedules/index.cjs.map +1 -0
- package/dist/hooks/schedules/index.d.ts +5 -0
- package/dist/hooks/schedules/index.d.ts.map +1 -0
- package/dist/hooks/schedules/index.js +106 -0
- package/dist/hooks/schedules/index.js.map +1 -0
- package/dist/hooks/schedules/use-schedule-triggers.d.ts +18 -0
- package/dist/hooks/schedules/use-schedule-triggers.d.ts.map +1 -0
- package/dist/hooks/schedules/use-schedule.d.ts +11 -0
- package/dist/hooks/schedules/use-schedule.d.ts.map +1 -0
- package/dist/hooks/schedules/use-schedules.d.ts +7 -0
- package/dist/hooks/schedules/use-schedules.d.ts.map +1 -0
- package/dist/hooks/schedules/use-toggle-schedule.d.ts +13 -0
- package/dist/hooks/schedules/use-toggle-schedule.d.ts.map +1 -0
- package/dist/hooks/scores/index.cjs +339 -0
- package/dist/hooks/scores/index.cjs.map +1 -0
- package/dist/hooks/scores/index.d.ts +6 -0
- package/dist/hooks/scores/index.d.ts.map +1 -0
- package/dist/hooks/scores/index.js +323 -0
- package/dist/hooks/scores/index.js.map +1 -0
- package/dist/hooks/scores/use-scorer-versions.d.ts +71 -0
- package/dist/hooks/scores/use-scorer-versions.d.ts.map +1 -0
- package/dist/hooks/scores/use-scorers.d.ts +34 -0
- package/dist/hooks/scores/use-scorers.d.ts.map +1 -0
- package/dist/hooks/scores/use-stored-scorers.d.ts +151 -0
- package/dist/hooks/scores/use-stored-scorers.d.ts.map +1 -0
- package/dist/hooks/scores/use-trace-span-scores.d.ts +20 -0
- package/dist/hooks/scores/use-trace-span-scores.d.ts.map +1 -0
- package/dist/hooks/scores/use-trigger-scorer.d.ts +17 -0
- package/dist/hooks/scores/use-trigger-scorer.d.ts.map +1 -0
- package/dist/hooks/shared/cost.d.ts +7 -0
- package/dist/hooks/shared/cost.d.ts.map +1 -0
- package/dist/hooks/shared/date-format.d.ts +30 -0
- package/dist/hooks/shared/date-format.d.ts.map +1 -0
- package/dist/hooks/shared/map.d.ts +2 -0
- package/dist/hooks/shared/map.d.ts.map +1 -0
- package/dist/hooks/shared/query-options.d.ts +19 -0
- package/dist/hooks/shared/query-options.d.ts.map +1 -0
- package/dist/hooks/shared/use-in-view.d.ts +23 -0
- package/dist/hooks/shared/use-in-view.d.ts.map +1 -0
- package/dist/hooks/templates/index.cjs +464 -0
- package/dist/hooks/templates/index.cjs.map +1 -0
- package/dist/hooks/templates/index.d.ts +2 -0
- package/dist/hooks/templates/index.d.ts.map +1 -0
- package/dist/hooks/templates/index.js +456 -0
- package/dist/hooks/templates/index.js.map +1 -0
- package/dist/hooks/templates/use-templates.d.ts +139 -0
- package/dist/hooks/templates/use-templates.d.ts.map +1 -0
- package/dist/hooks/tool-providers/index.cjs +342 -0
- package/dist/hooks/tool-providers/index.cjs.map +1 -0
- package/dist/hooks/tool-providers/index.d.ts +10 -0
- package/dist/hooks/tool-providers/index.d.ts.map +1 -0
- package/dist/hooks/tool-providers/index.js +332 -0
- package/dist/hooks/tool-providers/index.js.map +1 -0
- package/dist/hooks/tool-providers/use-all-connections.d.ts +41 -0
- package/dist/hooks/tool-providers/use-all-connections.d.ts.map +1 -0
- package/dist/hooks/tool-providers/use-all-provider-tools.d.ts +25 -0
- package/dist/hooks/tool-providers/use-all-provider-tools.d.ts.map +1 -0
- package/dist/hooks/tool-providers/use-authorize.d.ts +45 -0
- package/dist/hooks/tool-providers/use-authorize.d.ts.map +1 -0
- package/dist/hooks/tool-providers/use-disconnect-connection.d.ts +24 -0
- package/dist/hooks/tool-providers/use-disconnect-connection.d.ts.map +1 -0
- package/dist/hooks/tool-providers/use-existing-connections.d.ts +33 -0
- package/dist/hooks/tool-providers/use-existing-connections.d.ts.map +1 -0
- package/dist/hooks/tool-providers/use-provider-tools.d.ts +17 -0
- package/dist/hooks/tool-providers/use-provider-tools.d.ts.map +1 -0
- package/dist/hooks/tool-providers/use-tool-providers.d.ts +23 -0
- package/dist/hooks/tool-providers/use-tool-providers.d.ts.map +1 -0
- package/dist/hooks/tool-providers/use-toolkits.d.ts +13 -0
- package/dist/hooks/tool-providers/use-toolkits.d.ts.map +1 -0
- package/dist/hooks/tool-providers/use-update-connection.d.ts +24 -0
- package/dist/hooks/tool-providers/use-update-connection.d.ts.map +1 -0
- package/dist/hooks/tools/index.cjs +49 -0
- package/dist/hooks/tools/index.cjs.map +1 -0
- package/dist/hooks/tools/index.d.ts +3 -0
- package/dist/hooks/tools/index.d.ts.map +1 -0
- package/dist/hooks/tools/index.js +46 -0
- package/dist/hooks/tools/index.js.map +1 -0
- package/dist/hooks/tools/use-all-tools.d.ts +16 -0
- package/dist/hooks/tools/use-all-tools.d.ts.map +1 -0
- package/dist/hooks/tools/use-execute-tool.d.ts +13 -0
- package/dist/hooks/tools/use-execute-tool.d.ts.map +1 -0
- package/dist/hooks/traces/discovery-cache.d.ts +12 -0
- package/dist/hooks/traces/discovery-cache.d.ts.map +1 -0
- package/dist/hooks/traces/index.cjs +1168 -0
- package/dist/hooks/traces/index.cjs.map +1 -0
- package/dist/hooks/traces/index.d.ts +22 -0
- package/dist/hooks/traces/index.d.ts.map +1 -0
- package/dist/hooks/traces/index.js +1129 -0
- package/dist/hooks/traces/index.js.map +1 -0
- package/dist/hooks/traces/types.d.ts +20 -0
- package/dist/hooks/traces/types.d.ts.map +1 -0
- package/dist/hooks/traces/use-branch.d.ts +18 -0
- package/dist/hooks/traces/use-branch.d.ts.map +1 -0
- package/dist/hooks/traces/use-create-feedback.d.ts +21 -0
- package/dist/hooks/traces/use-create-feedback.d.ts.map +1 -0
- package/dist/hooks/traces/use-delete-feedback.d.ts +21 -0
- package/dist/hooks/traces/use-delete-feedback.d.ts.map +1 -0
- package/dist/hooks/traces/use-entity-names.d.ts +14 -0
- package/dist/hooks/traces/use-entity-names.d.ts.map +1 -0
- package/dist/hooks/traces/use-environments.d.ts +10 -0
- package/dist/hooks/traces/use-environments.d.ts.map +1 -0
- package/dist/hooks/traces/use-service-names.d.ts +10 -0
- package/dist/hooks/traces/use-service-names.d.ts.map +1 -0
- package/dist/hooks/traces/use-span-detail.d.ts +14 -0
- package/dist/hooks/traces/use-span-detail.d.ts.map +1 -0
- package/dist/hooks/traces/use-span-feedback.d.ts +19 -0
- package/dist/hooks/traces/use-span-feedback.d.ts.map +1 -0
- package/dist/hooks/traces/use-tags.d.ts +10 -0
- package/dist/hooks/traces/use-tags.d.ts.map +1 -0
- package/dist/hooks/traces/use-thread-has-other-traces.d.ts +17 -0
- package/dist/hooks/traces/use-thread-has-other-traces.d.ts.map +1 -0
- package/dist/hooks/traces/use-trace-column-preferences-storage-key.d.ts +6 -0
- package/dist/hooks/traces/use-trace-column-preferences-storage-key.d.ts.map +1 -0
- package/dist/hooks/traces/use-trace-feedback.d.ts +16 -0
- package/dist/hooks/traces/use-trace-feedback.d.ts.map +1 -0
- package/dist/hooks/traces/use-trace-light-spans.d.ts +16 -0
- package/dist/hooks/traces/use-trace-light-spans.d.ts.map +1 -0
- package/dist/hooks/traces/use-trace-metadata-filter-fields.d.ts +36 -0
- package/dist/hooks/traces/use-trace-metadata-filter-fields.d.ts.map +1 -0
- package/dist/hooks/traces/use-trace-or-branch-spans.d.ts +39 -0
- package/dist/hooks/traces/use-trace-or-branch-spans.d.ts.map +1 -0
- package/dist/hooks/traces/use-trace-query.d.ts +57 -0
- package/dist/hooks/traces/use-trace-query.d.ts.map +1 -0
- package/dist/hooks/traces/use-trace-spans.d.ts +46 -0
- package/dist/hooks/traces/use-trace-spans.d.ts.map +1 -0
- package/dist/hooks/traces/use-trace-usage.d.ts +10 -0
- package/dist/hooks/traces/use-trace-usage.d.ts.map +1 -0
- package/dist/hooks/traces/use-traces.d.ts +292 -0
- package/dist/hooks/traces/use-traces.d.ts.map +1 -0
- package/dist/hooks/vectors/index.cjs +19 -0
- package/dist/hooks/vectors/index.cjs.map +1 -0
- package/dist/hooks/vectors/index.d.ts +2 -0
- package/dist/hooks/vectors/index.d.ts.map +1 -0
- package/dist/hooks/vectors/index.js +18 -0
- package/dist/hooks/vectors/index.js.map +1 -0
- package/dist/hooks/vectors/use-vectors.d.ts +14 -0
- package/dist/hooks/vectors/use-vectors.d.ts.map +1 -0
- package/dist/hooks/voice/index.cjs +87 -0
- package/dist/hooks/voice/index.cjs.map +1 -0
- package/dist/hooks/voice/index.d.ts +2 -0
- package/dist/hooks/voice/index.d.ts.map +1 -0
- package/dist/hooks/voice/index.js +86 -0
- package/dist/hooks/voice/index.js.map +1 -0
- package/dist/hooks/voice/use-read-aloud.d.ts +20 -0
- package/dist/hooks/voice/use-read-aloud.d.ts.map +1 -0
- package/dist/hooks/workflows/index.cjs +173 -0
- package/dist/hooks/workflows/index.cjs.map +1 -0
- package/dist/hooks/workflows/index.d.ts +7 -0
- package/dist/hooks/workflows/index.d.ts.map +1 -0
- package/dist/hooks/workflows/index.js +157 -0
- package/dist/hooks/workflows/index.js.map +1 -0
- package/dist/hooks/workflows/use-workflow-runs.d.ts +51 -0
- package/dist/hooks/workflows/use-workflow-runs.d.ts.map +1 -0
- package/dist/hooks/workflows/use-workflow.d.ts +14 -0
- package/dist/hooks/workflows/use-workflow.d.ts.map +1 -0
- package/dist/hooks/workflows/use-workflows-run-counts.d.ts +25 -0
- package/dist/hooks/workflows/use-workflows-run-counts.d.ts.map +1 -0
- package/dist/hooks/workflows/use-workflows.d.ts +10 -0
- package/dist/hooks/workflows/use-workflows.d.ts.map +1 -0
- package/dist/hooks/workspace/client-utils.d.ts +5 -0
- package/dist/hooks/workspace/client-utils.d.ts.map +1 -0
- package/dist/hooks/workspace/compatibility.d.ts +22 -0
- package/dist/hooks/workspace/compatibility.d.ts.map +1 -0
- package/dist/hooks/workspace/file-type.d.ts +7 -0
- package/dist/hooks/workspace/file-type.d.ts.map +1 -0
- package/dist/hooks/workspace/index.cjs +624 -0
- package/dist/hooks/workspace/index.cjs.map +1 -0
- package/dist/hooks/workspace/index.d.ts +11 -0
- package/dist/hooks/workspace/index.d.ts.map +1 -0
- package/dist/hooks/workspace/index.js +594 -0
- package/dist/hooks/workspace/index.js.map +1 -0
- package/dist/hooks/workspace/types.d.ts +199 -0
- package/dist/hooks/workspace/types.d.ts.map +1 -0
- package/dist/hooks/workspace/use-skills-sh.d.ts +104 -0
- package/dist/hooks/workspace/use-skills-sh.d.ts.map +1 -0
- package/dist/hooks/workspace/use-stored-workspaces.d.ts +12 -0
- package/dist/hooks/workspace/use-stored-workspaces.d.ts.map +1 -0
- package/dist/hooks/workspace/use-workspace-directory.d.ts +13 -0
- package/dist/hooks/workspace/use-workspace-directory.d.ts.map +1 -0
- package/dist/hooks/workspace/use-workspace-file-content.d.ts +15 -0
- package/dist/hooks/workspace/use-workspace-file-content.d.ts.map +1 -0
- package/dist/hooks/workspace/use-workspace-search.d.ts +20 -0
- package/dist/hooks/workspace/use-workspace-search.d.ts.map +1 -0
- package/dist/hooks/workspace/use-workspace-skills.d.ts +23 -0
- package/dist/hooks/workspace/use-workspace-skills.d.ts.map +1 -0
- package/dist/hooks/workspace/use-workspace.d.ts +56 -0
- package/dist/hooks/workspace/use-workspace.d.ts.map +1 -0
- package/dist/hooks-BFQK_s4g.js +1231 -0
- package/dist/hooks-BFQK_s4g.js.map +1 -0
- package/dist/hooks-CMjizg6y.cjs +1248 -0
- package/dist/hooks-CMjizg6y.cjs.map +1 -0
- package/dist/hooks-CjULNHpJ.js +252 -0
- package/dist/hooks-CjULNHpJ.js.map +1 -0
- package/dist/hooks-DsDYaJ3T.cjs +269 -0
- package/dist/hooks-DsDYaJ3T.cjs.map +1 -0
- package/dist/index.cjs +21 -3434
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3419
- package/dist/index.js.map +1 -1
- package/dist/lib/mastra-db/fromCoreUserMessage.d.ts +3 -4
- package/dist/lib/mastra-db/fromCoreUserMessage.d.ts.map +1 -1
- package/dist/map-CDv4fbu4.js +12 -0
- package/dist/map-CDv4fbu4.js.map +1 -0
- package/dist/map-wjmL1y5O.cjs +17 -0
- package/dist/map-wjmL1y5O.cjs.map +1 -0
- package/dist/mastra-client-context-Bx_g84YB.js +50 -0
- package/dist/mastra-client-context-Bx_g84YB.js.map +1 -0
- package/dist/mastra-client-context-DzX3f0RF.cjs +61 -0
- package/dist/mastra-client-context-DzX3f0RF.cjs.map +1 -0
- package/dist/query-utils-CcrChYgz.cjs +174 -0
- package/dist/query-utils-CcrChYgz.cjs.map +1 -0
- package/dist/query-utils-D1NgFnWU.js +127 -0
- package/dist/query-utils-D1NgFnWU.js.map +1 -0
- package/dist/use-in-view-B6eJO9Zi.cjs +37 -0
- package/dist/use-in-view-B6eJO9Zi.cjs.map +1 -0
- package/dist/use-in-view-C9sYPGRm.js +32 -0
- package/dist/use-in-view-C9sYPGRm.js.map +1 -0
- package/dist/voice-BOtUdMi8.cjs +281 -0
- package/dist/voice-BOtUdMi8.cjs.map +1 -0
- package/dist/voice-DgirjEyH.js +264 -0
- package/dist/voice-DgirjEyH.js.map +1 -0
- package/package.json +32 -3
|
@@ -0,0 +1,1231 @@
|
|
|
1
|
+
import { n as useMastraClient } from "./mastra-client-context-Bx_g84YB.js";
|
|
2
|
+
import { a as CLIENT_MESSAGE_ID_KEY, n as accumulateNetworkChunk, o as convertSignalDataToBase64String, r as finishStreamingAssistantMessage, s as encodeFilePartDataForStorage, t as accumulateChunk } from "./accumulator-B1MuNX3j.js";
|
|
3
|
+
import { MastraClient } from "@mastra/client-js";
|
|
4
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
5
|
+
import { v4 } from "@lukeed/uuid";
|
|
6
|
+
import { AIV5Adapter } from "@mastra/core/agent/message-list";
|
|
7
|
+
//#region src/lib/mastra-db/fromCoreUserMessage.ts
|
|
8
|
+
/**
|
|
9
|
+
* Convert a CoreUserMessage into a canonical `MastraDBMessage` (`format: 2`).
|
|
10
|
+
*
|
|
11
|
+
* Image and file inputs are emitted as the canonical V4 `file` part shape
|
|
12
|
+
* (`{ type: 'file', mimeType, data }`) — the exact shape memory resolves on
|
|
13
|
+
* reload (see `AIV4Adapter`), so optimistic-send and reload render identically.
|
|
14
|
+
*
|
|
15
|
+
* Handles all CoreUserMessage content types:
|
|
16
|
+
* - String content → single text part
|
|
17
|
+
* - Array content with text/image/file parts → corresponding `MastraMessagePart`s
|
|
18
|
+
*/
|
|
19
|
+
const coreUserMessageToParts = (coreUserMessage) => typeof coreUserMessage.content === "string" ? [{
|
|
20
|
+
type: "text",
|
|
21
|
+
text: coreUserMessage.content
|
|
22
|
+
}] : coreUserMessage.content.map((part) => {
|
|
23
|
+
switch (part.type) {
|
|
24
|
+
case "text": return {
|
|
25
|
+
type: "text",
|
|
26
|
+
text: part.text
|
|
27
|
+
};
|
|
28
|
+
case "image": {
|
|
29
|
+
const mimeType = part.mimeType ?? "image/*";
|
|
30
|
+
return {
|
|
31
|
+
type: "file",
|
|
32
|
+
mimeType,
|
|
33
|
+
data: encodeFilePartDataForStorage(part.image, mimeType)
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
case "file": return {
|
|
37
|
+
type: "file",
|
|
38
|
+
mimeType: part.mimeType,
|
|
39
|
+
data: encodeFilePartDataForStorage(part.data, part.mimeType),
|
|
40
|
+
...part.filename !== void 0 ? { filename: part.filename } : {}
|
|
41
|
+
};
|
|
42
|
+
default: throw new Error(`Unhandled content part type: ${part.type}`);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
const newUserMessage = (parts) => ({
|
|
46
|
+
id: `user-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`,
|
|
47
|
+
role: "user",
|
|
48
|
+
createdAt: /* @__PURE__ */ new Date(),
|
|
49
|
+
content: {
|
|
50
|
+
format: 2,
|
|
51
|
+
parts
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
const fromCoreUserMessageToMastraDBMessage = (coreUserMessage) => newUserMessage(coreUserMessageToParts(coreUserMessage));
|
|
55
|
+
/**
|
|
56
|
+
* Merge multiple `CoreUserMessage`s into a single canonical `MastraDBMessage`.
|
|
57
|
+
*
|
|
58
|
+
* A user turn that carries attachments arrives as several `CoreUserMessage`s
|
|
59
|
+
* (one for the text, one per attachment). Flatten their parts for the optimistic
|
|
60
|
+
* display. The send path must also submit a single multipart message: this
|
|
61
|
+
* display conversion alone cannot combine separately persisted messages.
|
|
62
|
+
*/
|
|
63
|
+
const fromCoreUserMessagesToMastraDBMessage = (coreUserMessages) => newUserMessage(coreUserMessages.flatMap(coreUserMessageToParts));
|
|
64
|
+
//#endregion
|
|
65
|
+
//#region src/agent/extract-tasks.ts
|
|
66
|
+
const TASK_TOOL_NAMES = /* @__PURE__ */ new Set([
|
|
67
|
+
"task_write",
|
|
68
|
+
"task_update",
|
|
69
|
+
"task_complete",
|
|
70
|
+
"task_check"
|
|
71
|
+
]);
|
|
72
|
+
const TASK_SIGNAL_ID = "tasks";
|
|
73
|
+
const TASK_TAG_NAMES = /* @__PURE__ */ new Set(["current-task-list", "task-list-update"]);
|
|
74
|
+
const TASK_STATUSES = /* @__PURE__ */ new Set([
|
|
75
|
+
"pending",
|
|
76
|
+
"in_progress",
|
|
77
|
+
"completed"
|
|
78
|
+
]);
|
|
79
|
+
const isDataChunk$1 = (chunk) => typeof chunk.type === "string" && chunk.type.startsWith("data-");
|
|
80
|
+
const isRecord$1 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
81
|
+
const isTaskStatus = (value) => typeof value === "string" && TASK_STATUSES.has(value);
|
|
82
|
+
const isTaskItemArray = (value) => Array.isArray(value) && value.every((item) => isRecord$1(item) && typeof item.id === "string" && typeof item.content === "string" && isTaskStatus(item.status) && typeof item.activeForm === "string");
|
|
83
|
+
const isTaskSignal = (value) => {
|
|
84
|
+
if (!isRecord$1(value)) return false;
|
|
85
|
+
return value.id === TASK_SIGNAL_ID || typeof value.tagName === "string" && TASK_TAG_NAMES.has(value.tagName);
|
|
86
|
+
};
|
|
87
|
+
const extractTasksFromSignalData = (data) => {
|
|
88
|
+
if (!isTaskSignal(data) || !isRecord$1(data)) return void 0;
|
|
89
|
+
const metadata = data.metadata;
|
|
90
|
+
if (!isRecord$1(metadata)) return void 0;
|
|
91
|
+
const value = metadata.value;
|
|
92
|
+
if (!isRecord$1(value)) return void 0;
|
|
93
|
+
return isTaskItemArray(value.tasks) ? value.tasks : void 0;
|
|
94
|
+
};
|
|
95
|
+
const parseTasksFromResult = (raw) => {
|
|
96
|
+
if (isRecord$1(raw) && isTaskItemArray(raw.tasks)) return raw.tasks;
|
|
97
|
+
if (typeof raw !== "string") return void 0;
|
|
98
|
+
try {
|
|
99
|
+
const parsed = JSON.parse(raw);
|
|
100
|
+
return isRecord$1(parsed) && isTaskItemArray(parsed.tasks) ? parsed.tasks : void 0;
|
|
101
|
+
} catch {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
const extractTasksFromSignalChunk = (chunk) => {
|
|
106
|
+
if (!isDataChunk$1(chunk)) return void 0;
|
|
107
|
+
return extractTasksFromSignalData(chunk.data);
|
|
108
|
+
};
|
|
109
|
+
const extractTasksFromToolResultChunk = (chunk) => {
|
|
110
|
+
if (chunk.type !== "tool-result") return void 0;
|
|
111
|
+
const payload = chunk.payload;
|
|
112
|
+
if (!isRecord$1(payload) || typeof payload.toolName !== "string" || !TASK_TOOL_NAMES.has(payload.toolName)) return;
|
|
113
|
+
return parseTasksFromResult(payload.result);
|
|
114
|
+
};
|
|
115
|
+
const extractTasksFromToolInvocationPart = (part) => {
|
|
116
|
+
if (!isRecord$1(part) || part.type !== "tool-invocation" || !isRecord$1(part.toolInvocation)) return void 0;
|
|
117
|
+
const toolInvocation = part.toolInvocation;
|
|
118
|
+
if (typeof toolInvocation.toolName !== "string" || !TASK_TOOL_NAMES.has(toolInvocation.toolName)) return void 0;
|
|
119
|
+
return parseTasksFromResult(toolInvocation.result);
|
|
120
|
+
};
|
|
121
|
+
const extractTasksFromDataPart = (part) => {
|
|
122
|
+
if (!isRecord$1(part) || typeof part.type !== "string" || !part.type.startsWith("data-")) return void 0;
|
|
123
|
+
return extractTasksFromSignalData(part.data);
|
|
124
|
+
};
|
|
125
|
+
const extractTasksFromSignalMessage = (message) => {
|
|
126
|
+
if (message.role !== "signal") return void 0;
|
|
127
|
+
const metadata = message.content?.metadata;
|
|
128
|
+
if (!isRecord$1(metadata)) return void 0;
|
|
129
|
+
return extractTasksFromSignalData(metadata.signal);
|
|
130
|
+
};
|
|
131
|
+
const extractLatestTasksFromMessages = (messages) => {
|
|
132
|
+
let latest;
|
|
133
|
+
for (const message of messages) {
|
|
134
|
+
for (const part of message.content?.parts ?? []) {
|
|
135
|
+
const toolTasks = extractTasksFromToolInvocationPart(part);
|
|
136
|
+
if (toolTasks !== void 0) latest = toolTasks;
|
|
137
|
+
}
|
|
138
|
+
const signalTasks = extractTasksFromSignalMessage(message);
|
|
139
|
+
if (signalTasks !== void 0) latest = signalTasks;
|
|
140
|
+
for (const part of message.content?.parts ?? []) {
|
|
141
|
+
const dataTasks = extractTasksFromDataPart(part);
|
|
142
|
+
if (dataTasks !== void 0) latest = dataTasks;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return latest ?? [];
|
|
146
|
+
};
|
|
147
|
+
//#endregion
|
|
148
|
+
//#region src/agent/extractRunIdFromMessages.ts
|
|
149
|
+
const isRecord = (value) => value !== null && typeof value === "object";
|
|
150
|
+
const runIdMetadataKeys = [
|
|
151
|
+
"pendingToolApprovals",
|
|
152
|
+
"requireApprovalMetadata",
|
|
153
|
+
"suspendedTools"
|
|
154
|
+
];
|
|
155
|
+
const isRunIdMetadataSource = (value) => isRecord(value) && Object.values(value).every((entry) => isRecord(entry));
|
|
156
|
+
const getRunIdMetadataSources = (metadata) => {
|
|
157
|
+
if (!isRecord(metadata)) return [];
|
|
158
|
+
const sources = [];
|
|
159
|
+
for (const key of runIdMetadataKeys) {
|
|
160
|
+
const source = metadata[key];
|
|
161
|
+
if (isRunIdMetadataSource(source)) sources.push(source);
|
|
162
|
+
}
|
|
163
|
+
return sources;
|
|
164
|
+
};
|
|
165
|
+
/**
|
|
166
|
+
* Scan initial DB-shape messages for any pending approvals, suspended tools, or
|
|
167
|
+
* `requireApprovalMetadata` entries and return the first non-empty `runId`.
|
|
168
|
+
*
|
|
169
|
+
* Metadata is read off `message.content.metadata`, the canonical location for
|
|
170
|
+
* MastraDBMessage UX hints.
|
|
171
|
+
*/
|
|
172
|
+
const extractRunIdFromMessages = (messages) => {
|
|
173
|
+
for (const message of messages) for (const source of getRunIdMetadataSources(message.content?.metadata)) for (const entry of Object.values(source)) if (isRecord(entry) && typeof entry.runId === "string" && entry.runId.length > 0) return entry.runId;
|
|
174
|
+
};
|
|
175
|
+
//#endregion
|
|
176
|
+
//#region src/agent/merge-history.ts
|
|
177
|
+
const liveClientMessageId = (message) => {
|
|
178
|
+
const clientMessageId = message.content.metadata?.[CLIENT_MESSAGE_ID_KEY];
|
|
179
|
+
return typeof clientMessageId === "string" ? clientMessageId : void 0;
|
|
180
|
+
};
|
|
181
|
+
const storedClientMessageId = (message) => {
|
|
182
|
+
const signal = message.content.metadata?.signal;
|
|
183
|
+
const clientMessageId = isRecord$1(signal) && isRecord$1(signal.metadata) ? signal.metadata[CLIENT_MESSAGE_ID_KEY] : void 0;
|
|
184
|
+
return typeof clientMessageId === "string" ? clientMessageId : void 0;
|
|
185
|
+
};
|
|
186
|
+
const mergeHistoryIntoConversation = ({ conversation, history, previousHistory }) => {
|
|
187
|
+
const previousById = new Map(previousHistory.map((message) => [message.id, message]));
|
|
188
|
+
const live = conversation.filter((message) => previousById.get(message.id) !== message);
|
|
189
|
+
const liveById = new Map(live.map((message) => [message.id, message]));
|
|
190
|
+
const liveClientMessageIds = new Set(live.flatMap((message) => liveClientMessageId(message) ?? []));
|
|
191
|
+
const historyIds = new Set(history.map((message) => message.id));
|
|
192
|
+
const storedClientMessageIds = new Set(history.flatMap((message) => storedClientMessageId(message) ?? []));
|
|
193
|
+
const mergedHistory = history.map((message) => {
|
|
194
|
+
const liveCopy = liveById.get(message.id);
|
|
195
|
+
if (liveCopy) return liveCopy;
|
|
196
|
+
const clientMessageId = storedClientMessageId(message);
|
|
197
|
+
if (!clientMessageId || !liveClientMessageIds.has(clientMessageId)) return message;
|
|
198
|
+
return {
|
|
199
|
+
...message,
|
|
200
|
+
content: {
|
|
201
|
+
...message.content,
|
|
202
|
+
metadata: {
|
|
203
|
+
...message.content.metadata,
|
|
204
|
+
[CLIENT_MESSAGE_ID_KEY]: clientMessageId
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
});
|
|
209
|
+
const unstoredLive = live.filter((message) => {
|
|
210
|
+
const clientMessageId = liveClientMessageId(message);
|
|
211
|
+
return !historyIds.has(message.id) && !(clientMessageId && storedClientMessageIds.has(clientMessageId));
|
|
212
|
+
});
|
|
213
|
+
return [...mergedHistory, ...unstoredLive];
|
|
214
|
+
};
|
|
215
|
+
//#endregion
|
|
216
|
+
//#region src/agent/user-message.ts
|
|
217
|
+
const messageParts = (message) => {
|
|
218
|
+
const parts = typeof message.content === "string" ? [{
|
|
219
|
+
type: "text",
|
|
220
|
+
text: message.content
|
|
221
|
+
}] : message.content;
|
|
222
|
+
const inheritedOptions = message.providerOptions ?? message.experimental_providerMetadata;
|
|
223
|
+
if (!inheritedOptions) return parts;
|
|
224
|
+
return parts.map((part) => {
|
|
225
|
+
const providerOptions = { ...inheritedOptions };
|
|
226
|
+
for (const [provider, options] of Object.entries(part.providerOptions ?? part.experimental_providerMetadata ?? {})) providerOptions[provider] = {
|
|
227
|
+
...providerOptions[provider],
|
|
228
|
+
...options
|
|
229
|
+
};
|
|
230
|
+
return {
|
|
231
|
+
...part,
|
|
232
|
+
providerOptions
|
|
233
|
+
};
|
|
234
|
+
});
|
|
235
|
+
};
|
|
236
|
+
/** One send is one user message, with each attachment retained as a content part. */
|
|
237
|
+
const createUserMessage = (text, attachments = []) => ({
|
|
238
|
+
role: "user",
|
|
239
|
+
content: [...text || attachments.length === 0 ? [{
|
|
240
|
+
type: "text",
|
|
241
|
+
text
|
|
242
|
+
}] : [], ...attachments.flatMap(messageParts)]
|
|
243
|
+
});
|
|
244
|
+
//#endregion
|
|
245
|
+
//#region src/agent/hooks.ts
|
|
246
|
+
const extractPendingToolApprovalIdsFromMessages = (messages, runId) => {
|
|
247
|
+
const pendingToolApprovalIds = /* @__PURE__ */ new Set();
|
|
248
|
+
for (const message of messages) {
|
|
249
|
+
const metadata = message.content?.metadata;
|
|
250
|
+
if (!metadata) continue;
|
|
251
|
+
const metadataSources = [
|
|
252
|
+
metadata.pendingToolApprovals,
|
|
253
|
+
metadata.requireApprovalMetadata,
|
|
254
|
+
metadata.suspendedTools
|
|
255
|
+
];
|
|
256
|
+
for (const source of metadataSources) {
|
|
257
|
+
if (!source || typeof source !== "object") continue;
|
|
258
|
+
for (const suspensionData of Object.values(source)) {
|
|
259
|
+
if (runId && suspensionData?.runId !== runId) continue;
|
|
260
|
+
const toolCallId = suspensionData?.toolCallId;
|
|
261
|
+
if (typeof toolCallId === "string" && toolCallId.length > 0) pendingToolApprovalIds.add(toolCallId);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return pendingToolApprovalIds;
|
|
266
|
+
};
|
|
267
|
+
const toolCallHasOutput = (parts, toolCallId) => parts.some((part) => {
|
|
268
|
+
if (part.type !== "tool-invocation") return false;
|
|
269
|
+
const invocation = part.toolInvocation;
|
|
270
|
+
if (invocation.toolCallId !== toolCallId) return false;
|
|
271
|
+
return invocation.state === "result" || invocation.result != null;
|
|
272
|
+
});
|
|
273
|
+
const filterUnresolvedApprovals = (entries, parts) => {
|
|
274
|
+
if (!entries || typeof entries !== "object") return void 0;
|
|
275
|
+
const pending = Object.fromEntries(Object.entries(entries).filter(([, approval]) => approval && typeof approval === "object" && typeof approval.toolCallId === "string" && !toolCallHasOutput(parts, approval.toolCallId)));
|
|
276
|
+
return Object.keys(pending).length ? pending : void 0;
|
|
277
|
+
};
|
|
278
|
+
/**
|
|
279
|
+
* Normalize persisted initial messages back into the stream-friendly shape the
|
|
280
|
+
* UI renders from. Mirrors `main`'s `resolveInitialMessages`:
|
|
281
|
+
*
|
|
282
|
+
* - Converts persisted `pendingToolApprovals` (DB shape) into
|
|
283
|
+
* `requireApprovalMetadata` (stream shape) so reloaded threads still render
|
|
284
|
+
* approve/decline buttons, filtering out approvals whose tool already
|
|
285
|
+
* produced output, and marks the message `mode: 'stream'`.
|
|
286
|
+
* - Drops assistant completion messages flagged `suppressFeedback`, which are
|
|
287
|
+
* persisted by the supervisor agent but must stay hidden on reload.
|
|
288
|
+
*/
|
|
289
|
+
const resolveInitialMessages = (messages) => messages.filter((message) => {
|
|
290
|
+
const metadata = message.content?.metadata;
|
|
291
|
+
if (metadata?.completionResult?.suppressFeedback || metadata?.isTaskCompleteResult?.suppressFeedback) return false;
|
|
292
|
+
return true;
|
|
293
|
+
}).map((message) => {
|
|
294
|
+
const metadata = message.content?.metadata;
|
|
295
|
+
const normalizedMessage = metadata && (metadata.status === "pending" || "clientMessageId" in metadata) ? (() => {
|
|
296
|
+
const { [CLIENT_MESSAGE_ID_KEY]: _omitClientMessageId, ...rest } = metadata;
|
|
297
|
+
const { status: _omitStatus, ...restWithoutStatus } = rest;
|
|
298
|
+
return {
|
|
299
|
+
...message,
|
|
300
|
+
content: {
|
|
301
|
+
...message.content,
|
|
302
|
+
metadata: metadata.status === "pending" ? restWithoutStatus : rest
|
|
303
|
+
}
|
|
304
|
+
};
|
|
305
|
+
})() : message;
|
|
306
|
+
const normalizedMetadata = normalizedMessage.content?.metadata;
|
|
307
|
+
if (!normalizedMetadata?.pendingToolApprovals && !normalizedMetadata?.requireApprovalMetadata && !normalizedMetadata?.suspendedTools) return normalizedMessage;
|
|
308
|
+
const { pendingToolApprovals, requireApprovalMetadata, suspendedTools, ...restMetadata } = normalizedMetadata;
|
|
309
|
+
const parts = normalizedMessage.content.parts;
|
|
310
|
+
const pending = filterUnresolvedApprovals(pendingToolApprovals, parts);
|
|
311
|
+
const required = {
|
|
312
|
+
...filterUnresolvedApprovals(requireApprovalMetadata, parts),
|
|
313
|
+
...pending
|
|
314
|
+
};
|
|
315
|
+
const suspended = filterUnresolvedApprovals(suspendedTools, parts);
|
|
316
|
+
return {
|
|
317
|
+
...normalizedMessage,
|
|
318
|
+
content: {
|
|
319
|
+
...normalizedMessage.content,
|
|
320
|
+
metadata: {
|
|
321
|
+
...restMetadata,
|
|
322
|
+
...pendingToolApprovals ? { mode: "stream" } : {},
|
|
323
|
+
...pending ? { pendingToolApprovals: pending } : {},
|
|
324
|
+
...Object.keys(required).length ? { requireApprovalMetadata: required } : {},
|
|
325
|
+
...suspended ? { suspendedTools: suspended } : {}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
};
|
|
329
|
+
});
|
|
330
|
+
const isObject = (value) => typeof value === "object" && value !== null;
|
|
331
|
+
const getErrorName = (error) => isObject(error) && typeof error.name === "string" ? error.name : void 0;
|
|
332
|
+
const isAbortError = (error) => getErrorName(error) === "AbortError";
|
|
333
|
+
const isThreadSignalUnsupportedError = (error) => {
|
|
334
|
+
if (!isObject(error)) return false;
|
|
335
|
+
const status = error.status;
|
|
336
|
+
if (status === 404 || status === 405 || status === 501) return true;
|
|
337
|
+
return status === 400 && typeof error.message === "string" && error.message.includes("No active agent run found for signal target");
|
|
338
|
+
};
|
|
339
|
+
const isDataChunk = (chunk) => typeof chunk.type === "string" && chunk.type.startsWith("data-");
|
|
340
|
+
/**
|
|
341
|
+
* Convert AI-SDK v5 UIMessages returned by the server (generate mode) into
|
|
342
|
+
* `MastraDBMessage[]`, stamping the supplied metadata onto each message's
|
|
343
|
+
* `content.metadata`. Private helper — `useChat` never exposes the AI-SDK
|
|
344
|
+
* shape to consumers.
|
|
345
|
+
*/
|
|
346
|
+
const dbFromServerUiMessages = (uiMessages, metadata) => uiMessages.map((uiMsg) => {
|
|
347
|
+
const dbMsg = AIV5Adapter.fromUIMessage(uiMsg);
|
|
348
|
+
return {
|
|
349
|
+
...dbMsg,
|
|
350
|
+
content: {
|
|
351
|
+
...dbMsg.content,
|
|
352
|
+
metadata: {
|
|
353
|
+
...dbMsg.content.metadata ?? {},
|
|
354
|
+
...metadata
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
};
|
|
358
|
+
});
|
|
359
|
+
const useChat = ({ agentId, resourceId, threadId, initialMessages, requestContext: propsRequestContext, clientTools: hookClientTools, onSignalSent, onSignalEcho, onThreadSignalsUnsupported, enableThreadSignals = false, streamPath, withInitialHistory }) => {
|
|
360
|
+
const threadSignalsDisabled = enableThreadSignals === false;
|
|
361
|
+
const _currentRunId = useRef(void 0);
|
|
362
|
+
const _onChunk = useRef(void 0);
|
|
363
|
+
const _networkRunId = useRef(void 0);
|
|
364
|
+
const _onNetworkChunk = useRef(void 0);
|
|
365
|
+
const _activeContinuation = useRef({ requestContext: propsRequestContext });
|
|
366
|
+
const _streamAbortRef = useRef(null);
|
|
367
|
+
const _threadSubscriptionAbortRef = useRef(null);
|
|
368
|
+
const _threadSubscriptionRef = useRef(null);
|
|
369
|
+
const _threadSubscriptionKeyRef = useRef(void 0);
|
|
370
|
+
const _threadSubscriptionPromiseRef = useRef(null);
|
|
371
|
+
const _threadSignalsUnsupportedRef = useRef(false);
|
|
372
|
+
const [messages, setMessages] = useState([]);
|
|
373
|
+
const [tasks, setTasks] = useState([]);
|
|
374
|
+
const liveTasks = useRef(void 0);
|
|
375
|
+
const [toolCallApprovals, setToolCallApprovals] = useState({});
|
|
376
|
+
const [networkToolCallApprovals, setNetworkToolCallApprovals] = useState({});
|
|
377
|
+
const pendingToolApprovalIdsRef = useRef(/* @__PURE__ */ new Set());
|
|
378
|
+
const liveApprovalIds = useRef(/* @__PURE__ */ new Set());
|
|
379
|
+
const liveRunId = useRef(void 0);
|
|
380
|
+
const liveRunFinished = useRef(false);
|
|
381
|
+
const [isAwaitingToolApproval, setIsAwaitingToolApproval] = useState(false);
|
|
382
|
+
const baseClient = useMastraClient();
|
|
383
|
+
const [isRunning, setIsRunning] = useState(false);
|
|
384
|
+
const [subscriptionHistory, setSubscriptionHistory] = useState(void 0);
|
|
385
|
+
const historyKey = `${agentId}:${resourceId ?? ""}:${threadId ?? ""}`;
|
|
386
|
+
const hydratedMessages = withInitialHistory && subscriptionHistory?.key === historyKey ? subscriptionHistory.messages : initialMessages;
|
|
387
|
+
const lastHydration = useRef(void 0);
|
|
388
|
+
useEffect(() => {
|
|
389
|
+
const previous = lastHydration.current;
|
|
390
|
+
const sameThread = previous?.agentId === agentId && previous.resourceId === resourceId && previous.threadId === threadId;
|
|
391
|
+
if (sameThread && previous.initialMessages === hydratedMessages) return;
|
|
392
|
+
const formattedMessages = resolveInitialMessages(hydratedMessages ?? []);
|
|
393
|
+
lastHydration.current = {
|
|
394
|
+
agentId,
|
|
395
|
+
resourceId,
|
|
396
|
+
threadId,
|
|
397
|
+
initialMessages: hydratedMessages,
|
|
398
|
+
formattedMessages
|
|
399
|
+
};
|
|
400
|
+
if (sameThread) {
|
|
401
|
+
setMessages((current) => mergeHistoryIntoConversation({
|
|
402
|
+
conversation: current,
|
|
403
|
+
history: formattedMessages,
|
|
404
|
+
previousHistory: previous.formattedMessages
|
|
405
|
+
}));
|
|
406
|
+
setTasks(liveTasks.current ?? extractLatestTasksFromMessages(formattedMessages));
|
|
407
|
+
const historyRunId = extractRunIdFromMessages(formattedMessages);
|
|
408
|
+
if (liveRunFinished.current) return;
|
|
409
|
+
if (!liveRunId.current && isRunning && historyRunId !== _currentRunId.current) return;
|
|
410
|
+
} else {
|
|
411
|
+
liveTasks.current = void 0;
|
|
412
|
+
liveApprovalIds.current.clear();
|
|
413
|
+
liveRunId.current = void 0;
|
|
414
|
+
liveRunFinished.current = false;
|
|
415
|
+
if (previous) setIsRunning(false);
|
|
416
|
+
setMessages(formattedMessages);
|
|
417
|
+
setTasks(extractLatestTasksFromMessages(formattedMessages));
|
|
418
|
+
}
|
|
419
|
+
const pendingApprovals = extractPendingToolApprovalIdsFromMessages(formattedMessages, liveRunId.current);
|
|
420
|
+
for (const toolCallId of liveApprovalIds.current) if (pendingToolApprovalIdsRef.current.has(toolCallId)) pendingApprovals.add(toolCallId);
|
|
421
|
+
else pendingApprovals.delete(toolCallId);
|
|
422
|
+
pendingToolApprovalIdsRef.current = pendingApprovals;
|
|
423
|
+
setIsAwaitingToolApproval(pendingApprovals.size > 0);
|
|
424
|
+
_currentRunId.current = liveRunId.current ?? extractRunIdFromMessages(formattedMessages);
|
|
425
|
+
}, [
|
|
426
|
+
agentId,
|
|
427
|
+
resourceId,
|
|
428
|
+
threadId,
|
|
429
|
+
hydratedMessages,
|
|
430
|
+
isRunning,
|
|
431
|
+
isAwaitingToolApproval
|
|
432
|
+
]);
|
|
433
|
+
useEffect(() => {
|
|
434
|
+
_activeContinuation.current = {
|
|
435
|
+
..._activeContinuation.current,
|
|
436
|
+
requestContext: propsRequestContext
|
|
437
|
+
};
|
|
438
|
+
}, [propsRequestContext]);
|
|
439
|
+
const normalizeSignalFileData = (data) => {
|
|
440
|
+
if (data instanceof URL) return data.toString();
|
|
441
|
+
return convertSignalDataToBase64String(data);
|
|
442
|
+
};
|
|
443
|
+
const getSignalContents = (coreUserMessages) => {
|
|
444
|
+
const parts = coreUserMessages.reduce((allParts, message) => {
|
|
445
|
+
if (typeof message.content === "string") {
|
|
446
|
+
allParts.push({
|
|
447
|
+
type: "text",
|
|
448
|
+
text: message.content
|
|
449
|
+
});
|
|
450
|
+
return allParts;
|
|
451
|
+
}
|
|
452
|
+
for (const part of message.content) if (part.type === "text") allParts.push({
|
|
453
|
+
type: "text",
|
|
454
|
+
text: part.text
|
|
455
|
+
});
|
|
456
|
+
else if (part.type === "file") allParts.push({
|
|
457
|
+
type: "file",
|
|
458
|
+
data: normalizeSignalFileData(part.data),
|
|
459
|
+
mediaType: part.mimeType,
|
|
460
|
+
...part.filename ? { filename: part.filename } : {}
|
|
461
|
+
});
|
|
462
|
+
else if (part.type === "image") allParts.push({
|
|
463
|
+
type: "file",
|
|
464
|
+
data: normalizeSignalFileData(part.image),
|
|
465
|
+
mediaType: part.mimeType ?? "image/png"
|
|
466
|
+
});
|
|
467
|
+
return allParts;
|
|
468
|
+
}, []);
|
|
469
|
+
return parts.length === 1 && parts[0]?.type === "text" ? parts[0].text : parts;
|
|
470
|
+
};
|
|
471
|
+
const markThreadSignalsUnsupported = useCallback(() => {
|
|
472
|
+
_threadSignalsUnsupportedRef.current = true;
|
|
473
|
+
onThreadSignalsUnsupported?.();
|
|
474
|
+
}, [onThreadSignalsUnsupported]);
|
|
475
|
+
const getSignalPreview = (coreUserMessages) => {
|
|
476
|
+
return coreUserMessages.flatMap((message) => {
|
|
477
|
+
if (typeof message.content === "string") return [message.content];
|
|
478
|
+
return message.content.map((part) => {
|
|
479
|
+
if (part.type === "text") return part.text;
|
|
480
|
+
if (part.type === "image") return "Image";
|
|
481
|
+
return part.filename ? `File: ${part.filename}` : "File";
|
|
482
|
+
});
|
|
483
|
+
}).join(" ").replace(/\s+/g, " ").trim() || "Attachment";
|
|
484
|
+
};
|
|
485
|
+
const closeThreadSubscription = useCallback(() => {
|
|
486
|
+
const subscription = _threadSubscriptionRef.current;
|
|
487
|
+
if (subscription?.unsubscribe) subscription.unsubscribe();
|
|
488
|
+
else _threadSubscriptionAbortRef.current?.abort();
|
|
489
|
+
_threadSubscriptionRef.current = null;
|
|
490
|
+
_threadSubscriptionAbortRef.current = null;
|
|
491
|
+
_threadSubscriptionKeyRef.current = void 0;
|
|
492
|
+
_threadSubscriptionPromiseRef.current = null;
|
|
493
|
+
}, []);
|
|
494
|
+
const processStreamChunk = useCallback(async (chunk, onChunk) => {
|
|
495
|
+
const isTerminal = chunk.type === "finish" || chunk.type === "abort" || chunk.type === "error";
|
|
496
|
+
if (isTerminal && liveRunId.current && chunk.runId !== liveRunId.current) return;
|
|
497
|
+
const runId = "runId" in chunk && typeof chunk.runId === "string" ? chunk.runId : void 0;
|
|
498
|
+
setMessages((prev) => {
|
|
499
|
+
const metadata = {
|
|
500
|
+
mode: "stream",
|
|
501
|
+
runId
|
|
502
|
+
};
|
|
503
|
+
const next = accumulateChunk({
|
|
504
|
+
chunk,
|
|
505
|
+
conversation: prev,
|
|
506
|
+
metadata
|
|
507
|
+
});
|
|
508
|
+
if ((chunk.type === "start" || chunk.type === "step-start") && chunk.payload?.messageId && runId) return next.map((message) => message.id === chunk.payload.messageId && message.role === "assistant" ? {
|
|
509
|
+
...message,
|
|
510
|
+
content: {
|
|
511
|
+
...message.content,
|
|
512
|
+
metadata: {
|
|
513
|
+
...message.content.metadata,
|
|
514
|
+
...metadata
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
} : message);
|
|
518
|
+
return next;
|
|
519
|
+
});
|
|
520
|
+
const streamedTasks = extractTasksFromToolResultChunk(chunk) ?? extractTasksFromSignalChunk(chunk);
|
|
521
|
+
if (streamedTasks !== void 0) {
|
|
522
|
+
liveTasks.current = streamedTasks;
|
|
523
|
+
setTasks(streamedTasks);
|
|
524
|
+
}
|
|
525
|
+
if (chunk.type === "data-user-message" && isDataChunk(chunk) && (chunk.data?.type === "user-message" || chunk.data?.type === "user") && typeof chunk.data?.id === "string") onSignalEcho?.(chunk.data.id);
|
|
526
|
+
if (chunk.type === "start") {
|
|
527
|
+
setIsRunning(true);
|
|
528
|
+
if ("runId" in chunk && typeof chunk.runId === "string") {
|
|
529
|
+
if (liveRunId.current !== chunk.runId) liveApprovalIds.current.clear();
|
|
530
|
+
liveRunFinished.current = false;
|
|
531
|
+
liveRunId.current = chunk.runId;
|
|
532
|
+
_currentRunId.current = chunk.runId;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
if (chunk.type === "tool-call-approval" || chunk.type === "tool-call-suspended") {
|
|
536
|
+
const toolCallId = chunk.payload?.toolCallId;
|
|
537
|
+
if (typeof toolCallId === "string") {
|
|
538
|
+
liveApprovalIds.current.add(toolCallId);
|
|
539
|
+
pendingToolApprovalIdsRef.current.add(toolCallId);
|
|
540
|
+
setIsAwaitingToolApproval(true);
|
|
541
|
+
}
|
|
542
|
+
if (runId) {
|
|
543
|
+
if (!liveRunId.current || liveRunFinished.current) {
|
|
544
|
+
liveRunId.current = runId;
|
|
545
|
+
liveRunFinished.current = false;
|
|
546
|
+
}
|
|
547
|
+
if (liveRunId.current === runId) _currentRunId.current = runId;
|
|
548
|
+
}
|
|
549
|
+
setIsRunning(false);
|
|
550
|
+
}
|
|
551
|
+
if (chunk.type === "tool-call-resumed") {
|
|
552
|
+
const toolCallId = chunk.payload?.toolCallId;
|
|
553
|
+
if (typeof toolCallId === "string") {
|
|
554
|
+
liveApprovalIds.current.add(toolCallId);
|
|
555
|
+
pendingToolApprovalIdsRef.current.delete(toolCallId);
|
|
556
|
+
setIsAwaitingToolApproval(pendingToolApprovalIdsRef.current.size > 0);
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
if (isTerminal) {
|
|
560
|
+
if (chunk.runId === liveRunId.current) liveRunFinished.current = true;
|
|
561
|
+
for (const toolCallId of pendingToolApprovalIdsRef.current) liveApprovalIds.current.add(toolCallId);
|
|
562
|
+
pendingToolApprovalIdsRef.current.clear();
|
|
563
|
+
setIsAwaitingToolApproval(false);
|
|
564
|
+
setIsRunning(false);
|
|
565
|
+
}
|
|
566
|
+
(onChunk ?? _onChunk.current)?.(chunk);
|
|
567
|
+
}, [onSignalEcho]);
|
|
568
|
+
const ensureThreadSubscription = useCallback(async ({ threadId, resourceId }) => {
|
|
569
|
+
const subscriptionKey = `${agentId}:${resourceId ?? ""}:${threadId}:${streamPath ?? ""}`;
|
|
570
|
+
if (_threadSubscriptionKeyRef.current === subscriptionKey && _threadSubscriptionPromiseRef.current) {
|
|
571
|
+
await _threadSubscriptionPromiseRef.current;
|
|
572
|
+
return;
|
|
573
|
+
}
|
|
574
|
+
closeThreadSubscription();
|
|
575
|
+
const subscriptionAbort = new AbortController();
|
|
576
|
+
_threadSubscriptionAbortRef.current = subscriptionAbort;
|
|
577
|
+
_threadSubscriptionKeyRef.current = subscriptionKey;
|
|
578
|
+
const releaseSubscriptionRefs = () => {
|
|
579
|
+
if (_threadSubscriptionAbortRef.current !== subscriptionAbort) return;
|
|
580
|
+
_threadSubscriptionRef.current = null;
|
|
581
|
+
_threadSubscriptionAbortRef.current = null;
|
|
582
|
+
_threadSubscriptionKeyRef.current = void 0;
|
|
583
|
+
_threadSubscriptionPromiseRef.current = null;
|
|
584
|
+
};
|
|
585
|
+
const subscriptionAgent = new MastraClient({
|
|
586
|
+
...baseClient.options,
|
|
587
|
+
abortSignal: subscriptionAbort.signal
|
|
588
|
+
}).getAgent(agentId, void 0, { stream: streamPath });
|
|
589
|
+
_threadSubscriptionPromiseRef.current = subscriptionAgent.subscribeToThread({
|
|
590
|
+
resourceId,
|
|
591
|
+
threadId,
|
|
592
|
+
...withInitialHistory ? { withInitialHistory } : {}
|
|
593
|
+
}).then((response) => {
|
|
594
|
+
const subscription = response;
|
|
595
|
+
if (_threadSubscriptionAbortRef.current !== subscriptionAbort) {
|
|
596
|
+
subscription.unsubscribe();
|
|
597
|
+
return;
|
|
598
|
+
}
|
|
599
|
+
_threadSubscriptionRef.current = subscription;
|
|
600
|
+
subscription.processDataStream({ onChunk: (chunk) => {
|
|
601
|
+
if (chunk.type === "thread-history") {
|
|
602
|
+
const history = resolveInitialMessages(chunk.payload.messages);
|
|
603
|
+
const previousHistory = lastHydration.current?.formattedMessages ?? [];
|
|
604
|
+
setMessages((current) => mergeHistoryIntoConversation({
|
|
605
|
+
conversation: current,
|
|
606
|
+
history,
|
|
607
|
+
previousHistory
|
|
608
|
+
}));
|
|
609
|
+
setSubscriptionHistory({
|
|
610
|
+
key: `${agentId}:${resourceId ?? ""}:${threadId}`,
|
|
611
|
+
messages: chunk.payload.messages
|
|
612
|
+
});
|
|
613
|
+
return;
|
|
614
|
+
}
|
|
615
|
+
return processStreamChunk(chunk);
|
|
616
|
+
} }).catch((error) => {
|
|
617
|
+
if (!isAbortError(error)) {
|
|
618
|
+
console.error("[useChat] Thread subscription failed", error);
|
|
619
|
+
setIsRunning(false);
|
|
620
|
+
}
|
|
621
|
+
}).finally(() => {
|
|
622
|
+
if (_threadSubscriptionRef.current === subscription) _threadSubscriptionRef.current = null;
|
|
623
|
+
releaseSubscriptionRefs();
|
|
624
|
+
});
|
|
625
|
+
}).catch((error) => {
|
|
626
|
+
releaseSubscriptionRefs();
|
|
627
|
+
if (isThreadSignalUnsupportedError(error)) {
|
|
628
|
+
markThreadSignalsUnsupported();
|
|
629
|
+
return;
|
|
630
|
+
}
|
|
631
|
+
if (!isAbortError(error)) {
|
|
632
|
+
console.error("[useChat] Thread subscription failed", error);
|
|
633
|
+
setIsRunning(false);
|
|
634
|
+
}
|
|
635
|
+
throw error;
|
|
636
|
+
});
|
|
637
|
+
await _threadSubscriptionPromiseRef.current;
|
|
638
|
+
}, [
|
|
639
|
+
agentId,
|
|
640
|
+
baseClient,
|
|
641
|
+
closeThreadSubscription,
|
|
642
|
+
markThreadSignalsUnsupported,
|
|
643
|
+
processStreamChunk,
|
|
644
|
+
streamPath,
|
|
645
|
+
withInitialHistory
|
|
646
|
+
]);
|
|
647
|
+
useEffect(() => {
|
|
648
|
+
_threadSignalsUnsupportedRef.current = false;
|
|
649
|
+
return closeThreadSubscription;
|
|
650
|
+
}, [
|
|
651
|
+
agentId,
|
|
652
|
+
resourceId,
|
|
653
|
+
threadId,
|
|
654
|
+
closeThreadSubscription
|
|
655
|
+
]);
|
|
656
|
+
useEffect(() => {
|
|
657
|
+
if (!threadId || threadSignalsDisabled) {
|
|
658
|
+
closeThreadSubscription();
|
|
659
|
+
return;
|
|
660
|
+
}
|
|
661
|
+
ensureThreadSubscription({
|
|
662
|
+
threadId,
|
|
663
|
+
resourceId: resourceId || agentId
|
|
664
|
+
}).catch((error) => {
|
|
665
|
+
if (!isAbortError(error)) console.error("[useChat] Thread subscription failed", error);
|
|
666
|
+
});
|
|
667
|
+
}, [
|
|
668
|
+
agentId,
|
|
669
|
+
closeThreadSubscription,
|
|
670
|
+
ensureThreadSubscription,
|
|
671
|
+
resourceId,
|
|
672
|
+
threadId,
|
|
673
|
+
threadSignalsDisabled
|
|
674
|
+
]);
|
|
675
|
+
const generate = async ({ coreUserMessages, model, requestContext, threadId, modelSettings, signal, onFinish, tracingOptions, clientTools, clientToolsResolver }) => {
|
|
676
|
+
const { frequencyPenalty, presencePenalty, maxRetries, maxTokens, temperature, topK, topP, instructions, system, providerOptions, maxSteps, requireToolApproval } = modelSettings || {};
|
|
677
|
+
const resolvedRequestContext = requestContext ?? propsRequestContext;
|
|
678
|
+
const resolvedClientTools = clientTools ?? hookClientTools;
|
|
679
|
+
_activeContinuation.current = {
|
|
680
|
+
model,
|
|
681
|
+
requestContext: resolvedRequestContext
|
|
682
|
+
};
|
|
683
|
+
setIsRunning(true);
|
|
684
|
+
const agent = new MastraClient({
|
|
685
|
+
...baseClient.options,
|
|
686
|
+
abortSignal: signal
|
|
687
|
+
}).getAgent(agentId, void 0, { stream: streamPath });
|
|
688
|
+
const runId = v4();
|
|
689
|
+
_currentRunId.current = runId;
|
|
690
|
+
const response = await agent.generate(coreUserMessages, {
|
|
691
|
+
model,
|
|
692
|
+
runId,
|
|
693
|
+
maxSteps,
|
|
694
|
+
modelSettings: {
|
|
695
|
+
frequencyPenalty,
|
|
696
|
+
presencePenalty,
|
|
697
|
+
maxRetries,
|
|
698
|
+
maxOutputTokens: maxTokens,
|
|
699
|
+
temperature,
|
|
700
|
+
topK,
|
|
701
|
+
topP
|
|
702
|
+
},
|
|
703
|
+
instructions,
|
|
704
|
+
system,
|
|
705
|
+
requestContext: resolvedRequestContext,
|
|
706
|
+
...threadId ? { memory: {
|
|
707
|
+
thread: threadId,
|
|
708
|
+
resource: resourceId || agentId
|
|
709
|
+
} } : {},
|
|
710
|
+
providerOptions,
|
|
711
|
+
tracingOptions,
|
|
712
|
+
requireToolApproval,
|
|
713
|
+
clientTools: resolvedClientTools,
|
|
714
|
+
clientToolsResolver
|
|
715
|
+
});
|
|
716
|
+
if (response.finishReason === "suspended" && response.suspendPayload) {
|
|
717
|
+
const { toolCallId, toolName, args } = response.suspendPayload;
|
|
718
|
+
if (response.response?.uiMessages) {
|
|
719
|
+
const dbMessages = dbFromServerUiMessages(response.response.uiMessages, {
|
|
720
|
+
mode: "generate",
|
|
721
|
+
requireApprovalMetadata: { [toolName]: {
|
|
722
|
+
toolCallId,
|
|
723
|
+
toolName,
|
|
724
|
+
args
|
|
725
|
+
} }
|
|
726
|
+
});
|
|
727
|
+
setMessages((prev) => [...prev, ...dbMessages]);
|
|
728
|
+
}
|
|
729
|
+
setIsRunning(false);
|
|
730
|
+
return;
|
|
731
|
+
}
|
|
732
|
+
setIsRunning(false);
|
|
733
|
+
if (response && "uiMessages" in response.response && response.response.uiMessages) {
|
|
734
|
+
const dbMessages = dbFromServerUiMessages(response.response.uiMessages, { mode: "generate" });
|
|
735
|
+
onFinish?.(dbMessages);
|
|
736
|
+
setMessages((prev) => [...prev, ...dbMessages]);
|
|
737
|
+
}
|
|
738
|
+
};
|
|
739
|
+
const stream = async ({ coreUserMessages, model, requestContext, threadId, onChunk, modelSettings, signal, tracingOptions, clientTools, clientToolsResolver, signalId, clientMessageId }) => {
|
|
740
|
+
const { frequencyPenalty, presencePenalty, maxRetries, maxTokens, temperature, topK, topP, instructions, system, providerOptions, maxSteps, requireToolApproval } = modelSettings || {};
|
|
741
|
+
const resolvedRequestContext = requestContext ?? propsRequestContext;
|
|
742
|
+
const resolvedClientTools = clientTools ?? hookClientTools;
|
|
743
|
+
const signalContinuationOptions = {
|
|
744
|
+
model,
|
|
745
|
+
maxSteps,
|
|
746
|
+
modelSettings: {
|
|
747
|
+
frequencyPenalty,
|
|
748
|
+
presencePenalty,
|
|
749
|
+
maxRetries,
|
|
750
|
+
maxOutputTokens: maxTokens,
|
|
751
|
+
temperature,
|
|
752
|
+
topK,
|
|
753
|
+
topP
|
|
754
|
+
},
|
|
755
|
+
instructions,
|
|
756
|
+
system,
|
|
757
|
+
providerOptions,
|
|
758
|
+
requireToolApproval,
|
|
759
|
+
tracingOptions
|
|
760
|
+
};
|
|
761
|
+
_activeContinuation.current = {
|
|
762
|
+
model,
|
|
763
|
+
requestContext: resolvedRequestContext
|
|
764
|
+
};
|
|
765
|
+
setIsRunning(true);
|
|
766
|
+
_streamAbortRef.current?.abort();
|
|
767
|
+
const internalAbort = new AbortController();
|
|
768
|
+
_streamAbortRef.current = internalAbort;
|
|
769
|
+
if (signal) if (signal.aborted) internalAbort.abort();
|
|
770
|
+
else signal.addEventListener("abort", () => internalAbort.abort(), { once: true });
|
|
771
|
+
const agent = new MastraClient({
|
|
772
|
+
...baseClient.options,
|
|
773
|
+
abortSignal: internalAbort.signal
|
|
774
|
+
}).getAgent(agentId, void 0, { stream: streamPath });
|
|
775
|
+
const streamWithLegacyRoute = async () => {
|
|
776
|
+
const runId = v4();
|
|
777
|
+
const response = await agent.stream(coreUserMessages, {
|
|
778
|
+
model,
|
|
779
|
+
runId,
|
|
780
|
+
maxSteps,
|
|
781
|
+
untilIdle: true,
|
|
782
|
+
modelSettings: {
|
|
783
|
+
frequencyPenalty,
|
|
784
|
+
presencePenalty,
|
|
785
|
+
maxRetries,
|
|
786
|
+
maxOutputTokens: maxTokens,
|
|
787
|
+
temperature,
|
|
788
|
+
topK,
|
|
789
|
+
topP
|
|
790
|
+
},
|
|
791
|
+
instructions,
|
|
792
|
+
system,
|
|
793
|
+
requestContext: resolvedRequestContext,
|
|
794
|
+
...threadId ? { memory: {
|
|
795
|
+
thread: threadId,
|
|
796
|
+
resource: resourceId || agentId
|
|
797
|
+
} } : {},
|
|
798
|
+
providerOptions,
|
|
799
|
+
requireToolApproval,
|
|
800
|
+
tracingOptions,
|
|
801
|
+
clientTools: resolvedClientTools,
|
|
802
|
+
clientToolsResolver
|
|
803
|
+
});
|
|
804
|
+
_onChunk.current = onChunk;
|
|
805
|
+
_currentRunId.current = runId;
|
|
806
|
+
await response.processDataStream({ onChunk: (chunk) => processStreamChunk(chunk, onChunk) });
|
|
807
|
+
if (_streamAbortRef.current === internalAbort) _streamAbortRef.current = null;
|
|
808
|
+
setIsRunning(false);
|
|
809
|
+
};
|
|
810
|
+
if (!threadId || _threadSignalsUnsupportedRef.current || threadSignalsDisabled) {
|
|
811
|
+
await streamWithLegacyRoute();
|
|
812
|
+
return;
|
|
813
|
+
}
|
|
814
|
+
_onChunk.current = onChunk;
|
|
815
|
+
await ensureThreadSubscription({
|
|
816
|
+
threadId,
|
|
817
|
+
resourceId: resourceId || agentId
|
|
818
|
+
});
|
|
819
|
+
if (_threadSignalsUnsupportedRef.current) {
|
|
820
|
+
await streamWithLegacyRoute();
|
|
821
|
+
return;
|
|
822
|
+
}
|
|
823
|
+
const resolvedSignalId = signalId ?? v4();
|
|
824
|
+
const messageContents = getSignalContents(coreUserMessages);
|
|
825
|
+
const requestContextRecord = resolvedRequestContext;
|
|
826
|
+
const streamOptions = {
|
|
827
|
+
model,
|
|
828
|
+
maxSteps,
|
|
829
|
+
modelSettings: {
|
|
830
|
+
frequencyPenalty,
|
|
831
|
+
presencePenalty,
|
|
832
|
+
maxRetries,
|
|
833
|
+
maxOutputTokens: maxTokens,
|
|
834
|
+
temperature,
|
|
835
|
+
topK,
|
|
836
|
+
topP
|
|
837
|
+
},
|
|
838
|
+
instructions,
|
|
839
|
+
system,
|
|
840
|
+
requestContext: requestContextRecord,
|
|
841
|
+
providerOptions,
|
|
842
|
+
requireToolApproval,
|
|
843
|
+
tracingOptions,
|
|
844
|
+
clientTools: resolvedClientTools,
|
|
845
|
+
clientToolsResolver
|
|
846
|
+
};
|
|
847
|
+
try {
|
|
848
|
+
const result = await agent.sendMessage({
|
|
849
|
+
message: clientMessageId ? {
|
|
850
|
+
contents: messageContents,
|
|
851
|
+
metadata: { [CLIENT_MESSAGE_ID_KEY]: clientMessageId }
|
|
852
|
+
} : messageContents,
|
|
853
|
+
resourceId: resourceId || agentId,
|
|
854
|
+
threadId,
|
|
855
|
+
ifIdle: { streamOptions: {
|
|
856
|
+
...signalContinuationOptions,
|
|
857
|
+
requestContext: requestContextRecord,
|
|
858
|
+
clientTools: resolvedClientTools,
|
|
859
|
+
clientToolsResolver
|
|
860
|
+
} }
|
|
861
|
+
});
|
|
862
|
+
const echoedSignalId = result.signal && typeof result.signal === "object" && "id" in result.signal && typeof result.signal.id === "string" ? result.signal.id : resolvedSignalId;
|
|
863
|
+
onSignalSent?.(echoedSignalId, getSignalPreview(coreUserMessages));
|
|
864
|
+
if (pendingToolApprovalIdsRef.current.size > 0) setIsRunning(false);
|
|
865
|
+
} catch (error) {
|
|
866
|
+
if (isThreadSignalUnsupportedError(error)) try {
|
|
867
|
+
await agent.sendSignal({
|
|
868
|
+
signal: {
|
|
869
|
+
id: resolvedSignalId,
|
|
870
|
+
type: "user-message",
|
|
871
|
+
contents: messageContents
|
|
872
|
+
},
|
|
873
|
+
resourceId: resourceId || agentId,
|
|
874
|
+
threadId,
|
|
875
|
+
ifIdle: { streamOptions }
|
|
876
|
+
});
|
|
877
|
+
onSignalSent?.(resolvedSignalId, getSignalPreview(coreUserMessages));
|
|
878
|
+
return;
|
|
879
|
+
} catch (signalError) {
|
|
880
|
+
onSignalEcho?.(resolvedSignalId);
|
|
881
|
+
if (isThreadSignalUnsupportedError(signalError)) {
|
|
882
|
+
markThreadSignalsUnsupported();
|
|
883
|
+
setMessages((prev) => [...prev, fromCoreUserMessagesToMastraDBMessage(coreUserMessages)]);
|
|
884
|
+
await streamWithLegacyRoute();
|
|
885
|
+
return;
|
|
886
|
+
}
|
|
887
|
+
throw signalError;
|
|
888
|
+
}
|
|
889
|
+
throw error;
|
|
890
|
+
}
|
|
891
|
+
if (_streamAbortRef.current === internalAbort) _streamAbortRef.current = null;
|
|
892
|
+
};
|
|
893
|
+
const network = async ({ coreUserMessages, model, requestContext, threadId, onNetworkChunk, modelSettings, signal, tracingOptions }) => {
|
|
894
|
+
const { frequencyPenalty, presencePenalty, maxRetries, maxTokens, temperature, topK, topP, maxSteps } = modelSettings || {};
|
|
895
|
+
const resolvedRequestContext = requestContext ?? propsRequestContext;
|
|
896
|
+
_activeContinuation.current = {
|
|
897
|
+
model,
|
|
898
|
+
requestContext: resolvedRequestContext
|
|
899
|
+
};
|
|
900
|
+
setIsRunning(true);
|
|
901
|
+
const agent = new MastraClient({
|
|
902
|
+
...baseClient.options,
|
|
903
|
+
abortSignal: signal
|
|
904
|
+
}).getAgent(agentId, void 0, { stream: streamPath });
|
|
905
|
+
const runId = v4();
|
|
906
|
+
_currentRunId.current = runId;
|
|
907
|
+
const response = await agent.network(coreUserMessages, {
|
|
908
|
+
model,
|
|
909
|
+
maxSteps,
|
|
910
|
+
modelSettings: {
|
|
911
|
+
frequencyPenalty,
|
|
912
|
+
presencePenalty,
|
|
913
|
+
maxRetries,
|
|
914
|
+
maxOutputTokens: maxTokens,
|
|
915
|
+
temperature,
|
|
916
|
+
topK,
|
|
917
|
+
topP
|
|
918
|
+
},
|
|
919
|
+
runId,
|
|
920
|
+
requestContext: resolvedRequestContext,
|
|
921
|
+
...threadId ? { memory: {
|
|
922
|
+
thread: threadId,
|
|
923
|
+
resource: resourceId || agentId
|
|
924
|
+
} } : {},
|
|
925
|
+
tracingOptions
|
|
926
|
+
});
|
|
927
|
+
_onNetworkChunk.current = onNetworkChunk;
|
|
928
|
+
_networkRunId.current = runId;
|
|
929
|
+
await response.processDataStream({ onChunk: async (chunk) => {
|
|
930
|
+
setMessages((prev) => accumulateNetworkChunk({
|
|
931
|
+
chunk,
|
|
932
|
+
conversation: prev,
|
|
933
|
+
metadata: {
|
|
934
|
+
mode: "network",
|
|
935
|
+
runId
|
|
936
|
+
}
|
|
937
|
+
}));
|
|
938
|
+
onNetworkChunk?.(chunk);
|
|
939
|
+
} });
|
|
940
|
+
setMessages((prev) => finishStreamingAssistantMessage(prev));
|
|
941
|
+
setIsRunning(false);
|
|
942
|
+
};
|
|
943
|
+
const handleCancelRun = () => {
|
|
944
|
+
_streamAbortRef.current?.abort();
|
|
945
|
+
_streamAbortRef.current = null;
|
|
946
|
+
const threadSubscription = _threadSubscriptionRef.current;
|
|
947
|
+
Promise.resolve(threadSubscription?.abort?.()).catch((error) => {
|
|
948
|
+
console.error("[useChat] Failed to abort thread subscription", error);
|
|
949
|
+
});
|
|
950
|
+
closeThreadSubscription();
|
|
951
|
+
setMessages((prev) => finishStreamingAssistantMessage(prev));
|
|
952
|
+
liveRunFinished.current = true;
|
|
953
|
+
pendingToolApprovalIdsRef.current.clear();
|
|
954
|
+
setIsAwaitingToolApproval(false);
|
|
955
|
+
setIsRunning(false);
|
|
956
|
+
_currentRunId.current = void 0;
|
|
957
|
+
_onChunk.current = void 0;
|
|
958
|
+
_networkRunId.current = void 0;
|
|
959
|
+
_onNetworkChunk.current = void 0;
|
|
960
|
+
_activeContinuation.current = {};
|
|
961
|
+
};
|
|
962
|
+
const approveToolCall = async (toolCallId, resumeData) => {
|
|
963
|
+
const onChunk = _onChunk.current;
|
|
964
|
+
const currentRunId = _currentRunId.current;
|
|
965
|
+
const continuation = _activeContinuation.current;
|
|
966
|
+
if (!currentRunId) return console.info("[approveToolCall] approveToolCall can only be called after a stream has started");
|
|
967
|
+
setIsRunning(true);
|
|
968
|
+
setToolCallApprovals((prev) => ({
|
|
969
|
+
...prev,
|
|
970
|
+
[toolCallId]: { status: "approved" }
|
|
971
|
+
}));
|
|
972
|
+
const agent = baseClient.getAgent(agentId, void 0, { stream: streamPath });
|
|
973
|
+
if (_threadSubscriptionKeyRef.current && threadId) {
|
|
974
|
+
try {
|
|
975
|
+
await agent.sendToolApproval({
|
|
976
|
+
resourceId: resourceId || agentId,
|
|
977
|
+
threadId,
|
|
978
|
+
toolCallId,
|
|
979
|
+
approved: true,
|
|
980
|
+
...continuation.model !== void 0 ? { streamOptions: { model: continuation.model } } : {},
|
|
981
|
+
...resumeData !== void 0 ? { resumeData } : {},
|
|
982
|
+
requestContext: continuation.requestContext
|
|
983
|
+
});
|
|
984
|
+
liveRunId.current ??= currentRunId;
|
|
985
|
+
liveApprovalIds.current.add(toolCallId);
|
|
986
|
+
pendingToolApprovalIdsRef.current.delete(toolCallId);
|
|
987
|
+
setIsAwaitingToolApproval(pendingToolApprovalIdsRef.current.size > 0);
|
|
988
|
+
setIsRunning(false);
|
|
989
|
+
} catch (error) {
|
|
990
|
+
setToolCallApprovals((prev) => {
|
|
991
|
+
const next = { ...prev };
|
|
992
|
+
delete next[toolCallId];
|
|
993
|
+
return next;
|
|
994
|
+
});
|
|
995
|
+
setIsRunning(false);
|
|
996
|
+
throw error;
|
|
997
|
+
}
|
|
998
|
+
return;
|
|
999
|
+
}
|
|
1000
|
+
try {
|
|
1001
|
+
await (resumeData !== void 0 ? await agent.resumeStream(resumeData, {
|
|
1002
|
+
runId: currentRunId,
|
|
1003
|
+
toolCallId,
|
|
1004
|
+
...continuation
|
|
1005
|
+
}) : await agent.approveToolCall({
|
|
1006
|
+
runId: currentRunId,
|
|
1007
|
+
toolCallId,
|
|
1008
|
+
...continuation
|
|
1009
|
+
})).processDataStream({ onChunk: async (chunk) => {
|
|
1010
|
+
await processStreamChunk(chunk, onChunk);
|
|
1011
|
+
} });
|
|
1012
|
+
setIsRunning(false);
|
|
1013
|
+
} catch (error) {
|
|
1014
|
+
setToolCallApprovals((prev) => {
|
|
1015
|
+
const next = { ...prev };
|
|
1016
|
+
delete next[toolCallId];
|
|
1017
|
+
return next;
|
|
1018
|
+
});
|
|
1019
|
+
setIsRunning(false);
|
|
1020
|
+
throw error;
|
|
1021
|
+
}
|
|
1022
|
+
};
|
|
1023
|
+
const declineToolCall = async (toolCallId) => {
|
|
1024
|
+
const onChunk = _onChunk.current;
|
|
1025
|
+
const currentRunId = _currentRunId.current;
|
|
1026
|
+
const continuation = _activeContinuation.current;
|
|
1027
|
+
if (!currentRunId) return console.info("[declineToolCall] declineToolCall can only be called after a stream has started");
|
|
1028
|
+
setIsRunning(true);
|
|
1029
|
+
setToolCallApprovals((prev) => ({
|
|
1030
|
+
...prev,
|
|
1031
|
+
[toolCallId]: { status: "declined" }
|
|
1032
|
+
}));
|
|
1033
|
+
const agent = baseClient.getAgent(agentId, void 0, { stream: streamPath });
|
|
1034
|
+
if (_threadSubscriptionKeyRef.current && threadId) {
|
|
1035
|
+
try {
|
|
1036
|
+
await agent.sendToolApproval({
|
|
1037
|
+
resourceId: resourceId || agentId,
|
|
1038
|
+
threadId,
|
|
1039
|
+
toolCallId,
|
|
1040
|
+
approved: false,
|
|
1041
|
+
...continuation.model !== void 0 ? { streamOptions: { model: continuation.model } } : {},
|
|
1042
|
+
requestContext: continuation.requestContext
|
|
1043
|
+
});
|
|
1044
|
+
liveRunId.current ??= currentRunId;
|
|
1045
|
+
liveApprovalIds.current.add(toolCallId);
|
|
1046
|
+
pendingToolApprovalIdsRef.current.delete(toolCallId);
|
|
1047
|
+
setIsAwaitingToolApproval(pendingToolApprovalIdsRef.current.size > 0);
|
|
1048
|
+
setIsRunning(false);
|
|
1049
|
+
} catch (error) {
|
|
1050
|
+
setToolCallApprovals((prev) => {
|
|
1051
|
+
const next = { ...prev };
|
|
1052
|
+
delete next[toolCallId];
|
|
1053
|
+
return next;
|
|
1054
|
+
});
|
|
1055
|
+
setIsRunning(false);
|
|
1056
|
+
throw error;
|
|
1057
|
+
}
|
|
1058
|
+
return;
|
|
1059
|
+
}
|
|
1060
|
+
await (await agent.declineToolCall({
|
|
1061
|
+
runId: currentRunId,
|
|
1062
|
+
toolCallId,
|
|
1063
|
+
...continuation
|
|
1064
|
+
})).processDataStream({ onChunk: async (chunk) => {
|
|
1065
|
+
await processStreamChunk(chunk, onChunk);
|
|
1066
|
+
} });
|
|
1067
|
+
setIsRunning(false);
|
|
1068
|
+
};
|
|
1069
|
+
const approveToolCallGenerate = async (toolCallId) => {
|
|
1070
|
+
const currentRunId = _currentRunId.current;
|
|
1071
|
+
const continuation = _activeContinuation.current;
|
|
1072
|
+
if (!currentRunId) return console.info("[approveToolCallGenerate] approveToolCallGenerate can only be called after a generate has started");
|
|
1073
|
+
setIsRunning(true);
|
|
1074
|
+
setToolCallApprovals((prev) => ({
|
|
1075
|
+
...prev,
|
|
1076
|
+
[toolCallId]: { status: "approved" }
|
|
1077
|
+
}));
|
|
1078
|
+
const response = await baseClient.getAgent(agentId, void 0, { stream: streamPath }).approveToolCallGenerate({
|
|
1079
|
+
runId: currentRunId,
|
|
1080
|
+
toolCallId,
|
|
1081
|
+
...continuation
|
|
1082
|
+
});
|
|
1083
|
+
if (response && "uiMessages" in response.response && response.response.uiMessages) {
|
|
1084
|
+
const dbMessages = dbFromServerUiMessages(response.response.uiMessages, { mode: "generate" });
|
|
1085
|
+
setMessages((prev) => [...prev, ...dbMessages]);
|
|
1086
|
+
}
|
|
1087
|
+
setIsRunning(false);
|
|
1088
|
+
};
|
|
1089
|
+
const declineToolCallGenerate = async (toolCallId) => {
|
|
1090
|
+
const currentRunId = _currentRunId.current;
|
|
1091
|
+
const continuation = _activeContinuation.current;
|
|
1092
|
+
if (!currentRunId) return console.info("[declineToolCallGenerate] declineToolCallGenerate can only be called after a generate has started");
|
|
1093
|
+
setIsRunning(true);
|
|
1094
|
+
setToolCallApprovals((prev) => ({
|
|
1095
|
+
...prev,
|
|
1096
|
+
[toolCallId]: { status: "declined" }
|
|
1097
|
+
}));
|
|
1098
|
+
const response = await baseClient.getAgent(agentId, void 0, { stream: streamPath }).declineToolCallGenerate({
|
|
1099
|
+
runId: currentRunId,
|
|
1100
|
+
toolCallId,
|
|
1101
|
+
...continuation
|
|
1102
|
+
});
|
|
1103
|
+
if (response && "uiMessages" in response.response && response.response.uiMessages) {
|
|
1104
|
+
const dbMessages = dbFromServerUiMessages(response.response.uiMessages, { mode: "generate" });
|
|
1105
|
+
setMessages((prev) => [...prev, ...dbMessages]);
|
|
1106
|
+
}
|
|
1107
|
+
setIsRunning(false);
|
|
1108
|
+
};
|
|
1109
|
+
const approveNetworkToolCall = async (toolName, runId) => {
|
|
1110
|
+
const onNetworkChunk = _onNetworkChunk.current;
|
|
1111
|
+
const networkRunId = runId || _networkRunId.current;
|
|
1112
|
+
const continuation = _activeContinuation.current;
|
|
1113
|
+
if (!networkRunId) return console.info("[approveNetworkToolCall] approveNetworkToolCall can only be called after a network stream has started");
|
|
1114
|
+
_currentRunId.current = networkRunId;
|
|
1115
|
+
setIsRunning(true);
|
|
1116
|
+
setNetworkToolCallApprovals((prev) => ({
|
|
1117
|
+
...prev,
|
|
1118
|
+
[runId ? `${runId}-${toolName}` : toolName]: { status: "approved" }
|
|
1119
|
+
}));
|
|
1120
|
+
await (await baseClient.getAgent(agentId, void 0, { stream: streamPath }).approveNetworkToolCall({
|
|
1121
|
+
runId: networkRunId,
|
|
1122
|
+
...continuation
|
|
1123
|
+
})).processDataStream({ onChunk: async (chunk) => {
|
|
1124
|
+
setMessages((prev) => accumulateNetworkChunk({
|
|
1125
|
+
chunk,
|
|
1126
|
+
conversation: prev,
|
|
1127
|
+
metadata: {
|
|
1128
|
+
mode: "network",
|
|
1129
|
+
runId: networkRunId
|
|
1130
|
+
}
|
|
1131
|
+
}));
|
|
1132
|
+
onNetworkChunk?.(chunk);
|
|
1133
|
+
} });
|
|
1134
|
+
setMessages((prev) => finishStreamingAssistantMessage(prev));
|
|
1135
|
+
setIsRunning(false);
|
|
1136
|
+
};
|
|
1137
|
+
const declineNetworkToolCall = async (toolName, runId) => {
|
|
1138
|
+
const onNetworkChunk = _onNetworkChunk.current;
|
|
1139
|
+
const networkRunId = runId || _networkRunId.current;
|
|
1140
|
+
const continuation = _activeContinuation.current;
|
|
1141
|
+
if (!networkRunId) return console.info("[declineNetworkToolCall] declineNetworkToolCall can only be called after a network stream has started");
|
|
1142
|
+
_currentRunId.current = networkRunId;
|
|
1143
|
+
setIsRunning(true);
|
|
1144
|
+
setNetworkToolCallApprovals((prev) => ({
|
|
1145
|
+
...prev,
|
|
1146
|
+
[runId ? `${runId}-${toolName}` : toolName]: { status: "declined" }
|
|
1147
|
+
}));
|
|
1148
|
+
await (await baseClient.getAgent(agentId, void 0, { stream: streamPath }).declineNetworkToolCall({
|
|
1149
|
+
runId: networkRunId,
|
|
1150
|
+
...continuation
|
|
1151
|
+
})).processDataStream({ onChunk: async (chunk) => {
|
|
1152
|
+
setMessages((prev) => accumulateNetworkChunk({
|
|
1153
|
+
chunk,
|
|
1154
|
+
conversation: prev,
|
|
1155
|
+
metadata: {
|
|
1156
|
+
mode: "network",
|
|
1157
|
+
runId: networkRunId
|
|
1158
|
+
}
|
|
1159
|
+
}));
|
|
1160
|
+
onNetworkChunk?.(chunk);
|
|
1161
|
+
} });
|
|
1162
|
+
setMessages((prev) => finishStreamingAssistantMessage(prev));
|
|
1163
|
+
setIsRunning(false);
|
|
1164
|
+
};
|
|
1165
|
+
const sendMessage = async ({ mode = "stream", ...args }) => {
|
|
1166
|
+
if (!isRunning && !isAwaitingToolApproval) _currentRunId.current = void 0;
|
|
1167
|
+
const coreUserMessages = [createUserMessage(args.message, args.coreUserMessages)];
|
|
1168
|
+
const dbUserMessage = fromCoreUserMessagesToMastraDBMessage(coreUserMessages);
|
|
1169
|
+
const clientSetId = mode === "stream" && args.threadId && !_threadSignalsUnsupportedRef.current && !threadSignalsDisabled ? `client-set-${v4()}` : void 0;
|
|
1170
|
+
const signalId = clientSetId;
|
|
1171
|
+
const clientMessageId = clientSetId;
|
|
1172
|
+
if (signalId) {
|
|
1173
|
+
const metadata = {
|
|
1174
|
+
...dbUserMessage.content.metadata,
|
|
1175
|
+
mode: "stream",
|
|
1176
|
+
status: "pending",
|
|
1177
|
+
[CLIENT_MESSAGE_ID_KEY]: clientMessageId
|
|
1178
|
+
};
|
|
1179
|
+
const pendingMessage = {
|
|
1180
|
+
...dbUserMessage,
|
|
1181
|
+
id: clientSetId,
|
|
1182
|
+
content: {
|
|
1183
|
+
...dbUserMessage.content,
|
|
1184
|
+
metadata
|
|
1185
|
+
}
|
|
1186
|
+
};
|
|
1187
|
+
setMessages((s) => [...s, pendingMessage]);
|
|
1188
|
+
} else setMessages((s) => [...s, dbUserMessage]);
|
|
1189
|
+
try {
|
|
1190
|
+
if (mode === "generate") await generate({
|
|
1191
|
+
...args,
|
|
1192
|
+
coreUserMessages
|
|
1193
|
+
});
|
|
1194
|
+
else if (mode === "stream") await stream({
|
|
1195
|
+
...args,
|
|
1196
|
+
coreUserMessages,
|
|
1197
|
+
signalId,
|
|
1198
|
+
clientMessageId
|
|
1199
|
+
});
|
|
1200
|
+
else if (mode === "network") await network({
|
|
1201
|
+
...args,
|
|
1202
|
+
coreUserMessages
|
|
1203
|
+
});
|
|
1204
|
+
} catch (error) {
|
|
1205
|
+
setIsRunning(false);
|
|
1206
|
+
throw error;
|
|
1207
|
+
}
|
|
1208
|
+
};
|
|
1209
|
+
return {
|
|
1210
|
+
setMessages,
|
|
1211
|
+
sendMessage,
|
|
1212
|
+
isRunning,
|
|
1213
|
+
activeRunId: isRunning || isAwaitingToolApproval ? _currentRunId.current : void 0,
|
|
1214
|
+
isAwaitingToolApproval,
|
|
1215
|
+
messages,
|
|
1216
|
+
tasks,
|
|
1217
|
+
approveToolCall,
|
|
1218
|
+
declineToolCall,
|
|
1219
|
+
approveToolCallGenerate,
|
|
1220
|
+
declineToolCallGenerate,
|
|
1221
|
+
cancelRun: handleCancelRun,
|
|
1222
|
+
toolCallApprovals,
|
|
1223
|
+
approveNetworkToolCall,
|
|
1224
|
+
declineNetworkToolCall,
|
|
1225
|
+
networkToolCallApprovals
|
|
1226
|
+
};
|
|
1227
|
+
};
|
|
1228
|
+
//#endregion
|
|
1229
|
+
export { fromCoreUserMessageToMastraDBMessage as n, fromCoreUserMessagesToMastraDBMessage as r, useChat as t };
|
|
1230
|
+
|
|
1231
|
+
//# sourceMappingURL=hooks-BFQK_s4g.js.map
|