@agent-deck/backend 1.10.1 → 1.10.3

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 (87) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/execution-authority/bearer.d.ts +15 -0
  3. package/dist/execution-authority/bearer.d.ts.map +1 -0
  4. package/dist/execution-authority/bearer.js +35 -0
  5. package/dist/execution-authority/bearer.js.map +1 -0
  6. package/dist/execution-authority/index.d.ts +6 -0
  7. package/dist/execution-authority/index.d.ts.map +1 -0
  8. package/dist/execution-authority/index.js +8 -0
  9. package/dist/execution-authority/index.js.map +1 -0
  10. package/dist/execution-authority/ledger.d.ts +85 -0
  11. package/dist/execution-authority/ledger.d.ts.map +1 -0
  12. package/dist/execution-authority/ledger.js +507 -0
  13. package/dist/execution-authority/ledger.js.map +1 -0
  14. package/dist/execution-authority/store.d.ts +55 -0
  15. package/dist/execution-authority/store.d.ts.map +1 -0
  16. package/dist/execution-authority/store.js +256 -0
  17. package/dist/execution-authority/store.js.map +1 -0
  18. package/dist/execution-authority/types.d.ts +119 -0
  19. package/dist/execution-authority/types.d.ts.map +1 -0
  20. package/dist/execution-authority/types.js +9 -0
  21. package/dist/execution-authority/types.js.map +1 -0
  22. package/dist/lib/execution-authority-http.d.ts +23 -0
  23. package/dist/lib/execution-authority-http.d.ts.map +1 -0
  24. package/dist/lib/execution-authority-http.js +101 -0
  25. package/dist/lib/execution-authority-http.js.map +1 -0
  26. package/dist/lib/fatal.d.ts.map +1 -1
  27. package/dist/lib/fatal.js +12 -2
  28. package/dist/lib/fatal.js.map +1 -1
  29. package/dist/mcp-server.d.ts +6 -5
  30. package/dist/mcp-server.d.ts.map +1 -1
  31. package/dist/mcp-server.js +37 -20
  32. package/dist/mcp-server.js.map +1 -1
  33. package/dist/mcp-session-binding.d.ts +5 -1
  34. package/dist/mcp-session-binding.d.ts.map +1 -1
  35. package/dist/mcp-session-binding.js +22 -12
  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/register.d.ts +3 -0
  41. package/dist/mcp-tools/register.d.ts.map +1 -1
  42. package/dist/mcp-tools/register.js +22 -2
  43. package/dist/mcp-tools/register.js.map +1 -1
  44. package/dist/mcp-unassigned.d.ts +14 -0
  45. package/dist/mcp-unassigned.d.ts.map +1 -0
  46. package/dist/mcp-unassigned.js +22 -0
  47. package/dist/mcp-unassigned.js.map +1 -0
  48. package/dist/playbooks/playbook-parser.d.ts +8 -0
  49. package/dist/playbooks/playbook-parser.d.ts.map +1 -0
  50. package/dist/playbooks/playbook-parser.js +76 -0
  51. package/dist/playbooks/playbook-parser.js.map +1 -0
  52. package/dist/playbooks/playbook-service.d.ts +9 -0
  53. package/dist/playbooks/playbook-service.d.ts.map +1 -0
  54. package/dist/playbooks/playbook-service.js +107 -0
  55. package/dist/playbooks/playbook-service.js.map +1 -0
  56. package/dist/routes/decks.d.ts.map +1 -1
  57. package/dist/routes/decks.js +28 -2
  58. package/dist/routes/decks.js.map +1 -1
  59. package/dist/routes/execution-authority.d.ts +8 -0
  60. package/dist/routes/execution-authority.d.ts.map +1 -0
  61. package/dist/routes/execution-authority.js +498 -0
  62. package/dist/routes/execution-authority.js.map +1 -0
  63. package/dist/scope/bindings-sidecar.d.ts +9 -0
  64. package/dist/scope/bindings-sidecar.d.ts.map +1 -0
  65. package/dist/scope/bindings-sidecar.js +57 -0
  66. package/dist/scope/bindings-sidecar.js.map +1 -0
  67. package/dist/scope/repo-deck.d.ts +10 -0
  68. package/dist/scope/repo-deck.d.ts.map +1 -0
  69. package/dist/scope/repo-deck.js +63 -0
  70. package/dist/scope/repo-deck.js.map +1 -0
  71. package/dist/test-local-mcp-e2e.d.ts +3 -0
  72. package/dist/test-local-mcp-e2e.d.ts.map +1 -0
  73. package/dist/test-local-mcp-e2e.js +104 -0
  74. package/dist/test-local-mcp-e2e.js.map +1 -0
  75. package/dist/trusted-session/auth.d.ts.map +1 -1
  76. package/dist/trusted-session/auth.js +13 -3
  77. package/dist/trusted-session/auth.js.map +1 -1
  78. package/package.json +2 -2
  79. package/static-ui/assets/index-CbccleVj.css +1 -0
  80. package/static-ui/assets/{index-Bb9ckehB.js → index-DKn5XqhM.js} +64 -64
  81. package/static-ui/favicon.png +0 -0
  82. package/static-ui/index.html +2 -2
  83. package/dist/config/mcp-endpoint.d.ts +0 -6
  84. package/dist/config/mcp-endpoint.d.ts.map +0 -1
  85. package/dist/config/mcp-endpoint.js +0 -19
  86. package/dist/config/mcp-endpoint.js.map +0 -1
  87. package/static-ui/assets/index-DRG5q9lJ.css +0 -1
@@ -0,0 +1,498 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerExecutionAuthorityRoutes = exports.EnrollmentAuthError = void 0;
4
+ const http_auth_1 = require("../lib/http-auth");
5
+ const invalid_deck_id_path_segment_1 = require("../lib/invalid-deck-id-path-segment");
6
+ const auth_1 = require("../trusted-session/auth");
7
+ const bearer_1 = require("../execution-authority/bearer");
8
+ const execution_authority_http_1 = require("../lib/execution-authority-http");
9
+ class EnrollmentAuthError extends Error {
10
+ contract;
11
+ constructor(contract) {
12
+ super(contract.message);
13
+ this.contract = contract;
14
+ this.name = 'EnrollmentAuthError';
15
+ }
16
+ }
17
+ exports.EnrollmentAuthError = EnrollmentAuthError;
18
+ function intersectTools(policy, hint) {
19
+ if (hint === undefined)
20
+ return policy;
21
+ const key = (t) => `${t.serviceId}\0${t.toolName}`;
22
+ const allowed = new Set(policy.map(key));
23
+ return hint.filter((t) => allowed.has(key(t)));
24
+ }
25
+ function requireEnrollmentAuth(request, store) {
26
+ const token = (0, http_auth_1.parseBearerToken)({ headers: request.headers });
27
+ if (!token) {
28
+ throw new EnrollmentAuthError({
29
+ ok: false,
30
+ error_code: 'COORDINATOR_NOT_ENROLLED',
31
+ message: 'Enrollment bearer required (enr_…:secret)',
32
+ });
33
+ }
34
+ const parsed = (0, bearer_1.parseEnrollmentBearer)(token);
35
+ if (!parsed) {
36
+ throw new EnrollmentAuthError({
37
+ ok: false,
38
+ error_code: 'COORDINATOR_NOT_ENROLLED',
39
+ message: 'Enrollment bearer required (enr_…:secret)',
40
+ });
41
+ }
42
+ const enrollment = store.getEnrollment(parsed.enrollmentId);
43
+ if (!enrollment) {
44
+ throw new EnrollmentAuthError({
45
+ ok: false,
46
+ error_code: 'COORDINATOR_NOT_ENROLLED',
47
+ message: 'Unknown enrollment',
48
+ correlation: { enrollmentId: parsed.enrollmentId },
49
+ });
50
+ }
51
+ if (enrollment.status !== 'active') {
52
+ throw new EnrollmentAuthError({
53
+ ok: false,
54
+ error_code: 'ENROLLMENT_REVOKED',
55
+ message: 'Enrollment is revoked',
56
+ reason: 'enrollment_revoked',
57
+ correlation: { enrollmentId: parsed.enrollmentId },
58
+ });
59
+ }
60
+ if (!store.verifyEnrollmentSecret(parsed.enrollmentId, parsed.secret)) {
61
+ throw new EnrollmentAuthError({
62
+ ok: false,
63
+ error_code: 'COORDINATOR_NOT_ENROLLED',
64
+ message: 'Invalid enrollment secret',
65
+ correlation: { enrollmentId: parsed.enrollmentId },
66
+ });
67
+ }
68
+ return { enrollmentId: parsed.enrollmentId };
69
+ }
70
+ /** Shared enrollment bearer resolve used by coordinator metadata + mint routes. */
71
+ function resolveEnrollmentAuth(request, store) {
72
+ try {
73
+ const { enrollmentId } = requireEnrollmentAuth(request, store);
74
+ const enrollment = store.getEnrollment(enrollmentId);
75
+ if (!enrollment) {
76
+ return {
77
+ ok: false,
78
+ contract: {
79
+ ok: false,
80
+ error_code: 'COORDINATOR_NOT_ENROLLED',
81
+ message: 'Unknown enrollment',
82
+ correlation: { enrollmentId },
83
+ },
84
+ };
85
+ }
86
+ return { ok: true, enrollmentId, enrollment };
87
+ }
88
+ catch (error) {
89
+ if (error instanceof EnrollmentAuthError) {
90
+ return { ok: false, contract: error.contract };
91
+ }
92
+ throw error;
93
+ }
94
+ }
95
+ function deckNotPermittedError(enrollmentId, deckId) {
96
+ return {
97
+ ok: false,
98
+ error_code: 'RESOURCE_OUT_OF_SCOPE',
99
+ message: 'Deck is not in allowedDeckIds',
100
+ reason: 'deck_not_permitted',
101
+ correlation: { enrollmentId, deckId },
102
+ };
103
+ }
104
+ function deckNotFoundError(enrollmentId, deckId) {
105
+ return {
106
+ ok: false,
107
+ error_code: 'RESOURCE_OUT_OF_SCOPE',
108
+ message: 'Deck not found',
109
+ reason: 'deck_not_found',
110
+ correlation: { enrollmentId, deckId },
111
+ };
112
+ }
113
+ /** Re-check enrollment after awaits so revoke cannot race a successful response. */
114
+ function revalidateActiveEnrollment(store, enrollmentId, deckId) {
115
+ const enrollment = store.getEnrollment(enrollmentId);
116
+ if (!enrollment || enrollment.status !== 'active') {
117
+ return {
118
+ ok: false,
119
+ error_code: 'ENROLLMENT_REVOKED',
120
+ message: 'Enrollment is revoked',
121
+ reason: 'enrollment_revoked',
122
+ correlation: { enrollmentId },
123
+ };
124
+ }
125
+ if (deckId !== undefined && !enrollment.allowedDeckIds.includes(deckId)) {
126
+ return deckNotPermittedError(enrollmentId, deckId);
127
+ }
128
+ return null;
129
+ }
130
+ async function requireEnrollmentOrTrustedWriter(request, store) {
131
+ try {
132
+ return { kind: 'enrollment', ...requireEnrollmentAuth(request, store) };
133
+ }
134
+ catch (error) {
135
+ if (!(error instanceof EnrollmentAuthError))
136
+ throw error;
137
+ try {
138
+ await (0, auth_1.requireTrustedWriterBearer)(request);
139
+ return { kind: 'trusted-writer' };
140
+ }
141
+ catch {
142
+ throw error;
143
+ }
144
+ }
145
+ }
146
+ const registerExecutionAuthorityRoutes = async (fastify) => {
147
+ const store = () => fastify.executionAuthorityStore;
148
+ fastify.post('/enrollments', async (request, reply) => {
149
+ try {
150
+ await (0, auth_1.requireTrustedWriterBearer)(request);
151
+ }
152
+ catch (error) {
153
+ if (error instanceof auth_1.TrustedAuthError) {
154
+ return (0, auth_1.sendTrustedAuthError)(reply, error);
155
+ }
156
+ throw error;
157
+ }
158
+ const body = (request.body ?? {});
159
+ if (!body.coordinatorId?.trim() || !Array.isArray(body.allowedDeckIds) || body.allowedDeckIds.length === 0) {
160
+ return reply.status(400).send({
161
+ ok: false,
162
+ error_code: 'INVALID_MINT_REQUEST',
163
+ message: 'coordinatorId and allowedDeckIds are required',
164
+ });
165
+ }
166
+ const result = store().enrollCoordinator({
167
+ coordinatorId: body.coordinatorId.trim(),
168
+ allowedDeckIds: body.allowedDeckIds.map(String),
169
+ });
170
+ if (!result.ok) {
171
+ return (0, execution_authority_http_1.sendContractError)(reply, result, (0, execution_authority_http_1.statusForContract)(result));
172
+ }
173
+ return { ok: true, data: result.data };
174
+ });
175
+ fastify.get('/enrollments/:id', async (request, reply) => {
176
+ try {
177
+ await (0, auth_1.requireTrustedWriterBearer)(request);
178
+ }
179
+ catch (error) {
180
+ if (error instanceof auth_1.TrustedAuthError) {
181
+ return (0, auth_1.sendTrustedAuthError)(reply, error);
182
+ }
183
+ throw error;
184
+ }
185
+ const enrollment = store().getEnrollment(request.params.id);
186
+ if (!enrollment) {
187
+ return reply.status(404).send({
188
+ ok: false,
189
+ error_code: 'COORDINATOR_NOT_ENROLLED',
190
+ message: 'Unknown enrollment',
191
+ });
192
+ }
193
+ return { ok: true, data: enrollment };
194
+ });
195
+ fastify.post('/enrollments/:id/revoke', async (request, reply) => {
196
+ try {
197
+ await (0, auth_1.requireTrustedWriterBearer)(request);
198
+ }
199
+ catch (error) {
200
+ if (error instanceof auth_1.TrustedAuthError) {
201
+ return (0, auth_1.sendTrustedAuthError)(reply, error);
202
+ }
203
+ throw error;
204
+ }
205
+ const result = store().revokeEnrollment(request.params.id);
206
+ if (!result.ok) {
207
+ return (0, execution_authority_http_1.sendContractError)(reply, result, (0, execution_authority_http_1.statusForContract)(result));
208
+ }
209
+ return { ok: true, data: result.data };
210
+ });
211
+ fastify.get('/decks', async (request, reply) => {
212
+ const auth = resolveEnrollmentAuth(request, store());
213
+ if (!auth.ok) {
214
+ return (0, execution_authority_http_1.sendContractError)(reply, auth.contract, (0, execution_authority_http_1.statusForContract)(auth.contract));
215
+ }
216
+ const decks = [];
217
+ for (const id of auth.enrollment.allowedDeckIds) {
218
+ const deck = await fastify.db.getDeck(id);
219
+ if (deck) {
220
+ decks.push({ id: deck.id, name: deck.name });
221
+ }
222
+ }
223
+ const stale = revalidateActiveEnrollment(store(), auth.enrollmentId);
224
+ if (stale) {
225
+ return (0, execution_authority_http_1.sendContractError)(reply, stale, (0, execution_authority_http_1.statusForContract)(stale));
226
+ }
227
+ return { ok: true, data: { decks } };
228
+ });
229
+ fastify.get('/decks/:deckId/playbooks', async (request, reply) => {
230
+ const auth = resolveEnrollmentAuth(request, store());
231
+ if (!auth.ok) {
232
+ return (0, execution_authority_http_1.sendContractError)(reply, auth.contract, (0, execution_authority_http_1.statusForContract)(auth.contract));
233
+ }
234
+ const { deckId } = request.params;
235
+ if ((0, invalid_deck_id_path_segment_1.invalidDeckIdPathSegment)(deckId)) {
236
+ const badSegment = {
237
+ ok: false,
238
+ error_code: 'INVALID_MINT_REQUEST',
239
+ message: 'deckId must be a single path segment',
240
+ correlation: { deckId },
241
+ };
242
+ return (0, execution_authority_http_1.sendContractError)(reply, badSegment, (0, execution_authority_http_1.statusForContract)(badSegment));
243
+ }
244
+ if (!auth.enrollment.allowedDeckIds.includes(deckId)) {
245
+ return (0, execution_authority_http_1.sendContractError)(reply, deckNotPermittedError(auth.enrollmentId, deckId));
246
+ }
247
+ // Fail closed for deleted-but-still-allowed decks (distinct from not-in-allowedDeckIds).
248
+ // Sibling GET /decks omits missing ids from the list; path-param discovery must not.
249
+ if (!(await fastify.db.hasDeck(deckId))) {
250
+ return (0, execution_authority_http_1.sendContractError)(reply, deckNotFoundError(auth.enrollmentId, deckId));
251
+ }
252
+ const playbooks = await fastify.playbookManager.listSummariesForDeck(deckId);
253
+ const stale = revalidateActiveEnrollment(store(), auth.enrollmentId, deckId);
254
+ if (stale) {
255
+ return (0, execution_authority_http_1.sendContractError)(reply, stale, (0, execution_authority_http_1.statusForContract)(stale));
256
+ }
257
+ return { ok: true, data: playbooks };
258
+ });
259
+ fastify.post('/authorities', async (request, reply) => {
260
+ const auth = resolveEnrollmentAuth(request, store());
261
+ if (!auth.ok) {
262
+ return (0, execution_authority_http_1.sendContractError)(reply, auth.contract, (0, execution_authority_http_1.statusForContract)(auth.contract));
263
+ }
264
+ const { enrollmentId } = auth;
265
+ const body = (request.body ?? {});
266
+ if (body.enrollmentId && body.enrollmentId !== enrollmentId) {
267
+ return reply.status(400).send({
268
+ ok: false,
269
+ error_code: 'INVALID_MINT_REQUEST',
270
+ message: 'enrollmentId does not match bearer',
271
+ });
272
+ }
273
+ if (!body.runId?.trim() ||
274
+ !body.attemptId?.trim() ||
275
+ !body.deckId?.trim() ||
276
+ !body.idempotencyKey?.trim() ||
277
+ body.audience !== 'dealer-worker' ||
278
+ !(body.ttlMs > 0)) {
279
+ return reply.status(400).send({
280
+ ok: false,
281
+ error_code: 'INVALID_MINT_REQUEST',
282
+ message: 'runId, attemptId, deckId, audience=dealer-worker, idempotencyKey, ttlMs>0 required',
283
+ });
284
+ }
285
+ const deckId = body.deckId.trim();
286
+ // Scope check before existence so missing out-of-scope ids stay deck_not_permitted.
287
+ if (!auth.enrollment.allowedDeckIds.includes(deckId)) {
288
+ return (0, execution_authority_http_1.sendContractError)(reply, deckNotPermittedError(enrollmentId, deckId));
289
+ }
290
+ const deck = await fastify.db.getDeck(deckId);
291
+ if (!deck) {
292
+ return (0, execution_authority_http_1.sendContractError)(reply, deckNotFoundError(enrollmentId, deckId));
293
+ }
294
+ const services = deck.services ?? [];
295
+ const allowedTools = [];
296
+ const allowedServices = [];
297
+ for (const service of services) {
298
+ allowedServices.push(service.id);
299
+ const discovered = await fastify.serviceManager.discoverServiceTools(service.id, {
300
+ forAgent: true,
301
+ });
302
+ if (Array.isArray(discovered)) {
303
+ for (const tool of discovered) {
304
+ allowedTools.push({ serviceId: service.id, toolName: tool.name });
305
+ }
306
+ }
307
+ }
308
+ const narrowedTools = intersectTools(allowedTools, body.toolScopeHint);
309
+ const narrowedServiceIds = [...new Set(narrowedTools.map((t) => t.serviceId))];
310
+ // undefined hint → full deck services; explicit hint (incl. []) → services from snapshot only
311
+ const mintServices = body.toolScopeHint === undefined ? allowedServices : narrowedServiceIds;
312
+ const stale = revalidateActiveEnrollment(store(), enrollmentId, deckId);
313
+ if (stale) {
314
+ return (0, execution_authority_http_1.sendContractError)(reply, stale, (0, execution_authority_http_1.statusForContract)(stale));
315
+ }
316
+ const result = store().mintAuthority({
317
+ enrollmentId,
318
+ runId: body.runId.trim(),
319
+ attemptId: body.attemptId.trim(),
320
+ deckId,
321
+ audience: 'dealer-worker',
322
+ idempotencyKey: body.idempotencyKey.trim(),
323
+ allowedServices: mintServices,
324
+ allowedTools: narrowedTools,
325
+ ttlMs: body.ttlMs,
326
+ });
327
+ if (!result.ok) {
328
+ return (0, execution_authority_http_1.sendContractError)(reply, result, (0, execution_authority_http_1.statusForContract)(result));
329
+ }
330
+ return { ok: true, data: result.data };
331
+ });
332
+ fastify.get('/authorities/:id', async (request, reply) => {
333
+ let principal;
334
+ try {
335
+ principal = await requireEnrollmentOrTrustedWriter(request, store());
336
+ }
337
+ catch (error) {
338
+ if (error instanceof EnrollmentAuthError) {
339
+ return (0, execution_authority_http_1.sendContractError)(reply, error.contract, (0, execution_authority_http_1.statusForContract)(error.contract));
340
+ }
341
+ throw error;
342
+ }
343
+ const peeked = store().peekAuthority(request.params.id);
344
+ if (!peeked ||
345
+ (principal.kind === 'enrollment' && peeked.enrollmentId !== principal.enrollmentId)) {
346
+ return (0, execution_authority_http_1.sendContractError)(reply, {
347
+ ok: false,
348
+ error_code: 'AUTHORITY_UNKNOWN',
349
+ message: 'Unknown authority',
350
+ correlation: { authorityId: request.params.id },
351
+ }, 404);
352
+ }
353
+ const result = store().inspectAuthority(request.params.id);
354
+ if (!result.ok) {
355
+ return (0, execution_authority_http_1.sendContractError)(reply, result, (0, execution_authority_http_1.statusForContract)(result));
356
+ }
357
+ return { ok: true, data: result.data };
358
+ });
359
+ fastify.post('/authorities/:id/revoke', async (request, reply) => {
360
+ let principal;
361
+ try {
362
+ principal = await requireEnrollmentOrTrustedWriter(request, store());
363
+ }
364
+ catch (error) {
365
+ if (error instanceof EnrollmentAuthError) {
366
+ return (0, execution_authority_http_1.sendContractError)(reply, error.contract, (0, execution_authority_http_1.statusForContract)(error.contract));
367
+ }
368
+ throw error;
369
+ }
370
+ const peeked = store().peekAuthority(request.params.id);
371
+ if (!peeked ||
372
+ (principal.kind === 'enrollment' && peeked.enrollmentId !== principal.enrollmentId)) {
373
+ return (0, execution_authority_http_1.sendContractError)(reply, {
374
+ ok: false,
375
+ error_code: 'AUTHORITY_UNKNOWN',
376
+ message: 'Unknown authority',
377
+ correlation: { authorityId: request.params.id },
378
+ }, 404);
379
+ }
380
+ const result = store().revokeAuthority(request.params.id);
381
+ if (!result.ok) {
382
+ return (0, execution_authority_http_1.sendContractError)(reply, result, (0, execution_authority_http_1.statusForContract)(result));
383
+ }
384
+ return { ok: true, data: result.data };
385
+ });
386
+ fastify.get('/audit', async (request, reply) => {
387
+ let principal;
388
+ try {
389
+ principal = await requireEnrollmentOrTrustedWriter(request, store());
390
+ }
391
+ catch (error) {
392
+ if (error instanceof EnrollmentAuthError) {
393
+ return (0, execution_authority_http_1.sendContractError)(reply, error.contract, (0, execution_authority_http_1.statusForContract)(error.contract));
394
+ }
395
+ throw error;
396
+ }
397
+ const q = request.query;
398
+ if (principal.kind === 'enrollment') {
399
+ if (q.enrollmentId && q.enrollmentId !== principal.enrollmentId) {
400
+ return (0, execution_authority_http_1.sendContractError)(reply, {
401
+ ok: false,
402
+ error_code: 'RESOURCE_OUT_OF_SCOPE',
403
+ message: 'Cannot query audit for another enrollment',
404
+ correlation: { enrollmentId: principal.enrollmentId },
405
+ }, 403);
406
+ }
407
+ if (q.authorityId) {
408
+ const owned = store().peekAuthority(q.authorityId);
409
+ if (!owned || owned.enrollmentId !== principal.enrollmentId) {
410
+ return (0, execution_authority_http_1.sendContractError)(reply, {
411
+ ok: false,
412
+ error_code: 'AUTHORITY_UNKNOWN',
413
+ message: 'Unknown authority',
414
+ correlation: { authorityId: q.authorityId },
415
+ }, 404);
416
+ }
417
+ }
418
+ }
419
+ const events = store().listAuditEvents({
420
+ runId: q.runId,
421
+ attemptId: q.attemptId,
422
+ authorityId: q.authorityId,
423
+ enrollmentId: principal.kind === 'enrollment' ? principal.enrollmentId : q.enrollmentId,
424
+ requestId: q.requestId,
425
+ });
426
+ return { ok: true, data: { events } };
427
+ });
428
+ fastify.post('/mcp/connect', async (request, reply) => {
429
+ const body = (request.body ?? {});
430
+ const token = (0, http_auth_1.parseBearerToken)(request);
431
+ const fromBearer = token ? (0, bearer_1.parseAuthorityBearer)(token) : null;
432
+ const authorityId = fromBearer?.authorityId ?? body.authorityId?.trim();
433
+ const authoritySecret = fromBearer?.secret ?? body.authoritySecret?.trim();
434
+ const audience = body.audience?.trim() || 'dealer-worker';
435
+ if (!authorityId || !authoritySecret) {
436
+ return reply.status(401).send({
437
+ ok: false,
438
+ error_code: 'AUTHORITY_SECRET_INVALID',
439
+ message: 'authorityId and authoritySecret required',
440
+ });
441
+ }
442
+ const auth = store().authenticateAuthority(authorityId, authoritySecret);
443
+ if (!auth.ok) {
444
+ return (0, execution_authority_http_1.sendContractError)(reply, auth, (0, execution_authority_http_1.statusForContract)(auth));
445
+ }
446
+ if (audience !== auth.data.audience) {
447
+ return reply.status(403).send({
448
+ ok: false,
449
+ error_code: 'AUDIENCE_MISMATCH',
450
+ message: 'Caller audience does not match authority audience',
451
+ correlation: { authorityId },
452
+ });
453
+ }
454
+ return {
455
+ ok: true,
456
+ data: {
457
+ authorityId: auth.data.authorityId,
458
+ deckId: auth.data.deckId,
459
+ audience: auth.data.audience,
460
+ runId: auth.data.runId,
461
+ attemptId: auth.data.attemptId,
462
+ allowedServices: auth.data.allowedServices,
463
+ allowedTools: auth.data.allowedTools,
464
+ expiresAt: auth.data.expiresAt,
465
+ status: auth.data.status,
466
+ },
467
+ };
468
+ });
469
+ /** Authorize one tool call under execution authority (MCP / internal). */
470
+ fastify.post('/authorize-call', async (request, reply) => {
471
+ const body = (request.body ?? {});
472
+ if (!body.authorityId ||
473
+ !body.authoritySecret ||
474
+ !body.audience ||
475
+ !body.serviceId ||
476
+ !body.toolName) {
477
+ return reply.status(400).send({
478
+ ok: false,
479
+ error_code: 'INVALID_MINT_REQUEST',
480
+ message: 'authorityId, authoritySecret, audience, serviceId, toolName required',
481
+ });
482
+ }
483
+ const result = store().invokeAuthorizedCall({
484
+ authorityId: body.authorityId,
485
+ authoritySecret: body.authoritySecret,
486
+ audience: body.audience,
487
+ serviceId: body.serviceId,
488
+ toolName: body.toolName,
489
+ requiresInteraction: body.requiresInteraction,
490
+ });
491
+ if (!result.ok) {
492
+ return (0, execution_authority_http_1.sendContractError)(reply, result, (0, execution_authority_http_1.statusForContract)(result));
493
+ }
494
+ return { ok: true, data: result.data };
495
+ });
496
+ };
497
+ exports.registerExecutionAuthorityRoutes = registerExecutionAuthorityRoutes;
498
+ //# sourceMappingURL=execution-authority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-authority.js","sourceRoot":"","sources":["../../src/routes/execution-authority.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { BindingEntry } from '@agent-deck/shared';
2
+ /** Write workspace-keyed binding for terminal status line; prune orphaned MCP session UUID keys. */
3
+ export declare function upsertWorkspaceDisplayBinding(workspaceRoot: string, entry: BindingEntry): Promise<void>;
4
+ export declare function readBindingForDisplay(options: {
5
+ sessionId?: string;
6
+ workspaceRoot: string;
7
+ }): Promise<BindingEntry | null>;
8
+ export declare function readBindingForWorkspace(workspaceRoot: string): Promise<BindingEntry | null>;
9
+ //# sourceMappingURL=bindings-sidecar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bindings-sidecar.d.ts","sourceRoot":"","sources":["../../src/scope/bindings-sidecar.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,YAAY,EASb,MAAM,oBAAoB,CAAC;AAoC5B,oGAAoG;AACpG,wBAAsB,6BAA6B,CACjD,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAG/B;AAED,wBAAsB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAGjG"}
@@ -0,0 +1,57 @@
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.upsertWorkspaceDisplayBinding = upsertWorkspaceDisplayBinding;
7
+ exports.readBindingForDisplay = readBindingForDisplay;
8
+ exports.readBindingForWorkspace = readBindingForWorkspace;
9
+ const promises_1 = __importDefault(require("node:fs/promises"));
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ const shared_1 = require("@agent-deck/shared");
12
+ async function readBindingsFile() {
13
+ const merged = {};
14
+ for (const filePath of (0, shared_1.listBindingsFileCandidates)()) {
15
+ try {
16
+ const raw = await promises_1.default.readFile(filePath, 'utf8');
17
+ const parsed = shared_1.BindingsFileSchema.safeParse(JSON.parse(raw));
18
+ if (parsed.success) {
19
+ Object.assign(merged, parsed.data);
20
+ }
21
+ }
22
+ catch (error) {
23
+ if (error.code !== 'ENOENT') {
24
+ throw error;
25
+ }
26
+ }
27
+ }
28
+ return merged;
29
+ }
30
+ async function writeBindingsFile(bindings) {
31
+ const filePath = (0, shared_1.resolveBindingsFilePath)();
32
+ await promises_1.default.mkdir(node_path_1.default.dirname(filePath), { recursive: true });
33
+ await promises_1.default.writeFile(filePath, `${JSON.stringify(bindings, null, 2)}\n`, 'utf8');
34
+ }
35
+ function pruneLegacySessionKeys(bindings) {
36
+ for (const key of Object.keys(bindings)) {
37
+ if ((0, shared_1.isBindingSidecarSessionKey)(key)) {
38
+ delete bindings[key];
39
+ }
40
+ }
41
+ }
42
+ /** Write workspace-keyed binding for terminal status line; prune orphaned MCP session UUID keys. */
43
+ async function upsertWorkspaceDisplayBinding(workspaceRoot, entry) {
44
+ const bindings = await readBindingsFile();
45
+ bindings[(0, shared_1.normalizeWorkspaceRoot)(workspaceRoot)] = entry;
46
+ pruneLegacySessionKeys(bindings);
47
+ await writeBindingsFile(bindings);
48
+ }
49
+ async function readBindingForDisplay(options) {
50
+ const bindings = await readBindingsFile();
51
+ return (0, shared_1.resolveBindingEntry)(bindings, options);
52
+ }
53
+ async function readBindingForWorkspace(workspaceRoot) {
54
+ const bindings = await readBindingsFile();
55
+ return (0, shared_1.lookupWorkspaceBinding)(bindings, workspaceRoot);
56
+ }
57
+ //# sourceMappingURL=bindings-sidecar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bindings-sidecar.js","sourceRoot":"","sources":["../../src/scope/bindings-sidecar.ts"],"names":[],"mappings":";;;;;AAiDA,sEAQC;AAED,sDAMC;AAED,0DAGC;AAtED,gEAAkC;AAClC,0DAA6B;AAC7B,+CAU4B;AAE5B,KAAK,UAAU,gBAAgB;IAC7B,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,KAAK,MAAM,QAAQ,IAAI,IAAA,mCAA0B,GAAE,EAAE,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,2BAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,QAAsB;IACrD,MAAM,QAAQ,GAAG,IAAA,gCAAuB,GAAE,CAAC;IAC3C,MAAM,kBAAE,CAAC,KAAK,CAAC,mBAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,sBAAsB,CAAC,QAAsB;IACpD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,IAAI,IAAA,mCAA0B,EAAC,GAAG,CAAC,EAAE,CAAC;YACpC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC;AAED,oGAAoG;AAC7F,KAAK,UAAU,6BAA6B,CACjD,aAAqB,EACrB,KAAmB;IAEnB,MAAM,QAAQ,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC1C,QAAQ,CAAC,IAAA,+BAAsB,EAAC,aAAa,CAAC,CAAC,GAAG,KAAK,CAAC;IACxD,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AACpC,CAAC;AAEM,KAAK,UAAU,qBAAqB,CAAC,OAG3C;IACC,MAAM,QAAQ,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC1C,OAAO,IAAA,4BAAmB,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAEM,KAAK,UAAU,uBAAuB,CAAC,aAAqB;IACjE,MAAM,QAAQ,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC1C,OAAO,IAAA,+BAAsB,EAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { RepoDeckManifest } from '@agent-deck/shared';
2
+ export declare class RepoDeckManifestError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ /** Lightweight parser — avoids a YAML dependency for the single-field MVP manifest. */
6
+ export declare function parseRepoDeckManifest(content: string): RepoDeckManifest;
7
+ export declare function repoDeckManifestFilePath(workspaceRoot: string): string;
8
+ export declare function loadRepoDeckManifest(workspaceRoot: string): Promise<RepoDeckManifest | null>;
9
+ export declare function formatRepoDeckManifest(deckId: string, name?: string): string;
10
+ //# sourceMappingURL=repo-deck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-deck.d.ts","sourceRoot":"","sources":["../../src/scope/repo-deck.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAmD,MAAM,oBAAoB,CAAC;AAEvG,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED,uFAAuF;AACvF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAavE;AAED,wBAAgB,wBAAwB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAsB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAiBlG;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAS5E"}