@vellumai/assistant 0.8.6 → 0.8.7
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/AGENTS.md +4 -4
- package/Dockerfile +1 -0
- package/bun.lock +11 -2
- package/docker-entrypoint.sh +8 -6
- package/docs/plugins.md +63 -28
- package/examples/plugins/echo/register.ts +4 -7
- package/knip.json +1 -0
- package/node_modules/@vellumai/environments/bun.lock +24 -0
- package/node_modules/@vellumai/environments/package.json +18 -0
- package/node_modules/@vellumai/environments/src/__tests__/package-boundary.test.ts +95 -0
- package/node_modules/@vellumai/environments/src/index.ts +11 -0
- package/node_modules/@vellumai/environments/src/seeds.ts +73 -0
- package/node_modules/@vellumai/environments/src/types.ts +70 -0
- package/node_modules/@vellumai/environments/tsconfig.json +20 -0
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +11 -0
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +3 -4
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +6 -2
- package/openapi.yaml +3735 -353
- package/package.json +7 -3
- package/scripts/generate-openapi.ts +20 -13
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +42 -80
- package/src/__tests__/agent-loop-exit-reason.test.ts +240 -39
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +141 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +19 -32
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +6 -4
- package/src/__tests__/agent-loop-thinking.test.ts +17 -12
- package/src/__tests__/agent-loop.test.ts +207 -341
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +4 -2
- package/src/__tests__/agent-wake-override-profile.test.ts +22 -40
- package/src/__tests__/anthropic-provider.test.ts +201 -55
- package/src/__tests__/app-builder-skill-instructions.test.ts +22 -0
- package/src/__tests__/app-control-flow.test.ts +5 -0
- package/src/__tests__/approval-cascade.test.ts +4 -11
- package/src/__tests__/approval-routes-http.test.ts +4 -2
- package/src/__tests__/assistant-event.test.ts +15 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +2 -2
- package/src/__tests__/avatar-e2e.test.ts +7 -37
- package/src/__tests__/avatar-generator.test.ts +12 -42
- package/src/__tests__/avatar-identity-sync.test.ts +28 -3
- package/src/__tests__/background-shell-bash.test.ts +3 -7
- package/src/__tests__/btw-routes.test.ts +7 -12
- package/src/__tests__/call-pointer-messages.test.ts +5 -3
- package/src/__tests__/call-site-routing-provider.test.ts +22 -40
- package/src/__tests__/catalog-files.test.ts +1 -0
- package/src/__tests__/channel-approval-routes.test.ts +48 -20
- package/src/__tests__/channel-approvals.test.ts +3 -1
- package/src/__tests__/channel-invite-transport.test.ts +1 -5
- package/src/__tests__/channel-readiness-routes.test.ts +0 -4
- package/src/__tests__/channel-readiness-slack-remote.test.ts +2 -7
- package/src/__tests__/channel-retry-sweep.test.ts +71 -79
- package/src/__tests__/circuit-breaker-pipeline.test.ts +3 -3
- package/src/__tests__/clawhub-files.test.ts +1 -0
- package/src/__tests__/compaction-events.test.ts +5 -17
- package/src/__tests__/compaction-pipeline.test.ts +1 -1
- package/src/__tests__/compaction-timeout-recovery.test.ts +37 -48
- package/src/__tests__/compaction-trail-store.test.ts +1 -79
- package/src/__tests__/compactor-image-manifest-trust.test.ts +112 -0
- package/src/__tests__/computer-use-tools.test.ts +2 -2
- package/src/__tests__/config-watcher.test.ts +28 -0
- package/src/__tests__/context-search-agent-runner.test.ts +6 -3
- package/src/__tests__/context-token-estimator.test.ts +34 -0
- package/src/__tests__/context-window-manager-compact-retry.test.ts +291 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +14 -7
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +3 -2
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +12 -27
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +430 -90
- package/src/__tests__/conversation-agent-loop.test.ts +581 -62
- package/src/__tests__/conversation-analysis-routes.test.ts +1 -3
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -1
- package/src/__tests__/conversation-clear-safety.test.ts +20 -10
- package/src/__tests__/conversation-confirmation-signals.test.ts +15 -45
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-disk-view.test.ts +10 -17
- package/src/__tests__/conversation-fork-crud.test.ts +86 -172
- package/src/__tests__/conversation-fork-route.test.ts +16 -14
- package/src/__tests__/conversation-init.benchmark.test.ts +6 -6
- package/src/__tests__/conversation-lifecycle.test.ts +3 -2
- package/src/__tests__/conversation-load-history-repair.test.ts +3 -2
- package/src/__tests__/conversation-load-history-stripped.test.ts +1 -1
- package/src/__tests__/conversation-message-sync-tags.test.ts +3 -4
- package/src/__tests__/conversation-pairing.test.ts +34 -4
- package/src/__tests__/conversation-pre-run-repair.test.ts +1 -1
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +4 -0
- package/src/__tests__/conversation-process-callsite.test.ts +27 -30
- package/src/__tests__/conversation-provider-retry-repair.test.ts +53 -44
- package/src/__tests__/conversation-queue.test.ts +270 -164
- package/src/__tests__/conversation-routes-disk-view.test.ts +3 -2
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +2 -2
- package/src/__tests__/conversation-routes-slash-commands.test.ts +2 -2
- package/src/__tests__/conversation-runtime-assembly.test.ts +20 -22
- package/src/__tests__/conversation-runtime-workspace.test.ts +19 -1
- package/src/__tests__/conversation-slash-queue.test.ts +37 -31
- package/src/__tests__/conversation-slash-unknown.test.ts +13 -15
- package/src/__tests__/conversation-speed-override.test.ts +8 -22
- package/src/__tests__/conversation-stream-state.test.ts +484 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +6 -15
- package/src/__tests__/conversation-surfaces-app-control.test.ts +32 -4
- package/src/__tests__/conversation-surfaces-state-update.test.ts +5 -2
- package/src/__tests__/conversation-surfaces-table-action.test.ts +6 -15
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +23 -11
- package/src/__tests__/conversation-unread-route.test.ts +14 -2
- package/src/__tests__/conversation-usage.test.ts +0 -2
- package/src/__tests__/conversation-wipe.test.ts +1 -1
- package/src/__tests__/conversation-workspace-cache-state.test.ts +3 -1
- package/src/__tests__/conversation-workspace-injection.test.ts +48 -22
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +27 -7
- package/src/__tests__/credential-execution-tools.test.ts +1 -2
- package/src/__tests__/credential-security-invariants.test.ts +0 -1
- package/src/__tests__/cross-provider-web-search.test.ts +6 -2
- package/src/__tests__/cu-unified-flow.test.ts +26 -1
- package/src/__tests__/db-schedule-syntax-migration.test.ts +11 -0
- package/src/__tests__/disk-pressure-guard.test.ts +66 -0
- package/src/__tests__/disk-pressure-routes.test.ts +9 -2
- package/src/__tests__/dm-persistence.test.ts +7 -2
- package/src/__tests__/dynamic-page-surface.test.ts +68 -0
- package/src/__tests__/edit-propagation.test.ts +1 -2
- package/src/__tests__/empty-response-pipeline.test.ts +127 -5
- package/src/__tests__/filing-service.test.ts +2 -2
- package/src/__tests__/first-greeting.test.ts +55 -14
- package/src/__tests__/gemini-inline-media.test.ts +78 -0
- package/src/__tests__/gemini-provider.test.ts +351 -28
- package/src/__tests__/guardian-routing-state.test.ts +60 -71
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +9 -7
- package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
- package/src/__tests__/heartbeat-service.test.ts +2 -1
- package/src/__tests__/history-repair-hook.test.ts +161 -0
- package/src/__tests__/history-repair-observability.test.ts +1 -1
- package/src/__tests__/history-repair.test.ts +2 -1
- package/src/__tests__/host-app-control-proxy.test.ts +2 -0
- package/src/__tests__/host-cu-proxy.test.ts +2 -0
- package/src/__tests__/host-file-edit-tool.test.ts +4 -2
- package/src/__tests__/host-file-proxy.test.ts +31 -0
- package/src/__tests__/host-file-read-tool.test.ts +4 -2
- package/src/__tests__/host-file-write-tool.test.ts +9 -3
- package/src/__tests__/host-proxy-preactivation.test.ts +53 -14
- package/src/__tests__/host-shell-tool.test.ts +9 -4
- package/src/__tests__/http-user-message-parity.test.ts +2 -2
- package/src/__tests__/identity-intro-cache.test.ts +35 -14
- package/src/__tests__/inbound-slack-persistence.test.ts +7 -2
- package/src/__tests__/injector-background-turn.test.ts +1 -1
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-disk-pressure.test.ts +1 -1
- package/src/__tests__/injector-document-comments.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +1 -1
- package/src/__tests__/injector-v3-suppression.test.ts +220 -0
- package/src/__tests__/list-messages-attachments.test.ts +7 -8
- package/src/__tests__/list-messages-hidden-metadata.test.ts +17 -15
- package/src/__tests__/list-messages-page-latest.test.ts +0 -1
- package/src/__tests__/list-messages-tool-merge.test.ts +36 -6
- package/src/__tests__/llm-call-pipeline.test.ts +21 -15
- package/src/__tests__/llm-request-log-turn-query.test.ts +42 -86
- package/src/__tests__/llm-resolver.test.ts +23 -47
- package/src/__tests__/llm-usage-store.test.ts +45 -0
- package/src/__tests__/log-export-routes.test.ts +59 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +1 -8
- package/src/__tests__/mcp-auth-routes.test.ts +15 -10
- package/src/__tests__/mcp-health-check.test.ts +18 -13
- package/src/__tests__/memory-retrieval-pipeline.test.ts +1 -1
- package/src/__tests__/memory-v2-static-injector.test.ts +1 -1
- package/src/__tests__/messaging-send-tool.test.ts +8 -4
- package/src/__tests__/migration-export-http.test.ts +12 -12
- package/src/__tests__/migration-import-commit-http.test.ts +8 -8
- package/src/__tests__/migration-import-preflight-http.test.ts +7 -7
- package/src/__tests__/migration-validate-http.test.ts +3 -3
- package/src/__tests__/native-web-search.test.ts +14 -20
- package/src/__tests__/notification-decision-identity.test.ts +9 -18
- package/src/__tests__/notification-decision-recipient-context.test.ts +3 -6
- package/src/__tests__/oauth-commands-routes.test.ts +1 -1
- package/src/__tests__/onboarding-template-contract.test.ts +10 -0
- package/src/__tests__/openai-provider.test.ts +66 -70
- package/src/__tests__/openai-responses-provider.test.ts +21 -77
- package/src/__tests__/outbound-slack-persistence.test.ts +2 -1
- package/src/__tests__/overflow-reduce-pipeline.test.ts +2 -4
- package/src/__tests__/parallel-tool.benchmark.test.ts +24 -36
- package/src/__tests__/persistence-pipeline.test.ts +15 -26
- package/src/__tests__/persistence-secret-redaction.test.ts +2 -1
- package/src/__tests__/pipeline-runner.test.ts +2 -3
- package/src/__tests__/plugin-bootstrap.test.ts +51 -25
- package/src/__tests__/plugin-route-contribution.test.ts +6 -16
- package/src/__tests__/plugin-skill-contribution.test.ts +7 -17
- package/src/__tests__/plugin-tool-contribution.test.ts +10 -26
- package/src/__tests__/plugin-types.test.ts +7 -14
- package/src/__tests__/prechat-onboarding-contract.test.ts +23 -0
- package/src/__tests__/process-message-background-slack.test.ts +17 -16
- package/src/__tests__/process-message-display-content.test.ts +30 -42
- package/src/__tests__/provider-commit-message-generator.test.ts +19 -14
- package/src/__tests__/provider-error-scenarios.test.ts +7 -6
- package/src/__tests__/provider-platform-proxy-integration.test.ts +3 -8
- package/src/__tests__/provider-send-message-override-profile.test.ts +9 -25
- package/src/__tests__/provider-streaming.benchmark.test.ts +12 -22
- package/src/__tests__/provider-usage-tracking.test.ts +0 -6
- package/src/__tests__/ratelimit.test.ts +9 -4
- package/src/__tests__/relay-server.test.ts +20 -13
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +5 -8
- package/src/__tests__/retry-thinking-tool-choice.test.ts +10 -13
- package/src/__tests__/retry-verbosity-normalization.test.ts +5 -8
- package/src/__tests__/runtime-events-sse-reconnect.test.ts +353 -0
- package/src/__tests__/schedule-routes.test.ts +80 -10
- package/src/__tests__/schedule-store.test.ts +67 -0
- package/src/__tests__/schedule-tools.test.ts +125 -0
- package/src/__tests__/secret-ingress-http.test.ts +2 -2
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +11 -7
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +11 -9
- package/src/__tests__/secret-response-routing.test.ts +13 -11
- package/src/__tests__/send-endpoint-busy.test.ts +2 -1
- package/src/__tests__/shell-observability.test.ts +249 -0
- package/src/__tests__/skill-feature-flags-integration.test.ts +11 -11
- package/src/__tests__/skill-feature-flags.test.ts +6 -6
- package/src/__tests__/skill-load-feature-flag.test.ts +10 -10
- package/src/__tests__/skills-files-catalog-fallback.test.ts +10 -0
- package/src/__tests__/skillssh-files.test.ts +1 -0
- package/src/__tests__/starter-task-flow.test.ts +6 -6
- package/src/__tests__/strip-memory-injections.test.ts +102 -14
- package/src/__tests__/subagent-call-site-routing.test.ts +2 -2
- package/src/__tests__/suggestion-routes.test.ts +3 -3
- package/src/__tests__/sync-message-contract.test.ts +19 -16
- package/src/__tests__/system-prompt.test.ts +54 -0
- package/src/__tests__/terminal-tools.test.ts +3 -24
- package/src/__tests__/thread-backfill.test.ts +4 -9
- package/src/__tests__/title-generate-pipeline.test.ts +1 -1
- package/src/__tests__/token-estimate-pipeline.test.ts +2 -4
- package/src/__tests__/tool-error-pipeline.test.ts +2 -2
- package/src/__tests__/tool-execute-pipeline.test.ts +1 -1
- package/src/__tests__/tool-preview-lifecycle.test.ts +13 -11
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +9 -12
- package/src/__tests__/tool-result-truncation.test.ts +3 -1
- package/src/__tests__/tools-audio-read.test.ts +113 -0
- package/src/__tests__/turn-boundary-resolution.test.ts +44 -84
- package/src/__tests__/turn-events-store.test.ts +11 -7
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +8 -6
- package/src/__tests__/voice-session-bridge.test.ts +13 -7
- package/src/acp/__tests__/prepare-agent-env.test.ts +143 -31
- package/src/acp/prepare-agent-env.ts +52 -11
- package/src/agent/compaction-circuit.ts +140 -0
- package/src/agent/loop.ts +409 -85
- package/src/api/README.md +19 -17
- package/src/api/constants/tool-execution.ts +21 -0
- package/src/api/events/assistant-activity-state.ts +75 -0
- package/src/api/events/assistant-outbound-attachment.ts +25 -27
- package/src/api/events/assistant-text-delta.ts +6 -8
- package/src/api/events/assistant-turn-start.ts +5 -7
- package/src/api/events/avatar-updated.ts +24 -0
- package/src/api/events/compaction-circuit-closed.ts +26 -0
- package/src/api/events/compaction-circuit-open.ts +28 -0
- package/src/api/events/confirmation-request.ts +114 -0
- package/src/api/events/contact-request.ts +33 -0
- package/src/api/events/conversation-error.ts +77 -0
- package/src/api/events/conversation-list-invalidated.ts +38 -0
- package/src/api/events/conversation-title-updated.ts +24 -0
- package/src/api/events/disk-pressure-status-changed.ts +61 -0
- package/src/api/events/document-comment-created.ts +24 -28
- package/src/api/events/document-comment-deleted.ts +6 -8
- package/src/api/events/document-comment-reopened.ts +6 -8
- package/src/api/events/document-comment-resolved.ts +8 -10
- package/src/api/events/document-editor-update.ts +27 -0
- package/src/api/events/error.ts +32 -0
- package/src/api/events/generation-cancelled.ts +4 -6
- package/src/api/events/generation-handoff.ts +13 -15
- package/src/api/events/home-feed-updated.ts +26 -0
- package/src/api/events/identity-changed.ts +32 -0
- package/src/api/events/interaction-resolved.ts +50 -0
- package/src/api/events/message-complete.ts +10 -12
- package/src/api/events/message-dequeued.ts +21 -0
- package/src/api/events/message-queued-deleted.ts +23 -0
- package/src/api/events/message-queued.ts +22 -0
- package/src/api/events/message-request-complete.ts +29 -0
- package/src/api/events/navigate-settings.ts +20 -0
- package/src/api/events/notification-intent.ts +33 -0
- package/src/api/events/open-url.ts +6 -8
- package/src/api/events/question-request.ts +67 -0
- package/src/api/events/relationship-state-updated.ts +4 -6
- package/src/api/events/secret-request.ts +42 -0
- package/src/api/events/subagent-event.ts +79 -0
- package/src/api/events/subagent-spawned.ts +40 -0
- package/src/api/events/subagent-status-changed.ts +65 -0
- package/src/api/events/sync-changed.ts +29 -0
- package/src/api/events/tool-result.ts +129 -0
- package/src/api/events/tool-use-start.ts +8 -10
- package/src/api/events/turn-profile-auto-routed.ts +28 -0
- package/src/api/events/ui-surface-complete.ts +30 -0
- package/src/api/events/ui-surface-dismiss.ts +22 -0
- package/src/api/events/ui-surface-show.ts +67 -0
- package/src/api/events/ui-surface-update.ts +26 -0
- package/src/api/events/usage-update.ts +34 -0
- package/src/api/events/user-message-echo.ts +35 -0
- package/src/api/index.ts +354 -0
- package/src/api/requests/dictation.ts +45 -0
- package/src/api/responses/disk-pressure-status.ts +26 -0
- package/src/api/responses/home.ts +217 -0
- package/src/api/responses/llm-context-response.ts +2 -0
- package/src/api/responses/memory-v3-selection-log.ts +50 -0
- package/src/api/responses/subagent-detail.ts +48 -0
- package/src/approvals/guardian-decision-primitive.ts +7 -15
- package/src/approvals/guardian-request-resolvers.ts +6 -9
- package/src/avatar/__tests__/avatar-manifest.test.ts +236 -0
- package/src/avatar/__tests__/avatar-store.test.ts +193 -0
- package/src/avatar/avatar-manifest.ts +195 -0
- package/src/avatar/avatar-store.ts +113 -0
- package/src/avatar/traits-png-sync.ts +8 -2
- package/src/background-wake/next-wake.test.ts +31 -1
- package/src/background-wake/next-wake.ts +4 -1
- package/src/calls/call-conversation-messages.ts +6 -4
- package/src/calls/guardian-action-sweep.ts +6 -4
- package/src/calls/relay-server.ts +12 -8
- package/src/calls/voice-session-bridge.ts +13 -27
- package/src/cli/commands/__tests__/memory-v3.test.ts +245 -0
- package/src/cli/commands/avatar.ts +17 -11
- package/src/cli/commands/conversations.ts +15 -1
- package/src/cli/commands/db/__tests__/repair.test.ts +540 -0
- package/src/cli/commands/db/__tests__/status.test.ts +253 -0
- package/src/cli/commands/db/format.ts +48 -0
- package/src/cli/commands/db/index.ts +29 -0
- package/src/cli/commands/db/repair-step-conversation-backfill.ts +345 -0
- package/src/cli/commands/db/repair-step-integrity.ts +146 -0
- package/src/cli/commands/db/repair-steps.ts +164 -0
- package/src/cli/commands/db/repair.ts +141 -0
- package/src/cli/commands/db/status.ts +366 -0
- package/src/cli/commands/memory-v3.ts +159 -445
- package/src/cli/lib/cli-colors.ts +24 -6
- package/src/cli/program.ts +4 -5
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
- package/src/config/assistant-feature-flags.ts +2 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +14 -3
- package/src/config/bundled-skills/media-processing/services/reduce.ts +6 -9
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +7 -2
- package/src/config/bundled-skills/schedule/SKILL.md +1 -1
- package/src/config/bundled-skills/schedule/TOOLS.json +8 -0
- package/src/config/call-site-defaults.ts +2 -7
- package/src/config/feature-flag-registry.json +25 -9
- package/src/config/schemas/__tests__/memory-v2.test.ts +1 -226
- package/src/config/schemas/call-site-catalog.ts +8 -15
- package/src/config/schemas/llm.ts +2 -3
- package/src/config/schemas/memory-lifecycle.ts +24 -0
- package/src/config/schemas/memory-v2.ts +0 -253
- package/src/config/schemas/memory-v3.ts +39 -0
- package/src/config/schemas/memory.ts +6 -1
- package/src/config/schemas/timeouts.ts +3 -1
- package/src/context/compactor.ts +54 -31
- package/src/context/token-estimator.ts +19 -0
- package/src/context/tool-result-truncation.ts +1 -43
- package/src/context/window-manager.ts +138 -20
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +2 -2
- package/src/daemon/__tests__/web-search-status-text.test.ts +10 -6
- package/src/daemon/approval-generators.ts +4 -4
- package/src/daemon/config-watcher.ts +7 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +225 -88
- package/src/daemon/conversation-agent-loop.ts +284 -584
- package/src/daemon/conversation-error.ts +7 -7
- package/src/daemon/conversation-history.ts +22 -6
- package/src/daemon/conversation-launch.ts +4 -8
- package/src/daemon/conversation-lifecycle.ts +10 -38
- package/src/daemon/conversation-messaging.ts +1 -3
- package/src/daemon/conversation-notifiers.ts +7 -5
- package/src/daemon/conversation-process.ts +100 -79
- package/src/daemon/conversation-runtime-assembly.ts +47 -21
- package/src/daemon/conversation-store.ts +6 -5
- package/src/daemon/conversation-surfaces.ts +55 -69
- package/src/daemon/conversation-tool-setup.ts +3 -0
- package/src/daemon/conversation.ts +91 -126
- package/src/daemon/daemon-skill-host.ts +2 -6
- package/src/daemon/disk-pressure-guard.ts +35 -29
- package/src/daemon/external-plugins-bootstrap.ts +46 -24
- package/src/daemon/first-greeting.ts +26 -4
- package/src/daemon/guardian-action-generators.ts +2 -2
- package/src/daemon/handlers/conversations.ts +6 -22
- package/src/daemon/handlers/shared.ts +4 -0
- package/src/daemon/handlers/skills.ts +15 -14
- package/src/daemon/host-app-control-proxy.ts +54 -1
- package/src/daemon/host-cu-proxy.ts +46 -22
- package/src/daemon/host-file-proxy.ts +25 -1
- package/src/daemon/host-proxy-preactivation.ts +25 -6
- package/src/daemon/lifecycle.ts +28 -55
- package/src/daemon/message-protocol.ts +2 -3
- package/src/daemon/message-provenance.ts +49 -0
- package/src/daemon/message-types/contacts.ts +3 -20
- package/src/daemon/message-types/conversations.ts +13 -111
- package/src/daemon/message-types/documents.ts +3 -9
- package/src/daemon/message-types/home.ts +4 -17
- package/src/daemon/message-types/integrations.ts +2 -6
- package/src/daemon/message-types/messages.ts +28 -343
- package/src/daemon/message-types/notifications.ts +2 -32
- package/src/daemon/message-types/settings.ts +3 -8
- package/src/daemon/message-types/skills.ts +2 -0
- package/src/daemon/message-types/surfaces.ts +2 -0
- package/src/daemon/message-types/sync.ts +12 -25
- package/src/daemon/message-types/workspace.ts +3 -11
- package/src/daemon/process-message.ts +49 -46
- package/src/daemon/server.ts +12 -0
- package/src/daemon/tool-side-effects.ts +10 -7
- package/src/daemon/trust-context.ts +13 -0
- package/src/daemon/wake-target-adapter.ts +11 -1
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +3 -1
- package/src/heartbeat/heartbeat-run-store.ts +31 -0
- package/src/heartbeat/heartbeat-service.ts +16 -0
- package/src/home/feature-gate.ts +22 -0
- package/src/home/feed-types.ts +36 -221
- package/src/ipc/__tests__/email-ipc.test.ts +0 -9
- package/src/ipc/routes/__tests__/route-adapter.test.ts +244 -0
- package/src/ipc/routes/route-adapter.ts +45 -6
- package/src/ipc/skill-routes/__tests__/memory.test.ts +18 -9
- package/src/ipc/skill-routes/__tests__/providers.test.ts +10 -10
- package/src/ipc/skill-routes/__tests__/registries.test.ts +28 -18
- package/src/ipc/skill-routes/memory.ts +26 -13
- package/src/ipc/skill-routes/providers.ts +5 -6
- package/src/ipc/skill-routes/registries.ts +13 -61
- package/src/live-voice/__tests__/live-voice-archive.test.ts +24 -11
- package/src/memory/__tests__/conversation-queries.test.ts +192 -8
- package/src/memory/__tests__/db-maintenance.test.ts +128 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +5 -4
- package/src/memory/__tests__/memory-retrospective-job.test.ts +10 -6
- package/src/memory/__tests__/memory-v3-selections-migration.test.ts +103 -0
- package/src/memory/context-search/agent-runner.ts +2 -4
- package/src/memory/conversation-crud.ts +39 -8
- package/src/memory/conversation-queries.ts +78 -22
- package/src/memory/db-init.ts +8 -0
- package/src/memory/db-maintenance.ts +18 -2
- package/src/memory/graph/consolidation.ts +8 -11
- package/src/memory/graph/conversation-graph-memory.ts +41 -8
- package/src/memory/graph/extraction.ts +6 -9
- package/src/memory/graph/narrative.ts +2 -2
- package/src/memory/graph/pattern-scan.ts +2 -2
- package/src/memory/graph/retriever.ts +20 -26
- package/src/memory/graph/tools.ts +4 -4
- package/src/memory/job-handlers/conversation-starters.ts +32 -32
- package/src/memory/job-handlers/summarization.ts +1 -2
- package/src/memory/jobs-store.ts +3 -1
- package/src/memory/jobs-worker.ts +51 -39
- package/src/memory/llm-request-log-source-clickhouse.ts +5 -31
- package/src/memory/llm-request-log-source-local.ts +0 -11
- package/src/memory/llm-request-log-source.ts +9 -25
- package/src/memory/llm-request-log-store.ts +0 -41
- package/src/memory/llm-usage-store.ts +10 -0
- package/src/memory/memory-marker.ts +17 -0
- package/src/memory/memory-retrospective-job.ts +6 -2
- package/src/memory/memory-v2-activation-log-store.ts +1 -83
- package/src/memory/migrations/267-llm-usage-events-add-assistant-version.ts +46 -0
- package/src/memory/migrations/268-add-memory-v3-selections.ts +28 -0
- package/src/memory/migrations/269-schedule-script-timeout.ts +11 -0
- package/src/memory/migrations/270-messages-role-created-at-index.ts +18 -0
- package/src/memory/migrations/__tests__/267-llm-usage-events-add-assistant-version.test.ts +117 -0
- package/src/memory/migrations/index.ts +4 -0
- package/src/memory/schema/infrastructure.ts +11 -0
- package/src/memory/v2/__tests__/consolidation-job.test.ts +124 -0
- package/src/memory/v2/__tests__/migration.test.ts +11 -3
- package/src/memory/v2/__tests__/page-index.test.ts +37 -1
- package/src/memory/v2/__tests__/router.test.ts +14 -4
- package/src/memory/v2/__tests__/sweep-job.test.ts +6 -5
- package/src/memory/v2/backfill-jobs.ts +6 -0
- package/src/memory/v2/consolidation-job.ts +89 -9
- package/src/memory/v2/migration.ts +5 -3
- package/src/memory/v2/page-index.ts +11 -0
- package/src/memory/v2/router.ts +8 -11
- package/src/memory/v2/sweep-job.ts +8 -11
- package/src/memory/v2/types.ts +1 -0
- package/src/memory/v3/__tests__/assign.test.ts +242 -0
- package/src/memory/v3/__tests__/capabilities.test.ts +118 -0
- package/src/memory/v3/__tests__/core.test.ts +39 -0
- package/src/memory/v3/__tests__/fixtures/eval-turns.json +36 -0
- package/src/memory/v3/__tests__/fixtures/live-turns.json +37 -0
- package/src/memory/v3/__tests__/health.test.ts +203 -0
- package/src/memory/v3/__tests__/live-integration.test.ts +330 -0
- package/src/memory/v3/__tests__/maintain-job.test.ts +288 -0
- package/src/memory/v3/__tests__/needle.test.ts +107 -0
- package/src/memory/v3/__tests__/orchestrate.test.ts +400 -0
- package/src/memory/v3/__tests__/reconcile.test.ts +274 -0
- package/src/memory/v3/__tests__/render-injection.test.ts +61 -0
- package/src/memory/v3/__tests__/router.test.ts +260 -0
- package/src/memory/v3/__tests__/selection-log-store.test.ts +179 -0
- package/src/memory/v3/__tests__/selector.test.ts +404 -0
- package/src/memory/v3/__tests__/shadow-plugin.test.ts +414 -0
- package/src/memory/v3/__tests__/snapshot.test.ts +168 -0
- package/src/memory/v3/__tests__/tree.test.ts +192 -0
- package/src/memory/v3/__tests__/types.test.ts +54 -0
- package/src/memory/v3/__tests__/working-set-eviction.test.ts +106 -0
- package/src/memory/v3/__tests__/working-set-skeleton.test.ts +44 -0
- package/src/memory/v3/assign.ts +268 -0
- package/src/memory/v3/capabilities.ts +124 -0
- package/src/memory/v3/core.ts +26 -0
- package/src/memory/v3/data/README.md +84 -0
- package/src/memory/v3/data/assignments.json +5 -0
- package/src/memory/v3/data/core.json +1 -0
- package/src/memory/v3/data/leaves/domain-a/topic-x.md +9 -0
- package/src/memory/v3/data/leaves/domain-a/topic-y.md +9 -0
- package/src/memory/v3/data/leaves/domain-b/topic-z.md +9 -0
- package/src/memory/v3/health.ts +0 -0
- package/src/memory/v3/maintain-job.ts +314 -0
- package/src/memory/v3/needle.ts +115 -0
- package/src/memory/v3/orchestrate.ts +114 -0
- package/src/memory/v3/page-content.ts +34 -0
- package/src/memory/v3/provider-blocks.ts +16 -0
- package/src/memory/v3/reconcile.ts +523 -0
- package/src/memory/v3/render-injection.ts +32 -0
- package/src/memory/v3/router.ts +184 -0
- package/src/memory/v3/selection-log-store.ts +84 -0
- package/src/memory/v3/selector.ts +211 -0
- package/src/memory/v3/shadow-plugin.ts +379 -0
- package/src/memory/v3/snapshot.ts +209 -0
- package/src/memory/v3/tree.ts +174 -0
- package/src/memory/v3/types.ts +46 -60
- package/src/memory/v3/working-set.ts +88 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +1 -1
- package/src/messaging/providers/slack/render-transcript.ts +2 -2
- package/src/messaging/style-analyzer.ts +8 -11
- package/src/notifications/conversation-pairing.ts +8 -6
- package/src/notifications/decision-engine.ts +10 -13
- package/src/notifications/preference-extractor.ts +11 -14
- package/src/permissions/prompter.ts +42 -36
- package/src/permissions/question-prompter.test.ts +35 -26
- package/src/permissions/question-prompter.ts +6 -10
- package/src/plugin-api/index.ts +2 -0
- package/src/plugin-api/types.ts +25 -3
- package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +93 -0
- package/src/plugins/defaults/circuit-breaker/package.json +15 -0
- package/src/plugins/defaults/circuit-breaker/register.ts +39 -0
- package/src/plugins/defaults/compaction/middlewares/compaction.ts +25 -0
- package/src/plugins/defaults/compaction/package.json +15 -0
- package/src/plugins/defaults/compaction/register.ts +35 -0
- package/src/plugins/defaults/compaction/terminal.ts +73 -0
- package/src/plugins/defaults/empty-response/middlewares/emptyResponse.ts +22 -0
- package/src/plugins/defaults/empty-response/package.json +15 -0
- package/src/plugins/defaults/empty-response/register.ts +28 -0
- package/src/plugins/defaults/empty-response/terminal.ts +106 -0
- package/src/plugins/defaults/history-repair/hooks/user-prompt-submit.ts +35 -0
- package/src/plugins/defaults/history-repair/package.json +15 -0
- package/src/plugins/defaults/history-repair/register.ts +24 -0
- package/src/{daemon/history-repair.ts → plugins/defaults/history-repair/terminal.ts} +48 -35
- package/src/plugins/defaults/index.ts +29 -40
- package/src/plugins/defaults/injectors/package.json +15 -0
- package/src/plugins/defaults/{injectors.ts → injectors/register.ts} +14 -38
- package/src/plugins/defaults/llm-call/middlewares/llmCall.ts +17 -0
- package/src/plugins/defaults/llm-call/package.json +15 -0
- package/src/plugins/defaults/{llm-call.ts → llm-call/register.ts} +6 -38
- package/src/plugins/defaults/memory-retrieval/middlewares/memoryRetrieval.ts +17 -0
- package/src/plugins/defaults/memory-retrieval/package.json +15 -0
- package/src/plugins/defaults/{memory-retrieval.ts → memory-retrieval/register.ts} +10 -48
- package/src/plugins/defaults/{overflow-reduce.ts → overflow-reduce/middlewares/overflowReduce.ts} +18 -77
- package/src/plugins/defaults/overflow-reduce/package.json +15 -0
- package/src/plugins/defaults/overflow-reduce/register.ts +42 -0
- package/src/plugins/defaults/persistence/middlewares/persistence.ts +19 -0
- package/src/plugins/defaults/persistence/package.json +15 -0
- package/src/plugins/defaults/persistence/register.ts +38 -0
- package/src/plugins/defaults/persistence/terminal.ts +83 -0
- package/src/plugins/defaults/title-generate/package.json +15 -0
- package/src/plugins/defaults/title-generate/register.ts +35 -0
- package/src/plugins/defaults/title-generate/terminal.ts +31 -0
- package/src/plugins/defaults/token-estimate/middlewares/tokenEstimate.ts +23 -0
- package/src/plugins/defaults/token-estimate/package.json +15 -0
- package/src/plugins/defaults/token-estimate/register.ts +34 -0
- package/src/plugins/defaults/token-estimate/terminal.ts +40 -0
- package/src/plugins/defaults/tool-error/middlewares/toolError.ts +21 -0
- package/src/plugins/defaults/tool-error/package.json +15 -0
- package/src/plugins/defaults/tool-error/register.ts +35 -0
- package/src/plugins/defaults/tool-error/terminal.ts +47 -0
- package/src/plugins/defaults/tool-execute/middlewares/toolExecute.ts +23 -0
- package/src/plugins/defaults/tool-execute/package.json +15 -0
- package/src/plugins/defaults/{tool-execute.ts → tool-execute/register.ts} +8 -46
- package/src/plugins/defaults/tool-result-truncate/middlewares/toolResultTruncate.ts +23 -0
- package/src/plugins/defaults/tool-result-truncate/package.json +15 -0
- package/src/plugins/defaults/tool-result-truncate/register.ts +35 -0
- package/src/plugins/defaults/tool-result-truncate/terminal.ts +113 -0
- package/src/plugins/defaults/tool-result-truncate/types.ts +22 -0
- package/src/plugins/external-plugin-loader.ts +2 -2
- package/src/plugins/pipeline.ts +0 -12
- package/src/plugins/types.ts +51 -90
- package/src/plugins/user-loader.ts +4 -3
- package/src/proactive-artifact/aux-message-injector.ts +0 -1
- package/src/proactive-artifact/job.test.ts +20 -8
- package/src/proactive-artifact/job.ts +3 -1
- package/src/prompts/sections.ts +20 -7
- package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +2 -2
- package/src/prompts/templates/BOOTSTRAP.md +5 -1
- package/src/prompts/templates/system-sections.ts +6 -0
- package/src/providers/__tests__/retry-callsite.test.ts +25 -25
- package/src/providers/__tests__/satellite-connection-routing.test.ts +7 -21
- package/src/providers/anthropic/client.ts +24 -5
- package/src/providers/call-site-routing.ts +1 -9
- package/src/providers/gemini/client.ts +152 -34
- package/src/providers/gemini/inline-media.ts +74 -0
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +0 -2
- package/src/providers/openai/chat-completions-provider.ts +1 -4
- package/src/providers/openai/responses-provider.ts +1 -4
- package/src/providers/openrouter/client.ts +1 -6
- package/src/providers/provider-send-message.ts +6 -6
- package/src/providers/ratelimit.ts +1 -9
- package/src/providers/retry.ts +0 -5
- package/src/providers/types.ts +11 -2
- package/src/providers/usage-tracking.ts +1 -9
- package/src/runtime/__tests__/agent-wake.test.ts +131 -26
- package/src/runtime/__tests__/background-job-runner.test.ts +1 -3
- package/src/runtime/agent-wake.ts +93 -18
- package/src/runtime/assistant-event-hub.ts +2 -2
- package/src/runtime/auth/__tests__/guard-tests.test.ts +75 -109
- package/src/runtime/auth/__tests__/route-policy.test.ts +153 -170
- package/src/runtime/auth/route-policy.ts +42 -1079
- package/src/runtime/background-job-runner.ts +1 -4
- package/src/runtime/btw-sidechain.ts +3 -1
- package/src/runtime/channel-approvals.ts +3 -14
- package/src/runtime/channel-invite-transport.ts +5 -6
- package/src/runtime/channel-readiness-service.ts +2 -5
- package/src/runtime/channel-retry-sweep.ts +12 -16
- package/src/runtime/conversation-stream-state.ts +294 -0
- package/src/runtime/http-router.ts +19 -22
- package/src/runtime/http-types.ts +12 -6
- package/src/runtime/invite-instruction-generator.ts +3 -3
- package/src/runtime/pending-interactions.ts +2 -2
- package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +565 -0
- package/src/runtime/routes/__tests__/content-source-routes.test.ts +4 -4
- package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +62 -32
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +237 -0
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +13 -22
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +7 -2
- package/src/runtime/routes/__tests__/sanity-routes.test.ts +6 -6
- package/src/runtime/routes/__tests__/stt-routes.test.ts +3 -3
- package/src/runtime/routes/__tests__/suggest-trust-rule-routes.test.ts +5 -2
- package/src/runtime/routes/__tests__/tts-routes.test.ts +3 -3
- package/src/runtime/routes/acp-routes.test.ts +97 -75
- package/src/runtime/routes/acp-routes.ts +29 -6
- package/src/runtime/routes/app-management-routes.ts +97 -24
- package/src/runtime/routes/app-routes.ts +25 -5
- package/src/runtime/routes/approval-routes.ts +16 -4
- package/src/runtime/routes/attachment-routes.ts +25 -1
- package/src/runtime/routes/audio-routes.ts +1 -0
- package/src/runtime/routes/audit-routes.ts +5 -0
- package/src/runtime/routes/auth-routes.ts +5 -0
- package/src/runtime/routes/avatar-routes.ts +238 -59
- package/src/runtime/routes/background-tool-routes.ts +9 -0
- package/src/runtime/routes/background-wake-routes.ts +13 -3
- package/src/runtime/routes/backup-routes.ts +45 -0
- package/src/runtime/routes/bookmark-routes.ts +13 -0
- package/src/runtime/routes/brain-graph-routes.ts +9 -0
- package/src/runtime/routes/browser-routes.ts +5 -0
- package/src/runtime/routes/browser-tabs-routes.ts +5 -0
- package/src/runtime/routes/btw-routes.ts +5 -1
- package/src/runtime/routes/cache-routes.ts +13 -0
- package/src/runtime/routes/call-routes.ts +21 -10
- package/src/runtime/routes/channel-availability-routes.ts +5 -1
- package/src/runtime/routes/channel-readiness-routes.ts +37 -4
- package/src/runtime/routes/channel-route-definitions.ts +21 -0
- package/src/runtime/routes/channel-verification-routes.ts +21 -0
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +9 -2
- package/src/runtime/routes/client-routes.ts +9 -0
- package/src/runtime/routes/consolidation-routes.ts +13 -5
- package/src/runtime/routes/contact-prompt-routes.ts +9 -0
- package/src/runtime/routes/contact-routes.ts +90 -23
- package/src/runtime/routes/content-source-routes.ts +5 -1
- package/src/runtime/routes/conversation-analysis-routes.ts +5 -1
- package/src/runtime/routes/conversation-attention-routes.ts +5 -0
- package/src/runtime/routes/conversation-cli-routes.ts +54 -7
- package/src/runtime/routes/conversation-compaction-routes.ts +54 -25
- package/src/runtime/routes/conversation-list-routes.ts +81 -12
- package/src/runtime/routes/conversation-management-routes.ts +57 -14
- package/src/runtime/routes/conversation-query-routes.ts +88 -41
- package/src/runtime/routes/conversation-routes.ts +74 -19
- package/src/runtime/routes/conversation-starter-routes.ts +22 -13
- package/src/runtime/routes/conversations-import-routes.ts +6 -1
- package/src/runtime/routes/credential-prompt-routes.ts +5 -0
- package/src/runtime/routes/credential-routes.ts +25 -6
- package/src/runtime/routes/debug-bash-routes.ts +5 -0
- package/src/runtime/routes/debug-routes.ts +11 -2
- package/src/runtime/routes/defer-routes.ts +13 -0
- package/src/runtime/routes/diagnostics-routes.ts +37 -46
- package/src/runtime/routes/disk-pressure-routes.ts +17 -31
- package/src/runtime/routes/document-comments-routes.ts +46 -27
- package/src/runtime/routes/documents-routes.ts +21 -10
- package/src/runtime/routes/domain-routes.ts +61 -28
- package/src/runtime/routes/email-routes.ts +33 -0
- package/src/runtime/routes/events-routes.ts +114 -9
- package/src/runtime/routes/filing-routes.ts +9 -4
- package/src/runtime/routes/gateway-log-routes.ts +5 -0
- package/src/runtime/routes/global-search-routes.ts +53 -50
- package/src/runtime/routes/group-routes.ts +21 -5
- package/src/runtime/routes/guardian-action-routes.ts +9 -0
- package/src/runtime/routes/guardian-approval-interception.ts +0 -31
- package/src/runtime/routes/heartbeat-routes.ts +25 -9
- package/src/runtime/routes/home-feed-routes.ts +23 -19
- package/src/runtime/routes/home-state-routes.ts +8 -40
- package/src/runtime/routes/host-app-control-routes.ts +5 -0
- package/src/runtime/routes/host-bash-routes.ts +5 -0
- package/src/runtime/routes/host-browser-routes.ts +13 -0
- package/src/runtime/routes/host-cu-routes.ts +5 -0
- package/src/runtime/routes/host-file-routes.ts +26 -6
- package/src/runtime/routes/host-transfer-routes.ts +13 -2
- package/src/runtime/routes/http-adapter.ts +1 -2
- package/src/runtime/routes/identity-intro-cache.ts +17 -6
- package/src/runtime/routes/identity-routes.ts +12 -2
- package/src/runtime/routes/image-generation-routes.ts +5 -0
- package/src/runtime/routes/inbound-message-handler.ts +15 -11
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +0 -12
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +15 -19
- package/src/runtime/routes/inference-profile-session-routes.ts +13 -3
- package/src/runtime/routes/inference-provider-connection-routes.ts +21 -5
- package/src/runtime/routes/inference-send-routes.ts +11 -11
- package/src/runtime/routes/integrations/a2a.ts +30 -7
- package/src/runtime/routes/integrations/slack/channel.ts +19 -3
- package/src/runtime/routes/integrations/slack/share.ts +9 -2
- package/src/runtime/routes/integrations/telegram.ts +28 -9
- package/src/runtime/routes/integrations/twilio.ts +35 -7
- package/src/runtime/routes/integrations/vercel.ts +3 -3
- package/src/runtime/routes/internal-oauth-routes.ts +5 -0
- package/src/runtime/routes/internal-twilio-routes.ts +13 -0
- package/src/runtime/routes/llm-call-sites-routes.ts +39 -4
- package/src/runtime/routes/log-export-routes.ts +28 -10
- package/src/runtime/routes/mcp-auth-routes.ts +25 -0
- package/src/runtime/routes/memory-item-routes.ts +21 -10
- package/src/runtime/routes/memory-v2-routes.ts +90 -36
- package/src/runtime/routes/memory-v3-routes.ts +273 -407
- package/src/runtime/routes/migration-rollback-routes.ts +5 -1
- package/src/runtime/routes/migration-routes.ts +29 -0
- package/src/runtime/routes/notification-routes.ts +17 -1
- package/src/runtime/routes/oauth-apps.ts +33 -11
- package/src/runtime/routes/oauth-commands-routes.ts +37 -14
- package/src/runtime/routes/oauth-connect-routes.ts +9 -0
- package/src/runtime/routes/oauth-lifecycle-routes.ts +5 -1
- package/src/runtime/routes/oauth-providers.ts +35 -10
- package/src/runtime/routes/platform-routes.ts +21 -0
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +3 -2
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +37 -16
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +7 -3
- package/src/runtime/routes/playground/__tests__/state.test.ts +10 -3
- package/src/runtime/routes/playground/force-compact.ts +1 -1
- package/src/runtime/routes/playground/helpers.ts +0 -1
- package/src/runtime/routes/playground/inject-failures.ts +13 -8
- package/src/runtime/routes/playground/reset-circuit.ts +14 -9
- package/src/runtime/routes/playground/seed-conversation.ts +1 -1
- package/src/runtime/routes/playground/seeded-conversations.ts +3 -3
- package/src/runtime/routes/playground/state.ts +4 -3
- package/src/runtime/routes/plugins-routes.ts +22 -19
- package/src/runtime/routes/profiler-routes.ts +17 -4
- package/src/runtime/routes/ps-routes.ts +5 -0
- package/src/runtime/routes/publish-routes.ts +13 -3
- package/src/runtime/routes/question-routes.ts +5 -0
- package/src/runtime/routes/recording-routes.ts +25 -12
- package/src/runtime/routes/rename-conversation-routes.ts +5 -0
- package/src/runtime/routes/sanity-routes.ts +9 -2
- package/src/runtime/routes/schedule-routes.ts +137 -47
- package/src/runtime/routes/secret-routes.ts +17 -4
- package/src/runtime/routes/sequence-routes.ts +33 -0
- package/src/runtime/routes/settings-routes.ts +65 -19
- package/src/runtime/routes/skills-routes.ts +133 -69
- package/src/runtime/routes/slack-channel-routes.ts +5 -0
- package/src/runtime/routes/stt-routes.ts +13 -6
- package/src/runtime/routes/subagents-routes.ts +24 -18
- package/src/runtime/routes/suggest-trust-rule-routes.ts +7 -2
- package/src/runtime/routes/surface-action-routes.ts +9 -0
- package/src/runtime/routes/surface-content-routes.ts +10 -2
- package/src/runtime/routes/task-routes.ts +37 -0
- package/src/runtime/routes/telemetry-routes.ts +9 -0
- package/src/runtime/routes/trace-event-routes.ts +42 -1
- package/src/runtime/routes/trust-rules-routes.ts +5 -0
- package/src/runtime/routes/tts-routes.ts +13 -6
- package/src/runtime/routes/types.ts +17 -8
- package/src/runtime/routes/ui-request-routes.ts +5 -0
- package/src/runtime/routes/upgrade-broadcast-routes.ts +5 -0
- package/src/runtime/routes/usage-routes.ts +71 -3
- package/src/runtime/routes/user-routes-cli.ts +9 -0
- package/src/runtime/routes/user-routes.ts +5 -1
- package/src/runtime/routes/wake-conversation-routes.ts +5 -0
- package/src/runtime/routes/watcher-routes.ts +21 -0
- package/src/runtime/routes/webhook-routes.ts +9 -0
- package/src/runtime/routes/wipe-conversation-routes.ts +5 -0
- package/src/runtime/routes/work-items-routes.ts +47 -19
- package/src/runtime/routes/workspace-commit-routes.ts +5 -0
- package/src/runtime/routes/workspace-routes.test.ts +42 -0
- package/src/runtime/routes/workspace-routes.ts +120 -9
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -4
- package/src/runtime/services/analyze-conversation.ts +3 -6
- package/src/runtime/services/conversation-serializer.ts +24 -2
- package/src/runtime/sync/resource-sync-events.ts +16 -2
- package/src/runtime/sync/sync-publisher.ts +2 -2
- package/src/schedule/run-script.ts +28 -3
- package/src/schedule/schedule-store.ts +8 -0
- package/src/schedule/scheduler.ts +3 -1
- package/src/signals/user-message.ts +5 -8
- package/src/skills/catalog-files.ts +4 -1
- package/src/skills/clawhub-files.ts +2 -0
- package/src/skills/skillssh-files.ts +2 -0
- package/src/subagent/manager.ts +3 -6
- package/src/telemetry/types.ts +26 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +138 -1
- package/src/telemetry/usage-telemetry-reporter.ts +31 -0
- package/src/tools/acp/spawn.test.ts +88 -38
- package/src/tools/apps/definitions.ts +8 -4
- package/src/tools/ask-question/ask-question-tool.test.ts +120 -105
- package/src/tools/ask-question/ask-question-tool.ts +85 -90
- package/src/tools/computer-use/definitions.ts +28 -24
- package/src/tools/credential-execution/make-authenticated-request.ts +56 -51
- package/src/tools/credential-execution/manage-secure-command-tool.ts +2 -2
- package/src/tools/credential-execution/run-authenticated-command.ts +82 -77
- package/src/tools/credentials/vault.ts +112 -111
- package/src/tools/execution-target.ts +1 -1
- package/src/tools/execution-timeout.ts +3 -4
- package/src/tools/filesystem/edit.ts +45 -42
- package/src/tools/filesystem/list.ts +33 -30
- package/src/tools/filesystem/read.ts +54 -35
- package/src/tools/filesystem/write.ts +34 -31
- package/src/tools/host-filesystem/edit.ts +44 -42
- package/src/tools/host-filesystem/read.ts +49 -35
- package/src/tools/host-filesystem/transfer.ts +121 -108
- package/src/tools/host-filesystem/write.ts +33 -31
- package/src/tools/host-terminal/host-shell.ts +50 -48
- package/src/tools/memory/register.ts +23 -24
- package/src/tools/network/web-fetch.ts +49 -46
- package/src/tools/network/web-search.ts +16 -13
- package/src/tools/registry.ts +39 -16
- package/src/tools/schedule/create.ts +11 -0
- package/src/tools/schedule/update.ts +16 -0
- package/src/tools/shared/filesystem/audio-read.ts +122 -0
- package/src/tools/shared/filesystem/image-read.ts +1 -1
- package/src/tools/skills/execute.ts +34 -31
- package/src/tools/skills/load.ts +29 -23
- package/src/tools/subagent/notify-parent.ts +35 -32
- package/src/tools/system/avatar-generator.ts +13 -22
- package/src/tools/system/request-permission.ts +30 -27
- package/src/tools/terminal/shell.ts +190 -61
- package/src/tools/tool-defaults.ts +20 -9
- package/src/tools/tool-manifest.ts +4 -4
- package/src/tools/types.ts +74 -23
- package/src/tools/ui-surface/definitions.ts +69 -9
- package/src/usage/types.ts +10 -0
- package/src/util/errors.ts +2 -2
- package/src/util/map-limit.ts +27 -0
- package/src/util/platform.ts +15 -12
- package/src/work-items/work-item-runner.ts +7 -2
- package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +7 -20
- package/src/workspace/migrations/092-backfill-v3-leaves.ts +169 -0
- package/src/workspace/migrations/093-backfill-leaf-ids.ts +144 -0
- package/src/workspace/migrations/094-seed-avatar-manifest.ts +155 -0
- package/src/workspace/migrations/__tests__/094-seed-avatar-manifest.test.ts +136 -0
- package/src/workspace/migrations/__tests__/backfill-leaf-ids.test.ts +175 -0
- package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +124 -0
- package/src/workspace/migrations/registry.ts +6 -0
- package/src/workspace/provider-commit-message-generator.ts +15 -17
- package/tsconfig.json +4 -1
- package/src/__tests__/history-repair-pipeline.test.ts +0 -396
- package/src/cli/commands/__tests__/memory-v3-render.test.ts +0 -340
- package/src/cli/commands/memory-v3-render.ts +0 -491
- package/src/daemon/message-types/disk-pressure.ts +0 -9
- package/src/email/feature-gate.ts +0 -23
- package/src/memory/v3/__tests__/coactivation-store.test.ts +0 -422
- package/src/memory/v3/__tests__/consolidation-job.test.ts +0 -466
- package/src/memory/v3/__tests__/coretrieval-seed.test.ts +0 -270
- package/src/memory/v3/__tests__/edge-learning-job.test.ts +0 -324
- package/src/memory/v3/__tests__/edges.test.ts +0 -706
- package/src/memory/v3/__tests__/filter.test.ts +0 -560
- package/src/memory/v3/__tests__/gate.test.ts +0 -637
- package/src/memory/v3/__tests__/index-composition.test.ts +0 -291
- package/src/memory/v3/__tests__/loop.test.ts +0 -775
- package/src/memory/v3/__tests__/retriever.test.ts +0 -226
- package/src/memory/v3/__tests__/scouts.test.ts +0 -489
- package/src/memory/v3/__tests__/shadow-diff.test.ts +0 -225
- package/src/memory/v3/__tests__/shadow-middleware.test.ts +0 -398
- package/src/memory/v3/__tests__/system-prompts.test.ts +0 -154
- package/src/memory/v3/__tests__/traversal.test.ts +0 -508
- package/src/memory/v3/__tests__/tree-index.test.ts +0 -280
- package/src/memory/v3/__tests__/tree-store.test.ts +0 -529
- package/src/memory/v3/__tests__/tree-walk.test.ts +0 -784
- package/src/memory/v3/__tests__/validate.test.ts +0 -277
- package/src/memory/v3/auto-edges.ts +0 -223
- package/src/memory/v3/coactivation-store.ts +0 -124
- package/src/memory/v3/consolidation-job.ts +0 -323
- package/src/memory/v3/coretrieval-seed.ts +0 -240
- package/src/memory/v3/edge-learning-job.ts +0 -160
- package/src/memory/v3/edges.ts +0 -286
- package/src/memory/v3/filter.ts +0 -286
- package/src/memory/v3/gate.ts +0 -349
- package/src/memory/v3/index-composition.ts +0 -126
- package/src/memory/v3/llm-capture.ts +0 -46
- package/src/memory/v3/loop.ts +0 -430
- package/src/memory/v3/maintenance.ts +0 -144
- package/src/memory/v3/prompt-context.ts +0 -33
- package/src/memory/v3/prompts/consolidation.ts +0 -458
- package/src/memory/v3/prompts/system-prompts.ts +0 -196
- package/src/memory/v3/retriever.ts +0 -33
- package/src/memory/v3/scouts.ts +0 -431
- package/src/memory/v3/shadow-diff.ts +0 -287
- package/src/memory/v3/shadow-middleware.ts +0 -347
- package/src/memory/v3/traversal.ts +0 -211
- package/src/memory/v3/tree-index.ts +0 -237
- package/src/memory/v3/tree-store.ts +0 -394
- package/src/memory/v3/tree-walk.ts +0 -356
- package/src/memory/v3/validate.ts +0 -323
- package/src/plugins/defaults/circuit-breaker.ts +0 -141
- package/src/plugins/defaults/compaction.ts +0 -141
- package/src/plugins/defaults/empty-response.ts +0 -124
- package/src/plugins/defaults/history-repair.ts +0 -83
- package/src/plugins/defaults/persistence.ts +0 -146
- package/src/plugins/defaults/title-generate.ts +0 -90
- package/src/plugins/defaults/token-estimate.ts +0 -101
- package/src/plugins/defaults/tool-error.ts +0 -119
- package/src/plugins/defaults/tool-result-truncate.ts +0 -84
- package/src/runtime/routes/__tests__/memory-v3-simulate-params.test.ts +0 -35
|
@@ -27,8 +27,8 @@ import { registerTool } from "../registry.js";
|
|
|
27
27
|
import { formatShellOutput } from "../shared/shell-output.js";
|
|
28
28
|
import type {
|
|
29
29
|
ProxyEnvVars,
|
|
30
|
-
Tool,
|
|
31
30
|
ToolContext,
|
|
31
|
+
ToolDefinition,
|
|
32
32
|
ToolExecutionResult,
|
|
33
33
|
} from "../types.js";
|
|
34
34
|
import { buildSanitizedEnv } from "./safe-env.js";
|
|
@@ -44,50 +44,50 @@ function buildCredentialRefTrace(
|
|
|
44
44
|
|
|
45
45
|
const log = getLogger("shell-tool");
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
name
|
|
49
|
-
description
|
|
50
|
-
category
|
|
51
|
-
executionTarget
|
|
52
|
-
defaultRiskLevel
|
|
53
|
-
|
|
54
|
-
input_schema
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
47
|
+
export const shellTool = {
|
|
48
|
+
name: "bash",
|
|
49
|
+
description: "Execute a shell command on the local machine",
|
|
50
|
+
category: "terminal",
|
|
51
|
+
executionTarget: "sandbox",
|
|
52
|
+
defaultRiskLevel: RiskLevel.Medium,
|
|
53
|
+
|
|
54
|
+
input_schema: {
|
|
55
|
+
type: "object",
|
|
56
|
+
properties: {
|
|
57
|
+
command: {
|
|
58
|
+
type: "string",
|
|
59
|
+
description: "The shell command to execute",
|
|
60
|
+
},
|
|
61
|
+
activity: {
|
|
62
|
+
type: "string",
|
|
63
|
+
description:
|
|
64
|
+
'Brief non-technical explanation of what this command does and why, shown to a non-technical user in the permission prompt. Avoid jargon and technical terms. Good: "to check if a required program is installed on your computer". Bad: "to check if gcloud CLI is installed". Good: "to download a helper program". Bad: "to run npm install".',
|
|
65
|
+
},
|
|
66
|
+
timeout_seconds: {
|
|
67
|
+
type: "number",
|
|
68
|
+
description:
|
|
69
|
+
"Optional timeout in seconds. Defaults to the configured default (120s). Cannot exceed the configured maximum.",
|
|
70
|
+
},
|
|
71
|
+
network_mode: {
|
|
72
|
+
type: "string",
|
|
73
|
+
enum: ["off", "proxied"],
|
|
74
|
+
description:
|
|
75
|
+
'Network access mode for the command. "off" (default) blocks network access; "proxied" routes traffic through the credential proxy.',
|
|
76
|
+
},
|
|
77
|
+
credential_ids: {
|
|
78
|
+
type: "array",
|
|
79
|
+
items: { type: "string" },
|
|
80
|
+
description:
|
|
81
|
+
'Optional list of credential IDs to inject via the proxy when network_mode is "proxied".',
|
|
82
|
+
},
|
|
83
|
+
background: {
|
|
84
|
+
type: "boolean",
|
|
85
|
+
description:
|
|
86
|
+
"Run the command in the background. The tool returns immediately with a background tool ID. When the process exits, its output is delivered to the conversation as a wake.",
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
required: ["command", "activity"],
|
|
90
|
+
},
|
|
91
91
|
|
|
92
92
|
async execute(
|
|
93
93
|
input: Record<string, unknown>,
|
|
@@ -337,6 +337,7 @@ class ShellTool implements Tool {
|
|
|
337
337
|
const stdoutChunks: Buffer[] = [];
|
|
338
338
|
const stderrChunks: Buffer[] = [];
|
|
339
339
|
let timedOut = false;
|
|
340
|
+
const startedAt = Date.now();
|
|
340
341
|
|
|
341
342
|
const child = spawn(wrapped.command, wrapped.args, {
|
|
342
343
|
cwd: context.workingDir,
|
|
@@ -345,11 +346,17 @@ class ShellTool implements Tool {
|
|
|
345
346
|
detached: true,
|
|
346
347
|
});
|
|
347
348
|
|
|
348
|
-
const killTree = buildKillTree(child
|
|
349
|
+
const killTree = buildKillTree(child, {
|
|
350
|
+
toolName: "bash",
|
|
351
|
+
conversationId: context.conversationId,
|
|
352
|
+
command,
|
|
353
|
+
startedAt,
|
|
354
|
+
invocationId: bgId,
|
|
355
|
+
});
|
|
349
356
|
|
|
350
357
|
const timer = setTimeout(() => {
|
|
351
358
|
timedOut = true;
|
|
352
|
-
killTree();
|
|
359
|
+
killTree("timeout");
|
|
353
360
|
}, timeoutMs);
|
|
354
361
|
|
|
355
362
|
child.stdout.on("data", (data: Buffer) => {
|
|
@@ -365,12 +372,24 @@ class ShellTool implements Tool {
|
|
|
365
372
|
// Only the first handler to fire should wake the agent.
|
|
366
373
|
let completed = false;
|
|
367
374
|
|
|
368
|
-
child.on("close", (code) => {
|
|
375
|
+
child.on("close", (code, signal) => {
|
|
369
376
|
if (completed) return;
|
|
370
377
|
completed = true;
|
|
371
378
|
clearTimeout(timer);
|
|
372
379
|
removeBackgroundTool(bgId);
|
|
373
380
|
|
|
381
|
+
logShellExit({
|
|
382
|
+
toolName: "bash",
|
|
383
|
+
mode: "background",
|
|
384
|
+
invocationId: bgId,
|
|
385
|
+
conversationId: context.conversationId,
|
|
386
|
+
command,
|
|
387
|
+
startedAt,
|
|
388
|
+
exitCode: code,
|
|
389
|
+
signal,
|
|
390
|
+
timedOut,
|
|
391
|
+
});
|
|
392
|
+
|
|
374
393
|
const stdout = Buffer.concat(stdoutChunks).toString();
|
|
375
394
|
const stderr = Buffer.concat(stderrChunks).toString();
|
|
376
395
|
const fmtResult = formatShellOutput(
|
|
@@ -395,6 +414,19 @@ class ShellTool implements Tool {
|
|
|
395
414
|
clearTimeout(timer);
|
|
396
415
|
removeBackgroundTool(bgId);
|
|
397
416
|
|
|
417
|
+
logShellExit({
|
|
418
|
+
toolName: "bash",
|
|
419
|
+
mode: "background",
|
|
420
|
+
invocationId: bgId,
|
|
421
|
+
conversationId: context.conversationId,
|
|
422
|
+
command,
|
|
423
|
+
startedAt,
|
|
424
|
+
exitCode: null,
|
|
425
|
+
signal: null,
|
|
426
|
+
timedOut,
|
|
427
|
+
spawnError: err.message,
|
|
428
|
+
});
|
|
429
|
+
|
|
398
430
|
const hint = `Background command failed (id=${bgId}): ${err.message}`;
|
|
399
431
|
void wakeAgentForOpportunity({
|
|
400
432
|
conversationId: context.conversationId,
|
|
@@ -408,8 +440,8 @@ class ShellTool implements Tool {
|
|
|
408
440
|
toolName: "bash",
|
|
409
441
|
conversationId: context.conversationId,
|
|
410
442
|
command,
|
|
411
|
-
startedAt
|
|
412
|
-
cancel: killTree,
|
|
443
|
+
startedAt,
|
|
444
|
+
cancel: () => killTree("abort"),
|
|
413
445
|
});
|
|
414
446
|
|
|
415
447
|
return {
|
|
@@ -425,6 +457,7 @@ class ShellTool implements Tool {
|
|
|
425
457
|
const stdoutChunks: Buffer[] = [];
|
|
426
458
|
const stderrChunks: Buffer[] = [];
|
|
427
459
|
let timedOut = false;
|
|
460
|
+
const startedAt = Date.now();
|
|
428
461
|
|
|
429
462
|
const child = spawn(wrapped.command, wrapped.args, {
|
|
430
463
|
cwd: context.workingDir,
|
|
@@ -433,18 +466,23 @@ class ShellTool implements Tool {
|
|
|
433
466
|
detached: true,
|
|
434
467
|
});
|
|
435
468
|
|
|
436
|
-
const killTree = buildKillTree(child
|
|
469
|
+
const killTree = buildKillTree(child, {
|
|
470
|
+
toolName: "bash",
|
|
471
|
+
conversationId: context.conversationId,
|
|
472
|
+
command,
|
|
473
|
+
startedAt,
|
|
474
|
+
});
|
|
437
475
|
|
|
438
476
|
const timer = setTimeout(() => {
|
|
439
477
|
timedOut = true;
|
|
440
|
-
killTree();
|
|
478
|
+
killTree("timeout");
|
|
441
479
|
}, timeoutMs);
|
|
442
480
|
|
|
443
481
|
// Cooperative cancellation via AbortSignal
|
|
444
|
-
const onAbort = () => killTree();
|
|
482
|
+
const onAbort = () => killTree("abort");
|
|
445
483
|
if (context.signal) {
|
|
446
484
|
if (context.signal.aborted) {
|
|
447
|
-
killTree();
|
|
485
|
+
killTree("abort");
|
|
448
486
|
} else {
|
|
449
487
|
context.signal.addEventListener("abort", onAbort, { once: true });
|
|
450
488
|
}
|
|
@@ -460,10 +498,21 @@ class ShellTool implements Tool {
|
|
|
460
498
|
context.onOutput?.(data.toString());
|
|
461
499
|
});
|
|
462
500
|
|
|
463
|
-
child.on("close", (code) => {
|
|
501
|
+
child.on("close", (code, signal) => {
|
|
464
502
|
clearTimeout(timer);
|
|
465
503
|
context.signal?.removeEventListener("abort", onAbort);
|
|
466
504
|
|
|
505
|
+
logShellExit({
|
|
506
|
+
toolName: "bash",
|
|
507
|
+
mode: "foreground",
|
|
508
|
+
conversationId: context.conversationId,
|
|
509
|
+
command,
|
|
510
|
+
startedAt,
|
|
511
|
+
exitCode: code,
|
|
512
|
+
signal,
|
|
513
|
+
timedOut,
|
|
514
|
+
});
|
|
515
|
+
|
|
467
516
|
const stdout = Buffer.concat(stdoutChunks).toString();
|
|
468
517
|
const stderr = Buffer.concat(stderrChunks).toString();
|
|
469
518
|
const fmtResult = formatShellOutput(
|
|
@@ -484,6 +533,19 @@ class ShellTool implements Tool {
|
|
|
484
533
|
child.on("error", (err) => {
|
|
485
534
|
clearTimeout(timer);
|
|
486
535
|
context.signal?.removeEventListener("abort", onAbort);
|
|
536
|
+
|
|
537
|
+
logShellExit({
|
|
538
|
+
toolName: "bash",
|
|
539
|
+
mode: "foreground",
|
|
540
|
+
conversationId: context.conversationId,
|
|
541
|
+
command,
|
|
542
|
+
startedAt,
|
|
543
|
+
exitCode: null,
|
|
544
|
+
signal: null,
|
|
545
|
+
timedOut,
|
|
546
|
+
spawnError: err.message,
|
|
547
|
+
});
|
|
548
|
+
|
|
487
549
|
resolve({
|
|
488
550
|
content: `Error spawning command: ${err.message}${
|
|
489
551
|
(err as NodeJS.ErrnoException).code === "ENOENT"
|
|
@@ -496,19 +558,87 @@ class ShellTool implements Tool {
|
|
|
496
558
|
});
|
|
497
559
|
|
|
498
560
|
return result;
|
|
499
|
-
}
|
|
561
|
+
},
|
|
562
|
+
} satisfies ToolDefinition;
|
|
563
|
+
|
|
564
|
+
/**
|
|
565
|
+
* Structured teardown log. Pairs with the `"Executing shell command"`
|
|
566
|
+
* start log: every shell invocation now produces a start/exit pair so
|
|
567
|
+
* orphan-leak post-mortems can correlate command + exitCode + signal +
|
|
568
|
+
* timedOut + duration without spelunking through prose hints. The
|
|
569
|
+
* `signal === "SIGKILL"` + `timedOut === true` combination is the
|
|
570
|
+
* fingerprint left by the timeout watcher SIGKILLing the process group
|
|
571
|
+
* — i.e. the moment that creates the orphans.
|
|
572
|
+
*/
|
|
573
|
+
function logShellExit(args: {
|
|
574
|
+
toolName: string;
|
|
575
|
+
mode: "foreground" | "background";
|
|
576
|
+
conversationId: string;
|
|
577
|
+
command: string;
|
|
578
|
+
startedAt: number;
|
|
579
|
+
exitCode: number | null;
|
|
580
|
+
signal: NodeJS.Signals | null;
|
|
581
|
+
timedOut: boolean;
|
|
582
|
+
invocationId?: string;
|
|
583
|
+
spawnError?: string;
|
|
584
|
+
}): void {
|
|
585
|
+
log.info(
|
|
586
|
+
{
|
|
587
|
+
toolName: args.toolName,
|
|
588
|
+
mode: args.mode,
|
|
589
|
+
invocationId: args.invocationId,
|
|
590
|
+
conversationId: args.conversationId,
|
|
591
|
+
command: redactSecrets(args.command),
|
|
592
|
+
durationMs: Date.now() - args.startedAt,
|
|
593
|
+
exitCode: args.exitCode,
|
|
594
|
+
signal: args.signal,
|
|
595
|
+
timedOut: args.timedOut,
|
|
596
|
+
spawnError: args.spawnError,
|
|
597
|
+
},
|
|
598
|
+
"Shell command exited",
|
|
599
|
+
);
|
|
500
600
|
}
|
|
501
601
|
|
|
502
602
|
/**
|
|
503
603
|
* Kill the entire process tree of a child process. Tries the process group
|
|
504
604
|
* first (negative PID), then falls back to killing the direct child if the
|
|
505
605
|
* PID is unavailable or the group kill fails.
|
|
606
|
+
*
|
|
607
|
+
* Emits a structured `warn` log on every invocation: this is the
|
|
608
|
+
* ground-truth event that creates orphaned subprocesses (the SIGKILL hits
|
|
609
|
+
* the entire group, so the immediate bash child has no chance to reap its
|
|
610
|
+
* grandchildren; under bun-as-PID-1 they accumulate as `<defunct>`).
|
|
611
|
+
* `reason` lets the next zombie report point at a specific call site (the
|
|
612
|
+
* timeout watcher in the foreground/background branches, or an abort).
|
|
506
613
|
*/
|
|
507
|
-
function buildKillTree(
|
|
508
|
-
|
|
509
|
-
|
|
614
|
+
function buildKillTree(
|
|
615
|
+
child: ChildProcess,
|
|
616
|
+
context: {
|
|
617
|
+
toolName: string;
|
|
618
|
+
conversationId: string;
|
|
619
|
+
command: string;
|
|
620
|
+
startedAt: number;
|
|
621
|
+
/** Stable id for this invocation — bgId for background tools. */
|
|
622
|
+
invocationId?: string;
|
|
623
|
+
},
|
|
624
|
+
): (reason: "timeout" | "abort" | "spawn_error") => void {
|
|
625
|
+
return (reason) => {
|
|
626
|
+
const groupPid = child.pid ?? null;
|
|
627
|
+
log.warn(
|
|
628
|
+
{
|
|
629
|
+
toolName: context.toolName,
|
|
630
|
+
conversationId: context.conversationId,
|
|
631
|
+
command: redactSecrets(context.command),
|
|
632
|
+
durationMs: Date.now() - context.startedAt,
|
|
633
|
+
reason,
|
|
634
|
+
groupPid,
|
|
635
|
+
invocationId: context.invocationId,
|
|
636
|
+
},
|
|
637
|
+
"Shell process group SIGKILL'd — orphans expected to reparent to PID 1",
|
|
638
|
+
);
|
|
639
|
+
if (groupPid != null) {
|
|
510
640
|
try {
|
|
511
|
-
process.kill(-
|
|
641
|
+
process.kill(-groupPid, "SIGKILL");
|
|
512
642
|
return;
|
|
513
643
|
} catch {
|
|
514
644
|
// Process group may have already exited — fall through.
|
|
@@ -522,5 +652,4 @@ function buildKillTree(child: ChildProcess): () => void {
|
|
|
522
652
|
};
|
|
523
653
|
}
|
|
524
654
|
|
|
525
|
-
export const shellTool: Tool = new ShellTool();
|
|
526
655
|
registerTool(shellTool);
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Single source of truth for the defaults applied when a `ToolDefinition`
|
|
3
3
|
* omits one of the normally-required fields, plus the `finalizeTool`
|
|
4
|
-
* helper that lifts a `ToolDefinition` into a `
|
|
4
|
+
* helper that lifts a `ToolDefinition` into a `Tool`.
|
|
5
5
|
*
|
|
6
6
|
* Plugins, external loaders, and any other registration boundary that
|
|
7
7
|
* accepts loose `ToolDefinition` objects from authors must run them
|
|
8
8
|
* through `finalizeTool` before handing the result to a `registerXxxTools`
|
|
9
9
|
* call. The registry types make this a hard rule: every registered tool
|
|
10
|
-
* is a `
|
|
10
|
+
* is a `Tool` (`Required<ToolDefinition>`).
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import type {
|
|
14
|
-
LoadedTool,
|
|
15
14
|
RiskLevel,
|
|
15
|
+
Tool,
|
|
16
16
|
ToolDefinition,
|
|
17
17
|
ToolExecutionResult,
|
|
18
18
|
} from "./types.js";
|
|
@@ -31,6 +31,10 @@ import type {
|
|
|
31
31
|
* - `executionTarget` defaults to `sandbox` — author-supplied tool code
|
|
32
32
|
* runs in the assistant container by default; opt in to `host` when
|
|
33
33
|
* the tool proxies work to the connected client.
|
|
34
|
+
* - `category` defaults to empty — Slack channel `allowedToolCategories`
|
|
35
|
+
* policy denies uncategorized tools when a category allow-list is set,
|
|
36
|
+
* which is the correct deny-by-default for tools the author didn't
|
|
37
|
+
* explicitly bucket.
|
|
34
38
|
*
|
|
35
39
|
* `execute` has no constant default because the default closure needs to
|
|
36
40
|
* close over the tool's name to produce a useful error message; see
|
|
@@ -45,23 +49,28 @@ export const TOOL_DEFAULTS = Object.freeze({
|
|
|
45
49
|
additionalProperties: false,
|
|
46
50
|
}) as object,
|
|
47
51
|
executionTarget: "sandbox" as const,
|
|
52
|
+
category: "",
|
|
48
53
|
});
|
|
49
54
|
|
|
50
55
|
/**
|
|
51
|
-
* Fill the
|
|
56
|
+
* Fill the five normally-required `ToolDefinition` fields with documented
|
|
52
57
|
* defaults when the author omitted them, attach the registration-time
|
|
53
|
-
* `name
|
|
58
|
+
* `name` (preferring an explicit override on the literal over the
|
|
59
|
+
* file-derived default), and return a `Tool` that is safe to hand to a
|
|
54
60
|
* `registerXxxTools` call.
|
|
55
61
|
*
|
|
62
|
+
* `defaultName` is optional — when omitted, the tool's own `name` field
|
|
63
|
+
* is the source of truth and `""` is the last-ditch fallback. The
|
|
64
|
+
* empty-string fallback is fail-loud: `registerSkillTools` rejects any
|
|
65
|
+
* tool with an empty name with a clear "tool.name is required" error.
|
|
66
|
+
*
|
|
56
67
|
* The default `execute` returns an error result so the model sees a clear
|
|
57
68
|
* "this tool isn't wired up" signal at call time. The owning loader still
|
|
58
69
|
* registers the tool cleanly — a broken individual tool must never block
|
|
59
70
|
* the registration batch.
|
|
60
71
|
*/
|
|
61
|
-
export function finalizeTool(
|
|
62
|
-
tool
|
|
63
|
-
name: string,
|
|
64
|
-
): LoadedTool {
|
|
72
|
+
export function finalizeTool(tool: ToolDefinition, defaultName = ""): Tool {
|
|
73
|
+
const name = tool.name ?? defaultName;
|
|
65
74
|
const description =
|
|
66
75
|
typeof tool.description === "string"
|
|
67
76
|
? tool.description
|
|
@@ -82,6 +91,7 @@ export function finalizeTool(
|
|
|
82
91
|
isError: true,
|
|
83
92
|
});
|
|
84
93
|
const executionTarget = tool.executionTarget ?? TOOL_DEFAULTS.executionTarget;
|
|
94
|
+
const category = tool.category ?? TOOL_DEFAULTS.category;
|
|
85
95
|
return {
|
|
86
96
|
...tool,
|
|
87
97
|
name,
|
|
@@ -90,5 +100,6 @@ export function finalizeTool(
|
|
|
90
100
|
input_schema,
|
|
91
101
|
executionTarget,
|
|
92
102
|
execute,
|
|
103
|
+
category,
|
|
93
104
|
};
|
|
94
105
|
}
|
|
@@ -28,7 +28,7 @@ import { skillLoadTool } from "./skills/load.js";
|
|
|
28
28
|
import { notifyParentTool } from "./subagent/notify-parent.js";
|
|
29
29
|
import { requestSystemPermissionTool } from "./system/request-permission.js";
|
|
30
30
|
import { shellTool } from "./terminal/shell.js";
|
|
31
|
-
import type {
|
|
31
|
+
import type { ToolDefinition } from "./types.js";
|
|
32
32
|
|
|
33
33
|
// ── Eager side-effect modules ───────────────────────────────────────
|
|
34
34
|
// These static imports trigger top-level `registerTool()` side effects on
|
|
@@ -73,7 +73,7 @@ export const eagerModuleToolNames: string[] = [
|
|
|
73
73
|
// This includes both previously-eager tools (referenced here so they survive
|
|
74
74
|
// a test registry reset) and tools that have always been explicit.
|
|
75
75
|
|
|
76
|
-
export const explicitTools:
|
|
76
|
+
export const explicitTools: ToolDefinition[] = [
|
|
77
77
|
// Previously-eager tools - kept here so initializeTools() can re-register
|
|
78
78
|
// them after __resetRegistryForTesting() clears the registry (ESM caching
|
|
79
79
|
// prevents their side-effect registrations from re-running).
|
|
@@ -108,7 +108,7 @@ export const explicitTools: Tool[] = [
|
|
|
108
108
|
// initializeTools() in registry.ts can conditionally include them.
|
|
109
109
|
|
|
110
110
|
/** All CES tools - stable references for the manifest snapshot. */
|
|
111
|
-
export const cesTools:
|
|
111
|
+
export const cesTools: ToolDefinition[] = [
|
|
112
112
|
makeAuthenticatedRequestTool,
|
|
113
113
|
runAuthenticatedCommandTool,
|
|
114
114
|
manageSecureCommandTool,
|
|
@@ -119,7 +119,7 @@ export const cesTools: Tool[] = [
|
|
|
119
119
|
* Returns an empty array when the flag is disabled so callers can
|
|
120
120
|
* unconditionally iterate the result.
|
|
121
121
|
*/
|
|
122
|
-
export function getCesToolsIfEnabled():
|
|
122
|
+
export function getCesToolsIfEnabled(): ToolDefinition[] {
|
|
123
123
|
try {
|
|
124
124
|
const config = getConfig();
|
|
125
125
|
if (isCesToolsEnabled(config)) {
|
package/src/tools/types.ts
CHANGED
|
@@ -3,13 +3,14 @@ import type {
|
|
|
3
3
|
DiffInfo,
|
|
4
4
|
ExecutionTarget,
|
|
5
5
|
ProxyApprovalCallback,
|
|
6
|
-
RiskLevel,
|
|
7
6
|
SensitiveOutputBinding,
|
|
8
7
|
ToolExecutionErrorEvent,
|
|
9
8
|
ToolExecutionStartEvent,
|
|
10
9
|
ToolPermissionDeniedEvent,
|
|
11
10
|
ToolPermissionPromptEvent,
|
|
12
11
|
} from "@vellumai/skill-host-contracts";
|
|
12
|
+
import { RiskLevel } from "@vellumai/skill-host-contracts";
|
|
13
|
+
import { z } from "zod";
|
|
13
14
|
|
|
14
15
|
import type { InterfaceId } from "../channels/types.js";
|
|
15
16
|
import type { CesClient } from "../credential-execution/client.js";
|
|
@@ -317,30 +318,84 @@ export interface ToolContext {
|
|
|
317
318
|
}
|
|
318
319
|
|
|
319
320
|
/**
|
|
320
|
-
*
|
|
321
|
-
*
|
|
322
|
-
* in `tool-defaults.ts`.
|
|
321
|
+
* Schema describing the shape of a {@link ToolDefinition}. All fields are
|
|
322
|
+
* optional — loaders fill documented defaults for omitted fields via
|
|
323
|
+
* `finalizeTool` in `tool-defaults.ts`. The IPC layer parses incoming
|
|
324
|
+
* skill tools against this same schema and re-finalizes them locally,
|
|
325
|
+
* so author shape and wire shape are one schema.
|
|
326
|
+
*
|
|
327
|
+
* `input_schema` is `z.custom<object>(...)` rather than
|
|
328
|
+
* `z.record(z.string(), z.unknown())` so that authors can assign a typed
|
|
329
|
+
* JSON-schema literal (`{ type: "object", properties: { ... } }`)
|
|
330
|
+
* without `as Record<...>` gymnastics. The custom check still rejects
|
|
331
|
+
* `null`, primitives, and arrays at runtime.
|
|
332
|
+
*
|
|
333
|
+
* `execute` is `z.custom<(input, context) => Promise<ToolExecutionResult>>()`
|
|
334
|
+
* for the same reason — the wire path drops closures (they can't cross
|
|
335
|
+
* IPC) and `finalizeTool` synthesizes a no-op error closure on arrival.
|
|
336
|
+
* The custom shape gives `ToolDefinition.execute` a fully-typed
|
|
337
|
+
* signature via `z.infer` without an overlay type.
|
|
338
|
+
*
|
|
339
|
+
* Result: `ToolDefinition = z.infer<typeof ToolDefinitionSchema>` —
|
|
340
|
+
* one declaration, both `input_schema` and `execute` typed correctly.
|
|
323
341
|
*/
|
|
324
|
-
export
|
|
342
|
+
export const ToolDefinitionSchema = z.object({
|
|
343
|
+
/**
|
|
344
|
+
* Name the model sees when calling this tool. Loaders default to the
|
|
345
|
+
* source file basename (e.g. `tools/read.ts` → `read`) when omitted,
|
|
346
|
+
* so the literal only needs to set this when overriding the
|
|
347
|
+
* file-derived name.
|
|
348
|
+
*/
|
|
349
|
+
name: z.string().min(1).optional(),
|
|
325
350
|
/** Human-readable description shown to the model in the tool catalog. */
|
|
326
|
-
description
|
|
327
|
-
/** Author-asserted risk band — low / medium / high. Drives default permission gating. */
|
|
328
|
-
defaultRiskLevel?: RiskLevel;
|
|
351
|
+
description: z.string().optional(),
|
|
329
352
|
/** JSON schema describing the tool's input arguments. */
|
|
330
|
-
input_schema
|
|
353
|
+
input_schema: z
|
|
354
|
+
.custom<object>(
|
|
355
|
+
(val) => val !== null && typeof val === "object" && !Array.isArray(val),
|
|
356
|
+
{ message: "input_schema must be a plain object" },
|
|
357
|
+
)
|
|
358
|
+
.optional(),
|
|
359
|
+
/** Author-asserted risk band — low / medium / high. Drives default permission gating. */
|
|
360
|
+
defaultRiskLevel: z.enum(RiskLevel).optional(),
|
|
361
|
+
/** Tool category used for Slack channel `allowedToolCategories` enforcement. */
|
|
362
|
+
category: z.string().min(1).optional(),
|
|
331
363
|
/** Where the tool runs — sandbox (assistant container) or host (guardian device via proxy). Resolved by `resolveExecutionTarget` if omitted. */
|
|
332
|
-
executionTarget
|
|
333
|
-
/**
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
}
|
|
364
|
+
executionTarget: z.enum(["sandbox", "host"]).optional(),
|
|
365
|
+
/**
|
|
366
|
+
* Implementation invoked when the model calls the tool. Optional
|
|
367
|
+
* because some `ToolDefinition` instances are schema-only (e.g.
|
|
368
|
+
* {@link ../memory/graph/tools.graphRememberDefinition},
|
|
369
|
+
* {@link ../messaging/style-analyzer.storeStyleAnalysisTool},
|
|
370
|
+
* {@link ../memory/v2/sweep-job.SWEEP_TOOL}) — handed to providers as
|
|
371
|
+
* a function-calling schema without ever being registered for
|
|
372
|
+
* execution. Closures can't cross IPC, so the wire path drops this
|
|
373
|
+
* and `finalizeTool` synthesizes a no-op error closure on arrival.
|
|
374
|
+
* Tool sources use `satisfies ToolDefinition` (not `: ToolDefinition`)
|
|
375
|
+
* so the inferred export type preserves `execute` as required at
|
|
376
|
+
* call sites that statically import the literal.
|
|
377
|
+
*/
|
|
378
|
+
execute: z
|
|
379
|
+
.custom<
|
|
380
|
+
(
|
|
381
|
+
input: Record<string, unknown>,
|
|
382
|
+
context: ToolContext,
|
|
383
|
+
) => Promise<ToolExecutionResult>
|
|
384
|
+
>()
|
|
385
|
+
.optional(),
|
|
386
|
+
});
|
|
387
|
+
|
|
388
|
+
/**
|
|
389
|
+
* Author-facing tool spec — re-exported from `@vellumai/plugin-api`.
|
|
390
|
+
* Loaders fill documented defaults for omitted fields via `finalizeTool`
|
|
391
|
+
* in `tool-defaults.ts`. The type is a direct `z.infer` of
|
|
392
|
+
* {@link ToolDefinitionSchema} — both `input_schema` and `execute` are
|
|
393
|
+
* typed correctly by the schema itself, no overlay needed.
|
|
394
|
+
*/
|
|
395
|
+
export type ToolDefinition = z.infer<typeof ToolDefinitionSchema>;
|
|
339
396
|
|
|
340
397
|
/** Tool after the loader has derived its name and filled defaults. */
|
|
341
|
-
export type
|
|
342
|
-
name: string;
|
|
343
|
-
};
|
|
398
|
+
export type Tool = Required<ToolDefinition>;
|
|
344
399
|
|
|
345
400
|
/** The kind of extension that owns a tool. Core tools have no owner. */
|
|
346
401
|
export type OwnerKind = "skill" | "mcp" | "plugin";
|
|
@@ -355,7 +410,3 @@ export interface OwnerInfo {
|
|
|
355
410
|
/** ID of the owning extension (skill id / plugin name / MCP server id). */
|
|
356
411
|
id: string;
|
|
357
412
|
}
|
|
358
|
-
|
|
359
|
-
export interface Tool extends LoadedTool {
|
|
360
|
-
category: string;
|
|
361
|
-
}
|