@runcofactor/cli 0.10.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 (150) hide show
  1. package/README.md +125 -0
  2. package/dist/api-catalog-GFGCLVS4.js +401 -0
  3. package/dist/api-catalog-GFGCLVS4.js.map +1 -0
  4. package/dist/attachment-SJC7D7FY.js +276 -0
  5. package/dist/attachment-SJC7D7FY.js.map +1 -0
  6. package/dist/auth-EN6NQCJY.js +31 -0
  7. package/dist/auth-EN6NQCJY.js.map +1 -0
  8. package/dist/bin.js +7 -0
  9. package/dist/bin.js.map +1 -0
  10. package/dist/chunk-3CZU7XCS.js +272 -0
  11. package/dist/chunk-3CZU7XCS.js.map +1 -0
  12. package/dist/chunk-4NRDONSC.js +1048 -0
  13. package/dist/chunk-4NRDONSC.js.map +1 -0
  14. package/dist/chunk-4PNOV7OV.js +51980 -0
  15. package/dist/chunk-4PNOV7OV.js.map +1 -0
  16. package/dist/chunk-52IO7ACJ.js +2941 -0
  17. package/dist/chunk-52IO7ACJ.js.map +1 -0
  18. package/dist/chunk-6LEZCKKV.js +663 -0
  19. package/dist/chunk-6LEZCKKV.js.map +1 -0
  20. package/dist/chunk-A4OFTUVV.js +170 -0
  21. package/dist/chunk-A4OFTUVV.js.map +1 -0
  22. package/dist/chunk-B2VISN2V.js +2459 -0
  23. package/dist/chunk-B2VISN2V.js.map +1 -0
  24. package/dist/chunk-CLAWT7BJ.js +271 -0
  25. package/dist/chunk-CLAWT7BJ.js.map +1 -0
  26. package/dist/chunk-GKY2KXO5.js +281 -0
  27. package/dist/chunk-GKY2KXO5.js.map +1 -0
  28. package/dist/chunk-I4QLI3JO.js +413 -0
  29. package/dist/chunk-I4QLI3JO.js.map +1 -0
  30. package/dist/chunk-IMPZAX6L.js +180 -0
  31. package/dist/chunk-IMPZAX6L.js.map +1 -0
  32. package/dist/chunk-J6SH7GQT.js +241 -0
  33. package/dist/chunk-J6SH7GQT.js.map +1 -0
  34. package/dist/chunk-JDBCZ3Z2.js +298 -0
  35. package/dist/chunk-JDBCZ3Z2.js.map +1 -0
  36. package/dist/chunk-JICSYFRJ.js +46 -0
  37. package/dist/chunk-JICSYFRJ.js.map +1 -0
  38. package/dist/chunk-JWHYXEA2.js +32 -0
  39. package/dist/chunk-JWHYXEA2.js.map +1 -0
  40. package/dist/chunk-N7HFALX3.js +88 -0
  41. package/dist/chunk-N7HFALX3.js.map +1 -0
  42. package/dist/chunk-Q4BO4Z5V.js +178 -0
  43. package/dist/chunk-Q4BO4Z5V.js.map +1 -0
  44. package/dist/chunk-QFDOWABX.js +195 -0
  45. package/dist/chunk-QFDOWABX.js.map +1 -0
  46. package/dist/chunk-SJJW77WN.js +605 -0
  47. package/dist/chunk-SJJW77WN.js.map +1 -0
  48. package/dist/chunk-VKVL7WBN.js +50 -0
  49. package/dist/chunk-VKVL7WBN.js.map +1 -0
  50. package/dist/chunk-WOHL4FTB.js +353 -0
  51. package/dist/chunk-WOHL4FTB.js.map +1 -0
  52. package/dist/chunk-XQXVG7RA.js +426 -0
  53. package/dist/chunk-XQXVG7RA.js.map +1 -0
  54. package/dist/chunk-ZD3KHESI.js +94 -0
  55. package/dist/chunk-ZD3KHESI.js.map +1 -0
  56. package/dist/credential-COLTBV6D.js +450 -0
  57. package/dist/credential-COLTBV6D.js.map +1 -0
  58. package/dist/credential-template-EEPYFG7R.js +291 -0
  59. package/dist/credential-template-EEPYFG7R.js.map +1 -0
  60. package/dist/debug-workflow-KOVH5GOP.js +259 -0
  61. package/dist/debug-workflow-KOVH5GOP.js.map +1 -0
  62. package/dist/dist-44PZR7BQ.js +423 -0
  63. package/dist/dist-44PZR7BQ.js.map +1 -0
  64. package/dist/docs-3SSORHB5.js +366 -0
  65. package/dist/docs-3SSORHB5.js.map +1 -0
  66. package/dist/doctor-OTSIWV6G.js +132 -0
  67. package/dist/doctor-OTSIWV6G.js.map +1 -0
  68. package/dist/feature-flag-T2LRZME3.js +283 -0
  69. package/dist/feature-flag-T2LRZME3.js.map +1 -0
  70. package/dist/file-type-S3UUBVCT.js +4205 -0
  71. package/dist/file-type-S3UUBVCT.js.map +1 -0
  72. package/dist/index.d.ts +3 -0
  73. package/dist/index.js +982 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/init-TGWRECT2.js +208 -0
  76. package/dist/init-TGWRECT2.js.map +1 -0
  77. package/dist/install-DXSNWZKO.js +295 -0
  78. package/dist/install-DXSNWZKO.js.map +1 -0
  79. package/dist/issues-XIZOPX6T.js +564 -0
  80. package/dist/issues-XIZOPX6T.js.map +1 -0
  81. package/dist/knobs-NBINZIUB.js +295 -0
  82. package/dist/knobs-NBINZIUB.js.map +1 -0
  83. package/dist/list-3TDHK637.js +59 -0
  84. package/dist/list-3TDHK637.js.map +1 -0
  85. package/dist/local-HICVD6PU.js +100 -0
  86. package/dist/local-HICVD6PU.js.map +1 -0
  87. package/dist/login-UOIUXVUK.js +315 -0
  88. package/dist/login-UOIUXVUK.js.map +1 -0
  89. package/dist/mcp-54IJEOUA.js +1956 -0
  90. package/dist/mcp-54IJEOUA.js.map +1 -0
  91. package/dist/pdf-extract-ABWV3L5X.js +13 -0
  92. package/dist/pdf-extract-ABWV3L5X.js.map +1 -0
  93. package/dist/pdfjs-DQ2YA5S3.js +41561 -0
  94. package/dist/pdfjs-DQ2YA5S3.js.map +1 -0
  95. package/dist/property-UXLOLPTD.js +701 -0
  96. package/dist/property-UXLOLPTD.js.map +1 -0
  97. package/dist/property-skill-guide.md +189 -0
  98. package/dist/psql-BYUUNLGG.js +115 -0
  99. package/dist/psql-BYUUNLGG.js.map +1 -0
  100. package/dist/record-4TR2UIIS.js +233 -0
  101. package/dist/record-4TR2UIIS.js.map +1 -0
  102. package/dist/redis-35VBUYW7.js +116 -0
  103. package/dist/redis-35VBUYW7.js.map +1 -0
  104. package/dist/release-OOLTUBUT.js +354 -0
  105. package/dist/release-OOLTUBUT.js.map +1 -0
  106. package/dist/sandbox-XGSUU6G7.js +2046 -0
  107. package/dist/sandbox-XGSUU6G7.js.map +1 -0
  108. package/dist/scenarios-GWLJEGHA.js +280 -0
  109. package/dist/scenarios-GWLJEGHA.js.map +1 -0
  110. package/dist/session-MYFNZPRP.js +2414 -0
  111. package/dist/session-MYFNZPRP.js.map +1 -0
  112. package/dist/skill-KM34LDMO.js +1839 -0
  113. package/dist/skill-KM34LDMO.js.map +1 -0
  114. package/dist/skills/debug-run/SKILL.md +262 -0
  115. package/dist/skills/debug-run/history/1.0.0.md +244 -0
  116. package/dist/skills/debug-run/history/1.0.1.md +245 -0
  117. package/dist/skills/debug-run/history/1.0.2.md +254 -0
  118. package/dist/skills/debug-run/history/1.1.0.md +262 -0
  119. package/dist/skills/debug-run/version.json +3 -0
  120. package/dist/spec-RA3CFEKG.js +951 -0
  121. package/dist/spec-RA3CFEKG.js.map +1 -0
  122. package/dist/src-LB4HBTJQ.js +1516 -0
  123. package/dist/src-LB4HBTJQ.js.map +1 -0
  124. package/dist/src-N3TPKGTY.js +244 -0
  125. package/dist/src-N3TPKGTY.js.map +1 -0
  126. package/dist/src-UVDX5UP6.js +17 -0
  127. package/dist/src-UVDX5UP6.js.map +1 -0
  128. package/dist/start-PSEQSQA3.js +151 -0
  129. package/dist/start-PSEQSQA3.js.map +1 -0
  130. package/dist/tag-YY6YAABQ.js +22 -0
  131. package/dist/tag-YY6YAABQ.js.map +1 -0
  132. package/dist/task-IQC3YR5K.js +922 -0
  133. package/dist/task-IQC3YR5K.js.map +1 -0
  134. package/dist/test-suite-DZNJFXDW.js +394 -0
  135. package/dist/test-suite-DZNJFXDW.js.map +1 -0
  136. package/dist/trace-HXIW7U2D.js +14 -0
  137. package/dist/trace-HXIW7U2D.js.map +1 -0
  138. package/dist/triage-ORG45R5W.js +16 -0
  139. package/dist/triage-ORG45R5W.js.map +1 -0
  140. package/dist/upgrade-L2VYMP2V.js +61 -0
  141. package/dist/upgrade-L2VYMP2V.js.map +1 -0
  142. package/dist/workflow-XYFH5LTP.js +3708 -0
  143. package/dist/workflow-XYFH5LTP.js.map +1 -0
  144. package/dist/workflow-cache-NQJQFWMV.js +253 -0
  145. package/dist/workflow-cache-NQJQFWMV.js.map +1 -0
  146. package/dist/workflow-debug-BGD4UIXU.js +927 -0
  147. package/dist/workflow-debug-BGD4UIXU.js.map +1 -0
  148. package/dist/workflow-proposals-MTUDX46O.js +382 -0
  149. package/dist/workflow-proposals-MTUDX46O.js.map +1 -0
  150. package/package.json +61 -0
@@ -0,0 +1,450 @@
1
+ import { createRequire as __cr } from "module"; const require = __cr(import.meta.url);
2
+ import {
3
+ apiRequest,
4
+ fetchProperties,
5
+ getApplicationArg
6
+ } from "./chunk-WOHL4FTB.js";
7
+ import "./chunk-SJJW77WN.js";
8
+ import {
9
+ apiFetch,
10
+ exitOnFailure
11
+ } from "./chunk-3CZU7XCS.js";
12
+ import {
13
+ getArgValue,
14
+ hasFlag,
15
+ resolveConfig
16
+ } from "./chunk-A4OFTUVV.js";
17
+ import "./chunk-JWHYXEA2.js";
18
+ import "./chunk-VKVL7WBN.js";
19
+
20
+ // src/credential.ts
21
+ import process from "process";
22
+ import { createParser } from "eventsource-parser";
23
+ async function fetchCredentials(apiUrl, token) {
24
+ const result = await apiFetch(`${apiUrl}/org/credentials`, {
25
+ headers: { Authorization: `Bearer ${token}` },
26
+ token
27
+ });
28
+ if (!result.ok) exitOnFailure(result.failure);
29
+ const data = await result.response.json();
30
+ return data.items ?? [];
31
+ }
32
+ function printCredentialHelp() {
33
+ console.log(
34
+ [
35
+ "Usage: canary credential <sub-command> [options]",
36
+ "",
37
+ "Sub-commands:",
38
+ " list [options] List credentials with environment info",
39
+ " get <credId|name> [options] Print credential login bundle (URL + instructions + username/password)",
40
+ " create [options] Create a new credential",
41
+ " update <credId> [options] Update credential fields",
42
+ " test <credId> [options] Run the browser login test for a credential",
43
+ "",
44
+ "List options:",
45
+ " --application <name> Filter by application name (alias: --property)",
46
+ " --json Output raw JSON",
47
+ "",
48
+ "Create options:",
49
+ " --application <name|id> Application to attach to (required; alias: --property)",
50
+ " --name <name> Credential name (required)",
51
+ " --login-url <url> Login URL",
52
+ " --login-instructions <text> Login instructions",
53
+ " --username <user> Username (stored encrypted)",
54
+ " --password <pw> Password (or set CANARY_CRED_PASSWORD)",
55
+ " --api-key <key> API key (or set CANARY_CRED_API_KEY)",
56
+ " --mfa-secret <secret> MFA seed (or set CANARY_CRED_MFA_SECRET)",
57
+ " --json Output raw JSON",
58
+ "",
59
+ "Update options:",
60
+ " --login-url <url> Set the login URL",
61
+ " --name <name> Set the credential name",
62
+ " --role <role> Set the role (admin, user, viewer, custom)",
63
+ " --login-instructions <text> Set login instructions",
64
+ " --json Output raw JSON",
65
+ "",
66
+ "Test options:",
67
+ " --application <name|id> Disambiguate when <credId> is a name (alias: --property)",
68
+ " --json Stream raw SSE events as JSON",
69
+ "",
70
+ "Common options:",
71
+ " --env <env> Target environment (prod, dev, local)",
72
+ " --api-url <url> API URL override",
73
+ " --token <key> API token override"
74
+ ].join("\n")
75
+ );
76
+ }
77
+ async function handleList(argv, apiUrl, token) {
78
+ const jsonFlag = hasFlag(argv, "--json");
79
+ const propertyFilter = getApplicationArg(argv);
80
+ let items = await fetchCredentials(apiUrl, token);
81
+ if (propertyFilter) {
82
+ const lower = propertyFilter.toLowerCase();
83
+ items = items.filter(
84
+ (c) => c.propertyId === propertyFilter || c.propertyName && c.propertyName.toLowerCase().includes(lower)
85
+ );
86
+ }
87
+ items = items.filter((c) => !c.isEphemeral);
88
+ if (jsonFlag) {
89
+ console.log(JSON.stringify(items, null, 2));
90
+ return;
91
+ }
92
+ if (items.length === 0) {
93
+ console.log("No credentials found.");
94
+ return;
95
+ }
96
+ console.log(`
97
+ Credentials (${items.length}):
98
+ `);
99
+ for (const c of items) {
100
+ const property = c.propertyName ?? c.propertyId;
101
+ const env = c.environmentName ? ` | ${c.environmentName}` : "";
102
+ const baseUrl = c.propertyBaseUrl ? ` | ${c.propertyBaseUrl}` : "";
103
+ const loginUrl = c.loginUrl ? ` Login URL: ${c.loginUrl}
104
+ ` : "";
105
+ console.log(` ${c.name}`);
106
+ console.log(` ID: ${c.id}`);
107
+ console.log(` Application: ${property}${env}${baseUrl}`);
108
+ if (loginUrl) process.stdout.write(loginUrl);
109
+ console.log("");
110
+ }
111
+ }
112
+ async function handleUpdate(argv, apiUrl, token) {
113
+ const credId = argv.find((a) => !a.startsWith("-"));
114
+ if (!credId) {
115
+ console.error("Error: Missing credential ID.");
116
+ console.error("Usage: canary credential update <credId> --login-url <url> [--name <name>] [--role <role>]");
117
+ process.exit(1);
118
+ }
119
+ const loginUrl = getArgValue(argv, "--login-url");
120
+ const name = getArgValue(argv, "--name");
121
+ const role = getArgValue(argv, "--role");
122
+ const loginInstructions = getArgValue(argv, "--login-instructions");
123
+ const jsonOutput = hasFlag(argv, "--json");
124
+ if (!loginUrl && !name && !role && !loginInstructions) {
125
+ console.error(
126
+ "Error: No fields to update. Provide at least one of: --login-url, --name, --role, --login-instructions"
127
+ );
128
+ process.exit(1);
129
+ }
130
+ const validRoles = ["admin", "user", "viewer", "custom"];
131
+ if (role && !validRoles.includes(role)) {
132
+ console.error(`Error: Invalid role "${role}". Must be one of: ${validRoles.join(", ")}`);
133
+ process.exit(1);
134
+ }
135
+ const credentials = await fetchCredentials(apiUrl, token);
136
+ const credential = credentials.find((c) => c.id === credId);
137
+ if (!credential) {
138
+ console.error(`Error: Credential ${credId} not found.`);
139
+ if (credentials.length > 0) {
140
+ console.error("\nAvailable credentials:");
141
+ for (const c of credentials.slice(0, 10)) {
142
+ console.error(` ${c.id} ${c.name} (${c.propertyName ?? c.propertyId})`);
143
+ }
144
+ }
145
+ process.exit(1);
146
+ }
147
+ const body = {};
148
+ if (loginUrl !== void 0) body.loginUrl = loginUrl;
149
+ if (name !== void 0) body.name = name;
150
+ if (role !== void 0) body.role = role;
151
+ if (loginInstructions !== void 0) body.loginInstructions = loginInstructions;
152
+ const result = await apiRequest(
153
+ apiUrl,
154
+ token,
155
+ "PUT",
156
+ `/org/properties/${credential.propertyId}/credentials/${credId}`,
157
+ body
158
+ );
159
+ if (!result.ok) {
160
+ if (jsonOutput) {
161
+ console.log(JSON.stringify({ ok: false, error: result.error ?? "Unknown error" }, null, 2));
162
+ } else {
163
+ console.error(`Error: ${result.error ?? "Unknown error"}`);
164
+ }
165
+ process.exit(1);
166
+ }
167
+ if (jsonOutput) {
168
+ console.log(JSON.stringify({ ok: true, credentialId: credId, updated: body }, null, 2));
169
+ return;
170
+ }
171
+ console.log(`Updated "${credential.name}" (${credId}):`);
172
+ if (loginUrl !== void 0) {
173
+ console.log(` loginUrl: ${credential.loginUrl ?? "(none)"} -> ${loginUrl}`);
174
+ }
175
+ if (name !== void 0) {
176
+ console.log(` name: ${credential.name} -> ${name}`);
177
+ }
178
+ if (role !== void 0) {
179
+ console.log(` role: -> ${role}`);
180
+ }
181
+ if (loginInstructions !== void 0) {
182
+ console.log(` loginInstructions: updated`);
183
+ }
184
+ }
185
+ async function handleCreate(argv, apiUrl, token) {
186
+ const jsonOutput = hasFlag(argv, "--json");
187
+ const propertyArg = getApplicationArg(argv);
188
+ const name = getArgValue(argv, "--name");
189
+ const loginUrl = getArgValue(argv, "--login-url");
190
+ const loginInstructions = getArgValue(argv, "--login-instructions");
191
+ const username = getArgValue(argv, "--username");
192
+ const password = getArgValue(argv, "--password") ?? process.env.CANARY_CRED_PASSWORD;
193
+ const apiKey = getArgValue(argv, "--api-key") ?? process.env.CANARY_CRED_API_KEY;
194
+ const mfaSecret = getArgValue(argv, "--mfa-secret") ?? process.env.CANARY_CRED_MFA_SECRET;
195
+ if (!propertyArg || !name) {
196
+ console.error("Error: --application and --name are required (alias: --property).");
197
+ console.error("Usage: canary credential create --application <name|id> --name <name> [options]");
198
+ process.exit(1);
199
+ }
200
+ const properties = await fetchProperties(apiUrl, token);
201
+ const property = properties.find(
202
+ (p) => p.id === propertyArg || p.name.toLowerCase() === propertyArg.toLowerCase()
203
+ );
204
+ if (!property) {
205
+ console.error(`Error: Application "${propertyArg}" not found.`);
206
+ if (properties.length > 0) {
207
+ console.error("Available applications:");
208
+ for (const p of properties) console.error(` - ${p.name} (${p.id})`);
209
+ }
210
+ process.exit(1);
211
+ }
212
+ const data = {};
213
+ if (username !== void 0) data.username = username;
214
+ if (password !== void 0) data.password = password;
215
+ if (apiKey !== void 0) data.apiKey = apiKey;
216
+ if (mfaSecret !== void 0) data.mfaSecret = mfaSecret;
217
+ const body = { name, data };
218
+ if (loginUrl !== void 0) body.loginUrl = loginUrl;
219
+ if (loginInstructions !== void 0) body.loginInstructions = loginInstructions;
220
+ const result = await apiRequest(apiUrl, token, "POST", `/org/properties/${property.id}/credentials`, body);
221
+ if (!result.ok) {
222
+ if (jsonOutput) {
223
+ console.log(JSON.stringify(result, null, 2));
224
+ } else {
225
+ console.error(`Error: ${result.error ?? "Unknown error"}`);
226
+ }
227
+ process.exit(1);
228
+ }
229
+ if (jsonOutput) {
230
+ console.log(JSON.stringify(result, null, 2));
231
+ return;
232
+ }
233
+ console.log(`Created credential "${name}" (${result.id}) on application "${property.name}"`);
234
+ }
235
+ async function fetchCredentialDetail(apiUrl, token, propertyId, credId) {
236
+ const result = await apiRequest(
237
+ apiUrl,
238
+ token,
239
+ "GET",
240
+ `/org/properties/${propertyId}/credentials/${credId}`
241
+ );
242
+ if (!result.ok || !result.credential) return null;
243
+ return result.credential;
244
+ }
245
+ async function handleGet(argv, apiUrl, token) {
246
+ const jsonOutput = hasFlag(argv, "--json");
247
+ const propertyArg = getApplicationArg(argv);
248
+ const credArg = argv.find((a) => !a.startsWith("-"));
249
+ if (!credArg) {
250
+ console.error("Error: Missing credential ID or name.");
251
+ console.error("Usage: canary credential get <credId|name> [--application <name|id>] [--json]");
252
+ process.exit(1);
253
+ }
254
+ const credentials = await fetchCredentials(apiUrl, token);
255
+ const candidates = credentials.filter(
256
+ (c) => c.id === credArg || c.name.toLowerCase() === credArg.toLowerCase()
257
+ );
258
+ let credSummary;
259
+ if (candidates.length === 0) {
260
+ console.error(`Error: Credential "${credArg}" not found.`);
261
+ process.exit(1);
262
+ } else if (candidates.length === 1) {
263
+ credSummary = candidates[0];
264
+ } else {
265
+ if (!propertyArg) {
266
+ console.error(`Error: Multiple credentials match "${credArg}". Pass --application to disambiguate.`);
267
+ for (const c of candidates) {
268
+ console.error(` - ${c.id} (${c.propertyName ?? c.propertyId})`);
269
+ }
270
+ process.exit(1);
271
+ }
272
+ const lower = propertyArg.toLowerCase();
273
+ credSummary = candidates.find(
274
+ (c) => c.propertyId === propertyArg || c.propertyName && c.propertyName.toLowerCase() === lower
275
+ );
276
+ if (!credSummary) {
277
+ console.error(`Error: No credential named "${credArg}" on application "${propertyArg}".`);
278
+ process.exit(1);
279
+ }
280
+ }
281
+ const detail = await fetchCredentialDetail(apiUrl, token, credSummary.propertyId, credSummary.id);
282
+ if (!detail) {
283
+ console.error(`Error: Failed to load credential ${credSummary.id}.`);
284
+ process.exit(1);
285
+ }
286
+ if (jsonOutput) {
287
+ console.log(JSON.stringify(detail, null, 2));
288
+ return;
289
+ }
290
+ const data = detail.data ?? {};
291
+ const username = data.username ?? data.email ?? data.user ?? "";
292
+ console.log(`Credential: ${detail.name} (${detail.id})`);
293
+ console.log(` Application: ${credSummary.propertyName ?? credSummary.propertyId}`);
294
+ console.log(` Auth provider: ${detail.authProvider ?? "(unknown)"}`);
295
+ console.log(` Login URL: ${detail.loginUrl ?? "(not set)"}`);
296
+ console.log(` Post-login URL: ${detail.postLoginStartUrl ?? "(not set)"}`);
297
+ if (username) console.log(` Username: ${username}`);
298
+ if (data.password) console.log(` Password: ${data.password}`);
299
+ if (data.mfaSecret) console.log(` MFA secret: ${data.mfaSecret}`);
300
+ console.log("");
301
+ console.log(" Login instructions:");
302
+ if (detail.loginInstructions) {
303
+ for (const line of detail.loginInstructions.split("\n")) {
304
+ console.log(` ${line}`);
305
+ }
306
+ } else {
307
+ console.log(" (none)");
308
+ }
309
+ }
310
+ async function handleTest(argv, apiUrl, token) {
311
+ const jsonOutput = hasFlag(argv, "--json");
312
+ const propertyArg = getApplicationArg(argv);
313
+ const credArg = argv.find((a) => !a.startsWith("-"));
314
+ if (!credArg) {
315
+ console.error("Error: Missing credential ID or name.");
316
+ console.error("Usage: canary credential test <credId> [--application <name|id>]");
317
+ process.exit(1);
318
+ }
319
+ const credentials = await fetchCredentials(apiUrl, token);
320
+ const candidates = credentials.filter(
321
+ (c) => c.id === credArg || c.name.toLowerCase() === credArg.toLowerCase()
322
+ );
323
+ let credSummary;
324
+ if (candidates.length === 0) {
325
+ console.error(`Error: Credential "${credArg}" not found.`);
326
+ process.exit(1);
327
+ } else if (candidates.length === 1) {
328
+ credSummary = candidates[0];
329
+ } else {
330
+ if (!propertyArg) {
331
+ console.error(`Error: Multiple credentials match "${credArg}". Pass --application to disambiguate.`);
332
+ for (const c of candidates) {
333
+ console.error(` - ${c.id} (${c.propertyName ?? c.propertyId})`);
334
+ }
335
+ process.exit(1);
336
+ }
337
+ const lower = propertyArg.toLowerCase();
338
+ credSummary = candidates.find(
339
+ (c) => c.propertyId === propertyArg || c.propertyName && c.propertyName.toLowerCase() === lower
340
+ );
341
+ if (!credSummary) {
342
+ console.error(`Error: No credential named "${credArg}" on application "${propertyArg}".`);
343
+ process.exit(1);
344
+ }
345
+ }
346
+ const detail = await fetchCredentialDetail(apiUrl, token, credSummary.propertyId, credSummary.id);
347
+ if (!detail) {
348
+ console.error(`Error: Failed to load credential ${credSummary.id}.`);
349
+ process.exit(1);
350
+ }
351
+ if (detail.authProvider === "api_key") {
352
+ console.error(
353
+ `Error: Credential "${detail.name}" uses the api_key auth provider. The browser login test is only valid for browser credentials.`
354
+ );
355
+ process.exit(1);
356
+ }
357
+ const startRes = await apiRequest(
358
+ apiUrl,
359
+ token,
360
+ "POST",
361
+ `/org/properties/${credSummary.propertyId}/credentials/${credSummary.id}/mcp-test/browser-stream`
362
+ );
363
+ if (!startRes.ok || !startRes.streamId) {
364
+ console.error(`Error: ${startRes.error ?? "Failed to start browser login test"}`);
365
+ process.exit(1);
366
+ }
367
+ const { streamId } = startRes;
368
+ if (!jsonOutput) {
369
+ console.log(`Starting browser login test for "${detail.name}" (stream ${streamId})...`);
370
+ }
371
+ const streamRes = await fetch(`${apiUrl}/browser-stream/${streamId}/stream`, {
372
+ headers: { Authorization: `Bearer ${token}`, Accept: "text/event-stream" }
373
+ });
374
+ if (!streamRes.ok || !streamRes.body) {
375
+ console.error(`Failed to connect to event stream: ${streamRes.status}`);
376
+ process.exit(1);
377
+ }
378
+ let exitCode = 0;
379
+ let done = false;
380
+ const parser = createParser({
381
+ onEvent: (event) => {
382
+ if (!event.data) return;
383
+ let data;
384
+ try {
385
+ data = JSON.parse(event.data);
386
+ } catch {
387
+ return;
388
+ }
389
+ if (jsonOutput) {
390
+ console.log(JSON.stringify({ event: event.event, data }));
391
+ } else if (event.event === "browser.action") {
392
+ const action = data;
393
+ console.log(` \u2192 ${action.type ?? "action"}${action.description ? `: ${action.description}` : ""}`);
394
+ } else if (event.event === "browser.status") {
395
+ const status = data;
396
+ if (status.status) {
397
+ console.log(`[${status.status}]${status.message ? ` ${status.message}` : ""}`);
398
+ }
399
+ }
400
+ if (event.event === "browser.status") {
401
+ const status = data;
402
+ if (status.status === "disconnected" || status.status === "error") {
403
+ done = true;
404
+ if (status.status === "error") exitCode = 1;
405
+ }
406
+ }
407
+ }
408
+ });
409
+ const reader = streamRes.body.getReader();
410
+ const decoder = new TextDecoder();
411
+ while (!done) {
412
+ const { value, done: streamDone } = await reader.read();
413
+ if (streamDone) break;
414
+ parser.feed(decoder.decode(value, { stream: true }));
415
+ }
416
+ process.exit(exitCode);
417
+ }
418
+ async function runCredential(argv) {
419
+ const [subCommand, ...rest] = argv;
420
+ if (!subCommand || subCommand === "help" || hasFlag(argv, "--help", "-h")) {
421
+ printCredentialHelp();
422
+ return;
423
+ }
424
+ const { apiUrl, token } = await resolveConfig(rest);
425
+ switch (subCommand) {
426
+ case "list":
427
+ await handleList(rest, apiUrl, token);
428
+ return;
429
+ case "get":
430
+ await handleGet(rest, apiUrl, token);
431
+ return;
432
+ case "create":
433
+ await handleCreate(rest, apiUrl, token);
434
+ return;
435
+ case "update":
436
+ await handleUpdate(rest, apiUrl, token);
437
+ return;
438
+ case "test":
439
+ await handleTest(rest, apiUrl, token);
440
+ return;
441
+ default:
442
+ console.error(`Unknown credential sub-command: ${subCommand}`);
443
+ printCredentialHelp();
444
+ process.exit(1);
445
+ }
446
+ }
447
+ export {
448
+ runCredential
449
+ };
450
+ //# sourceMappingURL=credential-COLTBV6D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/credential.ts"],"sourcesContent":["/**\n * CLI Credential Commands\n *\n * List, inspect, and update credentials for workflow authoring.\n *\n * @module credential\n */\n\nimport process from 'node:process';\nimport { createParser, type EventSourceMessage } from 'eventsource-parser';\nimport { resolveConfig, getArgValue, hasFlag } from './auth.js';\nimport { apiRequest, fetchProperties, getApplicationArg, type CredentialListItem } from './cli-helpers.js';\nimport { apiFetch, exitOnFailure } from './api-fetch.js';\n\nasync function fetchCredentials(apiUrl: string, token: string): Promise<CredentialListItem[]> {\n const result = await apiFetch(`${apiUrl}/org/credentials`, {\n headers: { Authorization: `Bearer ${token}` },\n token,\n });\n\n if (!result.ok) exitOnFailure(result.failure);\n\n const data = (await result.response.json()) as { ok: boolean; items: CredentialListItem[] };\n return data.items ?? [];\n}\n\nfunction printCredentialHelp(): void {\n console.log(\n [\n 'Usage: canary credential <sub-command> [options]',\n '',\n 'Sub-commands:',\n ' list [options] List credentials with environment info',\n ' get <credId|name> [options] Print credential login bundle (URL + instructions + username/password)',\n ' create [options] Create a new credential',\n ' update <credId> [options] Update credential fields',\n ' test <credId> [options] Run the browser login test for a credential',\n '',\n 'List options:',\n ' --application <name> Filter by application name (alias: --property)',\n ' --json Output raw JSON',\n '',\n 'Create options:',\n ' --application <name|id> Application to attach to (required; alias: --property)',\n ' --name <name> Credential name (required)',\n ' --login-url <url> Login URL',\n ' --login-instructions <text> Login instructions',\n ' --username <user> Username (stored encrypted)',\n ' --password <pw> Password (or set CANARY_CRED_PASSWORD)',\n ' --api-key <key> API key (or set CANARY_CRED_API_KEY)',\n ' --mfa-secret <secret> MFA seed (or set CANARY_CRED_MFA_SECRET)',\n ' --json Output raw JSON',\n '',\n 'Update options:',\n ' --login-url <url> Set the login URL',\n ' --name <name> Set the credential name',\n ' --role <role> Set the role (admin, user, viewer, custom)',\n ' --login-instructions <text> Set login instructions',\n ' --json Output raw JSON',\n '',\n 'Test options:',\n ' --application <name|id> Disambiguate when <credId> is a name (alias: --property)',\n ' --json Stream raw SSE events as JSON',\n '',\n 'Common options:',\n ' --env <env> Target environment (prod, dev, local)',\n ' --api-url <url> API URL override',\n ' --token <key> API token override',\n ].join('\\n')\n );\n}\n\nasync function handleList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const jsonFlag = hasFlag(argv, '--json');\n const propertyFilter = getApplicationArg(argv);\n\n let items = await fetchCredentials(apiUrl, token);\n\n if (propertyFilter) {\n const lower = propertyFilter.toLowerCase();\n items = items.filter(\n (c) =>\n c.propertyId === propertyFilter ||\n (c.propertyName && c.propertyName.toLowerCase().includes(lower))\n );\n }\n\n // Filter out ephemeral credentials for cleaner output\n items = items.filter((c) => !(c as unknown as { isEphemeral?: boolean }).isEphemeral);\n\n if (jsonFlag) {\n console.log(JSON.stringify(items, null, 2));\n return;\n }\n\n if (items.length === 0) {\n console.log('No credentials found.');\n return;\n }\n\n console.log(`\\nCredentials (${items.length}):\\n`);\n for (const c of items) {\n const property = c.propertyName ?? c.propertyId;\n const env = c.environmentName ? ` | ${c.environmentName}` : '';\n const baseUrl = c.propertyBaseUrl ? ` | ${c.propertyBaseUrl}` : '';\n const loginUrl = c.loginUrl ? ` Login URL: ${c.loginUrl}\\n` : '';\n console.log(` ${c.name}`);\n console.log(` ID: ${c.id}`);\n console.log(` Application: ${property}${env}${baseUrl}`);\n if (loginUrl) process.stdout.write(loginUrl);\n console.log('');\n }\n}\n\nasync function handleUpdate(argv: string[], apiUrl: string, token: string): Promise<void> {\n const credId = argv.find((a) => !a.startsWith('-'));\n if (!credId) {\n console.error('Error: Missing credential ID.');\n console.error('Usage: canary credential update <credId> --login-url <url> [--name <name>] [--role <role>]');\n process.exit(1);\n }\n\n const loginUrl = getArgValue(argv, '--login-url');\n const name = getArgValue(argv, '--name');\n const role = getArgValue(argv, '--role');\n const loginInstructions = getArgValue(argv, '--login-instructions');\n const jsonOutput = hasFlag(argv, '--json');\n\n if (!loginUrl && !name && !role && !loginInstructions) {\n console.error(\n 'Error: No fields to update. Provide at least one of: --login-url, --name, --role, --login-instructions'\n );\n process.exit(1);\n }\n\n const validRoles = ['admin', 'user', 'viewer', 'custom'];\n if (role && !validRoles.includes(role)) {\n console.error(`Error: Invalid role \"${role}\". Must be one of: ${validRoles.join(', ')}`);\n process.exit(1);\n }\n\n // Auto-resolve propertyId from credential list\n const credentials = await fetchCredentials(apiUrl, token);\n const credential = credentials.find((c) => c.id === credId);\n if (!credential) {\n console.error(`Error: Credential ${credId} not found.`);\n if (credentials.length > 0) {\n console.error('\\nAvailable credentials:');\n for (const c of credentials.slice(0, 10)) {\n console.error(` ${c.id} ${c.name} (${c.propertyName ?? c.propertyId})`);\n }\n }\n process.exit(1);\n }\n\n const body: Record<string, unknown> = {};\n if (loginUrl !== undefined) body.loginUrl = loginUrl;\n if (name !== undefined) body.name = name;\n if (role !== undefined) body.role = role;\n if (loginInstructions !== undefined) body.loginInstructions = loginInstructions;\n\n const result = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl,\n token,\n 'PUT',\n `/org/properties/${credential.propertyId}/credentials/${credId}`,\n body\n );\n\n if (!result.ok) {\n if (jsonOutput) {\n console.log(JSON.stringify({ ok: false, error: result.error ?? 'Unknown error' }, null, 2));\n } else {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n }\n process.exit(1);\n }\n\n if (jsonOutput) {\n console.log(JSON.stringify({ ok: true, credentialId: credId, updated: body }, null, 2));\n return;\n }\n\n console.log(`Updated \"${credential.name}\" (${credId}):`);\n if (loginUrl !== undefined) {\n console.log(` loginUrl: ${credential.loginUrl ?? '(none)'} -> ${loginUrl}`);\n }\n if (name !== undefined) {\n console.log(` name: ${credential.name} -> ${name}`);\n }\n if (role !== undefined) {\n console.log(` role: -> ${role}`);\n }\n if (loginInstructions !== undefined) {\n console.log(` loginInstructions: updated`);\n }\n}\n\nasync function handleCreate(argv: string[], apiUrl: string, token: string): Promise<void> {\n const jsonOutput = hasFlag(argv, '--json');\n const propertyArg = getApplicationArg(argv);\n const name = getArgValue(argv, '--name');\n const loginUrl = getArgValue(argv, '--login-url');\n const loginInstructions = getArgValue(argv, '--login-instructions');\n const username = getArgValue(argv, '--username');\n const password = getArgValue(argv, '--password') ?? process.env.CANARY_CRED_PASSWORD;\n const apiKey = getArgValue(argv, '--api-key') ?? process.env.CANARY_CRED_API_KEY;\n const mfaSecret = getArgValue(argv, '--mfa-secret') ?? process.env.CANARY_CRED_MFA_SECRET;\n\n if (!propertyArg || !name) {\n console.error('Error: --application and --name are required (alias: --property).');\n console.error('Usage: canary credential create --application <name|id> --name <name> [options]');\n process.exit(1);\n }\n\n const properties = await fetchProperties(apiUrl, token);\n const property = properties.find(\n (p) => p.id === propertyArg || p.name.toLowerCase() === propertyArg.toLowerCase()\n );\n if (!property) {\n console.error(`Error: Application \"${propertyArg}\" not found.`);\n if (properties.length > 0) {\n console.error('Available applications:');\n for (const p of properties) console.error(` - ${p.name} (${p.id})`);\n }\n process.exit(1);\n }\n\n const data: Record<string, unknown> = {};\n if (username !== undefined) data.username = username;\n if (password !== undefined) data.password = password;\n if (apiKey !== undefined) data.apiKey = apiKey;\n if (mfaSecret !== undefined) data.mfaSecret = mfaSecret;\n\n const body: Record<string, unknown> = { name, data };\n if (loginUrl !== undefined) body.loginUrl = loginUrl;\n if (loginInstructions !== undefined) body.loginInstructions = loginInstructions;\n\n const result = await apiRequest<{\n ok: boolean;\n id?: string;\n credential?: { id: string };\n error?: string;\n }>(apiUrl, token, 'POST', `/org/properties/${property.id}/credentials`, body);\n\n if (!result.ok) {\n if (jsonOutput) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n }\n process.exit(1);\n }\n\n if (jsonOutput) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(`Created credential \"${name}\" (${result.id}) on application \"${property.name}\"`);\n}\n\ntype CredentialDetail = {\n id: string;\n name: string;\n authProvider?: string;\n loginUrl?: string | null;\n loginInstructions?: string | null;\n postLoginStartUrl?: string | null;\n data?: {\n username?: string;\n password?: string;\n email?: string;\n user?: string;\n mfaSecret?: string;\n apiKey?: string;\n customHeaders?: Record<string, string>;\n [key: string]: unknown;\n } | null;\n};\n\nasync function fetchCredentialDetail(\n apiUrl: string,\n token: string,\n propertyId: string,\n credId: string\n): Promise<CredentialDetail | null> {\n const result = await apiRequest<{ ok: boolean; credential?: CredentialDetail; error?: string }>(\n apiUrl,\n token,\n 'GET',\n `/org/properties/${propertyId}/credentials/${credId}`\n );\n if (!result.ok || !result.credential) return null;\n return result.credential;\n}\n\nasync function handleGet(argv: string[], apiUrl: string, token: string): Promise<void> {\n const jsonOutput = hasFlag(argv, '--json');\n const propertyArg = getApplicationArg(argv);\n const credArg = argv.find((a) => !a.startsWith('-'));\n\n if (!credArg) {\n console.error('Error: Missing credential ID or name.');\n console.error('Usage: canary credential get <credId|name> [--application <name|id>] [--json]');\n process.exit(1);\n }\n\n const credentials = await fetchCredentials(apiUrl, token);\n const candidates = credentials.filter(\n (c) => c.id === credArg || c.name.toLowerCase() === credArg.toLowerCase()\n );\n\n let credSummary: CredentialListItem | undefined;\n if (candidates.length === 0) {\n console.error(`Error: Credential \"${credArg}\" not found.`);\n process.exit(1);\n } else if (candidates.length === 1) {\n credSummary = candidates[0];\n } else {\n if (!propertyArg) {\n console.error(`Error: Multiple credentials match \"${credArg}\". Pass --application to disambiguate.`);\n for (const c of candidates) {\n console.error(` - ${c.id} (${c.propertyName ?? c.propertyId})`);\n }\n process.exit(1);\n }\n const lower = propertyArg.toLowerCase();\n credSummary = candidates.find(\n (c) => c.propertyId === propertyArg || (c.propertyName && c.propertyName.toLowerCase() === lower)\n );\n if (!credSummary) {\n console.error(`Error: No credential named \"${credArg}\" on application \"${propertyArg}\".`);\n process.exit(1);\n }\n }\n\n const detail = await fetchCredentialDetail(apiUrl, token, credSummary.propertyId, credSummary.id);\n if (!detail) {\n console.error(`Error: Failed to load credential ${credSummary.id}.`);\n process.exit(1);\n }\n\n if (jsonOutput) {\n console.log(JSON.stringify(detail, null, 2));\n return;\n }\n\n const data = detail.data ?? {};\n const username = data.username ?? data.email ?? data.user ?? '';\n console.log(`Credential: ${detail.name} (${detail.id})`);\n console.log(` Application: ${credSummary.propertyName ?? credSummary.propertyId}`);\n console.log(` Auth provider: ${detail.authProvider ?? '(unknown)'}`);\n console.log(` Login URL: ${detail.loginUrl ?? '(not set)'}`);\n console.log(` Post-login URL: ${detail.postLoginStartUrl ?? '(not set)'}`);\n if (username) console.log(` Username: ${username}`);\n if (data.password) console.log(` Password: ${data.password}`);\n if (data.mfaSecret) console.log(` MFA secret: ${data.mfaSecret}`);\n console.log('');\n console.log(' Login instructions:');\n if (detail.loginInstructions) {\n for (const line of detail.loginInstructions.split('\\n')) {\n console.log(` ${line}`);\n }\n } else {\n console.log(' (none)');\n }\n}\n\nasync function handleTest(argv: string[], apiUrl: string, token: string): Promise<void> {\n const jsonOutput = hasFlag(argv, '--json');\n const propertyArg = getApplicationArg(argv);\n const credArg = argv.find((a) => !a.startsWith('-'));\n\n if (!credArg) {\n console.error('Error: Missing credential ID or name.');\n console.error('Usage: canary credential test <credId> [--application <name|id>]');\n process.exit(1);\n }\n\n const credentials = await fetchCredentials(apiUrl, token);\n const candidates = credentials.filter(\n (c) => c.id === credArg || c.name.toLowerCase() === credArg.toLowerCase()\n );\n let credSummary: CredentialListItem | undefined;\n if (candidates.length === 0) {\n console.error(`Error: Credential \"${credArg}\" not found.`);\n process.exit(1);\n } else if (candidates.length === 1) {\n credSummary = candidates[0];\n } else {\n if (!propertyArg) {\n console.error(`Error: Multiple credentials match \"${credArg}\". Pass --application to disambiguate.`);\n for (const c of candidates) {\n console.error(` - ${c.id} (${c.propertyName ?? c.propertyId})`);\n }\n process.exit(1);\n }\n const lower = propertyArg.toLowerCase();\n credSummary = candidates.find(\n (c) => c.propertyId === propertyArg || (c.propertyName && c.propertyName.toLowerCase() === lower)\n );\n if (!credSummary) {\n console.error(`Error: No credential named \"${credArg}\" on application \"${propertyArg}\".`);\n process.exit(1);\n }\n }\n\n const detail = await fetchCredentialDetail(apiUrl, token, credSummary.propertyId, credSummary.id);\n if (!detail) {\n console.error(`Error: Failed to load credential ${credSummary.id}.`);\n process.exit(1);\n }\n\n if (detail.authProvider === 'api_key') {\n console.error(\n `Error: Credential \"${detail.name}\" uses the api_key auth provider. The browser login test is only valid for browser credentials.`\n );\n process.exit(1);\n }\n\n const startRes = await apiRequest<{ ok: boolean; streamId?: string; error?: string }>(\n apiUrl,\n token,\n 'POST',\n `/org/properties/${credSummary.propertyId}/credentials/${credSummary.id}/mcp-test/browser-stream`\n );\n\n if (!startRes.ok || !startRes.streamId) {\n console.error(`Error: ${startRes.error ?? 'Failed to start browser login test'}`);\n process.exit(1);\n }\n\n const { streamId } = startRes;\n if (!jsonOutput) {\n console.log(`Starting browser login test for \"${detail.name}\" (stream ${streamId})...`);\n }\n\n const streamRes = await fetch(`${apiUrl}/browser-stream/${streamId}/stream`, {\n headers: { Authorization: `Bearer ${token}`, Accept: 'text/event-stream' },\n });\n\n if (!streamRes.ok || !streamRes.body) {\n console.error(`Failed to connect to event stream: ${streamRes.status}`);\n process.exit(1);\n }\n\n let exitCode = 0;\n let done = false;\n\n const parser = createParser({\n onEvent: (event: EventSourceMessage) => {\n if (!event.data) return;\n let data: unknown;\n try {\n data = JSON.parse(event.data);\n } catch {\n return;\n }\n\n if (jsonOutput) {\n console.log(JSON.stringify({ event: event.event, data }));\n } else if (event.event === 'browser.action') {\n const action = data as { type?: string; description?: string };\n console.log(` → ${action.type ?? 'action'}${action.description ? `: ${action.description}` : ''}`);\n } else if (event.event === 'browser.status') {\n const status = data as { status?: string; message?: string };\n if (status.status) {\n console.log(`[${status.status}]${status.message ? ` ${status.message}` : ''}`);\n }\n }\n\n if (event.event === 'browser.status') {\n const status = data as { status?: string };\n if (status.status === 'disconnected' || status.status === 'error') {\n done = true;\n if (status.status === 'error') exitCode = 1;\n }\n }\n },\n });\n\n const reader = streamRes.body.getReader();\n const decoder = new TextDecoder();\n while (!done) {\n const { value, done: streamDone } = await reader.read();\n if (streamDone) break;\n parser.feed(decoder.decode(value, { stream: true }));\n }\n\n process.exit(exitCode);\n}\n\nexport async function runCredential(argv: string[]): Promise<void> {\n const [subCommand, ...rest] = argv;\n\n if (!subCommand || subCommand === 'help' || hasFlag(argv, '--help', '-h')) {\n printCredentialHelp();\n return;\n }\n\n const { apiUrl, token } = await resolveConfig(rest);\n\n switch (subCommand) {\n case 'list':\n await handleList(rest, apiUrl, token);\n return;\n case 'get':\n await handleGet(rest, apiUrl, token);\n return;\n case 'create':\n await handleCreate(rest, apiUrl, token);\n return;\n case 'update':\n await handleUpdate(rest, apiUrl, token);\n return;\n case 'test':\n await handleTest(rest, apiUrl, token);\n return;\n default:\n console.error(`Unknown credential sub-command: ${subCommand}`);\n printCredentialHelp();\n process.exit(1);\n }\n}\n"],"mappings":"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","names":[]}