@vellumai/assistant 0.4.44 → 0.4.45
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/.prettierignore +4 -0
- package/ARCHITECTURE.md +34 -31
- package/README.md +4 -4
- package/bun.lock +10 -35
- package/docs/architecture/integrations.md +102 -197
- package/docs/architecture/keychain-broker.md +1 -1
- package/docs/architecture/memory.md +2 -2
- package/docs/architecture/scheduling.md +1 -1
- package/docs/architecture/security.md +11 -11
- package/docs/error-handling.md +1 -1
- package/docs/trusted-contact-access.md +3 -3
- package/drizzle/meta/0000_snapshot.json +34 -100
- package/drizzle/meta/_journal.json +1 -1
- package/drizzle.config.ts +4 -4
- package/package.json +3 -2
- package/scripts/capture-x-graphql.ts +237 -141
- package/scripts/generate-bundled-tool-registry.ts +223 -0
- package/src/__tests__/access-request-decision.test.ts +0 -1
- package/src/__tests__/actor-token-service.test.ts +23 -24
- package/src/__tests__/agent-loop.test.ts +0 -131
- package/src/__tests__/always-loaded-tools-guard.test.ts +71 -0
- package/src/__tests__/amazon-cdp-integration.test.ts +11 -9
- package/src/__tests__/approval-primitive.test.ts +0 -1
- package/src/__tests__/approval-routes-http.test.ts +11 -1
- package/src/__tests__/asset-materialize-tool.test.ts +0 -1
- package/src/__tests__/asset-search-tool.test.ts +0 -1
- package/src/__tests__/assistant-attachment-directive.test.ts +1 -1
- package/src/__tests__/assistant-events-sse-hardening.test.ts +0 -1
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +0 -2
- package/src/__tests__/assistant-feature-flags-integration.test.ts +70 -18
- package/src/__tests__/assistant-id-boundary-guard.test.ts +6 -6
- package/src/__tests__/attachments-store.test.ts +0 -1
- package/src/__tests__/avatar-e2e.test.ts +74 -115
- package/src/__tests__/avatar-router.test.ts +25 -62
- package/src/__tests__/browser-manager.test.ts +24 -0
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +4 -3
- package/src/__tests__/browser-skill-endstate.test.ts +8 -11
- package/src/__tests__/btw-routes.test.ts +326 -0
- package/src/__tests__/bundled-skill-retrieval-guard.test.ts +23 -9
- package/src/__tests__/call-controller.test.ts +0 -1
- package/src/__tests__/call-conversation-messages.test.ts +0 -1
- package/src/__tests__/call-domain.test.ts +0 -1
- package/src/__tests__/call-pointer-messages.test.ts +0 -1
- package/src/__tests__/call-recovery.test.ts +0 -1
- package/src/__tests__/call-routes-http.test.ts +0 -1
- package/src/__tests__/call-store.test.ts +0 -1
- package/src/__tests__/canonical-guardian-store.test.ts +0 -1
- package/src/__tests__/channel-approval-routes.test.ts +1 -1
- package/src/__tests__/channel-approvals.test.ts +1 -1
- package/src/__tests__/channel-delivery-store.test.ts +0 -1
- package/src/__tests__/channel-guardian.test.ts +5 -7
- package/src/__tests__/channel-retry-sweep.test.ts +0 -1
- package/src/__tests__/checker.test.ts +4 -11
- package/src/__tests__/compaction.benchmark.test.ts +16 -14
- package/src/__tests__/computer-use-session-lifecycle.test.ts +10 -11
- package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
- package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +2 -5
- package/src/__tests__/computer-use-tools.test.ts +35 -31
- package/src/__tests__/config-schema.test.ts +11 -15
- package/src/__tests__/config-watcher.test.ts +0 -1
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
- package/src/__tests__/conflict-store.test.ts +0 -1
- package/src/__tests__/connection-policy.test.ts +4 -7
- package/src/__tests__/contacts-tools.test.ts +0 -1
- package/src/__tests__/context-memory-e2e.test.ts +2 -4
- package/src/__tests__/context-overflow-reducer.test.ts +2 -4
- package/src/__tests__/context-window-manager.test.ts +147 -60
- package/src/__tests__/contradiction-checker.test.ts +0 -1
- package/src/__tests__/conversation-attention-store.test.ts +0 -1
- package/src/__tests__/conversation-attention-telegram.test.ts +1 -1
- package/src/__tests__/conversation-pairing.test.ts +2 -2
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +25 -1
- package/src/__tests__/conversation-routes-slash-commands.test.ts +381 -0
- package/src/__tests__/conversation-store.test.ts +0 -1
- package/src/__tests__/conversation-unread-route.test.ts +1 -2
- package/src/__tests__/credential-security-invariants.test.ts +7 -8
- package/src/__tests__/cross-provider-web-search.test.ts +353 -0
- package/src/__tests__/daemon-assistant-events.test.ts +6 -7
- package/src/__tests__/db-schedule-syntax-migration.test.ts +15 -3
- package/src/__tests__/delete-managed-skill-tool.test.ts +5 -9
- package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -1
- package/src/__tests__/diagnostics-export.test.ts +189 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/emit-signal-routing-intent.test.ts +3 -3
- package/src/__tests__/entity-extractor.test.ts +0 -1
- package/src/__tests__/entity-search.test.ts +0 -1
- package/src/__tests__/ephemeral-permissions.test.ts +2 -4
- package/src/__tests__/file-read-tool.test.ts +86 -0
- package/src/__tests__/followup-tools.test.ts +0 -1
- package/src/__tests__/frontmatter.test.ts +77 -34
- package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
- package/src/__tests__/gateway-only-guard.test.ts +1 -1
- package/src/__tests__/guardian-action-conversation-turn.test.ts +0 -1
- package/src/__tests__/guardian-action-followup-executor.test.ts +0 -1
- package/src/__tests__/guardian-action-followup-store.test.ts +0 -1
- package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
- package/src/__tests__/guardian-action-late-reply.test.ts +0 -1
- package/src/__tests__/guardian-action-store.test.ts +0 -1
- package/src/__tests__/guardian-action-sweep.test.ts +0 -1
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
- package/src/__tests__/guardian-dispatch.test.ts +1 -2
- package/src/__tests__/guardian-grant-minting.test.ts +1 -1
- package/src/__tests__/guardian-outbound-http.test.ts +0 -1
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +1 -1
- package/src/__tests__/guardian-routing-state.test.ts +0 -1
- package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
- package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +3 -5
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +28 -426
- package/src/__tests__/host-bash-proxy.test.ts +335 -0
- package/src/__tests__/host-file-proxy.test.ts +374 -0
- package/src/__tests__/host-shell-tool.test.ts +147 -1
- package/src/__tests__/http-user-message-parity.test.ts +361 -0
- package/src/__tests__/inbound-invite-redemption.test.ts +0 -1
- package/src/__tests__/integration-status.test.ts +3 -8
- package/src/__tests__/intent-routing.test.ts +7 -46
- package/src/__tests__/invite-redemption-service.test.ts +0 -1
- package/src/__tests__/invite-routes-http.test.ts +0 -1
- package/src/__tests__/llm-usage-store.test.ts +0 -1
- package/src/__tests__/managed-avatar-client.test.ts +101 -55
- package/src/__tests__/managed-skill-lifecycle.test.ts +9 -18
- package/src/__tests__/managed-store.test.ts +94 -21
- package/src/__tests__/media-reuse-story.e2e.test.ts +0 -1
- package/src/__tests__/memory-context-benchmark.benchmark.test.ts +2 -4
- package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -1
- package/src/__tests__/memory-recall-quality.test.ts +0 -1
- package/src/__tests__/memory-regressions.experimental.test.ts +0 -1
- package/src/__tests__/memory-regressions.test.ts +0 -1
- package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -1
- package/src/__tests__/memory-upsert-concurrency.test.ts +0 -1
- package/src/__tests__/messaging-send-tool.test.ts +35 -0
- package/src/__tests__/messaging-skill-split.test.ts +138 -0
- package/src/__tests__/migration-cross-version-compatibility.test.ts +0 -1
- package/src/__tests__/migration-export-http.test.ts +2 -3
- package/src/__tests__/migration-import-commit-http.test.ts +1 -2
- package/src/__tests__/migration-import-preflight-http.test.ts +1 -2
- package/src/__tests__/migration-validate-http.test.ts +1 -2
- package/src/__tests__/native-web-search.test.ts +475 -0
- package/src/__tests__/navigate-settings-tab.test.ts +84 -0
- package/src/__tests__/non-member-access-request.test.ts +0 -1
- package/src/__tests__/notification-broadcaster.test.ts +15 -15
- package/src/__tests__/notification-decision-strategy.test.ts +6 -6
- package/src/__tests__/notification-deep-link.test.ts +7 -7
- package/src/__tests__/notification-guardian-path.test.ts +2 -3
- package/src/__tests__/notification-telegram-adapter.test.ts +1 -1
- package/src/__tests__/notification-thread-candidates.test.ts +4 -4
- package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
- package/src/__tests__/playbook-execution.test.ts +0 -1
- package/src/__tests__/playbook-tools.test.ts +0 -1
- package/src/__tests__/profile-compiler.test.ts +0 -1
- package/src/__tests__/provider-managed-proxy-integration.test.ts +25 -0
- package/src/__tests__/qdrant-collection-migration.test.ts +223 -0
- package/src/__tests__/recording-handler.test.ts +30 -94
- package/src/__tests__/registry.test.ts +28 -35
- package/src/__tests__/relay-server.test.ts +0 -1
- package/src/__tests__/ride-shotgun-handler.test.ts +4 -20
- package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
- package/src/__tests__/runtime-events-sse.test.ts +0 -1
- package/src/__tests__/sandbox-diagnostics.test.ts +0 -1
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +30 -28
- package/src/__tests__/schedule-store.test.ts +441 -1
- package/src/__tests__/schedule-tools.test.ts +468 -7
- package/src/__tests__/scheduler-recurrence.test.ts +196 -23
- package/src/__tests__/scoped-approval-grants.test.ts +0 -1
- package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +6 -3
- package/src/__tests__/secret-response-routing.test.ts +4 -1
- package/src/__tests__/send-endpoint-busy.test.ts +14 -2
- package/src/__tests__/send-notification-tool.test.ts +0 -7
- package/src/__tests__/sequence-store.test.ts +0 -1
- package/src/__tests__/server-history-render.test.ts +1 -2
- package/src/__tests__/session-abort-tool-results.test.ts +0 -1
- package/src/__tests__/session-agent-loop.test.ts +46 -6
- package/src/__tests__/session-confirmation-signals.test.ts +0 -1
- package/src/__tests__/session-conflict-gate.test.ts +2 -6
- package/src/__tests__/session-error.test.ts +5 -14
- package/src/__tests__/session-init.benchmark.test.ts +3 -5
- package/src/__tests__/session-load-history-repair.test.ts +0 -1
- package/src/__tests__/session-media-retry.test.ts +12 -74
- package/src/__tests__/session-pre-run-repair.test.ts +0 -1
- package/src/__tests__/session-profile-injection.test.ts +2 -6
- package/src/__tests__/session-provider-retry-repair.test.ts +2 -6
- package/src/__tests__/session-queue.test.ts +94 -139
- package/src/__tests__/session-skill-tools.test.ts +115 -115
- package/src/__tests__/session-slash-known.test.ts +0 -1
- package/src/__tests__/session-slash-queue.test.ts +0 -1
- package/src/__tests__/session-slash-unknown.test.ts +0 -1
- package/src/__tests__/session-surfaces-task-progress.test.ts +34 -0
- package/src/__tests__/session-usage.test.ts +0 -1
- package/src/__tests__/session-workspace-cache-state.test.ts +2 -6
- package/src/__tests__/session-workspace-injection.test.ts +2 -6
- package/src/__tests__/session-workspace-tool-tracking.test.ts +2 -6
- package/src/__tests__/skill-feature-flags-integration.test.ts +180 -184
- package/src/__tests__/skill-feature-flags.test.ts +125 -18
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -2
- package/src/__tests__/skill-load-tool.test.ts +194 -2
- package/src/__tests__/skill-projection-feature-flag.test.ts +27 -16
- package/src/__tests__/skill-projection.benchmark.test.ts +15 -14
- package/src/__tests__/skills.test.ts +14 -53
- package/src/__tests__/slack-channel-config.test.ts +0 -1
- package/src/__tests__/slack-inbound-verification.test.ts +0 -1
- package/src/__tests__/slack-skill.test.ts +1 -1
- package/src/__tests__/subagent-tools.test.ts +2 -2
- package/src/__tests__/system-prompt.test.ts +4 -3
- package/src/__tests__/task-compiler.test.ts +0 -1
- package/src/__tests__/task-management-tools.test.ts +0 -1
- package/src/__tests__/task-memory-cleanup.test.ts +0 -1
- package/src/__tests__/task-runner.test.ts +0 -1
- package/src/__tests__/task-scheduler.test.ts +0 -1
- package/src/__tests__/terminal-tools.test.ts +0 -1
- package/src/__tests__/test-support/computer-use-skill-harness.ts +2 -4
- package/src/__tests__/thread-seed-composer.test.ts +5 -5
- package/src/__tests__/tool-approval-handler.test.ts +0 -1
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
- package/src/__tests__/tool-executor.test.ts +8 -86
- package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
- package/src/__tests__/tool-notification-listener.test.ts +1 -1
- package/src/__tests__/tool-preview-lifecycle.test.ts +416 -0
- package/src/__tests__/trust-store.test.ts +80 -4
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -1
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
- package/src/__tests__/trusted-contact-verification.test.ts +0 -1
- package/src/__tests__/twilio-provider.test.ts +0 -1
- package/src/__tests__/twilio-routes.test.ts +0 -1
- package/src/__tests__/{request-file-tool.test.ts → ui-file-upload-surface.test.ts} +11 -72
- package/src/__tests__/update-bulletin.test.ts +0 -1
- package/src/__tests__/usage-cache-backfill-migration.test.ts +0 -1
- package/src/__tests__/usage-routes.test.ts +0 -1
- package/src/__tests__/verification-control-plane-policy.test.ts +4 -4
- package/src/__tests__/voice-invite-redemption.test.ts +0 -1
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
- package/src/__tests__/voice-session-bridge.test.ts +9 -1
- package/src/__tests__/web-fetch.test.ts +57 -0
- package/src/__tests__/workspace-git-service.test.ts +5 -14
- package/src/__tests__/workspace-policy.test.ts +0 -1
- package/src/agent/loop.ts +22 -34
- package/src/bundler/bundle-signer.ts +4 -4
- package/src/calls/call-controller.ts +1 -1
- package/src/calls/relay-server.ts +1 -1
- package/src/calls/twilio-rest.ts +1 -1
- package/src/calls/voice-session-bridge.ts +3 -1
- package/src/cli/__tests__/notifications.test.ts +3 -4
- package/src/cli/commands/map.ts +2 -6
- package/src/cli/commands/mcp.ts +73 -15
- package/src/cli/commands/notifications.ts +4 -4
- package/src/cli/commands/sessions.ts +9 -1
- package/src/cli/commands/skills.ts +6 -10
- package/src/cli/http-client.ts +2 -3
- package/src/cli/main-screen.tsx +10 -10
- package/src/cli/program.ts +0 -4
- package/src/cli/reference.ts +0 -2
- package/src/cli.ts +15 -9
- package/src/config/__tests__/bundled-tool-registry-guard.test.ts +120 -0
- package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +11 -0
- package/src/config/bundled-skills/app-builder/SKILL.md +6 -1
- package/src/config/bundled-skills/browser/SKILL.md +6 -1
- package/src/config/bundled-skills/chatgpt-import/SKILL.md +5 -1
- package/src/config/bundled-skills/claude-code/SKILL.md +5 -1
- package/src/config/bundled-skills/computer-use/SKILL.md +6 -1
- package/src/config/bundled-skills/computer-use/TOOLS.json +6 -69
- package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +10 -1
- package/src/config/bundled-skills/contacts/SKILL.md +10 -1
- package/src/config/bundled-skills/contacts/TOOLS.json +35 -0
- package/src/config/bundled-skills/{messaging → contacts}/tools/google-contacts.ts +9 -2
- package/src/config/bundled-skills/document/SKILL.md +4 -1
- package/src/config/bundled-skills/doordash/SKILL.md +8 -1
- package/src/config/bundled-skills/doordash/lib/shared/platform.ts +4 -1
- package/src/config/bundled-skills/followups/SKILL.md +4 -1
- package/src/config/bundled-skills/gmail/SKILL.md +180 -0
- package/src/config/bundled-skills/gmail/TOOLS.json +506 -0
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +149 -0
- package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +110 -0
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-draft.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-filters.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-follow-up.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-forward.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/gmail-label.ts +50 -0
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-outreach-scan.ts +8 -90
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-send-draft.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-sender-digest.ts +2 -2
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-trash.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-unsubscribe.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-vacation.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/shared.ts +47 -0
- package/src/config/bundled-skills/google-calendar/SKILL.md +5 -1
- package/src/config/bundled-skills/image-studio/SKILL.md +5 -1
- package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -1
- package/src/config/bundled-skills/media-processing/SKILL.md +7 -13
- package/src/config/bundled-skills/media-processing/TOOLS.json +0 -22
- package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +12 -1
- package/src/config/bundled-skills/messaging/SKILL.md +23 -139
- package/src/config/bundled-skills/messaging/TOOLS.json +33 -1215
- package/src/config/bundled-skills/messaging/tools/gmail-mime-helpers.ts +42 -0
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +165 -2
- package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +1 -13
- package/src/config/bundled-skills/messaging/tools/shared.ts +81 -34
- package/src/config/bundled-skills/notifications/SKILL.md +5 -1
- package/src/config/bundled-skills/orchestration/SKILL.md +30 -0
- package/src/config/bundled-skills/orchestration/TOOLS.json +35 -0
- package/src/config/bundled-skills/{reminder/tools/reminder-create.ts → orchestration/tools/swarm-delegate.ts} +3 -3
- package/src/config/bundled-skills/phone-calls/SKILL.md +9 -1
- package/src/config/bundled-skills/playbooks/SKILL.md +4 -1
- package/src/config/bundled-skills/schedule/SKILL.md +70 -9
- package/src/config/bundled-skills/schedule/TOOLS.json +38 -6
- package/src/config/bundled-skills/screen-watch/SKILL.md +28 -0
- package/src/config/bundled-skills/screen-watch/TOOLS.json +35 -0
- package/src/config/bundled-skills/{reminder/tools/reminder-cancel.ts → screen-watch/tools/start-screen-watch.ts} +3 -3
- package/src/config/bundled-skills/sequences/SKILL.md +47 -0
- package/src/config/bundled-skills/sequences/TOOLS.json +340 -0
- package/src/config/bundled-skills/sequences/tools/sequence-update.ts +128 -0
- package/src/config/bundled-skills/sequences/tools/shared.ts +9 -0
- package/src/config/bundled-skills/settings/SKILL.md +12 -0
- package/src/config/bundled-skills/settings/TOOLS.json +112 -0
- package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +43 -0
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +52 -0
- package/src/config/bundled-skills/{computer-use/tools/computer-use-right-click.ts → settings/tools/set-avatar.ts} +2 -6
- package/src/{tools/system/voice-config.ts → config/bundled-skills/settings/tools/voice-config-update.ts} +59 -96
- package/src/config/bundled-skills/skill-management/SKILL.md +18 -0
- package/src/config/bundled-skills/skill-management/TOOLS.json +90 -0
- package/src/config/bundled-skills/{computer-use/tools/computer-use-double-click.ts → skill-management/tools/delete-managed.ts} +2 -6
- package/src/config/bundled-skills/skill-management/tools/scaffold-managed.ts +12 -0
- package/src/config/bundled-skills/slack/SKILL.md +5 -1
- package/src/config/bundled-skills/subagent/SKILL.md +4 -1
- package/src/config/bundled-skills/tasks/SKILL.md +5 -2
- package/src/config/bundled-skills/transcribe/SKILL.md +4 -1
- package/src/config/bundled-skills/watcher/SKILL.md +4 -1
- package/src/config/bundled-tool-registry.ts +118 -107
- package/src/config/env.ts +5 -2
- package/src/config/feature-flag-registry.json +25 -9
- package/src/config/loader.ts +10 -2
- package/src/config/schema.ts +19 -16
- package/src/config/schemas/inference.ts +12 -22
- package/src/config/schemas/memory-storage.ts +19 -1
- package/src/config/schemas/platform.ts +0 -16
- package/src/config/skill-state.ts +11 -8
- package/src/config/skills.ts +83 -32
- package/src/context/token-estimator.ts +11 -0
- package/src/context/window-manager.ts +180 -151
- package/src/daemon/computer-use-session.ts +11 -43
- package/src/daemon/daemon-control.ts +4 -1
- package/src/daemon/handlers/config-channels.ts +5 -9
- package/src/daemon/handlers/config-ingress.ts +0 -4
- package/src/daemon/handlers/config-model.ts +7 -13
- package/src/daemon/handlers/config-telegram.ts +4 -8
- package/src/daemon/handlers/config-voice.ts +2 -5
- package/src/daemon/handlers/dictation.ts +2 -12
- package/src/daemon/handlers/identity.ts +0 -105
- package/src/daemon/handlers/recording.ts +3 -23
- package/src/daemon/handlers/session-history.ts +1 -1
- package/src/daemon/handlers/sessions.ts +53 -72
- package/src/daemon/handlers/shared.ts +7 -28
- package/src/daemon/handlers/skills.ts +31 -27
- package/src/daemon/host-bash-proxy.ts +148 -0
- package/src/daemon/host-file-proxy.ts +135 -0
- package/src/daemon/lifecycle.ts +49 -24
- package/src/daemon/mcp-reload-service.ts +123 -0
- package/src/daemon/message-protocol.ts +6 -0
- package/src/daemon/message-types/browser.ts +1 -1
- package/src/daemon/message-types/computer-use.ts +1 -4
- package/src/daemon/message-types/guardian-actions.ts +1 -1
- package/src/daemon/message-types/host-bash.ts +18 -0
- package/src/daemon/message-types/host-file.ts +44 -0
- package/src/daemon/message-types/integrations.ts +1 -67
- package/src/daemon/message-types/messages.ts +15 -0
- package/src/daemon/message-types/schedules.ts +11 -27
- package/src/daemon/message-types/sessions.ts +2 -1
- package/src/daemon/message-types/settings.ts +1 -1
- package/src/daemon/message-types/shared.ts +1 -1
- package/src/daemon/ride-shotgun-handler.ts +2 -42
- package/src/daemon/server.ts +43 -10
- package/src/daemon/session-agent-loop-handlers.ts +48 -7
- package/src/daemon/session-agent-loop.ts +97 -66
- package/src/daemon/session-attachments.ts +1 -1
- package/src/daemon/session-error.ts +17 -16
- package/src/daemon/session-lifecycle.ts +20 -1
- package/src/daemon/session-media-retry.ts +1 -15
- package/src/daemon/session-messaging.ts +14 -6
- package/src/daemon/session-process.ts +36 -7
- package/src/daemon/session-queue-manager.ts +62 -103
- package/src/daemon/session-runtime-assembly.ts +27 -0
- package/src/daemon/session-skill-tools.ts +12 -11
- package/src/daemon/session-slash.ts +7 -0
- package/src/daemon/session-surfaces.ts +19 -97
- package/src/daemon/session-tool-setup.ts +146 -6
- package/src/daemon/session.ts +77 -13
- package/src/errors.ts +0 -2
- package/src/export/formatter.ts +6 -0
- package/src/mcp/mcp-oauth-provider.ts +1 -3
- package/src/media/avatar-router.ts +20 -28
- package/src/media/avatar-types.ts +7 -14
- package/src/media/managed-avatar-client.ts +70 -34
- package/src/memory/conversation-title-service.ts +1 -2
- package/src/memory/db-init.ts +16 -0
- package/src/memory/embedding-backend.ts +129 -27
- package/src/memory/embedding-gemini.test.ts +256 -0
- package/src/memory/embedding-gemini.ts +47 -13
- package/src/memory/embedding-local.ts +14 -2
- package/src/memory/embedding-ollama.ts +15 -2
- package/src/memory/embedding-openai.ts +15 -2
- package/src/memory/embedding-types.test.ts +116 -0
- package/src/memory/embedding-types.ts +61 -0
- package/src/memory/fingerprint.ts +1 -1
- package/src/memory/indexer.ts +25 -1
- package/src/memory/job-handlers/embedding.test.ts +258 -0
- package/src/memory/job-handlers/embedding.ts +81 -1
- package/src/memory/job-handlers/index-maintenance.ts +35 -1
- package/src/memory/job-handlers/media-processing.ts +11 -1
- package/src/memory/job-utils.ts +21 -6
- package/src/memory/jobs-store.ts +5 -1
- package/src/memory/jobs-worker.ts +8 -0
- package/src/memory/message-content.ts +66 -0
- package/src/memory/migrations/100-core-tables.ts +1 -31
- package/src/memory/migrations/104-core-indexes.ts +0 -11
- package/src/memory/migrations/145-drop-accounts-table.ts +19 -0
- package/src/memory/migrations/146-schedule-oneshot-routing.ts +94 -0
- package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +129 -0
- package/src/memory/migrations/148-drop-reminders-table.ts +18 -0
- package/src/memory/migrations/index.ts +4 -0
- package/src/memory/migrations/registry.ts +19 -0
- package/src/memory/qdrant-client.ts +158 -43
- package/src/memory/retriever.test.ts +0 -1
- package/src/memory/retriever.ts +12 -2
- package/src/memory/schema/infrastructure.ts +5 -29
- package/src/memory/search/formatting.ts +34 -9
- package/src/memory/search/semantic.ts +57 -2
- package/src/memory/search/types.ts +2 -1
- package/src/notifications/AGENTS.md +2 -2
- package/src/notifications/README.md +59 -58
- package/src/notifications/adapters/macos.ts +1 -1
- package/src/notifications/broadcaster.ts +5 -5
- package/src/notifications/copy-composer.ts +1 -1
- package/src/notifications/decision-engine.ts +2 -2
- package/src/notifications/destination-resolver.ts +2 -2
- package/src/notifications/emit-signal.ts +8 -8
- package/src/notifications/signal.ts +1 -1
- package/src/notifications/thread-seed-composer.ts +1 -1
- package/src/oauth/connect-orchestrator.ts +1 -1
- package/src/oauth/token-persistence.ts +1 -1
- package/src/permissions/checker.ts +12 -1
- package/src/permissions/defaults.ts +10 -14
- package/src/permissions/trust-store.ts +37 -0
- package/src/permissions/workspace-policy.ts +0 -1
- package/src/prompts/__tests__/build-cli-reference-section.test.ts +11 -0
- package/src/prompts/computer-use-prompt.ts +1 -1
- package/src/prompts/system-prompt.ts +29 -30
- package/src/prompts/templates/SOUL.md +1 -2
- package/src/prompts/templates/UPDATES.md +16 -7
- package/src/providers/anthropic/client.ts +87 -33
- package/src/providers/gemini/client.ts +6 -0
- package/src/providers/managed-proxy/constants.ts +5 -0
- package/src/providers/openai/client.ts +15 -0
- package/src/providers/registry.ts +2 -2
- package/src/providers/types.ts +24 -2
- package/src/runtime/AGENTS.md +18 -0
- package/src/runtime/assistant-event-hub.ts +2 -3
- package/src/runtime/assistant-event.ts +4 -4
- package/src/runtime/auth/__tests__/context.test.ts +5 -5
- package/src/runtime/auth/__tests__/credential-service.test.ts +0 -1
- package/src/runtime/auth/__tests__/guard-tests.test.ts +2 -2
- package/src/runtime/auth/__tests__/{ipc-auth-context.test.ts → local-auth-context.test.ts} +21 -21
- package/src/runtime/auth/__tests__/route-policy.test.ts +2 -2
- package/src/runtime/auth/__tests__/scopes.test.ts +7 -7
- package/src/runtime/auth/__tests__/subject.test.ts +8 -8
- package/src/runtime/auth/__tests__/token-service.test.ts +0 -1
- package/src/runtime/auth/route-policy.ts +8 -4
- package/src/runtime/auth/scopes.ts +1 -1
- package/src/runtime/auth/subject.ts +4 -4
- package/src/runtime/auth/token-service.ts +0 -23
- package/src/runtime/auth/types.ts +3 -3
- package/src/runtime/guardian-action-followup-executor.ts +1 -1
- package/src/runtime/guardian-action-grant-minter.ts +1 -1
- package/src/runtime/guardian-action-service.ts +3 -3
- package/src/runtime/http-server.ts +15 -2
- package/src/runtime/invite-service.ts +3 -3
- package/src/runtime/local-actor-identity.ts +17 -22
- package/src/runtime/pending-interactions.ts +21 -9
- package/src/runtime/routes/app-management-routes.ts +2 -3
- package/src/runtime/routes/approval-routes.ts +1 -3
- package/src/runtime/routes/btw-routes.ts +155 -0
- package/src/runtime/routes/computer-use-routes.ts +77 -31
- package/src/runtime/routes/conversation-routes.ts +230 -46
- package/src/runtime/routes/diagnostics-routes.ts +63 -29
- package/src/runtime/routes/documents-routes.ts +2 -2
- package/src/runtime/routes/global-search-routes.ts +1 -1
- package/src/runtime/routes/host-bash-routes.ts +83 -0
- package/src/runtime/routes/host-file-routes.ts +79 -0
- package/src/runtime/routes/integrations/slack/share.ts +1 -1
- package/src/runtime/routes/log-export-routes.ts +120 -0
- package/src/runtime/routes/mcp-routes.ts +20 -0
- package/src/runtime/routes/migration-routes.ts +3 -3
- package/src/runtime/routes/pairing-routes.ts +1 -1
- package/src/runtime/routes/recording-routes.ts +6 -4
- package/src/runtime/routes/schedule-routes.ts +31 -5
- package/src/runtime/routes/session-management-routes.ts +2 -6
- package/src/runtime/routes/session-query-routes.ts +18 -15
- package/src/runtime/routes/settings-routes.ts +7 -261
- package/src/runtime/routes/skills-routes.ts +7 -6
- package/src/runtime/routes/subagents-routes.ts +4 -10
- package/src/runtime/routes/surface-action-routes.ts +3 -14
- package/src/runtime/routes/surface-content-routes.ts +22 -5
- package/src/runtime/routes/work-items-routes.ts +21 -25
- package/src/runtime/routes/workspace-routes.test.ts +3 -3
- package/src/runtime/routes/workspace-utils.ts +1 -1
- package/src/runtime/telegram-streaming-delivery.ts +3 -0
- package/src/runtime/verification-outbound-actions.ts +2 -2
- package/src/schedule/integration-status.ts +0 -6
- package/src/schedule/schedule-store.ts +234 -43
- package/src/schedule/scheduler.ts +73 -74
- package/src/security/oauth2.ts +1 -1
- package/src/sequence/store.ts +12 -2
- package/src/skills/frontmatter.ts +19 -77
- package/src/skills/managed-store.ts +11 -2
- package/src/subagent/manager.ts +5 -3
- package/src/tasks/ephemeral-permissions.ts +3 -5
- package/src/tools/AGENTS.md +0 -1
- package/src/tools/browser/browser-manager.ts +17 -11
- package/src/tools/browser/jit-auth.ts +4 -1
- package/src/tools/claude-code/claude-code.ts +1 -1
- package/src/tools/computer-use/definitions.ts +48 -60
- package/src/tools/document/document-tool.ts +6 -6
- package/src/tools/filesystem/edit.ts +2 -1
- package/src/tools/filesystem/read.ts +20 -2
- package/src/tools/filesystem/write.ts +2 -1
- package/src/tools/host-filesystem/edit.ts +17 -1
- package/src/tools/host-filesystem/read.ts +16 -1
- package/src/tools/host-filesystem/write.ts +15 -1
- package/src/tools/host-terminal/host-shell.ts +24 -0
- package/src/tools/memory/definitions.ts +45 -81
- package/src/tools/memory/handlers.test.ts +0 -1
- package/src/tools/memory/handlers.ts +1 -1
- package/src/tools/memory/register.ts +26 -60
- package/src/tools/network/script-proxy/session-manager.ts +6 -8
- package/src/tools/network/web-fetch.ts +7 -1
- package/src/tools/network/web-search.ts +2 -1
- package/src/tools/registry.ts +23 -0
- package/src/tools/schedule/create.ts +113 -5
- package/src/tools/schedule/list.ts +57 -15
- package/src/tools/schedule/update.ts +73 -3
- package/src/tools/shared/filesystem/image-read.ts +192 -0
- package/src/tools/side-effects.ts +1 -7
- package/src/tools/skills/delete-managed.ts +27 -64
- package/src/tools/skills/execute.ts +54 -0
- package/src/tools/skills/load.ts +127 -5
- package/src/tools/skills/scaffold-managed.ts +93 -172
- package/src/tools/subagent/message.ts +0 -7
- package/src/tools/subagent/spawn.ts +1 -1
- package/src/tools/swarm/delegate.ts +0 -3
- package/src/tools/system/avatar-generator.ts +13 -19
- package/src/tools/system/request-permission.ts +2 -1
- package/src/tools/terminal/safe-env.ts +1 -0
- package/src/tools/tool-manifest.ts +41 -47
- package/src/tools/types.ts +6 -2
- package/src/tools/ui-surface/definitions.ts +0 -55
- package/src/util/errors.ts +0 -10
- package/src/workspace/git-service.ts +0 -2
- package/src/__tests__/account-registry.test.ts +0 -258
- package/src/__tests__/email-classifier.test.ts +0 -25
- package/src/__tests__/gmail-integration.test.ts +0 -97
- package/src/__tests__/handle-user-message-secret-resume.test.ts +0 -172
- package/src/__tests__/managed-twitter-guardrails.test.ts +0 -357
- package/src/__tests__/recording-intent-fallback.test.ts +0 -199
- package/src/__tests__/recording-intent.test.ts +0 -985
- package/src/__tests__/recording-state-machine.test.ts +0 -1574
- package/src/__tests__/reminder-store.test.ts +0 -350
- package/src/__tests__/reminder.test.ts +0 -337
- package/src/__tests__/scan-result-store.test.ts +0 -121
- package/src/__tests__/twitter-platform-proxy-client.test.ts +0 -475
- package/src/__tests__/view-image-tool.test.ts +0 -241
- package/src/cli/commands/amazon/cart.ts +0 -513
- package/src/cli/commands/amazon/checkout.ts +0 -394
- package/src/cli/commands/amazon/client.ts +0 -513
- package/src/cli/commands/amazon/index.ts +0 -885
- package/src/cli/commands/amazon/product-details.ts +0 -145
- package/src/cli/commands/amazon/request-extractor.ts +0 -187
- package/src/cli/commands/amazon/search.ts +0 -76
- package/src/cli/commands/amazon/session.ts +0 -108
- package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +0 -345
- package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +0 -252
- package/src/cli/commands/twitter/__tests__/oauth-client.test.ts +0 -151
- package/src/cli/commands/twitter/index.ts +0 -420
- package/src/cli/commands/twitter/oauth-client.ts +0 -60
- package/src/cli/commands/twitter/router.ts +0 -351
- package/src/cli/commands/twitter/types.ts +0 -30
- package/src/config/bundled-skills/agentmail/SKILL.md +0 -132
- package/src/config/bundled-skills/agentmail/icon.svg +0 -21
- package/src/config/bundled-skills/amazon/SKILL.md +0 -136
- package/src/config/bundled-skills/amazon/icon.svg +0 -13
- package/src/config/bundled-skills/api-mapping/SKILL.md +0 -78
- package/src/config/bundled-skills/api-mapping/icon.svg +0 -18
- package/src/config/bundled-skills/cli-discover/SKILL.md +0 -68
- package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +0 -179
- package/src/config/bundled-skills/document-writer/SKILL.md +0 -195
- package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +0 -140
- package/src/config/bundled-skills/email-setup/SKILL.md +0 -68
- package/src/config/bundled-skills/frontend-design/SKILL.md +0 -44
- package/src/config/bundled-skills/frontend-design/icon.svg +0 -16
- package/src/config/bundled-skills/google-oauth-setup/SKILL.md +0 -452
- package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +0 -203
- package/src/config/bundled-skills/influencer/SKILL.md +0 -144
- package/src/config/bundled-skills/influencer/scripts/client.ts +0 -1269
- package/src/config/bundled-skills/influencer/scripts/influencer.ts +0 -267
- package/src/config/bundled-skills/macos-automation/SKILL.md +0 -65
- package/src/config/bundled-skills/macos-automation/icon.svg +0 -12
- package/src/config/bundled-skills/mcp-setup/SKILL.md +0 -75
- package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +0 -184
- package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +0 -80
- package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +0 -29
- package/src/config/bundled-skills/messaging/tools/gmail-batch-archive.ts +0 -56
- package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +0 -34
- package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +0 -47
- package/src/config/bundled-skills/messaging/tools/gmail-label.ts +0 -31
- package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +0 -67
- package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +0 -97
- package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +0 -87
- package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +0 -135
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +0 -24
- package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +0 -201
- package/src/config/bundled-skills/messaging/tools/send-notification.ts +0 -1
- package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +0 -27
- package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +0 -48
- package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +0 -27
- package/src/config/bundled-skills/messaging/tools/sequence-update.ts +0 -56
- package/src/config/bundled-skills/notion/SKILL.md +0 -240
- package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +0 -126
- package/src/config/bundled-skills/oauth-setup/SKILL.md +0 -143
- package/src/config/bundled-skills/public-ingress/SKILL.md +0 -258
- package/src/config/bundled-skills/reminder/SKILL.md +0 -79
- package/src/config/bundled-skills/reminder/TOOLS.json +0 -89
- package/src/config/bundled-skills/reminder/tools/reminder-list.ts +0 -12
- package/src/config/bundled-skills/restaurant-reservation/SKILL.md +0 -141
- package/src/config/bundled-skills/screen-recording/SKILL.md +0 -148
- package/src/config/bundled-skills/self-upgrade/SKILL.md +0 -69
- package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -78
- package/src/config/bundled-skills/slack-app-setup/SKILL.md +0 -178
- package/src/config/bundled-skills/slack-digest-setup/SKILL.md +0 -163
- package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +0 -157
- package/src/config/bundled-skills/start-the-day/SKILL.md +0 -70
- package/src/config/bundled-skills/start-the-day/icon.svg +0 -13
- package/src/config/bundled-skills/telegram-setup/SKILL.md +0 -105
- package/src/config/bundled-skills/time-based-actions/SKILL.md +0 -142
- package/src/config/bundled-skills/twilio-setup/SKILL.md +0 -232
- package/src/config/bundled-skills/twitter/SKILL.md +0 -206
- package/src/config/bundled-skills/twitter/icon.svg +0 -14
- package/src/config/bundled-skills/typescript-eval/SKILL.md +0 -60
- package/src/config/bundled-skills/vercel-token-setup/SKILL.md +0 -214
- package/src/config/bundled-skills/voice-setup/SKILL.md +0 -131
- package/src/config/bundled-skills/voice-setup/icon.svg +0 -20
- package/src/daemon/handlers/pairing.ts +0 -119
- package/src/daemon/handlers/session-user-message.ts +0 -961
- package/src/daemon/recording-executor.ts +0 -180
- package/src/daemon/recording-intent-fallback.ts +0 -162
- package/src/daemon/recording-intent.ts +0 -493
- package/src/memory/account-store.ts +0 -117
- package/src/messaging/activity-analyzer.ts +0 -76
- package/src/messaging/email-classifier.ts +0 -208
- package/src/messaging/index.ts +0 -2
- package/src/messaging/outreach-classifier.ts +0 -185
- package/src/messaging/thread-summarizer.ts +0 -346
- package/src/messaging/types.ts +0 -17
- package/src/tools/browser/x-auto-navigate.ts +0 -254
- package/src/tools/credentials/account-registry.ts +0 -144
- package/src/tools/filesystem/view-image.ts +0 -244
- package/src/tools/reminder/reminder-store.ts +0 -194
- package/src/tools/reminder/reminder.ts +0 -158
- package/src/tools/system/navigate-settings.ts +0 -74
- package/src/tools/system/open-system-settings.ts +0 -85
- package/src/tools/system/version.ts +0 -54
- package/src/twitter/platform-proxy-client.ts +0 -408
- /package/src/config/bundled-skills/{messaging → gmail}/tools/scan-result-store.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-analytics.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-create.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-delete.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enroll.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enrollment-list.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-get.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-import.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-list.ts +0 -0
|
@@ -297,7 +297,7 @@ describe("scope profile contract", () => {
|
|
|
297
297
|
"attachments.write",
|
|
298
298
|
"internal.write",
|
|
299
299
|
],
|
|
300
|
-
|
|
300
|
+
local_v1: ["local.all"],
|
|
301
301
|
ui_page_v1: ["settings.read"],
|
|
302
302
|
};
|
|
303
303
|
|
|
@@ -320,7 +320,7 @@ describe("scope profile contract", () => {
|
|
|
320
320
|
"actor_client_v1",
|
|
321
321
|
"gateway_ingress_v1",
|
|
322
322
|
"gateway_service_v1",
|
|
323
|
-
"
|
|
323
|
+
"local_v1",
|
|
324
324
|
"ui_page_v1",
|
|
325
325
|
];
|
|
326
326
|
|
|
@@ -1,56 +1,56 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
2
|
|
|
3
3
|
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../../assistant-scope.js";
|
|
4
|
-
import {
|
|
4
|
+
import { buildLocalAuthContext } from "../../local-actor-identity.js";
|
|
5
5
|
import { CURRENT_POLICY_EPOCH } from "../policy.js";
|
|
6
6
|
import { resolveScopeProfile } from "../scopes.js";
|
|
7
7
|
|
|
8
|
-
describe("
|
|
8
|
+
describe("buildLocalAuthContext", () => {
|
|
9
9
|
test("produces correct subject pattern", () => {
|
|
10
|
-
const ctx =
|
|
11
|
-
expect(ctx.subject).toBe("
|
|
10
|
+
const ctx = buildLocalAuthContext("session-abc");
|
|
11
|
+
expect(ctx.subject).toBe("local:self:session-abc");
|
|
12
12
|
});
|
|
13
13
|
|
|
14
|
-
test("sets principalType to
|
|
15
|
-
const ctx =
|
|
16
|
-
expect(ctx.principalType).toBe("
|
|
14
|
+
test("sets principalType to local", () => {
|
|
15
|
+
const ctx = buildLocalAuthContext("session-abc");
|
|
16
|
+
expect(ctx.principalType).toBe("local");
|
|
17
17
|
});
|
|
18
18
|
|
|
19
19
|
test("uses DAEMON_INTERNAL_ASSISTANT_ID for assistantId", () => {
|
|
20
|
-
const ctx =
|
|
20
|
+
const ctx = buildLocalAuthContext("session-abc");
|
|
21
21
|
expect(ctx.assistantId).toBe(DAEMON_INTERNAL_ASSISTANT_ID);
|
|
22
22
|
expect(ctx.assistantId).toBe("self");
|
|
23
23
|
});
|
|
24
24
|
|
|
25
25
|
test("includes sessionId from argument", () => {
|
|
26
|
-
const ctx =
|
|
26
|
+
const ctx = buildLocalAuthContext("my-session-123");
|
|
27
27
|
expect(ctx.sessionId).toBe("my-session-123");
|
|
28
28
|
});
|
|
29
29
|
|
|
30
|
-
test("uses
|
|
31
|
-
const ctx =
|
|
32
|
-
expect(ctx.scopeProfile).toBe("
|
|
30
|
+
test("uses local_v1 scope profile", () => {
|
|
31
|
+
const ctx = buildLocalAuthContext("session-abc");
|
|
32
|
+
expect(ctx.scopeProfile).toBe("local_v1");
|
|
33
33
|
});
|
|
34
34
|
|
|
35
|
-
test("resolves scopes from
|
|
36
|
-
const ctx =
|
|
37
|
-
const expectedScopes = resolveScopeProfile("
|
|
35
|
+
test("resolves scopes from local_v1 profile", () => {
|
|
36
|
+
const ctx = buildLocalAuthContext("session-abc");
|
|
37
|
+
const expectedScopes = resolveScopeProfile("local_v1");
|
|
38
38
|
expect(ctx.scopes).toBe(expectedScopes);
|
|
39
|
-
expect(ctx.scopes.has("
|
|
39
|
+
expect(ctx.scopes.has("local.all")).toBe(true);
|
|
40
40
|
});
|
|
41
41
|
|
|
42
42
|
test("uses current policy epoch", () => {
|
|
43
|
-
const ctx =
|
|
43
|
+
const ctx = buildLocalAuthContext("session-abc");
|
|
44
44
|
expect(ctx.policyEpoch).toBe(CURRENT_POLICY_EPOCH);
|
|
45
45
|
});
|
|
46
46
|
|
|
47
47
|
test("does not set actorPrincipalId", () => {
|
|
48
|
-
const ctx =
|
|
48
|
+
const ctx = buildLocalAuthContext("session-abc");
|
|
49
49
|
expect(ctx.actorPrincipalId).toBeUndefined();
|
|
50
50
|
});
|
|
51
51
|
|
|
52
52
|
test("matches AuthContext shape from HTTP JWT-derived contexts", () => {
|
|
53
|
-
const ctx =
|
|
53
|
+
const ctx = buildLocalAuthContext("session-xyz");
|
|
54
54
|
|
|
55
55
|
// Verify all required AuthContext fields are present
|
|
56
56
|
expect(typeof ctx.subject).toBe("string");
|
|
@@ -63,8 +63,8 @@ describe("buildIpcAuthContext", () => {
|
|
|
63
63
|
});
|
|
64
64
|
|
|
65
65
|
test("different session IDs produce different subjects", () => {
|
|
66
|
-
const ctx1 =
|
|
67
|
-
const ctx2 =
|
|
66
|
+
const ctx1 = buildLocalAuthContext("session-1");
|
|
67
|
+
const ctx2 = buildLocalAuthContext("session-2");
|
|
68
68
|
expect(ctx1.subject).not.toBe(ctx2.subject);
|
|
69
69
|
expect(ctx1.sessionId).not.toBe(ctx2.sessionId);
|
|
70
70
|
});
|
|
@@ -129,13 +129,13 @@ describe("enforcePolicy", () => {
|
|
|
129
129
|
expect(result!.status).toBe(403);
|
|
130
130
|
});
|
|
131
131
|
|
|
132
|
-
test("standard actor endpoints allow actor, svc_gateway, and
|
|
132
|
+
test("standard actor endpoints allow actor, svc_gateway, and local", () => {
|
|
133
133
|
authDisabled = false;
|
|
134
134
|
const policy = getPolicy("messages:POST");
|
|
135
135
|
expect(policy).toBeDefined();
|
|
136
136
|
expect(policy!.allowedPrincipalTypes).toContain("actor");
|
|
137
137
|
expect(policy!.allowedPrincipalTypes).toContain("svc_gateway");
|
|
138
|
-
expect(policy!.allowedPrincipalTypes).toContain("
|
|
138
|
+
expect(policy!.allowedPrincipalTypes).toContain("local");
|
|
139
139
|
});
|
|
140
140
|
|
|
141
141
|
test("dev bypass allows all requests through regardless of policy", () => {
|
|
@@ -42,7 +42,7 @@ describe("resolveScopeProfile", () => {
|
|
|
42
42
|
const scopes = resolveScopeProfile("actor_client_v1");
|
|
43
43
|
expect(scopes.has("ingress.write")).toBe(false);
|
|
44
44
|
expect(scopes.has("internal.write")).toBe(false);
|
|
45
|
-
expect(scopes.has("
|
|
45
|
+
expect(scopes.has("local.all")).toBe(false);
|
|
46
46
|
});
|
|
47
47
|
|
|
48
48
|
test("gateway_ingress_v1 includes ingress and internal scopes", () => {
|
|
@@ -64,9 +64,9 @@ describe("resolveScopeProfile", () => {
|
|
|
64
64
|
expect(scopes.size).toBe(7);
|
|
65
65
|
});
|
|
66
66
|
|
|
67
|
-
test("
|
|
68
|
-
const scopes = resolveScopeProfile("
|
|
69
|
-
expect(scopes.has("
|
|
67
|
+
test("local_v1 includes only local.all", () => {
|
|
68
|
+
const scopes = resolveScopeProfile("local_v1");
|
|
69
|
+
expect(scopes.has("local.all")).toBe(true);
|
|
70
70
|
expect(scopes.size).toBe(1);
|
|
71
71
|
});
|
|
72
72
|
});
|
|
@@ -82,9 +82,9 @@ describe("hasScope", () => {
|
|
|
82
82
|
expect(hasScope(ctx, "ingress.write")).toBe(false);
|
|
83
83
|
});
|
|
84
84
|
|
|
85
|
-
test("returns true for
|
|
86
|
-
const ctx = makeCtx("
|
|
87
|
-
expect(hasScope(ctx, "
|
|
85
|
+
test("returns true for local.all on local_v1 profile", () => {
|
|
86
|
+
const ctx = makeCtx("local_v1");
|
|
87
|
+
expect(hasScope(ctx, "local.all")).toBe(true);
|
|
88
88
|
});
|
|
89
89
|
});
|
|
90
90
|
|
|
@@ -76,14 +76,14 @@ describe("parseSub", () => {
|
|
|
76
76
|
});
|
|
77
77
|
|
|
78
78
|
// -------------------------------------------------------------------------
|
|
79
|
-
//
|
|
79
|
+
// local pattern
|
|
80
80
|
// -------------------------------------------------------------------------
|
|
81
81
|
|
|
82
|
-
test("parses
|
|
83
|
-
const result = parseSub("
|
|
82
|
+
test("parses local:<assistantId>:<sessionId>", () => {
|
|
83
|
+
const result = parseSub("local:self:session-xyz");
|
|
84
84
|
expect(result.ok).toBe(true);
|
|
85
85
|
if (result.ok) {
|
|
86
|
-
expect(result.principalType).toBe("
|
|
86
|
+
expect(result.principalType).toBe("local");
|
|
87
87
|
expect(result.assistantId).toBe("self");
|
|
88
88
|
expect(result.sessionId).toBe("session-xyz");
|
|
89
89
|
expect(result.actorPrincipalId).toBeUndefined();
|
|
@@ -158,16 +158,16 @@ describe("parseSub", () => {
|
|
|
158
158
|
}
|
|
159
159
|
});
|
|
160
160
|
|
|
161
|
-
test("fails on
|
|
162
|
-
const result = parseSub("
|
|
161
|
+
test("fails on local with empty sessionId", () => {
|
|
162
|
+
const result = parseSub("local:self:");
|
|
163
163
|
expect(result.ok).toBe(false);
|
|
164
164
|
if (!result.ok) {
|
|
165
165
|
expect(result.reason).toContain("empty");
|
|
166
166
|
}
|
|
167
167
|
});
|
|
168
168
|
|
|
169
|
-
test("fails on
|
|
170
|
-
const result = parseSub("
|
|
169
|
+
test("fails on local with empty assistantId", () => {
|
|
170
|
+
const result = parseSub("local::session-abc");
|
|
171
171
|
expect(result.ok).toBe(false);
|
|
172
172
|
if (!result.ok) {
|
|
173
173
|
expect(result.reason).toContain("empty");
|
|
@@ -13,7 +13,6 @@ mock.module("../../../util/platform.js", () => ({
|
|
|
13
13
|
isMacOS: () => process.platform === "darwin",
|
|
14
14
|
isLinux: () => process.platform === "linux",
|
|
15
15
|
isWindows: () => process.platform === "win32",
|
|
16
|
-
getSocketPath: () => join(testDir, "test.sock"),
|
|
17
16
|
getPidPath: () => join(testDir, "test.pid"),
|
|
18
17
|
getLogPath: () => join(testDir, "test.log"),
|
|
19
18
|
ensureDataDir: () => {},
|
|
@@ -126,6 +126,7 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
|
|
|
126
126
|
// Conversation / messaging
|
|
127
127
|
{ endpoint: "messages:GET", scopes: ["chat.read"] },
|
|
128
128
|
{ endpoint: "messages:POST", scopes: ["chat.write"] },
|
|
129
|
+
{ endpoint: "btw", scopes: ["chat.write"] },
|
|
129
130
|
{ endpoint: "conversations", scopes: ["chat.read"] },
|
|
130
131
|
{ endpoint: "conversations:DELETE", scopes: ["chat.write"] },
|
|
131
132
|
{ endpoint: "conversations/switch", scopes: ["chat.write"] },
|
|
@@ -144,6 +145,7 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
|
|
|
144
145
|
{ endpoint: "confirm", scopes: ["approval.write"] },
|
|
145
146
|
{ endpoint: "secret", scopes: ["approval.write"] },
|
|
146
147
|
{ endpoint: "trust-rules", scopes: ["approval.write"] },
|
|
148
|
+
{ endpoint: "host-bash-result", scopes: ["approval.write"] },
|
|
147
149
|
{ endpoint: "pending-interactions", scopes: ["approval.read"] },
|
|
148
150
|
|
|
149
151
|
// Guardian actions
|
|
@@ -379,6 +381,9 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
|
|
|
379
381
|
// Delivery ack
|
|
380
382
|
{ endpoint: "channels/delivery-ack", scopes: ["internal.write"] },
|
|
381
383
|
|
|
384
|
+
// MCP
|
|
385
|
+
{ endpoint: "mcp/reload", scopes: ["settings.write"] },
|
|
386
|
+
|
|
382
387
|
// Migrations
|
|
383
388
|
{ endpoint: "migrations/validate", scopes: ["settings.write"] },
|
|
384
389
|
{ endpoint: "migrations/export", scopes: ["settings.write"] },
|
|
@@ -395,6 +400,7 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
|
|
|
395
400
|
{ endpoint: "schedules:DELETE", scopes: ["settings.write"] },
|
|
396
401
|
{ endpoint: "schedules/toggle", scopes: ["settings.write"] },
|
|
397
402
|
{ endpoint: "schedules/run", scopes: ["settings.write"] },
|
|
403
|
+
{ endpoint: "schedules/cancel", scopes: ["settings.write"] },
|
|
398
404
|
|
|
399
405
|
// Diagnostics
|
|
400
406
|
{ endpoint: "diagnostics/export", scopes: ["settings.read"] },
|
|
@@ -405,10 +411,8 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
|
|
|
405
411
|
|
|
406
412
|
// OAuth / integrations
|
|
407
413
|
{ endpoint: "integrations/oauth/start", scopes: ["settings.write"] },
|
|
408
|
-
{ endpoint: "integrations/twitter/auth/start", scopes: ["settings.write"] },
|
|
409
|
-
{ endpoint: "integrations/twitter/auth/status", scopes: ["settings.read"] },
|
|
410
414
|
|
|
411
|
-
// Workspace files
|
|
415
|
+
// Workspace files
|
|
412
416
|
{ endpoint: "workspace-files", scopes: ["settings.read"] },
|
|
413
417
|
{ endpoint: "workspace-files/read", scopes: ["settings.read"] },
|
|
414
418
|
|
|
@@ -420,7 +424,7 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
|
|
|
420
424
|
for (const { endpoint, scopes } of ACTOR_ENDPOINTS) {
|
|
421
425
|
registerPolicy(endpoint, {
|
|
422
426
|
requiredScopes: scopes,
|
|
423
|
-
allowedPrincipalTypes: ["actor", "svc_gateway", "svc_daemon", "
|
|
427
|
+
allowedPrincipalTypes: ["actor", "svc_gateway", "svc_daemon", "local"],
|
|
424
428
|
});
|
|
425
429
|
}
|
|
426
430
|
|
|
@@ -37,7 +37,7 @@ const PROFILE_SCOPES: Record<ScopeProfile, ReadonlySet<Scope>> = {
|
|
|
37
37
|
"attachments.write",
|
|
38
38
|
"internal.write",
|
|
39
39
|
]),
|
|
40
|
-
|
|
40
|
+
local_v1: new Set<Scope>(["local.all"]),
|
|
41
41
|
ui_page_v1: new Set<Scope>(["settings.read"]),
|
|
42
42
|
};
|
|
43
43
|
|
|
@@ -32,7 +32,7 @@ export type ParseSubResult =
|
|
|
32
32
|
* actor:<assistantId>:<actorPrincipalId>
|
|
33
33
|
* svc:gateway:<assistantId>
|
|
34
34
|
* svc:daemon:<identifier>
|
|
35
|
-
*
|
|
35
|
+
* local:<assistantId>:<sessionId>
|
|
36
36
|
*/
|
|
37
37
|
export function parseSub(sub: string): ParseSubResult {
|
|
38
38
|
if (!sub || typeof sub !== "string") {
|
|
@@ -68,15 +68,15 @@ export function parseSub(sub: string): ParseSubResult {
|
|
|
68
68
|
return { ok: true, principalType: "svc_daemon", assistantId: identifier };
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
if (parts[0] === "
|
|
71
|
+
if (parts[0] === "local" && parts.length === 3) {
|
|
72
72
|
const [, assistantId, sessionId] = parts;
|
|
73
73
|
if (!assistantId || !sessionId) {
|
|
74
74
|
return {
|
|
75
75
|
ok: false,
|
|
76
|
-
reason: "
|
|
76
|
+
reason: "local sub has empty assistantId or sessionId",
|
|
77
77
|
};
|
|
78
78
|
}
|
|
79
|
-
return { ok: true, principalType: "
|
|
79
|
+
return { ok: true, principalType: "local", assistantId, sessionId };
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
return { ok: false, reason: `unrecognized sub pattern: ${sub}` };
|
|
@@ -329,29 +329,6 @@ export function mintUiPageToken(): string {
|
|
|
329
329
|
});
|
|
330
330
|
}
|
|
331
331
|
|
|
332
|
-
// ---------------------------------------------------------------------------
|
|
333
|
-
// CLI edge token
|
|
334
|
-
// ---------------------------------------------------------------------------
|
|
335
|
-
|
|
336
|
-
/**
|
|
337
|
-
* Mint a long-lived JWT for the CLI to authenticate with the gateway.
|
|
338
|
-
*
|
|
339
|
-
* Written to ~/.vellum/http-token at daemon startup so the CLI can read it
|
|
340
|
-
* and pass it as a Bearer token. Regenerated on each daemon restart. A 30-day
|
|
341
|
-
* TTL avoids expiry between restarts while keeping the window bounded.
|
|
342
|
-
*
|
|
343
|
-
* Uses aud=vellum-gateway so the gateway's edge-auth middleware accepts it.
|
|
344
|
-
*/
|
|
345
|
-
export function mintCliEdgeToken(): string {
|
|
346
|
-
return mintToken({
|
|
347
|
-
aud: "vellum-gateway",
|
|
348
|
-
sub: "svc:daemon:self",
|
|
349
|
-
scope_profile: "gateway_service_v1",
|
|
350
|
-
policy_epoch: CURRENT_POLICY_EPOCH,
|
|
351
|
-
ttlSeconds: 86400 * 30,
|
|
352
|
-
});
|
|
353
|
-
}
|
|
354
|
-
|
|
355
332
|
// ---------------------------------------------------------------------------
|
|
356
333
|
// Pairing bearer token
|
|
357
334
|
// ---------------------------------------------------------------------------
|
|
@@ -13,7 +13,7 @@ export type ScopeProfile =
|
|
|
13
13
|
| "actor_client_v1"
|
|
14
14
|
| "gateway_ingress_v1"
|
|
15
15
|
| "gateway_service_v1"
|
|
16
|
-
| "
|
|
16
|
+
| "local_v1"
|
|
17
17
|
| "ui_page_v1";
|
|
18
18
|
|
|
19
19
|
// ---------------------------------------------------------------------------
|
|
@@ -35,13 +35,13 @@ export type Scope =
|
|
|
35
35
|
| "internal.write"
|
|
36
36
|
| "feature_flags.read"
|
|
37
37
|
| "feature_flags.write"
|
|
38
|
-
| "
|
|
38
|
+
| "local.all";
|
|
39
39
|
|
|
40
40
|
// ---------------------------------------------------------------------------
|
|
41
41
|
// Principal types — derived from the sub pattern
|
|
42
42
|
// ---------------------------------------------------------------------------
|
|
43
43
|
|
|
44
|
-
export type PrincipalType = "actor" | "svc_gateway" | "svc_daemon" | "
|
|
44
|
+
export type PrincipalType = "actor" | "svc_gateway" | "svc_daemon" | "local";
|
|
45
45
|
|
|
46
46
|
// ---------------------------------------------------------------------------
|
|
47
47
|
// Token audience — which service the JWT is intended for
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* reply text for the guardian's confirmation message.
|
|
14
14
|
*
|
|
15
15
|
* This module is channel-agnostic: both inbound-message-handler (Telegram
|
|
16
|
-
* channels) and session-process (
|
|
16
|
+
* channels) and session-process (desktop channel) use it.
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
19
|
import { startCall } from "../calls/call-domain.js";
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* request is resolved with tool metadata.
|
|
4
4
|
*
|
|
5
5
|
* Used by both the channel inbound path (inbound-message-handler.ts) and
|
|
6
|
-
* the desktop
|
|
6
|
+
* the desktop path (session-process.ts) to ensure grants are minted
|
|
7
7
|
* consistently regardless of which channel the guardian answers on.
|
|
8
8
|
*/
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Encapsulates the core business logic — validation, conversation scoping,
|
|
5
5
|
* canonical decision application, and result mapping — so both the HTTP
|
|
6
|
-
* handler and the
|
|
6
|
+
* handler and the message handler can delegate here without duplicating code.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import { applyCanonicalGuardianDecision } from "../approvals/guardian-decision-primitive.js";
|
|
@@ -61,7 +61,7 @@ export type ProcessGuardianDecisionResult =
|
|
|
61
61
|
*
|
|
62
62
|
* Validates the action, checks conversation scope if applicable, applies the
|
|
63
63
|
* canonical decision, and maps the result to a caller-agnostic shape that
|
|
64
|
-
* both HTTP and
|
|
64
|
+
* both HTTP and message handlers can interpret.
|
|
65
65
|
*/
|
|
66
66
|
export async function processGuardianDecision(
|
|
67
67
|
params: ProcessGuardianDecisionParams,
|
|
@@ -97,7 +97,7 @@ export async function processGuardianDecision(
|
|
|
97
97
|
action: action as ApprovalAction,
|
|
98
98
|
actorContext: {
|
|
99
99
|
actorPrincipalId: actorContext.actorPrincipalId,
|
|
100
|
-
actorExternalUserId: undefined, // Desktop
|
|
100
|
+
actorExternalUserId: undefined, // Desktop path — no channel-native ID
|
|
101
101
|
channel,
|
|
102
102
|
guardianPrincipalId: actorContext.guardianPrincipalId,
|
|
103
103
|
},
|
|
@@ -97,6 +97,7 @@ import { appRouteDefinitions } from "./routes/app-routes.js";
|
|
|
97
97
|
import { approvalRouteDefinitions } from "./routes/approval-routes.js";
|
|
98
98
|
import { attachmentRouteDefinitions } from "./routes/attachment-routes.js";
|
|
99
99
|
import { brainGraphRouteDefinitions } from "./routes/brain-graph-routes.js";
|
|
100
|
+
import { btwRouteDefinitions } from "./routes/btw-routes.js";
|
|
100
101
|
import { callRouteDefinitions } from "./routes/call-routes.js";
|
|
101
102
|
import {
|
|
102
103
|
startCanonicalGuardianExpirySweep,
|
|
@@ -124,6 +125,8 @@ import { globalSearchRouteDefinitions } from "./routes/global-search-routes.js";
|
|
|
124
125
|
import { guardianActionRouteDefinitions } from "./routes/guardian-action-routes.js";
|
|
125
126
|
import { handleGuardianBootstrap } from "./routes/guardian-bootstrap-routes.js";
|
|
126
127
|
import { handleGuardianRefresh } from "./routes/guardian-refresh-routes.js";
|
|
128
|
+
import { hostBashRouteDefinitions } from "./routes/host-bash-routes.js";
|
|
129
|
+
import { hostFileRouteDefinitions } from "./routes/host-file-routes.js";
|
|
127
130
|
import { handleHealth } from "./routes/identity-routes.js";
|
|
128
131
|
import { identityRouteDefinitions } from "./routes/identity-routes.js";
|
|
129
132
|
import { slackChannelRouteDefinitions } from "./routes/integrations/slack/channel.js";
|
|
@@ -131,6 +134,8 @@ import { slackShareRouteDefinitions } from "./routes/integrations/slack/share.js
|
|
|
131
134
|
import { telegramRouteDefinitions } from "./routes/integrations/telegram.js";
|
|
132
135
|
import { twilioRouteDefinitions } from "./routes/integrations/twilio.js";
|
|
133
136
|
import { inviteRouteDefinitions } from "./routes/invite-routes.js";
|
|
137
|
+
import { logExportRouteDefinitions } from "./routes/log-export-routes.js";
|
|
138
|
+
import { mcpRouteDefinitions } from "./routes/mcp-routes.js";
|
|
134
139
|
import { migrationRouteDefinitions } from "./routes/migration-routes.js";
|
|
135
140
|
import type { PairingHandlerContext } from "./routes/pairing-routes.js";
|
|
136
141
|
import {
|
|
@@ -242,12 +247,12 @@ export class RuntimeHttpServer {
|
|
|
242
247
|
return this.server?.port ?? this.port;
|
|
243
248
|
}
|
|
244
249
|
|
|
245
|
-
/** Expose the pairing store so the daemon server can wire
|
|
250
|
+
/** Expose the pairing store so the daemon server can wire HTTP handlers. */
|
|
246
251
|
getPairingStore(): PairingStore {
|
|
247
252
|
return this.pairingStore;
|
|
248
253
|
}
|
|
249
254
|
|
|
250
|
-
/** Set a callback for broadcasting
|
|
255
|
+
/** Set a callback for broadcasting server messages (wired by daemon server). */
|
|
251
256
|
setPairingBroadcast(fn: (msg: ServerMessage) => void): void {
|
|
252
257
|
this.pairingBroadcast = fn;
|
|
253
258
|
}
|
|
@@ -712,6 +717,7 @@ export class RuntimeHttpServer {
|
|
|
712
717
|
...secretRouteDefinitions(),
|
|
713
718
|
...identityRouteDefinitions(),
|
|
714
719
|
...debugRouteDefinitions(),
|
|
720
|
+
...mcpRouteDefinitions(),
|
|
715
721
|
...usageRouteDefinitions(),
|
|
716
722
|
...workspaceRouteDefinitions(),
|
|
717
723
|
...settingsRouteDefinitions(),
|
|
@@ -719,6 +725,7 @@ export class RuntimeHttpServer {
|
|
|
719
725
|
sendMessageDeps: this.sendMessageDeps,
|
|
720
726
|
}),
|
|
721
727
|
...diagnosticsRouteDefinitions(),
|
|
728
|
+
...logExportRouteDefinitions(),
|
|
722
729
|
...documentRouteDefinitions(),
|
|
723
730
|
...workItemRouteDefinitions(
|
|
724
731
|
this.sendMessageDeps
|
|
@@ -920,6 +927,10 @@ export class RuntimeHttpServer {
|
|
|
920
927
|
},
|
|
921
928
|
},
|
|
922
929
|
|
|
930
|
+
...btwRouteDefinitions({
|
|
931
|
+
sendMessageDeps: this.sendMessageDeps,
|
|
932
|
+
}),
|
|
933
|
+
|
|
923
934
|
...conversationRouteDefinitions({
|
|
924
935
|
interfacesDir: this.interfacesDir,
|
|
925
936
|
sendMessageDeps: this.sendMessageDeps,
|
|
@@ -929,6 +940,8 @@ export class RuntimeHttpServer {
|
|
|
929
940
|
}),
|
|
930
941
|
...globalSearchRouteDefinitions(),
|
|
931
942
|
...approvalRouteDefinitions(),
|
|
943
|
+
...hostBashRouteDefinitions(),
|
|
944
|
+
...hostFileRouteDefinitions(),
|
|
932
945
|
...(this.getSkillContext
|
|
933
946
|
? skillRouteDefinitions({
|
|
934
947
|
getSkillContext: this.getSkillContext,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared business logic for invite management.
|
|
3
3
|
*
|
|
4
|
-
* Extracted from the
|
|
5
|
-
* both the HTTP routes and the
|
|
4
|
+
* Extracted from the handlers in daemon/handlers/config-inbox.ts so that
|
|
5
|
+
* both the HTTP routes and the message handlers call the same logic.
|
|
6
6
|
*
|
|
7
7
|
* Member/contact operations have been migrated to the /v1/contacts and
|
|
8
8
|
* /v1/contacts/channels endpoints.
|
|
@@ -38,7 +38,7 @@ import {
|
|
|
38
38
|
} from "./invite-redemption-service.js";
|
|
39
39
|
|
|
40
40
|
// ---------------------------------------------------------------------------
|
|
41
|
-
// Response shapes — used by both HTTP routes and
|
|
41
|
+
// Response shapes — used by both HTTP routes and message handlers
|
|
42
42
|
// ---------------------------------------------------------------------------
|
|
43
43
|
|
|
44
44
|
export interface InviteResponseData {
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Deterministic local actor identity for
|
|
2
|
+
* Deterministic local actor identity for local connections.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* No actor token is sent over the
|
|
4
|
+
* Local connections come from the native app via local HTTP sessions.
|
|
5
|
+
* No actor token is sent over the connection; instead, the daemon assigns a
|
|
6
6
|
* deterministic local actor identity server-side by looking up the vellum
|
|
7
7
|
* channel guardian binding.
|
|
8
8
|
*
|
|
9
|
-
* This routes
|
|
9
|
+
* This routes local connections through the same `resolveTrustContext`
|
|
10
10
|
* pathway used by HTTP channel ingress, producing equivalent
|
|
11
11
|
* guardian-context behavior for the vellum channel.
|
|
12
12
|
*/
|
|
@@ -34,34 +34,29 @@ const log = getLogger("local-actor-identity");
|
|
|
34
34
|
*/
|
|
35
35
|
export function buildLocalAuthContext(sessionId: string): AuthContext {
|
|
36
36
|
return {
|
|
37
|
-
subject: `
|
|
38
|
-
principalType: "
|
|
37
|
+
subject: `local:self:${sessionId}`,
|
|
38
|
+
principalType: "local",
|
|
39
39
|
assistantId: DAEMON_INTERNAL_ASSISTANT_ID,
|
|
40
40
|
sessionId,
|
|
41
|
-
scopeProfile: "
|
|
42
|
-
scopes: resolveScopeProfile("
|
|
41
|
+
scopeProfile: "local_v1",
|
|
42
|
+
scopes: resolveScopeProfile("local_v1"),
|
|
43
43
|
policyEpoch: CURRENT_POLICY_EPOCH,
|
|
44
44
|
};
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
/**
|
|
48
|
-
*
|
|
49
|
-
*/
|
|
50
|
-
export const buildIpcAuthContext = buildLocalAuthContext;
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Resolve the guardian runtime context for a local IPC connection.
|
|
48
|
+
* Resolve the guardian runtime context for a local connection.
|
|
54
49
|
*
|
|
55
50
|
* Looks up the vellum guardian binding to obtain the `guardianPrincipalId`,
|
|
56
51
|
* then passes it as the sender identity through `resolveTrustContext` --
|
|
57
|
-
* the same pathway HTTP channel routes use. This ensures
|
|
52
|
+
* the same pathway HTTP channel routes use. This ensures local and HTTP
|
|
58
53
|
* produce equivalent trust classification for the vellum channel.
|
|
59
54
|
*
|
|
60
55
|
* When no vellum guardian binding exists (e.g. fresh install before
|
|
61
56
|
* bootstrap), falls back to a minimal guardian context so the local
|
|
62
57
|
* user is not incorrectly denied.
|
|
63
58
|
*/
|
|
64
|
-
export function
|
|
59
|
+
export function resolveLocalTrustContext(
|
|
65
60
|
sourceChannel: ChannelId = "vellum",
|
|
66
61
|
): TrustContext {
|
|
67
62
|
const assistantId = DAEMON_INTERNAL_ASSISTANT_ID;
|
|
@@ -81,7 +76,7 @@ export function resolveLocalIpcTrustContext(
|
|
|
81
76
|
|
|
82
77
|
// No guardian contact with a principalId — bootstrap via ensureVellumGuardianBinding
|
|
83
78
|
// to self-heal (creates the binding + contact if missing).
|
|
84
|
-
log.debug("No vellum guardian contact found; bootstrapping binding for
|
|
79
|
+
log.debug("No vellum guardian contact found; bootstrapping binding for local session");
|
|
85
80
|
try {
|
|
86
81
|
const principalId = ensureVellumGuardianBinding(assistantId);
|
|
87
82
|
const trustCtx = resolveTrustContext({
|
|
@@ -107,15 +102,15 @@ export function resolveLocalIpcTrustContext(
|
|
|
107
102
|
}
|
|
108
103
|
|
|
109
104
|
/**
|
|
110
|
-
* Build an AuthContext for a local
|
|
105
|
+
* Build an AuthContext for a local connection.
|
|
111
106
|
*
|
|
112
107
|
* Produces the same AuthContext shape that HTTP routes receive from JWT
|
|
113
|
-
* verification, using the `
|
|
108
|
+
* verification, using the `local_v1` scope profile. The `actorPrincipalId`
|
|
114
109
|
* is populated from the vellum guardian binding when available, enabling
|
|
115
110
|
* downstream code to resolve guardian context using the same
|
|
116
111
|
* `authContext.actorPrincipalId` path as HTTP sessions.
|
|
117
112
|
*/
|
|
118
|
-
export function
|
|
113
|
+
export function resolveLocalAuthContext(sessionId: string): AuthContext {
|
|
119
114
|
const authContext = buildLocalAuthContext(sessionId);
|
|
120
115
|
|
|
121
116
|
// Enrich with the guardian principal ID from contacts-first path
|
|
@@ -128,10 +123,10 @@ export function resolveLocalIpcAuthContext(sessionId: string): AuthContext {
|
|
|
128
123
|
}
|
|
129
124
|
|
|
130
125
|
// Self-heal: no guardian contact with principalId — bootstrap via
|
|
131
|
-
// ensureVellumGuardianBinding (mirrors
|
|
126
|
+
// ensureVellumGuardianBinding (mirrors resolveLocalTrustContext).
|
|
132
127
|
try {
|
|
133
128
|
log.debug(
|
|
134
|
-
"No vellum guardian contact found; bootstrapping binding for
|
|
129
|
+
"No vellum guardian contact found; bootstrapping binding for local auth",
|
|
135
130
|
);
|
|
136
131
|
const principalId = ensureVellumGuardianBinding(authContext.assistantId);
|
|
137
132
|
return { ...authContext, actorPrincipalId: principalId };
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* In-memory tracker that maps requestId to session info for pending
|
|
3
|
-
* confirmation and
|
|
3
|
+
* confirmation, secret, host_bash, and host_file interactions.
|
|
4
4
|
*
|
|
5
|
-
* When the agent loop emits a confirmation_request
|
|
6
|
-
* the onEvent callback registers
|
|
7
|
-
* endpoints (/v1/confirm, /v1/secret,
|
|
8
|
-
*
|
|
5
|
+
* When the agent loop emits a confirmation_request, secret_request,
|
|
6
|
+
* host_bash_request, or host_file_request, the onEvent callback registers
|
|
7
|
+
* the interaction here. Standalone HTTP endpoints (/v1/confirm, /v1/secret,
|
|
8
|
+
* /v1/trust-rules, /v1/host-bash-result, /v1/host-file-result) look up
|
|
9
|
+
* the session from this tracker to resolve the interaction.
|
|
9
10
|
*/
|
|
10
11
|
|
|
11
12
|
import type { Session } from "../daemon/session.js";
|
|
@@ -28,7 +29,7 @@ export interface ConfirmationDetails {
|
|
|
28
29
|
export interface PendingInteraction {
|
|
29
30
|
session: Session;
|
|
30
31
|
conversationId: string;
|
|
31
|
-
kind: "confirmation" | "secret";
|
|
32
|
+
kind: "confirmation" | "secret" | "host_bash" | "host_file";
|
|
32
33
|
confirmationDetails?: ConfirmationDetails;
|
|
33
34
|
}
|
|
34
35
|
|
|
@@ -78,12 +79,23 @@ export function getByConversation(
|
|
|
78
79
|
}
|
|
79
80
|
|
|
80
81
|
/**
|
|
81
|
-
* Remove
|
|
82
|
-
* Used when auto-denying all pending
|
|
82
|
+
* Remove pending confirmation and secret interactions for a given session.
|
|
83
|
+
* Used when auto-denying all pending interactions (e.g. new user message).
|
|
84
|
+
*
|
|
85
|
+
* host_bash and host_file interactions are intentionally skipped — they
|
|
86
|
+
* represent in-flight tool executions proxied to the client, not
|
|
87
|
+
* confirmations to auto-deny. Removing them would orphan the request: the
|
|
88
|
+
* client would POST to /v1/host-bash-result or /v1/host-file-result after
|
|
89
|
+
* completing the operation, get a 404, and the proxy timer would fire with
|
|
90
|
+
* a spurious timeout error.
|
|
83
91
|
*/
|
|
84
92
|
export function removeBySession(session: Session): void {
|
|
85
93
|
for (const [requestId, interaction] of pending) {
|
|
86
|
-
if (
|
|
94
|
+
if (
|
|
95
|
+
interaction.session === session &&
|
|
96
|
+
interaction.kind !== "host_bash" &&
|
|
97
|
+
interaction.kind !== "host_file"
|
|
98
|
+
) {
|
|
87
99
|
pending.delete(requestId);
|
|
88
100
|
}
|
|
89
101
|
}
|