@vellumai/assistant 0.9.0 → 0.10.0-staging.2
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 +18 -34
- package/bun.lock +7 -8
- package/docs/activation-funnel-telemetry.md +28 -22
- package/docs/architecture/security.md +29 -28
- package/docs/stt-provider-onboarding.md +3 -5
- package/docs/workflows-testing.md +13 -44
- package/docs/workflows.md +3 -5
- package/node_modules/@vellumai/ces-client/src/__tests__/ces-client.test.ts +47 -0
- package/node_modules/@vellumai/ces-client/src/rpc-client.ts +28 -5
- package/node_modules/@vellumai/environments/src/seeds.ts +2 -5
- package/node_modules/@vellumai/gateway-client/src/admission-policy-contract.ts +97 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +10 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +32 -6
- package/node_modules/@vellumai/gateway-client/src/outbound-contract.ts +119 -0
- package/node_modules/@vellumai/gateway-client/src/types.ts +15 -84
- package/openapi.yaml +976 -63
- package/package.json +2 -1
- package/scripts/sync-llm-catalog.ts +6 -15
- package/scripts/sync-web-search-catalog.ts +3 -11
- package/src/__tests__/access-request-card-view.test.ts +98 -0
- package/src/__tests__/access-request-seed-content-blocks.test.ts +2 -4
- package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +72 -32
- package/src/__tests__/agent-loop-compaction-strip.test.ts +241 -0
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +16 -13
- package/src/__tests__/agent-loop-output-hooks.test.ts +69 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +25 -0
- package/src/__tests__/always-loaded-tools-guard.test.ts +2 -3
- package/src/__tests__/app-compiler.test.ts +15 -1
- package/src/__tests__/app-dir-path-guard.test.ts +0 -1
- package/src/__tests__/assistant-feature-flag-guard.test.ts +1 -4
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +0 -2
- package/src/__tests__/auth-fallback-events-store.test.ts +6 -14
- package/src/__tests__/avatar-identity-sync.test.ts +2 -27
- package/src/__tests__/btw-routes.test.ts +6 -8
- package/src/__tests__/call-pointer-messages.test.ts +28 -0
- package/src/__tests__/cancel-clears-processing.test.ts +89 -0
- package/src/__tests__/channel-approval-routes.test.ts +0 -4
- package/src/__tests__/channel-inbound-disk-pressure.test.ts +5 -15
- package/src/__tests__/checker.test.ts +0 -3
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +3 -4
- package/src/__tests__/compactor-image-manifest-trust.test.ts +21 -1
- package/src/__tests__/compactor-summary-call-truncation.test.ts +223 -0
- package/src/__tests__/config-loader-backfill.test.ts +268 -27
- package/src/__tests__/config-schema.test.ts +35 -0
- package/src/__tests__/config-watcher.test.ts +0 -18
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +2 -2
- package/src/__tests__/contact-store-user-file.test.ts +0 -6
- package/src/__tests__/contacts-tools.test.ts +29 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +22 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop.test.ts +58 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +0 -1
- package/src/__tests__/conversation-lifecycle.test.ts +7 -9
- package/src/__tests__/conversation-load-history-repair.test.ts +101 -0
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +15 -12
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +6 -3
- package/src/__tests__/conversation-title-service.test.ts +62 -0
- package/src/__tests__/credential-broker.test.ts +449 -1
- package/src/__tests__/credential-execution-shell-lockdown.test.ts +18 -11
- package/src/__tests__/credential-execution-tools.test.ts +0 -1
- package/src/__tests__/credential-prompt-route.test.ts +4 -4
- package/src/__tests__/credential-routes.test.ts +360 -0
- package/src/__tests__/credential-security-invariants.test.ts +4 -13
- package/src/__tests__/disk-pressure-policy.test.ts +12 -0
- package/src/__tests__/disk-usage.test.ts +65 -0
- package/src/__tests__/dynamic-page-surface.test.ts +152 -1
- package/src/__tests__/fixtures/credential-security-fixtures.ts +2 -33
- package/src/__tests__/gateway-flag-listener.test.ts +110 -1
- package/src/__tests__/gateway-only-guard.test.ts +3 -7
- package/src/__tests__/guardian-binding-drift-heal.test.ts +1 -1
- package/src/__tests__/guardian-card-withdrawal.test.ts +403 -0
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +5 -3
- package/src/__tests__/guardian-grant-minting.test.ts +3 -35
- package/src/__tests__/guardian-routing-invariants.test.ts +64 -26
- package/src/__tests__/guardian-routing-state.test.ts +0 -1
- package/src/__tests__/headless-browser-mode.test.ts +10 -0
- package/src/__tests__/headless-browser-navigate.test.ts +8 -3
- package/src/__tests__/helpers/create-guardian-binding.ts +0 -1
- package/src/__tests__/host-browser-proxy.test.ts +87 -0
- package/src/__tests__/identity-routes.test.ts +0 -189
- package/src/__tests__/inbound-invite-redemption.test.ts +4 -4
- package/src/__tests__/injector-v3-suppression.test.ts +27 -20
- package/src/__tests__/internal-telemetry-routes.test.ts +6 -14
- package/src/__tests__/invite-redemption-service.test.ts +4 -7
- package/src/__tests__/llm-callsite-catalog.test.ts +5 -6
- package/src/__tests__/llm-catalog-parity.test.ts +30 -23
- package/src/__tests__/llm-resolver.test.ts +70 -24
- package/src/__tests__/llm-schema.test.ts +1 -0
- package/src/__tests__/managed-profile-guard.test.ts +163 -4
- package/src/__tests__/mcp-health-check.test.ts +6 -7
- package/src/__tests__/media-stream-server-integration.test.ts +317 -13
- package/src/__tests__/oauth-provider-seed-logos.test.ts +4 -6
- package/src/__tests__/onboarding-persona-write.test.ts +1 -1
- package/src/__tests__/path-policy.test.ts +34 -0
- package/src/__tests__/persona-resolver.test.ts +49 -14
- package/src/__tests__/plugin-api-model-profiles.test.ts +178 -0
- package/src/__tests__/plugin-api-provider.test.ts +24 -0
- package/src/__tests__/plugin-tool-contribution.test.ts +6 -3
- package/src/__tests__/post-compaction-reinjection-idempotency.test.ts +214 -0
- package/src/__tests__/provider-send-message-override-profile.test.ts +76 -0
- package/src/__tests__/reaction-persistence.test.ts +150 -29
- package/src/__tests__/registry.test.ts +2 -7
- package/src/__tests__/relay-server.test.ts +285 -0
- package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
- package/src/__tests__/schedule-routes-workflow-validation.test.ts +1 -10
- package/src/__tests__/schedule-routes.test.ts +0 -30
- package/src/__tests__/schedule-tools.test.ts +2 -18
- package/src/__tests__/scheduler-reuse-conversation.test.ts +8 -5
- package/src/__tests__/skill-execute-input.test.ts +51 -1
- package/src/__tests__/skill-runtime-path.test.ts +2 -3
- package/src/__tests__/skills.test.ts +51 -0
- package/src/__tests__/slack-notification-approval-card.test.ts +176 -0
- package/src/__tests__/slack-reaction-canonical-approval.test.ts +285 -0
- package/src/__tests__/subagent-tools.test.ts +266 -0
- package/src/__tests__/surface-completion-nudge-hook.test.ts +367 -0
- package/src/__tests__/task-progress-nudge-hook.test.ts +1 -1
- package/src/__tests__/title-generate-hook.test.ts +100 -3
- package/src/__tests__/token-estimator-accuracy.benchmark.test.ts +1 -29
- package/src/__tests__/token-manager.test.ts +519 -0
- package/src/__tests__/tool-approval-seed-content-blocks.test.ts +1 -1
- package/src/__tests__/tool-audit-listener.test.ts +7 -7
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +6 -3
- package/src/__tests__/tool-executor.test.ts +0 -79
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +4 -2
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +220 -3
- package/src/__tests__/trusted-contact-multichannel.test.ts +3 -3
- package/src/__tests__/trusted-contact-verification.test.ts +8 -10
- package/src/__tests__/twilio-routes.test.ts +81 -1
- package/src/__tests__/voice-invite-redemption.test.ts +2 -3
- package/src/__tests__/weak-open-model.test.ts +30 -0
- package/src/__tests__/web-search-catalog-parity.test.ts +6 -25
- package/src/__tests__/workspace-greetings.test.ts +152 -0
- package/src/__tests__/workspace-migration-105-enable-memory-v3-live-for-new-workspaces.test.ts +149 -0
- package/src/__tests__/workspace-migration-108-drop-balanced-economy-profile.test.ts +285 -0
- package/src/__tests__/workspace-migration-add-send-diagnostics.test.ts +1 -1
- package/src/__tests__/workspace-migration-drop-collect-usage-data.test.ts +118 -0
- package/src/__tests__/workspace-migration-drop-send-diagnostics.test.ts +118 -0
- package/src/a2a/__tests__/e2e-a2a-channel.test.ts +0 -4
- package/src/agent/loop.ts +49 -29
- package/src/api/README.md +6 -6
- package/src/api/events/tool-result.ts +6 -0
- package/src/api/events/workflow-completed.ts +53 -0
- package/src/api/events/workflow-leaf-finished.ts +38 -0
- package/src/api/events/workflow-leaf-started.ts +35 -0
- package/src/api/events/workflow-progress.ts +32 -0
- package/src/api/events/workflow-started.ts +31 -0
- package/src/api/index.ts +40 -0
- package/src/api/responses/conversation-message.ts +28 -4
- package/src/api/responses/home.ts +26 -4
- package/src/api/responses/workflow-journal.ts +53 -0
- package/src/approvals/guardian-card-withdrawal.ts +145 -0
- package/src/approvals/guardian-decision-primitive.ts +26 -3
- package/src/approvals/guardian-request-resolvers.ts +183 -80
- package/src/calls/__tests__/channel-admission-reader.test.ts +132 -0
- package/src/calls/__tests__/relay-setup-router.test.ts +350 -0
- package/src/calls/call-pointer-messages.ts +10 -4
- package/src/calls/channel-admission-reader.ts +104 -0
- package/src/calls/guardian-dispatch.ts +17 -45
- package/src/calls/media-stream-server.ts +84 -2
- package/src/calls/relay-access-wait.ts +1 -1
- package/src/calls/relay-server.ts +66 -0
- package/src/calls/relay-setup-router.ts +82 -1
- package/src/calls/twilio-routes.ts +17 -8
- package/src/calls/voice-session-bridge.ts +2 -2
- package/src/cli/commands/clients.ts +3 -0
- package/src/cli/commands/{__tests__ → memory/__tests__}/memory-v2-compare-render.test.ts +1 -1
- package/src/cli/commands/{__tests__ → memory/__tests__}/memory-v2.test.ts +8 -7
- package/src/cli/commands/{__tests__ → memory/__tests__}/memory-v3.test.ts +5 -4
- package/src/cli/commands/memory/index.ts +30 -0
- package/src/cli/commands/{memory-v2-compare-render.ts → memory/memory-v2-compare-render.ts} +1 -1
- package/src/cli/commands/{memory-v2.ts → memory/memory-v2.ts} +6 -15
- package/src/cli/commands/{memory-v3.ts → memory/memory-v3.ts} +97 -11
- package/src/cli/commands/oauth/status.test.ts +36 -0
- package/src/cli/commands/oauth/status.ts +23 -3
- package/src/cli/commands/plugins.ts +197 -4
- package/src/cli/lib/__tests__/diff-plugin.test.ts +443 -0
- package/src/cli/lib/__tests__/inspect-plugin.test.ts +54 -0
- package/src/cli/lib/__tests__/merge-plugin-tree.test.ts +443 -0
- package/src/cli/lib/__tests__/plugin-surfaces.test.ts +111 -0
- package/src/cli/lib/__tests__/upgrade-plugin.test.ts +295 -2
- package/src/cli/lib/diff-plugin.ts +346 -0
- package/src/cli/lib/inspect-plugin.ts +12 -1
- package/src/cli/lib/install-from-github.ts +105 -17
- package/src/cli/lib/merge-plugin-tree.ts +328 -0
- package/src/cli/lib/plugin-fingerprint.ts +14 -0
- package/src/cli/lib/plugin-surfaces.ts +104 -0
- package/src/cli/lib/upgrade-plugin.ts +298 -10
- package/src/cli/program.ts +2 -6
- package/src/config/__tests__/sync-gated-profiles.test.ts +368 -0
- package/src/config/assistant-feature-flags.ts +22 -7
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +0 -1
- package/src/config/bundled-skills/messaging/SKILL.md +6 -4
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +9 -8
- package/src/config/bundled-skills/subagent/SKILL.md +4 -0
- package/src/config/bundled-skills/subagent/TOOLS.json +4 -0
- package/src/config/bundled-skills/workflows/SKILL.md +14 -8
- package/src/config/bundled-tool-registry.ts +2 -7
- package/src/config/call-site-defaults.ts +15 -2
- package/src/config/feature-flag-registry.json +46 -31
- package/src/config/inference-profile-validation.ts +26 -0
- package/src/config/llm-resolver.ts +3 -0
- package/src/config/loader.ts +4 -0
- package/src/config/memory-v3-gate.ts +11 -0
- package/src/config/profile-order.ts +28 -0
- package/src/config/schema.ts +8 -6
- package/src/config/schemas/__tests__/memory-v3.test.ts +1 -0
- package/src/config/schemas/call-site-catalog.ts +7 -0
- package/src/config/schemas/channels.ts +11 -0
- package/src/config/schemas/elevenlabs.ts +0 -1
- package/src/config/schemas/llm.ts +31 -0
- package/src/config/schemas/memory-lifecycle.ts +3 -7
- package/src/config/schemas/memory-v3.ts +6 -0
- package/src/config/schemas/platform.ts +0 -8
- package/src/config/schemas/services.ts +18 -0
- package/src/config/seed-inference-profiles.ts +109 -44
- package/src/config/skills.ts +21 -0
- package/src/config/sync-gated-profiles.ts +220 -0
- package/src/contacts/contact-store.ts +89 -106
- package/src/contacts/contacts-write.ts +5 -22
- package/src/contacts/types.ts +0 -1
- package/src/context/compactor.ts +88 -54
- package/src/context/strip-injections.ts +58 -10
- package/src/context/token-estimator.ts +1 -1
- package/src/credential-execution/process-manager.ts +55 -14
- package/src/credential-execution/prompted-credential.ts +2 -3
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +3 -2
- package/src/daemon/config-watcher.ts +0 -4
- package/src/daemon/conversation-agent-loop-handlers.ts +2 -0
- package/src/daemon/conversation-agent-loop.ts +114 -22
- package/src/daemon/conversation-history.ts +1 -1
- package/src/daemon/conversation-lifecycle.ts +3 -5
- package/src/daemon/conversation-process.ts +13 -5
- package/src/daemon/conversation-runtime-assembly.ts +13 -15
- package/src/daemon/conversation-slash.ts +2 -23
- package/src/daemon/conversation-surfaces.ts +26 -0
- package/src/daemon/conversation-tool-setup.ts +27 -14
- package/src/daemon/conversation.ts +66 -14
- package/src/daemon/disk-pressure-policy.ts +5 -3
- package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +0 -1
- package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +0 -1
- package/src/daemon/handlers/config-a2a.ts +0 -2
- package/src/daemon/handlers/config-channels.ts +15 -16
- package/src/daemon/handlers/config-slack-channel.ts +22 -3
- package/src/daemon/handlers/conversations.ts +107 -0
- package/src/daemon/host-browser-proxy.ts +41 -0
- package/src/daemon/lifecycle.ts +55 -27
- package/src/daemon/message-provenance.ts +2 -0
- package/src/daemon/message-types/contacts.ts +0 -1
- package/src/daemon/message-types/conversations.ts +3 -3
- package/src/daemon/message-types/sync.ts +0 -1
- package/src/daemon/message-types/web-activity.ts +7 -1
- package/src/daemon/message-types/workflows.ts +83 -1
- package/src/daemon/orphan-reaper.test.ts +0 -19
- package/src/daemon/orphan-reaper.ts +2 -24
- package/src/daemon/server.ts +0 -10
- package/src/daemon/tool-setup-types.ts +4 -0
- package/src/daemon/trust-context.ts +1 -1
- package/src/events/tool-audit-listener.ts +2 -2
- package/src/home/feed-source-enrichment.test.ts +151 -0
- package/src/home/feed-source-enrichment.ts +176 -0
- package/src/home/relationship-state.ts +2 -4
- package/src/instrument.ts +18 -6
- package/src/ipc/__tests__/binary-result-ipc.test.ts +81 -0
- package/src/ipc/__tests__/clients-list-ipc.test.ts +20 -0
- package/src/ipc/assistant-server.ts +37 -4
- package/src/ipc/gateway-flag-listener.ts +18 -2
- package/src/memory/__tests__/auto-analysis-enqueue.test.ts +5 -16
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +7 -11
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +37 -7
- package/src/memory/__tests__/memory-retrospective-job.test.ts +229 -401
- package/src/memory/__tests__/onboarding-events-store.test.ts +7 -7
- package/src/memory/auth-fallback-events-store.ts +2 -2
- package/src/memory/auto-analysis-enqueue.ts +3 -5
- package/src/memory/bookmark-crud.ts +1 -2
- package/src/memory/canonical-guardian-store.ts +39 -1
- package/src/memory/conversation-crud.ts +9 -4
- package/src/memory/conversation-key-store.ts +17 -2
- package/src/memory/conversation-title-service.ts +64 -7
- package/src/memory/db-init.ts +17 -17
- package/src/memory/embedding-backend.ts +38 -1
- package/src/memory/embedding-billing-breaker.ts +96 -0
- package/src/memory/jobs-store.ts +25 -13
- package/src/memory/jobs-worker.ts +54 -1
- package/src/memory/lifecycle-events-store.ts +2 -2
- package/src/memory/memory-retrospective-constants.ts +4 -4
- package/src/memory/memory-retrospective-enqueue.ts +31 -6
- package/src/memory/memory-retrospective-job.ts +28 -227
- package/src/memory/migrations/129-contact-channels-access-fields.ts +18 -9
- package/src/memory/migrations/131-drop-legacy-member-guardian-tables.ts +14 -2
- package/src/memory/migrations/289-contact-channels-unique-ext-user.ts +10 -0
- package/src/memory/migrations/291-contact-channels-renormalize-addresses.ts +72 -0
- package/src/memory/migrations/292-schedule-default-no-reuse-conversation.test.ts +67 -0
- package/src/memory/migrations/292-schedule-default-no-reuse-conversation.ts +25 -0
- package/src/memory/migrations/293-workflow-journal-leaf-tokens.ts +32 -0
- package/src/memory/migrations/294-drop-external-user-id.ts +31 -0
- package/src/memory/migrations/295-drop-approval-prompt-ts-tracker.ts +20 -0
- package/src/memory/migrations/296-rewrite-balanced-economy-profile-pins.test.ts +110 -0
- package/src/memory/migrations/296-rewrite-balanced-economy-profile-pins.ts +68 -0
- package/src/memory/migrations/__tests__/131-drop-legacy-member-guardian-tables.test.ts +154 -0
- package/src/memory/migrations/__tests__/289-contact-channels-unique-ext-user.test.ts +31 -0
- package/src/memory/migrations/__tests__/291-contact-channels-renormalize-addresses.test.ts +341 -0
- package/src/memory/migrations/__tests__/run-migrations.test.ts +52 -0
- package/src/memory/migrations/index.ts +6 -0
- package/src/memory/migrations/run-migrations.ts +41 -0
- package/src/memory/migrations/validate-migration-state.ts +1 -1
- package/src/memory/onboarding-events-store.ts +3 -3
- package/src/memory/schema/contacts.ts +0 -5
- package/src/memory/skill-loaded-events-store.test.ts +7 -15
- package/src/memory/skill-loaded-events-store.ts +2 -2
- package/src/memory/tool-executed-events-store.test.ts +7 -7
- package/src/memory/turn-trace-store.test.ts +736 -0
- package/src/memory/turn-trace-store.ts +364 -0
- package/src/memory/v2/__tests__/consolidation-job.test.ts +8 -0
- package/src/memory/v2/__tests__/skill-content.test.ts +30 -0
- package/src/memory/v2/consolidation-job.ts +2 -2
- package/src/memory/v2/skill-content.ts +25 -7
- package/src/memory/v2/skill-store.ts +7 -1
- package/src/memory/v3-eval/__tests__/eval-packets.test.ts +248 -0
- package/src/memory/v3-eval/eval-packets.ts +546 -0
- package/src/messaging/providers/slack/adapter.ts +1 -1
- package/src/messaging/providers/slack/api.ts +31 -0
- package/src/messaging/providers/slack/send.test.ts +114 -2
- package/src/messaging/providers/slack/send.ts +30 -7
- package/src/messaging/providers/slack/withdraw.test.ts +200 -0
- package/src/messaging/providers/slack/withdraw.ts +161 -0
- package/src/notifications/AGENTS.md +2 -0
- package/src/notifications/access-request-copy.ts +72 -59
- package/src/notifications/adapters/shared.ts +29 -0
- package/src/notifications/adapters/slack.ts +58 -103
- package/src/notifications/adapters/telegram.ts +2 -20
- package/src/notifications/approval-card-data.ts +333 -0
- package/src/notifications/broadcaster.ts +16 -3
- package/src/notifications/canonical-delivery-recorder.ts +139 -0
- package/src/notifications/copy-composer.ts +3 -3
- package/src/notifications/decision-engine.ts +4 -2
- package/src/notifications/destination-resolver.ts +4 -6
- package/src/notifications/guardian-question-mode.ts +10 -0
- package/src/notifications/home-feed-side-effect.ts +7 -16
- package/src/notifications/notification-utils.ts +19 -20
- package/src/notifications/signal.ts +79 -43
- package/src/notifications/types.ts +98 -121
- package/src/oauth/AGENTS.md +5 -24
- package/src/permissions/checker.test.ts +51 -0
- package/src/permissions/checker.ts +185 -26
- package/src/permissions/ipc-risk-types.ts +24 -0
- package/src/permissions/question-prompter.test.ts +27 -0
- package/src/permissions/question-prompter.ts +4 -0
- package/src/platform/client.test.ts +119 -0
- package/src/platform/client.ts +66 -0
- package/src/platform/consent-cache.test.ts +267 -0
- package/src/platform/consent-cache.ts +174 -0
- package/src/plugin-api/constants.ts +1 -1
- package/src/plugin-api/index.ts +33 -1
- package/src/plugin-api/model-profiles.ts +33 -0
- package/src/plugin-api/types.ts +50 -2
- package/src/plugins/defaults/advisor/__tests__/advisor-gate.test.ts +56 -0
- package/src/plugins/defaults/advisor/__tests__/advisor-state-store.test.ts +43 -0
- package/src/plugins/defaults/advisor/__tests__/agent-loop-integration.test.ts +137 -0
- package/src/plugins/defaults/advisor/__tests__/consult.test.ts +153 -0
- package/src/plugins/defaults/advisor/__tests__/hooks.test.ts +138 -0
- package/src/plugins/defaults/advisor/__tests__/transcript.test.ts +147 -0
- package/src/plugins/defaults/advisor/advisor-gate.ts +29 -0
- package/src/plugins/defaults/advisor/advisor-state-store.ts +94 -0
- package/src/plugins/defaults/advisor/config.ts +21 -0
- package/src/plugins/defaults/advisor/consult.ts +93 -0
- package/src/plugins/defaults/advisor/hooks/post-model-call.ts +34 -0
- package/src/plugins/defaults/advisor/hooks/pre-model-call.ts +30 -0
- package/src/plugins/defaults/advisor/hooks/user-prompt-submit.ts +19 -0
- package/src/plugins/defaults/advisor/package.json +14 -0
- package/src/plugins/defaults/advisor/steering.ts +67 -0
- package/src/plugins/defaults/advisor/tools/advisor.ts +65 -0
- package/src/plugins/defaults/advisor/transcript.ts +76 -0
- package/src/plugins/defaults/index.ts +60 -0
- package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +22 -9
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +2 -2
- package/src/plugins/defaults/memory-retrieval/tail-reinjection-strip.ts +64 -0
- package/src/plugins/defaults/memory-retrieval/unified-turn-context.ts +29 -21
- package/src/plugins/defaults/memory-v3-shadow/__tests__/carry-integration.test.ts +1 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/injection.test.ts +1 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +129 -9
- package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +31 -4
- package/src/plugins/defaults/memory-v3-shadow/__tests__/selection-log-store.test.ts +77 -2
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +1 -0
- package/src/plugins/defaults/memory-v3-shadow/injector.ts +7 -10
- package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +144 -11
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +32 -20
- package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +56 -3
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +23 -2
- package/src/plugins/defaults/surface-completion-nudge/hooks/post-model-call.ts +276 -0
- package/src/plugins/defaults/surface-completion-nudge/hooks/stop.ts +22 -0
- package/src/plugins/defaults/surface-completion-nudge/nudge-state-store.ts +46 -0
- package/src/plugins/defaults/surface-completion-nudge/package.json +14 -0
- package/src/plugins/defaults/task-progress-nudge/hooks/post-tool-use.ts +3 -13
- package/src/plugins/defaults/title-generate/hooks/stop.ts +56 -21
- package/src/prompts/persona-resolver.ts +14 -4
- package/src/prompts/templates/system-sections.ts +7 -2
- package/src/providers/__tests__/provider-env-vars.test.ts +6 -0
- package/src/providers/__tests__/provider-secret-catalog.test.ts +1 -0
- package/src/providers/__tests__/retry-callsite.test.ts +176 -0
- package/src/providers/atlascloud/client.ts +85 -0
- package/src/providers/fetch-provider-catalog.ts +85 -0
- package/src/providers/inference/adapter-factory.ts +3 -0
- package/src/providers/model-catalog.ts +58 -0
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +33 -0
- package/src/providers/openai/chat-completions-provider.ts +7 -0
- package/src/providers/openai/responses-provider.ts +10 -0
- package/src/providers/provider-send-message.ts +11 -3
- package/src/providers/retry.ts +53 -12
- package/src/providers/search-provider-catalog.ts +10 -0
- package/src/providers/weak-open-model.ts +22 -0
- package/src/runtime/AGENTS.md +0 -1
- package/src/runtime/__tests__/agent-wake.test.ts +181 -0
- package/src/runtime/__tests__/client-health.test.ts +44 -0
- package/src/runtime/access-request-helper.ts +21 -53
- package/src/runtime/actor-trust-resolver.ts +59 -63
- package/src/runtime/agent-wake.ts +52 -0
- package/src/runtime/assistant-event-hub.ts +18 -4
- package/src/runtime/auth/__tests__/route-policy.test.ts +12 -0
- package/src/runtime/auth/require-bound-guardian.ts +1 -4
- package/src/runtime/btw-sidechain.ts +3 -6
- package/src/runtime/capabilities.test.ts +120 -0
- package/src/runtime/capabilities.ts +197 -0
- package/src/runtime/channel-approval-types.ts +22 -45
- package/src/runtime/channel-invite-transports/telegram.ts +4 -4
- package/src/runtime/channel-retry-sweep.ts +1 -0
- package/src/runtime/channel-verification-service.ts +3 -3
- package/src/runtime/client-health.ts +26 -0
- package/src/runtime/confirmation-request-guardian-bridge.ts +38 -29
- package/src/runtime/effective-capabilities.test.ts +128 -0
- package/src/runtime/effective-capabilities.ts +84 -0
- package/src/runtime/guardian-reply-router.ts +106 -21
- package/src/runtime/invite-redemption-service.ts +9 -25
- package/src/runtime/migrations/__tests__/vbundle-builder-fd-leak.test.ts +123 -0
- package/src/runtime/migrations/vbundle-builder.ts +49 -20
- package/src/runtime/pending-interactions.ts +15 -0
- package/src/runtime/routes/__tests__/client-routes.test.ts +13 -0
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +67 -0
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +240 -1
- package/src/runtime/routes/app-routes.ts +1 -1
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +2 -2
- package/src/runtime/routes/assets/vellum-design-system.css +1959 -0
- package/src/runtime/routes/browser-tabs-routes.ts +9 -0
- package/src/runtime/routes/btw-routes.ts +1 -27
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +17 -8
- package/src/runtime/routes/client-routes.ts +10 -0
- package/src/runtime/routes/contact-routes.ts +31 -8
- package/src/runtime/routes/conversation-compaction-routes.ts +1 -1
- package/src/runtime/routes/conversation-management-routes.ts +80 -1
- package/src/runtime/routes/conversation-query-routes.ts +68 -22
- package/src/runtime/routes/conversation-routes.ts +39 -14
- package/src/runtime/routes/credential-routes.ts +40 -16
- package/src/runtime/routes/empty-state-greeting-cache.ts +1 -2
- package/src/runtime/routes/events-routes.ts +1 -3
- package/src/runtime/routes/guardian-approval-interception.ts +14 -73
- package/src/runtime/routes/guardian-approval-prompt.ts +22 -4
- package/src/runtime/routes/home-feed-routes.ts +8 -3
- package/src/runtime/routes/identity-routes.ts +1 -296
- package/src/runtime/routes/inbound-message-handler.ts +214 -228
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +89 -7
- package/src/runtime/routes/inbound-stages/admission-policy.test.ts +154 -0
- package/src/runtime/routes/inbound-stages/admission-policy.ts +140 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +3 -3
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +11 -6
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +1 -2
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +1 -2
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +7 -7
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +47 -28
- package/src/runtime/routes/inbound-stages/reaction-intercept.ts +358 -0
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +8 -0
- package/src/runtime/routes/integrations/slack/channel.ts +36 -0
- package/src/runtime/routes/internal-telemetry-routes.ts +1 -1
- package/src/runtime/routes/mcp-auth-routes.ts +233 -41
- package/src/runtime/routes/memory-eval-routes.ts +87 -0
- package/src/runtime/routes/notification-routes.ts +122 -133
- package/src/runtime/routes/platform-routes.ts +2 -2
- package/src/runtime/routes/plugins-routes.ts +202 -3
- package/src/runtime/routes/schedule-routes.ts +0 -22
- package/src/runtime/routes/secret-routes.ts +10 -0
- package/src/runtime/routes/surface-action-routes.ts +2 -1
- package/src/runtime/routes/tool-call-question-enrichment.test.ts +146 -0
- package/src/runtime/routes/tool-call-question-enrichment.ts +66 -0
- package/src/runtime/routes/workflow-routes.test.ts +229 -44
- package/src/runtime/routes/workflow-routes.ts +131 -29
- package/src/runtime/routes/workspace-greetings.ts +55 -0
- package/src/runtime/sync/resource-sync-events.ts +1 -11
- package/src/runtime/tool-grant-request-helper.ts +18 -16
- package/src/runtime/trust-context-resolver.ts +8 -5
- package/src/schedule/inference-profile.ts +2 -14
- package/src/schedule/schedule-store.ts +1 -1
- package/src/schedule/scheduler-types.ts +5 -1
- package/src/security/__tests__/provider-key-env-fallback.test.ts +6 -0
- package/src/security/secret-patterns.ts +3 -0
- package/src/subagent/manager.ts +17 -4
- package/src/subagent/types.ts +6 -0
- package/src/telemetry/trace-collection-policy.test.ts +28 -0
- package/src/telemetry/trace-collection-policy.ts +30 -0
- package/src/telemetry/types.ts +89 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +586 -36
- package/src/telemetry/usage-telemetry-reporter.ts +148 -41
- package/src/tools/AGENTS.md +3 -3
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +31 -0
- package/src/tools/browser/browser-execution.ts +30 -19
- package/src/tools/document/document-tool.ts +2 -3
- package/src/tools/executor.ts +5 -3
- package/src/tools/host-terminal/host-shell.ts +5 -4
- package/src/tools/memory/register.ts +2 -2
- package/src/tools/network/__tests__/web-fetch-firecrawl.test.ts +360 -0
- package/src/tools/network/__tests__/web-search.test.ts +143 -0
- package/src/tools/network/web-fetch.ts +372 -1
- package/src/tools/network/web-search-error.ts +1 -1
- package/src/tools/network/web-search.ts +213 -10
- package/src/tools/permission-checker.ts +4 -3
- package/src/tools/registry.ts +20 -0
- package/src/tools/schedule/create.ts +7 -12
- package/src/tools/schedule/update.ts +4 -11
- package/src/tools/shared/filesystem/path-policy.ts +39 -13
- package/src/tools/side-effects.ts +2 -17
- package/src/tools/skills/execute.ts +33 -0
- package/src/tools/subagent/spawn.ts +61 -12
- package/src/tools/terminal/shell.ts +10 -4
- package/src/tools/tool-approval-handler.ts +18 -13
- package/src/tools/tool-manifest.ts +0 -2
- package/src/tools/types.ts +9 -0
- package/src/tools/ui-surface/definitions.ts +64 -3
- package/src/tools/verification-control-plane-policy.ts +3 -1
- package/src/tools/workflows/run-workflow.test.ts +8 -18
- package/src/tools/workflows/run-workflow.ts +1 -0
- package/src/util/disk-usage.ts +78 -23
- package/src/util/platform.ts +10 -3
- package/src/watcher/telemetry.ts +2 -2
- package/src/workflows/capabilities.ts +2 -3
- package/src/workflows/engine.test.ts +175 -1
- package/src/workflows/engine.ts +82 -0
- package/src/workflows/journal-store.test.ts +70 -0
- package/src/workflows/journal-store.ts +18 -3
- package/src/workflows/run-manager.test.ts +171 -28
- package/src/workflows/run-manager.ts +66 -24
- package/src/workspace/migrations/105-enable-memory-v3-live-for-new-workspaces.ts +63 -0
- package/src/workspace/migrations/106-drop-collect-usage-data.ts +47 -0
- package/src/workspace/migrations/107-drop-send-diagnostics.ts +47 -0
- package/src/workspace/migrations/108-drop-balanced-economy-profile.ts +129 -0
- package/src/workspace/migrations/registry.ts +8 -0
- package/src/__tests__/app-control-no-global-cgevent.test.ts +0 -98
- package/src/__tests__/credential-security-e2e.test.ts +0 -362
- package/src/__tests__/credential-vault-unit.test.ts +0 -1528
- package/src/__tests__/credential-vault.test.ts +0 -1706
- package/src/__tests__/identity-intro-cache.test.ts +0 -315
- package/src/__tests__/secret-onetime-send.test.ts +0 -182
- package/src/cli/commands/__tests__/task.test.ts +0 -914
- package/src/cli/commands/task.ts +0 -771
- package/src/config/bundled-skills/personal-page/SKILL.md +0 -57
- package/src/config/bundled-skills/personal-page/TOOLS.json +0 -27
- package/src/config/bundled-skills/personal-page/tools/app-refresh.ts +0 -17
- package/src/config/preloaded-apps/personal-page/src/components/About.tsx +0 -22
- package/src/config/preloaded-apps/personal-page/src/components/App.tsx +0 -16
- package/src/config/preloaded-apps/personal-page/src/components/Features.tsx +0 -77
- package/src/config/preloaded-apps/personal-page/src/components/Hero.tsx +0 -57
- package/src/config/preloaded-apps/personal-page/src/components/Pending.tsx +0 -28
- package/src/config/preloaded-apps/personal-page/src/components/animations.tsx +0 -234
- package/src/config/preloaded-apps/personal-page/src/components/icons.tsx +0 -48
- package/src/config/preloaded-apps/personal-page/src/components/media.ts +0 -16
- package/src/config/preloaded-apps/personal-page/src/index.html +0 -20
- package/src/config/preloaded-apps/personal-page/src/main.tsx +0 -7
- package/src/config/preloaded-apps/personal-page/src/profile-data.ts +0 -82
- package/src/config/preloaded-apps/personal-page/src/styles.css +0 -759
- package/src/memory/__tests__/preloaded-apps.test.ts +0 -85
- package/src/memory/preloaded-apps.ts +0 -116
- package/src/notifications/tool-approval-copy.ts +0 -142
- package/src/runtime/routes/approval-prompt-ts-tracker.ts +0 -78
- package/src/runtime/routes/identity-intro-cache.ts +0 -172
- package/src/tools/credentials/vault.ts +0 -712
|
@@ -141,7 +141,9 @@ interface CredentialLookup {
|
|
|
141
141
|
* Resolve a credential lookup from service+field or UUID.
|
|
142
142
|
* Throws BadRequestError when neither is provided or the UUID is not found.
|
|
143
143
|
*/
|
|
144
|
-
function resolveCredentialLookup(
|
|
144
|
+
function resolveCredentialLookup(
|
|
145
|
+
body: Record<string, unknown>,
|
|
146
|
+
): CredentialLookup {
|
|
145
147
|
const { service, field, id } = body as {
|
|
146
148
|
service?: string;
|
|
147
149
|
field?: string;
|
|
@@ -243,8 +245,9 @@ async function handleCredentialsInspect({ body }: RouteHandlerArgs) {
|
|
|
243
245
|
}
|
|
244
246
|
|
|
245
247
|
const lookup = resolveCredentialLookup(body);
|
|
246
|
-
const { value: secret, unreachable } =
|
|
247
|
-
|
|
248
|
+
const { value: secret, unreachable } = await getSecureKeyResultAsync(
|
|
249
|
+
lookup.storageKey,
|
|
250
|
+
);
|
|
248
251
|
|
|
249
252
|
if (!lookup.metadata && (secret == null || secret.length === 0)) {
|
|
250
253
|
if (unreachable) {
|
|
@@ -290,8 +293,9 @@ async function handleCredentialsReveal({ body }: RouteHandlerArgs) {
|
|
|
290
293
|
}
|
|
291
294
|
|
|
292
295
|
const lookup = resolveCredentialLookup(body);
|
|
293
|
-
const { value: secret, unreachable } =
|
|
294
|
-
|
|
296
|
+
const { value: secret, unreachable } = await getSecureKeyResultAsync(
|
|
297
|
+
lookup.storageKey,
|
|
298
|
+
);
|
|
295
299
|
|
|
296
300
|
if (secret == null || secret.length === 0) {
|
|
297
301
|
if (unreachable) {
|
|
@@ -372,11 +376,19 @@ async function handleCredentialsDelete({ body }: RouteHandlerArgs) {
|
|
|
372
376
|
|
|
373
377
|
assertMetadataWritable();
|
|
374
378
|
|
|
379
|
+
// The Slack user_token only grants read access to channels the bot isn't a
|
|
380
|
+
// member of; Socket Mode itself runs on the bot + app tokens. Deleting just
|
|
381
|
+
// the user_token must leave the oauth_connection intact — disconnecting the
|
|
382
|
+
// provider would flap the integration's connected state until the next sync.
|
|
383
|
+
// Every other step (secret + metadata removal, not-found handling) is the
|
|
384
|
+
// same as a normal credential delete.
|
|
385
|
+
const preserveOAuthConnection =
|
|
386
|
+
service === "slack_channel" && field === "user_token";
|
|
387
|
+
|
|
375
388
|
const key = credentialKey(service, field);
|
|
376
389
|
const existing = await getSecureKeyAsync(key);
|
|
377
|
-
const deleteResult =
|
|
378
|
-
? await deleteSecureKeyAsync(key)
|
|
379
|
-
: "not-found";
|
|
390
|
+
const deleteResult =
|
|
391
|
+
existing != null ? await deleteSecureKeyAsync(key) : "not-found";
|
|
380
392
|
|
|
381
393
|
if (deleteResult === "error") {
|
|
382
394
|
throw new InternalError(
|
|
@@ -388,10 +400,12 @@ async function handleCredentialsDelete({ body }: RouteHandlerArgs) {
|
|
|
388
400
|
|
|
389
401
|
// Clean up OAuth connection (best-effort).
|
|
390
402
|
let oauthResult: "disconnected" | "not-found" | "error" = "not-found";
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
403
|
+
if (!preserveOAuthConnection) {
|
|
404
|
+
try {
|
|
405
|
+
oauthResult = await disconnectOAuthProvider(service);
|
|
406
|
+
} catch {
|
|
407
|
+
// Best-effort — OAuth tables may not exist yet
|
|
408
|
+
}
|
|
395
409
|
}
|
|
396
410
|
|
|
397
411
|
if (oauthResult === "error") {
|
|
@@ -437,8 +451,12 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
437
451
|
search: z.string().optional().describe("Filter by substring match"),
|
|
438
452
|
}),
|
|
439
453
|
responseBody: z.object({
|
|
440
|
-
credentials: z
|
|
441
|
-
|
|
454
|
+
credentials: z
|
|
455
|
+
.array(z.unknown())
|
|
456
|
+
.describe("Local credentials with metadata"),
|
|
457
|
+
managedCredentials: z
|
|
458
|
+
.array(z.unknown())
|
|
459
|
+
.describe("Platform-managed credentials"),
|
|
442
460
|
}),
|
|
443
461
|
handler: handleCredentialsList,
|
|
444
462
|
},
|
|
@@ -507,8 +525,14 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
507
525
|
field: z.string().describe("Field name (e.g. client_secret)"),
|
|
508
526
|
value: z.string().describe("Secret value to store"),
|
|
509
527
|
label: z.string().optional().describe("Human-friendly label"),
|
|
510
|
-
description: z
|
|
511
|
-
|
|
528
|
+
description: z
|
|
529
|
+
.string()
|
|
530
|
+
.optional()
|
|
531
|
+
.describe("What this credential is used for"),
|
|
532
|
+
allowedTools: z
|
|
533
|
+
.array(z.string())
|
|
534
|
+
.optional()
|
|
535
|
+
.describe("Tool names that may use this credential"),
|
|
512
536
|
}),
|
|
513
537
|
responseBody: z.object({
|
|
514
538
|
credentialId: z.string(),
|
|
@@ -8,8 +8,7 @@
|
|
|
8
8
|
* the greeting regenerates on every request. This is the knob a workspace
|
|
9
9
|
* sets to always receive a fresh greeting.
|
|
10
10
|
*
|
|
11
|
-
* Storage uses the existing `memory_checkpoints` table
|
|
12
|
-
* store), mirroring {@link ./identity-intro-cache.ts}.
|
|
11
|
+
* Storage uses the existing `memory_checkpoints` table.
|
|
13
12
|
*/
|
|
14
13
|
|
|
15
14
|
import { getConfig } from "../../config/loader.js";
|
|
@@ -42,6 +42,7 @@ import {
|
|
|
42
42
|
import type { ReplaySubscriber } from "../assistant-stream-state.js";
|
|
43
43
|
import { getReplayWindow } from "../assistant-stream-state.js";
|
|
44
44
|
import { ACTOR_PRINCIPALS, GATEWAY_PRINCIPALS } from "../auth/route-policy.js";
|
|
45
|
+
import { DEFAULT_HEARTBEAT_INTERVAL_MS } from "../client-health.js";
|
|
45
46
|
import { resolveActorPrincipalIdForLocalGuardian } from "../local-actor-identity.js";
|
|
46
47
|
import {
|
|
47
48
|
BadRequestError,
|
|
@@ -52,9 +53,6 @@ import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
|
52
53
|
|
|
53
54
|
const log = getLogger("events-routes");
|
|
54
55
|
|
|
55
|
-
/** Keep-alive comment sent to idle clients every 7 s by default. */
|
|
56
|
-
const DEFAULT_HEARTBEAT_INTERVAL_MS = 7_000;
|
|
57
|
-
|
|
58
56
|
/**
|
|
59
57
|
* Resolution of the event-loop delay histogram, per
|
|
60
58
|
* https://nodejs.org/api/perf_hooks.html#perf_hooksmonitoreventloopdelayoptions.
|
|
@@ -10,7 +10,6 @@ import { applyGuardianDecision } from "../../approvals/guardian-decision-primiti
|
|
|
10
10
|
import type { ChannelId } from "../../channels/types.js";
|
|
11
11
|
import type { TrustContext } from "../../daemon/trust-context.js";
|
|
12
12
|
import {
|
|
13
|
-
getAllPendingApprovalsByGuardianChat,
|
|
14
13
|
getPendingApprovalForRequest,
|
|
15
14
|
getUnresolvedApprovalForRequest,
|
|
16
15
|
updateApprovalDecision,
|
|
@@ -18,6 +17,7 @@ import {
|
|
|
18
17
|
import { getLogger } from "../../util/logger.js";
|
|
19
18
|
import { runApprovalConversationTurn } from "../approval-conversation-turn.js";
|
|
20
19
|
import { composeApprovalMessageGenerative } from "../approval-message-composer.js";
|
|
20
|
+
import { resolveCapabilities } from "../capabilities.js";
|
|
21
21
|
import type { ApprovalDecisionResult } from "../channel-approval-types.js";
|
|
22
22
|
import {
|
|
23
23
|
getApprovalInfoByConversation,
|
|
@@ -31,13 +31,11 @@ import type {
|
|
|
31
31
|
ApprovalCopyGenerator,
|
|
32
32
|
} from "../http-types.js";
|
|
33
33
|
import { parseApprovalIntent } from "../nl-approval-parser.js";
|
|
34
|
-
import { isTrackedApprovalPromptTs } from "./approval-prompt-ts-tracker.js";
|
|
35
34
|
import { handleGuardianCallbackDecision } from "./approval-strategies/guardian-callback-strategy.js";
|
|
36
35
|
import { handleGuardianTextEngineDecision } from "./approval-strategies/guardian-text-engine-strategy.js";
|
|
37
36
|
import {
|
|
38
37
|
buildGuardianDenyContext,
|
|
39
38
|
parseCallbackData,
|
|
40
|
-
parseReactionCallbackData,
|
|
41
39
|
} from "./channel-route-shared.js";
|
|
42
40
|
import { deliverStaleApprovalReply } from "./guardian-approval-reply-helpers.js";
|
|
43
41
|
|
|
@@ -106,7 +104,10 @@ export async function handleApprovalInterception(
|
|
|
106
104
|
// When the sender is the guardian and there's a pending guardian approval
|
|
107
105
|
// request targeting this chat, the message might be a decision on behalf
|
|
108
106
|
// of a non-guardian requester. Delegated to the guardian callback strategy.
|
|
109
|
-
if (
|
|
107
|
+
if (
|
|
108
|
+
resolveCapabilities(trustCtx.trustClass).canSelfApproveTools &&
|
|
109
|
+
actorExternalId
|
|
110
|
+
) {
|
|
110
111
|
const guardianResult = await handleGuardianCallbackDecision({
|
|
111
112
|
content,
|
|
112
113
|
callbackData,
|
|
@@ -124,71 +125,10 @@ export async function handleApprovalInterception(
|
|
|
124
125
|
}
|
|
125
126
|
}
|
|
126
127
|
|
|
127
|
-
//
|
|
128
|
-
//
|
|
129
|
-
//
|
|
130
|
-
//
|
|
131
|
-
// so getChannelApprovalPrompt(conversationId) would return null.
|
|
132
|
-
// Only guardians can approve via reaction — non-guardian reactions are
|
|
133
|
-
// silently ignored to prevent self-approval.
|
|
134
|
-
//
|
|
135
|
-
// `reaction_removed:` callbackData never expresses an approval intent, and
|
|
136
|
-
// `isSlackReactionEvent` short-circuits before reaching here for removals,
|
|
137
|
-
// but guard explicitly so a future refactor can't turn an un-react into an
|
|
138
|
-
// unintended approval.
|
|
139
|
-
if (
|
|
140
|
-
callbackData?.startsWith("reaction:") &&
|
|
141
|
-
!callbackData.startsWith("reaction_removed:")
|
|
142
|
-
) {
|
|
143
|
-
if (trustCtx.trustClass !== "guardian" || !actorExternalId) {
|
|
144
|
-
return { handled: true, type: "stale_ignored" };
|
|
145
|
-
}
|
|
146
|
-
const reactionDecision = parseReactionCallbackData(callbackData);
|
|
147
|
-
if (!reactionDecision) {
|
|
148
|
-
// Unknown emoji — ignore silently
|
|
149
|
-
return { handled: true, type: "stale_ignored" };
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// Require the reacted-to message to be a tracked approval prompt. Without
|
|
153
|
-
// this check, any unrelated 👍 reaction from the guardian in a subscribed
|
|
154
|
-
// channel would approve the outstanding pending request (now that
|
|
155
|
-
// reactions are admitted from any subscribed channel, not just tracked
|
|
156
|
-
// bot threads). `approvalMessageTs` is `item.ts` of the reacted-to
|
|
157
|
-
// Slack message, propagated from `sourceMetadata.messageId`.
|
|
158
|
-
if (
|
|
159
|
-
!approvalMessageTs ||
|
|
160
|
-
!isTrackedApprovalPromptTs(
|
|
161
|
-
sourceChannel,
|
|
162
|
-
conversationExternalId,
|
|
163
|
-
approvalMessageTs,
|
|
164
|
-
)
|
|
165
|
-
) {
|
|
166
|
-
return { handled: true, type: "stale_ignored" };
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
const allPending = getAllPendingApprovalsByGuardianChat(
|
|
170
|
-
sourceChannel,
|
|
171
|
-
conversationExternalId,
|
|
172
|
-
);
|
|
173
|
-
const guardianPending = allPending.filter(
|
|
174
|
-
(approval) => approval.guardianExternalUserId === actorExternalId,
|
|
175
|
-
);
|
|
176
|
-
if (guardianPending.length !== 1) {
|
|
177
|
-
return { handled: true, type: "stale_ignored" };
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
const result = await applyGuardianDecision({
|
|
181
|
-
approval: guardianPending[0],
|
|
182
|
-
decision: reactionDecision,
|
|
183
|
-
actorPrincipalId: undefined,
|
|
184
|
-
actorExternalUserId: actorExternalId,
|
|
185
|
-
actorChannel: sourceChannel,
|
|
186
|
-
});
|
|
187
|
-
if (result.applied) {
|
|
188
|
-
return { handled: true, type: "guardian_decision_applied" };
|
|
189
|
-
}
|
|
190
|
-
return { handled: true, type: "stale_ignored" };
|
|
191
|
-
}
|
|
128
|
+
// Slack emoji reactions are handled by the canonical guardian decision
|
|
129
|
+
// pipeline (`routeGuardianReply`), invoked from the inbound reaction stage:
|
|
130
|
+
// it resolves the target request from the reacted card's delivery record.
|
|
131
|
+
// See `guardian-reply-router.ts`.
|
|
192
132
|
|
|
193
133
|
// ── Standard approval interception (existing flow) ──
|
|
194
134
|
const pendingPrompt = getChannelApprovalPrompt(conversationId);
|
|
@@ -220,10 +160,11 @@ export async function handleApprovalInterception(
|
|
|
220
160
|
|
|
221
161
|
// When the sender is a non-guardian with established identity and a guardian
|
|
222
162
|
// binding, block self-approval. The non-guardian must wait for the guardian
|
|
223
|
-
// to decide. This covers trusted contacts
|
|
224
|
-
// senders in shared channels.
|
|
163
|
+
// to decide. This covers trusted contacts, unverified contacts, and
|
|
164
|
+
// identity-known non-member senders in shared channels.
|
|
225
165
|
const isIdentityKnownNonGuardian =
|
|
226
|
-
trustCtx.trustClass ===
|
|
166
|
+
resolveCapabilities(trustCtx.trustClass).sensitiveToolApproval ===
|
|
167
|
+
"escalate-and-wait" ||
|
|
227
168
|
(trustCtx.trustClass === "unknown" &&
|
|
228
169
|
!!trustCtx.requesterExternalUserId &&
|
|
229
170
|
!!trustCtx.guardianExternalUserId);
|
|
@@ -465,7 +406,7 @@ export async function handleApprovalInterception(
|
|
|
465
406
|
// standard conversational engine / legacy parser and resolve their own
|
|
466
407
|
// pending request via handleChannelDecision.
|
|
467
408
|
if (
|
|
468
|
-
trustCtx.trustClass
|
|
409
|
+
!resolveCapabilities(trustCtx.trustClass).canSelfApproveTools &&
|
|
469
410
|
trustCtx.guardianExternalUserId
|
|
470
411
|
) {
|
|
471
412
|
log.info(
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Approval prompt delivery: rich UI (buttons) with plain-text fallback.
|
|
3
3
|
*/
|
|
4
4
|
import type { ChannelId } from "../../channels/types.js";
|
|
5
|
+
import { recordApprovalCardDelivery } from "../../notifications/canonical-delivery-recorder.js";
|
|
5
6
|
import { redactSecrets } from "../../security/secret-scanner.js";
|
|
6
7
|
import { getLogger } from "../../util/logger.js";
|
|
7
8
|
import type { ApprovalMessageContext } from "../approval-message-composer.js";
|
|
@@ -17,7 +18,6 @@ import {
|
|
|
17
18
|
} from "../gateway-client.js";
|
|
18
19
|
import { buildActionLegend } from "../guardian-decision-types.js";
|
|
19
20
|
import type { ApprovalCopyGenerator } from "../http-types.js";
|
|
20
|
-
import { trackApprovalPromptTs } from "./approval-prompt-ts-tracker.js";
|
|
21
21
|
import { requiredDecisionKeywords } from "./channel-route-shared.js";
|
|
22
22
|
|
|
23
23
|
const log = getLogger("runtime-http");
|
|
@@ -148,7 +148,13 @@ export async function deliverGeneratedApprovalPrompt(
|
|
|
148
148
|
assistantId,
|
|
149
149
|
);
|
|
150
150
|
if (deliveryResult.ts) {
|
|
151
|
-
|
|
151
|
+
recordApprovalCardDelivery({
|
|
152
|
+
requestId: uiMetadata.requestId,
|
|
153
|
+
channel: sourceChannel,
|
|
154
|
+
chatId,
|
|
155
|
+
messageId: deliveryResult.ts,
|
|
156
|
+
status: "sent",
|
|
157
|
+
});
|
|
152
158
|
}
|
|
153
159
|
return true;
|
|
154
160
|
} catch (err) {
|
|
@@ -175,7 +181,13 @@ export async function deliverGeneratedApprovalPrompt(
|
|
|
175
181
|
assistantId,
|
|
176
182
|
});
|
|
177
183
|
if (fallbackResult.ts) {
|
|
178
|
-
|
|
184
|
+
recordApprovalCardDelivery({
|
|
185
|
+
requestId: uiMetadata.requestId,
|
|
186
|
+
channel: sourceChannel,
|
|
187
|
+
chatId,
|
|
188
|
+
messageId: fallbackResult.ts,
|
|
189
|
+
status: "sent",
|
|
190
|
+
});
|
|
179
191
|
}
|
|
180
192
|
return true;
|
|
181
193
|
} catch (err) {
|
|
@@ -203,7 +215,13 @@ export async function deliverGeneratedApprovalPrompt(
|
|
|
203
215
|
assistantId,
|
|
204
216
|
});
|
|
205
217
|
if (plainResult.ts) {
|
|
206
|
-
|
|
218
|
+
recordApprovalCardDelivery({
|
|
219
|
+
requestId: uiMetadata.requestId,
|
|
220
|
+
channel: sourceChannel,
|
|
221
|
+
chatId,
|
|
222
|
+
messageId: plainResult.ts,
|
|
223
|
+
status: "sent",
|
|
224
|
+
});
|
|
207
225
|
}
|
|
208
226
|
return true;
|
|
209
227
|
} catch (err) {
|
|
@@ -28,6 +28,7 @@ import {
|
|
|
28
28
|
type FeedItemStatus,
|
|
29
29
|
HomeFeedResponseSchema,
|
|
30
30
|
} from "../../api/responses/home.js";
|
|
31
|
+
import { enrichFeedItemsWithSource } from "../../home/feed-source-enrichment.js";
|
|
31
32
|
import { patchFeedItemStatus, readHomeFeed } from "../../home/feed-writer.js";
|
|
32
33
|
import { revalidateHomeContentInBackground } from "../../home/home-content-refresh.js";
|
|
33
34
|
import { getPersonalizedGreeting } from "../../home/home-greeting.js";
|
|
@@ -135,8 +136,10 @@ export async function handleGetHomeFeed({
|
|
|
135
136
|
// v2 schema dropped per-item `minTimeAway` gating; surface every item
|
|
136
137
|
// and let the client decide what to render based on its own
|
|
137
138
|
// session state. `timeAwaySeconds` survives only to feed the
|
|
138
|
-
// context-banner relative-time label.
|
|
139
|
-
|
|
139
|
+
// context-banner relative-time label. Each item is enriched with its
|
|
140
|
+
// source-conversation classification (`sourceType`/`sourceKey`/
|
|
141
|
+
// `sourceLabel`) so clients can filter the feed by what produced it.
|
|
142
|
+
const filtered = enrichFeedItemsWithSource(feed.items);
|
|
140
143
|
|
|
141
144
|
const now = new Date();
|
|
142
145
|
|
|
@@ -287,7 +290,9 @@ export function handleListHomeFeed({
|
|
|
287
290
|
const total = filtered.length;
|
|
288
291
|
const offset = params.offset ?? 0;
|
|
289
292
|
const limit = params.limit ?? 20;
|
|
290
|
-
const items =
|
|
293
|
+
const items = enrichFeedItemsWithSource(
|
|
294
|
+
filtered.slice(offset, offset + limit),
|
|
295
|
+
);
|
|
291
296
|
|
|
292
297
|
return {
|
|
293
298
|
items,
|