@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
@@ -0,0 +1,451 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TrustedSessionStore = void 0;
4
+ exports.hashGrantSecret = hashGrantSecret;
5
+ exports.generateGrantSecret = generateGrantSecret;
6
+ exports.verifyGrantSecret = verifyGrantSecret;
7
+ const node_crypto_1 = require("node:crypto");
8
+ const shared_1 = require("@agent-deck/shared");
9
+ function hashGrantSecret(secret) {
10
+ return (0, node_crypto_1.createHash)('sha256').update(secret, 'utf8').digest('hex');
11
+ }
12
+ function generateGrantSecret() {
13
+ return (0, node_crypto_1.randomBytes)(32).toString('base64url');
14
+ }
15
+ function verifyGrantSecret(secret, secretHash) {
16
+ const digest = Buffer.from(hashGrantSecret(secret), 'hex');
17
+ const expected = Buffer.from(secretHash, 'hex');
18
+ if (digest.length !== expected.length) {
19
+ return false;
20
+ }
21
+ return (0, node_crypto_1.timingSafeEqual)(digest, expected);
22
+ }
23
+ function nowIso() {
24
+ return new Date().toISOString();
25
+ }
26
+ function addMs(iso, ms) {
27
+ return new Date(Date.parse(iso) + ms).toISOString();
28
+ }
29
+ class TrustedSessionStore {
30
+ db;
31
+ constructor(db) {
32
+ this.db = db;
33
+ this.ensureTables();
34
+ }
35
+ ensureTables() {
36
+ this.db.exec(`
37
+ CREATE TABLE IF NOT EXISTS workspace_keys (
38
+ id TEXT PRIMARY KEY,
39
+ path_digest TEXT NOT NULL UNIQUE,
40
+ created_at TEXT NOT NULL
41
+ );
42
+
43
+ CREATE TABLE IF NOT EXISTS workspace_grants (
44
+ id TEXT PRIMARY KEY,
45
+ workspace_key_id TEXT NOT NULL,
46
+ deck_id TEXT NOT NULL,
47
+ secret_hash TEXT NOT NULL,
48
+ status TEXT NOT NULL CHECK (status IN ('pending', 'active', 'revoked')),
49
+ created_at TEXT NOT NULL,
50
+ activated_at TEXT,
51
+ revoked_at TEXT,
52
+ FOREIGN KEY (workspace_key_id) REFERENCES workspace_keys (id)
53
+ );
54
+
55
+ CREATE UNIQUE INDEX IF NOT EXISTS workspace_grants_one_active
56
+ ON workspace_grants (workspace_key_id)
57
+ WHERE status = 'active';
58
+
59
+ CREATE TABLE IF NOT EXISTS runtime_sessions (
60
+ id TEXT PRIMARY KEY,
61
+ mcp_session_id TEXT,
62
+ workspace_key_id TEXT NOT NULL,
63
+ workspace_grant_id TEXT NOT NULL,
64
+ deck_id TEXT NOT NULL,
65
+ mode TEXT NOT NULL CHECK (mode IN ('normal', 'agent-admin')),
66
+ last_seen_at TEXT NOT NULL,
67
+ expires_at TEXT NOT NULL,
68
+ admin_expires_at TEXT,
69
+ revoked_at TEXT,
70
+ FOREIGN KEY (workspace_key_id) REFERENCES workspace_keys (id),
71
+ FOREIGN KEY (workspace_grant_id) REFERENCES workspace_grants (id)
72
+ );
73
+
74
+ CREATE INDEX IF NOT EXISTS runtime_sessions_grant_idx
75
+ ON runtime_sessions (workspace_grant_id);
76
+
77
+ CREATE TABLE IF NOT EXISTS admin_challenges (
78
+ id TEXT PRIMARY KEY,
79
+ runtime_session_id TEXT NOT NULL,
80
+ consumed_at TEXT,
81
+ expires_at TEXT NOT NULL,
82
+ created_at TEXT NOT NULL,
83
+ FOREIGN KEY (runtime_session_id) REFERENCES runtime_sessions (id)
84
+ );
85
+
86
+ CREATE TABLE IF NOT EXISTS dashboard_nonces (
87
+ nonce TEXT PRIMARY KEY,
88
+ expires_at TEXT NOT NULL,
89
+ consumed_at TEXT,
90
+ created_at TEXT NOT NULL
91
+ );
92
+ `);
93
+ }
94
+ getOrCreateWorkspaceKey(pathDigest) {
95
+ const existing = this.db
96
+ .prepare('SELECT id, path_digest, created_at FROM workspace_keys WHERE path_digest = ?')
97
+ .get(pathDigest);
98
+ if (existing) {
99
+ return existing;
100
+ }
101
+ const id = (0, shared_1.prefixTrustedId)('wsp', (0, node_crypto_1.randomUUID)());
102
+ const createdAt = nowIso();
103
+ this.db
104
+ .prepare('INSERT INTO workspace_keys (id, path_digest, created_at) VALUES (?, ?, ?)')
105
+ .run(id, pathDigest, createdAt);
106
+ return { id, path_digest: pathDigest, created_at: createdAt };
107
+ }
108
+ getWorkspaceKeyById(id) {
109
+ return (this.db
110
+ .prepare('SELECT id, path_digest, created_at FROM workspace_keys WHERE id = ?')
111
+ .get(id) ?? null);
112
+ }
113
+ getActiveGrantForWorkspace(workspaceKeyId) {
114
+ return (this.db
115
+ .prepare(`SELECT id, workspace_key_id, deck_id, secret_hash, status, created_at, activated_at, revoked_at
116
+ FROM workspace_grants
117
+ WHERE workspace_key_id = ? AND status = 'active'`)
118
+ .get(workspaceKeyId) ?? null);
119
+ }
120
+ getGrantById(grantId) {
121
+ return (this.db
122
+ .prepare(`SELECT id, workspace_key_id, deck_id, secret_hash, status, created_at, activated_at, revoked_at
123
+ FROM workspace_grants WHERE id = ?`)
124
+ .get(grantId) ?? null);
125
+ }
126
+ findActiveGrantBySecret(secret) {
127
+ const hash = hashGrantSecret(secret);
128
+ return (this.db
129
+ .prepare(`SELECT id, workspace_key_id, deck_id, secret_hash, status, created_at, activated_at, revoked_at
130
+ FROM workspace_grants WHERE secret_hash = ? AND status = 'active'`)
131
+ .get(hash) ?? null);
132
+ }
133
+ createPendingGrant(workspaceKeyId, deckId, secret) {
134
+ const id = (0, shared_1.prefixTrustedId)('wgr', (0, node_crypto_1.randomUUID)());
135
+ const createdAt = nowIso();
136
+ const secretHash = hashGrantSecret(secret);
137
+ this.db
138
+ .prepare(`INSERT INTO workspace_grants
139
+ (id, workspace_key_id, deck_id, secret_hash, status, created_at)
140
+ VALUES (?, ?, ?, ?, 'pending', ?)`)
141
+ .run(id, workspaceKeyId, deckId, secretHash, createdAt);
142
+ return {
143
+ id,
144
+ workspace_key_id: workspaceKeyId,
145
+ deck_id: deckId,
146
+ secret_hash: secretHash,
147
+ status: 'pending',
148
+ created_at: createdAt,
149
+ activated_at: null,
150
+ revoked_at: null,
151
+ };
152
+ }
153
+ activateGrant(grantId) {
154
+ const grant = this.getGrantById(grantId);
155
+ if (!grant || grant.status !== 'pending') {
156
+ return null;
157
+ }
158
+ const activatedAt = nowIso();
159
+ const revokeActive = this.db.prepare(`UPDATE workspace_grants
160
+ SET status = 'revoked', revoked_at = ?
161
+ WHERE workspace_key_id = ? AND status = 'active'`);
162
+ const activate = this.db.prepare(`UPDATE workspace_grants
163
+ SET status = 'active', activated_at = ?
164
+ WHERE id = ? AND status = 'pending'`);
165
+ const tx = this.db.transaction(() => {
166
+ revokeActive.run(activatedAt, grant.workspace_key_id);
167
+ activate.run(activatedAt, grantId);
168
+ });
169
+ tx();
170
+ return this.getGrantById(grantId);
171
+ }
172
+ revokeGrant(grantId) {
173
+ const revokedAt = nowIso();
174
+ this.db
175
+ .prepare(`UPDATE workspace_grants SET status = 'revoked', revoked_at = ? WHERE id = ? AND status != 'revoked'`)
176
+ .run(revokedAt, grantId);
177
+ this.revokeSessionsForGrant(grantId, revokedAt);
178
+ }
179
+ revokeSessionsForGrant(grantId, revokedAt = nowIso()) {
180
+ const result = this.db
181
+ .prepare(`UPDATE runtime_sessions SET revoked_at = ? WHERE workspace_grant_id = ? AND revoked_at IS NULL`)
182
+ .run(revokedAt, grantId);
183
+ return result.changes;
184
+ }
185
+ createRuntimeSession(input) {
186
+ const id = (0, shared_1.prefixTrustedId)('ses', (0, node_crypto_1.randomUUID)());
187
+ const lastSeenAt = nowIso();
188
+ const expiresAt = addMs(lastSeenAt, shared_1.RUNTIME_SESSION_LEASE_MS);
189
+ this.db
190
+ .prepare(`INSERT INTO runtime_sessions
191
+ (id, mcp_session_id, workspace_key_id, workspace_grant_id, deck_id, mode,
192
+ last_seen_at, expires_at, admin_expires_at)
193
+ VALUES (?, ?, ?, ?, ?, 'normal', ?, ?, NULL)`)
194
+ .run(id, input.mcpSessionId ?? null, input.workspaceKeyId, input.workspaceGrantId, input.deckId, lastSeenAt, expiresAt);
195
+ return this.toRuntimeSession(this.getRuntimeSessionRow(id));
196
+ }
197
+ findActiveRuntimeSessionForMcp(mcpSessionId, grantId) {
198
+ const now = nowIso();
199
+ const row = this.db
200
+ .prepare(`SELECT id, mcp_session_id, workspace_key_id, workspace_grant_id, deck_id, mode,
201
+ last_seen_at, expires_at, admin_expires_at, revoked_at
202
+ FROM runtime_sessions
203
+ WHERE mcp_session_id = ? AND workspace_grant_id = ?
204
+ AND revoked_at IS NULL AND expires_at > ?`)
205
+ .get(mcpSessionId, grantId, now);
206
+ if (!row) {
207
+ return null;
208
+ }
209
+ const touched = this.touchRuntimeSession(row.id);
210
+ return touched;
211
+ }
212
+ getRuntimeSessionModeByMcpSessionId(mcpSessionId) {
213
+ return this.getRuntimeSessionModesByMcpSessionIds([mcpSessionId]).get(mcpSessionId) ?? null;
214
+ }
215
+ getRuntimeSessionModesByMcpSessionIds(mcpSessionIds) {
216
+ const uniqueIds = [...new Set(mcpSessionIds.filter(Boolean))];
217
+ if (uniqueIds.length === 0) {
218
+ return new Map();
219
+ }
220
+ const now = nowIso();
221
+ const placeholders = uniqueIds.map(() => '?').join(', ');
222
+ const rows = this.db
223
+ .prepare(`SELECT mcp_session_id, mode FROM runtime_sessions
224
+ WHERE mcp_session_id IN (${placeholders}) AND revoked_at IS NULL AND expires_at > ?`)
225
+ .all(...uniqueIds, now);
226
+ return new Map(rows.map((row) => [row.mcp_session_id, row.mode]));
227
+ }
228
+ revokePendingGrant(grantId) {
229
+ const revokedAt = nowIso();
230
+ this.db
231
+ .prepare(`UPDATE workspace_grants SET status = 'revoked', revoked_at = ?
232
+ WHERE id = ? AND status = 'pending'`)
233
+ .run(revokedAt, grantId);
234
+ }
235
+ createDashboardNonce(nonce, expiresAtIso) {
236
+ this.db
237
+ .prepare(`INSERT INTO dashboard_nonces (nonce, expires_at, created_at) VALUES (?, ?, ?)`)
238
+ .run(nonce, expiresAtIso, nowIso());
239
+ }
240
+ consumeDashboardNonce(nonce) {
241
+ const row = this.db
242
+ .prepare(`SELECT nonce, expires_at, consumed_at FROM dashboard_nonces WHERE nonce = ?`)
243
+ .get(nonce);
244
+ if (!row || row.consumed_at || Date.parse(row.expires_at) <= Date.now()) {
245
+ return false;
246
+ }
247
+ this.db
248
+ .prepare(`UPDATE dashboard_nonces SET consumed_at = ? WHERE nonce = ?`)
249
+ .run(nowIso(), nonce);
250
+ return true;
251
+ }
252
+ expireDashboardNonces() {
253
+ const now = nowIso();
254
+ const result = this.db
255
+ .prepare(`DELETE FROM dashboard_nonces WHERE expires_at <= ? OR consumed_at IS NOT NULL`)
256
+ .run(now);
257
+ return result.changes;
258
+ }
259
+ getRuntimeSessionRow(sessionId) {
260
+ return (this.db
261
+ .prepare(`SELECT id, mcp_session_id, workspace_key_id, workspace_grant_id, deck_id, mode,
262
+ last_seen_at, expires_at, admin_expires_at, revoked_at
263
+ FROM runtime_sessions WHERE id = ?`)
264
+ .get(sessionId) ?? null);
265
+ }
266
+ touchRuntimeSession(sessionId) {
267
+ const row = this.getRuntimeSessionRow(sessionId);
268
+ if (!row || row.revoked_at) {
269
+ return null;
270
+ }
271
+ const now = nowIso();
272
+ if (Date.parse(row.expires_at) <= Date.now()) {
273
+ return null;
274
+ }
275
+ let mode = row.mode;
276
+ let adminExpiresAt = row.admin_expires_at;
277
+ if (mode === 'agent-admin' && adminExpiresAt && Date.parse(adminExpiresAt) <= Date.now()) {
278
+ mode = 'normal';
279
+ adminExpiresAt = null;
280
+ }
281
+ const expiresAt = addMs(now, shared_1.RUNTIME_SESSION_LEASE_MS);
282
+ const nextAdminExpiresAt = mode === 'agent-admin' ? addMs(now, shared_1.ADMIN_MODE_LEASE_MS) : null;
283
+ this.db
284
+ .prepare(`UPDATE runtime_sessions
285
+ SET last_seen_at = ?, expires_at = ?, mode = ?, admin_expires_at = ?
286
+ WHERE id = ?`)
287
+ .run(now, expiresAt, mode, nextAdminExpiresAt, sessionId);
288
+ return this.toRuntimeSession(this.getRuntimeSessionRow(sessionId));
289
+ }
290
+ elevateSessionToAdmin(sessionId) {
291
+ const row = this.getRuntimeSessionRow(sessionId);
292
+ if (!row || row.revoked_at || Date.parse(row.expires_at) <= Date.now()) {
293
+ return null;
294
+ }
295
+ const now = nowIso();
296
+ this.db
297
+ .prepare(`UPDATE runtime_sessions
298
+ SET mode = 'agent-admin', admin_expires_at = ?, last_seen_at = ?, expires_at = ?
299
+ WHERE id = ?`)
300
+ .run(addMs(now, shared_1.ADMIN_MODE_LEASE_MS), now, addMs(now, shared_1.RUNTIME_SESSION_LEASE_MS), sessionId);
301
+ return this.toRuntimeSession(this.getRuntimeSessionRow(sessionId));
302
+ }
303
+ downgradeSessionToNormal(sessionId) {
304
+ const row = this.getRuntimeSessionRow(sessionId);
305
+ if (!row || row.revoked_at) {
306
+ return null;
307
+ }
308
+ const now = nowIso();
309
+ this.db
310
+ .prepare(`UPDATE runtime_sessions
311
+ SET mode = 'normal', admin_expires_at = NULL, last_seen_at = ?, expires_at = ?
312
+ WHERE id = ?`)
313
+ .run(now, addMs(now, shared_1.RUNTIME_SESSION_LEASE_MS), sessionId);
314
+ return this.toRuntimeSession(this.getRuntimeSessionRow(sessionId));
315
+ }
316
+ revokeRuntimeSession(sessionId) {
317
+ this.db
318
+ .prepare(`UPDATE runtime_sessions SET revoked_at = ? WHERE id = ? AND revoked_at IS NULL`)
319
+ .run(nowIso(), sessionId);
320
+ }
321
+ createAdminChallenge(runtimeSessionId) {
322
+ const id = (0, shared_1.prefixTrustedId)('adm', (0, node_crypto_1.randomUUID)());
323
+ const createdAt = nowIso();
324
+ const expiresAt = addMs(createdAt, shared_1.ADMIN_CHALLENGE_TTL_MS);
325
+ this.db
326
+ .prepare(`INSERT INTO admin_challenges (id, runtime_session_id, expires_at, created_at)
327
+ VALUES (?, ?, ?, ?)`)
328
+ .run(id, runtimeSessionId, expiresAt, createdAt);
329
+ return {
330
+ id,
331
+ runtime_session_id: runtimeSessionId,
332
+ consumed_at: null,
333
+ expires_at: expiresAt,
334
+ created_at: createdAt,
335
+ };
336
+ }
337
+ consumeAdminChallenge(challengeId, runtimeSessionId) {
338
+ const row = this.db
339
+ .prepare(`SELECT id, runtime_session_id, consumed_at, expires_at, created_at
340
+ FROM admin_challenges WHERE id = ?`)
341
+ .get(challengeId);
342
+ if (!row || row.runtime_session_id !== runtimeSessionId) {
343
+ return false;
344
+ }
345
+ if (row.consumed_at || Date.parse(row.expires_at) <= Date.now()) {
346
+ return false;
347
+ }
348
+ this.db
349
+ .prepare(`UPDATE admin_challenges SET consumed_at = ? WHERE id = ?`)
350
+ .run(nowIso(), challengeId);
351
+ return true;
352
+ }
353
+ listPendingAdminChallenges() {
354
+ const now = nowIso();
355
+ const rows = this.db
356
+ .prepare(`SELECT ac.id, ac.runtime_session_id, ac.expires_at, ac.created_at, rs.deck_id
357
+ FROM admin_challenges ac
358
+ INNER JOIN runtime_sessions rs ON rs.id = ac.runtime_session_id
359
+ WHERE ac.consumed_at IS NULL
360
+ AND ac.expires_at > ?
361
+ AND rs.revoked_at IS NULL`)
362
+ .all(now);
363
+ return rows.map((row) => ({
364
+ challengeId: row.id,
365
+ runtimeSessionId: row.runtime_session_id,
366
+ deckId: row.deck_id,
367
+ expiresAt: row.expires_at,
368
+ createdAt: row.created_at,
369
+ }));
370
+ }
371
+ countWorkspacesForDeck(deckId) {
372
+ const row = this.db
373
+ .prepare(`SELECT COUNT(DISTINCT workspace_key_id) AS count
374
+ FROM workspace_grants
375
+ WHERE deck_id = ? AND status = 'active'`)
376
+ .get(deckId);
377
+ return row.count;
378
+ }
379
+ /**
380
+ * C8: elevated-agent deck change — rotate grant, rebind approving session, revoke peers.
381
+ * Plaintext grant secret is stored hashed only; caller must run `agent-deck use` to refresh local grant file.
382
+ */
383
+ rotateGrantForElevatedSession(runtimeSessionId, newDeckId) {
384
+ const row = this.getRuntimeSessionRow(runtimeSessionId);
385
+ if (!row || row.revoked_at || Date.parse(row.expires_at) <= Date.now()) {
386
+ return null;
387
+ }
388
+ if (row.mode !== 'agent-admin') {
389
+ return null;
390
+ }
391
+ if (row.deck_id === newDeckId) {
392
+ const session = this.touchRuntimeSession(runtimeSessionId);
393
+ return session
394
+ ? { session, peersRevoked: 0, grantId: row.workspace_grant_id }
395
+ : null;
396
+ }
397
+ const oldGrantId = row.workspace_grant_id;
398
+ const secret = generateGrantSecret();
399
+ const pending = this.createPendingGrant(row.workspace_key_id, newDeckId, secret);
400
+ const activated = this.activateGrant(pending.id);
401
+ if (!activated) {
402
+ this.revokePendingGrant(pending.id);
403
+ return null;
404
+ }
405
+ const revokedAt = nowIso();
406
+ const peersRevoked = this.db
407
+ .prepare(`UPDATE runtime_sessions SET revoked_at = ?
408
+ WHERE workspace_grant_id = ? AND id != ? AND revoked_at IS NULL`)
409
+ .run(revokedAt, oldGrantId, runtimeSessionId).changes;
410
+ const now = nowIso();
411
+ const adminExpiresAt = row.admin_expires_at;
412
+ this.db
413
+ .prepare(`UPDATE runtime_sessions
414
+ SET workspace_grant_id = ?, deck_id = ?, last_seen_at = ?, expires_at = ?
415
+ WHERE id = ?`)
416
+ .run(activated.id, newDeckId, now, addMs(now, shared_1.RUNTIME_SESSION_LEASE_MS), runtimeSessionId);
417
+ const session = this.toRuntimeSession(this.getRuntimeSessionRow(runtimeSessionId));
418
+ return { session, peersRevoked, grantId: activated.id };
419
+ }
420
+ expireStaleSessions() {
421
+ const now = nowIso();
422
+ const downgrade = this.db.prepare(`UPDATE runtime_sessions
423
+ SET mode = 'normal', admin_expires_at = NULL
424
+ WHERE mode = 'agent-admin' AND admin_expires_at IS NOT NULL AND admin_expires_at <= ?`);
425
+ const expire = this.db.prepare(`UPDATE runtime_sessions SET revoked_at = ?
426
+ WHERE revoked_at IS NULL AND expires_at <= ?`);
427
+ let expiredCount = 0;
428
+ const tx = this.db.transaction(() => {
429
+ downgrade.run(now);
430
+ const result = expire.run(now, now);
431
+ expiredCount = result.changes;
432
+ });
433
+ tx();
434
+ return expiredCount;
435
+ }
436
+ toRuntimeSession(row) {
437
+ return {
438
+ sessionId: row.id,
439
+ mcpSessionId: row.mcp_session_id ?? undefined,
440
+ workspaceKey: row.workspace_key_id,
441
+ workspaceGrantId: row.workspace_grant_id,
442
+ deckId: row.deck_id,
443
+ mode: row.mode,
444
+ lastSeenAt: row.last_seen_at,
445
+ expiresAt: row.expires_at,
446
+ adminExpiresAt: row.admin_expires_at,
447
+ };
448
+ }
449
+ }
450
+ exports.TrustedSessionStore = TrustedSessionStore;
451
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/trusted-session/store.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-deck/backend",
3
- "version": "1.6.4",
3
+ "version": "1.7.1",
4
4
  "description": "Agent Deck backend API, MCP server, and vault",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -46,7 +46,7 @@
46
46
  "prepublishOnly": "node ../../scripts/pre-publish-check.mjs && npm run build"
47
47
  },
48
48
  "dependencies": {
49
- "@agent-deck/shared": "^1.6.4",
49
+ "@agent-deck/shared": "^1.7.1",
50
50
  "@fastify/cors": "^10.0.0",
51
51
  "@fastify/static": "^8.0.0",
52
52
  "@fastify/websocket": "^11.2.0",
@@ -56,7 +56,7 @@
56
56
  "express": "^4.19.2",
57
57
  "fastify": "^5.11.0",
58
58
  "gray-matter": "^4.0.3",
59
- "openid-client": "^6.6.4",
59
+ "openid-client": "^6.8.5",
60
60
  "use-mcp": "^0.0.21",
61
61
  "yaml": "^2.9.0",
62
62
  "zod": "^3.22.4"