@pellux/goodvibes-tui 0.18.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/.goodvibes/GOODVIBES.md +35 -0
- package/.goodvibes/agents/reviewer.md +89 -0
- package/.goodvibes/skills/add-provider/SKILL.md +199 -0
- package/CHANGELOG.md +1681 -0
- package/README.md +1607 -0
- package/bin/goodvibes +66 -0
- package/docs/README.md +32 -0
- package/docs/foundation-artifacts/README.md +16 -0
- package/docs/foundation-artifacts/knowledge-graphql.graphql +397 -0
- package/docs/foundation-artifacts/knowledge-store.sql +183 -0
- package/docs/foundation-artifacts/operator-contract.json +55157 -0
- package/docs/foundation-artifacts/peer-contract.json +2384 -0
- package/package.json +114 -0
- package/scripts/postinstall.mjs +203 -0
- package/src/acp/connection.ts +447 -0
- package/src/acp/index.ts +7 -0
- package/src/acp/manager.ts +133 -0
- package/src/adapters/bluebubbles/index.ts +127 -0
- package/src/adapters/discord/index.ts +297 -0
- package/src/adapters/github/index.ts +73 -0
- package/src/adapters/google-chat/index.ts +119 -0
- package/src/adapters/imessage/index.ts +92 -0
- package/src/adapters/index.ts +15 -0
- package/src/adapters/matrix/index.ts +116 -0
- package/src/adapters/mattermost/index.ts +151 -0
- package/src/adapters/msteams/index.ts +180 -0
- package/src/adapters/ntfy/index.ts +118 -0
- package/src/adapters/signal/index.ts +92 -0
- package/src/adapters/slack/index.ts +323 -0
- package/src/adapters/telegram/index.ts +160 -0
- package/src/adapters/types.ts +97 -0
- package/src/adapters/webhook/index.ts +178 -0
- package/src/adapters/whatsapp/index.ts +135 -0
- package/src/agents/message-bus-core.ts +312 -0
- package/src/agents/message-bus.ts +2 -0
- package/src/agents/orchestrator-prompts.ts +351 -0
- package/src/agents/orchestrator-runner.ts +668 -0
- package/src/agents/orchestrator.ts +437 -0
- package/src/agents/session.ts +108 -0
- package/src/agents/worktree.ts +153 -0
- package/src/agents/wrfc-config.ts +47 -0
- package/src/agents/wrfc-controller.ts +747 -0
- package/src/agents/wrfc-gate-runtime.ts +75 -0
- package/src/agents/wrfc-reporting.ts +284 -0
- package/src/agents/wrfc-runtime-events.ts +150 -0
- package/src/agents/wrfc-types.ts +67 -0
- package/src/automation/delivery-manager.ts +368 -0
- package/src/automation/index.ts +72 -0
- package/src/automation/manager-runtime-delivery.ts +139 -0
- package/src/automation/manager-runtime-events.ts +131 -0
- package/src/automation/manager-runtime-execution.ts +511 -0
- package/src/automation/manager-runtime-helpers.ts +433 -0
- package/src/automation/manager-runtime-job-mutations.ts +175 -0
- package/src/automation/manager-runtime-reconcile.ts +148 -0
- package/src/automation/manager-runtime-scheduling.ts +189 -0
- package/src/automation/manager-runtime-sync.ts +54 -0
- package/src/automation/manager-runtime.ts +721 -0
- package/src/automation/manager.ts +10 -0
- package/src/automation/service.ts +242 -0
- package/src/channels/builtin/account-actions.ts +490 -0
- package/src/channels/builtin/accounts.ts +433 -0
- package/src/channels/builtin/contracts.ts +405 -0
- package/src/channels/builtin/plugins.ts +308 -0
- package/src/channels/builtin/rendering.ts +174 -0
- package/src/channels/builtin/setup-schema.ts +504 -0
- package/src/channels/builtin/shared.ts +96 -0
- package/src/channels/builtin/surfaces.ts +57 -0
- package/src/channels/builtin/targets.ts +693 -0
- package/src/channels/builtin-runtime.ts +443 -0
- package/src/channels/delivery/shared.ts +199 -0
- package/src/channels/delivery/strategies-bridge.ts +246 -0
- package/src/channels/delivery/strategies-core.ts +299 -0
- package/src/channels/delivery/strategies-enterprise.ts +178 -0
- package/src/channels/delivery/types.ts +59 -0
- package/src/channels/delivery-router.ts +127 -0
- package/src/channels/index.ts +77 -0
- package/src/channels/plugin-registry.ts +551 -0
- package/src/channels/provider-runtime.ts +330 -0
- package/src/channels/reply-pipeline.ts +522 -0
- package/src/channels/route-manager.ts +340 -0
- package/src/channels/surface-registry.ts +186 -0
- package/src/config/helper-model.ts +233 -0
- package/src/config/index.ts +193 -0
- package/src/config/manager.ts +404 -0
- package/src/config/secrets.ts +547 -0
- package/src/config/service-registry.ts +329 -0
- package/src/config/subscription-auth.ts +31 -0
- package/src/config/subscription-providers.ts +127 -0
- package/src/config/tool-llm.ts +110 -0
- package/src/control-plane/approval-broker.ts +351 -0
- package/src/control-plane/gateway.ts +713 -0
- package/src/control-plane/index.ts +54 -0
- package/src/control-plane/media-contract-schemas.ts +208 -0
- package/src/control-plane/method-catalog-admin.ts +136 -0
- package/src/control-plane/method-catalog-channels.ts +591 -0
- package/src/control-plane/method-catalog-control-automation.ts +475 -0
- package/src/control-plane/method-catalog-control-core.ts +594 -0
- package/src/control-plane/method-catalog-control.ts +8 -0
- package/src/control-plane/method-catalog-events.ts +74 -0
- package/src/control-plane/method-catalog-knowledge.ts +531 -0
- package/src/control-plane/method-catalog-media.ts +279 -0
- package/src/control-plane/method-catalog-runtime.ts +304 -0
- package/src/control-plane/method-catalog-shared.ts +223 -0
- package/src/control-plane/method-catalog.ts +242 -0
- package/src/control-plane/operator-contract-schemas-admin.ts +639 -0
- package/src/control-plane/operator-contract-schemas-channels.ts +375 -0
- package/src/control-plane/operator-contract-schemas-control.ts +226 -0
- package/src/control-plane/operator-contract-schemas-domains.ts +4 -0
- package/src/control-plane/operator-contract-schemas-knowledge.ts +582 -0
- package/src/control-plane/operator-contract-schemas-media.ts +297 -0
- package/src/control-plane/operator-contract-schemas-permissions.ts +100 -0
- package/src/control-plane/operator-contract-schemas-remote.ts +38 -0
- package/src/control-plane/operator-contract-schemas-runtime.ts +563 -0
- package/src/control-plane/operator-contract-schemas-shared.ts +85 -0
- package/src/control-plane/operator-contract-schemas-telemetry.ts +349 -0
- package/src/control-plane/operator-contract-schemas.ts +6 -0
- package/src/control-plane/operator-contract.ts +163 -0
- package/src/control-plane/session-broker.ts +780 -0
- package/src/core/compaction-sections.ts +492 -0
- package/src/core/compaction-types.ts +147 -0
- package/src/core/composer-state.ts +59 -0
- package/src/core/context-compaction.ts +542 -0
- package/src/core/conversation-compaction.ts +68 -0
- package/src/core/conversation-diff.ts +55 -0
- package/src/core/conversation-rendering.ts +343 -0
- package/src/core/conversation-utils.ts +72 -0
- package/src/core/conversation.ts +775 -0
- package/src/core/event-replay.ts +287 -0
- package/src/core/orchestrator-context-runtime.ts +407 -0
- package/src/core/orchestrator-follow-up-runtime.ts +134 -0
- package/src/core/orchestrator-runtime.ts +132 -0
- package/src/core/orchestrator-tool-runtime.ts +468 -0
- package/src/core/orchestrator-turn-helpers.ts +355 -0
- package/src/core/orchestrator-turn-loop.ts +443 -0
- package/src/core/orchestrator.ts +733 -0
- package/src/core/plan-command-handler.ts +169 -0
- package/src/core/system-message-router.ts +210 -0
- package/src/core/transcript-events/classify.ts +95 -0
- package/src/core/transcript-events/index.ts +15 -0
- package/src/daemon/cli.ts +88 -0
- package/src/daemon/control-plane.ts +522 -0
- package/src/daemon/facade-composition.ts +397 -0
- package/src/daemon/facade.ts +638 -0
- package/src/daemon/helpers.ts +74 -0
- package/src/daemon/http/router-route-contexts.ts +370 -0
- package/src/daemon/http/router.ts +531 -0
- package/src/daemon/http-listener.ts +301 -0
- package/src/daemon/index.ts +3 -0
- package/src/daemon/server.ts +1 -0
- package/src/daemon/service-manager.ts +413 -0
- package/src/daemon/surface-actions.ts +183 -0
- package/src/daemon/surface-delivery.ts +530 -0
- package/src/daemon/surface-policy.ts +60 -0
- package/src/daemon/transport-events.ts +110 -0
- package/src/daemon/types.ts +191 -0
- package/src/export/markdown.ts +213 -0
- package/src/export/session-export.ts +633 -0
- package/src/git/index.ts +1 -0
- package/src/git/service.ts +414 -0
- package/src/hooks/chain-engine.ts +414 -0
- package/src/hooks/dispatcher.ts +414 -0
- package/src/hooks/hook-api.ts +170 -0
- package/src/hooks/index.ts +48 -0
- package/src/hooks/runners/agent.ts +93 -0
- package/src/hooks/runners/prompt.ts +69 -0
- package/src/hooks/workbench.ts +360 -0
- package/src/input/autocomplete.ts +96 -0
- package/src/input/bookmark-modal.ts +115 -0
- package/src/input/command-registry.ts +300 -0
- package/src/input/commands/branch-runtime.ts +72 -0
- package/src/input/commands/config.ts +515 -0
- package/src/input/commands/control-room-runtime.ts +255 -0
- package/src/input/commands/conversation-runtime.ts +207 -0
- package/src/input/commands/diff-runtime.ts +161 -0
- package/src/input/commands/discovery-runtime.ts +45 -0
- package/src/input/commands/eval.ts +204 -0
- package/src/input/commands/experience-runtime.ts +278 -0
- package/src/input/commands/git-runtime.ts +81 -0
- package/src/input/commands/guidance-runtime.ts +101 -0
- package/src/input/commands/health-runtime.ts +434 -0
- package/src/input/commands/hooks-runtime.ts +148 -0
- package/src/input/commands/incident-runtime.ts +95 -0
- package/src/input/commands/integration-runtime.ts +394 -0
- package/src/input/commands/intelligence-runtime.ts +223 -0
- package/src/input/commands/knowledge.ts +368 -0
- package/src/input/commands/local-auth-runtime.ts +105 -0
- package/src/input/commands/local-provider-runtime.ts +170 -0
- package/src/input/commands/local-runtime.ts +458 -0
- package/src/input/commands/local-setup-review.ts +192 -0
- package/src/input/commands/local-setup-transfer.ts +134 -0
- package/src/input/commands/local-setup.ts +292 -0
- package/src/input/commands/managed-runtime.ts +208 -0
- package/src/input/commands/marketplace-runtime.ts +290 -0
- package/src/input/commands/mcp-runtime.ts +202 -0
- package/src/input/commands/memory-product-runtime.ts +111 -0
- package/src/input/commands/memory.ts +151 -0
- package/src/input/commands/notify-runtime.ts +83 -0
- package/src/input/commands/operator-panel-runtime.ts +141 -0
- package/src/input/commands/operator-runtime.ts +392 -0
- package/src/input/commands/permissions-runtime.ts +104 -0
- package/src/input/commands/planning-runtime.ts +97 -0
- package/src/input/commands/platform-access-runtime.ts +422 -0
- package/src/input/commands/platform-runtime.ts +6 -0
- package/src/input/commands/platform-sandbox-qemu.ts +137 -0
- package/src/input/commands/platform-sandbox-runtime.ts +406 -0
- package/src/input/commands/platform-sandbox-session.ts +128 -0
- package/src/input/commands/platform-services-runtime.ts +246 -0
- package/src/input/commands/policy-dispatch.ts +339 -0
- package/src/input/commands/policy.ts +17 -0
- package/src/input/commands/product-runtime.ts +351 -0
- package/src/input/commands/profile-sync-runtime.ts +99 -0
- package/src/input/commands/provider-accounts-runtime.ts +113 -0
- package/src/input/commands/provider.ts +363 -0
- package/src/input/commands/quit-shared.ts +162 -0
- package/src/input/commands/recall-bundle.ts +132 -0
- package/src/input/commands/recall-capture.ts +152 -0
- package/src/input/commands/recall-query.ts +229 -0
- package/src/input/commands/recall-review.ts +98 -0
- package/src/input/commands/recall-shared.ts +22 -0
- package/src/input/commands/remote-runtime-pool.ts +106 -0
- package/src/input/commands/remote-runtime-setup.ts +199 -0
- package/src/input/commands/remote-runtime.ts +531 -0
- package/src/input/commands/replay-runtime.ts +18 -0
- package/src/input/commands/runtime-services.ts +279 -0
- package/src/input/commands/schedule-runtime.ts +332 -0
- package/src/input/commands/services-runtime.ts +207 -0
- package/src/input/commands/session-content.ts +408 -0
- package/src/input/commands/session-workflow.ts +464 -0
- package/src/input/commands/session.ts +376 -0
- package/src/input/commands/settings-sync-runtime.ts +173 -0
- package/src/input/commands/share-runtime.ts +114 -0
- package/src/input/commands/shell-core.ts +320 -0
- package/src/input/commands/skills-runtime.ts +221 -0
- package/src/input/commands/subscription-runtime.ts +434 -0
- package/src/input/commands/tasks-runtime.ts +230 -0
- package/src/input/commands/teamwork-runtime.ts +374 -0
- package/src/input/commands/teleport-runtime.ts +57 -0
- package/src/input/commands/worktree-runtime.ts +137 -0
- package/src/input/commands.ts +127 -0
- package/src/input/file-picker.ts +192 -0
- package/src/input/handler-command-route.ts +106 -0
- package/src/input/handler-content-actions.ts +465 -0
- package/src/input/handler-feed-routes.ts +541 -0
- package/src/input/handler-feed.ts +361 -0
- package/src/input/handler-modal-routes.ts +335 -0
- package/src/input/handler-modal-stack.ts +237 -0
- package/src/input/handler-modal-token-routes.ts +272 -0
- package/src/input/handler-picker-routes.ts +416 -0
- package/src/input/handler-prompt-buffer.ts +320 -0
- package/src/input/handler-shortcuts.ts +195 -0
- package/src/input/handler-ui-state.ts +294 -0
- package/src/input/handler.ts +798 -0
- package/src/input/input-history.ts +267 -0
- package/src/input/keybindings.ts +256 -0
- package/src/input/model-picker.ts +730 -0
- package/src/input/panel-integration-actions.ts +77 -0
- package/src/input/profile-picker-modal.ts +222 -0
- package/src/input/search.ts +100 -0
- package/src/input/selection-modal.ts +163 -0
- package/src/input/selection.ts +135 -0
- package/src/input/session-picker-modal.ts +136 -0
- package/src/input/settings-modal.ts +718 -0
- package/src/input/submission-intent.ts +18 -0
- package/src/input/submission-router.ts +64 -0
- package/src/integrations/index.ts +42 -0
- package/src/integrations/notifier.ts +206 -0
- package/src/integrations/webhooks.ts +177 -0
- package/src/knowledge/consolidation.ts +346 -0
- package/src/knowledge/graphql.ts +324 -0
- package/src/knowledge/index.ts +60 -0
- package/src/knowledge/ingest-compile.ts +386 -0
- package/src/knowledge/ingest-context.ts +18 -0
- package/src/knowledge/ingest-inputs.ts +387 -0
- package/src/knowledge/ingest.ts +20 -0
- package/src/knowledge/internal.ts +257 -0
- package/src/knowledge/knowledge-api.ts +432 -0
- package/src/knowledge/lint.ts +121 -0
- package/src/knowledge/memory-sync.ts +62 -0
- package/src/knowledge/packet.ts +370 -0
- package/src/knowledge/scheduling.ts +283 -0
- package/src/knowledge/service.ts +715 -0
- package/src/main.ts +798 -0
- package/src/mcp/client.ts +383 -0
- package/src/mcp/index.ts +12 -0
- package/src/mcp/mcp-api.ts +90 -0
- package/src/mcp/registry.ts +508 -0
- package/src/media/builtin-image-understanding.ts +303 -0
- package/src/media/builtin-providers.ts +26 -0
- package/src/media/index.ts +18 -0
- package/src/multimodal/index.ts +13 -0
- package/src/multimodal/service.ts +492 -0
- package/src/panels/agent-inspector-panel.ts +515 -0
- package/src/panels/agent-inspector-shared.ts +94 -0
- package/src/panels/agent-logs-panel.ts +539 -0
- package/src/panels/agent-logs-shared.ts +129 -0
- package/src/panels/approval-panel.ts +169 -0
- package/src/panels/automation-control-panel.ts +253 -0
- package/src/panels/base-panel.ts +72 -0
- package/src/panels/builtin/agent.ts +88 -0
- package/src/panels/builtin/development.ts +111 -0
- package/src/panels/builtin/knowledge.ts +26 -0
- package/src/panels/builtin/operations.ts +385 -0
- package/src/panels/builtin/session.ts +61 -0
- package/src/panels/builtin/shared.ts +240 -0
- package/src/panels/builtin-panels.ts +23 -0
- package/src/panels/cockpit-panel.ts +183 -0
- package/src/panels/communication-panel.ts +191 -0
- package/src/panels/context-visualizer-panel.ts +199 -0
- package/src/panels/control-plane-panel.ts +266 -0
- package/src/panels/cost-tracker-panel.ts +444 -0
- package/src/panels/debug-panel.ts +432 -0
- package/src/panels/diff-panel.ts +518 -0
- package/src/panels/docs-panel.ts +283 -0
- package/src/panels/eval-panel.ts +399 -0
- package/src/panels/file-explorer-panel.ts +556 -0
- package/src/panels/file-preview-panel.ts +412 -0
- package/src/panels/forensics-panel.ts +364 -0
- package/src/panels/git-panel.ts +630 -0
- package/src/panels/hooks-panel.ts +274 -0
- package/src/panels/incident-review-panel.ts +247 -0
- package/src/panels/index.ts +48 -0
- package/src/panels/intelligence-panel.ts +176 -0
- package/src/panels/knowledge-panel.ts +328 -0
- package/src/panels/local-auth-panel.ts +146 -0
- package/src/panels/marketplace-panel.ts +223 -0
- package/src/panels/mcp-panel.ts +260 -0
- package/src/panels/memory-panel.ts +293 -0
- package/src/panels/ops-control-panel.ts +184 -0
- package/src/panels/ops-strategy-panel.ts +235 -0
- package/src/panels/orchestration-panel.ts +254 -0
- package/src/panels/panel-list-panel.ts +508 -0
- package/src/panels/panel-manager.ts +538 -0
- package/src/panels/panel-picker.ts +106 -0
- package/src/panels/plan-dashboard-panel.ts +272 -0
- package/src/panels/plugins-panel.ts +201 -0
- package/src/panels/policy-panel.ts +308 -0
- package/src/panels/polish.ts +668 -0
- package/src/panels/provider-account-snapshot.ts +259 -0
- package/src/panels/provider-accounts-panel.ts +221 -0
- package/src/panels/provider-health-domains.ts +211 -0
- package/src/panels/provider-health-panel.ts +725 -0
- package/src/panels/provider-health-tracker.ts +115 -0
- package/src/panels/provider-stats-panel.ts +366 -0
- package/src/panels/remote-panel.ts +449 -0
- package/src/panels/routes-panel.ts +228 -0
- package/src/panels/sandbox-panel.ts +289 -0
- package/src/panels/schedule-panel.ts +344 -0
- package/src/panels/search-focus.ts +32 -0
- package/src/panels/security-panel.ts +329 -0
- package/src/panels/services-panel.ts +271 -0
- package/src/panels/session-browser-panel.ts +399 -0
- package/src/panels/session-maintenance.ts +125 -0
- package/src/panels/settings-sync-panel.ts +164 -0
- package/src/panels/skills-panel.ts +475 -0
- package/src/panels/subscription-panel.ts +273 -0
- package/src/panels/symbol-outline-panel.ts +486 -0
- package/src/panels/system-messages-panel.ts +224 -0
- package/src/panels/tasks-panel.ts +448 -0
- package/src/panels/thinking-panel.ts +304 -0
- package/src/panels/token-budget-panel.ts +469 -0
- package/src/panels/tool-inspector-panel.ts +434 -0
- package/src/panels/types.ts +44 -0
- package/src/panels/watchers-panel.ts +241 -0
- package/src/panels/welcome-panel.ts +64 -0
- package/src/panels/worktree-panel.ts +180 -0
- package/src/panels/wrfc-panel.ts +480 -0
- package/src/permissions/briefs/build.ts +88 -0
- package/src/permissions/manager.ts +356 -0
- package/src/permissions/prompt.ts +184 -0
- package/src/plugins/api.ts +383 -0
- package/src/plugins/loader.ts +304 -0
- package/src/plugins/manager.ts +481 -0
- package/src/profiles/shape.ts +58 -0
- package/src/providers/amazon-bedrock-mantle.ts +50 -0
- package/src/providers/amazon-bedrock.ts +61 -0
- package/src/providers/anthropic-compat.ts +373 -0
- package/src/providers/anthropic-sdk-provider.ts +230 -0
- package/src/providers/anthropic-vertex.ts +59 -0
- package/src/providers/anthropic.ts +469 -0
- package/src/providers/auto-register.ts +417 -0
- package/src/providers/builtin-catalog.ts +326 -0
- package/src/providers/builtin-registry.ts +575 -0
- package/src/providers/cache-planner.ts +258 -0
- package/src/providers/capabilities.ts +601 -0
- package/src/providers/custom-loader.ts +425 -0
- package/src/providers/discovered-compat.ts +18 -0
- package/src/providers/discovered-factory.ts +61 -0
- package/src/providers/discovered-traits.ts +138 -0
- package/src/providers/gemini.ts +462 -0
- package/src/providers/github-copilot.ts +254 -0
- package/src/providers/index.ts +47 -0
- package/src/providers/interface.ts +185 -0
- package/src/providers/llama-cpp.ts +402 -0
- package/src/providers/lm-studio-helpers.ts +367 -0
- package/src/providers/lm-studio.ts +484 -0
- package/src/providers/model-catalog-cache.ts +221 -0
- package/src/providers/model-catalog-notifications.ts +97 -0
- package/src/providers/model-catalog-synthetic.ts +202 -0
- package/src/providers/model-catalog.ts +211 -0
- package/src/providers/model-limits.ts +280 -0
- package/src/providers/ollama.ts +469 -0
- package/src/providers/openai-codex.ts +472 -0
- package/src/providers/openai-compat.ts +615 -0
- package/src/providers/openai.ts +231 -0
- package/src/providers/optimizer.ts +381 -0
- package/src/providers/provider-api.ts +553 -0
- package/src/providers/registry-helpers.ts +34 -0
- package/src/providers/registry-models.ts +77 -0
- package/src/providers/registry-types.ts +67 -0
- package/src/providers/registry.ts +729 -0
- package/src/providers/runtime-metadata.ts +149 -0
- package/src/providers/runtime-snapshot.ts +130 -0
- package/src/providers/synthetic.ts +561 -0
- package/src/providers/tier-prompts.ts +84 -0
- package/src/providers/tool-formats.ts +414 -0
- package/src/renderer/agent-detail-modal.ts +285 -0
- package/src/renderer/autocomplete-overlay.ts +154 -0
- package/src/renderer/block-actions.ts +76 -0
- package/src/renderer/bookmark-modal.ts +101 -0
- package/src/renderer/bottom-bar.ts +58 -0
- package/src/renderer/buffer.ts +34 -0
- package/src/renderer/code-block.ts +373 -0
- package/src/renderer/compositor.ts +261 -0
- package/src/renderer/context-inspector.ts +219 -0
- package/src/renderer/conversation-layout.ts +67 -0
- package/src/renderer/conversation-overlays.ts +123 -0
- package/src/renderer/conversation-surface.ts +260 -0
- package/src/renderer/diff-view.ts +132 -0
- package/src/renderer/diff.ts +122 -0
- package/src/renderer/file-picker-overlay.ts +101 -0
- package/src/renderer/file-tree.ts +153 -0
- package/src/renderer/git-status.ts +89 -0
- package/src/renderer/help-overlay.ts +247 -0
- package/src/renderer/history-search-overlay.ts +73 -0
- package/src/renderer/layout-engine.ts +97 -0
- package/src/renderer/layout.ts +32 -0
- package/src/renderer/live-tail-modal.ts +156 -0
- package/src/renderer/markdown.ts +777 -0
- package/src/renderer/modal-factory.ts +467 -0
- package/src/renderer/modal-utils.ts +24 -0
- package/src/renderer/model-picker-overlay.ts +396 -0
- package/src/renderer/overlay-box.ts +165 -0
- package/src/renderer/overlay-viewport.ts +104 -0
- package/src/renderer/panel-composite.ts +80 -0
- package/src/renderer/panel-picker-overlay.ts +202 -0
- package/src/renderer/panel-tab-bar.ts +69 -0
- package/src/renderer/panel-workspace-bar.ts +38 -0
- package/src/renderer/process-indicator.ts +96 -0
- package/src/renderer/process-modal.ts +295 -0
- package/src/renderer/profile-picker-modal.ts +129 -0
- package/src/renderer/progress.ts +98 -0
- package/src/renderer/search-overlay.ts +54 -0
- package/src/renderer/selection-modal-overlay.ts +214 -0
- package/src/renderer/semantic-diff.ts +369 -0
- package/src/renderer/session-picker-modal.ts +127 -0
- package/src/renderer/settings-modal.ts +701 -0
- package/src/renderer/shell-surface.ts +88 -0
- package/src/renderer/surface-layout.ts +101 -0
- package/src/renderer/syntax-highlighter.ts +542 -0
- package/src/renderer/system-message.ts +83 -0
- package/src/renderer/tab-strip.ts +108 -0
- package/src/renderer/text-layout.ts +31 -0
- package/src/renderer/thinking.ts +17 -0
- package/src/renderer/tool-call.ts +233 -0
- package/src/renderer/ui-factory.ts +524 -0
- package/src/renderer/ui-primitives.ts +96 -0
- package/src/runtime/auth/inspection.ts +125 -0
- package/src/runtime/bootstrap-background.ts +147 -0
- package/src/runtime/bootstrap-command-context.ts +265 -0
- package/src/runtime/bootstrap-command-parts.ts +357 -0
- package/src/runtime/bootstrap-core.ts +375 -0
- package/src/runtime/bootstrap-helpers.ts +88 -0
- package/src/runtime/bootstrap-hook-bridge.ts +271 -0
- package/src/runtime/bootstrap-runtime-events.ts +254 -0
- package/src/runtime/bootstrap-services.ts +197 -0
- package/src/runtime/bootstrap-shell.ts +262 -0
- package/src/runtime/bootstrap.ts +488 -0
- package/src/runtime/compaction/index.ts +90 -0
- package/src/runtime/compaction/lifecycle.ts +167 -0
- package/src/runtime/compaction/manager.ts +474 -0
- package/src/runtime/compaction/quality-score.ts +279 -0
- package/src/runtime/compaction/resume-repair.ts +183 -0
- package/src/runtime/compaction/strategies/autocompact.ts +65 -0
- package/src/runtime/compaction/strategies/boundary-commit.ts +106 -0
- package/src/runtime/compaction/strategies/collapse.ts +90 -0
- package/src/runtime/compaction/strategies/index.ts +23 -0
- package/src/runtime/compaction/strategies/microcompact.ts +74 -0
- package/src/runtime/compaction/strategies/reactive.ts +89 -0
- package/src/runtime/compaction/types.ts +221 -0
- package/src/runtime/context.ts +158 -0
- package/src/runtime/diagnostics/actions.ts +776 -0
- package/src/runtime/diagnostics/index.ts +99 -0
- package/src/runtime/diagnostics/panels/agents.ts +252 -0
- package/src/runtime/diagnostics/panels/events.ts +188 -0
- package/src/runtime/diagnostics/panels/health.ts +242 -0
- package/src/runtime/diagnostics/panels/index.ts +24 -0
- package/src/runtime/diagnostics/panels/ops.ts +156 -0
- package/src/runtime/diagnostics/panels/policy.ts +176 -0
- package/src/runtime/diagnostics/panels/tasks.ts +251 -0
- package/src/runtime/diagnostics/panels/tool-calls.ts +267 -0
- package/src/runtime/diagnostics/provider.ts +262 -0
- package/src/runtime/ecosystem/catalog.ts +606 -0
- package/src/runtime/ecosystem/recommendations.ts +117 -0
- package/src/runtime/emitters/agents.ts +96 -0
- package/src/runtime/emitters/automation.ts +112 -0
- package/src/runtime/emitters/communication.ts +53 -0
- package/src/runtime/emitters/compaction.ts +161 -0
- package/src/runtime/emitters/control-plane.ts +65 -0
- package/src/runtime/emitters/deliveries.ts +65 -0
- package/src/runtime/emitters/forensics.ts +17 -0
- package/src/runtime/emitters/index.ts +59 -0
- package/src/runtime/emitters/knowledge.ts +129 -0
- package/src/runtime/emitters/mcp.ts +95 -0
- package/src/runtime/emitters/ops.ts +163 -0
- package/src/runtime/emitters/orchestration.ts +87 -0
- package/src/runtime/emitters/permissions.ts +98 -0
- package/src/runtime/emitters/planner.ts +23 -0
- package/src/runtime/emitters/plugins.ts +78 -0
- package/src/runtime/emitters/providers.ts +30 -0
- package/src/runtime/emitters/routes.ts +57 -0
- package/src/runtime/emitters/security.ts +53 -0
- package/src/runtime/emitters/session.ts +93 -0
- package/src/runtime/emitters/surfaces.ts +57 -0
- package/src/runtime/emitters/tasks.ts +69 -0
- package/src/runtime/emitters/tools.ts +140 -0
- package/src/runtime/emitters/transport.ts +78 -0
- package/src/runtime/emitters/turn.ts +155 -0
- package/src/runtime/emitters/ui.ts +57 -0
- package/src/runtime/emitters/watchers.ts +57 -0
- package/src/runtime/emitters/workflows.ts +79 -0
- package/src/runtime/eval/index.ts +48 -0
- package/src/runtime/eval/runner.ts +163 -0
- package/src/runtime/eval/suites.ts +264 -0
- package/src/runtime/events/domain-map.ts +148 -0
- package/src/runtime/events/index.ts +194 -0
- package/src/runtime/events/turn.ts +60 -0
- package/src/runtime/events/workflows.ts +17 -0
- package/src/runtime/forensics/collector.ts +693 -0
- package/src/runtime/forensics/index.ts +23 -0
- package/src/runtime/foundation-clients.ts +78 -0
- package/src/runtime/foundation-services.ts +96 -0
- package/src/runtime/guidance.ts +183 -0
- package/src/runtime/health/effect-handlers.ts +189 -0
- package/src/runtime/health/index.ts +70 -0
- package/src/runtime/health/wiring.ts +115 -0
- package/src/runtime/index.ts +174 -0
- package/src/runtime/integration/helpers.ts +640 -0
- package/src/runtime/lifecycle.ts +107 -0
- package/src/runtime/mcp/index.ts +68 -0
- package/src/runtime/mcp/manager.ts +513 -0
- package/src/runtime/network/inbound.ts +131 -0
- package/src/runtime/network/index.ts +30 -0
- package/src/runtime/network/outbound.ts +292 -0
- package/src/runtime/network/shared.ts +82 -0
- package/src/runtime/operator-client.ts +235 -0
- package/src/runtime/ops/control-plane.ts +363 -0
- package/src/runtime/ops/index.ts +122 -0
- package/src/runtime/ops/playbooks/index.ts +10 -0
- package/src/runtime/ops/playbooks/session-unrecoverable.ts +196 -0
- package/src/runtime/ops/playbooks/stuck-turn.ts +197 -0
- package/src/runtime/ops/runtime-context.ts +100 -0
- package/src/runtime/ops-api.ts +27 -0
- package/src/runtime/orchestration/spawn-policy.ts +83 -0
- package/src/runtime/peer-client.ts +404 -0
- package/src/runtime/perf/index.ts +57 -0
- package/src/runtime/perf/slo-collector.ts +375 -0
- package/src/runtime/permissions/index.ts +190 -0
- package/src/runtime/permissions/policy-runtime.ts +175 -0
- package/src/runtime/permissions/preflight.ts +101 -0
- package/src/runtime/permissions/rule-suggestions.ts +36 -0
- package/src/runtime/plugins/hot-reload.ts +221 -0
- package/src/runtime/plugins/index.ts +84 -0
- package/src/runtime/plugins/lifecycle.ts +95 -0
- package/src/runtime/plugins/manager.ts +474 -0
- package/src/runtime/plugins/manifest.ts +167 -0
- package/src/runtime/plugins/quarantine.ts +202 -0
- package/src/runtime/plugins/trust.ts +291 -0
- package/src/runtime/plugins/types.ts +205 -0
- package/src/runtime/provider-accounts/registry.ts +326 -0
- package/src/runtime/remote/distributed-runtime-contract-schemas.ts +386 -0
- package/src/runtime/remote/index.ts +488 -0
- package/src/runtime/remote/runner-registry.ts +438 -0
- package/src/runtime/remote/supervisor.ts +70 -0
- package/src/runtime/runtime-hook-api.ts +5 -0
- package/src/runtime/runtime-knowledge-api.ts +14 -0
- package/src/runtime/runtime-mcp-api.ts +5 -0
- package/src/runtime/runtime-ops-api.ts +86 -0
- package/src/runtime/runtime-provider-api.ts +18 -0
- package/src/runtime/sandbox/backend.ts +291 -0
- package/src/runtime/sandbox/manager.ts +364 -0
- package/src/runtime/sandbox/provisioning.ts +422 -0
- package/src/runtime/sandbox/session-registry.ts +289 -0
- package/src/runtime/services.ts +541 -0
- package/src/runtime/session-maintenance.ts +188 -0
- package/src/runtime/session-persistence.ts +288 -0
- package/src/runtime/session-return-context.ts +195 -0
- package/src/runtime/settings/control-plane-store.ts +258 -0
- package/src/runtime/settings/control-plane.ts +599 -0
- package/src/runtime/shell-command-extensions.ts +54 -0
- package/src/runtime/shell-command-ops.ts +207 -0
- package/src/runtime/shell-command-platform.ts +47 -0
- package/src/runtime/shell-command-services.ts +143 -0
- package/src/runtime/shell-command-workspace.ts +31 -0
- package/src/runtime/store/domains/conversation.ts +181 -0
- package/src/runtime/store/domains/domain-read-matrix.ts +17 -0
- package/src/runtime/store/domains/index.ts +222 -0
- package/src/runtime/store/domains/panels.ts +117 -0
- package/src/runtime/store/domains/permissions.ts +143 -0
- package/src/runtime/store/domains/ui-perf.ts +103 -0
- package/src/runtime/store/helpers/reducers/conversation.ts +228 -0
- package/src/runtime/store/helpers/reducers/lifecycle.ts +440 -0
- package/src/runtime/store/helpers/reducers/shared.ts +60 -0
- package/src/runtime/store/helpers/reducers/sync.ts +555 -0
- package/src/runtime/store/helpers/reducers.ts +30 -0
- package/src/runtime/store/index.ts +304 -0
- package/src/runtime/store/selectors/index.ts +354 -0
- package/src/runtime/store/state.ts +137 -0
- package/src/runtime/tasks/adapters/acp-adapter.ts +211 -0
- package/src/runtime/tasks/adapters/agent-adapter.ts +208 -0
- package/src/runtime/tasks/adapters/index.ts +16 -0
- package/src/runtime/tasks/adapters/process-adapter.ts +214 -0
- package/src/runtime/tasks/adapters/scheduler-adapter.ts +193 -0
- package/src/runtime/tasks/index.ts +68 -0
- package/src/runtime/tasks/manager.ts +415 -0
- package/src/runtime/telemetry/api-helpers.ts +517 -0
- package/src/runtime/telemetry/api.ts +768 -0
- package/src/runtime/telemetry/index.ts +178 -0
- package/src/runtime/telemetry/instrumentation/domain-bridge-agent-session.ts +440 -0
- package/src/runtime/telemetry/instrumentation/domain-bridge-plugin-mcp.ts +200 -0
- package/src/runtime/telemetry/instrumentation/domain-bridge-shared.ts +18 -0
- package/src/runtime/telemetry/instrumentation/domain-bridge-transport-task.ts +204 -0
- package/src/runtime/telemetry/instrumentation/domain-bridge.ts +125 -0
- package/src/runtime/telemetry/instrumentation/index.ts +67 -0
- package/src/runtime/tools/context.ts +114 -0
- package/src/runtime/tools/index.ts +46 -0
- package/src/runtime/tools/phased-executor.ts +448 -0
- package/src/runtime/tools/phases/budget.ts +130 -0
- package/src/runtime/tools/phases/execute.ts +69 -0
- package/src/runtime/tools/phases/index.ts +13 -0
- package/src/runtime/tools/phases/map-output.ts +98 -0
- package/src/runtime/tools/phases/permission.ts +133 -0
- package/src/runtime/tools/phases/posthook.ts +57 -0
- package/src/runtime/tools/phases/prehook.ts +68 -0
- package/src/runtime/tools/phases/validate.ts +53 -0
- package/src/runtime/transports/direct.ts +73 -0
- package/src/runtime/transports/http-helpers.ts +218 -0
- package/src/runtime/transports/http-types.ts +364 -0
- package/src/runtime/transports/http.ts +629 -0
- package/src/runtime/transports/realtime.ts +50 -0
- package/src/runtime/transports/remote-events.ts +16 -0
- package/src/runtime/transports/shared.ts +39 -0
- package/src/runtime/transports/ui-runtime-events.ts +35 -0
- package/src/runtime/ui/index.ts +39 -0
- package/src/runtime/ui/model-picker/data-provider.ts +182 -0
- package/src/runtime/ui/model-picker/health-enrichment.ts +228 -0
- package/src/runtime/ui/model-picker/index.ts +59 -0
- package/src/runtime/ui/model-picker/types.ts +149 -0
- package/src/runtime/ui/provider-health/data-provider.ts +244 -0
- package/src/runtime/ui/provider-health/fallback-visualizer.ts +69 -0
- package/src/runtime/ui/provider-health/index.ts +46 -0
- package/src/runtime/ui/provider-health/types.ts +146 -0
- package/src/runtime/ui-events.ts +46 -0
- package/src/runtime/ui-read-model-helpers.ts +32 -0
- package/src/runtime/ui-read-models-core.ts +95 -0
- package/src/runtime/ui-read-models-observability-maintenance.ts +81 -0
- package/src/runtime/ui-read-models-observability-options.ts +5 -0
- package/src/runtime/ui-read-models-observability-remote.ts +73 -0
- package/src/runtime/ui-read-models-observability-security.ts +172 -0
- package/src/runtime/ui-read-models-observability-system.ts +217 -0
- package/src/runtime/ui-read-models-observability.ts +59 -0
- package/src/runtime/ui-read-models-operations.ts +203 -0
- package/src/runtime/ui-read-models.ts +61 -0
- package/src/runtime/ui-service-queries.ts +114 -0
- package/src/runtime/ui-services.ts +163 -0
- package/src/runtime/worktree/registry.ts +252 -0
- package/src/scripts/process-messages.ts +42 -0
- package/src/sessions/manager.ts +388 -0
- package/src/shell/blocking-input.ts +89 -0
- package/src/shell/ui-openers.ts +163 -0
- package/src/state/file-watcher.ts +294 -0
- package/src/state/index.ts +56 -0
- package/src/state/knowledge-injection.ts +214 -0
- package/src/state/memory-embedding-http.ts +642 -0
- package/src/state/memory-embeddings.ts +312 -0
- package/src/state/memory-ingest.ts +132 -0
- package/src/state/memory-registry.ts +111 -0
- package/src/state/memory-store-helpers.ts +160 -0
- package/src/state/memory-store.ts +728 -0
- package/src/state/memory-vector-store.ts +418 -0
- package/src/templates/manager.ts +187 -0
- package/src/tools/agent/index.ts +610 -0
- package/src/tools/agent/manager.ts +476 -0
- package/src/tools/analyze/git-modes.ts +380 -0
- package/src/tools/analyze/index.ts +128 -0
- package/src/tools/channel/agent-tools.ts +16 -0
- package/src/tools/channel/index.ts +268 -0
- package/src/tools/control/index.ts +90 -0
- package/src/tools/edit/core.ts +619 -0
- package/src/tools/edit/index.ts +4 -0
- package/src/tools/edit/phased.ts +33 -0
- package/src/tools/fetch/index.ts +3 -0
- package/src/tools/fetch/phased.ts +34 -0
- package/src/tools/fetch/runtime.ts +499 -0
- package/src/tools/index.ts +186 -0
- package/src/tools/mcp/index.ts +190 -0
- package/src/tools/remote-trigger/index.ts +130 -0
- package/src/tools/repl/index.ts +318 -0
- package/src/tools/shared/auto-heal.ts +282 -0
- package/src/tools/state/index.ts +688 -0
- package/src/tools/web-search/index.ts +38 -0
- package/src/tools/write/index.ts +604 -0
- package/src/tools/write/phased.ts +41 -0
- package/src/types/generated/foundation-client-types.ts +22 -0
- package/src/types/sql-js.d.ts +15 -0
- package/src/utils/splash-lines.ts +46 -0
- package/src/version.ts +17 -0
- package/src/watchers/index.ts +11 -0
- package/src/watchers/registry.ts +517 -0
- package/src/web-search/index.ts +26 -0
- package/src/web-search/provider-registry.ts +64 -0
- package/src/web-search/providers/brave.ts +100 -0
- package/src/web-search/providers/duckduckgo.ts +270 -0
- package/src/web-search/providers/exa.ts +77 -0
- package/src/web-search/providers/firecrawl.ts +90 -0
- package/src/web-search/providers/perplexity.ts +86 -0
- package/src/web-search/providers/searxng.ts +88 -0
- package/src/web-search/providers/shared.ts +249 -0
- package/src/web-search/providers/tavily.ts +90 -0
- package/src/web-search/service.ts +142 -0
- package/src/widget/index.ts +2 -0
- package/src/widget/types.ts +9 -0
- package/src/widget/widget.ts +8 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import type { Tool, ToolCall } from '@pellux/goodvibes-sdk/platform/types/tools';
|
|
2
|
+
import type { ToolRuntimeContext } from '../context.ts';
|
|
3
|
+
import type { BudgetExceedReason, PhaseResult, ToolExecutionPhase, ToolExecutionRecord } from '@pellux/goodvibes-sdk/platform/runtime/tools/types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* budget — Budget enforcement phase for the tool execution pipeline.
|
|
7
|
+
*
|
|
8
|
+
* This phase is inserted at two points:
|
|
9
|
+
* - "entry": just before execute (checks elapsed wall-clock time).
|
|
10
|
+
* - "exit": just after mapOutput (checks token and cost budgets).
|
|
11
|
+
*
|
|
12
|
+
* When a hard budget is exceeded the phase returns `abort: true` with a
|
|
13
|
+
* typed `budgetExceedReason` so the executor can surface a diagnostic
|
|
14
|
+
* event before terminating the pipeline.
|
|
15
|
+
*
|
|
16
|
+
* All budget fields are optional in ToolRuntimeContext.budget — an absent
|
|
17
|
+
* field means "unlimited" and the corresponding check is skipped.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/** The point in the pipeline at which the budget check fires. */
|
|
21
|
+
export type BudgetCheckPoint = 'entry' | 'exit';
|
|
22
|
+
|
|
23
|
+
export async function budgetPhase(
|
|
24
|
+
_call: ToolCall,
|
|
25
|
+
_tool: Tool,
|
|
26
|
+
context: ToolRuntimeContext,
|
|
27
|
+
record: ToolExecutionRecord,
|
|
28
|
+
checkpoint: BudgetCheckPoint,
|
|
29
|
+
): Promise<PhaseResult> {
|
|
30
|
+
const start = performance.now();
|
|
31
|
+
const phaseName = checkpoint === 'entry' ? 'budget-entry' : 'budget-exit';
|
|
32
|
+
|
|
33
|
+
const budget = context.budget;
|
|
34
|
+
|
|
35
|
+
// No budget constraints — fast path
|
|
36
|
+
if (!budget) {
|
|
37
|
+
return ok(start, phaseName);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const elapsedMs = performance.now() - record.startedAt;
|
|
41
|
+
|
|
42
|
+
// ── Time budget (checked at both entry and exit) ────────────────────────
|
|
43
|
+
// All budget comparisons use strict > so that a value exactly at the limit is
|
|
44
|
+
// still allowed — enforcement fires only when the limit is truly exceeded.
|
|
45
|
+
if (budget.maxMs !== undefined && elapsedMs > budget.maxMs) {
|
|
46
|
+
return exceed(start, phaseName, 'BUDGET_EXCEEDED_MS', {
|
|
47
|
+
limitMs: budget.maxMs,
|
|
48
|
+
elapsedMs,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// ── Token and cost budgets (only meaningful at exit after execute ran) ──
|
|
53
|
+
if (checkpoint === 'exit') {
|
|
54
|
+
// Token budget: the tool result may carry a `tokenCount` annotation.
|
|
55
|
+
// We check it if present; if absent we skip (cannot enforce unknown usage).
|
|
56
|
+
const tokenCount = getTokenCount(record);
|
|
57
|
+
if (budget.maxTokens !== undefined && tokenCount !== undefined && tokenCount > budget.maxTokens) {
|
|
58
|
+
return exceed(start, phaseName, 'BUDGET_EXCEEDED_TOKENS', {
|
|
59
|
+
limitTokens: budget.maxTokens,
|
|
60
|
+
usedTokens: tokenCount,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Cost budget: same — only enforce when the tool result carries a cost.
|
|
65
|
+
const costUsd = getCostUsd(record);
|
|
66
|
+
if (budget.maxCostUsd !== undefined && costUsd !== undefined && costUsd > budget.maxCostUsd) {
|
|
67
|
+
return exceed(start, phaseName, 'BUDGET_EXCEEDED_COST', {
|
|
68
|
+
limitCostUsd: budget.maxCostUsd,
|
|
69
|
+
usedCostUsd: costUsd,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return ok(start, phaseName);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
// Helpers
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
|
|
81
|
+
function ok(start: number, phase: ToolExecutionPhase): PhaseResult {
|
|
82
|
+
return {
|
|
83
|
+
phase,
|
|
84
|
+
success: true,
|
|
85
|
+
durationMs: performance.now() - start,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function exceed(
|
|
90
|
+
start: number,
|
|
91
|
+
phase: ToolExecutionPhase,
|
|
92
|
+
reason: BudgetExceedReason,
|
|
93
|
+
meta: Record<string, number>,
|
|
94
|
+
): PhaseResult {
|
|
95
|
+
const parts = Object.entries(meta)
|
|
96
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
97
|
+
.join(', ');
|
|
98
|
+
return {
|
|
99
|
+
phase,
|
|
100
|
+
success: false,
|
|
101
|
+
durationMs: performance.now() - start,
|
|
102
|
+
error: `Budget exceeded [${reason}]: ${parts}`,
|
|
103
|
+
abort: true,
|
|
104
|
+
budgetExceedReason: reason,
|
|
105
|
+
budgetMeta: meta,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Extracts a token count from the tool execution record result, if available.
|
|
111
|
+
* Tools may annotate their result with `tokenCount` as a numeric field.
|
|
112
|
+
*/
|
|
113
|
+
function getTokenCount(record: ToolExecutionRecord): number | undefined {
|
|
114
|
+
if (!record.result) return undefined;
|
|
115
|
+
// Double cast needed: ToolResult has no index signature, but tool implementations
|
|
116
|
+
// may annotate results with extra numeric fields like `tokenCount`.
|
|
117
|
+
const raw = (record.result as unknown as Record<string, unknown>)['tokenCount'];
|
|
118
|
+
return typeof raw === 'number' ? raw : undefined;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Extracts a cost annotation from the tool execution record result, if available.
|
|
123
|
+
* Tools may annotate their result with `costUsd` as a numeric field.
|
|
124
|
+
*/
|
|
125
|
+
function getCostUsd(record: ToolExecutionRecord): number | undefined {
|
|
126
|
+
if (!record.result) return undefined;
|
|
127
|
+
// Double cast needed: same reason as getTokenCount above.
|
|
128
|
+
const raw = (record.result as unknown as Record<string, unknown>)['costUsd'];
|
|
129
|
+
return typeof raw === 'number' ? raw : undefined;
|
|
130
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { Tool, ToolCall, ToolResult } from '@pellux/goodvibes-sdk/platform/types/tools';
|
|
2
|
+
import type { ToolRuntimeContext } from '../context.ts';
|
|
3
|
+
import type { ExecutorConfig, PhaseResult, ToolExecutionRecord } from '@pellux/goodvibes-sdk/platform/runtime/tools/types';
|
|
4
|
+
import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils/error-display';
|
|
5
|
+
|
|
6
|
+
/** Default per-call execution timeout (30 seconds). */
|
|
7
|
+
const DEFAULT_EXECUTE_TIMEOUT_MS = 30_000;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* execute — Phase 4 of the tool execution pipeline.
|
|
11
|
+
*
|
|
12
|
+
* Calls `tool.execute(args)` and injects the callId into the result.
|
|
13
|
+
* Respects the phase timeout and the budget.maxMs constraint.
|
|
14
|
+
* Caught errors produce a failed PhaseResult (not thrown) so the
|
|
15
|
+
* executor can record the failure trace cleanly.
|
|
16
|
+
*
|
|
17
|
+
* The resolved args honour any prehook-modified input stored as
|
|
18
|
+
* `_updatedArgs` on the record.
|
|
19
|
+
*/
|
|
20
|
+
export async function executePhase(
|
|
21
|
+
call: ToolCall,
|
|
22
|
+
tool: Tool,
|
|
23
|
+
context: ToolRuntimeContext,
|
|
24
|
+
record: ToolExecutionRecord,
|
|
25
|
+
config?: ExecutorConfig,
|
|
26
|
+
): Promise<PhaseResult & { toolResult?: ToolResult }> {
|
|
27
|
+
const start = performance.now();
|
|
28
|
+
|
|
29
|
+
const effectiveArgs = record._updatedArgs ?? call.arguments;
|
|
30
|
+
|
|
31
|
+
// Resolve timeout: per-phase override → budget → default
|
|
32
|
+
const timeoutMs =
|
|
33
|
+
config?.phaseTimeouts?.['executing'] ?? context.budget?.maxMs ?? DEFAULT_EXECUTE_TIMEOUT_MS;
|
|
34
|
+
|
|
35
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
36
|
+
|
|
37
|
+
try {
|
|
38
|
+
// Race between the tool and a timeout; clear the timer regardless of outcome
|
|
39
|
+
const rawResult = await Promise.race([
|
|
40
|
+
tool.execute(effectiveArgs),
|
|
41
|
+
new Promise<never>((_, reject) => {
|
|
42
|
+
timer = setTimeout(
|
|
43
|
+
() => reject(new Error(`Tool '${call.name}' timed out after ${timeoutMs}ms`)),
|
|
44
|
+
timeoutMs,
|
|
45
|
+
);
|
|
46
|
+
}),
|
|
47
|
+
]);
|
|
48
|
+
clearTimeout(timer);
|
|
49
|
+
|
|
50
|
+
const toolResult: ToolResult = { ...rawResult, callId: call.id };
|
|
51
|
+
|
|
52
|
+
return {
|
|
53
|
+
phase: 'executing',
|
|
54
|
+
success: true,
|
|
55
|
+
durationMs: performance.now() - start,
|
|
56
|
+
toolResult,
|
|
57
|
+
};
|
|
58
|
+
} catch (err) {
|
|
59
|
+
clearTimeout(timer);
|
|
60
|
+
const message = summarizeError(err);
|
|
61
|
+
return {
|
|
62
|
+
phase: 'executing',
|
|
63
|
+
success: false,
|
|
64
|
+
durationMs: performance.now() - start,
|
|
65
|
+
error: message,
|
|
66
|
+
abort: true,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* phases/index.ts — barrel export for all tool execution phase functions.
|
|
3
|
+
*
|
|
4
|
+
* Each export is a pure async function conforming to PhaseFunction.
|
|
5
|
+
* The pipeline is assembled in phased-executor.ts.
|
|
6
|
+
*/
|
|
7
|
+
export { validatePhase } from './validate.ts';
|
|
8
|
+
export { prehookPhase } from './prehook.ts';
|
|
9
|
+
export { permissionPhase } from './permission.ts';
|
|
10
|
+
export { budgetPhase } from './budget.ts';
|
|
11
|
+
export { executePhase } from './execute.ts';
|
|
12
|
+
export { mapOutputPhase } from './map-output.ts';
|
|
13
|
+
export { posthookPhase } from './posthook.ts';
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import type { Tool, ToolCall } from '@pellux/goodvibes-sdk/platform/types/tools';
|
|
2
|
+
import { repairToolCall } from '@pellux/goodvibes-sdk/platform/tools/auto-repair';
|
|
3
|
+
import type { ToolRuntimeContext } from '../context.ts';
|
|
4
|
+
import type { PhaseResult, ToolExecutionRecord } from '@pellux/goodvibes-sdk/platform/runtime/tools/types';
|
|
5
|
+
import type { PhasedTool } from '@pellux/goodvibes-sdk/platform/runtime/tools/adapter';
|
|
6
|
+
import type { ToolClass } from '@pellux/goodvibes-sdk/platform/runtime/tools/output-policy';
|
|
7
|
+
import { applyOutputPolicy, getPolicy } from '@pellux/goodvibes-sdk/platform/runtime/tools/output-policy';
|
|
8
|
+
import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils/error-display';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* mapOutput — Phase 5 of the tool execution pipeline.
|
|
12
|
+
*
|
|
13
|
+
* Transforms/annotates the raw tool result before it reaches the LLM:
|
|
14
|
+
*
|
|
15
|
+
* 1. Applies auto-repair annotation: if args were repaired during
|
|
16
|
+
* execution, prepends a `[Auto-repaired: ...]` note to the output
|
|
17
|
+
* so the LLM knows what was corrected.
|
|
18
|
+
* 2. Applies output policy enforcement: byte limits, truncation, and spill
|
|
19
|
+
* handling are applied per tool class via `applyOutputPolicy`.
|
|
20
|
+
* 3. No-ops cleanly when there is no result to map (defensive guard).
|
|
21
|
+
*/
|
|
22
|
+
/** Type guard — true when `tool` carries phased execution metadata. */
|
|
23
|
+
function isPhasedTool(tool: Tool): tool is PhasedTool {
|
|
24
|
+
return 'category' in tool && typeof (tool as PhasedTool).category === 'string';
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Maps a PhasedTool category to the ToolClass used by output-policy.
|
|
29
|
+
* `delegate` has no direct output-policy class; treat as `analyze`.
|
|
30
|
+
*/
|
|
31
|
+
function resolveToolClass(tool: Tool): ToolClass {
|
|
32
|
+
if (!isPhasedTool(tool)) return 'read';
|
|
33
|
+
switch (tool.category) {
|
|
34
|
+
case 'read': return 'read';
|
|
35
|
+
case 'write': return 'write';
|
|
36
|
+
case 'execute': return 'execute';
|
|
37
|
+
case 'network': return 'network';
|
|
38
|
+
case 'delegate': return 'analyze';
|
|
39
|
+
default: return 'read';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export async function mapOutputPhase(
|
|
44
|
+
call: ToolCall,
|
|
45
|
+
tool: Tool,
|
|
46
|
+
_context: ToolRuntimeContext,
|
|
47
|
+
record: ToolExecutionRecord,
|
|
48
|
+
): Promise<PhaseResult> {
|
|
49
|
+
const start = performance.now();
|
|
50
|
+
|
|
51
|
+
if (!record.result) {
|
|
52
|
+
// No result to map — this is a no-op (execute phase may have failed)
|
|
53
|
+
return {
|
|
54
|
+
phase: 'mapped',
|
|
55
|
+
success: true,
|
|
56
|
+
durationMs: performance.now() - start,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
try {
|
|
61
|
+
// Re-run repair check to determine if the original args were patched
|
|
62
|
+
const effectiveArgs = record._updatedArgs ?? call.arguments;
|
|
63
|
+
const repairResult = repairToolCall(call.name, effectiveArgs, tool.definition);
|
|
64
|
+
|
|
65
|
+
if (repairResult.repaired) {
|
|
66
|
+
const repairNote = `[Auto-repaired: ${repairResult.repairs.join(', ')}]`;
|
|
67
|
+
if (typeof record.result.output === 'string') {
|
|
68
|
+
record.result.output = `${repairNote}\n${record.result.output}`;
|
|
69
|
+
} else {
|
|
70
|
+
record.result.output = repairNote;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Apply output policy enforcement after auto-repair annotation
|
|
75
|
+
const toolClass = resolveToolClass(tool);
|
|
76
|
+
const policy = getPolicy(toolClass);
|
|
77
|
+
const auditedResult = applyOutputPolicy(record.result, policy, _context.overflowHandler!);
|
|
78
|
+
record.result = auditedResult.result;
|
|
79
|
+
|
|
80
|
+
// Surface spill backend in phase metadata when overflow occurred
|
|
81
|
+
const spillBackend = auditedResult.audit.spillBackend;
|
|
82
|
+
return {
|
|
83
|
+
phase: 'mapped',
|
|
84
|
+
success: true,
|
|
85
|
+
durationMs: performance.now() - start,
|
|
86
|
+
...(spillBackend ? { spillBackend } : {}),
|
|
87
|
+
};
|
|
88
|
+
} catch (err) {
|
|
89
|
+
// Mapping failure is non-fatal — pass through unmapped result
|
|
90
|
+
const message = summarizeError(err);
|
|
91
|
+
return {
|
|
92
|
+
phase: 'mapped',
|
|
93
|
+
success: true,
|
|
94
|
+
durationMs: performance.now() - start,
|
|
95
|
+
error: `Output mapping failed (non-fatal): ${message}`,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import type { Tool, ToolCall } from '@pellux/goodvibes-sdk/platform/types/tools';
|
|
2
|
+
import type { ToolRuntimeContext } from '../context.ts';
|
|
3
|
+
import type { PhaseResult, ToolExecutionRecord } from '@pellux/goodvibes-sdk/platform/runtime/tools/types';
|
|
4
|
+
import {
|
|
5
|
+
emitPermissionDecision,
|
|
6
|
+
emitPermissionRequested,
|
|
7
|
+
} from '../../emitters/permissions.ts';
|
|
8
|
+
import type { PermissionCheckResult } from '@pellux/goodvibes-sdk/platform/permissions/types';
|
|
9
|
+
import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils/error-display';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* permission — Phase 3 of the tool execution pipeline.
|
|
13
|
+
*
|
|
14
|
+
* Delegates to PermissionManager.check(). If permission is denied,
|
|
15
|
+
* the phase aborts and no further phases are run.
|
|
16
|
+
*
|
|
17
|
+
* The resolved args used here account for any input updates from the
|
|
18
|
+
* prehook phase (stored as `_updatedArgs` on the record).
|
|
19
|
+
*/
|
|
20
|
+
export async function permissionPhase(
|
|
21
|
+
call: ToolCall,
|
|
22
|
+
_tool: Tool,
|
|
23
|
+
context: ToolRuntimeContext,
|
|
24
|
+
record: ToolExecutionRecord,
|
|
25
|
+
): Promise<PhaseResult> {
|
|
26
|
+
const start = performance.now();
|
|
27
|
+
|
|
28
|
+
// Use updated args from prehook if present
|
|
29
|
+
const effectiveArgs = record._updatedArgs ?? call.arguments;
|
|
30
|
+
|
|
31
|
+
const resolvePermissionResult = async (): Promise<PermissionCheckResult> => {
|
|
32
|
+
const manager = context.permissionManager as unknown as {
|
|
33
|
+
checkDetailed?: (toolName: string, args: Record<string, unknown>) => Promise<PermissionCheckResult>;
|
|
34
|
+
check?: (toolName: string, args: Record<string, unknown>) => Promise<boolean>;
|
|
35
|
+
getCategory: (toolName: string) => string;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
if (typeof manager.checkDetailed === 'function') {
|
|
39
|
+
return manager.checkDetailed(call.name, effectiveArgs);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (typeof manager.check === 'function') {
|
|
43
|
+
const approved = await manager.check(call.name, effectiveArgs);
|
|
44
|
+
return {
|
|
45
|
+
approved,
|
|
46
|
+
persisted: false,
|
|
47
|
+
sourceLayer: approved ? 'config_policy' : 'user_prompt',
|
|
48
|
+
reasonCode: approved ? 'config_allow' : 'user_denied',
|
|
49
|
+
analysis: {
|
|
50
|
+
classification: 'generic',
|
|
51
|
+
riskLevel: 'medium',
|
|
52
|
+
summary: `Permission ${approved ? 'approved' : 'denied'} for ${call.name}`,
|
|
53
|
+
reasons: [],
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
throw new Error('PermissionManager is missing both checkDetailed() and check()');
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
try {
|
|
62
|
+
if (context.runtimeBus) {
|
|
63
|
+
const analysis = await resolvePermissionResult();
|
|
64
|
+
emitPermissionRequested(context.runtimeBus, {
|
|
65
|
+
sessionId: context.ids.sessionId,
|
|
66
|
+
traceId: context.ids.traceId,
|
|
67
|
+
source: 'permission-manager',
|
|
68
|
+
}, {
|
|
69
|
+
callId: call.id,
|
|
70
|
+
tool: call.name,
|
|
71
|
+
args: effectiveArgs,
|
|
72
|
+
category: context.permissionManager.getCategory(call.name),
|
|
73
|
+
classification: analysis.analysis.classification,
|
|
74
|
+
riskLevel: analysis.analysis.riskLevel,
|
|
75
|
+
summary: analysis.analysis.summary,
|
|
76
|
+
reasons: analysis.analysis.reasons,
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
emitPermissionDecision(context.runtimeBus, {
|
|
80
|
+
sessionId: context.ids.sessionId,
|
|
81
|
+
traceId: context.ids.traceId,
|
|
82
|
+
source: 'permission-manager',
|
|
83
|
+
}, {
|
|
84
|
+
callId: call.id,
|
|
85
|
+
tool: call.name,
|
|
86
|
+
approved: analysis.approved,
|
|
87
|
+
source: 'permission-manager',
|
|
88
|
+
sourceLayer: analysis.sourceLayer,
|
|
89
|
+
persisted: analysis.persisted,
|
|
90
|
+
reasonCode: analysis.reasonCode,
|
|
91
|
+
classification: analysis.analysis.classification,
|
|
92
|
+
riskLevel: analysis.analysis.riskLevel,
|
|
93
|
+
summary: analysis.analysis.summary,
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
if (!analysis.approved) {
|
|
97
|
+
return {
|
|
98
|
+
phase: 'permissioned',
|
|
99
|
+
success: false,
|
|
100
|
+
durationMs: performance.now() - start,
|
|
101
|
+
error: `Permission denied for tool '${call.name}'`,
|
|
102
|
+
abort: true,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
} else {
|
|
106
|
+
const analysis = await resolvePermissionResult();
|
|
107
|
+
if (!analysis.approved) {
|
|
108
|
+
return {
|
|
109
|
+
phase: 'permissioned',
|
|
110
|
+
success: false,
|
|
111
|
+
durationMs: performance.now() - start,
|
|
112
|
+
error: `Permission denied for tool '${call.name}'`,
|
|
113
|
+
abort: true,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return {
|
|
119
|
+
phase: 'permissioned',
|
|
120
|
+
success: true,
|
|
121
|
+
durationMs: performance.now() - start,
|
|
122
|
+
};
|
|
123
|
+
} catch (err) {
|
|
124
|
+
const message = summarizeError(err);
|
|
125
|
+
return {
|
|
126
|
+
phase: 'permissioned',
|
|
127
|
+
success: false,
|
|
128
|
+
durationMs: performance.now() - start,
|
|
129
|
+
error: `Permission check threw: ${message}`,
|
|
130
|
+
abort: true,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { Tool, ToolCall } from '@pellux/goodvibes-sdk/platform/types/tools';
|
|
2
|
+
import type { ToolRuntimeContext } from '../context.ts';
|
|
3
|
+
import type { PhaseResult, ToolExecutionRecord } from '@pellux/goodvibes-sdk/platform/runtime/tools/types';
|
|
4
|
+
import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils/error-display';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* posthook — Phase 6 of the tool execution pipeline.
|
|
8
|
+
*
|
|
9
|
+
* Fires `Post:tool:<toolName>` hook via the HookDispatcher.
|
|
10
|
+
*
|
|
11
|
+
* Post-hooks are non-blocking in the following sense: a hook failure does
|
|
12
|
+
* NOT fail the tool call. The phase always returns success=true so the
|
|
13
|
+
* executor can proceed to `succeeded`. Hook errors are captured in the
|
|
14
|
+
* PhaseResult.error field for observability without aborting the call.
|
|
15
|
+
*/
|
|
16
|
+
export async function posthookPhase(
|
|
17
|
+
call: ToolCall,
|
|
18
|
+
_tool: Tool,
|
|
19
|
+
context: ToolRuntimeContext,
|
|
20
|
+
record: ToolExecutionRecord,
|
|
21
|
+
): Promise<PhaseResult> {
|
|
22
|
+
const start = performance.now();
|
|
23
|
+
|
|
24
|
+
try {
|
|
25
|
+
await context.hookDispatcher.fire({
|
|
26
|
+
path: `Post:tool:${call.name}`,
|
|
27
|
+
phase: 'Post',
|
|
28
|
+
category: 'tool',
|
|
29
|
+
specific: call.name,
|
|
30
|
+
sessionId: context.ids.sessionId,
|
|
31
|
+
timestamp: Date.now(),
|
|
32
|
+
payload: {
|
|
33
|
+
callId: call.id,
|
|
34
|
+
toolName: call.name,
|
|
35
|
+
args: record._updatedArgs ?? call.arguments,
|
|
36
|
+
result: record.result,
|
|
37
|
+
success: record.result?.success ?? false,
|
|
38
|
+
},
|
|
39
|
+
agentId: context.agent?.agentId,
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
phase: 'posthooked',
|
|
44
|
+
success: true,
|
|
45
|
+
durationMs: performance.now() - start,
|
|
46
|
+
};
|
|
47
|
+
} catch (err) {
|
|
48
|
+
// Post-hook failure must not fail the tool call
|
|
49
|
+
const message = summarizeError(err);
|
|
50
|
+
return {
|
|
51
|
+
phase: 'posthooked',
|
|
52
|
+
success: true,
|
|
53
|
+
durationMs: performance.now() - start,
|
|
54
|
+
error: `Post-hook threw (non-fatal): ${message}`,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { Tool, ToolCall } from '@pellux/goodvibes-sdk/platform/types/tools';
|
|
2
|
+
import type { ToolRuntimeContext } from '../context.ts';
|
|
3
|
+
import type { PhaseResult, ToolExecutionRecord } from '@pellux/goodvibes-sdk/platform/runtime/tools/types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* prehook — Phase 2 of the tool execution pipeline.
|
|
7
|
+
*
|
|
8
|
+
* Fires `Pre:tool:<toolName>` hook via the HookDispatcher.
|
|
9
|
+
* If the hook returns a `deny` decision, execution is aborted.
|
|
10
|
+
* If the hook returns `updatedInput`, the record's args are updated
|
|
11
|
+
* in-place so subsequent phases see the modified arguments.
|
|
12
|
+
*
|
|
13
|
+
* Hook failures (network, timeout, etc.) are treated as allow to avoid
|
|
14
|
+
* blocking tool execution on non-critical infrastructure errors.
|
|
15
|
+
*/
|
|
16
|
+
export async function prehookPhase(
|
|
17
|
+
call: ToolCall,
|
|
18
|
+
_tool: Tool,
|
|
19
|
+
context: ToolRuntimeContext,
|
|
20
|
+
record: ToolExecutionRecord,
|
|
21
|
+
): Promise<PhaseResult> {
|
|
22
|
+
const start = performance.now();
|
|
23
|
+
|
|
24
|
+
try {
|
|
25
|
+
const hookResult = await context.hookDispatcher.fire({
|
|
26
|
+
path: `Pre:tool:${call.name}`,
|
|
27
|
+
phase: 'Pre',
|
|
28
|
+
category: 'tool',
|
|
29
|
+
specific: call.name,
|
|
30
|
+
sessionId: context.ids.sessionId,
|
|
31
|
+
timestamp: Date.now(),
|
|
32
|
+
payload: {
|
|
33
|
+
callId: call.id,
|
|
34
|
+
toolName: call.name,
|
|
35
|
+
args: call.arguments,
|
|
36
|
+
},
|
|
37
|
+
agentId: context.agent?.agentId,
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
if (hookResult.decision === 'deny') {
|
|
41
|
+
return {
|
|
42
|
+
phase: 'prehooked',
|
|
43
|
+
success: false,
|
|
44
|
+
durationMs: performance.now() - start,
|
|
45
|
+
error: hookResult.reason ?? 'Pre-hook denied tool execution',
|
|
46
|
+
abort: true,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Allow hooks to modify input arguments for subsequent phases
|
|
51
|
+
if (hookResult.updatedInput) {
|
|
52
|
+
record._updatedArgs = hookResult.updatedInput;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return {
|
|
56
|
+
phase: 'prehooked',
|
|
57
|
+
success: true,
|
|
58
|
+
durationMs: performance.now() - start,
|
|
59
|
+
};
|
|
60
|
+
} catch (_err) {
|
|
61
|
+
// Hook infrastructure failure — allow execution to proceed
|
|
62
|
+
return {
|
|
63
|
+
phase: 'prehooked',
|
|
64
|
+
success: true,
|
|
65
|
+
durationMs: performance.now() - start,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { Tool, ToolCall } from '@pellux/goodvibes-sdk/platform/types/tools';
|
|
2
|
+
import type { ToolRuntimeContext } from '../context.ts';
|
|
3
|
+
import type { PhaseResult, ToolExecutionRecord } from '@pellux/goodvibes-sdk/platform/runtime/tools/types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* validate — Phase 1 of the tool execution pipeline.
|
|
7
|
+
*
|
|
8
|
+
* Performs lightweight pre-flight checks:
|
|
9
|
+
* - The call has a non-empty id
|
|
10
|
+
* - The call has a non-empty tool name
|
|
11
|
+
* - Args is a plain object (not null)
|
|
12
|
+
* - The tool object is present
|
|
13
|
+
*
|
|
14
|
+
* Heavy schema validation (JSON Schema against parameters) is intentionally
|
|
15
|
+
* left to a future tier — this phase acts as a guard against programmer
|
|
16
|
+
* errors and malformed LLM payloads.
|
|
17
|
+
*/
|
|
18
|
+
export async function validatePhase(
|
|
19
|
+
call: ToolCall,
|
|
20
|
+
tool: Tool,
|
|
21
|
+
_context: ToolRuntimeContext,
|
|
22
|
+
_record: ToolExecutionRecord,
|
|
23
|
+
): Promise<PhaseResult> {
|
|
24
|
+
const start = performance.now();
|
|
25
|
+
|
|
26
|
+
if (!call.id || call.id.trim().length === 0) {
|
|
27
|
+
return result(start, false, 'Tool call is missing a valid id');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (!call.name || call.name.trim().length === 0) {
|
|
31
|
+
return result(start, false, 'Tool call is missing a tool name');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (call.arguments === null || typeof call.arguments !== 'object' || Array.isArray(call.arguments)) {
|
|
35
|
+
return result(start, false, `Tool call args must be a plain object, got: ${typeof call.arguments}`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (!tool || typeof tool.execute !== 'function') {
|
|
39
|
+
return result(start, false, `Tool '${call.name}' is not a valid tool implementation`);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return result(start, true);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function result(start: number, success: boolean, error?: string): PhaseResult {
|
|
46
|
+
return {
|
|
47
|
+
phase: 'validated',
|
|
48
|
+
success,
|
|
49
|
+
durationMs: performance.now() - start,
|
|
50
|
+
error,
|
|
51
|
+
abort: success ? undefined : true,
|
|
52
|
+
};
|
|
53
|
+
}
|