@vellumai/assistant 0.7.0 → 0.7.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/ARCHITECTURE.md +6 -7
- package/Dockerfile +1 -0
- package/README.md +2 -2
- package/__tests__/permissions/gateway-threshold-reader.test.ts +79 -139
- package/bun.lock +3 -0
- package/docs/architecture/security.md +18 -16
- package/knip.json +1 -0
- package/node_modules/@vellumai/skill-host-contracts/__tests__/client.test.ts +1 -5
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +0 -5
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -16
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +1 -9
- package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +12 -12
- package/node_modules/@vellumai/slack-text/bun.lock +24 -0
- package/node_modules/@vellumai/slack-text/package.json +18 -0
- package/node_modules/@vellumai/slack-text/src/index.test.ts +153 -0
- package/node_modules/@vellumai/slack-text/src/index.ts +235 -0
- package/node_modules/@vellumai/slack-text/tsconfig.json +20 -0
- package/openapi.yaml +294 -107
- package/package.json +4 -2
- package/scripts/generate-openapi.ts +16 -111
- package/src/__tests__/agent-wake-override-profile.test.ts +23 -1
- package/src/__tests__/anthropic-provider.test.ts +56 -13
- package/src/__tests__/app-conversation-ids-backfill.test.ts +278 -0
- package/src/__tests__/app-conversation-ids.test.ts +151 -0
- package/src/__tests__/approval-cascade.test.ts +0 -15
- package/src/__tests__/approval-routes-http.test.ts +6 -17
- package/src/__tests__/assistant-event-hub.test.ts +126 -77
- package/src/__tests__/assistant-event.test.ts +0 -5
- package/src/__tests__/assistant-events-sse-hardening.test.ts +37 -15
- package/src/__tests__/assistant-feature-flags-integration.test.ts +0 -29
- package/src/__tests__/background-shell-host-bash.test.ts +34 -43
- package/src/__tests__/call-controller.test.ts +1 -1
- package/src/__tests__/call-site-routing-provider.test.ts +193 -0
- package/src/__tests__/channel-approval-routes.test.ts +10 -296
- package/src/__tests__/channel-approvals.test.ts +25 -17
- package/src/__tests__/channel-guardian.test.ts +100 -146
- package/src/__tests__/checker.test.ts +20 -34
- package/src/__tests__/compact-event-conversation-id-guard.test.ts +50 -0
- package/src/__tests__/compaction-events.test.ts +2 -0
- package/src/__tests__/config-schema.test.ts +6 -48
- package/src/__tests__/config-watcher.test.ts +12 -0
- package/src/__tests__/connection-policy.test.ts +1 -52
- package/src/__tests__/contacts-write.test.ts +2 -64
- package/src/__tests__/context-image-dimensions.test.ts +1 -1
- package/src/__tests__/context-search-memory-source.test.ts +120 -1
- package/src/__tests__/context-search-memory-v2-source.test.ts +383 -0
- package/src/__tests__/context-search-pkb-source.test.ts +49 -0
- package/src/__tests__/context-search-workspace-source.test.ts +9 -22
- package/src/__tests__/context-window-manager.test.ts +46 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +102 -29
- package/src/__tests__/conversation-agent-loop.test.ts +980 -13
- package/src/__tests__/conversation-analysis-routes.test.ts +12 -10
- package/src/__tests__/conversation-attention-telegram.test.ts +11 -3
- package/src/__tests__/conversation-confirmation-signals.test.ts +0 -291
- package/src/__tests__/conversation-history-web-search.test.ts +4 -3
- package/src/__tests__/conversation-inference-profile-route.test.ts +12 -23
- package/src/__tests__/conversation-lifecycle.test.ts +4 -4
- package/src/__tests__/conversation-process-callsite.test.ts +79 -2
- package/src/__tests__/conversation-queue.test.ts +3 -8
- package/src/__tests__/conversation-routes-disk-view.test.ts +1 -161
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +0 -32
- package/src/__tests__/conversation-routes-slash-commands.test.ts +75 -66
- package/src/__tests__/conversation-runtime-assembly.test.ts +257 -3
- package/src/__tests__/conversation-slash-commands.test.ts +24 -4
- package/src/__tests__/conversation-slash-queue.test.ts +2 -0
- package/src/__tests__/conversation-speed-override.test.ts +0 -3
- package/src/__tests__/conversation-starter-routes.test.ts +79 -2
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +12 -5
- package/src/__tests__/conversation-surfaces-standalone.test.ts +18 -14
- package/src/__tests__/conversation-surfaces-state-update.test.ts +3 -2
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +8 -46
- package/src/__tests__/conversation-usage.test.ts +253 -3
- package/src/__tests__/credential-execution-shell-lockdown.test.ts +0 -39
- package/src/__tests__/credential-health-service.test.ts +68 -0
- package/src/__tests__/credential-security-e2e.test.ts +4 -3
- package/src/__tests__/credential-security-invariants.test.ts +1 -5
- package/src/__tests__/credential-token-resolver.test.ts +180 -0
- package/src/__tests__/cu-unified-flow.test.ts +33 -16
- package/src/__tests__/daemon-assistant-events.test.ts +34 -21
- package/src/__tests__/daemon-credential-client.test.ts +4 -1
- package/src/__tests__/db-connection-isolation.test.ts +125 -0
- package/src/__tests__/db-migration-rollback.test.ts +101 -0
- package/src/__tests__/db-slack-compaction-watermark-migration.test.ts +169 -0
- package/src/__tests__/deterministic-verification-control-plane.test.ts +7 -80
- package/src/__tests__/document-conversations.test.ts +332 -0
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +2 -2
- package/src/__tests__/emit-event-signal.test.ts +4 -6
- package/src/__tests__/events-client-registration.test.ts +193 -49
- package/src/__tests__/filing-service.test.ts +58 -7
- package/src/__tests__/first-greeting.test.ts +156 -150
- package/src/__tests__/fixtures/mock-chrome-extension.ts +108 -66
- package/src/__tests__/get-skill-detail-audit.test.ts +3 -8
- package/src/__tests__/guardian-binding-drift-heal.test.ts +1 -1
- package/src/__tests__/guardian-dispatch.test.ts +1 -1
- package/src/__tests__/guardian-grant-minting.test.ts +7 -2
- package/src/__tests__/guardian-routing-invariants.test.ts +7 -2
- package/src/__tests__/guardian-routing-state.test.ts +1 -1
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +32 -11
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +2 -83
- package/src/__tests__/headless-browser-mode.test.ts +4 -9
- package/src/__tests__/headless-browser-navigate.test.ts +21 -20
- package/src/__tests__/heartbeat-service.test.ts +289 -7
- package/src/__tests__/helpers/channel-test-adapter.ts +2 -2
- package/src/__tests__/helpers/create-guardian-binding.ts +91 -0
- package/src/__tests__/host-bash-proxy.test.ts +46 -122
- package/src/__tests__/host-browser-e2e-cloud.test.ts +36 -497
- package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +26 -96
- package/src/__tests__/host-browser-proxy.test.ts +111 -185
- package/src/__tests__/host-browser-routes.test.ts +45 -75
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +26 -30
- package/src/__tests__/host-cu-proxy.test.ts +56 -111
- package/src/__tests__/host-file-proxy.test.ts +44 -98
- package/src/__tests__/host-file-read-tool.test.ts +42 -21
- package/src/__tests__/host-shell-tool.test.ts +33 -68
- package/src/__tests__/host-transfer-pending-interactions.test.ts +2 -18
- package/src/__tests__/host-transfer-proxy.test.ts +43 -53
- package/src/__tests__/http-user-message-parity.test.ts +0 -6
- package/src/__tests__/inbound-slack-persistence.test.ts +31 -0
- package/src/__tests__/injector-chain.test.ts +10 -5
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +124 -0
- package/src/__tests__/inline-command-runner.test.ts +0 -66
- package/src/__tests__/inline-skill-load-permissions.test.ts +0 -2
- package/src/__tests__/install-skill-routing.test.ts +1 -13
- package/src/__tests__/llm-callsite-catalog.test.ts +34 -0
- package/src/__tests__/llm-catalog-parity.test.ts +90 -0
- package/src/__tests__/llm-context-resolution.test.ts +180 -0
- package/src/__tests__/llm-resolver.test.ts +80 -12
- package/src/__tests__/llm-usage-store.test.ts +269 -4
- package/src/__tests__/log-export-routes.test.ts +89 -0
- package/src/__tests__/managed-profile-guard.test.ts +225 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +0 -10
- package/src/__tests__/manual-token-reconciliation.test.ts +334 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +95 -0
- package/src/__tests__/migration-cross-version-compatibility.test.ts +197 -291
- package/src/__tests__/migration-export-http.test.ts +33 -26
- package/src/__tests__/migration-export-streaming.test.ts +18 -10
- package/src/__tests__/migration-export-to-gcs.test.ts +49 -9
- package/src/__tests__/migration-import-commit-http.test.ts +66 -21
- package/src/__tests__/migration-import-from-gcs.test.ts +50 -9
- package/src/__tests__/migration-import-from-url.test.ts +20 -6
- package/src/__tests__/migration-import-preflight-http.test.ts +95 -95
- package/src/__tests__/migration-parity-persistence.test.ts +62 -25
- package/src/__tests__/migration-transport.test.ts +115 -23
- package/src/__tests__/migration-validate-http.test.ts +105 -80
- package/src/__tests__/migration-wizard.test.ts +133 -27
- package/src/__tests__/non-member-access-request.test.ts +1 -1
- package/src/__tests__/notification-guardian-path.test.ts +1 -1
- package/src/__tests__/oauth-store.test.ts +19 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +21 -12
- package/src/__tests__/prechat-onboarding-contract.test.ts +31 -7
- package/src/__tests__/pricing.test.ts +68 -4
- package/src/__tests__/process-message-background-slack.test.ts +331 -0
- package/src/__tests__/provider-managed-proxy-integration.test.ts +153 -17
- package/src/__tests__/provider-send-message-override-profile.test.ts +50 -0
- package/src/__tests__/provider-usage-tracking.test.ts +208 -0
- package/src/__tests__/reaction-persistence.test.ts +9 -6
- package/src/__tests__/rebind-secrets-screen.test.ts +53 -16
- package/src/__tests__/recording-handler.test.ts +64 -81
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +4 -3
- package/src/__tests__/relay-server.test.ts +18 -13
- package/src/__tests__/require-fresh-approval.test.ts +13 -22
- package/src/__tests__/runtime-attachment-metadata.test.ts +1 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
- package/src/__tests__/runtime-events-sse.test.ts +3 -12
- package/src/__tests__/search-skills-unified.test.ts +9 -15
- package/src/__tests__/secret-ingress-cli.test.ts +2 -5
- package/src/__tests__/secret-ingress-http.test.ts +0 -4
- package/src/__tests__/secret-onetime-send.test.ts +4 -2
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +24 -7
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +42 -47
- package/src/__tests__/secret-response-routing.test.ts +29 -15
- package/src/__tests__/secret-routes-managed-proxy.test.ts +5 -1
- package/src/__tests__/secret-scanner.test.ts +2 -545
- package/src/__tests__/send-endpoint-busy.test.ts +9 -24
- package/src/__tests__/settings-routes.test.ts +1 -1
- package/src/__tests__/shell-credential-ref.test.ts +0 -8
- package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -56
- package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -11
- package/src/__tests__/skill-tool-factory.test.ts +97 -0
- package/src/__tests__/skills-file-content-endpoint.test.ts +9 -30
- package/src/__tests__/skills-files-catalog-fallback.test.ts +11 -17
- package/src/__tests__/slack-inbound-verification.test.ts +1 -62
- package/src/__tests__/subagent-fork-notifications.test.ts +57 -47
- package/src/__tests__/subagent-manager-notify.test.ts +70 -70
- package/src/__tests__/subagent-notify-parent.test.ts +80 -83
- package/src/__tests__/system-prompt.test.ts +115 -13
- package/src/__tests__/terminal-tools.test.ts +0 -89
- package/src/__tests__/thread-backfill.test.ts +945 -31
- package/src/__tests__/tool-domain-event-publisher.test.ts +0 -36
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -6
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -16
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +9 -19
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +4 -7
- package/src/__tests__/tool-executor.test.ts +12 -19
- package/src/__tests__/tool-metrics-listener.test.ts +0 -35
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
- package/src/__tests__/tool-trace-listener.test.ts +0 -17
- package/src/__tests__/transfer-progress-screen.test.ts +63 -26
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +2 -149
- package/src/__tests__/trusted-contact-multichannel.test.ts +2 -4
- package/src/__tests__/trusted-contact-verification.test.ts +1 -1
- package/src/__tests__/tts-catalog-parity.test.ts +16 -5
- package/src/__tests__/usage-attribution.test.ts +247 -0
- package/src/__tests__/usage-cli.test.ts +143 -0
- package/src/__tests__/usage-grouped-buckets.test.ts +155 -0
- package/src/__tests__/usage-routes.test.ts +150 -0
- package/src/__tests__/validation-results-screen.test.ts +39 -16
- package/src/__tests__/vbundle-pax-and-symlink.test.ts +12 -3
- package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +49 -137
- package/src/__tests__/verification-control-plane-policy.test.ts +4 -7
- package/src/__tests__/voice-session-bridge.test.ts +5 -5
- package/src/__tests__/workspace-migration-062-drop-memory-v2-edges-json.test.ts +103 -0
- package/src/__tests__/workspace-migration-063-release-notes-dynamic-model-context.test.ts +77 -0
- package/src/__tests__/workspace-migration-064-unwind-main-agent-opus-seed.test.ts +225 -0
- package/src/__tests__/workspace-migration-memory-v2-init.test.ts +8 -30
- package/src/acp/index.ts +0 -15
- package/src/acp/session-manager.ts +37 -34
- package/src/agent/loop.ts +16 -1
- package/src/approvals/AGENTS.md +4 -0
- package/src/approvals/__tests__/guardian-feed-event.test.ts +10 -3
- package/src/approvals/guardian-request-resolvers.ts +10 -2
- package/src/backup/__tests__/backup-worker.test.ts +36 -8
- package/src/backup/__tests__/paths.test.ts +2 -2
- package/src/backup/__tests__/restore.test.ts +45 -28
- package/src/backup/backup-worker.ts +36 -2
- package/src/backup/paths.ts +9 -6
- package/src/browser-session/events.ts +0 -9
- package/src/calls/call-store.ts +1 -34
- package/src/calls/guardian-question-copy.ts +0 -108
- package/src/calls/relay-server.ts +0 -24
- package/src/calls/twilio-rest.ts +0 -38
- package/src/calls/twilio-routes.ts +1 -1
- package/src/calls/voice-session-bridge.ts +7 -38
- package/src/channels/types.ts +1 -36
- package/src/cli/commands/__tests__/cache.test.ts +152 -5
- package/src/cli/commands/__tests__/memory-v2.test.ts +14 -28
- package/src/cli/commands/__tests__/trust.test.ts +21 -387
- package/src/cli/commands/backup.ts +4 -4
- package/src/cli/commands/cache-fs.ts +8 -0
- package/src/cli/commands/cache.ts +153 -82
- package/src/cli/commands/clients.ts +63 -5
- package/src/cli/commands/completions.ts +3 -3
- package/src/cli/commands/contacts.ts +231 -76
- package/src/cli/commands/keys.ts +4 -1
- package/src/cli/commands/memory-v2.ts +24 -52
- package/src/cli/commands/oauth/shared.ts +2 -29
- package/src/cli/commands/pending.ts +102 -0
- package/src/cli/commands/skills.ts +77 -35
- package/src/cli/commands/trust.ts +70 -430
- package/src/cli/commands/usage.ts +25 -16
- package/src/cli/lib/daemon-credential-client.ts +14 -0
- package/src/cli/program.ts +2 -0
- package/src/cli.ts +0 -21
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
- package/src/config/bundled-skills/messaging/TOOLS.json +14 -4
- package/src/config/env-registry.ts +12 -2
- package/src/config/env.ts +3 -14
- package/src/config/feature-flag-registry.json +30 -30
- package/src/config/llm-callsite-catalog.ts +12 -0
- package/src/config/llm-context-resolution.ts +80 -0
- package/src/config/llm-resolver.ts +58 -22
- package/src/config/loader.ts +3 -3
- package/src/config/schema.ts +2 -158
- package/src/config/schemas/__tests__/memory-v2.test.ts +1 -0
- package/src/config/schemas/call-site-catalog.ts +271 -0
- package/src/config/schemas/calls.ts +5 -5
- package/src/config/schemas/inference.ts +1 -1
- package/src/config/schemas/ingress.ts +1 -1
- package/src/config/schemas/llm.ts +31 -3
- package/src/config/schemas/memory-retrieval.ts +2 -2
- package/src/config/schemas/memory-v2.ts +9 -0
- package/src/config/schemas/security.ts +1 -42
- package/src/config/schemas/services.ts +6 -6
- package/src/config/schemas/skills.ts +5 -5
- package/src/config/schemas/tts.ts +1 -1
- package/src/config/seed-inference-profiles.ts +117 -0
- package/src/config/skills.ts +0 -90
- package/src/config/types.ts +3 -6
- package/src/contacts/contact-store.ts +0 -17
- package/src/contacts/contacts-write.ts +1 -105
- package/src/context/window-manager.ts +44 -5
- package/src/credential-execution/process-manager.ts +34 -10
- package/src/credential-health/credential-health-service.ts +21 -16
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +75 -82
- package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -9
- package/src/daemon/connection-policy.ts +1 -26
- package/src/daemon/conversation-agent-loop-handlers.ts +53 -4
- package/src/daemon/conversation-agent-loop.ts +277 -36
- package/src/daemon/conversation-history.ts +8 -8
- package/src/daemon/conversation-launch.ts +20 -135
- package/src/daemon/conversation-lifecycle.ts +1 -1
- package/src/daemon/conversation-messaging.ts +1 -0
- package/src/daemon/conversation-process.ts +83 -163
- package/src/daemon/conversation-runtime-assembly.ts +219 -76
- package/src/daemon/conversation-slash.ts +47 -5
- package/src/daemon/conversation-store.ts +7 -31
- package/src/daemon/conversation-surfaces.ts +22 -28
- package/src/daemon/conversation-tool-setup.ts +3 -33
- package/src/daemon/conversation-usage.ts +36 -0
- package/src/daemon/conversation.ts +117 -233
- package/src/daemon/daemon-control.ts +3 -71
- package/src/daemon/daemon-skill-host.ts +8 -11
- package/src/daemon/dictation-profile-store.ts +2 -26
- package/src/daemon/first-greeting.ts +44 -156
- package/src/daemon/handlers/config-channels.ts +12 -12
- package/src/daemon/handlers/config-ingress.ts +4 -165
- package/src/daemon/handlers/config-model.ts +1 -1
- package/src/daemon/handlers/config-voice.ts +0 -42
- package/src/daemon/handlers/conversations.ts +11 -190
- package/src/daemon/handlers/recording.ts +26 -158
- package/src/daemon/handlers/shared.ts +23 -71
- package/src/daemon/handlers/skills.ts +42 -93
- package/src/daemon/host-bash-proxy.ts +67 -45
- package/src/daemon/host-browser-proxy.ts +65 -27
- package/src/daemon/host-cu-proxy.ts +40 -39
- package/src/daemon/host-file-proxy.ts +58 -37
- package/src/daemon/host-transfer-proxy.ts +84 -46
- package/src/daemon/lifecycle.ts +49 -15
- package/src/daemon/message-types/conversations.ts +7 -0
- package/src/daemon/message-types/host-bash.ts +1 -0
- package/src/daemon/message-types/host-cu.ts +1 -0
- package/src/daemon/message-types/host-file.ts +1 -0
- package/src/daemon/message-types/host-transfer.ts +1 -0
- package/src/daemon/message-types/messages.ts +10 -9
- package/src/daemon/message-types/workspace.ts +1 -1
- package/src/daemon/process-message.ts +102 -239
- package/src/daemon/server.ts +13 -462
- package/src/daemon/shutdown-handlers.ts +2 -2
- package/src/daemon/tool-side-effects.ts +125 -107
- package/src/daemon/trust-context.ts +13 -0
- package/src/daemon/wake-target-adapter.ts +4 -9
- package/src/events/domain-events.ts +0 -8
- package/src/events/tool-audit-listener.ts +3 -1
- package/src/events/tool-domain-event-publisher.ts +0 -10
- package/src/events/tool-metrics-listener.ts +0 -17
- package/src/events/tool-trace-listener.ts +0 -14
- package/src/filing/filing-service.ts +13 -1
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +6 -2
- package/src/heartbeat/heartbeat-service.ts +23 -5
- package/src/home/__tests__/feed-writer.test.ts +0 -4
- package/src/home/__tests__/relationship-state-writer.test.ts +30 -0
- package/src/home/feed-writer.ts +1 -2
- package/src/home/relationship-state-writer.ts +16 -3
- package/src/ipc/__tests__/browser-ipc.test.ts +2 -12
- package/src/ipc/__tests__/skill-server-bidirectional.test.ts +0 -1
- package/src/ipc/assistant-server.ts +3 -10
- package/src/ipc/routes/__tests__/memory-v2-backfill.test.ts +39 -20
- package/src/ipc/routes/route-adapter.ts +1 -1
- package/src/ipc/routes/trust-rules.test.ts +0 -95
- package/src/ipc/skill-ipc-types.ts +41 -0
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +13 -27
- package/src/ipc/skill-routes/__tests__/identity.test.ts +4 -23
- package/src/ipc/skill-routes/events.ts +12 -23
- package/src/ipc/skill-routes/identity.ts +4 -17
- package/src/ipc/skill-routes/index.ts +1 -1
- package/src/ipc/skill-server.ts +6 -39
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +0 -8
- package/src/live-voice/protocol.ts +4 -13
- package/src/mcp/manager.ts +0 -5
- package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +55 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +127 -0
- package/src/memory/app-git-service.ts +0 -32
- package/src/memory/app-store.ts +154 -0
- package/src/memory/attachments-store.ts +6 -0
- package/src/memory/context-search/sources/memory-v2.ts +578 -0
- package/src/memory/context-search/sources/memory.ts +5 -0
- package/src/memory/context-search/sources/pkb.ts +10 -1
- package/src/memory/context-search/sources/workspace.ts +3 -2
- package/src/memory/conversation-crud.ts +29 -4
- package/src/memory/conversation-disk-view.ts +1 -5
- package/src/memory/conversation-starter-checkpoints.ts +63 -0
- package/src/memory/db-connection.ts +62 -0
- package/src/memory/db-init.ts +14 -0
- package/src/memory/embedding-backend.ts +3 -21
- package/src/memory/embedding-gemini.ts +0 -2
- package/src/memory/embedding-local.ts +6 -6
- package/src/memory/embedding-ollama.ts +6 -6
- package/src/memory/embedding-openai.ts +6 -6
- package/src/memory/embedding-types.ts +21 -0
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +3 -7
- package/src/memory/graph/conversation-graph-memory.ts +35 -13
- package/src/memory/graph/injection.test.ts +2 -2
- package/src/memory/graph/injection.ts +1 -1
- package/src/memory/guardian-action-store.ts +0 -83
- package/src/memory/guardian-approvals.ts +0 -48
- package/src/memory/indexer.ts +1 -15
- package/src/memory/job-handlers/conversation-starters.ts +36 -53
- package/src/memory/job-utils.ts +0 -6
- package/src/memory/jobs-store.ts +0 -1
- package/src/memory/jobs-worker.ts +2 -16
- package/src/memory/llm-request-log-store.ts +0 -41
- package/src/memory/llm-usage-store.ts +129 -43
- package/src/memory/memory-v2-activation-log-store.ts +115 -0
- package/src/memory/migrations/233-document-conversations.ts +54 -0
- package/src/memory/migrations/234-memory-v2-activation-logs.ts +55 -0
- package/src/memory/migrations/235-llm-usage-attribution.ts +31 -0
- package/src/memory/migrations/235-slack-compaction-watermark.ts +44 -0
- package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +26 -0
- package/src/memory/migrations/__tests__/234-memory-v2-activation-logs.test.ts +182 -0
- package/src/memory/migrations/index.ts +14 -0
- package/src/memory/migrations/registry.ts +24 -0
- package/src/memory/raw-query.ts +2 -68
- package/src/memory/schema/conversations.ts +7 -0
- package/src/memory/schema/infrastructure.ts +25 -0
- package/src/memory/search/semantic.ts +5 -16
- package/src/memory/tool-usage-store.ts +2 -0
- package/src/memory/usage-buckets.ts +40 -1
- package/src/memory/usage-grouped-buckets.ts +127 -0
- package/src/memory/v2/__tests__/activation.test.ts +289 -90
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +2 -129
- package/src/memory/v2/__tests__/consolidation-job.test.ts +28 -11
- package/src/memory/v2/__tests__/edge-index.test.ts +278 -0
- package/src/memory/v2/__tests__/injection.test.ts +384 -15
- package/src/memory/v2/__tests__/migration.test.ts +64 -36
- package/src/memory/v2/__tests__/page-store.test.ts +191 -8
- package/src/memory/v2/__tests__/prompts-consolidation.test.ts +181 -0
- package/src/memory/v2/__tests__/skill-store.test.ts +115 -3
- package/src/memory/v2/__tests__/static-context.test.ts +153 -0
- package/src/memory/v2/activation.ts +168 -97
- package/src/memory/v2/backfill-jobs.ts +15 -100
- package/src/memory/v2/consolidation-job.ts +14 -12
- package/src/memory/v2/edge-index.ts +191 -0
- package/src/memory/v2/injection.ts +182 -58
- package/src/memory/v2/migration.ts +57 -64
- package/src/memory/v2/now-text.ts +2 -3
- package/src/memory/v2/page-store.ts +168 -31
- package/src/memory/v2/prompts/consolidation.ts +118 -42
- package/src/memory/v2/prompts/sweep.ts +3 -3
- package/src/memory/v2/skill-store.ts +55 -7
- package/src/memory/v2/static-context.ts +62 -0
- package/src/memory/v2/types.ts +10 -20
- package/src/memory/validation.ts +0 -11
- package/src/messaging/draft-store.ts +0 -6
- package/src/messaging/provider-types.ts +8 -0
- package/src/messaging/provider.ts +7 -0
- package/src/messaging/providers/gmail/client.ts +1 -121
- package/src/messaging/providers/outlook/client.ts +0 -73
- package/src/messaging/providers/slack/__tests__/adapter-mention-rendering.test.ts +226 -0
- package/src/messaging/providers/slack/adapter.ts +122 -21
- package/src/messaging/providers/slack/backfill.test.ts +95 -6
- package/src/messaging/providers/slack/backfill.ts +89 -11
- package/src/messaging/providers/slack/client.ts +10 -124
- package/src/messaging/providers/slack/message-metadata.ts +12 -2
- package/src/messaging/providers/slack/render-transcript.test.ts +56 -0
- package/src/messaging/providers/slack/render-transcript.ts +126 -25
- package/src/messaging/providers/slack/types.ts +1 -0
- package/src/oauth/connection-resolver.test.ts +8 -0
- package/src/oauth/connection-resolver.ts +8 -16
- package/src/oauth/credential-token-resolver.ts +97 -0
- package/src/oauth/manual-token-connection.ts +30 -34
- package/src/oauth/oauth-store.ts +6 -4
- package/src/outbound-proxy/certs.ts +0 -7
- package/src/outbound-proxy/config.ts +0 -74
- package/src/outbound-proxy/health.ts +0 -44
- package/src/outbound-proxy/index.ts +0 -22
- package/src/permissions/approval-provenance.test.ts +184 -0
- package/src/permissions/approval-provenance.ts +70 -0
- package/src/permissions/checker.ts +4 -1
- package/src/permissions/gateway-threshold-reader.ts +4 -1
- package/src/permissions/prompter.ts +9 -2
- package/src/permissions/secret-prompter.ts +21 -48
- package/src/permissions/types.ts +33 -0
- package/src/permissions/workspace-policy.ts +0 -5
- package/src/platform/sync-identity.ts +0 -8
- package/src/plugins/defaults/injectors.ts +69 -2
- package/src/plugins/defaults/overflow-reduce.ts +3 -2
- package/src/plugins/types.ts +8 -0
- package/src/prompts/system-prompt.ts +34 -70
- package/src/prompts/templates/BOOTSTRAP.md +52 -6
- package/src/prompts/update-bulletin-job.ts +2 -0
- package/src/providers/__tests__/retry-callsite.test.ts +138 -1
- package/src/providers/anthropic/client.ts +72 -33
- package/src/providers/call-site-routing.ts +42 -3
- package/src/providers/gemini/client.ts +18 -2
- package/src/providers/managed-proxy/context.ts +0 -5
- package/src/providers/model-catalog.ts +105 -19
- package/src/providers/openai/chat-completions-provider.ts +6 -0
- package/src/providers/openai/responses-provider.ts +7 -1
- package/src/providers/provider-send-message.ts +45 -2
- package/src/providers/ratelimit.ts +7 -2
- package/src/providers/registry.ts +14 -9
- package/src/providers/retry.ts +96 -8
- package/src/providers/types.ts +13 -0
- package/src/providers/usage-tracking.ts +96 -0
- package/src/runtime/AGENTS.md +10 -6
- package/src/runtime/__tests__/agent-wake.test.ts +89 -0
- package/src/runtime/agent-wake.ts +39 -2
- package/src/runtime/assistant-event-hub.ts +541 -45
- package/src/runtime/assistant-event.ts +1 -6
- package/src/runtime/auth/context.ts +0 -9
- package/src/runtime/auth/middleware.ts +1 -1
- package/src/runtime/auth/route-policy.ts +11 -9
- package/src/runtime/auth/token-service.ts +0 -11
- package/src/runtime/channel-approvals.ts +6 -2
- package/src/runtime/channel-verification-service.ts +3 -5
- package/src/runtime/http-errors.ts +0 -34
- package/src/runtime/http-router.ts +6 -3
- package/src/runtime/http-server.ts +22 -82
- package/src/runtime/http-types.ts +5 -0
- package/src/runtime/interactive-ui.ts +0 -1
- package/src/runtime/middleware/auth.ts +0 -20
- package/src/runtime/migrations/__tests__/v1-test-helpers.ts +112 -0
- package/src/runtime/migrations/__tests__/vbundle-builder-credentials.test.ts +11 -4
- package/src/runtime/migrations/__tests__/vbundle-builder-v1-shape.test.ts +253 -0
- package/src/runtime/migrations/__tests__/vbundle-import-credentials.test.ts +19 -6
- package/src/runtime/migrations/__tests__/vbundle-legacy-user-md.test.ts +71 -27
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +41 -2
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +143 -79
- package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +143 -23
- package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +2 -2
- package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +371 -0
- package/src/runtime/migrations/migration-transport.ts +46 -13
- package/src/runtime/migrations/migration-wizard.ts +2 -2
- package/src/runtime/migrations/origin-mode.ts +40 -0
- package/src/runtime/migrations/vbundle-builder.ts +133 -79
- package/src/runtime/migrations/vbundle-import-analyzer.ts +9 -7
- package/src/runtime/migrations/vbundle-importer.ts +7 -7
- package/src/runtime/migrations/vbundle-metadata-merge.ts +1 -1
- package/src/runtime/migrations/vbundle-streaming-importer.ts +3 -3
- package/src/runtime/migrations/vbundle-streaming-validator.ts +48 -26
- package/src/runtime/migrations/vbundle-validator.ts +214 -41
- package/src/runtime/pending-interactions.ts +13 -4
- package/src/runtime/routes/__tests__/acp-routes.test.ts +0 -1
- package/src/runtime/routes/__tests__/backup-routes.test.ts +28 -19
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +235 -0
- package/src/runtime/routes/__tests__/llm-call-sites-routes.test.ts +58 -0
- package/src/runtime/routes/__tests__/migration-export-secrets-redacted.test.ts +54 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +19 -6
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +7 -7
- package/src/runtime/routes/acp-routes.test.ts +0 -3
- package/src/runtime/routes/acp-routes.ts +3 -7
- package/src/runtime/routes/app-management-routes.ts +18 -9
- package/src/runtime/routes/approval-routes.ts +55 -14
- package/src/runtime/routes/avatar-routes.ts +3 -5
- package/src/runtime/routes/browser-routes.ts +1 -15
- package/src/runtime/routes/channel-guardian-routes.ts +1 -5
- package/src/runtime/routes/channel-readiness-routes.ts +3 -7
- package/src/runtime/routes/channel-route-shared.ts +2 -28
- package/src/runtime/routes/client-routes.ts +45 -12
- package/src/runtime/routes/consolidation-routes.ts +115 -0
- package/src/runtime/routes/conversation-list-routes.ts +12 -29
- package/src/runtime/routes/conversation-management-routes.ts +14 -51
- package/src/runtime/routes/conversation-query-routes.ts +120 -8
- package/src/runtime/routes/conversation-routes.ts +44 -528
- package/src/runtime/routes/conversation-starter-routes.ts +19 -40
- package/src/runtime/routes/documents-routes.ts +53 -18
- package/src/runtime/routes/events-routes.ts +59 -91
- package/src/runtime/routes/filing-routes.ts +18 -1
- package/src/runtime/routes/guardian-action-routes.ts +4 -9
- package/src/runtime/routes/host-bash-routes.ts +3 -2
- package/src/runtime/routes/host-browser-routes.ts +9 -33
- package/src/runtime/routes/host-cu-routes.ts +6 -1
- package/src/runtime/routes/host-file-routes.ts +3 -2
- package/src/runtime/routes/host-transfer-routes.ts +11 -15
- package/src/runtime/routes/identity-routes.ts +78 -6
- package/src/runtime/routes/inbound-message-handler.ts +580 -137
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +2 -88
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +3 -0
- package/src/runtime/routes/index.ts +4 -0
- package/src/runtime/routes/integrations/slack/channel.ts +0 -24
- package/src/runtime/routes/llm-call-sites-routes.ts +22 -0
- package/src/runtime/routes/memory-v2-routes.ts +10 -15
- package/src/runtime/routes/migration-routes.ts +188 -31
- package/src/runtime/routes/playground/guard.ts +1 -1
- package/src/runtime/routes/playground/index.ts +0 -2
- package/src/runtime/routes/recording-routes.ts +4 -24
- package/src/runtime/routes/rename-conversation-routes.ts +2 -6
- package/src/runtime/routes/schedule-routes.ts +3 -6
- package/src/runtime/routes/secret-routes.ts +87 -18
- package/src/runtime/routes/settings-routes.ts +29 -28
- package/src/runtime/routes/skills-routes.ts +12 -31
- package/src/runtime/routes/suggest-trust-rule-routes.ts +32 -1
- package/src/runtime/routes/task-routes.ts +6 -6
- package/src/runtime/routes/trust-rules-routes.ts +3 -94
- package/src/runtime/routes/types.ts +4 -4
- package/src/runtime/routes/upgrade-broadcast-routes.ts +3 -10
- package/src/runtime/routes/usage-routes.ts +87 -10
- package/src/runtime/routes/user-routes.ts +17 -31
- package/src/runtime/routes/work-items-routes.ts +1 -4
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -2
- package/src/runtime/services/analyze-conversation.ts +7 -17
- package/src/runtime/services/conversation-serializer.ts +2 -4
- package/src/runtime/verification-outbound-actions.ts +1 -1
- package/src/runtime/verification-rate-limiter.ts +1 -1
- package/src/schedule/schedule-store.ts +0 -16
- package/src/security/secret-scanner.ts +14 -547
- package/src/security/secure-keys.ts +31 -11
- package/src/security/token-manager.ts +7 -3
- package/src/signals/cancel.ts +16 -25
- package/src/signals/conversation-undo.ts +2 -27
- package/src/signals/emit-event.ts +1 -2
- package/src/signals/user-message.ts +108 -22
- package/src/skills/catalog-install.ts +1 -0
- package/src/skills/clawhub.ts +2 -2
- package/src/skills/inline-command-runner.ts +1 -7
- package/src/subagent/manager.ts +67 -84
- package/src/tasks/task-store.ts +1 -28
- package/src/telemetry/types.ts +6 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +38 -15
- package/src/telemetry/usage-telemetry-reporter.ts +3 -5
- package/src/tools/acp/spawn.test.ts +1 -2
- package/src/tools/acp/steer.test.ts +1 -2
- package/src/tools/browser/__tests__/browser-status.test.ts +44 -127
- package/src/tools/browser/browser-execution.ts +31 -147
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +92 -68
- package/src/tools/browser/cdp-client/factory.ts +48 -76
- package/src/tools/browser/cdp-client/index.ts +1 -14
- package/src/tools/executor.ts +44 -31
- package/src/tools/host-filesystem/edit.ts +3 -2
- package/src/tools/host-filesystem/read.ts +3 -2
- package/src/tools/host-filesystem/transfer.test.ts +45 -42
- package/src/tools/host-filesystem/transfer.ts +4 -3
- package/src/tools/host-filesystem/write.ts +3 -2
- package/src/tools/host-terminal/host-shell.ts +4 -3
- package/src/tools/network/script-proxy/index.ts +1 -10
- package/src/tools/permission-checker.ts +66 -1
- package/src/tools/skills/sandbox-runner.ts +1 -6
- package/src/tools/skills/skill-tool-factory.ts +32 -0
- package/src/tools/terminal/safe-env.ts +1 -0
- package/src/tools/terminal/shell.ts +2 -78
- package/src/tools/types.ts +12 -39
- package/src/tts/__tests__/provider-catalog.test.ts +2 -2
- package/src/tts/provider-catalog.ts +1 -1
- package/src/usage/actors.ts +2 -1
- package/src/usage/attribution.ts +185 -0
- package/src/usage/pricing.ts +166 -0
- package/src/usage/types.ts +14 -0
- package/src/util/json.ts +13 -0
- package/src/util/logger.ts +3 -3
- package/src/util/pricing.ts +50 -3
- package/src/work-items/work-item-runner.ts +15 -42
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +4 -3
- package/src/workspace/migrations/052-seed-default-inference-profiles.ts +3 -3
- package/src/workspace/migrations/060-memory-v2-init.ts +2 -18
- package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +59 -0
- package/src/workspace/migrations/062-drop-memory-v2-edges-json.ts +27 -0
- package/src/workspace/migrations/063-release-notes-dynamic-model-context.ts +70 -0
- package/src/workspace/migrations/064-unwind-main-agent-opus-seed.ts +64 -0
- package/src/workspace/migrations/registry.ts +8 -0
- package/src/workspace/provider-commit-message-generator.ts +3 -3
- package/src/__tests__/sandbox-diagnostics.test.ts +0 -138
- package/src/__tests__/sandbox-host-parity.test.ts +0 -1024
- package/src/__tests__/secret-detection-handler.test.ts +0 -67
- package/src/__tests__/secret-scanner-executor.test.ts +0 -450
- package/src/__tests__/tcc-sandbox-deny.test.ts +0 -198
- package/src/__tests__/terminal-sandbox.test.ts +0 -374
- package/src/__tests__/tool-notification-listener.test.ts +0 -65
- package/src/context/__tests__/microcompact.test.ts +0 -805
- package/src/context/microcompact.ts +0 -443
- package/src/daemon/handlers/slack-channel-oauth-install.ts +0 -197
- package/src/events/tool-notification-listener.ts +0 -17
- package/src/ipc/routes/__tests__/memory-v2-validate.test.ts +0 -219
- package/src/memory/v2/__tests__/edges.test.ts +0 -435
- package/src/memory/v2/edges.ts +0 -217
- package/src/prompts/__tests__/system-prompt-memory-v2.test.ts +0 -197
- package/src/runtime/__tests__/chrome-extension-registry.test.ts +0 -518
- package/src/runtime/__tests__/client-registry.test.ts +0 -271
- package/src/runtime/chrome-extension-registry.ts +0 -368
- package/src/runtime/client-registry.ts +0 -254
- package/src/runtime/routes/inbound-stages/verification-intercept.ts +0 -329
- package/src/tools/secret-detection-handler.ts +0 -269
- package/src/tools/terminal/backends/native.ts +0 -327
- package/src/tools/terminal/backends/types.ts +0 -37
- package/src/tools/terminal/sandbox-diagnostics.ts +0 -87
- package/src/tools/terminal/sandbox.ts +0 -40
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { ApprovalMode, ApprovalReason } from "./types.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Map a raw permission decision string (from permission-checker.ts) and
|
|
5
|
+
* optional context discriminants to a stable (approvalMode, approvalReason)
|
|
6
|
+
* pair for persistence and client display.
|
|
7
|
+
*
|
|
8
|
+
* Decision strings:
|
|
9
|
+
* "allow" — auto-allowed by policy (sandbox, trust rule, or threshold)
|
|
10
|
+
* "deny" — user denied via interactive prompt
|
|
11
|
+
* "denied" — system denied (no interactive client, or trust rule deny)
|
|
12
|
+
* "platform_auto_approve" — guardian bash in platform-hosted session
|
|
13
|
+
* "guardian_auto_approve" — non-interactive guardian session within background threshold
|
|
14
|
+
*/
|
|
15
|
+
export function mapApprovalProvenance(
|
|
16
|
+
decision: string,
|
|
17
|
+
opts: {
|
|
18
|
+
hasSandboxAutoApprove?: boolean;
|
|
19
|
+
matchedTrustRuleId?: string;
|
|
20
|
+
wasPrompted?: boolean;
|
|
21
|
+
wasTimeout?: boolean;
|
|
22
|
+
wasSystemCancel?: boolean;
|
|
23
|
+
wasAbort?: boolean;
|
|
24
|
+
},
|
|
25
|
+
): { approvalMode: ApprovalMode; approvalReason: ApprovalReason } {
|
|
26
|
+
if (decision === "platform_auto_approve") {
|
|
27
|
+
return { approvalMode: "auto", approvalReason: "platform_auto_approve" };
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (decision === "guardian_auto_approve") {
|
|
31
|
+
return { approvalMode: "auto", approvalReason: "within_threshold" };
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (decision === "allow") {
|
|
35
|
+
if (opts.wasPrompted) {
|
|
36
|
+
return { approvalMode: "prompted", approvalReason: "user_approved" };
|
|
37
|
+
}
|
|
38
|
+
if (opts.hasSandboxAutoApprove) {
|
|
39
|
+
return { approvalMode: "auto", approvalReason: "sandbox_auto_approve" };
|
|
40
|
+
}
|
|
41
|
+
if (opts.matchedTrustRuleId) {
|
|
42
|
+
return { approvalMode: "auto", approvalReason: "trust_rule_allowed" };
|
|
43
|
+
}
|
|
44
|
+
return { approvalMode: "auto", approvalReason: "within_threshold" };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// "deny" — interactive prompt denied, timed out, or system-cancelled
|
|
48
|
+
if (decision === "deny") {
|
|
49
|
+
if (opts.wasSystemCancel) {
|
|
50
|
+
return { approvalMode: "prompted", approvalReason: "system_cancelled" };
|
|
51
|
+
}
|
|
52
|
+
if (opts.wasAbort) {
|
|
53
|
+
return { approvalMode: "prompted", approvalReason: "system_cancelled" };
|
|
54
|
+
}
|
|
55
|
+
if (opts.wasTimeout) {
|
|
56
|
+
return { approvalMode: "prompted", approvalReason: "timed_out" };
|
|
57
|
+
}
|
|
58
|
+
return { approvalMode: "prompted", approvalReason: "user_denied" };
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// "denied" — system denied without user interaction
|
|
62
|
+
if (decision === "denied") {
|
|
63
|
+
if (opts.matchedTrustRuleId) {
|
|
64
|
+
return { approvalMode: "blocked", approvalReason: "trust_rule_denied" };
|
|
65
|
+
}
|
|
66
|
+
return { approvalMode: "blocked", approvalReason: "no_interactive_client" };
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return { approvalMode: "unknown", approvalReason: "unknown" };
|
|
70
|
+
}
|
|
@@ -198,7 +198,7 @@ function canonicalizeWebFetchUrl(parsed: URL): URL {
|
|
|
198
198
|
return parsed;
|
|
199
199
|
}
|
|
200
200
|
|
|
201
|
-
|
|
201
|
+
function normalizeWebFetchUrl(rawUrl: string): URL | null {
|
|
202
202
|
const trimmed = rawUrl.trim();
|
|
203
203
|
if (!trimmed) return null;
|
|
204
204
|
|
|
@@ -558,6 +558,9 @@ export async function check(
|
|
|
558
558
|
decision: approvalDecision.decision,
|
|
559
559
|
reason: enrichedReason,
|
|
560
560
|
matchedRule: approvalDecision.matchedRule,
|
|
561
|
+
hasSandboxAutoApprove:
|
|
562
|
+
approvalDecision.reason ===
|
|
563
|
+
"Workspace filesystem operation (sandbox auto-approve)" || undefined,
|
|
561
564
|
};
|
|
562
565
|
}
|
|
563
566
|
|
|
@@ -141,7 +141,10 @@ export async function getAutoApproveThreshold(
|
|
|
141
141
|
return value;
|
|
142
142
|
}
|
|
143
143
|
// Unexpected value from gateway — default to "none" (Strict).
|
|
144
|
-
log.warn(
|
|
144
|
+
log.warn(
|
|
145
|
+
{ field, value },
|
|
146
|
+
"Gateway returned unexpected threshold value, defaulting to none",
|
|
147
|
+
);
|
|
145
148
|
return "none";
|
|
146
149
|
} catch (err) {
|
|
147
150
|
// Gateway unreachable — default to "none" (Strict) so no tools are
|
|
@@ -16,6 +16,8 @@ interface PendingPrompt {
|
|
|
16
16
|
selectedPattern?: string;
|
|
17
17
|
selectedScope?: string;
|
|
18
18
|
decisionContext?: string;
|
|
19
|
+
wasTimeout?: boolean;
|
|
20
|
+
wasSystemCancel?: boolean;
|
|
19
21
|
}) => void;
|
|
20
22
|
reject: (reason: Error) => void;
|
|
21
23
|
timer: ReturnType<typeof setTimeout>;
|
|
@@ -71,8 +73,11 @@ export class PermissionPrompter {
|
|
|
71
73
|
selectedPattern?: string;
|
|
72
74
|
selectedScope?: string;
|
|
73
75
|
decisionContext?: string;
|
|
76
|
+
wasTimeout?: boolean;
|
|
77
|
+
wasSystemCancel?: boolean;
|
|
78
|
+
wasAbort?: boolean;
|
|
74
79
|
}> {
|
|
75
|
-
if (signal?.aborted) return { decision: "deny" };
|
|
80
|
+
if (signal?.aborted) return { decision: "deny", wasAbort: true };
|
|
76
81
|
|
|
77
82
|
const requestId = uuid();
|
|
78
83
|
|
|
@@ -87,6 +92,7 @@ export class PermissionPrompter {
|
|
|
87
92
|
this.onStateChanged?.(requestId, "timed_out", "timeout", toolUseId);
|
|
88
93
|
resolve({
|
|
89
94
|
decision: "deny",
|
|
95
|
+
wasTimeout: true,
|
|
90
96
|
decisionContext: `The permission prompt for the "${toolName}" tool timed out. The user did not explicitly deny this request — they may have been away or busy. You may retry this tool call if it is still needed for the current task.`,
|
|
91
97
|
});
|
|
92
98
|
}, timeoutMs);
|
|
@@ -103,7 +109,7 @@ export class PermissionPrompter {
|
|
|
103
109
|
if (this.pending.has(requestId)) {
|
|
104
110
|
clearTimeout(timer);
|
|
105
111
|
this.pending.delete(requestId);
|
|
106
|
-
resolve({ decision: "deny" });
|
|
112
|
+
resolve({ decision: "deny", wasAbort: true });
|
|
107
113
|
}
|
|
108
114
|
};
|
|
109
115
|
signal.addEventListener("abort", onAbort, { once: true });
|
|
@@ -187,6 +193,7 @@ export class PermissionPrompter {
|
|
|
187
193
|
this.pending.delete(requestId);
|
|
188
194
|
pending.resolve({
|
|
189
195
|
decision: "deny",
|
|
196
|
+
wasSystemCancel: true,
|
|
190
197
|
decisionContext:
|
|
191
198
|
"The user sent a new message instead of responding to this permission prompt. Stop what you are doing and respond to the user's new message. Do NOT retry this tool or request permission again until the user asks you to.",
|
|
192
199
|
});
|
|
@@ -2,6 +2,8 @@ import { v4 as uuid } from "uuid";
|
|
|
2
2
|
|
|
3
3
|
import { getConfig } from "../config/loader.js";
|
|
4
4
|
import type { ServerMessage } from "../daemon/message-protocol.js";
|
|
5
|
+
import { broadcastMessage } from "../runtime/assistant-event-hub.js";
|
|
6
|
+
import * as pendingInteractions from "../runtime/pending-interactions.js";
|
|
5
7
|
import { AssistantError, ErrorCode } from "../util/errors.js";
|
|
6
8
|
import { getLogger } from "../util/logger.js";
|
|
7
9
|
|
|
@@ -33,38 +35,22 @@ export interface SecretPrompterChannelContext {
|
|
|
33
35
|
|
|
34
36
|
export class SecretPrompter {
|
|
35
37
|
private pending = new Map<string, PendingSecretPrompt>();
|
|
36
|
-
private sendToClient: (msg: ServerMessage) => void;
|
|
37
|
-
private broadcastToAllClients?: (msg: ServerMessage) => void;
|
|
38
38
|
private channelContext?: SecretPrompterChannelContext;
|
|
39
39
|
|
|
40
|
-
constructor(
|
|
41
|
-
sendToClient: (msg: ServerMessage) => void,
|
|
42
|
-
broadcastToAllClients?: (msg: ServerMessage) => void,
|
|
43
|
-
) {
|
|
44
|
-
this.sendToClient = sendToClient;
|
|
45
|
-
this.broadcastToAllClients = broadcastToAllClients;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
updateSender(sendToClient: (msg: ServerMessage) => void): void {
|
|
49
|
-
this.sendToClient = sendToClient;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
updateBroadcast(broadcastToAllClients?: (msg: ServerMessage) => void): void {
|
|
53
|
-
this.broadcastToAllClients = broadcastToAllClients;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
40
|
setChannelContext(ctx: SecretPrompterChannelContext | undefined): void {
|
|
57
41
|
this.channelContext = ctx;
|
|
58
42
|
}
|
|
59
43
|
|
|
60
44
|
/**
|
|
61
|
-
*
|
|
45
|
+
* Broadcast a secret_request to all connected clients and wait for a
|
|
46
|
+
* response.
|
|
62
47
|
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
48
|
+
* The request is always published to the SSE hub via
|
|
49
|
+
* {@link broadcastMessage} so any connected client (desktop, web) can
|
|
50
|
+
* display the secure prompt dialog.
|
|
51
|
+
*
|
|
52
|
+
* Pending interaction registration is handled by {@link broadcastMessage}
|
|
53
|
+
* when the secret_request event is published to the hub.
|
|
68
54
|
*
|
|
69
55
|
* SECURITY: Logs only metadata (requestId, service, field) — never the
|
|
70
56
|
* returned secret value. The timeout path also returns a null value
|
|
@@ -81,32 +67,23 @@ export class SecretPrompter {
|
|
|
81
67
|
allowedTools?: string[],
|
|
82
68
|
allowedDomains?: string[],
|
|
83
69
|
): Promise<SecretPromptResult> {
|
|
84
|
-
// Determine whether the originating channel can render secure prompts.
|
|
85
|
-
const channelSupportsPrompt =
|
|
86
|
-
this.channelContext?.supportsDynamicUi !== false;
|
|
87
|
-
|
|
88
|
-
// If the channel cannot render the prompt and there's no broadcast path
|
|
89
|
-
// to reach a desktop client, fail fast instead of hanging for 5 minutes.
|
|
90
|
-
if (!channelSupportsPrompt && !this.broadcastToAllClients) {
|
|
91
|
-
log.warn(
|
|
92
|
-
{ service, field, channel: this.channelContext?.channel },
|
|
93
|
-
"Secret prompt requested from a channel that cannot render it and no broadcast path is available",
|
|
94
|
-
);
|
|
95
|
-
return { value: null, delivery: "store", error: "unsupported_channel" };
|
|
96
|
-
}
|
|
97
|
-
|
|
98
70
|
const requestId = uuid();
|
|
71
|
+
const effectiveConversationId = conversationId ?? "unknown";
|
|
99
72
|
|
|
100
73
|
return new Promise((resolve, reject) => {
|
|
101
74
|
const timeoutMs = getConfig().timeouts.permissionTimeoutSec * 1000;
|
|
102
75
|
const timer = setTimeout(() => {
|
|
103
76
|
this.pending.delete(requestId);
|
|
77
|
+
pendingInteractions.resolve(requestId);
|
|
104
78
|
log.warn({ requestId, service, field }, "Secret prompt timed out");
|
|
105
79
|
resolve({ value: null, delivery: "store" });
|
|
106
80
|
}, timeoutMs);
|
|
107
81
|
|
|
108
82
|
this.pending.set(requestId, { resolve, reject, timer });
|
|
109
83
|
|
|
84
|
+
// pendingInteractions.register is now handled by broadcastMessage
|
|
85
|
+
// when the secret_request event is published to the hub.
|
|
86
|
+
|
|
110
87
|
const config = getConfig();
|
|
111
88
|
const msg: SecretRequestMessage = {
|
|
112
89
|
type: "secret_request",
|
|
@@ -116,21 +93,14 @@ export class SecretPrompter {
|
|
|
116
93
|
label,
|
|
117
94
|
description,
|
|
118
95
|
placeholder,
|
|
119
|
-
conversationId,
|
|
96
|
+
conversationId: effectiveConversationId,
|
|
120
97
|
purpose,
|
|
121
98
|
allowedTools,
|
|
122
99
|
allowedDomains,
|
|
123
100
|
allowOneTimeSend: config.secretDetection.allowOneTimeSend,
|
|
124
101
|
};
|
|
125
102
|
|
|
126
|
-
|
|
127
|
-
// secure prompts — this routes the request to the SSE hub where a
|
|
128
|
-
// connected desktop client can pick it up.
|
|
129
|
-
if (!channelSupportsPrompt && this.broadcastToAllClients) {
|
|
130
|
-
this.broadcastToAllClients(msg);
|
|
131
|
-
} else {
|
|
132
|
-
this.sendToClient(msg);
|
|
133
|
-
}
|
|
103
|
+
broadcastMessage(msg);
|
|
134
104
|
});
|
|
135
105
|
}
|
|
136
106
|
|
|
@@ -157,12 +127,15 @@ export class SecretPrompter {
|
|
|
157
127
|
}
|
|
158
128
|
clearTimeout(pending.timer);
|
|
159
129
|
this.pending.delete(requestId);
|
|
130
|
+
// Clean up the global map (may already be removed by approval-routes).
|
|
131
|
+
pendingInteractions.resolve(requestId);
|
|
160
132
|
pending.resolve({ value: value ?? null, delivery: delivery ?? "store" });
|
|
161
133
|
}
|
|
162
134
|
|
|
163
135
|
dispose(): void {
|
|
164
|
-
for (const [, pending] of this.pending) {
|
|
136
|
+
for (const [requestId, pending] of this.pending) {
|
|
165
137
|
clearTimeout(pending.timer);
|
|
138
|
+
pendingInteractions.resolve(requestId);
|
|
166
139
|
pending.reject(
|
|
167
140
|
new AssistantError("Prompter disposed", ErrorCode.INTERNAL_ERROR),
|
|
168
141
|
);
|
package/src/permissions/types.ts
CHANGED
|
@@ -4,6 +4,37 @@ export type {
|
|
|
4
4
|
} from "@vellumai/skill-host-contracts";
|
|
5
5
|
export { RiskLevel } from "@vellumai/skill-host-contracts";
|
|
6
6
|
|
|
7
|
+
export type ApprovalMode = "prompted" | "auto" | "blocked" | "unknown";
|
|
8
|
+
|
|
9
|
+
export type ApprovalReason =
|
|
10
|
+
| "user_approved"
|
|
11
|
+
| "user_denied"
|
|
12
|
+
| "timed_out"
|
|
13
|
+
| "within_threshold"
|
|
14
|
+
| "trust_rule_allowed"
|
|
15
|
+
| "trust_rule_denied"
|
|
16
|
+
| "sandbox_auto_approve"
|
|
17
|
+
| "platform_auto_approve"
|
|
18
|
+
| "no_interactive_client"
|
|
19
|
+
| "grant_scoped_consumed"
|
|
20
|
+
| "system_cancelled"
|
|
21
|
+
| "unknown";
|
|
22
|
+
|
|
23
|
+
export type RiskThreshold = "none" | "low" | "medium" | "high";
|
|
24
|
+
|
|
25
|
+
export const RISK_ORDINAL: Record<string, number> = {
|
|
26
|
+
low: 0,
|
|
27
|
+
medium: 1,
|
|
28
|
+
high: 2,
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export const THRESHOLD_ORDINAL: Record<string, number> = {
|
|
32
|
+
none: -1,
|
|
33
|
+
low: 0,
|
|
34
|
+
medium: 1,
|
|
35
|
+
high: 2,
|
|
36
|
+
};
|
|
37
|
+
|
|
7
38
|
/** A persistent trust rule stored on disk and used for permission matching. */
|
|
8
39
|
export interface TrustRule {
|
|
9
40
|
id: string;
|
|
@@ -27,6 +58,8 @@ export interface PermissionCheckResult {
|
|
|
27
58
|
decision: "allow" | "deny" | "prompt";
|
|
28
59
|
reason: string;
|
|
29
60
|
matchedRule?: TrustRule;
|
|
61
|
+
/** True when the decision was taken via the sandbox auto-approve path. */
|
|
62
|
+
hasSandboxAutoApprove?: boolean;
|
|
30
63
|
}
|
|
31
64
|
|
|
32
65
|
/** Contextual information passed alongside a permission check for policy decisions. */
|
|
@@ -68,11 +68,6 @@ const HOST_TOOLS = new Set([
|
|
|
68
68
|
"computer_use_run_applescript",
|
|
69
69
|
]);
|
|
70
70
|
|
|
71
|
-
/** Check whether a tool name is a host-level tool. */
|
|
72
|
-
export function isHostTool(toolName: string): boolean {
|
|
73
|
-
return HOST_TOOLS.has(toolName);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
71
|
/** Safe local-only tools that are always workspace-scoped. */
|
|
77
72
|
const ALWAYS_SCOPED_TOOLS = new Set([
|
|
78
73
|
"skill_load",
|
|
@@ -119,11 +119,3 @@ function clearRequestedIfLatest(requestSeq: number): void {
|
|
|
119
119
|
lastRequestedName = lastSyncedName;
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
|
-
|
|
123
|
-
/** Reset cached state (for testing). */
|
|
124
|
-
export function _resetSyncState(): void {
|
|
125
|
-
lastSyncedName = null;
|
|
126
|
-
lastRequestedName = null;
|
|
127
|
-
seq = 0;
|
|
128
|
-
pending = Promise.resolve();
|
|
129
|
-
}
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
* | `unified-turn-context` | 20 | prepend-user-tail |
|
|
17
17
|
* | `pkb-context` | 30 | after-memory-prefix |
|
|
18
18
|
* | `pkb-reminder` | 35 | after-memory-prefix |
|
|
19
|
+
* | `memory-v2-static` | 38 | after-memory-prefix |
|
|
19
20
|
* | `now-md` | 40 | after-memory-prefix |
|
|
20
21
|
* | `subagent-status` | 50 | append-user-tail |
|
|
21
22
|
* | `slack-messages` | 60 | replace-run-messages |
|
|
@@ -44,8 +45,10 @@
|
|
|
44
45
|
|
|
45
46
|
import { resolve } from "node:path";
|
|
46
47
|
|
|
48
|
+
import { getConfig } from "../../config/loader.js";
|
|
47
49
|
import { getInContextPkbPaths } from "../../daemon/pkb-context-tracker.js";
|
|
48
50
|
import { buildPkbReminder } from "../../daemon/pkb-reminder-builder.js";
|
|
51
|
+
import { isMemoryV2ReadActive } from "../../memory/context-search/sources/memory-v2.js";
|
|
49
52
|
import { searchPkbFiles } from "../../memory/pkb/pkb-search.js";
|
|
50
53
|
import { getLogger } from "../../util/logger.js";
|
|
51
54
|
import { registerPlugin } from "../registry.js";
|
|
@@ -84,6 +87,7 @@ export const DEFAULT_INJECTOR_ORDER = {
|
|
|
84
87
|
unifiedTurnContext: 20,
|
|
85
88
|
pkbContext: 30,
|
|
86
89
|
pkbReminder: 35,
|
|
90
|
+
memoryV2Static: 38,
|
|
87
91
|
nowMd: 40,
|
|
88
92
|
subagentStatus: 50,
|
|
89
93
|
slackMessages: 60,
|
|
@@ -94,6 +98,18 @@ function readInjectionInputs(ctx: TurnContext): TurnInjectionInputs {
|
|
|
94
98
|
return ctx.injectionInputs ?? {};
|
|
95
99
|
}
|
|
96
100
|
|
|
101
|
+
/**
|
|
102
|
+
* v2 read-side cutover guard. The `pkb-context` injector silences itself
|
|
103
|
+
* under v2 because the `<knowledge_base>` block surfaces PKB content the v2
|
|
104
|
+
* activation block already covers. The `pkb-reminder` injector still fires
|
|
105
|
+
* (its body is generic recall/remember guidance) but skips the hybrid-search
|
|
106
|
+
* hints — those name PKB paths v2 is moving away from. NOW.md is workspace
|
|
107
|
+
* state independent of PKB and fires unchanged.
|
|
108
|
+
*/
|
|
109
|
+
function isPkbInjectionSilencedByV2(): boolean {
|
|
110
|
+
return isMemoryV2ReadActive(getConfig());
|
|
111
|
+
}
|
|
112
|
+
|
|
97
113
|
/**
|
|
98
114
|
* `workspace-context` injector — order 10, prepend-user-tail.
|
|
99
115
|
*
|
|
@@ -173,6 +189,7 @@ const pkbContextInjector: Injector = {
|
|
|
173
189
|
const inputs = readInjectionInputs(ctx);
|
|
174
190
|
const mode = inputs.mode ?? "full";
|
|
175
191
|
if (mode !== "full") return null;
|
|
192
|
+
if (isPkbInjectionSilencedByV2()) return null;
|
|
176
193
|
if (!inputs.pkbContext) return null;
|
|
177
194
|
return {
|
|
178
195
|
id: "pkb-context",
|
|
@@ -203,7 +220,9 @@ const pkbReminderInjector: Injector = {
|
|
|
203
220
|
const mode = inputs.mode ?? "full";
|
|
204
221
|
if (mode !== "full") return null;
|
|
205
222
|
if (!inputs.pkbActive) return null;
|
|
206
|
-
const reminder =
|
|
223
|
+
const reminder = isPkbInjectionSilencedByV2()
|
|
224
|
+
? buildPkbReminder([])
|
|
225
|
+
: await buildPkbReminderWithHints(inputs);
|
|
207
226
|
return {
|
|
208
227
|
id: "pkb-reminder",
|
|
209
228
|
text: reminder,
|
|
@@ -296,6 +315,53 @@ async function buildPkbReminderWithHints(
|
|
|
296
315
|
return buildPkbReminder(hints);
|
|
297
316
|
}
|
|
298
317
|
|
|
318
|
+
/**
|
|
319
|
+
* `memory-v2-static` injector — order 38, after-memory-prefix.
|
|
320
|
+
*
|
|
321
|
+
* Injects the v2 static memory block (essentials/threads/recent/buffer
|
|
322
|
+
* concatenated under markdown headings) wrapped in `<memory>...</memory>`
|
|
323
|
+
* onto the user message. The agent loop only forwards `memoryV2Static` on
|
|
324
|
+
* full-mode turns (first turn / post-compaction), mirroring the PKB
|
|
325
|
+
* auto-inject cadence — subsequent turns get `null` and the prior block
|
|
326
|
+
* stays cached on its original user message.
|
|
327
|
+
*
|
|
328
|
+
* Sits between `pkb-reminder` (35) and `now-md` (40) so the rendered order
|
|
329
|
+
* after the memory prefix is `[pkb-reminder, pkb-context, memory-v2-static,
|
|
330
|
+
* now-md, ...user text]` when every PKB injector also fires (transitional
|
|
331
|
+
* state). Once PKB is fully retired under v2 this is the only block
|
|
332
|
+
* adjacent to the memory prefix.
|
|
333
|
+
*
|
|
334
|
+
* Gating:
|
|
335
|
+
* - `mode === "full"`.
|
|
336
|
+
* - `memoryV2Static` is a non-null, non-empty string.
|
|
337
|
+
*/
|
|
338
|
+
const memoryV2StaticInjector: Injector = {
|
|
339
|
+
name: "memory-v2-static",
|
|
340
|
+
order: DEFAULT_INJECTOR_ORDER.memoryV2Static,
|
|
341
|
+
async produce(ctx: TurnContext): Promise<InjectionBlock | null> {
|
|
342
|
+
const inputs = readInjectionInputs(ctx);
|
|
343
|
+
const mode = inputs.mode ?? "full";
|
|
344
|
+
if (mode !== "full") return null;
|
|
345
|
+
const content = inputs.memoryV2Static;
|
|
346
|
+
if (!content) return null;
|
|
347
|
+
return {
|
|
348
|
+
id: "memory-v2-static",
|
|
349
|
+
text: buildMemoryV2StaticBlock(content),
|
|
350
|
+
placement: "after-memory-prefix",
|
|
351
|
+
};
|
|
352
|
+
},
|
|
353
|
+
};
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* Wrap the static memory content in `<memory>...</memory>`. Escapes any
|
|
357
|
+
* closing `</memory>` inside the content so authored memory files cannot
|
|
358
|
+
* accidentally break out of the wrapper.
|
|
359
|
+
*/
|
|
360
|
+
function buildMemoryV2StaticBlock(content: string): string {
|
|
361
|
+
const escaped = content.replace(/<\/memory\s*>/gi, "</memory>");
|
|
362
|
+
return `<memory>\n${escaped}\n</memory>`;
|
|
363
|
+
}
|
|
364
|
+
|
|
299
365
|
/**
|
|
300
366
|
* `now-md` injector — order 40, after-memory-prefix.
|
|
301
367
|
*
|
|
@@ -362,7 +428,7 @@ const subagentStatusInjector: Injector = {
|
|
|
362
428
|
* Swaps the conversation's `runMessages` array with a pre-rendered
|
|
363
429
|
* chronological Slack transcript built from the persisted message rows.
|
|
364
430
|
* Applied to every Slack conversation (channels and DMs alike). The
|
|
365
|
-
* orchestrator builds the transcript via `
|
|
431
|
+
* orchestrator builds the transcript via `loadSlackChronologicalContext`
|
|
366
432
|
* before the chain runs.
|
|
367
433
|
*
|
|
368
434
|
* Memory-block prepending is preserved across the replacement:
|
|
@@ -458,6 +524,7 @@ export const defaultInjectorsPlugin: Plugin = {
|
|
|
458
524
|
unifiedTurnContextInjector,
|
|
459
525
|
pkbContextInjector,
|
|
460
526
|
pkbReminderInjector,
|
|
527
|
+
memoryV2StaticInjector,
|
|
461
528
|
nowMdInjector,
|
|
462
529
|
subagentStatusInjector,
|
|
463
530
|
slackMessagesInjector,
|
|
@@ -74,8 +74,9 @@ export const defaultOverflowReduceMiddleware: Middleware<
|
|
|
74
74
|
attempts++;
|
|
75
75
|
args.emitActivityState();
|
|
76
76
|
|
|
77
|
+
const basisMessages = messages;
|
|
77
78
|
const step = await reduceContextOverflow(
|
|
78
|
-
|
|
79
|
+
basisMessages,
|
|
79
80
|
{
|
|
80
81
|
providerName: args.providerName,
|
|
81
82
|
systemPrompt: args.systemPrompt,
|
|
@@ -101,7 +102,7 @@ export const defaultOverflowReduceMiddleware: Middleware<
|
|
|
101
102
|
// Let the orchestrator apply compaction side effects (circuit-breaker
|
|
102
103
|
// tracking, event emission, ctx mutation) before we re-inject.
|
|
103
104
|
if (step.compactionResult) {
|
|
104
|
-
await args.onCompactionResult(step.compactionResult);
|
|
105
|
+
await args.onCompactionResult(step.compactionResult, basisMessages);
|
|
105
106
|
if (stepCompacted) {
|
|
106
107
|
reducerCompacted = true;
|
|
107
108
|
}
|
package/src/plugins/types.ts
CHANGED
|
@@ -401,6 +401,7 @@ export interface OverflowReduceArgs {
|
|
|
401
401
|
*/
|
|
402
402
|
readonly onCompactionResult: (
|
|
403
403
|
result: ContextWindowResult,
|
|
404
|
+
compactedBasis?: Message[],
|
|
404
405
|
) => void | Promise<void>;
|
|
405
406
|
/**
|
|
406
407
|
* Invoked after each step to rebuild `runMessages` from the step's
|
|
@@ -815,6 +816,13 @@ export interface TurnInjectionInputs {
|
|
|
815
816
|
* Falls back to `pkbRoot` when omitted.
|
|
816
817
|
*/
|
|
817
818
|
readonly pkbWorkingDir?: string;
|
|
819
|
+
/**
|
|
820
|
+
* Pre-rendered v2 static memory content (essentials/threads/recent/buffer
|
|
821
|
+
* concatenated, header-wrapped) or null to skip. The agent loop only
|
|
822
|
+
* passes this on full-mode turns; the injector wraps it in `<memory>` for
|
|
823
|
+
* the user message.
|
|
824
|
+
*/
|
|
825
|
+
readonly memoryV2Static?: string | null;
|
|
818
826
|
/** NOW.md scratchpad content or null to skip. */
|
|
819
827
|
readonly nowScratchpad?: string | null;
|
|
820
828
|
/** Pre-built `<active_subagents>` block or null to skip. */
|