@vellumai/assistant 0.3.27 → 0.4.0
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 +81 -4
- package/Dockerfile +2 -2
- package/bun.lock +4 -1
- package/docs/trusted-contact-access.md +9 -2
- package/package.json +6 -3
- package/scripts/ipc/generate-swift.ts +9 -5
- package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +80 -0
- package/src/__tests__/agent-loop-thinking.test.ts +1 -1
- package/src/__tests__/agent-loop.test.ts +119 -0
- package/src/__tests__/approval-routes-http.test.ts +13 -5
- package/src/__tests__/asset-materialize-tool.test.ts +2 -0
- package/src/__tests__/asset-search-tool.test.ts +2 -0
- package/src/__tests__/assistant-events-sse-hardening.test.ts +4 -2
- package/src/__tests__/attachments-store.test.ts +2 -0
- package/src/__tests__/browser-skill-endstate.test.ts +3 -3
- package/src/__tests__/bundled-asset.test.ts +107 -0
- package/src/__tests__/call-controller.test.ts +30 -29
- package/src/__tests__/call-routes-http.test.ts +34 -32
- package/src/__tests__/call-start-guardian-guard.test.ts +2 -0
- package/src/__tests__/canonical-guardian-store.test.ts +636 -0
- package/src/__tests__/channel-approval-routes.test.ts +174 -1
- package/src/__tests__/channel-invite-transport.test.ts +6 -6
- package/src/__tests__/channel-reply-delivery.test.ts +19 -0
- package/src/__tests__/channel-retry-sweep.test.ts +130 -0
- package/src/__tests__/clarification-resolver.test.ts +2 -0
- package/src/__tests__/claude-code-skill-regression.test.ts +2 -0
- package/src/__tests__/claude-code-tool-profiles.test.ts +2 -0
- package/src/__tests__/commit-message-enrichment-service.test.ts +9 -1
- package/src/__tests__/computer-use-session-lifecycle.test.ts +2 -0
- package/src/__tests__/computer-use-session-working-dir.test.ts +1 -0
- package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +2 -0
- package/src/__tests__/config-schema.test.ts +5 -5
- package/src/__tests__/config-watcher.test.ts +3 -1
- package/src/__tests__/connection-policy.test.ts +14 -5
- package/src/__tests__/contacts-tools.test.ts +3 -1
- package/src/__tests__/contradiction-checker.test.ts +2 -0
- package/src/__tests__/conversation-pairing.test.ts +10 -0
- package/src/__tests__/conversation-routes.test.ts +1 -1
- package/src/__tests__/credential-security-invariants.test.ts +16 -6
- package/src/__tests__/credential-vault-unit.test.ts +2 -2
- package/src/__tests__/credential-vault.test.ts +5 -4
- package/src/__tests__/daemon-lifecycle.test.ts +9 -0
- package/src/__tests__/daemon-server-session-init.test.ts +27 -0
- package/src/__tests__/elevenlabs-config.test.ts +2 -0
- package/src/__tests__/emit-signal-routing-intent.test.ts +43 -1
- package/src/__tests__/encrypted-store.test.ts +10 -5
- package/src/__tests__/followup-tools.test.ts +3 -1
- package/src/__tests__/gateway-only-enforcement.test.ts +21 -21
- package/src/__tests__/gmail-integration.test.ts +0 -1
- package/src/__tests__/guardian-actions-endpoint.test.ts +205 -345
- package/src/__tests__/guardian-control-plane-policy.test.ts +19 -19
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +599 -0
- package/src/__tests__/guardian-dispatch.test.ts +21 -19
- package/src/__tests__/guardian-grant-minting.test.ts +68 -1
- package/src/__tests__/guardian-outbound-http.test.ts +12 -9
- package/src/__tests__/guardian-routing-invariants.test.ts +1092 -0
- package/src/__tests__/handle-user-message-secret-resume.test.ts +1 -0
- package/src/__tests__/handlers-slack-config.test.ts +3 -1
- package/src/__tests__/handlers-telegram-config.test.ts +3 -1
- package/src/__tests__/handlers-twilio-config.test.ts +3 -1
- package/src/__tests__/handlers-twitter-config.test.ts +3 -1
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +318 -0
- package/src/__tests__/heartbeat-service.test.ts +20 -0
- package/src/__tests__/inbound-invite-redemption.test.ts +33 -0
- package/src/__tests__/ingress-reconcile.test.ts +3 -1
- package/src/__tests__/ingress-routes-http.test.ts +231 -4
- package/src/__tests__/intent-routing.test.ts +2 -0
- package/src/__tests__/ipc-snapshot.test.ts +13 -0
- package/src/__tests__/mcp-cli.test.ts +77 -0
- package/src/__tests__/media-generate-image.test.ts +21 -0
- package/src/__tests__/media-reuse-story.e2e.test.ts +2 -0
- package/src/__tests__/memory-regressions.test.ts +20 -20
- package/src/__tests__/non-member-access-request.test.ts +212 -36
- package/src/__tests__/notification-decision-fallback.test.ts +63 -3
- package/src/__tests__/notification-decision-strategy.test.ts +78 -0
- package/src/__tests__/notification-guardian-path.test.ts +15 -15
- package/src/__tests__/oauth-connect-handler.test.ts +3 -1
- package/src/__tests__/oauth2-gateway-transport.test.ts +2 -0
- package/src/__tests__/onboarding-starter-tasks.test.ts +4 -4
- package/src/__tests__/onboarding-template-contract.test.ts +116 -21
- package/src/__tests__/pairing-routes.test.ts +171 -0
- package/src/__tests__/playbook-execution.test.ts +3 -1
- package/src/__tests__/playbook-tools.test.ts +3 -1
- package/src/__tests__/provider-error-scenarios.test.ts +59 -8
- package/src/__tests__/proxy-approval-callback.test.ts +2 -0
- package/src/__tests__/recording-handler.test.ts +11 -0
- package/src/__tests__/recording-intent-handler.test.ts +15 -0
- package/src/__tests__/recording-state-machine.test.ts +13 -2
- package/src/__tests__/registry.test.ts +7 -3
- package/src/__tests__/relay-server.test.ts +148 -28
- package/src/__tests__/runtime-attachment-metadata.test.ts +4 -2
- package/src/__tests__/runtime-events-sse-parity.test.ts +21 -0
- package/src/__tests__/runtime-events-sse.test.ts +4 -2
- package/src/__tests__/sandbox-diagnostics.test.ts +2 -0
- package/src/__tests__/schedule-tools.test.ts +3 -1
- package/src/__tests__/secret-scanner-executor.test.ts +59 -0
- package/src/__tests__/secret-scanner.test.ts +8 -0
- package/src/__tests__/send-endpoint-busy.test.ts +4 -0
- package/src/__tests__/sensitive-output-placeholders.test.ts +208 -0
- package/src/__tests__/session-abort-tool-results.test.ts +23 -0
- package/src/__tests__/session-agent-loop.test.ts +16 -0
- package/src/__tests__/session-conflict-gate.test.ts +21 -0
- package/src/__tests__/session-load-history-repair.test.ts +27 -17
- package/src/__tests__/session-pre-run-repair.test.ts +23 -0
- package/src/__tests__/session-profile-injection.test.ts +21 -0
- package/src/__tests__/session-provider-retry-repair.test.ts +20 -0
- package/src/__tests__/session-queue.test.ts +23 -0
- package/src/__tests__/session-runtime-assembly.test.ts +126 -59
- package/src/__tests__/session-skill-tools.test.ts +27 -5
- package/src/__tests__/session-slash-known.test.ts +23 -0
- package/src/__tests__/session-slash-queue.test.ts +23 -0
- package/src/__tests__/session-slash-unknown.test.ts +23 -0
- package/src/__tests__/session-workspace-cache-state.test.ts +7 -0
- package/src/__tests__/session-workspace-injection.test.ts +21 -0
- package/src/__tests__/session-workspace-tool-tracking.test.ts +21 -0
- package/src/__tests__/shell-credential-ref.test.ts +2 -0
- package/src/__tests__/skill-feature-flags-integration.test.ts +6 -6
- package/src/__tests__/skill-load-feature-flag.test.ts +5 -4
- package/src/__tests__/skill-projection-feature-flag.test.ts +22 -0
- package/src/__tests__/skills.test.ts +8 -4
- package/src/__tests__/slack-channel-config.test.ts +3 -1
- package/src/__tests__/subagent-tools.test.ts +19 -0
- package/src/__tests__/swarm-recursion.test.ts +2 -0
- package/src/__tests__/swarm-session-integration.test.ts +2 -0
- package/src/__tests__/swarm-tool.test.ts +2 -0
- package/src/__tests__/system-prompt.test.ts +3 -1
- package/src/__tests__/task-compiler.test.ts +3 -1
- package/src/__tests__/task-management-tools.test.ts +3 -1
- package/src/__tests__/task-tools.test.ts +3 -1
- package/src/__tests__/terminal-sandbox.test.ts +13 -12
- package/src/__tests__/terminal-tools.test.ts +2 -0
- package/src/__tests__/tool-approval-handler.test.ts +15 -15
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +2 -0
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -0
- package/src/__tests__/tool-grant-request-escalation.test.ts +497 -0
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +48 -0
- package/src/__tests__/trusted-contact-multichannel.test.ts +22 -19
- package/src/__tests__/trusted-contact-verification.test.ts +91 -0
- package/src/__tests__/twilio-routes-elevenlabs.test.ts +2 -0
- package/src/__tests__/twitter-auth-handler.test.ts +3 -1
- package/src/__tests__/twitter-cli-routing.test.ts +3 -1
- package/src/__tests__/view-image-tool.test.ts +3 -1
- package/src/__tests__/voice-invite-redemption.test.ts +329 -0
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +7 -5
- package/src/__tests__/voice-session-bridge.test.ts +10 -10
- package/src/__tests__/work-item-output.test.ts +3 -1
- package/src/__tests__/workspace-lifecycle.test.ts +13 -2
- package/src/agent/loop.ts +46 -3
- package/src/approvals/guardian-decision-primitive.ts +285 -0
- package/src/approvals/guardian-request-resolvers.ts +539 -0
- package/src/calls/call-controller.ts +26 -23
- package/src/calls/guardian-action-sweep.ts +10 -2
- package/src/calls/guardian-dispatch.ts +46 -40
- package/src/calls/relay-server.ts +358 -24
- package/src/calls/types.ts +1 -1
- package/src/calls/voice-session-bridge.ts +3 -3
- package/src/cli.ts +12 -0
- package/src/config/agent-schema.ts +14 -3
- package/src/config/calls-schema.ts +6 -6
- package/src/config/core-schema.ts +3 -3
- package/src/config/feature-flag-registry.json +8 -0
- package/src/config/mcp-schema.ts +1 -1
- package/src/config/memory-schema.ts +27 -19
- package/src/config/schema.ts +21 -21
- package/src/config/skills-schema.ts +7 -7
- package/src/config/system-prompt.ts +2 -1
- package/src/config/templates/BOOTSTRAP.md +47 -31
- package/src/config/templates/USER.md +5 -0
- package/src/config/update-bulletin-template-path.ts +4 -1
- package/src/config/vellum-skills/trusted-contacts/SKILL.md +149 -21
- package/src/daemon/handlers/config-inbox.ts +4 -4
- package/src/daemon/handlers/guardian-actions.ts +45 -66
- package/src/daemon/handlers/sessions.ts +148 -4
- package/src/daemon/ipc-contract/guardian-actions.ts +7 -0
- package/src/daemon/ipc-contract/messages.ts +16 -0
- package/src/daemon/ipc-contract-inventory.json +1 -0
- package/src/daemon/lifecycle.ts +22 -16
- package/src/daemon/pairing-store.ts +86 -3
- package/src/daemon/server.ts +18 -0
- package/src/daemon/session-agent-loop-handlers.ts +5 -4
- package/src/daemon/session-agent-loop.ts +33 -6
- package/src/daemon/session-lifecycle.ts +25 -17
- package/src/daemon/session-memory.ts +2 -2
- package/src/daemon/session-process.ts +68 -326
- package/src/daemon/session-runtime-assembly.ts +119 -25
- package/src/daemon/session-tool-setup.ts +3 -2
- package/src/daemon/session.ts +4 -3
- package/src/home-base/prebuilt/seed.ts +2 -1
- package/src/hooks/templates.ts +2 -1
- package/src/memory/canonical-guardian-store.ts +586 -0
- package/src/memory/channel-guardian-store.ts +2 -0
- package/src/memory/conversation-crud.ts +7 -7
- package/src/memory/db-init.ts +20 -0
- package/src/memory/embedding-local.ts +257 -39
- package/src/memory/embedding-runtime-manager.ts +471 -0
- package/src/memory/guardian-action-store.ts +7 -60
- package/src/memory/guardian-approvals.ts +9 -4
- package/src/memory/guardian-bindings.ts +25 -1
- package/src/memory/indexer.ts +3 -3
- package/src/memory/ingress-invite-store.ts +45 -0
- package/src/memory/job-handlers/backfill.ts +16 -9
- package/src/memory/migrations/036-normalize-phone-identities.ts +289 -0
- package/src/memory/migrations/037-voice-invite-columns.ts +16 -0
- package/src/memory/migrations/118-reminder-routing-intent.ts +3 -3
- package/src/memory/migrations/121-canonical-guardian-requests.ts +59 -0
- package/src/memory/migrations/122-canonical-guardian-requester-chat-id.ts +15 -0
- package/src/memory/migrations/123-canonical-guardian-deliveries-destination-index.ts +15 -0
- package/src/memory/migrations/index.ts +5 -0
- package/src/memory/migrations/registry.ts +5 -0
- package/src/memory/qdrant-client.ts +31 -22
- package/src/memory/schema-migration.ts +1 -0
- package/src/memory/schema.ts +56 -0
- package/src/notifications/copy-composer.ts +31 -4
- package/src/notifications/decision-engine.ts +57 -0
- package/src/permissions/defaults.ts +2 -0
- package/src/runtime/access-request-helper.ts +173 -0
- package/src/runtime/actor-trust-resolver.ts +221 -0
- package/src/runtime/channel-guardian-service.ts +12 -4
- package/src/runtime/channel-invite-transports/voice.ts +58 -0
- package/src/runtime/channel-retry-sweep.ts +18 -6
- package/src/runtime/guardian-context-resolver.ts +38 -71
- package/src/runtime/guardian-decision-types.ts +6 -0
- package/src/runtime/guardian-reply-router.ts +717 -0
- package/src/runtime/http-server.ts +8 -0
- package/src/runtime/ingress-service.ts +80 -3
- package/src/runtime/invite-redemption-service.ts +141 -2
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +116 -0
- package/src/runtime/routes/channel-route-shared.ts +1 -1
- package/src/runtime/routes/channel-routes.ts +1 -1
- package/src/runtime/routes/conversation-routes.ts +20 -2
- package/src/runtime/routes/guardian-action-routes.ts +100 -109
- package/src/runtime/routes/guardian-approval-interception.ts +17 -6
- package/src/runtime/routes/inbound-message-handler.ts +205 -529
- package/src/runtime/routes/ingress-routes.ts +52 -4
- package/src/runtime/routes/pairing-routes.ts +3 -0
- package/src/runtime/tool-grant-request-helper.ts +195 -0
- package/src/tools/executor.ts +13 -1
- package/src/tools/guardian-control-plane-policy.ts +2 -2
- package/src/tools/sensitive-output-placeholders.ts +203 -0
- package/src/tools/tool-approval-handler.ts +53 -10
- package/src/tools/types.ts +13 -2
- package/src/util/bundled-asset.ts +31 -0
- package/src/util/canonicalize-identity.ts +52 -0
- package/src/util/logger.ts +20 -8
- package/src/util/platform.ts +10 -0
- package/src/util/voice-code.ts +29 -0
- package/src/daemon/guardian-invite-intent.ts +0 -124
|
@@ -380,7 +380,7 @@ describe('enforceGuardianOnlyPolicy', () => {
|
|
|
380
380
|
test('non-guardian actor denied for guardian endpoint', () => {
|
|
381
381
|
const result = enforceGuardianOnlyPolicy('bash', {
|
|
382
382
|
command: 'curl http://localhost:3000/v1/integrations/guardian/outbound/start',
|
|
383
|
-
}, '
|
|
383
|
+
}, 'trusted_contact');
|
|
384
384
|
expect(result.denied).toBe(true);
|
|
385
385
|
expect(result.reason).toContain('restricted to guardian users');
|
|
386
386
|
});
|
|
@@ -388,7 +388,7 @@ describe('enforceGuardianOnlyPolicy', () => {
|
|
|
388
388
|
test('unverified_channel actor denied for guardian endpoint', () => {
|
|
389
389
|
const result = enforceGuardianOnlyPolicy('network_request', {
|
|
390
390
|
url: 'https://api.example.com/v1/integrations/guardian/challenge',
|
|
391
|
-
}, '
|
|
391
|
+
}, 'unknown');
|
|
392
392
|
expect(result.denied).toBe(true);
|
|
393
393
|
expect(result.reason).toContain('restricted to guardian users');
|
|
394
394
|
});
|
|
@@ -419,14 +419,14 @@ describe('enforceGuardianOnlyPolicy', () => {
|
|
|
419
419
|
test('non-guardian actor is NOT denied for unrelated endpoint', () => {
|
|
420
420
|
const result = enforceGuardianOnlyPolicy('bash', {
|
|
421
421
|
command: 'curl http://localhost:3000/v1/messages',
|
|
422
|
-
}, '
|
|
422
|
+
}, 'trusted_contact');
|
|
423
423
|
expect(result.denied).toBe(false);
|
|
424
424
|
});
|
|
425
425
|
|
|
426
426
|
test('non-guardian actor is NOT denied for unrelated tool', () => {
|
|
427
427
|
const result = enforceGuardianOnlyPolicy('file_read', {
|
|
428
428
|
path: 'README.md',
|
|
429
|
-
}, '
|
|
429
|
+
}, 'trusted_contact');
|
|
430
430
|
expect(result.denied).toBe(false);
|
|
431
431
|
});
|
|
432
432
|
});
|
|
@@ -445,7 +445,7 @@ describe('ToolExecutor guardian-only policy gate', () => {
|
|
|
445
445
|
const result = await executor.execute(
|
|
446
446
|
'bash',
|
|
447
447
|
{ command: 'curl -X POST http://localhost:3000/v1/integrations/guardian/outbound/start' },
|
|
448
|
-
makeContext({
|
|
448
|
+
makeContext({ guardianTrustClass: 'trusted_contact' }),
|
|
449
449
|
);
|
|
450
450
|
expect(result.isError).toBe(true);
|
|
451
451
|
expect(result.content).toContain('restricted to guardian users');
|
|
@@ -456,7 +456,7 @@ describe('ToolExecutor guardian-only policy gate', () => {
|
|
|
456
456
|
const result = await executor.execute(
|
|
457
457
|
'network_request',
|
|
458
458
|
{ url: 'https://api.example.com/v1/integrations/guardian/challenge' },
|
|
459
|
-
makeContext({
|
|
459
|
+
makeContext({ guardianTrustClass: 'unknown' }),
|
|
460
460
|
);
|
|
461
461
|
expect(result.isError).toBe(true);
|
|
462
462
|
expect(result.content).toContain('restricted to guardian users');
|
|
@@ -467,18 +467,18 @@ describe('ToolExecutor guardian-only policy gate', () => {
|
|
|
467
467
|
const result = await executor.execute(
|
|
468
468
|
'bash',
|
|
469
469
|
{ command: 'curl -X POST http://localhost:3000/v1/integrations/guardian/outbound/start' },
|
|
470
|
-
makeContext({
|
|
470
|
+
makeContext({ guardianTrustClass: 'guardian' }),
|
|
471
471
|
);
|
|
472
472
|
expect(result.isError).toBe(false);
|
|
473
473
|
expect(result.content).toBe('ok');
|
|
474
474
|
});
|
|
475
475
|
|
|
476
|
-
test('undefined
|
|
476
|
+
test('undefined guardianTrustClass is NOT blocked from guardian endpoint', async () => {
|
|
477
477
|
const executor = new ToolExecutor(makePrompter());
|
|
478
478
|
const result = await executor.execute(
|
|
479
479
|
'bash',
|
|
480
480
|
{ command: 'curl http://localhost:3000/v1/integrations/guardian/status' },
|
|
481
|
-
makeContext(), // no
|
|
481
|
+
makeContext(), // no guardianTrustClass set
|
|
482
482
|
);
|
|
483
483
|
expect(result.isError).toBe(false);
|
|
484
484
|
expect(result.content).toBe('ok');
|
|
@@ -489,7 +489,7 @@ describe('ToolExecutor guardian-only policy gate', () => {
|
|
|
489
489
|
const result = await executor.execute(
|
|
490
490
|
'bash',
|
|
491
491
|
{ command: 'curl http://localhost:3000/v1/messages' },
|
|
492
|
-
makeContext({
|
|
492
|
+
makeContext({ guardianTrustClass: 'trusted_contact' }),
|
|
493
493
|
);
|
|
494
494
|
expect(result.isError).toBe(true);
|
|
495
495
|
expect(result.content).toContain('requires guardian approval');
|
|
@@ -500,7 +500,7 @@ describe('ToolExecutor guardian-only policy gate', () => {
|
|
|
500
500
|
const result = await executor.execute(
|
|
501
501
|
'file_read',
|
|
502
502
|
{ path: 'README.md' },
|
|
503
|
-
makeContext({
|
|
503
|
+
makeContext({ guardianTrustClass: 'trusted_contact' }),
|
|
504
504
|
);
|
|
505
505
|
expect(result.isError).toBe(false);
|
|
506
506
|
expect(result.content).toBe('ok');
|
|
@@ -513,7 +513,7 @@ describe('ToolExecutor guardian-only policy gate', () => {
|
|
|
513
513
|
'bash',
|
|
514
514
|
{ command: 'curl http://localhost:3000/v1/integrations/guardian/outbound/cancel' },
|
|
515
515
|
makeContext({
|
|
516
|
-
|
|
516
|
+
guardianTrustClass: 'trusted_contact',
|
|
517
517
|
onToolLifecycleEvent: (event: ToolLifecycleEvent) => {
|
|
518
518
|
if (event.type === 'permission_denied') {
|
|
519
519
|
capturedEvent = event as ToolPermissionDeniedEvent;
|
|
@@ -531,7 +531,7 @@ describe('ToolExecutor guardian-only policy gate', () => {
|
|
|
531
531
|
const result = await executor.execute(
|
|
532
532
|
'web_fetch',
|
|
533
533
|
{ url: 'http://localhost:3000/v1/integrations/guardian/outbound/resend' },
|
|
534
|
-
makeContext({
|
|
534
|
+
makeContext({ guardianTrustClass: 'trusted_contact' }),
|
|
535
535
|
);
|
|
536
536
|
expect(result.isError).toBe(true);
|
|
537
537
|
expect(result.content).toContain('restricted to guardian users');
|
|
@@ -542,7 +542,7 @@ describe('ToolExecutor guardian-only policy gate', () => {
|
|
|
542
542
|
const result = await executor.execute(
|
|
543
543
|
'browser_navigate',
|
|
544
544
|
{ url: 'http://localhost:3000/v1/integrations/guardian/status' },
|
|
545
|
-
makeContext({
|
|
545
|
+
makeContext({ guardianTrustClass: 'trusted_contact' }),
|
|
546
546
|
);
|
|
547
547
|
expect(result.isError).toBe(true);
|
|
548
548
|
expect(result.content).toContain('restricted to guardian users');
|
|
@@ -553,7 +553,7 @@ describe('ToolExecutor guardian-only policy gate', () => {
|
|
|
553
553
|
const result = await executor.execute(
|
|
554
554
|
'host_bash',
|
|
555
555
|
{ command: 'curl -X POST https://internal:8080/v1/integrations/guardian/challenge' },
|
|
556
|
-
makeContext({
|
|
556
|
+
makeContext({ guardianTrustClass: 'trusted_contact' }),
|
|
557
557
|
);
|
|
558
558
|
expect(result.isError).toBe(true);
|
|
559
559
|
expect(result.content).toContain('restricted to guardian users');
|
|
@@ -573,7 +573,7 @@ describe('ToolExecutor guardian-only policy gate', () => {
|
|
|
573
573
|
const result = await executor.execute(
|
|
574
574
|
'network_request',
|
|
575
575
|
{ url: `https://api.example.com${path}` },
|
|
576
|
-
makeContext({
|
|
576
|
+
makeContext({ guardianTrustClass: 'trusted_contact' }),
|
|
577
577
|
);
|
|
578
578
|
expect(result.isError).toBe(true);
|
|
579
579
|
expect(result.content).toContain('restricted to guardian users');
|
|
@@ -585,7 +585,7 @@ describe('ToolExecutor guardian-only policy gate', () => {
|
|
|
585
585
|
const result = await executor.execute(
|
|
586
586
|
'host_file_read',
|
|
587
587
|
{ path: '/Users/noaflaherty/.ssh/config' },
|
|
588
|
-
makeContext({
|
|
588
|
+
makeContext({ guardianTrustClass: 'trusted_contact' }),
|
|
589
589
|
);
|
|
590
590
|
expect(result.isError).toBe(true);
|
|
591
591
|
expect(result.content).toContain('requires guardian approval');
|
|
@@ -596,7 +596,7 @@ describe('ToolExecutor guardian-only policy gate', () => {
|
|
|
596
596
|
const result = await executor.execute(
|
|
597
597
|
'reminder_create',
|
|
598
598
|
{ fire_at: '2026-02-27T12:00:00-05:00', label: 'test', message: 'hello' },
|
|
599
|
-
makeContext({
|
|
599
|
+
makeContext({ guardianTrustClass: 'unknown' }),
|
|
600
600
|
);
|
|
601
601
|
expect(result.isError).toBe(true);
|
|
602
602
|
expect(result.content).toContain('verified channel identity');
|
|
@@ -607,7 +607,7 @@ describe('ToolExecutor guardian-only policy gate', () => {
|
|
|
607
607
|
const result = await executor.execute(
|
|
608
608
|
'reminder_create',
|
|
609
609
|
{ fire_at: '2026-02-27T12:00:00-05:00', label: 'test', message: 'hello' },
|
|
610
|
-
makeContext({
|
|
610
|
+
makeContext({ guardianTrustClass: 'guardian' }),
|
|
611
611
|
);
|
|
612
612
|
expect(result.isError).toBe(false);
|
|
613
613
|
expect(result.content).toBe('ok');
|