@canaryai/cli 0.2.12 → 0.2.14

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 (73) hide show
  1. package/dist/{chunk-CEW4BDXD.js → chunk-4A4G5KTC.js} +14 -6
  2. package/dist/chunk-4A4G5KTC.js.map +1 -0
  3. package/dist/{chunk-MSMC6UXW.js → chunk-6IAPGYZQ.js} +1016 -245
  4. package/dist/chunk-6IAPGYZQ.js.map +1 -0
  5. package/dist/{chunk-PWWQGYFG.js → chunk-ACRIE2YR.js} +5 -2
  6. package/dist/chunk-ACRIE2YR.js.map +1 -0
  7. package/dist/{chunk-ERSNYLMZ.js → chunk-BOS2YLKH.js} +12 -8
  8. package/dist/chunk-BOS2YLKH.js.map +1 -0
  9. package/dist/{chunk-A44B2PEA.js → chunk-SYPQF57S.js} +40 -8
  10. package/dist/chunk-SYPQF57S.js.map +1 -0
  11. package/dist/{chunk-Q7WFBG5C.js → chunk-ZQF72UTG.js} +19 -5
  12. package/dist/chunk-ZQF72UTG.js.map +1 -0
  13. package/dist/{debug-workflow-53ULOFJC.js → debug-workflow-DIQZDFMN.js} +10 -12
  14. package/dist/debug-workflow-DIQZDFMN.js.map +1 -0
  15. package/dist/{docs-BEE3LOCO.js → docs-CSVSGIGW.js} +63 -15
  16. package/dist/docs-CSVSGIGW.js.map +1 -0
  17. package/dist/{feature-flag-CYTDV4ZB.js → feature-flag-BIPFVVNC.js} +3 -3
  18. package/dist/index.d.ts +2 -2
  19. package/dist/index.js +36 -30
  20. package/dist/index.js.map +1 -1
  21. package/dist/{init-M6I3MG3D.js → init-BTDX5N6P.js} +4 -4
  22. package/dist/{issues-NLM72HLU.js → issues-EWVB52CA.js} +37 -18
  23. package/dist/issues-EWVB52CA.js.map +1 -0
  24. package/dist/{knobs-O35GAU5M.js → knobs-VYABZESR.js} +3 -3
  25. package/dist/{list-4K4EIGAT.js → list-RCPYLS36.js} +3 -3
  26. package/dist/list-RCPYLS36.js.map +1 -0
  27. package/dist/{local-NHXXPHZ3.js → local-ZPVM4BXX.js} +6 -6
  28. package/dist/{local-browser-VAZORCO3.js → local-browser-WV4IH2DU.js} +4 -4
  29. package/dist/{login-ZLP64YQP.js → login-W4GXV3VA.js} +4 -4
  30. package/dist/{mcp-ZF5G5DCB.js → mcp-YER5GQG7.js} +7 -10
  31. package/dist/mcp-YER5GQG7.js.map +1 -0
  32. package/dist/{psql-2YPIRMDY.js → psql-XO5BB5L5.js} +2 -2
  33. package/dist/{record-V6QKFFH3.js → record-KRS2PHMW.js} +7 -7
  34. package/dist/record-KRS2PHMW.js.map +1 -0
  35. package/dist/{redis-A7GWM23E.js → redis-CQTBPZ6F.js} +2 -2
  36. package/dist/{release-7TI7EIGD.js → release-DW7RPQSQ.js} +2 -2
  37. package/dist/runner/preload.js +1 -1
  38. package/dist/{session-UGNJXRUW.js → session-CLWAVJ2K.js} +33 -12
  39. package/dist/{session-UGNJXRUW.js.map → session-CLWAVJ2K.js.map} +1 -1
  40. package/dist/{skill-ORWAPBDW.js → skill-2TXI3IKP.js} +1 -1
  41. package/dist/skill-2TXI3IKP.js.map +1 -0
  42. package/dist/{src-4VIDSK4A.js → src-WLOHOI6P.js} +8 -2
  43. package/dist/{start-E532F3BU.js → start-CNNQUP5I.js} +4 -4
  44. package/dist/test.js +1 -1
  45. package/dist/test.js.map +1 -1
  46. package/dist/{workflow-HXIUXRFI.js → workflow-XXL4H5R4.js} +23 -11
  47. package/dist/workflow-XXL4H5R4.js.map +1 -0
  48. package/package.json +1 -2
  49. package/dist/chunk-A44B2PEA.js.map +0 -1
  50. package/dist/chunk-CEW4BDXD.js.map +0 -1
  51. package/dist/chunk-ERSNYLMZ.js.map +0 -1
  52. package/dist/chunk-MSMC6UXW.js.map +0 -1
  53. package/dist/chunk-PWWQGYFG.js.map +0 -1
  54. package/dist/chunk-Q7WFBG5C.js.map +0 -1
  55. package/dist/debug-workflow-53ULOFJC.js.map +0 -1
  56. package/dist/docs-BEE3LOCO.js.map +0 -1
  57. package/dist/issues-NLM72HLU.js.map +0 -1
  58. package/dist/list-4K4EIGAT.js.map +0 -1
  59. package/dist/mcp-ZF5G5DCB.js.map +0 -1
  60. package/dist/record-V6QKFFH3.js.map +0 -1
  61. package/dist/skill-ORWAPBDW.js.map +0 -1
  62. package/dist/workflow-HXIUXRFI.js.map +0 -1
  63. /package/dist/{feature-flag-CYTDV4ZB.js.map → feature-flag-BIPFVVNC.js.map} +0 -0
  64. /package/dist/{init-M6I3MG3D.js.map → init-BTDX5N6P.js.map} +0 -0
  65. /package/dist/{knobs-O35GAU5M.js.map → knobs-VYABZESR.js.map} +0 -0
  66. /package/dist/{local-NHXXPHZ3.js.map → local-ZPVM4BXX.js.map} +0 -0
  67. /package/dist/{local-browser-VAZORCO3.js.map → local-browser-WV4IH2DU.js.map} +0 -0
  68. /package/dist/{login-ZLP64YQP.js.map → login-W4GXV3VA.js.map} +0 -0
  69. /package/dist/{psql-2YPIRMDY.js.map → psql-XO5BB5L5.js.map} +0 -0
  70. /package/dist/{redis-A7GWM23E.js.map → redis-CQTBPZ6F.js.map} +0 -0
  71. /package/dist/{release-7TI7EIGD.js.map → release-DW7RPQSQ.js.map} +0 -0
  72. /package/dist/{src-4VIDSK4A.js.map → src-WLOHOI6P.js.map} +0 -0
  73. /package/dist/{start-E532F3BU.js.map → start-CNNQUP5I.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/debug-workflow.ts"],"sourcesContent":["/**\n * Debug Workflow Command\n *\n * Runs a workflow in a local headed browser for debugging. Replays cached\n * actions where possible and falls back to the agent for uncached steps.\n * The browser stays open after execution so the user can inspect page state.\n *\n * Usage:\n * canary debug <workflowId> [--to-step N] [--api-url URL] [--env local|dev|prod]\n *\n * @module debug-workflow\n */\n\nimport fs from 'node:fs/promises';\nimport process from 'node:process';\nimport { createParser, type EventSourceMessage } from 'eventsource-parser';\nimport { resolveConfig, getArgValue, hasFlag } from './auth';\nimport { downloadStorageState } from './cli-helpers.js';\nimport { LocalBrowserHost } from './local-browser/host';\n\ninterface CreateSessionResponse {\n ok: boolean;\n sessionId: string;\n wsToken: string;\n wsUrl: string;\n expiresAt: string;\n error?: string;\n}\n\ninterface DebugSessionResponse {\n ok: boolean;\n sessionId?: string;\n workflowName?: string;\n nodes?: Array<{\n index: number;\n id: string;\n name: string;\n type: string;\n }>;\n isAuthenticated?: boolean;\n credential?: { credentialId: string; propertyId: string } | null;\n error?: string;\n}\n\ninterface StepStartedEvent {\n type: 'step-started';\n stepIndex: number;\n totalSteps: number;\n stepName: string;\n nodeType: string;\n nodeId: string;\n}\n\ninterface NodeCompletedEvent {\n type: 'completed';\n stepIndex?: number;\n result: { success: boolean; errorMessage?: string; source?: string };\n}\n\ninterface RunCompleteEvent {\n type: 'run-complete';\n stepsExecuted: number;\n totalSteps: number;\n stoppedEarly: boolean;\n reason?: string;\n}\n\ntype DebugEvent =\n | StepStartedEvent\n | NodeCompletedEvent\n | RunCompleteEvent\n | { type: string; [key: string]: unknown };\n\nexport async function runDebugWorkflow(argv: string[]): Promise<void> {\n const workflowId = argv.find((arg) => !arg.startsWith('-'));\n\n if (!workflowId) {\n console.error('Usage: canary debug <workflowId> [--to-step N] [--env local|dev|prod]');\n process.exit(1);\n }\n\n const toStepStr = getArgValue(argv, '--to-step');\n const toStep = toStepStr ? parseInt(toStepStr, 10) : undefined;\n const verbose = hasFlag(argv, '--verbose', '-v');\n\n if (toStep !== undefined && (isNaN(toStep) || toStep < 1)) {\n console.error('Error: --to-step must be a positive integer');\n process.exit(1);\n }\n\n const { apiUrl, token } = await resolveConfig(argv);\n\n // 1. Create local browser session\n console.log('Creating local browser session...');\n\n let localSession: CreateSessionResponse;\n try {\n const res = await fetch(`${apiUrl}/local-browser/sessions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({ browserMode: 'playwright' }),\n });\n\n if (!res.ok) {\n const text = await res.text();\n console.error(`Failed to create local browser session: ${res.status} ${text}`);\n process.exit(1);\n }\n\n localSession = (await res.json()) as CreateSessionResponse;\n if (!localSession.ok) {\n console.error(`Failed to create session: ${localSession.error}`);\n process.exit(1);\n }\n } catch (err) {\n console.error(`Failed to connect to API: ${err}`);\n process.exit(1);\n }\n\n // 2. Create debug session (before browser launch so we can download storage state)\n console.log('Loading workflow...');\n\n let debugSession: DebugSessionResponse;\n try {\n const res = await fetch(`${apiUrl}/cli/debug/sessions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({\n workflowId,\n localBrowserSessionId: localSession.sessionId,\n }),\n });\n\n if (!res.ok) {\n const text = await res.text();\n console.error(`Failed to create debug session: ${res.status} ${text}`);\n process.exit(1);\n }\n\n debugSession = (await res.json()) as DebugSessionResponse;\n if (!debugSession.ok || !debugSession.sessionId) {\n console.error(`Failed to create debug session: ${debugSession.error}`);\n process.exit(1);\n }\n } catch (err) {\n console.error(`Failed to create debug session: ${err}`);\n process.exit(1);\n }\n\n const debugSessionId: string | null = debugSession.sessionId;\n\n // 3. Download storage state if the workflow has valid credentials\n let storageStatePath: string | undefined;\n if (debugSession.isAuthenticated && debugSession.credential) {\n console.log('Downloading storage state...');\n storageStatePath = await downloadStorageState({\n apiUrl,\n token,\n propertyId: debugSession.credential.propertyId,\n credentialId: debugSession.credential.credentialId,\n prefix: 'canary-debug-ss',\n });\n if (storageStatePath) {\n console.log('Storage state loaded.');\n } else {\n console.warn('Could not download storage state, continuing without it.');\n }\n }\n\n // 4. Launch headed browser with storage state\n console.log('Launching headed browser...');\n\n const host = new LocalBrowserHost({\n apiUrl,\n wsToken: localSession.wsToken,\n sessionId: localSession.sessionId,\n browserMode: 'playwright',\n headless: false,\n storageStatePath,\n onLog: (level, message, data) => {\n if (verbose) {\n const prefix = `[${level.toUpperCase()}]`;\n if (data) {\n console.log(prefix, message, data);\n } else {\n console.log(prefix, message);\n }\n }\n },\n });\n\n // Set up cleanup\n const cleanup = async () => {\n console.log('\\nShutting down...');\n\n if (debugSessionId) {\n try {\n await fetch(`${apiUrl}/cli/debug/sessions/${debugSessionId}`, {\n method: 'DELETE',\n headers: { Authorization: `Bearer ${token}` },\n });\n } catch {\n // Ignore cleanup errors\n }\n }\n\n if (storageStatePath) {\n await fs.unlink(storageStatePath).catch(() => {});\n }\n\n await host.stop();\n process.exit(0);\n };\n\n process.on('SIGINT', () => void cleanup());\n process.on('SIGTERM', () => void cleanup());\n\n try {\n await host.start();\n } catch (err) {\n console.error(`Failed to start local browser: ${err}`);\n await host.stop();\n process.exit(1);\n }\n\n console.log('Browser connected.');\n console.log();\n\n const nodes = debugSession.nodes ?? [];\n const totalSteps = nodes.length;\n const effectiveToStep = toStep ? Math.min(toStep, totalSteps) : totalSteps;\n\n console.log(`Debugging: \"${debugSession.workflowName}\" (${totalSteps} steps)`);\n if (toStep) {\n console.log(`Running steps 1-${effectiveToStep} of ${totalSteps}`);\n }\n console.log();\n\n // 5. Run steps via SSE\n let runRes: Response;\n try {\n runRes = await fetch(`${apiUrl}/cli/debug/sessions/${debugSessionId}/run`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n Accept: 'text/event-stream',\n },\n body: JSON.stringify({ toStep: effectiveToStep }),\n });\n } catch (err) {\n console.error(`Failed to start execution: ${err}`);\n await cleanup();\n return;\n }\n\n if (!runRes.ok || !runRes.body) {\n console.error(`Failed to start execution: ${runRes.status}`);\n await cleanup();\n return;\n }\n\n // Track execution state\n let currentStep = 0;\n let _hasError = false;\n const stepResults = new Map<number, { name: string; success: boolean; source?: string }>();\n\n const parser = createParser({\n onEvent: (event: EventSourceMessage) => {\n if (!event.data) return;\n\n try {\n const data = JSON.parse(event.data) as DebugEvent;\n\n if (verbose) {\n console.log(`[SSE] ${JSON.stringify(data)}`);\n }\n\n if (data.type === 'step-started') {\n const e = data as StepStartedEvent;\n currentStep = e.stepIndex;\n process.stdout.write(`[${e.stepIndex}/${e.totalSteps}] ${e.stepName} `);\n }\n\n if (data.type === 'completed') {\n const e = data as NodeCompletedEvent;\n const stepIndex = e.stepIndex ?? currentStep;\n const success = e.result.success;\n const source = e.result.source;\n\n if (success) {\n const sourceLabel =\n source === 'cache' ? '(cache)' : source === 'agent' ? '(agent)' : '';\n console.log(`\\u2713 ${sourceLabel}`);\n } else {\n console.log('\\u2717');\n if (e.result.errorMessage) {\n console.log(` Error: ${e.result.errorMessage.slice(0, 200)}`);\n }\n _hasError = true;\n }\n\n stepResults.set(stepIndex, {\n name: `Step ${stepIndex}`,\n success,\n source,\n });\n }\n\n if (data.type === 'run-complete') {\n const e = data as RunCompleteEvent;\n console.log();\n if (e.stoppedEarly) {\n console.log(\n `Stopped at step ${e.stepsExecuted} of ${e.totalSteps}. ${e.reason === 'step-failed' ? 'Step failed.' : 'Error occurred.'}`\n );\n } else {\n console.log(`All ${e.stepsExecuted} step(s) completed.`);\n }\n }\n\n if (data.type === 'run-error') {\n const errorData = data as { error?: string };\n console.log(`\\u2717`);\n if (errorData.error) {\n console.log(` Error: ${String(errorData.error).slice(0, 200)}`);\n }\n _hasError = true;\n }\n } catch {\n // Ignore parse errors\n }\n },\n });\n\n const reader = runRes.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n parser.feed(decoder.decode(value, { stream: true }));\n }\n } finally {\n reader.releaseLock();\n }\n\n // 6. Keep browser open for inspection\n console.log();\n console.log('Browser is open for inspection.');\n console.log('Press Ctrl+C to close.');\n\n // Keep the process running until Ctrl+C\n await new Promise(() => {});\n}\n"],"mappings":"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","names":[]}
@@ -2,12 +2,12 @@ import { createRequire as __cr } from "module"; const require = __cr(import.meta
2
2
  import {
3
3
  apiRequest,
4
4
  fetchList
5
- } from "./chunk-ERSNYLMZ.js";
5
+ } from "./chunk-BOS2YLKH.js";
6
6
  import {
7
7
  getArgValue,
8
8
  hasFlag,
9
9
  resolveConfig
10
- } from "./chunk-PWWQGYFG.js";
10
+ } from "./chunk-ACRIE2YR.js";
11
11
  import {
12
12
  getSubDir
13
13
  } from "./chunk-XAA5VQ5N.js";
@@ -122,10 +122,9 @@ async function handleHistory(argv, apiUrl, token) {
122
122
  process.exit(1);
123
123
  }
124
124
  const jsonOutput = hasFlag(argv, "--json");
125
- const res = await fetch(
126
- `${apiUrl}/public/docs/pages/versions?slug=${encodeURIComponent(slug)}`,
127
- { headers: { Authorization: `Bearer ${token}` } }
128
- );
125
+ const res = await fetch(`${apiUrl}/public/docs/pages/versions?slug=${encodeURIComponent(slug)}`, {
126
+ headers: { Authorization: `Bearer ${token}` }
127
+ });
129
128
  if (!res.ok) {
130
129
  const body2 = await res.json().catch(() => ({ error: res.statusText }));
131
130
  console.error(`Error: ${body2.error ?? res.statusText}`);
@@ -173,19 +172,63 @@ async function handleCreate(argv, apiUrl, token) {
173
172
  console.error(`Error: Could not read file: ${filePath}`);
174
173
  process.exit(1);
175
174
  }
176
- const result = await apiRequest(apiUrl, token, "POST", "/superadmin/docs/pages", {
177
- slug,
178
- title,
179
- description,
180
- content,
181
- message
182
- });
175
+ const result = await apiRequest(
176
+ apiUrl,
177
+ token,
178
+ "POST",
179
+ "/superadmin/docs/pages",
180
+ {
181
+ slug,
182
+ title,
183
+ description,
184
+ content,
185
+ message
186
+ }
187
+ );
183
188
  if (!result.ok) {
184
189
  console.error(`Error: ${result.error}`);
185
190
  process.exit(1);
186
191
  }
187
192
  console.log(`Created page: ${slug}`);
188
193
  }
194
+ async function handleSearch(argv, apiUrl, token) {
195
+ const query = argv.filter((a) => !a.startsWith("--")).join(" ").trim();
196
+ if (!query) {
197
+ console.error("Error: Missing search query.");
198
+ console.error("Usage: canary docs search <query> [--limit <n>] [--json]");
199
+ process.exit(1);
200
+ }
201
+ const jsonOutput = hasFlag(argv, "--json");
202
+ const limitArg = getArgValue(argv, "--limit");
203
+ const params = new URLSearchParams({ q: query });
204
+ if (limitArg) params.set("limit", limitArg);
205
+ const res = await fetch(`${apiUrl}/public/docs/search?${params.toString()}`, {
206
+ headers: { Authorization: `Bearer ${token}` }
207
+ });
208
+ if (!res.ok) {
209
+ const body2 = await res.json().catch(() => ({ error: res.statusText }));
210
+ console.error(`Error: ${body2.error ?? res.statusText}`);
211
+ process.exit(1);
212
+ }
213
+ const body = await res.json();
214
+ const results = body.data?.results ?? [];
215
+ if (jsonOutput) {
216
+ console.log(JSON.stringify(results, null, 2));
217
+ return;
218
+ }
219
+ if (results.length === 0) {
220
+ console.log("No results found.");
221
+ return;
222
+ }
223
+ for (const r of results) {
224
+ const desc = r.description ? ` ${r.description}` : "";
225
+ const excerpt = r.excerpt ? ` ${r.excerpt.replace(/<\/?mark>/g, "").replace(/\n/g, " ").slice(0, 120)}` : "";
226
+ console.log(` ${r.path ?? r.title}`);
227
+ if (r.title) console.log(` ${r.title}${desc}`);
228
+ if (excerpt) console.log(` ${excerpt}`);
229
+ console.log();
230
+ }
231
+ }
189
232
  async function handleDelete(argv, apiUrl, token) {
190
233
  const slug = argv[0];
191
234
  if (!slug || slug.startsWith("--")) {
@@ -213,6 +256,7 @@ function printDocsHelp() {
213
256
  "Sub-commands:",
214
257
  " list List all doc pages",
215
258
  " get <slug> Print content to stdout",
259
+ " search <query> Full-text search docs",
216
260
  " pull <slug> [--output <path>] Download to local file",
217
261
  " push <slug> --file <path> [--message] Publish new version",
218
262
  " history <slug> Show version history",
@@ -224,8 +268,9 @@ function printDocsHelp() {
224
268
  " --title <text> Page title (create only)",
225
269
  " --description <text> Page description (create only)",
226
270
  " --message <text> Version commit message",
271
+ " --limit <n> Max results for search (default: 8, max: 20)",
227
272
  " --output <path> Output path for pull (default: /tmp/canary/docs/<slug>.md)",
228
- " --json Output as JSON (list, history)",
273
+ " --json Output as JSON (list, history, search)",
229
274
  " --env <env> Target environment (prod, dev)",
230
275
  " --api-url <url> API URL override",
231
276
  " --token <key> API token override"
@@ -246,6 +291,9 @@ async function runDocs(argv) {
246
291
  case "get":
247
292
  await handleGet(rest, apiUrl, token);
248
293
  break;
294
+ case "search":
295
+ await handleSearch(rest, apiUrl, token);
296
+ break;
249
297
  case "pull":
250
298
  await handlePull(rest, apiUrl, token);
251
299
  break;
@@ -270,4 +318,4 @@ async function runDocs(argv) {
270
318
  export {
271
319
  runDocs
272
320
  };
273
- //# sourceMappingURL=docs-BEE3LOCO.js.map
321
+ //# sourceMappingURL=docs-CSVSGIGW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/docs.ts"],"sourcesContent":["/**\n * CLI Documentation Management\n *\n * Allows agents and superadmins to list, pull, edit, and push documentation pages.\n */\n\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport path from 'node:path';\nimport { getSubDir } from '@chatsdet/tmp';\nimport process from 'node:process';\nimport { resolveConfig, getArgValue, hasFlag } from './auth.js';\nimport { apiRequest, fetchList } from './cli-helpers.js';\n\ntype DocsPageListItem = {\n slug: string;\n title: string;\n description: string | null;\n updatedAt: string;\n publishedBy: string | null;\n};\n\ntype DocsVersionItem = {\n version: number;\n title: string;\n checksum: string;\n message: string | null;\n createdBy: string;\n createdAt: string;\n};\n\ntype DocsApiResponse = {\n ok: boolean;\n error?: string;\n data?: {\n slug?: string;\n title?: string;\n pages?: DocsPageListItem[];\n content?: string;\n versions?: DocsVersionItem[];\n };\n};\n\nconst DEFAULT_PULL_DIR = getSubDir('docs');\n\nasync function handleList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const jsonOutput = hasFlag(argv, '--json');\n const pages = await fetchList<DocsPageListItem>(apiUrl, token, '/public/docs/pages', 'pages');\n\n if (jsonOutput) {\n console.log(JSON.stringify(pages, null, 2));\n return;\n }\n\n if (pages.length === 0) {\n console.log('No documentation pages found.');\n return;\n }\n\n for (const page of pages) {\n const date = new Date(page.updatedAt).toISOString().slice(0, 10);\n const by = page.publishedBy ? ` (${page.publishedBy})` : '';\n console.log(` ${page.slug} ${page.title} [${date}${by}]`);\n }\n}\n\nasync function handleGet(argv: string[], apiUrl: string, token: string): Promise<void> {\n const slug = argv[0];\n if (!slug || slug.startsWith('--')) {\n console.error('Error: Missing slug.');\n console.error('Usage: canary docs get <slug>');\n process.exit(1);\n }\n\n const res = await fetch(`${apiUrl}/public/docs/pages/raw?slug=${encodeURIComponent(slug)}`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n\n if (res.status === 404) {\n console.error(`Error: Page not found: ${slug}`);\n process.exit(1);\n }\n\n if (!res.ok) {\n console.error(`Error: ${res.statusText}`);\n process.exit(1);\n }\n\n const content = await res.text();\n console.log(content);\n}\n\nasync function handlePull(argv: string[], apiUrl: string, token: string): Promise<void> {\n const slug = argv[0];\n if (!slug || slug.startsWith('--')) {\n console.error('Error: Missing slug.');\n console.error('Usage: canary docs pull <slug> [--output <path>]');\n process.exit(1);\n }\n\n const outputPath = getArgValue(argv, '--output') ?? path.join(DEFAULT_PULL_DIR, `${slug}.md`);\n\n const res = await fetch(`${apiUrl}/public/docs/pages/raw?slug=${encodeURIComponent(slug)}`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n\n if (res.status === 404) {\n console.error(`Error: Page not found: ${slug}`);\n process.exit(1);\n }\n\n if (!res.ok) {\n console.error(`Error: ${res.statusText}`);\n process.exit(1);\n }\n\n const content = await res.text();\n await mkdir(path.dirname(outputPath), { recursive: true });\n await writeFile(outputPath, content, 'utf8');\n console.log(`Pulled ${slug} → ${outputPath}`);\n}\n\nasync function handlePush(argv: string[], apiUrl: string, token: string): Promise<void> {\n const slug = argv[0];\n if (!slug || slug.startsWith('--')) {\n console.error('Error: Missing slug.');\n console.error('Usage: canary docs push <slug> --file <path> [--message <text>]');\n process.exit(1);\n }\n\n const filePath = getArgValue(argv, '--file');\n if (!filePath) {\n console.error('Error: Missing --file <path>.');\n process.exit(1);\n }\n\n const message = getArgValue(argv, '--message') ?? undefined;\n const createdBy = getArgValue(argv, '--created-by') ?? undefined;\n\n let content: string;\n try {\n content = await readFile(filePath, 'utf8');\n } catch {\n console.error(`Error: Could not read file: ${filePath}`);\n process.exit(1);\n }\n\n const result = await apiRequest<DocsApiResponse>(\n apiUrl,\n token,\n 'PUT',\n `/superadmin/docs/pages?slug=${encodeURIComponent(slug)}`,\n { content, message, createdBy }\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n\n console.log(`Published new version of ${slug}`);\n}\n\nasync function handleHistory(argv: string[], apiUrl: string, token: string): Promise<void> {\n const slug = argv[0];\n if (!slug || slug.startsWith('--')) {\n console.error('Error: Missing slug.');\n console.error('Usage: canary docs history <slug>');\n process.exit(1);\n }\n\n const jsonOutput = hasFlag(argv, '--json');\n\n const res = await fetch(`${apiUrl}/public/docs/pages/versions?slug=${encodeURIComponent(slug)}`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({ error: res.statusText }));\n console.error(`Error: ${(body as { error?: string }).error ?? res.statusText}`);\n process.exit(1);\n }\n\n const body = (await res.json()) as DocsApiResponse;\n const versions = body.data?.versions ?? [];\n\n if (jsonOutput) {\n console.log(JSON.stringify(versions, null, 2));\n return;\n }\n\n if (versions.length === 0) {\n console.log(`No versions found for ${slug}.`);\n return;\n }\n\n for (const v of versions) {\n const date = new Date(v.createdAt).toISOString().slice(0, 19).replace('T', ' ');\n const msg = v.message ? ` — ${v.message}` : '';\n console.log(` v${v.version} ${date} ${v.createdBy}${msg}`);\n }\n}\n\nasync function handleCreate(argv: string[], apiUrl: string, token: string): Promise<void> {\n const slug = argv[0];\n if (!slug || slug.startsWith('--')) {\n console.error('Error: Missing slug.');\n console.error('Usage: canary docs create <slug> --file <path> --title <text>');\n process.exit(1);\n }\n\n const filePath = getArgValue(argv, '--file');\n const title = getArgValue(argv, '--title');\n\n if (!filePath) {\n console.error('Error: Missing --file <path>.');\n process.exit(1);\n }\n if (!title) {\n console.error('Error: Missing --title <text>.');\n process.exit(1);\n }\n\n const description = getArgValue(argv, '--description') ?? undefined;\n const message = getArgValue(argv, '--message') ?? undefined;\n\n let content: string;\n try {\n content = await readFile(filePath, 'utf8');\n } catch {\n console.error(`Error: Could not read file: ${filePath}`);\n process.exit(1);\n }\n\n const result = await apiRequest<DocsApiResponse>(\n apiUrl,\n token,\n 'POST',\n '/superadmin/docs/pages',\n {\n slug,\n title,\n description,\n content,\n message,\n }\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n\n console.log(`Created page: ${slug}`);\n}\n\ntype DocsSearchResult = {\n path: string;\n title: string;\n description: string | null;\n excerpt: string;\n};\n\ntype DocsSearchResponse = {\n ok: boolean;\n error?: string;\n data?: { results: DocsSearchResult[] };\n};\n\nasync function handleSearch(argv: string[], apiUrl: string, token: string): Promise<void> {\n const query = argv.filter((a) => !a.startsWith('--')).join(' ').trim();\n if (!query) {\n console.error('Error: Missing search query.');\n console.error('Usage: canary docs search <query> [--limit <n>] [--json]');\n process.exit(1);\n }\n\n const jsonOutput = hasFlag(argv, '--json');\n const limitArg = getArgValue(argv, '--limit');\n const params = new URLSearchParams({ q: query });\n if (limitArg) params.set('limit', limitArg);\n\n const res = await fetch(`${apiUrl}/public/docs/search?${params.toString()}`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({ error: res.statusText }));\n console.error(`Error: ${(body as { error?: string }).error ?? res.statusText}`);\n process.exit(1);\n }\n\n const body = (await res.json()) as DocsSearchResponse;\n const results = body.data?.results ?? [];\n\n if (jsonOutput) {\n console.log(JSON.stringify(results, null, 2));\n return;\n }\n\n if (results.length === 0) {\n console.log('No results found.');\n return;\n }\n\n for (const r of results) {\n const desc = r.description ? ` ${r.description}` : '';\n const excerpt = r.excerpt\n ? ` ${r.excerpt.replace(/<\\/?mark>/g, '').replace(/\\n/g, ' ').slice(0, 120)}`\n : '';\n console.log(` ${r.path ?? r.title}`);\n if (r.title) console.log(` ${r.title}${desc}`);\n if (excerpt) console.log(` ${excerpt}`);\n console.log();\n }\n}\n\nasync function handleDelete(argv: string[], apiUrl: string, token: string): Promise<void> {\n const slug = argv[0];\n if (!slug || slug.startsWith('--')) {\n console.error('Error: Missing slug.');\n console.error('Usage: canary docs delete <slug>');\n process.exit(1);\n }\n\n const result = await apiRequest<DocsApiResponse>(\n apiUrl,\n token,\n 'DELETE',\n `/superadmin/docs/pages?slug=${encodeURIComponent(slug)}`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n\n console.log(`Deleted page: ${slug}`);\n}\n\nfunction printDocsHelp(): void {\n console.log(\n [\n 'Usage: canary docs <sub-command> [options]',\n '',\n 'Sub-commands:',\n ' list List all doc pages',\n ' get <slug> Print content to stdout',\n ' search <query> Full-text search docs',\n ' pull <slug> [--output <path>] Download to local file',\n ' push <slug> --file <path> [--message] Publish new version',\n ' history <slug> Show version history',\n ' create <slug> --file <path> --title ... Create new page',\n ' delete <slug> Soft-delete a page',\n '',\n 'Options:',\n ' --file <path> Path to markdown file',\n ' --title <text> Page title (create only)',\n ' --description <text> Page description (create only)',\n ' --message <text> Version commit message',\n ' --limit <n> Max results for search (default: 8, max: 20)',\n ' --output <path> Output path for pull (default: /tmp/canary/docs/<slug>.md)',\n ' --json Output as JSON (list, history, search)',\n ' --env <env> Target environment (prod, dev)',\n ' --api-url <url> API URL override',\n ' --token <key> API token override',\n ].join('\\n')\n );\n}\n\nexport async function runDocs(argv: string[]): Promise<void> {\n const [subCommand, ...rest] = argv;\n\n if (!subCommand || subCommand === 'help' || hasFlag(argv, '--help', '-h')) {\n printDocsHelp();\n return;\n }\n\n const { apiUrl, token } = await resolveConfig(argv);\n\n switch (subCommand) {\n case 'list':\n await handleList(rest, apiUrl, token);\n break;\n case 'get':\n await handleGet(rest, apiUrl, token);\n break;\n case 'search':\n await handleSearch(rest, apiUrl, token);\n break;\n case 'pull':\n await handlePull(rest, apiUrl, token);\n break;\n case 'push':\n await handlePush(rest, apiUrl, token);\n break;\n case 'history':\n await handleHistory(rest, apiUrl, token);\n break;\n case 'create':\n await handleCreate(rest, apiUrl, token);\n break;\n case 'delete':\n await handleDelete(rest, apiUrl, token);\n break;\n default:\n console.error(`Unknown sub-command: ${subCommand}`);\n printDocsHelp();\n process.exit(1);\n }\n}\n"],"mappings":"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","names":["body"]}
@@ -4,12 +4,12 @@ import {
4
4
  fetchList,
5
5
  parseLifecycleStage,
6
6
  toLifecycleLabel
7
- } from "./chunk-ERSNYLMZ.js";
7
+ } from "./chunk-BOS2YLKH.js";
8
8
  import {
9
9
  getArgValue,
10
10
  hasFlag,
11
11
  resolveConfig
12
- } from "./chunk-PWWQGYFG.js";
12
+ } from "./chunk-ACRIE2YR.js";
13
13
  import "./chunk-XAA5VQ5N.js";
14
14
  import "./chunk-VKVL7WBN.js";
15
15
 
@@ -277,4 +277,4 @@ async function runFeatureFlag(argv) {
277
277
  export {
278
278
  runFeatureFlag
279
279
  };
280
- //# sourceMappingURL=feature-flag-CYTDV4ZB.js.map
280
+ //# sourceMappingURL=feature-flag-BIPFVVNC.js.map
package/dist/index.d.ts CHANGED
@@ -20,10 +20,10 @@ type RunRequest = {
20
20
  cliArgs?: string[];
21
21
  env?: Record<string, string>;
22
22
  healing?: HealingOptions;
23
- reporter?: "default" | "json" | string;
23
+ reporter?: 'default' | 'json' | string;
24
24
  timeoutMs?: number;
25
25
  nodeBin?: string;
26
- stdio?: "inherit" | "pipe";
26
+ stdio?: 'inherit' | 'pipe';
27
27
  };
28
28
  type RunResult = {
29
29
  ok: boolean;
package/dist/index.js CHANGED
@@ -9,7 +9,7 @@ import {
9
9
  readStoredToken,
10
10
  resolveConfig,
11
11
  saveAuth
12
- } from "./chunk-PWWQGYFG.js";
12
+ } from "./chunk-ACRIE2YR.js";
13
13
  import {
14
14
  makeTempDirSync
15
15
  } from "./chunk-XAA5VQ5N.js";
@@ -178,11 +178,10 @@ function buildReporterArgs(requested, jsonReportPath) {
178
178
  if (requested && requested !== "default") return requested;
179
179
  return `list,json=${jsonReportPath}`;
180
180
  }
181
- function prepareArtifactsDir(cwd) {
181
+ function prepareArtifactsDir(_cwd) {
182
182
  const dir = makeTempDirSync("canary-run-");
183
183
  const jsonReportPath = path2.join(dir, "report.json");
184
184
  const eventLogPath = path2.join(dir, "events-worker-0.jsonl");
185
- const artifactsDir = path2.join(cwd, "test-results", "ai-healer");
186
185
  return { jsonReportPath, eventLogPath, artifactsDir: dir };
187
186
  }
188
187
  function buildEnv(params) {
@@ -237,7 +236,12 @@ async function spawnPlaywright(opts) {
237
236
  }
238
237
  child.on("close", (code) => {
239
238
  if (timer) clearTimeout(timer);
240
- resolve({ exitCode: code ?? 1, output: output || void 0, durationMs: Date.now() - started, error });
239
+ resolve({
240
+ exitCode: code ?? 1,
241
+ output: output || void 0,
242
+ durationMs: Date.now() - started,
243
+ error
244
+ });
241
245
  });
242
246
  });
243
247
  }
@@ -510,7 +514,7 @@ Choice [1-${orgs.length}]: `);
510
514
 
511
515
  // src/orgs.ts
512
516
  import process3 from "process";
513
- async function runOrgs(argv) {
517
+ async function runOrgs(_argv) {
514
518
  const token = process3.env.CANARY_API_TOKEN ?? await readStoredToken();
515
519
  if (!token) {
516
520
  console.error("Not logged in. Run: canary login");
@@ -924,12 +928,12 @@ function isSuperadminToken(token) {
924
928
  // src/index.ts
925
929
  var require2 = createRequire2(import.meta.url);
926
930
  var pkg = require2("../package.json");
927
- var loadMcp = () => import("./mcp-ZF5G5DCB.js").then((m) => m.runMcp);
928
- var loadLocalBrowser = () => import("./local-browser-VAZORCO3.js").then((m) => m.runLocalBrowser);
929
- var loadDebugWorkflow = () => import("./debug-workflow-53ULOFJC.js").then((m) => m.runDebugWorkflow);
930
- var loadRecord = () => import("./record-V6QKFFH3.js").then((m) => m.runRecord);
931
- var loadSession = () => import("./session-UGNJXRUW.js").then((m) => m.runSession);
932
- var loadLocal = () => import("./local-NHXXPHZ3.js").then((m) => m.runLocal);
931
+ var loadMcp = () => import("./mcp-YER5GQG7.js").then((m) => m.runMcp);
932
+ var loadLocalBrowser = () => import("./local-browser-WV4IH2DU.js").then((m) => m.runLocalBrowser);
933
+ var loadDebugWorkflow = () => import("./debug-workflow-DIQZDFMN.js").then((m) => m.runDebugWorkflow);
934
+ var loadRecord = () => import("./record-KRS2PHMW.js").then((m) => m.runRecord);
935
+ var loadSession = () => import("./session-CLWAVJ2K.js").then((m) => m.runSession);
936
+ var loadLocal = () => import("./local-ZPVM4BXX.js").then((m) => m.runLocal);
933
937
  var canary = { run };
934
938
  var baseDir = typeof __dirname !== "undefined" ? __dirname : path4.dirname(fileURLToPath2(import.meta.url));
935
939
  var preloadPath = path4.join(baseDir, "runner", "preload.js");
@@ -977,9 +981,7 @@ function printHelp({ isSuperadmin }) {
977
981
  " canary workflow <sub-command> Inspect workflow definitions",
978
982
  " canary skill <name> Install an AI agent skill template"
979
983
  ];
980
- lines.push(
981
- " canary release <sub-command> Release QA gate (CI/CD)"
982
- );
984
+ lines.push(" canary release <sub-command> Release QA gate (CI/CD)");
983
985
  if (isSuperadmin) {
984
986
  lines.push(
985
987
  " canary debug-session [--env dev|local] [--json] Create browser debug session",
@@ -1083,12 +1085,7 @@ function printHelp({ isSuperadmin }) {
1083
1085
  " Set lifecycle metadata"
1084
1086
  );
1085
1087
  }
1086
- lines.push(
1087
- "",
1088
- "Flags:",
1089
- " -h, --help Show help",
1090
- " -V, --version Show version"
1091
- );
1088
+ lines.push("", "Flags:", " -h, --help Show help", " -V, --version Show version");
1092
1089
  console.log(lines.join("\n"));
1093
1090
  }
1094
1091
  function printTestHelp() {
@@ -1128,7 +1125,16 @@ function printTestHelp() {
1128
1125
  ].join("\n")
1129
1126
  );
1130
1127
  }
1131
- var COMMANDS_WITH_HELP = /* @__PURE__ */ new Set(["test", "session", "local", "issues", "workflow", "release", "skill", "skills"]);
1128
+ var COMMANDS_WITH_HELP = /* @__PURE__ */ new Set([
1129
+ "test",
1130
+ "session",
1131
+ "local",
1132
+ "issues",
1133
+ "workflow",
1134
+ "release",
1135
+ "skill",
1136
+ "skills"
1137
+ ]);
1132
1138
  async function resolveIsSuperadmin() {
1133
1139
  const envToken = process6.env.CANARY_API_TOKEN;
1134
1140
  if (envToken) return isSuperadminToken(envToken);
@@ -1210,47 +1216,47 @@ async function main(argv) {
1210
1216
  return;
1211
1217
  }
1212
1218
  if (command === "psql") {
1213
- const { runPsql } = await import("./psql-2YPIRMDY.js");
1219
+ const { runPsql } = await import("./psql-XO5BB5L5.js");
1214
1220
  await runPsql(rest);
1215
1221
  return;
1216
1222
  }
1217
1223
  if (command === "redis") {
1218
- const { runRedis } = await import("./redis-A7GWM23E.js");
1224
+ const { runRedis } = await import("./redis-CQTBPZ6F.js");
1219
1225
  await runRedis(rest);
1220
1226
  return;
1221
1227
  }
1222
1228
  if (command === "release") {
1223
- const { runRelease } = await import("./release-7TI7EIGD.js");
1229
+ const { runRelease } = await import("./release-DW7RPQSQ.js");
1224
1230
  await runRelease(rest);
1225
1231
  return;
1226
1232
  }
1227
1233
  if (command === "docs") {
1228
- const { runDocs } = await import("./docs-BEE3LOCO.js");
1234
+ const { runDocs } = await import("./docs-CSVSGIGW.js");
1229
1235
  await runDocs(rest);
1230
1236
  return;
1231
1237
  }
1232
1238
  if (command === "feature-flag") {
1233
- const { runFeatureFlag } = await import("./feature-flag-CYTDV4ZB.js");
1239
+ const { runFeatureFlag } = await import("./feature-flag-BIPFVVNC.js");
1234
1240
  await runFeatureFlag(rest);
1235
1241
  return;
1236
1242
  }
1237
1243
  if (command === "knobs") {
1238
- const { runKnobs } = await import("./knobs-O35GAU5M.js");
1244
+ const { runKnobs } = await import("./knobs-VYABZESR.js");
1239
1245
  await runKnobs(rest);
1240
1246
  return;
1241
1247
  }
1242
1248
  if (command === "issues") {
1243
- const { runIssues } = await import("./issues-NLM72HLU.js");
1249
+ const { runIssues } = await import("./issues-EWVB52CA.js");
1244
1250
  await runIssues(rest);
1245
1251
  return;
1246
1252
  }
1247
1253
  if (command === "workflow") {
1248
- const { runWorkflow } = await import("./workflow-HXIUXRFI.js");
1254
+ const { runWorkflow } = await import("./workflow-XXL4H5R4.js");
1249
1255
  await runWorkflow(rest);
1250
1256
  return;
1251
1257
  }
1252
1258
  if (command === "skill" || command === "skills") {
1253
- const { runSkill } = await import("./skill-ORWAPBDW.js");
1259
+ const { runSkill } = await import("./skill-2TXI3IKP.js");
1254
1260
  await runSkill(rest);
1255
1261
  return;
1256
1262
  }