@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
@@ -1,8 +1,10 @@
1
1
  import { FastifyRequest } from 'fastify';
2
2
  import { DatabaseManager } from '../models/database';
3
3
  export declare class AgentDeckContextError extends Error {
4
- constructor(message: string);
4
+ readonly errorCode?: string | undefined;
5
+ constructor(message: string, errorCode?: string | undefined);
5
6
  }
6
- /** Resolve which deck an agent request is scoped to (session deck id header only). */
7
+ /** Resolve bound deck from authenticated runtime session (PRD C3). */
7
8
  export declare function resolveAgentDeckId(request: FastifyRequest, db: DatabaseManager): Promise<string>;
9
+ export declare function resolveAgentMode(request: FastifyRequest): Promise<'normal' | 'agent-admin'>;
8
10
  //# sourceMappingURL=agent-deck-context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-deck-context.d.ts","sourceRoot":"","sources":["../../src/lib/agent-deck-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAOD,sFAAsF;AACtF,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,cAAc,EACvB,EAAE,EAAE,eAAe,GAClB,OAAO,CAAC,MAAM,CAAC,CAajB"}
1
+ {"version":3,"file":"agent-deck-context.d.ts","sourceRoot":"","sources":["../../src/lib/agent-deck-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,qBAAa,qBAAsB,SAAQ,KAAK;aAG5B,SAAS,CAAC,EAAE,MAAM;gBADlC,OAAO,EAAE,MAAM,EACC,SAAS,CAAC,EAAE,MAAM,YAAA;CAKrC;AAOD,sEAAsE;AACtE,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,cAAc,EACvB,EAAE,EAAE,eAAe,GAClB,OAAO,CAAC,MAAM,CAAC,CA4CjB;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,QAAQ,GAAG,aAAa,CAAC,CAOnC"}
@@ -2,10 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AgentDeckContextError = void 0;
4
4
  exports.resolveAgentDeckId = resolveAgentDeckId;
5
+ exports.resolveAgentMode = resolveAgentMode;
5
6
  const shared_1 = require("@agent-deck/shared");
7
+ const auth_1 = require("../trusted-session/auth");
6
8
  class AgentDeckContextError extends Error {
7
- constructor(message) {
9
+ errorCode;
10
+ constructor(message, errorCode) {
8
11
  super(message);
12
+ this.errorCode = errorCode;
9
13
  this.name = 'AgentDeckContextError';
10
14
  }
11
15
  }
@@ -14,16 +18,39 @@ function headerValue(request, name) {
14
18
  const value = request.headers[name];
15
19
  return typeof value === 'string' && value.trim() ? value.trim() : undefined;
16
20
  }
17
- /** Resolve which deck an agent request is scoped to (session deck id header only). */
21
+ /** Resolve bound deck from authenticated runtime session (PRD C3). */
18
22
  async function resolveAgentDeckId(request, db) {
19
- const deckIdHeader = headerValue(request, shared_1.AGENT_DECK_DECK_ID_HEADER);
20
- if (!deckIdHeader) {
21
- throw new AgentDeckContextError('No bound deck — call bind_workspace with deckId (use get_decks to list decks) or switch_bound_deck');
23
+ const sessionId = headerValue(request, shared_1.AGENT_DECK_SESSION_HEADER);
24
+ if (!sessionId) {
25
+ throw new AgentDeckContextError((0, shared_1.trustedSessionError)('GRANT_REQUIRED', 'No valid workspace grant').error, 'GRANT_REQUIRED');
22
26
  }
23
- const deck = await db.getDeck(deckIdHeader);
27
+ const store = request.server.trustedSessionStore;
28
+ const row = store.getRuntimeSessionRow(sessionId);
29
+ if (!row) {
30
+ throw new AgentDeckContextError((0, shared_1.trustedSessionError)('SESSION_INVALID', 'Runtime session absent or expired').error, 'SESSION_INVALID');
31
+ }
32
+ if (row.revoked_at) {
33
+ throw new AgentDeckContextError((0, shared_1.trustedSessionError)('SESSION_REVOKED', 'Grant rotation or explicit revocation ended the session').error, 'SESSION_REVOKED');
34
+ }
35
+ if (Date.parse(row.expires_at) <= Date.now()) {
36
+ throw new AgentDeckContextError((0, shared_1.trustedSessionError)('SESSION_INVALID', 'Runtime session absent or expired').error, 'SESSION_INVALID');
37
+ }
38
+ const session = store.touchRuntimeSession(sessionId);
39
+ if (!session) {
40
+ throw new AgentDeckContextError((0, shared_1.trustedSessionError)('SESSION_INVALID', 'Runtime session absent or expired').error, 'SESSION_INVALID');
41
+ }
42
+ const deck = await db.getDeck(session.deckId);
24
43
  if (!deck) {
25
- throw new AgentDeckContextError(`Deck not found: ${deckIdHeader}`);
44
+ throw new auth_1.TrustedAuthError('GRANT_REQUIRED', 'No valid workspace grant');
45
+ }
46
+ return session.deckId;
47
+ }
48
+ async function resolveAgentMode(request) {
49
+ const sessionId = headerValue(request, shared_1.AGENT_DECK_SESSION_HEADER);
50
+ if (!sessionId) {
51
+ return 'normal';
26
52
  }
27
- return deckIdHeader;
53
+ const row = request.server.trustedSessionStore.getRuntimeSessionRow(sessionId);
54
+ return row?.mode ?? 'normal';
28
55
  }
29
56
  //# sourceMappingURL=agent-deck-context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-deck-context.js","sourceRoot":"","sources":["../../src/lib/agent-deck-context.ts"],"names":[],"mappings":";;;AAiBA,gDAgBC;AAhCD,+CAA+D;AAG/D,MAAa,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AALD,sDAKC;AAED,SAAS,WAAW,CAAC,OAAuB,EAAE,IAAY;IACxD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9E,CAAC;AAED,sFAAsF;AAC/E,KAAK,UAAU,kBAAkB,CACtC,OAAuB,EACvB,EAAmB;IAEnB,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,EAAE,kCAAyB,CAAC,CAAC;IACrE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,qBAAqB,CAC7B,oGAAoG,CACrG,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC5C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,qBAAqB,CAAC,mBAAmB,YAAY,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC"}
1
+ {"version":3,"file":"agent-deck-context.js","sourceRoot":"","sources":["../../src/lib/agent-deck-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { TrustedSessionErrorCode } from '@agent-deck/shared';
2
+ export declare class BackendApiError extends Error {
3
+ readonly status: number;
4
+ readonly errorCode?: TrustedSessionErrorCode | undefined;
5
+ constructor(message: string, status: number, errorCode?: TrustedSessionErrorCode | undefined);
6
+ }
7
+ export declare function parseBackendErrorBody(text: string, status: number): BackendApiError;
8
+ //# sourceMappingURL=backend-api-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-api-error.d.ts","sourceRoot":"","sources":["../../src/lib/backend-api-error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAElE,qBAAa,eAAgB,SAAQ,KAAK;aAGtB,MAAM,EAAE,MAAM;aACd,SAAS,CAAC,EAAE,uBAAuB;gBAFnD,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,uBAAuB,YAAA;CAKtD;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe,CAmBnF"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BackendApiError = void 0;
4
+ exports.parseBackendErrorBody = parseBackendErrorBody;
5
+ class BackendApiError extends Error {
6
+ status;
7
+ errorCode;
8
+ constructor(message, status, errorCode) {
9
+ super(message);
10
+ this.status = status;
11
+ this.errorCode = errorCode;
12
+ this.name = 'BackendApiError';
13
+ }
14
+ }
15
+ exports.BackendApiError = BackendApiError;
16
+ function parseBackendErrorBody(text, status) {
17
+ let message = `Backend API error: ${status}`;
18
+ let errorCode;
19
+ try {
20
+ const body = JSON.parse(text);
21
+ if (body.error) {
22
+ message = String(body.error);
23
+ }
24
+ if (body.error_code) {
25
+ errorCode = body.error_code;
26
+ }
27
+ }
28
+ catch {
29
+ if (text.trim()) {
30
+ message = text.trim();
31
+ }
32
+ }
33
+ return new BackendApiError(message, status, errorCode);
34
+ }
35
+ //# sourceMappingURL=backend-api-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-api-error.js","sourceRoot":"","sources":["../../src/lib/backend-api-error.ts"],"names":[],"mappings":";;;AAaA,sDAmBC;AA9BD,MAAa,eAAgB,SAAQ,KAAK;IAGtB;IACA;IAHlB,YACE,OAAe,EACC,MAAc,EACd,SAAmC;QAEnD,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,WAAM,GAAN,MAAM,CAAQ;QACd,cAAS,GAAT,SAAS,CAA0B;QAGnD,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AATD,0CASC;AAED,SAAgB,qBAAqB,CAAC,IAAY,EAAE,MAAc;IAChE,IAAI,OAAO,GAAG,sBAAsB,MAAM,EAAE,CAAC;IAC7C,IAAI,SAA8C,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA6D,CAAC;QAC1F,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;QAC9B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAChB,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AACzD,CAAC"}
@@ -1,15 +1,20 @@
1
1
  import { FastifyRequest } from 'fastify';
2
2
  import { DatabaseManager } from '../models/database';
3
+ import { trustedSessionError, type TrustedSessionErrorCode } from '@agent-deck/shared';
3
4
  export declare class BoundDeckScopeError extends Error {
4
- constructor(message?: string);
5
+ readonly errorCode: TrustedSessionErrorCode;
6
+ constructor(message?: string, errorCode?: TrustedSessionErrorCode);
5
7
  }
6
8
  /** Agent clients may only mutate the workspace-bound deck; dashboard may use any deck id. */
7
9
  export declare function requireBoundDeckScope(request: FastifyRequest, db: DatabaseManager, deckId: string): Promise<string>;
8
10
  export declare function requireServiceOnBoundDeck(request: FastifyRequest, db: DatabaseManager, serviceId: string): Promise<void>;
11
+ export declare function requireCredentialOnBoundDeck(request: FastifyRequest, db: DatabaseManager, credentialId: string): Promise<void>;
9
12
  export declare function requirePlaybookOnBoundDeck(request: FastifyRequest, db: DatabaseManager, playbookId: string): Promise<void>;
10
13
  declare function boundDeckScopeResponse(error: unknown): {
11
14
  status: number;
12
15
  message: string;
16
+ error_code?: TrustedSessionErrorCode;
17
+ body?: ReturnType<typeof trustedSessionError>;
13
18
  };
14
19
  export { boundDeckScopeResponse };
15
20
  //# sourceMappingURL=bound-deck-scope.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bound-deck-scope.d.ts","sourceRoot":"","sources":["../../src/lib/bound-deck-scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAIrD,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,SAAqD;CAIzE;AAED,6FAA6F;AAC7F,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,cAAc,EACvB,EAAE,EAAE,eAAe,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAajB;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,cAAc,EACvB,EAAE,EAAE,eAAe,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,cAAc,EACvB,EAAE,EAAE,eAAe,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAef;AAED,iBAAS,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAWnF;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
1
+ {"version":3,"file":"bound-deck-scope.d.ts","sourceRoot":"","sources":["../../src/lib/bound-deck-scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,OAAO,EAAE,mBAAmB,EAAE,KAAK,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAEvF,qBAAa,mBAAoB,SAAQ,KAAK;aAG1B,SAAS,EAAE,uBAAuB;gBADlD,OAAO,SAAuC,EAC9B,SAAS,GAAE,uBAAiD;CAK/E;AAED,6FAA6F;AAC7F,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,cAAc,EACvB,EAAE,EAAE,eAAe,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAajB;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,cAAc,EACvB,EAAE,EAAE,eAAe,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,cAAc,EACvB,EAAE,EAAE,eAAe,EACnB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,cAAc,EACvB,EAAE,EAAE,eAAe,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAef;AAED,iBAAS,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,IAAI,CAAC,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;CAC/C,CAgBA;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
@@ -3,13 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BoundDeckScopeError = void 0;
4
4
  exports.requireBoundDeckScope = requireBoundDeckScope;
5
5
  exports.requireServiceOnBoundDeck = requireServiceOnBoundDeck;
6
+ exports.requireCredentialOnBoundDeck = requireCredentialOnBoundDeck;
6
7
  exports.requirePlaybookOnBoundDeck = requirePlaybookOnBoundDeck;
7
8
  exports.boundDeckScopeResponse = boundDeckScopeResponse;
8
9
  const agent_deck_context_1 = require("./agent-deck-context");
9
10
  const client_scope_1 = require("./client-scope");
11
+ const shared_1 = require("@agent-deck/shared");
10
12
  class BoundDeckScopeError extends Error {
11
- constructor(message = 'This operation is only allowed on the bound deck') {
13
+ errorCode;
14
+ constructor(message = 'Resource is outside the bound deck', errorCode = 'RESOURCE_OUT_OF_SCOPE') {
12
15
  super(message);
16
+ this.errorCode = errorCode;
13
17
  this.name = 'BoundDeckScopeError';
14
18
  }
15
19
  }
@@ -39,6 +43,16 @@ async function requireServiceOnBoundDeck(request, db, serviceId) {
39
43
  throw new BoundDeckScopeError('Service is not on the bound deck');
40
44
  }
41
45
  }
46
+ async function requireCredentialOnBoundDeck(request, db, credentialId) {
47
+ if ((0, client_scope_1.isDashboardClient)(request)) {
48
+ return;
49
+ }
50
+ const deckId = await (0, agent_deck_context_1.resolveAgentDeckId)(request, db);
51
+ const onDeck = await db.getDeck(deckId).then((deck) => deck?.credentials?.some((credential) => credential.id === credentialId) ?? false);
52
+ if (!onDeck) {
53
+ throw new BoundDeckScopeError('Credential is not on the bound deck');
54
+ }
55
+ }
42
56
  async function requirePlaybookOnBoundDeck(request, db, playbookId) {
43
57
  if ((0, client_scope_1.isDashboardClient)(request)) {
44
58
  return;
@@ -55,7 +69,12 @@ async function requirePlaybookOnBoundDeck(request, db, playbookId) {
55
69
  }
56
70
  function boundDeckScopeResponse(error) {
57
71
  if (error instanceof BoundDeckScopeError) {
58
- return { status: 403, message: error.message };
72
+ return {
73
+ status: 403,
74
+ message: error.message,
75
+ error_code: error.errorCode,
76
+ body: (0, shared_1.trustedSessionError)(error.errorCode, error.message),
77
+ };
59
78
  }
60
79
  if (error instanceof agent_deck_context_1.AgentDeckContextError) {
61
80
  return { status: 400, message: error.message };
@@ -1 +1 @@
1
- {"version":3,"file":"bound-deck-scope.js","sourceRoot":"","sources":["../../src/lib/bound-deck-scope.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bound-deck-scope.js","sourceRoot":"","sources":["../../src/lib/bound-deck-scope.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"client-scope.d.ts","sourceRoot":"","sources":["../../src/lib/client-scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAIL,IAAI,EACJ,OAAO,EACR,MAAM,oBAAoB,CAAC;AAG5B,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,OAAO,CAAC;AAEhD,sEAAsE;AACtE,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAWjE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAKrD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,WAAW,CAMnE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAElE;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAIpE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAKhE;AAED,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,SAAuD;CAI3E;AAED,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,SAA4D;CAIhF;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAC5B,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,WAAW,EAClB,aAAa,CAAC,EAAE,MAAM,GACrB,IAAI,CASN;AAED,qCAAqC;AACrC,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,WAAW,EAClB,aAAa,CAAC,EAAE,MAAM,GACrB,IAAI,CAEN"}
1
+ {"version":3,"file":"client-scope.d.ts","sourceRoot":"","sources":["../../src/lib/client-scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAGL,IAAI,EACJ,OAAO,EACR,MAAM,oBAAoB,CAAC;AAI5B,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,OAAO,CAAC;AAEhD,sEAAsE;AACtE,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAWjE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAKrD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,WAAW,CAKnE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAElE;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAIpE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAKhE;AAED,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,SAAuD;CAI3E;AAED,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,SAA4D;CAIhF;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAC5B,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,WAAW,EAClB,aAAa,CAAC,EAAE,MAAM,GACrB,IAAI,CASN;AAED,qCAAqC;AACrC,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,WAAW,EAClB,aAAa,CAAC,EAAE,MAAM,GACrB,IAAI,CAEN"}
@@ -11,6 +11,7 @@ exports.applyDeckScope = applyDeckScope;
11
11
  exports.applyDeckCredentialScope = applyDeckCredentialScope;
12
12
  const shared_1 = require("@agent-deck/shared");
13
13
  const sanitize_for_export_1 = require("../export-import/sanitize-for-export");
14
+ const dashboard_auth_1 = require("./dashboard-auth");
14
15
  /** Remove secrets from service payloads returned to agent clients. */
15
16
  function sanitizeServiceForAgent(service) {
16
17
  return {
@@ -31,14 +32,13 @@ function sanitizeDeckForAgent(deck) {
31
32
  };
32
33
  }
33
34
  function getClientScope(request) {
34
- const value = request.headers[shared_1.AGENT_DECK_CLIENT_HEADER];
35
- if (typeof value === 'string' && value.toLowerCase() === shared_1.AGENT_DECK_DASHBOARD_CLIENT) {
35
+ if ((0, dashboard_auth_1.isDashboardAuthenticated)(request)) {
36
36
  return 'dashboard';
37
37
  }
38
38
  return 'agent';
39
39
  }
40
40
  function isDashboardClient(request) {
41
- return getClientScope(request) === 'dashboard';
41
+ return (0, dashboard_auth_1.isDashboardAuthenticated)(request);
42
42
  }
43
43
  function requireDashboardClient(request) {
44
44
  if (!isDashboardClient(request)) {
@@ -1 +1 @@
1
- {"version":3,"file":"client-scope.js","sourceRoot":"","sources":["../../src/lib/client-scope.ts"],"names":[],"mappings":";;;AAaA,0DAWC;AAED,oDAKC;AAED,wCAMC;AAED,8CAEC;AAED,wDAIC;AAED,gDAKC;AAiBD,wCAaC;AAGD,4DAMC;AA9FD,+CAM4B;AAC5B,8EAAgF;AAIhF,sEAAsE;AACtE,SAAgB,uBAAuB,CAAC,OAAgB;IACtD,OAAO;QACL,GAAG,OAAO;QACV,iBAAiB,EAAE,SAAS;QAC5B,gBAAgB,EAAE,SAAS;QAC3B,iBAAiB,EAAE,SAAS;QAC5B,UAAU,EAAE,SAAS;QACrB,sFAAsF;QACtF,OAAO,EAAE,IAAA,8CAAwB,EAAC,OAAO,CAAC,OAAO,CAAC;QAClD,QAAQ,EAAE,SAAS;KACpB,CAAC;AACJ,CAAC;AAED,SAAgB,oBAAoB,CAAC,IAAU;IAC7C,OAAO;QACL,GAAG,IAAI;QACP,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,uBAAuB,CAAC,IAAI,EAAE;KAC5D,CAAC;AACJ,CAAC;AAED,SAAgB,cAAc,CAAC,OAAuB;IACpD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,iCAAwB,CAAC,CAAC;IACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,oCAA2B,EAAE,CAAC;QACrF,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,iBAAiB,CAAC,OAAuB;IACvD,OAAO,cAAc,CAAC,OAAO,CAAC,KAAK,WAAW,CAAC;AACjD,CAAC;AAED,SAAgB,sBAAsB,CAAC,OAAuB;IAC5D,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,kBAAkB,EAAE,CAAC;IACjC,CAAC;AACH,CAAC;AAED,SAAgB,kBAAkB,CAAC,OAAuB;IACxD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,iCAAwB,CAAC,CAAC;IACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,gCAAuB,EAAE,CAAC;QACjF,MAAM,IAAI,oBAAoB,EAAE,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAa,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,OAAO,GAAG,oDAAoD;QACxE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AALD,oDAKC;AAED,MAAa,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAO,GAAG,yDAAyD;QAC7E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AALD,gDAKC;AAED,oFAAoF;AACpF,SAAgB,cAAc,CAC5B,IAAU,EACV,KAAkB,EAClB,aAAsB;IAEtB,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,aAAa,IAAI,IAAI,CAAC,EAAE,KAAK,aAAa,EAAE,CAAC;QAC/C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,GAAG,SAAS,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;AAC1D,CAAC;AAED,qCAAqC;AACrC,SAAgB,wBAAwB,CACtC,IAAU,EACV,KAAkB,EAClB,aAAsB;IAEtB,OAAO,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;AACpD,CAAC"}
1
+ {"version":3,"file":"client-scope.js","sourceRoot":"","sources":["../../src/lib/client-scope.ts"],"names":[],"mappings":";;;AAaA,0DAWC;AAED,oDAKC;AAED,wCAKC;AAED,8CAEC;AAED,wDAIC;AAED,gDAKC;AAiBD,wCAaC;AAGD,4DAMC;AA7FD,+CAK4B;AAC5B,8EAAgF;AAChF,qDAA4D;AAI5D,sEAAsE;AACtE,SAAgB,uBAAuB,CAAC,OAAgB;IACtD,OAAO;QACL,GAAG,OAAO;QACV,iBAAiB,EAAE,SAAS;QAC5B,gBAAgB,EAAE,SAAS;QAC3B,iBAAiB,EAAE,SAAS;QAC5B,UAAU,EAAE,SAAS;QACrB,sFAAsF;QACtF,OAAO,EAAE,IAAA,8CAAwB,EAAC,OAAO,CAAC,OAAO,CAAC;QAClD,QAAQ,EAAE,SAAS;KACpB,CAAC;AACJ,CAAC;AAED,SAAgB,oBAAoB,CAAC,IAAU;IAC7C,OAAO;QACL,GAAG,IAAI;QACP,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,uBAAuB,CAAC,IAAI,EAAE;KAC5D,CAAC;AACJ,CAAC;AAED,SAAgB,cAAc,CAAC,OAAuB;IACpD,IAAI,IAAA,yCAAwB,EAAC,OAAO,CAAC,EAAE,CAAC;QACtC,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,iBAAiB,CAAC,OAAuB;IACvD,OAAO,IAAA,yCAAwB,EAAC,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED,SAAgB,sBAAsB,CAAC,OAAuB;IAC5D,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,kBAAkB,EAAE,CAAC;IACjC,CAAC;AACH,CAAC;AAED,SAAgB,kBAAkB,CAAC,OAAuB;IACxD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,iCAAwB,CAAC,CAAC;IACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,gCAAuB,EAAE,CAAC;QACjF,MAAM,IAAI,oBAAoB,EAAE,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAa,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,OAAO,GAAG,oDAAoD;QACxE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AALD,oDAKC;AAED,MAAa,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAO,GAAG,yDAAyD;QAC7E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AALD,gDAKC;AAED,oFAAoF;AACpF,SAAgB,cAAc,CAC5B,IAAU,EACV,KAAkB,EAClB,aAAsB;IAEtB,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,aAAa,IAAI,IAAI,CAAC,EAAE,KAAK,aAAa,EAAE,CAAC;QAC/C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,GAAG,SAAS,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;AAC1D,CAAC;AAED,qCAAqC;AACrC,SAAgB,wBAAwB,CACtC,IAAU,EACV,KAAkB,EAClB,aAAsB;IAEtB,OAAO,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { FastifyRequest } from 'fastify';
2
+ import { validateDashboardSessionToken } from '../trusted-session/auth';
3
+ export { validateDashboardSessionToken };
4
+ export declare function parseDashboardCookie(request: FastifyRequest): string | null;
5
+ export declare function isDashboardAuthenticated(request: FastifyRequest): boolean;
6
+ export declare function isTrustedWriterBearer(request: FastifyRequest): Promise<boolean>;
7
+ //# sourceMappingURL=dashboard-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-auth.d.ts","sourceRoot":"","sources":["../../src/lib/dashboard-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAK9C,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAGxE,OAAO,EAAE,6BAA6B,EAAE,CAAC;AAEzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAa3E;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAGzE;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAOrF"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateDashboardSessionToken = void 0;
4
+ exports.parseDashboardCookie = parseDashboardCookie;
5
+ exports.isDashboardAuthenticated = isDashboardAuthenticated;
6
+ exports.isTrustedWriterBearer = isTrustedWriterBearer;
7
+ const shared_1 = require("@agent-deck/shared");
8
+ const http_auth_1 = require("../lib/http-auth");
9
+ const auth_1 = require("../trusted-session/auth");
10
+ Object.defineProperty(exports, "validateDashboardSessionToken", { enumerable: true, get: function () { return auth_1.validateDashboardSessionToken; } });
11
+ const admin_secret_1 = require("../trusted-session/admin-secret");
12
+ function parseDashboardCookie(request) {
13
+ const cookieHeader = request.headers.cookie;
14
+ if (!cookieHeader || typeof cookieHeader !== 'string') {
15
+ return null;
16
+ }
17
+ const prefix = `${shared_1.AGENT_DECK_DASHBOARD_COOKIE}=`;
18
+ for (const part of cookieHeader.split(';')) {
19
+ const trimmed = part.trim();
20
+ if (trimmed.startsWith(prefix)) {
21
+ return decodeURIComponent(trimmed.slice(prefix.length));
22
+ }
23
+ }
24
+ return null;
25
+ }
26
+ function isDashboardAuthenticated(request) {
27
+ const token = parseDashboardCookie(request);
28
+ return token !== null && (0, auth_1.validateDashboardSessionToken)(token);
29
+ }
30
+ async function isTrustedWriterBearer(request) {
31
+ const bearer = (0, http_auth_1.parseBearerToken)(request);
32
+ if (!bearer) {
33
+ return false;
34
+ }
35
+ const expected = await (0, admin_secret_1.readAdminSecretFromEnvOrFile)();
36
+ return Boolean(expected && (0, admin_secret_1.verifyAdminSecret)(bearer, expected));
37
+ }
38
+ //# sourceMappingURL=dashboard-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-auth.js","sourceRoot":"","sources":["../../src/lib/dashboard-auth.ts"],"names":[],"mappings":";;;AAUA,oDAaC;AAED,4DAGC;AAED,sDAOC;AAnCD,+CAAiE;AAEjE,gDAAoD;AACpD,kDAAwE;AAG/D,8GAHA,oCAA6B,OAGA;AAFtC,kEAAkG;AAIlG,SAAgB,oBAAoB,CAAC,OAAuB;IAC1D,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;IAC5C,IAAI,CAAC,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,oCAA2B,GAAG,CAAC;IACjD,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,OAAO,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,wBAAwB,CAAC,OAAuB;IAC9D,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC5C,OAAO,KAAK,KAAK,IAAI,IAAI,IAAA,oCAA6B,EAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAEM,KAAK,UAAU,qBAAqB,CAAC,OAAuB;IACjE,MAAM,MAAM,GAAG,IAAA,4BAAgB,EAAC,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,IAAA,2CAA4B,GAAE,CAAC;IACtD,OAAO,OAAO,CAAC,QAAQ,IAAI,IAAA,gCAAiB,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { FastifyRequest } from 'fastify';
2
+ export declare function parseBearerToken(request: FastifyRequest | {
3
+ headers: Record<string, unknown>;
4
+ }): string | null;
5
+ //# sourceMappingURL=http-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-auth.d.ts","sourceRoot":"","sources":["../../src/lib/http-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,MAAM,GAAG,IAAI,CAM9G"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseBearerToken = parseBearerToken;
4
+ function parseBearerToken(request) {
5
+ const header = request.headers.authorization;
6
+ if (!header || typeof header !== 'string' || !header.startsWith('Bearer ')) {
7
+ return null;
8
+ }
9
+ return header.slice('Bearer '.length).trim() || null;
10
+ }
11
+ //# sourceMappingURL=http-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-auth.js","sourceRoot":"","sources":["../../src/lib/http-auth.ts"],"names":[],"mappings":";;AAEA,4CAMC;AAND,SAAgB,gBAAgB,CAAC,OAA8D;IAC7F,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;IAC7C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;AACvD,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { FastifyReply, FastifyRequest } from 'fastify';
2
+ import { type TrustedSessionErrorCode } from '@agent-deck/shared';
3
+ import type { DatabaseManager } from '../models/database';
4
+ export declare class RoutePolicyError extends Error {
5
+ readonly code: TrustedSessionErrorCode;
6
+ constructor(code: TrustedSessionErrorCode, message: string);
7
+ }
8
+ export declare function sendRoutePolicyError(reply: FastifyReply, error: RoutePolicyError): void;
9
+ export declare function requireDashboard(request: FastifyRequest): void;
10
+ export declare function requireAgentBoundDeck(request: FastifyRequest, db: DatabaseManager): Promise<string>;
11
+ export declare function requireAgentAdmin(request: FastifyRequest): void;
12
+ export declare function getBoundDeckServices(request: FastifyRequest, db: DatabaseManager): Promise<any[]>;
13
+ //# sourceMappingURL=route-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-policy.d.ts","sourceRoot":"","sources":["../../src/lib/route-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE5D,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,oBAAoB,CAAC;AAI5B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,qBAAa,gBAAiB,SAAQ,KAAK;aAEvB,IAAI,EAAE,uBAAuB;gBAA7B,IAAI,EAAE,uBAAuB,EAC7C,OAAO,EAAE,MAAM;CAKlB;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAEvF;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAI9D;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,cAAc,EACvB,EAAE,EAAE,eAAe,GAClB,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAU/D;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,cAAc,EACvB,EAAE,EAAE,eAAe,kBAQpB"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RoutePolicyError = void 0;
4
+ exports.sendRoutePolicyError = sendRoutePolicyError;
5
+ exports.requireDashboard = requireDashboard;
6
+ exports.requireAgentBoundDeck = requireAgentBoundDeck;
7
+ exports.requireAgentAdmin = requireAgentAdmin;
8
+ exports.getBoundDeckServices = getBoundDeckServices;
9
+ const shared_1 = require("@agent-deck/shared");
10
+ const agent_deck_context_1 = require("./agent-deck-context");
11
+ const client_scope_1 = require("./client-scope");
12
+ class RoutePolicyError extends Error {
13
+ code;
14
+ constructor(code, message) {
15
+ super(message);
16
+ this.code = code;
17
+ this.name = 'RoutePolicyError';
18
+ }
19
+ }
20
+ exports.RoutePolicyError = RoutePolicyError;
21
+ function sendRoutePolicyError(reply, error) {
22
+ reply.status((0, shared_1.httpStatusForTrustedError)(error.code)).send((0, shared_1.trustedSessionError)(error.code, error.message));
23
+ }
24
+ function requireDashboard(request) {
25
+ if (!(0, client_scope_1.isDashboardClient)(request)) {
26
+ throw new RoutePolicyError('DASHBOARD_REQUIRED', 'Dashboard authentication required');
27
+ }
28
+ }
29
+ async function requireAgentBoundDeck(request, db) {
30
+ return (0, agent_deck_context_1.resolveAgentDeckId)(request, db);
31
+ }
32
+ function requireAgentAdmin(request) {
33
+ const sessionId = request.headers['x-agent-deck-session-id'];
34
+ if (typeof sessionId !== 'string' || !sessionId.trim()) {
35
+ throw new RoutePolicyError('GRANT_REQUIRED', 'No valid workspace grant');
36
+ }
37
+ const session = request.server.trustedSessionStore.touchRuntimeSession(sessionId.trim());
38
+ if (!session || session.mode !== 'agent-admin') {
39
+ throw new RoutePolicyError('ADMIN_REQUIRED', 'Deck-admin elevation is required');
40
+ }
41
+ }
42
+ async function getBoundDeckServices(request, db) {
43
+ const deckId = await requireAgentBoundDeck(request, db);
44
+ const deck = await db.getDeck(deckId);
45
+ if (!deck) {
46
+ throw new RoutePolicyError('GRANT_REQUIRED', 'No valid workspace grant');
47
+ }
48
+ return deck.services ?? [];
49
+ }
50
+ //# sourceMappingURL=route-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-policy.js","sourceRoot":"","sources":["../../src/lib/route-policy.ts"],"names":[],"mappings":";;;AAsBA,oDAEC;AAED,4CAIC;AAED,sDAKC;AAED,8CAUC;AAED,oDAUC;AA3DD,+CAI4B;AAE5B,6DAA0D;AAC1D,iDAAmD;AAGnD,MAAa,gBAAiB,SAAQ,KAAK;IAEvB;IADlB,YACkB,IAA6B,EAC7C,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAyB;QAI7C,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AARD,4CAQC;AAED,SAAgB,oBAAoB,CAAC,KAAmB,EAAE,KAAuB;IAC/E,KAAK,CAAC,MAAM,CAAC,IAAA,kCAAyB,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAA,4BAAmB,EAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAC3G,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAAuB;IACtD,IAAI,CAAC,IAAA,gCAAiB,EAAC,OAAO,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,gBAAgB,CAAC,oBAAoB,EAAE,mCAAmC,CAAC,CAAC;IACxF,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,qBAAqB,CACzC,OAAuB,EACvB,EAAmB;IAEnB,OAAO,IAAA,uCAAkB,EAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,SAAgB,iBAAiB,CAAC,OAAuB;IACvD,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAC7D,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;QACvD,MAAM,IAAI,gBAAgB,CAAC,gBAAgB,EAAE,0BAA0B,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IACzF,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAC/C,MAAM,IAAI,gBAAgB,CAAC,gBAAgB,EAAE,kCAAkC,CAAC,CAAC;IACnF,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,oBAAoB,CACxC,OAAuB,EACvB,EAAmB;IAEnB,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,gBAAgB,CAAC,gBAAgB,EAAE,0BAA0B,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;AAC7B,CAAC"}
@@ -38,11 +38,11 @@ export declare class AgentDeckMCPServer {
38
38
  private setupResources;
39
39
  private setupRoutes;
40
40
  private getSessionIdHeader;
41
+ private refreshRuntimeSession;
42
+ private parseGrantBearer;
43
+ private authenticateTrustedSession;
41
44
  /**
42
- * Pre-bind a newly-initialized session to the deck the client advertised via the
43
- * `x-agent-deck-deck-id` header (written into the workspace's MCP config by
44
- * `agent-deck use`). Removes the "agent forgot to call bind_workspace" gap; an
45
- * explicit bind_workspace / switch_bound_deck later still overrides it.
45
+ * @deprecated Legacy pre-bind from deck header replaced by grant authentication.
46
46
  */
47
47
  private preBindSessionDeck;
48
48
  private handleMcpPost;
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AAUA,OAAO,OAA8B,MAAM,SAAS,CAAC;AASrD,OAAO,EAAE,cAAc,EAAyB,MAAM,qBAAqB,CAAC;AAoB5E,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,QAAQ,CAAiC;IACjD,mFAAmF;IACnF,OAAO,CAAC,wBAAwB,CAAwB;IACxD,mFAAmF;IACnF,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,eAAe,CAAqB;IAC5C,uFAAuF;IACvF,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,aAAa,CAA6B;IAElD,OAAO,KAAK,MAAM,GAKjB;gBAGC,IAAI,GAAE,MAAa,EACnB,UAAU,GAAE,MAAgC,EAC5C,WAAW,CAAC,EAAE,cAAc,EAC5B,IAAI,GAAE,MAAoB;IAiB5B,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,eAAe;YAIT,SAAS;YAkBT,mBAAmB;YAgBnB,mBAAmB;IAiCjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAElD,iFAAiF;IACjF,OAAO,CAAC,gBAAgB;YAmBV,qBAAqB;YAUrB,cAAc;YAgDd,cAAc;IAQ5B,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,SAAS;IAIjB,6EAA6E;IAC7E,OAAO,CAAC,YAAY;YAYN,mBAAmB;IAyBjC,OAAO,CAAC,UAAU;IAqBlB,OAAO,CAAC,cAAc;IA8MtB,OAAO,CAAC,WAAW;IA4CnB,OAAO,CAAC,kBAAkB;IAK1B;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;YAQZ,aAAa;YAsEb,uBAAuB;IAkB/B,KAAK;IAiCL,IAAI;CAeX"}
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AASA,OAAO,OAA8B,MAAM,SAAS,CAAC;AAYrD,OAAO,EAAE,cAAc,EAAyB,MAAM,qBAAqB,CAAC;AAoB5E,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,QAAQ,CAAiC;IACjD,mFAAmF;IACnF,OAAO,CAAC,wBAAwB,CAAwB;IACxD,mFAAmF;IACnF,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,eAAe,CAAqB;IAC5C,uFAAuF;IACvF,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,aAAa,CAA6B;IAElD,OAAO,KAAK,MAAM,GAKjB;gBAGC,IAAI,GAAE,MAAa,EACnB,UAAU,GAAE,MAAgC,EAC5C,WAAW,CAAC,EAAE,cAAc,EAC5B,IAAI,GAAE,MAAoB;IAiB5B,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,eAAe;YAIT,SAAS;YAkBT,mBAAmB;YAoBnB,mBAAmB;IAiCjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAElD,iFAAiF;IACjF,OAAO,CAAC,gBAAgB;YAmBV,qBAAqB;YAUrB,cAAc;YA+Cd,cAAc;IAQ5B,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,SAAS;IAIjB,6EAA6E;IAC7E,OAAO,CAAC,YAAY;YAYN,mBAAmB;IAyBjC,OAAO,CAAC,UAAU;IAuBlB,OAAO,CAAC,cAAc;IA8MtB,OAAO,CAAC,WAAW;IA4CnB,OAAO,CAAC,kBAAkB;YAKZ,qBAAqB;IAqBnC,OAAO,CAAC,gBAAgB;YAIV,0BAA0B;IAmCxC;;OAEG;IACH,OAAO,CAAC,kBAAkB;YAIZ,aAAa;YA0Fb,uBAAuB;IAkB/B,KAAK;IAiCL,IAAI;CAeX"}