@agent-deck/backend 1.6.4 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/lib/agent-deck-context.d.ts +4 -2
  3. package/dist/lib/agent-deck-context.d.ts.map +1 -1
  4. package/dist/lib/agent-deck-context.js +35 -8
  5. package/dist/lib/agent-deck-context.js.map +1 -1
  6. package/dist/lib/backend-api-error.d.ts +8 -0
  7. package/dist/lib/backend-api-error.d.ts.map +1 -0
  8. package/dist/lib/backend-api-error.js +35 -0
  9. package/dist/lib/backend-api-error.js.map +1 -0
  10. package/dist/lib/bound-deck-scope.d.ts +6 -1
  11. package/dist/lib/bound-deck-scope.d.ts.map +1 -1
  12. package/dist/lib/bound-deck-scope.js +21 -2
  13. package/dist/lib/bound-deck-scope.js.map +1 -1
  14. package/dist/lib/client-scope.d.ts.map +1 -1
  15. package/dist/lib/client-scope.js +3 -3
  16. package/dist/lib/client-scope.js.map +1 -1
  17. package/dist/lib/dashboard-auth.d.ts +7 -0
  18. package/dist/lib/dashboard-auth.d.ts.map +1 -0
  19. package/dist/lib/dashboard-auth.js +38 -0
  20. package/dist/lib/dashboard-auth.js.map +1 -0
  21. package/dist/lib/http-auth.d.ts +5 -0
  22. package/dist/lib/http-auth.d.ts.map +1 -0
  23. package/dist/lib/http-auth.js +11 -0
  24. package/dist/lib/http-auth.js.map +1 -0
  25. package/dist/lib/route-policy.d.ts +13 -0
  26. package/dist/lib/route-policy.d.ts.map +1 -0
  27. package/dist/lib/route-policy.js +50 -0
  28. package/dist/lib/route-policy.js.map +1 -0
  29. package/dist/mcp-server.d.ts +4 -4
  30. package/dist/mcp-server.d.ts.map +1 -1
  31. package/dist/mcp-server.js +81 -29
  32. package/dist/mcp-server.js.map +1 -1
  33. package/dist/mcp-session-binding.d.ts +16 -3
  34. package/dist/mcp-session-binding.d.ts.map +1 -1
  35. package/dist/mcp-session-binding.js +40 -5
  36. package/dist/mcp-session-binding.js.map +1 -1
  37. package/dist/mcp-stdio.d.ts +2 -0
  38. package/dist/mcp-stdio.d.ts.map +1 -0
  39. package/dist/mcp-stdio.js.map +1 -0
  40. package/dist/mcp-tools/policy.d.ts +20 -0
  41. package/dist/mcp-tools/policy.d.ts.map +1 -0
  42. package/dist/mcp-tools/policy.js +61 -0
  43. package/dist/mcp-tools/policy.js.map +1 -0
  44. package/dist/mcp-tools/profile.d.ts +2 -2
  45. package/dist/mcp-tools/register.d.ts +13 -0
  46. package/dist/mcp-tools/register.d.ts.map +1 -1
  47. package/dist/mcp-tools/register.js +154 -89
  48. package/dist/mcp-tools/register.js.map +1 -1
  49. package/dist/mcp-tools/test-harness.d.ts +7 -2
  50. package/dist/mcp-tools/test-harness.d.ts.map +1 -1
  51. package/dist/mcp-tools/test-harness.js +37 -9
  52. package/dist/mcp-tools/test-harness.js.map +1 -1
  53. package/dist/models/database.d.ts +2 -0
  54. package/dist/models/database.d.ts.map +1 -1
  55. package/dist/models/database.js +3 -0
  56. package/dist/models/database.js.map +1 -1
  57. package/dist/playbooks/playbook-parser.d.ts +8 -0
  58. package/dist/playbooks/playbook-parser.d.ts.map +1 -0
  59. package/dist/playbooks/playbook-parser.js +76 -0
  60. package/dist/playbooks/playbook-parser.js.map +1 -0
  61. package/dist/playbooks/playbook-service.d.ts +9 -0
  62. package/dist/playbooks/playbook-service.d.ts.map +1 -0
  63. package/dist/playbooks/playbook-service.js +107 -0
  64. package/dist/playbooks/playbook-service.js.map +1 -0
  65. package/dist/routes/credentials.d.ts.map +1 -1
  66. package/dist/routes/credentials.js +25 -23
  67. package/dist/routes/credentials.js.map +1 -1
  68. package/dist/routes/decks.d.ts.map +1 -1
  69. package/dist/routes/decks.js +48 -30
  70. package/dist/routes/decks.js.map +1 -1
  71. package/dist/routes/playbooks.d.ts +0 -2
  72. package/dist/routes/playbooks.d.ts.map +1 -1
  73. package/dist/routes/playbooks.js +58 -117
  74. package/dist/routes/playbooks.js.map +1 -1
  75. package/dist/routes/scope.d.ts.map +1 -1
  76. package/dist/routes/scope.js +4 -1
  77. package/dist/routes/scope.js.map +1 -1
  78. package/dist/routes/services.d.ts.map +1 -1
  79. package/dist/routes/services.js +55 -13
  80. package/dist/routes/services.js.map +1 -1
  81. package/dist/routes/trusted-session.d.ts +10 -0
  82. package/dist/routes/trusted-session.d.ts.map +1 -0
  83. package/dist/routes/trusted-session.js +383 -0
  84. package/dist/routes/trusted-session.js.map +1 -0
  85. package/dist/scope/bindings-sidecar.d.ts +9 -0
  86. package/dist/scope/bindings-sidecar.d.ts.map +1 -0
  87. package/dist/scope/bindings-sidecar.js +57 -0
  88. package/dist/scope/bindings-sidecar.js.map +1 -0
  89. package/dist/scope/repo-deck.d.ts +10 -0
  90. package/dist/scope/repo-deck.d.ts.map +1 -0
  91. package/dist/scope/repo-deck.js +63 -0
  92. package/dist/scope/repo-deck.js.map +1 -0
  93. package/dist/server/index.d.ts +2 -0
  94. package/dist/server/index.d.ts.map +1 -1
  95. package/dist/server/index.js +23 -1
  96. package/dist/server/index.js.map +1 -1
  97. package/dist/test/auth-fixtures.d.ts +4 -0
  98. package/dist/test/auth-fixtures.d.ts.map +1 -0
  99. package/dist/test/auth-fixtures.js +28 -0
  100. package/dist/test/auth-fixtures.js.map +1 -0
  101. package/dist/test-local-mcp-e2e.d.ts +3 -0
  102. package/dist/test-local-mcp-e2e.d.ts.map +1 -0
  103. package/dist/test-local-mcp-e2e.js +104 -0
  104. package/dist/test-local-mcp-e2e.js.map +1 -0
  105. package/dist/trusted-session/admin-secret.d.ts +6 -0
  106. package/dist/trusted-session/admin-secret.d.ts.map +1 -0
  107. package/dist/trusted-session/admin-secret.js +63 -0
  108. package/dist/trusted-session/admin-secret.js.map +1 -0
  109. package/dist/trusted-session/auth.d.ts +29 -0
  110. package/dist/trusted-session/auth.d.ts.map +1 -0
  111. package/dist/trusted-session/auth.js +176 -0
  112. package/dist/trusted-session/auth.js.map +1 -0
  113. package/dist/trusted-session/policy-hook.d.ts +12 -0
  114. package/dist/trusted-session/policy-hook.d.ts.map +1 -0
  115. package/dist/trusted-session/policy-hook.js +71 -0
  116. package/dist/trusted-session/policy-hook.js.map +1 -0
  117. package/dist/trusted-session/route-policy-registry.d.ts +20 -0
  118. package/dist/trusted-session/route-policy-registry.d.ts.map +1 -0
  119. package/dist/trusted-session/route-policy-registry.js +165 -0
  120. package/dist/trusted-session/route-policy-registry.js.map +1 -0
  121. package/dist/trusted-session/store.d.ts +93 -0
  122. package/dist/trusted-session/store.d.ts.map +1 -0
  123. package/dist/trusted-session/store.js +451 -0
  124. package/dist/trusted-session/store.js.map +1 -0
  125. package/package.json +3 -3
  126. package/static-ui/assets/index-DppGBI7V.css +1 -0
  127. package/static-ui/assets/index-DwI7IkPX.js +499 -0
  128. package/static-ui/favicon.png +0 -0
  129. package/static-ui/index.html +2 -2
  130. package/static-ui/assets/index-BG4SetCL.css +0 -1
  131. package/static-ui/assets/index-BV17LsZJ.js +0 -485
@@ -28,6 +28,7 @@ const paths_1 = require("../lib/paths");
28
28
  const collection_warning_service_1 = require("../services/collection-warning-service");
29
29
  const collection_1 = require("../routes/collection");
30
30
  const export_import_1 = require("../routes/export-import");
31
+ const trusted_session_1 = require("../routes/trusted-session");
31
32
  const playbook_manager_1 = require("../playbooks/playbook-manager");
32
33
  const patch_manager_1 = require("../playbooks/patch-manager");
33
34
  const playbook_patches_1 = require("../routes/playbook-patches");
@@ -37,6 +38,9 @@ const seed_default_services_1 = require("../data/seed-default-services");
37
38
  const live_display_registry_1 = require("../scope/live-display-registry");
38
39
  const writer_1 = require("../store/writer");
39
40
  const startup_1 = require("../store/startup");
41
+ const store_1 = require("../trusted-session/store");
42
+ const admin_secret_1 = require("../trusted-session/admin-secret");
43
+ const policy_hook_1 = require("../trusted-session/policy-hook");
40
44
  async function createServer() {
41
45
  const fastify = (0, fastify_1.default)({
42
46
  logger: {
@@ -78,6 +82,8 @@ async function createServer() {
78
82
  }
79
83
  await (0, startup_1.ensureStoreReady)(db);
80
84
  const secretStore = (0, vault_1.createSecretStore)();
85
+ const trustedSessionStore = new store_1.TrustedSessionStore(db.getSqliteDatabase());
86
+ await (0, admin_secret_1.ensureAdminSecret)();
81
87
  const oauthClientSecretVault = new vault_1.OAuthClientSecretVault(secretStore, db);
82
88
  const oauthTokenVault = new vault_1.OAuthTokenVault(secretStore, db);
83
89
  const serviceHeaderVault = new vault_1.ServiceHeaderVault(secretStore);
@@ -92,6 +98,21 @@ async function createServer() {
92
98
  const patchManager = new patch_manager_1.PatchManager(db, playbookManager);
93
99
  const collectionWarningService = new collection_warning_service_1.CollectionWarningService(oauthManager);
94
100
  const liveDisplayRegistry = new live_display_registry_1.LiveDisplayRegistry();
101
+ fastify.decorate('db', db);
102
+ fastify.decorate('trustedSessionStore', trustedSessionStore);
103
+ (0, policy_hook_1.registerHttpPolicyHook)(fastify);
104
+ const sweepStaleSessions = () => {
105
+ try {
106
+ trustedSessionStore.expireStaleSessions();
107
+ trustedSessionStore.expireDashboardNonces();
108
+ }
109
+ catch (error) {
110
+ fastify.log.warn({ err: error }, 'trusted-session stale sweep failed');
111
+ }
112
+ };
113
+ sweepStaleSessions();
114
+ const staleSessionTimer = setInterval(sweepStaleSessions, 60_000);
115
+ staleSessionTimer.unref?.();
95
116
  // Register routes
96
117
  await fastify.register(websocket_2.registerWebSocketRoutes, { prefix: '/api/ws' });
97
118
  await fastify.register(services_1.registerServiceRoutes, { prefix: '/api/services' });
@@ -106,6 +127,8 @@ async function createServer() {
106
127
  await fastify.register(oauth_1.registerOAuthRoutes, { prefix: '/api/oauth' });
107
128
  await fastify.register(mcp_1.default, { prefix: '/api/mcp' });
108
129
  await fastify.register(local_mcp_1.registerLocalMCPRoutes, { prefix: '/api/local-mcp' });
130
+ await fastify.register(trusted_session_1.registerTrustedSessionRoutes, { prefix: '/api/trusted-session' });
131
+ await fastify.register(trusted_session_1.registerDashboardAuthRoutes, { prefix: '/api/dashboard-auth' });
109
132
  // Health check endpoint
110
133
  fastify.get('/health', async (request, reply) => {
111
134
  return {
@@ -137,7 +160,6 @@ async function createServer() {
137
160
  }));
138
161
  }
139
162
  // Add services to request context
140
- fastify.decorate('db', db);
141
163
  fastify.decorate('serviceManager', serviceManager);
142
164
  fastify.decorate('mcpClient', mcpClient);
143
165
  fastify.decorate('oauthManager', oauthManager);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { DatabaseManager } from '../models/database';
2
+ export declare function dashboardAuthHeaders(): Record<string, string>;
3
+ export declare function agentSessionHeaders(db: DatabaseManager, deckId: string, workspaceDigest?: string): Record<string, string>;
4
+ //# sourceMappingURL=auth-fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-fixtures.d.ts","sourceRoot":"","sources":["../../src/test/auth-fixtures.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAI1D,wBAAgB,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAK7D;AAED,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,eAAe,EACnB,MAAM,EAAE,MAAM,EACd,eAAe,SAA0B,GACxC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAaxB"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dashboardAuthHeaders = dashboardAuthHeaders;
4
+ exports.agentSessionHeaders = agentSessionHeaders;
5
+ const shared_1 = require("@agent-deck/shared");
6
+ const auth_1 = require("../trusted-session/auth");
7
+ const store_1 = require("../trusted-session/store");
8
+ function dashboardAuthHeaders() {
9
+ const token = (0, auth_1.createDashboardSessionToken)();
10
+ return {
11
+ cookie: `${shared_1.AGENT_DECK_DASHBOARD_COOKIE}=${encodeURIComponent(token)}`,
12
+ };
13
+ }
14
+ function agentSessionHeaders(db, deckId, workspaceDigest = 'test-workspace-digest') {
15
+ const store = new store_1.TrustedSessionStore(db.getSqliteDatabase());
16
+ const workspace = store.getOrCreateWorkspaceKey(workspaceDigest);
17
+ const secret = (0, store_1.generateGrantSecret)();
18
+ const pending = store.createPendingGrant(workspace.id, deckId, secret);
19
+ store.activateGrant(pending.id);
20
+ const grant = store.findActiveGrantBySecret(secret);
21
+ const session = store.createRuntimeSession({
22
+ workspaceKeyId: workspace.id,
23
+ workspaceGrantId: grant.id,
24
+ deckId,
25
+ });
26
+ return { [shared_1.AGENT_DECK_SESSION_HEADER]: session.sessionId };
27
+ }
28
+ //# sourceMappingURL=auth-fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-fixtures.js","sourceRoot":"","sources":["../../src/test/auth-fixtures.ts"],"names":[],"mappings":";;AASA,oDAKC;AAED,kDAiBC;AAjCD,+CAG4B;AAG5B,kDAAsE;AACtE,oDAAoF;AAEpF,SAAgB,oBAAoB;IAClC,MAAM,KAAK,GAAG,IAAA,kCAA2B,GAAE,CAAC;IAC5C,OAAO;QACL,MAAM,EAAE,GAAG,oCAA2B,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;KACtE,CAAC;AACJ,CAAC;AAED,SAAgB,mBAAmB,CACjC,EAAmB,EACnB,MAAc,EACd,eAAe,GAAG,uBAAuB;IAEzC,MAAM,KAAK,GAAG,IAAI,2BAAmB,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,KAAK,CAAC,uBAAuB,CAAC,eAAe,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,IAAA,2BAAmB,GAAE,CAAC;IACrC,MAAM,OAAO,GAAG,KAAK,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACvE,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,KAAK,CAAC,uBAAuB,CAAC,MAAM,CAAE,CAAC;IACrD,MAAM,OAAO,GAAG,KAAK,CAAC,oBAAoB,CAAC;QACzC,cAAc,EAAE,SAAS,CAAC,EAAE;QAC5B,gBAAgB,EAAE,KAAK,CAAC,EAAE;QAC1B,MAAM;KACP,CAAC,CAAC;IACH,OAAO,EAAE,CAAC,kCAAyB,CAAC,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env tsx
2
+ export {};
3
+ //# sourceMappingURL=test-local-mcp-e2e.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-local-mcp-e2e.d.ts","sourceRoot":"","sources":["../src/test-local-mcp-e2e.ts"],"names":[],"mappings":""}
@@ -0,0 +1,104 @@
1
+ #!/usr/bin/env tsx
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const local_mcp_server_manager_1 = require("./services/local-mcp-server-manager");
5
+ const config_manager_1 = require("./services/config-manager");
6
+ const service_manager_1 = require("./services/service-manager");
7
+ const mcp_client_manager_1 = require("./services/mcp-client-manager");
8
+ const oauth_manager_1 = require("./services/oauth-manager");
9
+ const database_1 = require("./models/database");
10
+ async function testLocalMCPServerE2E() {
11
+ console.log('🧪 Testing Local MCP Server End-to-End Flow...\n');
12
+ // Initialize managers
13
+ const db = new database_1.DatabaseManager();
14
+ const configManager = new config_manager_1.ConfigManager();
15
+ const localManager = new local_mcp_server_manager_1.LocalMCPServerManager();
16
+ // Create MCP client manager with local server manager
17
+ const mcpClient = new mcp_client_manager_1.MCPClientManager();
18
+ mcpClient.localServerManager = localManager;
19
+ // Create OAuth manager (required by ServiceManager)
20
+ const oauthManager = new oauth_manager_1.OAuthManager();
21
+ const serviceManager = new service_manager_1.ServiceManager(db, mcpClient, oauthManager);
22
+ try {
23
+ // Test 1: Import local servers from configuration
24
+ console.log('📋 Test 1: Importing local servers from configuration...');
25
+ const config = {
26
+ mcpServers: {
27
+ memory: {
28
+ command: 'npx',
29
+ args: ['-y', '@modelcontextprotocol/server-memory']
30
+ }
31
+ }
32
+ };
33
+ const services = await serviceManager.importLocalServersFromConfig(JSON.stringify(config));
34
+ console.log('✅ Imported services:', services.length);
35
+ services.forEach(service => {
36
+ console.log(` - ${service.name} (${service.id}): ${service.localCommand} ${service.localArgs?.join(' ')}`);
37
+ });
38
+ if (services.length === 0) {
39
+ throw new Error('No services were imported');
40
+ }
41
+ const memoryService = services[0];
42
+ // Test 2: Start the local MCP server
43
+ console.log('\n📋 Test 2: Starting local MCP server...');
44
+ await serviceManager.startLocalServer(memoryService.id);
45
+ console.log('✅ Local MCP server started');
46
+ // Test 3: Discover tools (using unified API)
47
+ console.log('\n📋 Test 3: Discovering tools (unified API)...');
48
+ const tools = await serviceManager.discoverServiceTools(memoryService.id);
49
+ console.log('✅ Discovered tools:', tools.length);
50
+ tools.forEach(tool => {
51
+ console.log(` - ${tool.name}: ${tool.description}`);
52
+ });
53
+ if (tools.length === 0) {
54
+ console.log('⚠️ No tools discovered - this might be normal for some servers');
55
+ }
56
+ // Test 4: Call a tool (using unified API)
57
+ console.log('\n📋 Test 4: Calling tool (unified API)...');
58
+ if (tools.length > 0) {
59
+ const firstTool = tools[0];
60
+ console.log(` Calling tool: ${firstTool.name}`);
61
+ try {
62
+ const result = await serviceManager.callServiceTool(memoryService.id, firstTool.name, {});
63
+ console.log('✅ Tool call result:', result);
64
+ }
65
+ catch (error) {
66
+ console.log('⚠️ Tool call failed (this might be expected):', error.message);
67
+ }
68
+ }
69
+ else {
70
+ console.log('⚠️ Skipping tool call - no tools available');
71
+ }
72
+ // Test 5: Check service health (using unified API)
73
+ console.log('\n📋 Test 5: Checking service health (unified API)...');
74
+ const health = await serviceManager.checkServiceHealth(memoryService.id);
75
+ console.log('✅ Service health:', health);
76
+ // Test 6: Get local server status
77
+ console.log('\n📋 Test 6: Getting local server status...');
78
+ const status = await serviceManager.getLocalServerStatus(memoryService.id);
79
+ console.log('✅ Local server status:', status);
80
+ // Test 7: Stop the local MCP server
81
+ console.log('\n📋 Test 7: Stopping local MCP server...');
82
+ await serviceManager.stopLocalServer(memoryService.id);
83
+ console.log('✅ Local MCP server stopped');
84
+ // Test 8: Verify server is stopped
85
+ console.log('\n📋 Test 8: Verifying server is stopped...');
86
+ const finalStatus = await serviceManager.getLocalServerStatus(memoryService.id);
87
+ console.log('✅ Final status:', finalStatus);
88
+ console.log('\n🎉 All end-to-end tests passed! Local MCP server integration is working correctly.');
89
+ }
90
+ catch (error) {
91
+ console.error('❌ End-to-end test failed:', error);
92
+ process.exit(1);
93
+ }
94
+ finally {
95
+ // Cleanup
96
+ console.log('\n🧹 Cleaning up...');
97
+ await localManager.cleanup();
98
+ await db.close();
99
+ console.log('✅ Cleanup completed');
100
+ }
101
+ }
102
+ // Run the end-to-end test
103
+ testLocalMCPServerE2E().catch(console.error);
104
+ //# sourceMappingURL=test-local-mcp-e2e.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-local-mcp-e2e.js","sourceRoot":"","sources":["../src/test-local-mcp-e2e.ts"],"names":[],"mappings":";;;AAEA,kFAA4E;AAC5E,8DAA0D;AAC1D,gEAA4D;AAC5D,sEAAiE;AACjE,4DAAwD;AACxD,gDAAoD;AAGpD,KAAK,UAAU,qBAAqB;IAClC,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAEhE,sBAAsB;IACtB,MAAM,EAAE,GAAG,IAAI,0BAAe,EAAE,CAAC;IACjC,MAAM,aAAa,GAAG,IAAI,8BAAa,EAAE,CAAC;IAC1C,MAAM,YAAY,GAAG,IAAI,gDAAqB,EAAE,CAAC;IAEjD,sDAAsD;IACtD,MAAM,SAAS,GAAG,IAAI,qCAAgB,EAAE,CAAC;IACxC,SAAiB,CAAC,kBAAkB,GAAG,YAAY,CAAC;IAErD,oDAAoD;IACpD,MAAM,YAAY,GAAG,IAAI,4BAAY,EAAE,CAAC;IAExC,MAAM,cAAc,GAAG,IAAI,gCAAc,CAAC,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAEvE,IAAI,CAAC;QACH,kDAAkD;QAClD,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QACxE,MAAM,MAAM,GAAG;YACb,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,CAAC,IAAI,EAAE,qCAAqC,CAAC;iBACpD;aACF;SACF,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,4BAA4B,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3F,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QACrD,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YACzB,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9G,CAAC,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,aAAa,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAElC,qCAAqC;QACrC,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACzD,MAAM,cAAc,CAAC,gBAAgB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAE1C,6CAA6C;QAC7C,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,oBAAoB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACjD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACnB,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;QAChF,CAAC;QAED,0CAA0C;QAC1C,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,mBAAmB,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;YAEjD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC,aAAa,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC1F,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;YAC7C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,+CAA+C,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC5D,CAAC;QAED,mDAAmD;QACnD,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,kBAAkB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;QAEzC,kCAAkC;QAClC,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,oBAAoB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;QAE9C,oCAAoC;QACpC,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACzD,MAAM,cAAc,CAAC,eAAe,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAE1C,mCAAmC;QACnC,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAC3D,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,oBAAoB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAChF,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;QAE5C,OAAO,CAAC,GAAG,CAAC,sFAAsF,CAAC,CAAC;IAEtG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,UAAU;QACV,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,MAAM,YAAY,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,0BAA0B;AAC1B,qBAAqB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function getAdminSecretPath(): Promise<string>;
2
+ export declare function ensureAdminSecret(): Promise<string>;
3
+ export declare function readAdminSecretFromEnvOrFile(): Promise<string | null>;
4
+ export declare function hashAdminSecret(secret: string): string;
5
+ export declare function verifyAdminSecret(provided: string, expected: string): boolean;
6
+ //# sourceMappingURL=admin-secret.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-secret.d.ts","sourceRoot":"","sources":["../../src/trusted-session/admin-secret.ts"],"names":[],"mappings":"AASA,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAE1D;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAgBzD;AAED,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAc3E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAO7E"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getAdminSecretPath = getAdminSecretPath;
7
+ exports.ensureAdminSecret = ensureAdminSecret;
8
+ exports.readAdminSecretFromEnvOrFile = readAdminSecretFromEnvOrFile;
9
+ exports.hashAdminSecret = hashAdminSecret;
10
+ exports.verifyAdminSecret = verifyAdminSecret;
11
+ const node_crypto_1 = require("node:crypto");
12
+ const promises_1 = __importDefault(require("node:fs/promises"));
13
+ const node_path_1 = __importDefault(require("node:path"));
14
+ const shared_1 = require("@agent-deck/shared");
15
+ const ADMIN_SECRET_FILENAME = 'admin-secret';
16
+ const ADMIN_SECRET_ENV = 'AGENT_DECK_ADMIN_SECRET';
17
+ async function getAdminSecretPath() {
18
+ return node_path_1.default.join((0, shared_1.resolveAgentDeckHome)(), ADMIN_SECRET_FILENAME);
19
+ }
20
+ async function ensureAdminSecret() {
21
+ const secretPath = await getAdminSecretPath();
22
+ try {
23
+ const existing = await promises_1.default.readFile(secretPath, 'utf8');
24
+ const trimmed = existing.trim();
25
+ if (trimmed.length >= 32) {
26
+ return trimmed;
27
+ }
28
+ }
29
+ catch {
30
+ // create below
31
+ }
32
+ const secret = (0, node_crypto_1.randomBytes)(32).toString('base64url');
33
+ await promises_1.default.mkdir(node_path_1.default.dirname(secretPath), { recursive: true, mode: 0o700 });
34
+ await promises_1.default.writeFile(secretPath, `${secret}\n`, { encoding: 'utf8', mode: 0o600 });
35
+ return secret;
36
+ }
37
+ async function readAdminSecretFromEnvOrFile() {
38
+ const fromEnv = process.env[ADMIN_SECRET_ENV]?.trim();
39
+ if (fromEnv && fromEnv.length >= 32) {
40
+ return fromEnv;
41
+ }
42
+ try {
43
+ const secretPath = await getAdminSecretPath();
44
+ const value = await promises_1.default.readFile(secretPath, 'utf8');
45
+ const trimmed = value.trim();
46
+ return trimmed.length >= 32 ? trimmed : null;
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ }
52
+ function hashAdminSecret(secret) {
53
+ return (0, node_crypto_1.createHash)('sha256').update(secret, 'utf8').digest('hex');
54
+ }
55
+ function verifyAdminSecret(provided, expected) {
56
+ const digest = Buffer.from(hashAdminSecret(provided), 'hex');
57
+ const expectedDigest = Buffer.from(hashAdminSecret(expected), 'hex');
58
+ if (digest.length !== expectedDigest.length) {
59
+ return false;
60
+ }
61
+ return (0, node_crypto_1.timingSafeEqual)(digest, expectedDigest);
62
+ }
63
+ //# sourceMappingURL=admin-secret.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-secret.js","sourceRoot":"","sources":["../../src/trusted-session/admin-secret.ts"],"names":[],"mappings":";;;;;AASA,gDAEC;AAED,8CAgBC;AAED,oEAcC;AAED,0CAEC;AAED,8CAOC;AA1DD,6CAAuE;AACvE,gEAAkC;AAClC,0DAA6B;AAE7B,+CAA0D;AAE1D,MAAM,qBAAqB,GAAG,cAAc,CAAC;AAC7C,MAAM,gBAAgB,GAAG,yBAAyB,CAAC;AAE5C,KAAK,UAAU,kBAAkB;IACtC,OAAO,mBAAI,CAAC,IAAI,CAAC,IAAA,6BAAoB,GAAE,EAAE,qBAAqB,CAAC,CAAC;AAClE,CAAC;AAEM,KAAK,UAAU,iBAAiB;IACrC,MAAM,UAAU,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;YACzB,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,yBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACrD,MAAM,kBAAE,CAAC,KAAK,CAAC,mBAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3E,MAAM,kBAAE,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,MAAM,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACjF,OAAO,MAAM,CAAC;AAChB,CAAC;AAEM,KAAK,UAAU,4BAA4B;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,CAAC;IACtD,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACpC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,OAAO,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAAC,MAAc;IAC5C,OAAO,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED,SAAgB,iBAAiB,CAAC,QAAgB,EAAE,QAAgB;IAClE,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;IAC7D,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;IACrE,IAAI,MAAM,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAA,6BAAe,EAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { FastifyReply, FastifyRequest } from 'fastify';
2
+ import { type AgentSessionMode, type RuntimeSession, type TrustedSessionErrorCode } from '@agent-deck/shared';
3
+ import type { TrustedSessionStore } from './store';
4
+ export type AuthPolicy = 'allowPublic' | 'requireTrustedWriter' | 'requireAgentResource' | 'requireAgentOrDashboard' | 'requireDeckAdmin' | 'requireDashboard';
5
+ export type RequestPrincipal = {
6
+ kind: 'public';
7
+ } | {
8
+ kind: 'dashboard';
9
+ } | {
10
+ kind: 'agent';
11
+ session: RuntimeSession;
12
+ mode: AgentSessionMode;
13
+ deckId: string;
14
+ workspaceKey: string;
15
+ };
16
+ export declare class TrustedAuthError extends Error {
17
+ readonly code: TrustedSessionErrorCode;
18
+ constructor(code: TrustedSessionErrorCode, message: string);
19
+ }
20
+ export declare function createDashboardSessionToken(): string;
21
+ export declare function validateDashboardSessionToken(token: string): boolean;
22
+ export declare function resolveRequestPrincipal(request: FastifyRequest, store: TrustedSessionStore): Promise<RequestPrincipal>;
23
+ export declare function requireTrustedWriterBearer(request: FastifyRequest): Promise<void>;
24
+ export declare function enforcePolicy(policy: AuthPolicy, principal: RequestPrincipal): void;
25
+ export declare function sendTrustedAuthError(reply: FastifyReply, error: TrustedAuthError): void;
26
+ export declare function getAgentDeckId(principal: RequestPrincipal): string | null;
27
+ export declare function isDashboardPrincipal(principal: RequestPrincipal): boolean;
28
+ export declare function isAgentAdmin(principal: RequestPrincipal): boolean;
29
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/trusted-session/auth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE5D,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAG7B,MAAM,oBAAoB,CAAC;AAI5B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnD,MAAM,MAAM,UAAU,GAClB,aAAa,GACb,sBAAsB,GACtB,sBAAsB,GACtB,yBAAyB,GACzB,kBAAkB,GAClB,kBAAkB,CAAC;AAEvB,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IACE,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,gBAAgB,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEN,qBAAa,gBAAiB,SAAQ,KAAK;aAEvB,IAAI,EAAE,uBAAuB;gBAA7B,IAAI,EAAE,uBAAuB,EAC7C,OAAO,EAAE,MAAM;CAKlB;AAqBD,wBAAgB,2BAA2B,IAAI,MAAM,CAIpD;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAUpE;AA+DD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,gBAAgB,CAAC,CA8B3B;AAED,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAMvF;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,GAAG,IAAI,CA0BnF;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAGvF;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAEzE;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAEzE;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAEjE"}
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TrustedAuthError = void 0;
4
+ exports.createDashboardSessionToken = createDashboardSessionToken;
5
+ exports.validateDashboardSessionToken = validateDashboardSessionToken;
6
+ exports.resolveRequestPrincipal = resolveRequestPrincipal;
7
+ exports.requireTrustedWriterBearer = requireTrustedWriterBearer;
8
+ exports.enforcePolicy = enforcePolicy;
9
+ exports.sendTrustedAuthError = sendTrustedAuthError;
10
+ exports.getAgentDeckId = getAgentDeckId;
11
+ exports.isDashboardPrincipal = isDashboardPrincipal;
12
+ exports.isAgentAdmin = isAgentAdmin;
13
+ const node_crypto_1 = require("node:crypto");
14
+ const shared_1 = require("@agent-deck/shared");
15
+ const http_auth_1 = require("../lib/http-auth");
16
+ const admin_secret_1 = require("./admin-secret");
17
+ class TrustedAuthError extends Error {
18
+ code;
19
+ constructor(code, message) {
20
+ super(message);
21
+ this.code = code;
22
+ this.name = 'TrustedAuthError';
23
+ }
24
+ }
25
+ exports.TrustedAuthError = TrustedAuthError;
26
+ const dashboardSessions = new Map();
27
+ const DASHBOARD_SESSION_TTL_MS = 12 * 60 * 60 * 1000;
28
+ function parseDashboardCookie(request) {
29
+ const cookieHeader = request.headers.cookie;
30
+ if (!cookieHeader || typeof cookieHeader !== 'string') {
31
+ return null;
32
+ }
33
+ const prefix = `${shared_1.AGENT_DECK_DASHBOARD_COOKIE}=`;
34
+ for (const part of cookieHeader.split(';')) {
35
+ const trimmed = part.trim();
36
+ if (trimmed.startsWith(prefix)) {
37
+ return decodeURIComponent(trimmed.slice(prefix.length));
38
+ }
39
+ }
40
+ return null;
41
+ }
42
+ function createDashboardSessionToken() {
43
+ const token = (0, node_crypto_1.randomBytes)(32).toString('base64url');
44
+ dashboardSessions.set(token, { expiresAt: Date.now() + DASHBOARD_SESSION_TTL_MS });
45
+ return token;
46
+ }
47
+ function validateDashboardSessionToken(token) {
48
+ const entry = dashboardSessions.get(token);
49
+ if (!entry) {
50
+ return false;
51
+ }
52
+ if (entry.expiresAt <= Date.now()) {
53
+ dashboardSessions.delete(token);
54
+ return false;
55
+ }
56
+ return true;
57
+ }
58
+ async function resolveDashboardPrincipal(request) {
59
+ const dashboardToken = parseDashboardCookie(request);
60
+ if (dashboardToken && validateDashboardSessionToken(dashboardToken)) {
61
+ return { kind: 'dashboard' };
62
+ }
63
+ const bearer = (0, http_auth_1.parseBearerToken)(request);
64
+ if (bearer) {
65
+ const expected = await (0, admin_secret_1.readAdminSecretFromEnvOrFile)();
66
+ if (expected && (0, admin_secret_1.verifyAdminSecret)(bearer, expected)) {
67
+ return { kind: 'dashboard' };
68
+ }
69
+ }
70
+ return null;
71
+ }
72
+ function resolveAgentFromSessionHeader(request, store) {
73
+ const sessionHeader = request.headers[shared_1.AGENT_DECK_SESSION_HEADER];
74
+ const sessionId = typeof sessionHeader === 'string' ? sessionHeader.trim() : '';
75
+ if (!sessionId) {
76
+ return null;
77
+ }
78
+ const row = store.getRuntimeSessionRow(sessionId);
79
+ if (!row) {
80
+ throw new TrustedAuthError('SESSION_INVALID', 'Runtime session absent or expired');
81
+ }
82
+ if (row.revoked_at) {
83
+ throw new TrustedAuthError('SESSION_REVOKED', 'Grant rotation or explicit revocation ended the session');
84
+ }
85
+ if (Date.parse(row.expires_at) <= Date.now()) {
86
+ throw new TrustedAuthError('SESSION_INVALID', 'Runtime session absent or expired');
87
+ }
88
+ const session = store.touchRuntimeSession(sessionId);
89
+ if (!session) {
90
+ throw new TrustedAuthError('SESSION_INVALID', 'Runtime session absent or expired');
91
+ }
92
+ return session;
93
+ }
94
+ function resolveAgentFromGrantSecret(grantSecret, store) {
95
+ const grant = store.findActiveGrantBySecret(grantSecret);
96
+ if (!grant) {
97
+ throw new TrustedAuthError('GRANT_REQUIRED', 'No valid workspace grant');
98
+ }
99
+ return store.createRuntimeSession({
100
+ workspaceKeyId: grant.workspace_key_id,
101
+ workspaceGrantId: grant.id,
102
+ deckId: grant.deck_id,
103
+ });
104
+ }
105
+ async function resolveRequestPrincipal(request, store) {
106
+ const dashboard = await resolveDashboardPrincipal(request);
107
+ if (dashboard) {
108
+ return dashboard;
109
+ }
110
+ const sessionFromHeader = resolveAgentFromSessionHeader(request, store);
111
+ if (sessionFromHeader) {
112
+ return {
113
+ kind: 'agent',
114
+ session: sessionFromHeader,
115
+ mode: sessionFromHeader.mode,
116
+ deckId: sessionFromHeader.deckId,
117
+ workspaceKey: sessionFromHeader.workspaceKey,
118
+ };
119
+ }
120
+ const grantSecret = (0, http_auth_1.parseBearerToken)(request);
121
+ if (grantSecret) {
122
+ const session = resolveAgentFromGrantSecret(grantSecret, store);
123
+ return {
124
+ kind: 'agent',
125
+ session,
126
+ mode: session.mode,
127
+ deckId: session.deckId,
128
+ workspaceKey: session.workspaceKey,
129
+ };
130
+ }
131
+ throw new TrustedAuthError('GRANT_REQUIRED', 'No valid workspace grant');
132
+ }
133
+ async function requireTrustedWriterBearer(request) {
134
+ const bearer = (0, http_auth_1.parseBearerToken)(request);
135
+ const expected = await (0, admin_secret_1.readAdminSecretFromEnvOrFile)();
136
+ if (!bearer || !expected || !(0, admin_secret_1.verifyAdminSecret)(bearer, expected)) {
137
+ throw new TrustedAuthError('DASHBOARD_REQUIRED', 'Trusted writer authentication required');
138
+ }
139
+ }
140
+ function enforcePolicy(policy, principal) {
141
+ if (policy === 'allowPublic') {
142
+ return;
143
+ }
144
+ if (policy === 'requireDashboard') {
145
+ if (principal.kind !== 'dashboard') {
146
+ throw new TrustedAuthError('DASHBOARD_REQUIRED', 'Dashboard authentication required');
147
+ }
148
+ return;
149
+ }
150
+ if (policy === 'requireAgentOrDashboard') {
151
+ if (principal.kind === 'dashboard' || principal.kind === 'agent') {
152
+ return;
153
+ }
154
+ throw new TrustedAuthError('GRANT_REQUIRED', 'No valid workspace grant');
155
+ }
156
+ if (principal.kind !== 'agent') {
157
+ throw new TrustedAuthError('GRANT_REQUIRED', 'No valid workspace grant');
158
+ }
159
+ if (policy === 'requireDeckAdmin' && principal.mode !== 'agent-admin') {
160
+ throw new TrustedAuthError('ADMIN_REQUIRED', 'Deck-admin elevation is required');
161
+ }
162
+ }
163
+ function sendTrustedAuthError(reply, error) {
164
+ const body = (0, shared_1.trustedSessionError)(error.code, error.message);
165
+ reply.status((0, shared_1.httpStatusForTrustedError)(error.code)).send(body);
166
+ }
167
+ function getAgentDeckId(principal) {
168
+ return principal.kind === 'agent' ? principal.deckId : null;
169
+ }
170
+ function isDashboardPrincipal(principal) {
171
+ return principal.kind === 'dashboard';
172
+ }
173
+ function isAgentAdmin(principal) {
174
+ return principal.kind === 'agent' && principal.mode === 'agent-admin';
175
+ }
176
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/trusted-session/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ import { type RequestPrincipal } from './auth';
3
+ import { type RegisteredRoute } from './route-policy-registry';
4
+ declare module 'fastify' {
5
+ interface FastifyRequest {
6
+ requestPrincipal?: RequestPrincipal;
7
+ }
8
+ }
9
+ export declare const registeredHttpRoutes: RegisteredRoute[];
10
+ export declare function registerHttpPolicyHook(fastify: FastifyInstance): void;
11
+ export declare function assertAllRoutesHavePolicies(routes?: RegisteredRoute[]): void;
12
+ //# sourceMappingURL=policy-hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-hook.d.ts","sourceRoot":"","sources":["../../src/trusted-session/policy-hook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAE7E,OAAO,EAML,KAAK,gBAAgB,EACtB,MAAM,QAAQ,CAAC;AAChB,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,cAAc;QACtB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;KACrC;CACF;AAED,eAAO,MAAM,oBAAoB,EAAE,eAAe,EAAO,CAAC;AAE1D,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CA6DrE;AAED,wBAAgB,2BAA2B,CAAC,MAAM,GAAE,eAAe,EAAyB,GAAG,IAAI,CAMlG"}