@vellumai/assistant 0.8.10 → 0.8.11-staging.1
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/bun.lock +62 -1
- package/docs/workspace-tools.md +196 -0
- package/examples/plugins/echo/README.md +3 -3
- package/knip.json +1 -0
- package/openapi.yaml +460 -128
- package/package.json +2 -1
- package/scripts/build-plugin-api.ts +299 -0
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +7 -0
- package/src/__tests__/agent-loop-compaction-events.test.ts +197 -0
- package/src/__tests__/agent-loop-exit-reason.test.ts +93 -96
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +2 -0
- package/src/__tests__/agent-loop-output-hooks.test.ts +274 -1
- package/src/__tests__/agent-loop-override-profile.test.ts +3 -0
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +4 -0
- package/src/__tests__/agent-loop-thinking.test.ts +4 -0
- package/src/__tests__/agent-loop.test.ts +578 -5
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +0 -1
- package/src/__tests__/approval-cascade.test.ts +1 -0
- package/src/__tests__/background-workers-disk-pressure.test.ts +0 -2
- package/src/__tests__/btw-routes.test.ts +0 -1
- package/src/__tests__/build-persisted-content.test.ts +75 -1
- package/src/__tests__/catalog-install-normalize.test.ts +141 -0
- package/src/__tests__/ces-startup-timeout.test.ts +60 -0
- package/src/__tests__/compaction-events.test.ts +1 -0
- package/src/__tests__/config-managed-gemini-defaults.test.ts +2 -46
- package/src/__tests__/context-overflow-reducer.test.ts +264 -124
- package/src/__tests__/context-window-manager-overflow-rung.test.ts +351 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +13 -5
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +284 -455
- package/src/__tests__/conversation-agent-loop.test.ts +131 -551
- package/src/__tests__/conversation-app-control-instantiation.test.ts +13 -0
- package/src/__tests__/conversation-confirmation-signals.test.ts +1 -0
- package/src/__tests__/conversation-fork-crud.test.ts +259 -0
- package/src/__tests__/conversation-history-web-search.test.ts +1 -1
- package/src/__tests__/conversation-lifecycle.test.ts +257 -1
- package/src/__tests__/conversation-process-callsite.test.ts +1 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +38 -377
- package/src/__tests__/conversation-queue.test.ts +1 -39
- package/src/__tests__/conversation-runtime-assembly.test.ts +119 -8
- package/src/__tests__/conversation-skill-tools.test.ts +491 -5
- package/src/__tests__/conversation-slash-queue.test.ts +1 -1
- package/src/__tests__/conversation-slash-unknown.test.ts +1 -0
- package/src/__tests__/conversation-speed-override.test.ts +1 -0
- package/src/__tests__/conversation-store.test.ts +74 -0
- package/src/__tests__/conversation-surfaces-app-control.test.ts +4 -1
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +323 -0
- package/src/__tests__/conversation-tool-setup-tools-disabled.test.ts +34 -0
- package/src/__tests__/conversation-workspace-cache-state.test.ts +1 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +1 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -0
- package/src/__tests__/corrected-target.test.ts +93 -0
- package/src/__tests__/credential-execution-feature-gates.test.ts +3 -5
- package/src/__tests__/credential-execution-tools.test.ts +23 -11
- package/src/__tests__/credential-security-invariants.test.ts +6 -1
- package/src/__tests__/db-schedule-syntax-migration.test.ts +80 -0
- package/src/__tests__/device-id.test.ts +70 -1
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +6 -40
- package/src/__tests__/empty-response-hook.test.ts +242 -66
- package/src/__tests__/external-plugin-loader.test.ts +0 -31
- package/src/__tests__/get-skill-detail-audit.test.ts +43 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +91 -0
- package/src/__tests__/history-repair-hook.test.ts +228 -3
- package/src/__tests__/host-app-control-proxy.test.ts +45 -0
- package/src/__tests__/host-browser-proxy.test.ts +254 -9
- package/src/__tests__/identity-routes.test.ts +1 -0
- package/src/__tests__/image-recovery-hook.test.ts +387 -0
- package/src/__tests__/injector-chain.test.ts +5 -4
- package/src/__tests__/injector-v3-suppression.test.ts +373 -47
- package/src/__tests__/intent-routing.test.ts +7 -0
- package/src/__tests__/memory-retrieval-hook.test.ts +117 -15
- package/src/__tests__/notification-decision-strategy.test.ts +3 -3
- package/src/__tests__/oauth-store.test.ts +0 -85
- package/src/__tests__/{context-overflow-policy.test.ts → overflow-policy.test.ts} +1 -1
- package/src/__tests__/parallel-tool.benchmark.test.ts +4 -0
- package/src/__tests__/persist-unsendable-image-downscale.test.ts +29 -9
- package/src/__tests__/persist-unsendable-image.test.ts +4 -4
- package/src/__tests__/persistence-secret-redaction.test.ts +78 -0
- package/src/__tests__/plugin-bootstrap.test.ts +82 -73
- package/src/__tests__/plugin-tool-contribution.test.ts +7 -4
- package/src/__tests__/plugin-types.test.ts +0 -8
- package/src/__tests__/provider-catalog-visibility.test.ts +1 -9
- package/src/__tests__/prune-old-conversations-job.test.ts +99 -0
- package/src/__tests__/registry.test.ts +240 -1
- package/src/__tests__/require-fresh-approval.test.ts +3 -0
- package/src/__tests__/schedule-routes.test.ts +116 -1
- package/src/__tests__/schedule-store.test.ts +28 -0
- package/src/__tests__/schedule-tools.test.ts +94 -1
- package/src/__tests__/server-history-render.test.ts +39 -0
- package/src/__tests__/skill-projection-feature-flag.test.ts +13 -0
- package/src/__tests__/skill-projection.benchmark.test.ts +25 -7
- package/src/__tests__/skills.test.ts +202 -0
- package/src/__tests__/slim-skill-category.test.ts +195 -0
- package/src/__tests__/strip-memory-injections.test.ts +33 -39
- package/src/__tests__/test-support/tool-invocation-seed.ts +79 -0
- package/src/__tests__/title-generate-hook.test.ts +9 -7
- package/src/__tests__/tool-audit-listener.test.ts +264 -1
- package/src/__tests__/tool-error-hook.test.ts +4 -3
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +1 -0
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +273 -0
- package/src/__tests__/tool-result-truncate-hook.test.ts +1 -0
- package/src/__tests__/tool-start-timestamp.test.ts +218 -0
- package/src/__tests__/tools-get-route.test.ts +202 -0
- package/src/__tests__/workspace-tool-loader.test.ts +319 -0
- package/src/__tests__/workspace-tools-watcher-flag.test.ts +70 -0
- package/src/agent/loop.ts +569 -319
- package/src/api/events/tool-result.ts +9 -0
- package/src/api/events/tool-use-start.ts +7 -0
- package/src/api/index.ts +10 -0
- package/src/api/responses/conversation-message.ts +135 -27
- package/src/api/responses/memory-v3-selection-log.ts +4 -4
- package/src/approvals/guardian-request-resolvers.ts +26 -0
- package/src/browser-session/backends/host-bridge.ts +29 -0
- package/src/browser-session/index.ts +1 -0
- package/src/browser-session/types.ts +5 -1
- package/src/cli/commands/__tests__/schedules.test.ts +62 -4
- package/src/cli/commands/__tests__/skills.test.ts +53 -0
- package/src/cli/commands/channel-verification-sessions.ts +6 -6
- package/src/cli/commands/inference-providers.ts +0 -8
- package/src/cli/commands/plugins.ts +2 -2
- package/src/cli/commands/schedules.ts +27 -4
- package/src/cli/commands/skills.ts +187 -146
- package/src/cli/commands/tools.ts +106 -0
- package/src/cli/lib/__tests__/install-from-github.test.ts +256 -328
- package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +6 -2
- package/src/cli/lib/__tests__/plugin-details.test.ts +10 -16
- package/src/cli/lib/__tests__/plugin-marketplace.test.ts +2 -2
- package/src/cli/lib/__tests__/search-plugins.test.ts +145 -240
- package/src/cli/lib/install-from-github.ts +187 -117
- package/src/cli/lib/plugin-catalog-cache.ts +9 -9
- package/src/cli/lib/plugin-details.ts +38 -68
- package/src/cli/lib/plugin-marketplace.ts +42 -14
- package/src/cli/lib/search-plugins.ts +29 -129
- package/src/cli/program.ts +2 -0
- package/src/config/bundled-skills/acp/SKILL.md +1 -0
- package/src/config/bundled-skills/app-builder/SKILL.md +1 -0
- package/src/config/bundled-skills/app-control/SKILL.md +1 -0
- package/src/config/bundled-skills/computer-use/SKILL.md +1 -0
- package/src/config/bundled-skills/contacts/SKILL.md +1 -0
- package/src/config/bundled-skills/document-editor/SKILL.md +1 -0
- package/src/config/bundled-skills/followups/SKILL.md +1 -0
- package/src/config/bundled-skills/image-studio/SKILL.md +1 -0
- package/src/config/bundled-skills/media-processing/SKILL.md +1 -0
- package/src/config/bundled-skills/messaging/SKILL.md +1 -0
- package/src/config/bundled-skills/phone-calls/SKILL.md +1 -0
- package/src/config/bundled-skills/playbooks/SKILL.md +1 -0
- package/src/config/bundled-skills/schedule/SKILL.md +1 -0
- package/src/config/bundled-skills/schedule/TOOLS.json +11 -3
- package/src/config/bundled-skills/sequences/SKILL.md +1 -0
- package/src/config/bundled-skills/settings/SKILL.md +1 -0
- package/src/config/bundled-skills/skill-management/SKILL.md +101 -1
- package/src/config/bundled-skills/subagent/SKILL.md +1 -0
- package/src/config/bundled-skills/transcribe/SKILL.md +1 -0
- package/src/config/env-registry.ts +23 -0
- package/src/config/feature-flag-registry.json +17 -81
- package/src/config/loader.ts +5 -22
- package/src/config/schema.ts +2 -0
- package/src/config/schemas/__tests__/compaction-logs.test.ts +56 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +0 -1
- package/src/config/schemas/__tests__/memory-v3.test.ts +61 -1
- package/src/config/schemas/compaction-logs.ts +79 -0
- package/src/config/schemas/memory-v2.ts +0 -8
- package/src/config/schemas/memory-v3.ts +104 -33
- package/src/config/seed-inference-profiles.ts +1 -1
- package/src/config/skills.ts +117 -47
- package/src/context/compactor.ts +11 -0
- package/src/context/strip-injections.ts +38 -4
- package/src/credential-execution/feature-gates.ts +0 -21
- package/src/credential-execution/startup-timeout.ts +32 -4
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +18 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +140 -91
- package/src/daemon/conversation-agent-loop.ts +123 -658
- package/src/daemon/conversation-error.ts +6 -33
- package/src/daemon/conversation-lifecycle.ts +1 -1
- package/src/daemon/conversation-runtime-assembly.ts +183 -22
- package/src/daemon/conversation-skill-tools.ts +137 -8
- package/src/daemon/conversation-slash.ts +0 -14
- package/src/daemon/conversation-store.ts +2 -19
- package/src/daemon/conversation-tool-setup.ts +87 -1
- package/src/daemon/conversation.ts +119 -50
- package/src/daemon/external-plugins-bootstrap.ts +36 -95
- package/src/daemon/handlers/config-channels.ts +11 -2
- package/src/daemon/handlers/shared.ts +9 -1
- package/src/daemon/handlers/skills.ts +10 -4
- package/src/daemon/host-app-control-proxy.ts +72 -57
- package/src/daemon/host-browser-proxy.ts +117 -22
- package/src/daemon/lifecycle.ts +34 -5
- package/src/daemon/message-protocol.ts +0 -7
- package/src/daemon/message-types/schedules.ts +1 -0
- package/src/daemon/message-types/skills.ts +17 -0
- package/src/daemon/providers-setup.ts +3 -0
- package/src/daemon/server.ts +3 -3
- package/src/daemon/tool-setup-types.ts +9 -3
- package/src/daemon/trust-context.ts +23 -0
- package/src/daemon/workspace-tools-watcher.ts +324 -0
- package/src/events/tool-audit-listener.ts +78 -16
- package/src/events/tool-metrics-listener.ts +2 -5
- package/src/memory/__tests__/compaction-log-writer-clickhouse.test.ts +227 -0
- package/src/memory/__tests__/conversation-queries.test.ts +176 -0
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +20 -32
- package/src/memory/compaction-log-writer-clickhouse.ts +418 -0
- package/src/memory/conversation-crud.ts +134 -3
- package/src/memory/conversation-queries.ts +64 -7
- package/src/memory/db-init.ts +14 -0
- package/src/memory/embedding-backend.test.ts +130 -1
- package/src/memory/embedding-backend.ts +79 -106
- package/src/memory/embedding-gemini.ts +5 -0
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +12 -0
- package/src/memory/graph/__tests__/handle-remember-v2.test.ts +19 -0
- package/src/memory/graph/conversation-graph-memory.ts +36 -25
- package/src/memory/graph/tool-handlers.ts +3 -0
- package/src/memory/job-handlers/cleanup.ts +3 -1
- package/src/memory/jobs-store.ts +0 -28
- package/src/memory/jobs-worker.ts +10 -22
- package/src/memory/memory-marker.ts +29 -0
- package/src/memory/memory-retrospective-startup-cleanup.ts +1 -1
- package/src/memory/migrations/268-add-memory-v3-selections.ts +6 -0
- package/src/memory/migrations/270-schedule-description.ts +36 -0
- package/src/memory/migrations/275-tool-invocations-add-skill-id.test.ts +81 -0
- package/src/memory/migrations/275-tool-invocations-add-skill-id.ts +20 -0
- package/src/memory/migrations/276-tool-invocations-created-at-id-index.test.ts +68 -0
- package/src/memory/migrations/276-tool-invocations-created-at-id-index.ts +20 -0
- package/src/memory/migrations/277-add-memory-v3-ever-injected.ts +29 -0
- package/src/memory/migrations/278-tool-invocations-telemetry-columns.test.ts +96 -0
- package/src/memory/migrations/278-tool-invocations-telemetry-columns.ts +39 -0
- package/src/memory/migrations/279-create-skill-loaded-events.test.ts +84 -0
- package/src/memory/migrations/279-create-skill-loaded-events.ts +26 -0
- package/src/memory/migrations/280-conversations-surfaced-at.test.ts +88 -0
- package/src/memory/migrations/280-conversations-surfaced-at.ts +24 -0
- package/src/memory/migrations/index.ts +10 -0
- package/src/memory/migrations/registry.ts +8 -0
- package/src/memory/schema/conversations.ts +16 -0
- package/src/memory/schema/infrastructure.ts +26 -0
- package/src/memory/skill-loaded-events-store.test.ts +160 -0
- package/src/memory/skill-loaded-events-store.ts +95 -0
- package/src/memory/tool-executed-events-store.test.ts +219 -0
- package/src/memory/tool-executed-events-store.ts +102 -0
- package/src/memory/tool-usage-store.ts +15 -3
- package/src/memory/v2/__tests__/consolidation-job.test.ts +117 -12
- package/src/memory/v2/__tests__/consolidation-prompt-flag-gating-guard.test.ts +189 -0
- package/src/memory/v2/__tests__/injected-block-slugs.test.ts +90 -0
- package/src/memory/v2/__tests__/page-store.test.ts +33 -0
- package/src/memory/v2/__tests__/prompts-consolidation.test.ts +88 -15
- package/src/memory/v2/activation-store.ts +50 -1
- package/src/memory/v2/consolidation-job.ts +113 -29
- package/src/memory/v2/injected-block-slugs.ts +79 -0
- package/src/memory/v2/injection.ts +6 -1
- package/src/memory/v2/prompts/consolidation.ts +414 -13
- package/src/memory/v2/router.ts +2 -28
- package/src/memory/v2/static-context.ts +1 -1
- package/src/memory/v2/types.ts +16 -0
- package/src/notifications/__tests__/copy-composer.test.ts +244 -0
- package/src/notifications/access-request-copy.ts +298 -0
- package/src/notifications/adapters/slack.ts +3 -3
- package/src/notifications/adapters/telegram.ts +2 -1
- package/src/notifications/copy-composer.ts +49 -267
- package/src/notifications/decision-engine.ts +16 -35
- package/src/notifications/home-feed-side-effect.ts +1 -6
- package/src/oauth/oauth-store.ts +0 -9
- package/src/permissions/checker.test.ts +83 -1
- package/src/permissions/checker.ts +25 -2
- package/src/permissions/gateway-threshold-reader.test.ts +182 -0
- package/src/permissions/gateway-threshold-reader.ts +80 -0
- package/src/platform/client.ts +1 -3
- package/src/platform/feature-gate.ts +3 -12
- package/src/plugin-api/constants.ts +4 -2
- package/src/plugin-api/index.ts +63 -11
- package/src/plugin-api/types.ts +236 -71
- package/src/plugins/defaults/compaction/compact.ts +66 -2
- package/src/plugins/defaults/compaction/context-overflow-reducer.ts +240 -32
- package/src/plugins/defaults/compaction/corrected-target.ts +53 -0
- package/src/{daemon/context-overflow-policy.ts → plugins/defaults/compaction/overflow-policy.ts} +1 -1
- package/src/plugins/defaults/compaction/window-manager.ts +303 -1
- package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +173 -0
- package/src/plugins/defaults/empty-response/hooks/stop.ts +11 -115
- package/src/plugins/defaults/empty-response/nudge-state-store.ts +46 -0
- package/src/plugins/defaults/history-repair/hooks/post-model-call.ts +50 -0
- package/src/plugins/defaults/history-repair/hooks/stop.ts +22 -0
- package/src/plugins/defaults/history-repair/repair-state-store.ts +51 -0
- package/src/plugins/defaults/history-repair/terminal.ts +39 -2
- package/src/plugins/defaults/image-recovery/detect.ts +25 -0
- package/src/plugins/defaults/image-recovery/hooks/post-model-call.ts +73 -0
- package/src/plugins/defaults/image-recovery/hooks/stop.ts +22 -0
- package/src/plugins/defaults/image-recovery/image-recovery-state-store.ts +48 -0
- package/src/plugins/defaults/image-recovery/package.json +14 -0
- package/src/{daemon/persist-unsendable-image.ts → plugins/defaults/image-recovery/recover.ts} +67 -14
- package/src/plugins/defaults/index.ts +71 -5
- package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +76 -112
- package/src/plugins/defaults/memory-retrieval/hooks/{user-prompt-submit-temp.ts → user-prompt-submit.ts} +83 -74
- package/src/plugins/defaults/memory-retrieval/injector-chain.ts +14 -8
- package/src/plugins/defaults/memory-retrieval/injectors.ts +2 -18
- package/src/plugins/defaults/memory-retrieval/package.json +14 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/carry-integration.test.ts +1157 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/injection.test.ts +683 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/live-integration.test.ts +161 -140
- package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +160 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +335 -316
- package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +145 -53
- package/src/plugins/defaults/memory-v3-shadow/__tests__/render-injection.test.ts +38 -1
- package/src/plugins/defaults/memory-v3-shadow/__tests__/selection-log-store.test.ts +18 -8
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-integration.test.ts +112 -71
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +192 -51
- package/src/plugins/defaults/memory-v3-shadow/__tests__/types.test.ts +4 -16
- package/src/plugins/defaults/memory-v3-shadow/card.test.ts +173 -0
- package/src/plugins/defaults/memory-v3-shadow/card.ts +116 -0
- package/src/plugins/defaults/memory-v3-shadow/core-set.test.ts +104 -0
- package/src/plugins/defaults/memory-v3-shadow/core-set.ts +59 -0
- package/src/plugins/defaults/memory-v3-shadow/ever-injected-store.test.ts +305 -0
- package/src/plugins/defaults/memory-v3-shadow/ever-injected-store.ts +278 -0
- package/src/plugins/defaults/memory-v3-shadow/hot-set.test.ts +138 -0
- package/src/plugins/defaults/memory-v3-shadow/hot-set.ts +85 -0
- package/src/plugins/defaults/memory-v3-shadow/injector.ts +331 -24
- package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +119 -13
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +169 -114
- package/src/plugins/defaults/memory-v3-shadow/page-content.ts +47 -16
- package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +144 -66
- package/src/plugins/defaults/memory-v3-shadow/prune.test.ts +758 -0
- package/src/plugins/defaults/memory-v3-shadow/prune.ts +471 -0
- package/src/plugins/defaults/memory-v3-shadow/render-injection.ts +68 -16
- package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +19 -12
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +96 -43
- package/src/plugins/defaults/memory-v3-shadow/types.ts +34 -17
- package/src/plugins/defaults/title-generate/hooks/stop.ts +9 -11
- package/src/plugins/pipeline.ts +8 -5
- package/src/plugins/types.ts +5 -51
- package/src/providers/cache-control.ts +26 -0
- package/src/providers/inference/__tests__/base-url-route-validation.test.ts +1 -2
- package/src/providers/model-catalog.ts +13 -1
- package/src/providers/openai/__tests__/tool-choice-mapping.test.ts +147 -0
- package/src/providers/openai/chat-completions-provider.ts +46 -0
- package/src/providers/openai/responses-provider.ts +45 -0
- package/src/providers/registry.ts +0 -8
- package/src/runtime/__tests__/agent-wake.test.ts +0 -1
- package/src/runtime/agent-wake.ts +13 -0
- package/src/runtime/routes/__tests__/acp-routes.test.ts +151 -0
- package/src/runtime/routes/__tests__/consolidation-routes.test.ts +12 -50
- package/src/runtime/routes/__tests__/conversation-surface-routes.test.ts +322 -0
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +0 -62
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +31 -11
- package/src/runtime/routes/acp-routes.test.ts +106 -0
- package/src/runtime/routes/acp-routes.ts +248 -2
- package/src/runtime/routes/browser-tabs-routes.ts +1 -1
- package/src/runtime/routes/channel-verification-routes.ts +14 -5
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +0 -14
- package/src/runtime/routes/consolidation-routes.ts +6 -82
- package/src/runtime/routes/conversation-list-routes.ts +6 -0
- package/src/runtime/routes/conversation-management-routes.ts +71 -0
- package/src/runtime/routes/identity-routes.ts +8 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +33 -34
- package/src/runtime/routes/inference-provider-connection-routes.ts +0 -45
- package/src/runtime/routes/plugins-routes.ts +34 -45
- package/src/runtime/routes/schedule-routes.ts +43 -5
- package/src/runtime/routes/settings-routes.ts +140 -15
- package/src/runtime/routes/skills-routes.ts +18 -6
- package/src/runtime/services/__tests__/conversation-serializer.test.ts +140 -0
- package/src/runtime/services/conversation-serializer.ts +38 -1
- package/src/runtime/verification-outbound-actions.ts +147 -2
- package/src/runtime/verification-templates.ts +29 -3
- package/src/schedule/schedule-store.ts +19 -0
- package/src/skills/catalog-install.ts +77 -13
- package/src/tasks/task-scheduler.ts +1 -0
- package/src/telemetry/types.ts +66 -1
- package/src/telemetry/usage-telemetry-reporter.test.ts +542 -13
- package/src/telemetry/usage-telemetry-reporter.ts +213 -20
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +49 -2
- package/src/tools/browser/__tests__/browser-status.test.ts +29 -5
- package/src/tools/browser/browser-execution.ts +27 -9
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +380 -4
- package/src/tools/browser/cdp-client/__tests__/host-bridge-cdp-client.test.ts +107 -0
- package/src/tools/browser/cdp-client/__tests__/types.test.ts +6 -1
- package/src/tools/browser/cdp-client/factory.ts +217 -17
- package/src/tools/browser/cdp-client/host-bridge-cdp-client.ts +67 -0
- package/src/tools/browser/cdp-client/types.ts +22 -2
- package/src/tools/credential-execution/make-authenticated-request.ts +2 -1
- package/src/tools/credential-execution/manage-secure-command-tool.ts +169 -164
- package/src/tools/credential-execution/run-authenticated-command.ts +2 -1
- package/src/tools/executor.ts +39 -7
- package/src/tools/registry.ts +387 -5
- package/src/tools/schedule/create.ts +16 -0
- package/src/tools/schedule/list.ts +12 -4
- package/src/tools/schedule/update.ts +12 -0
- package/src/tools/skills/load.ts +11 -6
- package/src/tools/terminal/safe-env.ts +2 -0
- package/src/tools/types.ts +65 -9
- package/src/tools/workspace-tools/loader.ts +673 -0
- package/src/usage/attribution.ts +28 -0
- package/src/util/device-id.ts +17 -3
- package/src/util/platform.ts +16 -0
- package/tsconfig.plugin-api.json +13 -0
- package/src/__tests__/plugin-external-api.test.ts +0 -68
- package/src/__tests__/plugin-skill-contribution.test.ts +0 -355
- package/src/daemon/message-types/browser.ts +0 -10
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +0 -187
- package/src/plugins/defaults/memory-v3-shadow/__tests__/fixtures/eval-turns.json +0 -36
- package/src/plugins/defaults/memory-v3-shadow/__tests__/fixtures/live-turns.json +0 -37
- package/src/plugins/defaults/memory-v3-shadow/__tests__/working-set-eviction.test.ts +0 -106
- package/src/plugins/defaults/memory-v3-shadow/__tests__/working-set-skeleton.test.ts +0 -44
- package/src/plugins/defaults/memory-v3-shadow/working-set.ts +0 -91
- package/src/plugins/external-api.ts +0 -114
- package/src/plugins/plugin-skill-contributions.ts +0 -292
|
@@ -18,8 +18,13 @@
|
|
|
18
18
|
import type { ManageSecureCommandTool } from "@vellumai/service-contracts/rpc";
|
|
19
19
|
|
|
20
20
|
import { RiskLevel } from "../../permissions/types.js";
|
|
21
|
+
import { getCesClient } from "../../security/secure-keys.js";
|
|
21
22
|
import { getLogger } from "../../util/logger.js";
|
|
22
|
-
import type {
|
|
23
|
+
import type {
|
|
24
|
+
ToolContext,
|
|
25
|
+
ToolDefinition,
|
|
26
|
+
ToolExecutionResult,
|
|
27
|
+
} from "../types.js";
|
|
23
28
|
|
|
24
29
|
const log = getLogger("ces-tool:manage-secure-command-tool");
|
|
25
30
|
|
|
@@ -34,211 +39,211 @@ class ManageSecureCommandToolImpl implements ToolDefinition {
|
|
|
34
39
|
defaultRiskLevel = RiskLevel.High;
|
|
35
40
|
|
|
36
41
|
input_schema = {
|
|
42
|
+
type: "object",
|
|
43
|
+
properties: {
|
|
44
|
+
action: {
|
|
45
|
+
type: "string",
|
|
46
|
+
enum: ["register", "unregister"],
|
|
47
|
+
description:
|
|
48
|
+
'Whether to install/update ("register") or remove ("unregister") the secure command tool.',
|
|
49
|
+
},
|
|
50
|
+
toolName: {
|
|
51
|
+
type: "string",
|
|
52
|
+
description:
|
|
53
|
+
"Unique tool name for the secure command (e.g. aws-cli, kubectl).",
|
|
54
|
+
},
|
|
55
|
+
bundleId: {
|
|
56
|
+
type: "string",
|
|
57
|
+
description:
|
|
58
|
+
"Bundle identifier for the secure command package (required for register).",
|
|
59
|
+
},
|
|
60
|
+
version: {
|
|
61
|
+
type: "string",
|
|
62
|
+
description:
|
|
63
|
+
"Semantic version of the bundle to install (required for register).",
|
|
64
|
+
},
|
|
65
|
+
sourceUrl: {
|
|
66
|
+
type: "string",
|
|
67
|
+
description:
|
|
68
|
+
"URL from which CES will download the bundle (required for register). Must be HTTPS.",
|
|
69
|
+
},
|
|
70
|
+
sha256: {
|
|
71
|
+
type: "string",
|
|
72
|
+
description:
|
|
73
|
+
"SHA-256 hash of the bundle for integrity verification (required for register).",
|
|
74
|
+
},
|
|
75
|
+
credentialHandle: {
|
|
76
|
+
type: "string",
|
|
77
|
+
description:
|
|
78
|
+
"CES credential handle the tool should use (required for register).",
|
|
79
|
+
},
|
|
80
|
+
description: {
|
|
81
|
+
type: "string",
|
|
82
|
+
description:
|
|
83
|
+
"Human-readable description of what the secure command tool does (required for register).",
|
|
84
|
+
},
|
|
85
|
+
secureCommandManifest: {
|
|
37
86
|
type: "object",
|
|
87
|
+
description:
|
|
88
|
+
"Full secure command manifest for the bundle (required for register). " +
|
|
89
|
+
"Contains entrypoint, command profiles, auth adapter, egress mode, etc. " +
|
|
90
|
+
"CES validates this manifest before publishing the bundle.",
|
|
38
91
|
properties: {
|
|
39
|
-
|
|
92
|
+
schemaVersion: {
|
|
40
93
|
type: "string",
|
|
41
|
-
|
|
42
|
-
description:
|
|
43
|
-
'Whether to install/update ("register") or remove ("unregister") the secure command tool.',
|
|
94
|
+
description: 'Manifest schema version. Must be "1".',
|
|
44
95
|
},
|
|
45
|
-
|
|
96
|
+
bundleDigest: {
|
|
46
97
|
type: "string",
|
|
47
|
-
description:
|
|
48
|
-
"Unique tool name for the secure command (e.g. aws-cli, kubectl).",
|
|
98
|
+
description: "SHA-256 hex digest of the command bundle.",
|
|
49
99
|
},
|
|
50
100
|
bundleId: {
|
|
51
101
|
type: "string",
|
|
52
|
-
description:
|
|
53
|
-
"Bundle identifier for the secure command package (required for register).",
|
|
102
|
+
description: "Unique identifier for the command bundle.",
|
|
54
103
|
},
|
|
55
104
|
version: {
|
|
56
105
|
type: "string",
|
|
57
|
-
description:
|
|
58
|
-
"Semantic version of the bundle to install (required for register).",
|
|
59
|
-
},
|
|
60
|
-
sourceUrl: {
|
|
61
|
-
type: "string",
|
|
62
|
-
description:
|
|
63
|
-
"URL from which CES will download the bundle (required for register). Must be HTTPS.",
|
|
64
|
-
},
|
|
65
|
-
sha256: {
|
|
66
|
-
type: "string",
|
|
67
|
-
description:
|
|
68
|
-
"SHA-256 hash of the bundle for integrity verification (required for register).",
|
|
106
|
+
description: "Semantic version of the bundle.",
|
|
69
107
|
},
|
|
70
|
-
|
|
108
|
+
entrypoint: {
|
|
71
109
|
type: "string",
|
|
72
110
|
description:
|
|
73
|
-
|
|
111
|
+
'Path to the executable entrypoint within the bundle (e.g. "bin/gh").',
|
|
74
112
|
},
|
|
75
|
-
|
|
76
|
-
type: "
|
|
113
|
+
commandProfiles: {
|
|
114
|
+
type: "object",
|
|
77
115
|
description:
|
|
78
|
-
"
|
|
116
|
+
"Named command profiles. Each profile defines a narrow execution boundary.",
|
|
117
|
+
additionalProperties: {
|
|
118
|
+
type: "object",
|
|
119
|
+
properties: {
|
|
120
|
+
description: { type: "string" },
|
|
121
|
+
allowedArgvPatterns: {
|
|
122
|
+
type: "array",
|
|
123
|
+
items: {
|
|
124
|
+
type: "object",
|
|
125
|
+
properties: {
|
|
126
|
+
name: { type: "string" },
|
|
127
|
+
tokens: {
|
|
128
|
+
type: "array",
|
|
129
|
+
items: { type: "string" },
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
required: ["name", "tokens"],
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
deniedSubcommands: {
|
|
136
|
+
type: "array",
|
|
137
|
+
items: { type: "string" },
|
|
138
|
+
},
|
|
139
|
+
deniedFlags: {
|
|
140
|
+
type: "array",
|
|
141
|
+
items: { type: "string" },
|
|
142
|
+
},
|
|
143
|
+
allowedNetworkTargets: {
|
|
144
|
+
type: "array",
|
|
145
|
+
items: {
|
|
146
|
+
type: "object",
|
|
147
|
+
properties: {
|
|
148
|
+
hostPattern: { type: "string" },
|
|
149
|
+
ports: {
|
|
150
|
+
type: "array",
|
|
151
|
+
items: { type: "number" },
|
|
152
|
+
},
|
|
153
|
+
protocols: {
|
|
154
|
+
type: "array",
|
|
155
|
+
items: { type: "string" },
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
required: ["hostPattern"],
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
required: [
|
|
163
|
+
"description",
|
|
164
|
+
"allowedArgvPatterns",
|
|
165
|
+
"deniedSubcommands",
|
|
166
|
+
],
|
|
167
|
+
},
|
|
79
168
|
},
|
|
80
|
-
|
|
169
|
+
authAdapter: {
|
|
81
170
|
type: "object",
|
|
82
171
|
description:
|
|
83
|
-
"
|
|
84
|
-
"
|
|
85
|
-
"
|
|
172
|
+
"Auth adapter configuration describing how credentials are injected. " +
|
|
173
|
+
"Use type=env_var to set an environment variable, type=temp_file to write " +
|
|
174
|
+
"credentials to a temporary file, or type=credential_process to run a helper command.",
|
|
86
175
|
properties: {
|
|
87
|
-
|
|
176
|
+
type: {
|
|
88
177
|
type: "string",
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
type: "string",
|
|
93
|
-
description: "SHA-256 hex digest of the command bundle.",
|
|
94
|
-
},
|
|
95
|
-
bundleId: {
|
|
96
|
-
type: "string",
|
|
97
|
-
description: "Unique identifier for the command bundle.",
|
|
178
|
+
enum: ["env_var", "temp_file", "credential_process"],
|
|
179
|
+
description:
|
|
180
|
+
"Adapter type: env_var, temp_file, or credential_process.",
|
|
98
181
|
},
|
|
99
|
-
|
|
182
|
+
envVarName: {
|
|
100
183
|
type: "string",
|
|
101
|
-
description:
|
|
184
|
+
description:
|
|
185
|
+
"Environment variable name for credential injection (required for all types).",
|
|
102
186
|
},
|
|
103
|
-
|
|
187
|
+
valuePrefix: {
|
|
104
188
|
type: "string",
|
|
105
189
|
description:
|
|
106
|
-
'
|
|
190
|
+
'Optional prefix prepended to the credential value (env_var only, e.g. "Bearer ").',
|
|
107
191
|
},
|
|
108
|
-
|
|
109
|
-
type: "
|
|
192
|
+
fileExtension: {
|
|
193
|
+
type: "string",
|
|
110
194
|
description:
|
|
111
|
-
|
|
112
|
-
additionalProperties: {
|
|
113
|
-
type: "object",
|
|
114
|
-
properties: {
|
|
115
|
-
description: { type: "string" },
|
|
116
|
-
allowedArgvPatterns: {
|
|
117
|
-
type: "array",
|
|
118
|
-
items: {
|
|
119
|
-
type: "object",
|
|
120
|
-
properties: {
|
|
121
|
-
name: { type: "string" },
|
|
122
|
-
tokens: {
|
|
123
|
-
type: "array",
|
|
124
|
-
items: { type: "string" },
|
|
125
|
-
},
|
|
126
|
-
},
|
|
127
|
-
required: ["name", "tokens"],
|
|
128
|
-
},
|
|
129
|
-
},
|
|
130
|
-
deniedSubcommands: {
|
|
131
|
-
type: "array",
|
|
132
|
-
items: { type: "string" },
|
|
133
|
-
},
|
|
134
|
-
deniedFlags: {
|
|
135
|
-
type: "array",
|
|
136
|
-
items: { type: "string" },
|
|
137
|
-
},
|
|
138
|
-
allowedNetworkTargets: {
|
|
139
|
-
type: "array",
|
|
140
|
-
items: {
|
|
141
|
-
type: "object",
|
|
142
|
-
properties: {
|
|
143
|
-
hostPattern: { type: "string" },
|
|
144
|
-
ports: {
|
|
145
|
-
type: "array",
|
|
146
|
-
items: { type: "number" },
|
|
147
|
-
},
|
|
148
|
-
protocols: {
|
|
149
|
-
type: "array",
|
|
150
|
-
items: { type: "string" },
|
|
151
|
-
},
|
|
152
|
-
},
|
|
153
|
-
required: ["hostPattern"],
|
|
154
|
-
},
|
|
155
|
-
},
|
|
156
|
-
},
|
|
157
|
-
required: [
|
|
158
|
-
"description",
|
|
159
|
-
"allowedArgvPatterns",
|
|
160
|
-
"deniedSubcommands",
|
|
161
|
-
],
|
|
162
|
-
},
|
|
195
|
+
'Optional file extension for the temp file (temp_file only, e.g. ".json").',
|
|
163
196
|
},
|
|
164
|
-
|
|
165
|
-
type: "
|
|
197
|
+
fileMode: {
|
|
198
|
+
type: "number",
|
|
166
199
|
description:
|
|
167
|
-
"
|
|
168
|
-
"Use type=env_var to set an environment variable, type=temp_file to write " +
|
|
169
|
-
"credentials to a temporary file, or type=credential_process to run a helper command.",
|
|
170
|
-
properties: {
|
|
171
|
-
type: {
|
|
172
|
-
type: "string",
|
|
173
|
-
enum: ["env_var", "temp_file", "credential_process"],
|
|
174
|
-
description:
|
|
175
|
-
"Adapter type: env_var, temp_file, or credential_process.",
|
|
176
|
-
},
|
|
177
|
-
envVarName: {
|
|
178
|
-
type: "string",
|
|
179
|
-
description:
|
|
180
|
-
"Environment variable name for credential injection (required for all types).",
|
|
181
|
-
},
|
|
182
|
-
valuePrefix: {
|
|
183
|
-
type: "string",
|
|
184
|
-
description:
|
|
185
|
-
'Optional prefix prepended to the credential value (env_var only, e.g. "Bearer ").',
|
|
186
|
-
},
|
|
187
|
-
fileExtension: {
|
|
188
|
-
type: "string",
|
|
189
|
-
description:
|
|
190
|
-
'Optional file extension for the temp file (temp_file only, e.g. ".json").',
|
|
191
|
-
},
|
|
192
|
-
fileMode: {
|
|
193
|
-
type: "number",
|
|
194
|
-
description:
|
|
195
|
-
"Optional file mode/permissions for the temp file (temp_file only, e.g. 0o600).",
|
|
196
|
-
},
|
|
197
|
-
helperCommand: {
|
|
198
|
-
type: "string",
|
|
199
|
-
description:
|
|
200
|
-
"Command to run to obtain credentials (credential_process only, required for that type).",
|
|
201
|
-
},
|
|
202
|
-
timeoutMs: {
|
|
203
|
-
type: "number",
|
|
204
|
-
description:
|
|
205
|
-
"Timeout in milliseconds for the helper command (credential_process only).",
|
|
206
|
-
},
|
|
207
|
-
},
|
|
208
|
-
required: ["type", "envVarName"],
|
|
200
|
+
"Optional file mode/permissions for the temp file (temp_file only, e.g. 0o600).",
|
|
209
201
|
},
|
|
210
|
-
|
|
202
|
+
helperCommand: {
|
|
211
203
|
type: "string",
|
|
212
|
-
|
|
213
|
-
|
|
204
|
+
description:
|
|
205
|
+
"Command to run to obtain credentials (credential_process only, required for that type).",
|
|
214
206
|
},
|
|
215
|
-
|
|
216
|
-
type: "
|
|
207
|
+
timeoutMs: {
|
|
208
|
+
type: "number",
|
|
217
209
|
description:
|
|
218
|
-
"
|
|
219
|
-
additionalProperties: { type: "string" },
|
|
210
|
+
"Timeout in milliseconds for the helper command (credential_process only).",
|
|
220
211
|
},
|
|
221
212
|
},
|
|
222
|
-
required: [
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
213
|
+
required: ["type", "envVarName"],
|
|
214
|
+
},
|
|
215
|
+
egressMode: {
|
|
216
|
+
type: "string",
|
|
217
|
+
enum: ["proxy_required", "no_network"],
|
|
218
|
+
description: "Network egress enforcement mode.",
|
|
219
|
+
},
|
|
220
|
+
cleanConfigDirs: {
|
|
221
|
+
type: "object",
|
|
222
|
+
description:
|
|
223
|
+
"Config directories to mount as empty tmpfs during execution.",
|
|
224
|
+
additionalProperties: { type: "string" },
|
|
232
225
|
},
|
|
233
226
|
},
|
|
234
|
-
required: [
|
|
235
|
-
|
|
227
|
+
required: [
|
|
228
|
+
"schemaVersion",
|
|
229
|
+
"bundleDigest",
|
|
230
|
+
"bundleId",
|
|
231
|
+
"version",
|
|
232
|
+
"entrypoint",
|
|
233
|
+
"commandProfiles",
|
|
234
|
+
"authAdapter",
|
|
235
|
+
"egressMode",
|
|
236
|
+
],
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
required: ["action", "toolName"],
|
|
240
|
+
};
|
|
236
241
|
|
|
237
242
|
async execute(
|
|
238
243
|
input: Record<string, unknown>,
|
|
239
|
-
|
|
244
|
+
_context: ToolContext,
|
|
240
245
|
): Promise<ToolExecutionResult> {
|
|
241
|
-
const cesClient =
|
|
246
|
+
const cesClient = getCesClient();
|
|
242
247
|
if (!cesClient) {
|
|
243
248
|
return {
|
|
244
249
|
content:
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
} from "@vellumai/service-contracts/credential-rpc";
|
|
17
17
|
|
|
18
18
|
import { RiskLevel } from "../../permissions/types.js";
|
|
19
|
+
import { getCesClient } from "../../security/secure-keys.js";
|
|
19
20
|
import { getLogger } from "../../util/logger.js";
|
|
20
21
|
import type {
|
|
21
22
|
ToolContext,
|
|
@@ -106,7 +107,7 @@ export const runAuthenticatedCommandTool = {
|
|
|
106
107
|
input: Record<string, unknown>,
|
|
107
108
|
context: ToolContext,
|
|
108
109
|
): Promise<ToolExecutionResult> {
|
|
109
|
-
const cesClient =
|
|
110
|
+
const cesClient = getCesClient();
|
|
110
111
|
if (!cesClient) {
|
|
111
112
|
return {
|
|
112
113
|
content:
|
package/src/tools/executor.ts
CHANGED
|
@@ -7,6 +7,7 @@ import { PermissionPrompter } from "../permissions/prompter.js";
|
|
|
7
7
|
import { RiskLevel } from "../permissions/types.js";
|
|
8
8
|
import { isUntrustedTrustClass } from "../runtime/actor-trust-resolver.js";
|
|
9
9
|
import { redactSensitiveFields } from "../security/redaction.js";
|
|
10
|
+
import { getCesClient } from "../security/secure-keys.js";
|
|
10
11
|
import { TokenExpiredError } from "../security/token-manager.js";
|
|
11
12
|
import { PermissionDeniedError, ToolError } from "../util/errors.js";
|
|
12
13
|
import { pathExists, safeStatSync } from "../util/fs.js";
|
|
@@ -21,10 +22,11 @@ import { sandboxPolicy } from "./shared/filesystem/path-policy.js";
|
|
|
21
22
|
import { MAX_FILE_SIZE_BYTES } from "./shared/filesystem/size-guard.js";
|
|
22
23
|
import { ToolApprovalHandler } from "./tool-approval-handler.js";
|
|
23
24
|
import { resolveToolInvocationAlias } from "./tool-name-aliases.js";
|
|
24
|
-
import
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
import {
|
|
26
|
+
stringifyToolInput,
|
|
27
|
+
type ToolContext,
|
|
28
|
+
type ToolExecutionResult,
|
|
29
|
+
type ToolLifecycleEvent,
|
|
28
30
|
} from "./types.js";
|
|
29
31
|
|
|
30
32
|
const log = getLogger("tool-executor");
|
|
@@ -207,7 +209,8 @@ export class ToolExecutor {
|
|
|
207
209
|
// indicator, present the proposal to the guardian via the existing
|
|
208
210
|
// confirmation transport, commit the decision to CES, and retry
|
|
209
211
|
// the original tool invocation with the granted grantId.
|
|
210
|
-
|
|
212
|
+
const cesClient = getCesClient();
|
|
213
|
+
if (execResult.cesApprovalRequired && !cesClient) {
|
|
211
214
|
const msg = `CES approval required for "${name}" but no CES client is available. Ensure the Credential Execution Service is running.`;
|
|
212
215
|
const durationMs = Date.now() - startTime;
|
|
213
216
|
emitLifecycleEvent(context, {
|
|
@@ -228,11 +231,11 @@ export class ToolExecutor {
|
|
|
228
231
|
});
|
|
229
232
|
return { content: msg, isError: true };
|
|
230
233
|
}
|
|
231
|
-
if (execResult.cesApprovalRequired &&
|
|
234
|
+
if (execResult.cesApprovalRequired && cesClient) {
|
|
232
235
|
const bridgeResult = await bridgeCesApproval(
|
|
233
236
|
execResult.cesApprovalRequired,
|
|
234
237
|
this.prompter,
|
|
235
|
-
|
|
238
|
+
cesClient,
|
|
236
239
|
{
|
|
237
240
|
isInteractive: context.isInteractive,
|
|
238
241
|
conversationId: context.conversationId,
|
|
@@ -308,6 +311,15 @@ export class ToolExecutor {
|
|
|
308
311
|
}
|
|
309
312
|
}
|
|
310
313
|
|
|
314
|
+
// Sized from the RAW pre-sanitization result — sensitive-output
|
|
315
|
+
// extraction below strips directives and swaps raw values for
|
|
316
|
+
// placeholders, which changes the content length, and telemetry must
|
|
317
|
+
// report the true payload size. Only the size leaves the device,
|
|
318
|
+
// never the payload. Stamped here (not centrally in
|
|
319
|
+
// emitLifecycleEvent) because only this site sees the content before
|
|
320
|
+
// extractAndSanitize() rewrites it.
|
|
321
|
+
const rawResultBytes = Buffer.byteLength(execResult.content, "utf8");
|
|
322
|
+
|
|
311
323
|
// Sensitive output extraction: strip directives, replace raw values
|
|
312
324
|
// with placeholders, and attach bindings for agent-loop substitution.
|
|
313
325
|
const { sanitizedContent, bindings } = extractAndSanitize(
|
|
@@ -339,6 +351,7 @@ export class ToolExecutor {
|
|
|
339
351
|
decision,
|
|
340
352
|
durationMs,
|
|
341
353
|
result: safeResult,
|
|
354
|
+
resultBytes: rawResultBytes,
|
|
342
355
|
});
|
|
343
356
|
|
|
344
357
|
// Merge risk metadata from the classifier assessment cache onto the
|
|
@@ -491,6 +504,25 @@ function emitLifecycleEvent(
|
|
|
491
504
|
input: sanitizeToolInput(event.toolName, event.input),
|
|
492
505
|
};
|
|
493
506
|
|
|
507
|
+
// Stamp telemetry fields centrally so every executed/error event carries
|
|
508
|
+
// them — including the pre-execution gate failures (aborted, disk
|
|
509
|
+
// pressure, unknown/inactive tool) emitted from checkPreExecutionGates(),
|
|
510
|
+
// whose emission sites don't have to remember to copy them. This is the
|
|
511
|
+
// sole writer of both fields. (`resultBytes` is the exception: it is
|
|
512
|
+
// stamped at the executed emission site in executeInternal, the only
|
|
513
|
+
// place that sees the result content before sensitive-output extraction
|
|
514
|
+
// rewrites it; the spread above passes it through untouched.)
|
|
515
|
+
if (sanitizedEvent.type === "executed" || sanitizedEvent.type === "error") {
|
|
516
|
+
sanitizedEvent.attribution = context.attribution ?? null;
|
|
517
|
+
// Sized from the RAW pre-sanitization input — redaction changes the
|
|
518
|
+
// serialized length, and telemetry must report the true payload size.
|
|
519
|
+
// Only the size leaves the device, never the payload.
|
|
520
|
+
sanitizedEvent.inputBytes = Buffer.byteLength(
|
|
521
|
+
stringifyToolInput(event.input),
|
|
522
|
+
"utf8",
|
|
523
|
+
);
|
|
524
|
+
}
|
|
525
|
+
|
|
494
526
|
try {
|
|
495
527
|
const maybePromise = handler(sanitizedEvent as ToolLifecycleEvent);
|
|
496
528
|
if (maybePromise) {
|