@agent-deck/backend 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/cli-runtime.d.ts +4 -0
  3. package/dist/cli-runtime.d.ts.map +1 -0
  4. package/dist/cli-runtime.js +12 -0
  5. package/dist/cli-runtime.js.map +1 -0
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +30 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/lib/agent-deck-context.d.ts +8 -0
  11. package/dist/lib/agent-deck-context.d.ts.map +1 -0
  12. package/dist/lib/agent-deck-context.js +48 -0
  13. package/dist/lib/agent-deck-context.js.map +1 -0
  14. package/dist/lib/bound-deck-scope.d.ts +15 -0
  15. package/dist/lib/bound-deck-scope.d.ts.map +1 -0
  16. package/dist/lib/bound-deck-scope.js +68 -0
  17. package/dist/lib/bound-deck-scope.js.map +1 -0
  18. package/dist/lib/client-scope.d.ts +14 -0
  19. package/dist/lib/client-scope.d.ts.map +1 -0
  20. package/dist/lib/client-scope.js +46 -0
  21. package/dist/lib/client-scope.js.map +1 -0
  22. package/dist/lib/paths.d.ts +2 -0
  23. package/dist/lib/paths.d.ts.map +1 -0
  24. package/dist/lib/paths.js +24 -0
  25. package/dist/lib/paths.js.map +1 -0
  26. package/dist/lib/version.d.ts +3 -0
  27. package/dist/lib/version.d.ts.map +1 -0
  28. package/dist/lib/version.js +20 -0
  29. package/dist/lib/version.js.map +1 -0
  30. package/dist/mcp-index.d.ts +2 -0
  31. package/dist/mcp-index.d.ts.map +1 -0
  32. package/dist/mcp-index.js +32 -0
  33. package/dist/mcp-index.js.map +1 -0
  34. package/dist/mcp-server.d.ts +25 -0
  35. package/dist/mcp-server.d.ts.map +1 -0
  36. package/dist/mcp-server.js +1121 -0
  37. package/dist/mcp-server.js.map +1 -0
  38. package/dist/mcp-stdio.d.ts +2 -0
  39. package/dist/mcp-stdio.d.ts.map +1 -0
  40. package/dist/mcp-stdio.js.map +1 -0
  41. package/dist/models/database.d.ts +64 -0
  42. package/dist/models/database.d.ts.map +1 -0
  43. package/dist/models/database.js +965 -0
  44. package/dist/models/database.js.map +1 -0
  45. package/dist/playbooks/playbook-manager.d.ts +29 -0
  46. package/dist/playbooks/playbook-manager.d.ts.map +1 -0
  47. package/dist/playbooks/playbook-manager.js +198 -0
  48. package/dist/playbooks/playbook-manager.js.map +1 -0
  49. package/dist/playbooks/playbook-parser.d.ts +8 -0
  50. package/dist/playbooks/playbook-parser.d.ts.map +1 -0
  51. package/dist/playbooks/playbook-parser.js +76 -0
  52. package/dist/playbooks/playbook-parser.js.map +1 -0
  53. package/dist/playbooks/playbook-service.d.ts +9 -0
  54. package/dist/playbooks/playbook-service.d.ts.map +1 -0
  55. package/dist/playbooks/playbook-service.js +107 -0
  56. package/dist/playbooks/playbook-service.js.map +1 -0
  57. package/dist/routes/collection.d.ts +3 -0
  58. package/dist/routes/collection.d.ts.map +1 -0
  59. package/dist/routes/collection.js +34 -0
  60. package/dist/routes/collection.js.map +1 -0
  61. package/dist/routes/credentials.d.ts +3 -0
  62. package/dist/routes/credentials.d.ts.map +1 -0
  63. package/dist/routes/credentials.js +241 -0
  64. package/dist/routes/credentials.js.map +1 -0
  65. package/dist/routes/decks.d.ts +3 -0
  66. package/dist/routes/decks.d.ts.map +1 -0
  67. package/dist/routes/decks.js +430 -0
  68. package/dist/routes/decks.js.map +1 -0
  69. package/dist/routes/local-mcp.d.ts +3 -0
  70. package/dist/routes/local-mcp.d.ts.map +1 -0
  71. package/dist/routes/local-mcp.js +189 -0
  72. package/dist/routes/local-mcp.js.map +1 -0
  73. package/dist/routes/mcp.d.ts +3 -0
  74. package/dist/routes/mcp.d.ts.map +1 -0
  75. package/dist/routes/mcp.js +170 -0
  76. package/dist/routes/mcp.js.map +1 -0
  77. package/dist/routes/oauth.d.ts +3 -0
  78. package/dist/routes/oauth.d.ts.map +1 -0
  79. package/dist/routes/oauth.js +242 -0
  80. package/dist/routes/oauth.js.map +1 -0
  81. package/dist/routes/playbooks.d.ts +5 -0
  82. package/dist/routes/playbooks.d.ts.map +1 -0
  83. package/dist/routes/playbooks.js +220 -0
  84. package/dist/routes/playbooks.js.map +1 -0
  85. package/dist/routes/scope.d.ts +3 -0
  86. package/dist/routes/scope.d.ts.map +1 -0
  87. package/dist/routes/scope.js +107 -0
  88. package/dist/routes/scope.js.map +1 -0
  89. package/dist/routes/services.d.ts +3 -0
  90. package/dist/routes/services.d.ts.map +1 -0
  91. package/dist/routes/services.js +281 -0
  92. package/dist/routes/services.js.map +1 -0
  93. package/dist/routes/websocket.d.ts +11 -0
  94. package/dist/routes/websocket.d.ts.map +1 -0
  95. package/dist/routes/websocket.js +154 -0
  96. package/dist/routes/websocket.js.map +1 -0
  97. package/dist/scope/repo-deck.d.ts +10 -0
  98. package/dist/scope/repo-deck.d.ts.map +1 -0
  99. package/dist/scope/repo-deck.js +63 -0
  100. package/dist/scope/repo-deck.js.map +1 -0
  101. package/dist/server/index.d.ts +24 -0
  102. package/dist/server/index.d.ts.map +1 -0
  103. package/dist/server/index.js +111 -0
  104. package/dist/server/index.js.map +1 -0
  105. package/dist/services/collection-warning-service.d.ts +18 -0
  106. package/dist/services/collection-warning-service.d.ts.map +1 -0
  107. package/dist/services/collection-warning-service.js +129 -0
  108. package/dist/services/collection-warning-service.js.map +1 -0
  109. package/dist/services/config-manager.d.ts +32 -0
  110. package/dist/services/config-manager.d.ts.map +1 -0
  111. package/dist/services/config-manager.js +119 -0
  112. package/dist/services/config-manager.js.map +1 -0
  113. package/dist/services/icon-resolver.d.ts +20 -0
  114. package/dist/services/icon-resolver.d.ts.map +1 -0
  115. package/dist/services/icon-resolver.js +224 -0
  116. package/dist/services/icon-resolver.js.map +1 -0
  117. package/dist/services/local-mcp-server-manager.d.ts +51 -0
  118. package/dist/services/local-mcp-server-manager.d.ts.map +1 -0
  119. package/dist/services/local-mcp-server-manager.js +246 -0
  120. package/dist/services/local-mcp-server-manager.js.map +1 -0
  121. package/dist/services/mcp-client-manager.d.ts +22 -0
  122. package/dist/services/mcp-client-manager.d.ts.map +1 -0
  123. package/dist/services/mcp-client-manager.js +257 -0
  124. package/dist/services/mcp-client-manager.js.map +1 -0
  125. package/dist/services/mcp-discovery-service.d.ts +31 -0
  126. package/dist/services/mcp-discovery-service.d.ts.map +1 -0
  127. package/dist/services/mcp-discovery-service.js +164 -0
  128. package/dist/services/mcp-discovery-service.js.map +1 -0
  129. package/dist/services/oauth-manager.d.ts +25 -0
  130. package/dist/services/oauth-manager.d.ts.map +1 -0
  131. package/dist/services/oauth-manager.js +365 -0
  132. package/dist/services/oauth-manager.js.map +1 -0
  133. package/dist/services/service-manager.d.ts +61 -0
  134. package/dist/services/service-manager.d.ts.map +1 -0
  135. package/dist/services/service-manager.js +447 -0
  136. package/dist/services/service-manager.js.map +1 -0
  137. package/dist/test-local-mcp-e2e.d.ts +3 -0
  138. package/dist/test-local-mcp-e2e.d.ts.map +1 -0
  139. package/dist/test-local-mcp-e2e.js +104 -0
  140. package/dist/test-local-mcp-e2e.js.map +1 -0
  141. package/dist/test-local-mcp.d.ts +3 -0
  142. package/dist/test-local-mcp.d.ts.map +1 -0
  143. package/dist/test-local-mcp.js +54 -0
  144. package/dist/test-local-mcp.js.map +1 -0
  145. package/dist/vault/credential-manager.d.ts +45 -0
  146. package/dist/vault/credential-manager.d.ts.map +1 -0
  147. package/dist/vault/credential-manager.js +237 -0
  148. package/dist/vault/credential-manager.js.map +1 -0
  149. package/dist/vault/index.d.ts +4 -0
  150. package/dist/vault/index.d.ts.map +1 -0
  151. package/dist/vault/index.js +20 -0
  152. package/dist/vault/index.js.map +1 -0
  153. package/dist/vault/secret-store.d.ts +36 -0
  154. package/dist/vault/secret-store.d.ts.map +1 -0
  155. package/dist/vault/secret-store.js +207 -0
  156. package/dist/vault/secret-store.js.map +1 -0
  157. package/dist/vault/yaml-sync.d.ts +8 -0
  158. package/dist/vault/yaml-sync.d.ts.map +1 -0
  159. package/dist/vault/yaml-sync.js +60 -0
  160. package/dist/vault/yaml-sync.js.map +1 -0
  161. package/package.json +64 -0
  162. package/static-ui/assets/AgentDeckLogo2-z3pVqJJ3.png +0 -0
  163. package/static-ui/assets/index-BnA3AsqY.css +1 -0
  164. package/static-ui/assets/index-D1IuraRt.js +334 -0
  165. package/static-ui/favicon.png +0 -0
  166. package/static-ui/index.html +17 -0
@@ -0,0 +1,45 @@
1
+ import { AddCredentialToDeckInput, CreateCredentialInput, Credential, RemoveCredentialFromDeckInput, RotateCredentialInput, UpdateCredentialInput } from '@agent-deck/shared';
2
+ import { DatabaseManager } from '../models/database';
3
+ import { CredentialYamlSync } from './yaml-sync';
4
+ import { SecretStore } from './secret-store';
5
+ export declare class CredentialManager {
6
+ private db;
7
+ private secretStore;
8
+ private yamlSync;
9
+ constructor(db: DatabaseManager, secretStore: SecretStore, yamlSync?: CredentialYamlSync);
10
+ create(input: CreateCredentialInput): Promise<Credential>;
11
+ private syncIconFromDocsUrl;
12
+ applySecretStatus(credentials: Credential[]): Promise<Credential[]>;
13
+ list(): Promise<Credential[]>;
14
+ listForDeck(deckId: string): Promise<Credential[]>;
15
+ listForActiveDeck(): Promise<Credential[]>;
16
+ isCredentialOnDeck(deckId: string, credentialId: string): Promise<boolean>;
17
+ assertCredentialsOnDeck(deckId: string, credentialIds: string[]): Promise<void>;
18
+ getIfOnActiveDeck(id: string): Promise<Credential | null>;
19
+ get(id: string): Promise<Credential | null>;
20
+ update(id: string, input: UpdateCredentialInput): Promise<Credential | null>;
21
+ rotate(id: string, input: RotateCredentialInput): Promise<Credential | null>;
22
+ delete(id: string): Promise<boolean>;
23
+ resolveEnvMap(credentialIds: string[]): Promise<Record<string, string>>;
24
+ addToDeck(input: AddCredentialToDeckInput): Promise<void>;
25
+ removeFromDeck(input: RemoveCredentialFromDeckInput): Promise<void>;
26
+ recordExecRun(input: {
27
+ deckId?: string;
28
+ manifestPath?: string;
29
+ command: string;
30
+ credentialIds: string[];
31
+ exitCode?: number;
32
+ startedAt: string;
33
+ finishedAt?: string;
34
+ }): Promise<{
35
+ id: string;
36
+ command: string;
37
+ credentialIds: string[];
38
+ startedAt: string;
39
+ deckId?: string | undefined;
40
+ manifestPath?: string | undefined;
41
+ exitCode?: number | undefined;
42
+ finishedAt?: string | undefined;
43
+ }>;
44
+ }
45
+ //# sourceMappingURL=credential-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-manager.d.ts","sourceRoot":"","sources":["../../src/vault/credential-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,UAAU,EACV,6BAA6B,EAC7B,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAMrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,WAAW,EAAyB,MAAM,gBAAgB,CAAC;AAEpE,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,QAAQ;gBAFR,EAAE,EAAE,eAAe,EACnB,WAAW,EAAE,WAAW,EACxB,QAAQ,GAAE,kBAA6C;IAG3D,MAAM,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC;YAwBjD,mBAAmB;IAsB3B,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IASnE,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAa7B,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAKlD,iBAAiB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAQ1C,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1E,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/E,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAczD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAY3C,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAmB5E,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAyB5E,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA+BpC,aAAa,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAoBvE,SAAS,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IASzD,cAAc,CAAC,KAAK,EAAE,6BAA6B,GAAG,OAAO,CAAC,IAAI,CAAC;IAInE,aAAa,CAAC,KAAK,EAAE;QACzB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB;;;;;;;;;;CAGF"}
@@ -0,0 +1,237 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.CredentialManager = void 0;
37
+ const icon_resolver_1 = require("../services/icon-resolver");
38
+ const yaml_sync_1 = require("./yaml-sync");
39
+ const secret_store_1 = require("./secret-store");
40
+ class CredentialManager {
41
+ db;
42
+ secretStore;
43
+ yamlSync;
44
+ constructor(db, secretStore, yamlSync = new yaml_sync_1.CredentialYamlSync()) {
45
+ this.db = db;
46
+ this.secretStore = secretStore;
47
+ this.yamlSync = yamlSync;
48
+ }
49
+ async create(input) {
50
+ const keychainAccount = input.keychainAccount ?? input.id;
51
+ await this.secretStore.set(keychainAccount, input.value);
52
+ let credential = await this.db.createCredential({
53
+ id: input.id,
54
+ label: input.label,
55
+ scheme: input.scheme,
56
+ headerName: input.headerName,
57
+ envName: input.envName,
58
+ keychainAccount,
59
+ tags: input.tags ?? [],
60
+ docsUrl: input.docsUrl,
61
+ hasSecret: true,
62
+ });
63
+ if (input.docsUrl) {
64
+ credential = await this.syncIconFromDocsUrl({ ...credential, hasSecret: true });
65
+ }
66
+ await this.yamlSync.write(credential);
67
+ return { ...credential, hasSecret: true };
68
+ }
69
+ async syncIconFromDocsUrl(credential) {
70
+ if (!credential.docsUrl) {
71
+ await (0, icon_resolver_1.removeCachedIcon)(credential.id);
72
+ if (!credential.iconUrl) {
73
+ return credential;
74
+ }
75
+ const cleared = await this.db.updateCredential(credential.id, { iconUrl: undefined });
76
+ return cleared ? { ...cleared, hasSecret: credential.hasSecret } : credential;
77
+ }
78
+ const result = await (0, icon_resolver_1.cacheIconForCredential)(credential.id, credential.docsUrl);
79
+ if (!result.iconPath) {
80
+ return credential;
81
+ }
82
+ const withIcon = await this.db.updateCredential(credential.id, {
83
+ iconUrl: (0, icon_resolver_1.credentialIconApiPath)(credential.id),
84
+ });
85
+ return withIcon ? { ...withIcon, hasSecret: credential.hasSecret } : credential;
86
+ }
87
+ async applySecretStatus(credentials) {
88
+ return Promise.all(credentials.map(async (credential) => ({
89
+ ...credential,
90
+ hasSecret: await this.secretStore.has(credential.keychainAccount),
91
+ })));
92
+ }
93
+ async list() {
94
+ const credentials = await this.db.getAllCredentials();
95
+ const withSecrets = await this.applySecretStatus(credentials);
96
+ return Promise.all(withSecrets.map(async (credential) => {
97
+ if (credential.docsUrl && !credential.iconUrl) {
98
+ return this.syncIconFromDocsUrl(credential);
99
+ }
100
+ return credential;
101
+ }));
102
+ }
103
+ async listForDeck(deckId) {
104
+ const credentials = await this.db.getDeckCredentialsForDeck(deckId);
105
+ return this.applySecretStatus(credentials);
106
+ }
107
+ async listForActiveDeck() {
108
+ const activeDeck = await this.db.getActiveDeck();
109
+ if (!activeDeck) {
110
+ return [];
111
+ }
112
+ return this.listForDeck(activeDeck.id);
113
+ }
114
+ async isCredentialOnDeck(deckId, credentialId) {
115
+ const credentials = await this.db.getDeckCredentialsForDeck(deckId);
116
+ return credentials.some((credential) => credential.id === credentialId);
117
+ }
118
+ async assertCredentialsOnDeck(deckId, credentialIds) {
119
+ const credentials = await this.db.getDeckCredentialsForDeck(deckId);
120
+ const allowed = new Set(credentials.map((credential) => credential.id));
121
+ for (const credentialId of credentialIds) {
122
+ if (!allowed.has(credentialId)) {
123
+ throw new Error(`Credential ${credentialId} is not on deck ${deckId}`);
124
+ }
125
+ }
126
+ }
127
+ async getIfOnActiveDeck(id) {
128
+ const activeDeck = await this.db.getActiveDeck();
129
+ if (!activeDeck) {
130
+ return null;
131
+ }
132
+ const onDeck = await this.isCredentialOnDeck(activeDeck.id, id);
133
+ if (!onDeck) {
134
+ return null;
135
+ }
136
+ return this.get(id);
137
+ }
138
+ async get(id) {
139
+ const credential = await this.db.getCredential(id);
140
+ if (!credential) {
141
+ return null;
142
+ }
143
+ return {
144
+ ...credential,
145
+ hasSecret: await this.secretStore.has(credential.keychainAccount),
146
+ };
147
+ }
148
+ async update(id, input) {
149
+ const updated = await this.db.updateCredential(id, input);
150
+ if (!updated) {
151
+ return null;
152
+ }
153
+ let credential = {
154
+ ...updated,
155
+ hasSecret: await this.secretStore.has(updated.keychainAccount),
156
+ };
157
+ if (input.docsUrl !== undefined) {
158
+ credential = await this.syncIconFromDocsUrl(credential);
159
+ }
160
+ await this.yamlSync.write(credential);
161
+ return credential;
162
+ }
163
+ async rotate(id, input) {
164
+ const existing = await this.db.getCredential(id);
165
+ if (!existing) {
166
+ return null;
167
+ }
168
+ await this.secretStore.set(existing.keychainAccount, input.value);
169
+ const hasSecret = await this.secretStore.has(existing.keychainAccount);
170
+ if (!hasSecret) {
171
+ throw new Error(`Failed to store secret in vault for account "${existing.keychainAccount}"`);
172
+ }
173
+ const credential = {
174
+ ...existing,
175
+ updatedAt: new Date().toISOString(),
176
+ hasSecret,
177
+ };
178
+ await this.db.touchCredential(id);
179
+ await this.yamlSync.write(credential);
180
+ return credential;
181
+ }
182
+ async delete(id) {
183
+ const existing = await this.db.getCredential(id);
184
+ if (!existing) {
185
+ return false;
186
+ }
187
+ const dependents = await this.db.getPlaybooksDependingOnCredential(id);
188
+ if (dependents.length > 0) {
189
+ const { PlaybookDependencyError } = await Promise.resolve().then(() => __importStar(require('../playbooks/playbook-manager')));
190
+ throw new PlaybookDependencyError(`Cannot delete API key "${existing.label}": referenced by playbook(s): ${dependents.map((p) => p.title).join(', ')}`, dependents.map(({ id: playbookId, title }) => ({ id: playbookId, title })));
191
+ }
192
+ try {
193
+ await this.secretStore.delete(existing.keychainAccount);
194
+ }
195
+ catch (error) {
196
+ if (!(error instanceof secret_store_1.VaultUnsupportedError)) {
197
+ throw error;
198
+ }
199
+ }
200
+ const deleted = await this.db.deleteCredential(id);
201
+ if (deleted) {
202
+ await this.yamlSync.remove(id);
203
+ await (0, icon_resolver_1.removeCachedIcon)(id);
204
+ }
205
+ return deleted;
206
+ }
207
+ async resolveEnvMap(credentialIds) {
208
+ const env = {};
209
+ for (const credentialId of credentialIds) {
210
+ const credential = await this.db.getCredential(credentialId);
211
+ if (!credential) {
212
+ throw new Error(`Credential not found: ${credentialId}`);
213
+ }
214
+ const secret = await this.secretStore.get(credential.keychainAccount);
215
+ if (!secret) {
216
+ throw new Error(`Secret not found in vault for credential: ${credentialId}`);
217
+ }
218
+ env[credential.envName] = secret;
219
+ }
220
+ return env;
221
+ }
222
+ async addToDeck(input) {
223
+ const credential = await this.db.getCredential(input.credentialId);
224
+ if (!credential) {
225
+ throw new Error(`Credential not found: ${input.credentialId}`);
226
+ }
227
+ await this.db.addCredentialToDeck(input);
228
+ }
229
+ async removeFromDeck(input) {
230
+ await this.db.removeCredentialFromDeck(input);
231
+ }
232
+ async recordExecRun(input) {
233
+ return this.db.createExecRun(input);
234
+ }
235
+ }
236
+ exports.CredentialManager = CredentialManager;
237
+ //# sourceMappingURL=credential-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-manager.js","sourceRoot":"","sources":["../../src/vault/credential-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from './secret-store';
2
+ export * from './yaml-sync';
3
+ export * from './credential-manager';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vault/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./secret-store"), exports);
18
+ __exportStar(require("./yaml-sync"), exports);
19
+ __exportStar(require("./credential-manager"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vault/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,8CAA4B;AAC5B,uDAAqC"}
@@ -0,0 +1,36 @@
1
+ export interface SecretStore {
2
+ set(account: string, value: string): Promise<void>;
3
+ get(account: string): Promise<string | null>;
4
+ delete(account: string): Promise<void>;
5
+ has(account: string): Promise<boolean>;
6
+ }
7
+ export declare class VaultUnsupportedError extends Error {
8
+ constructor(message: string);
9
+ }
10
+ export declare class MemorySecretStore implements SecretStore {
11
+ private secrets;
12
+ set(account: string, value: string): Promise<void>;
13
+ get(account: string): Promise<string | null>;
14
+ delete(account: string): Promise<void>;
15
+ has(account: string): Promise<boolean>;
16
+ }
17
+ export declare class DevFileSecretStore implements SecretStore {
18
+ private readonly secretsDir;
19
+ constructor(secretsDir?: string);
20
+ private secretPath;
21
+ private ensureDir;
22
+ set(account: string, value: string): Promise<void>;
23
+ get(account: string): Promise<string | null>;
24
+ delete(account: string): Promise<void>;
25
+ has(account: string): Promise<boolean>;
26
+ }
27
+ export declare class MacOSKeychainStore implements SecretStore {
28
+ private readonly serviceName;
29
+ private runSecurity;
30
+ set(account: string, value: string): Promise<void>;
31
+ get(account: string): Promise<string | null>;
32
+ delete(account: string): Promise<void>;
33
+ has(account: string): Promise<boolean>;
34
+ }
35
+ export declare function createSecretStore(): SecretStore;
36
+ //# sourceMappingURL=secret-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-store.d.ts","sourceRoot":"","sources":["../../src/vault/secret-store.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACxC;AAED,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,iBAAkB,YAAW,WAAW;IACnD,OAAO,CAAC,OAAO,CAA6B;IAEtC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI5C,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAG7C;AAED,qBAAa,kBAAmB,YAAW,WAAW;IACpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,UAAU,CAAC,EAAE,MAAM;IAI/B,OAAO,CAAC,UAAU;YAIJ,SAAS;IAIjB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlD,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAY5C,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWtC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAQ7C;AAED,qBAAa,kBAAmB,YAAW,WAAW;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;YAE9B,WAAW;IAmBnB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBlD,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgB5C,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUtC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAI7C;AAED,wBAAgB,iBAAiB,IAAI,WAAW,CAuB/C"}
@@ -0,0 +1,207 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.MacOSKeychainStore = exports.DevFileSecretStore = exports.MemorySecretStore = exports.VaultUnsupportedError = void 0;
40
+ exports.createSecretStore = createSecretStore;
41
+ const promises_1 = __importDefault(require("fs/promises"));
42
+ const path_1 = __importDefault(require("path"));
43
+ const yaml_sync_1 = require("./yaml-sync");
44
+ class VaultUnsupportedError extends Error {
45
+ constructor(message) {
46
+ super(message);
47
+ this.name = 'VaultUnsupportedError';
48
+ }
49
+ }
50
+ exports.VaultUnsupportedError = VaultUnsupportedError;
51
+ class MemorySecretStore {
52
+ secrets = new Map();
53
+ async set(account, value) {
54
+ this.secrets.set(account, value);
55
+ }
56
+ async get(account) {
57
+ return this.secrets.get(account) ?? null;
58
+ }
59
+ async delete(account) {
60
+ this.secrets.delete(account);
61
+ }
62
+ async has(account) {
63
+ return this.secrets.has(account);
64
+ }
65
+ }
66
+ exports.MemorySecretStore = MemorySecretStore;
67
+ class DevFileSecretStore {
68
+ secretsDir;
69
+ constructor(secretsDir) {
70
+ this.secretsDir = secretsDir ?? path_1.default.join((0, yaml_sync_1.getAgentDeckHome)(), 'secrets');
71
+ }
72
+ secretPath(account) {
73
+ return path_1.default.join(this.secretsDir, `${account}.secret`);
74
+ }
75
+ async ensureDir() {
76
+ await promises_1.default.mkdir(this.secretsDir, { recursive: true, mode: 0o700 });
77
+ }
78
+ async set(account, value) {
79
+ await this.ensureDir();
80
+ await promises_1.default.writeFile(this.secretPath(account), value, { encoding: 'utf8', mode: 0o600 });
81
+ }
82
+ async get(account) {
83
+ try {
84
+ return await promises_1.default.readFile(this.secretPath(account), 'utf8');
85
+ }
86
+ catch (error) {
87
+ const nodeError = error;
88
+ if (nodeError.code === 'ENOENT') {
89
+ return null;
90
+ }
91
+ throw error;
92
+ }
93
+ }
94
+ async delete(account) {
95
+ try {
96
+ await promises_1.default.unlink(this.secretPath(account));
97
+ }
98
+ catch (error) {
99
+ const nodeError = error;
100
+ if (nodeError.code !== 'ENOENT') {
101
+ throw error;
102
+ }
103
+ }
104
+ }
105
+ async has(account) {
106
+ try {
107
+ await promises_1.default.access(this.secretPath(account));
108
+ return true;
109
+ }
110
+ catch {
111
+ return false;
112
+ }
113
+ }
114
+ }
115
+ exports.DevFileSecretStore = DevFileSecretStore;
116
+ class MacOSKeychainStore {
117
+ serviceName = 'agent-deck';
118
+ async runSecurity(args) {
119
+ const { execFile } = await Promise.resolve().then(() => __importStar(require('child_process')));
120
+ const { promisify } = await Promise.resolve().then(() => __importStar(require('util')));
121
+ const execFileAsync = promisify(execFile);
122
+ try {
123
+ const result = await execFileAsync('security', args, { encoding: 'utf8' });
124
+ return {
125
+ stdout: String(result.stdout ?? ''),
126
+ stderr: String(result.stderr ?? ''),
127
+ };
128
+ }
129
+ catch (error) {
130
+ const execError = error;
131
+ const stderr = String(execError.stderr ?? execError.message ?? 'Keychain operation failed');
132
+ const wrapped = new Error(stderr.trim() || 'Keychain operation failed');
133
+ throw wrapped;
134
+ }
135
+ }
136
+ async set(account, value) {
137
+ try {
138
+ await this.runSecurity([
139
+ 'delete-generic-password',
140
+ '-s',
141
+ this.serviceName,
142
+ '-a',
143
+ account,
144
+ ]);
145
+ }
146
+ catch {
147
+ // Item may not exist yet.
148
+ }
149
+ await this.runSecurity([
150
+ 'add-generic-password',
151
+ '-s',
152
+ this.serviceName,
153
+ '-a',
154
+ account,
155
+ '-w',
156
+ value,
157
+ '-U',
158
+ ]);
159
+ }
160
+ async get(account) {
161
+ try {
162
+ const { stdout } = await this.runSecurity([
163
+ 'find-generic-password',
164
+ '-s',
165
+ this.serviceName,
166
+ '-a',
167
+ account,
168
+ '-w',
169
+ ]);
170
+ return stdout.trim();
171
+ }
172
+ catch {
173
+ return null;
174
+ }
175
+ }
176
+ async delete(account) {
177
+ await this.runSecurity([
178
+ 'delete-generic-password',
179
+ '-s',
180
+ this.serviceName,
181
+ '-a',
182
+ account,
183
+ ]);
184
+ }
185
+ async has(account) {
186
+ const value = await this.get(account);
187
+ return value !== null;
188
+ }
189
+ }
190
+ exports.MacOSKeychainStore = MacOSKeychainStore;
191
+ function createSecretStore() {
192
+ if (process.env.AGENT_DECK_SECRET_STORE === 'memory') {
193
+ return new MemorySecretStore();
194
+ }
195
+ if (process.env.AGENT_DECK_SECRET_STORE === 'file') {
196
+ return new DevFileSecretStore();
197
+ }
198
+ if (process.platform === 'darwin') {
199
+ return new MacOSKeychainStore();
200
+ }
201
+ if (process.env.NODE_ENV !== 'production') {
202
+ console.warn('[agent-deck] macOS Keychain unavailable — using dev file secret store (~/.agent-deck/secrets).');
203
+ return new DevFileSecretStore();
204
+ }
205
+ throw new VaultUnsupportedError('Secret storage is only supported on macOS for now. Set AGENT_DECK_SECRET_STORE=memory to use the dev file store on other platforms.');
206
+ }
207
+ //# sourceMappingURL=secret-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-store.js","sourceRoot":"","sources":["../../src/vault/secret-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Credential } from '@agent-deck/shared';
2
+ export declare function getAgentDeckHome(): string;
3
+ export declare function getCredentialsDir(): string;
4
+ export declare class CredentialYamlSync {
5
+ write(credential: Credential): Promise<void>;
6
+ remove(credentialId: string): Promise<void>;
7
+ }
8
+ //# sourceMappingURL=yaml-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml-sync.d.ts","sourceRoot":"","sources":["../../src/vault/yaml-sync.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,qBAAa,kBAAkB;IACvB,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAgC5C,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAUlD"}