@runcofactor/cli 0.10.0 → 0.13.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.
- package/dist/{api-catalog-GFGCLVS4.js → api-catalog-7HLEN7C2.js} +5 -4
- package/dist/{api-catalog-GFGCLVS4.js.map → api-catalog-7HLEN7C2.js.map} +1 -1
- package/dist/{attachment-SJC7D7FY.js → attachment-OVNQD6Z2.js} +5 -4
- package/dist/{attachment-SJC7D7FY.js.map → attachment-OVNQD6Z2.js.map} +1 -1
- package/dist/{auth-EN6NQCJY.js → auth-VUHL74FH.js} +3 -2
- package/dist/{chunk-IMPZAX6L.js → chunk-5GD47G2D.js} +37 -1
- package/dist/{chunk-IMPZAX6L.js.map → chunk-5GD47G2D.js.map} +1 -1
- package/dist/{chunk-WOHL4FTB.js → chunk-CQE46HSM.js} +5 -5
- package/dist/chunk-CQE46HSM.js.map +1 -0
- package/dist/{chunk-52IO7ACJ.js → chunk-CRHPDPRS.js} +39 -3
- package/dist/{chunk-52IO7ACJ.js.map → chunk-CRHPDPRS.js.map} +1 -1
- package/dist/{chunk-XQXVG7RA.js → chunk-EEN2TZUQ.js} +3 -3
- package/dist/{chunk-I4QLI3JO.js → chunk-EJ4U242G.js} +2 -2
- package/dist/{chunk-CLAWT7BJ.js → chunk-ENDHMYEJ.js} +3 -3
- package/dist/chunk-G4UYGRZR.js +2 -0
- package/dist/chunk-JZMJUPZP.js +92 -0
- package/dist/chunk-JZMJUPZP.js.map +1 -0
- package/dist/{chunk-GKY2KXO5.js → chunk-NL7CVG56.js} +105 -35
- package/dist/chunk-NL7CVG56.js.map +1 -0
- package/dist/{chunk-A4OFTUVV.js → chunk-PZ4LCN6K.js} +7 -4
- package/dist/chunk-PZ4LCN6K.js.map +1 -0
- package/dist/{chunk-SJJW77WN.js → chunk-QGI4UCJX.js} +69 -5
- package/dist/chunk-QGI4UCJX.js.map +1 -0
- package/dist/{chunk-4PNOV7OV.js → chunk-QQVWGWPI.js} +1023 -150
- package/dist/chunk-QQVWGWPI.js.map +1 -0
- package/dist/{chunk-N7HFALX3.js → chunk-VGTKUOYS.js} +2 -2
- package/dist/{chunk-B2VISN2V.js → chunk-YN763NWQ.js} +230 -66
- package/dist/chunk-YN763NWQ.js.map +1 -0
- package/dist/{chunk-QFDOWABX.js → chunk-Z5LUTUDN.js} +6 -3
- package/dist/chunk-Z5LUTUDN.js.map +1 -0
- package/dist/{chunk-Q4BO4Z5V.js → chunk-ZTOE3ND3.js} +4 -4
- package/dist/{credential-COLTBV6D.js → credential-LO2SEEHU.js} +24 -20
- package/dist/credential-LO2SEEHU.js.map +1 -0
- package/dist/{credential-template-EEPYFG7R.js → credential-template-ZN7W7734.js} +30 -28
- package/dist/credential-template-ZN7W7734.js.map +1 -0
- package/dist/{debug-workflow-KOVH5GOP.js → debug-workflow-R3RYYAXK.js} +5 -4
- package/dist/{debug-workflow-KOVH5GOP.js.map → debug-workflow-R3RYYAXK.js.map} +1 -1
- package/dist/{docs-3SSORHB5.js → docs-DIAFBDXQ.js} +5 -4
- package/dist/{docs-3SSORHB5.js.map → docs-DIAFBDXQ.js.map} +1 -1
- package/dist/{doctor-OTSIWV6G.js → doctor-NZPUSCRE.js} +9 -5
- package/dist/doctor-NZPUSCRE.js.map +1 -0
- package/dist/environment-RQVU4P5M.js +221 -0
- package/dist/environment-RQVU4P5M.js.map +1 -0
- package/dist/{feature-flag-T2LRZME3.js → feature-flag-XG26RURR.js} +72 -10
- package/dist/feature-flag-XG26RURR.js.map +1 -0
- package/dist/index.js +57 -48
- package/dist/index.js.map +1 -1
- package/dist/{init-TGWRECT2.js → init-EDNLKGPT.js} +5 -4
- package/dist/{init-TGWRECT2.js.map → init-EDNLKGPT.js.map} +1 -1
- package/dist/{install-DXSNWZKO.js → install-FYZ3HNZK.js} +7 -7
- package/dist/{issues-XIZOPX6T.js → issues-NNRVTJ4L.js} +5 -4
- package/dist/{issues-XIZOPX6T.js.map → issues-NNRVTJ4L.js.map} +1 -1
- package/dist/{knobs-NBINZIUB.js → knobs-A2BOBH22.js} +5 -4
- package/dist/{knobs-NBINZIUB.js.map → knobs-A2BOBH22.js.map} +1 -1
- package/dist/{list-3TDHK637.js → list-F33VZ4BJ.js} +5 -4
- package/dist/{list-3TDHK637.js.map → list-F33VZ4BJ.js.map} +1 -1
- package/dist/{local-HICVD6PU.js → local-DQDTM3XA.js} +7 -6
- package/dist/{local-HICVD6PU.js.map → local-DQDTM3XA.js.map} +1 -1
- package/dist/{login-UOIUXVUK.js → login-BUMVIB36.js} +5 -4
- package/dist/{login-UOIUXVUK.js.map → login-BUMVIB36.js.map} +1 -1
- package/dist/{mcp-54IJEOUA.js → mcp-B5Y5CDMQ.js} +23 -24
- package/dist/mcp-B5Y5CDMQ.js.map +1 -0
- package/dist/{property-UXLOLPTD.js → property-NJ4SRXQG.js} +76 -4
- package/dist/property-NJ4SRXQG.js.map +1 -0
- package/dist/{psql-BYUUNLGG.js → psql-VBZFCMNR.js} +3 -2
- package/dist/{psql-BYUUNLGG.js.map → psql-VBZFCMNR.js.map} +1 -1
- package/dist/{record-4TR2UIIS.js → record-WAO36O7G.js} +16 -17
- package/dist/record-WAO36O7G.js.map +1 -0
- package/dist/{redis-35VBUYW7.js → redis-DHZXHL4S.js} +3 -2
- package/dist/{redis-35VBUYW7.js.map → redis-DHZXHL4S.js.map} +1 -1
- package/dist/{release-OOLTUBUT.js → release-STJKUKTE.js} +5 -4
- package/dist/{release-OOLTUBUT.js.map → release-STJKUKTE.js.map} +1 -1
- package/dist/{sandbox-XGSUU6G7.js → sandbox-DWSGLY7B.js} +9 -8
- package/dist/{sandbox-XGSUU6G7.js.map → sandbox-DWSGLY7B.js.map} +1 -1
- package/dist/{scenarios-GWLJEGHA.js → scenarios-HCIDY725.js} +5 -4
- package/dist/{scenarios-GWLJEGHA.js.map → scenarios-HCIDY725.js.map} +1 -1
- package/dist/{session-MYFNZPRP.js → session-Y5RHU54D.js} +76 -8
- package/dist/session-Y5RHU54D.js.map +1 -0
- package/dist/{skill-KM34LDMO.js → skill-23WAHUOB.js} +217 -67
- package/dist/skill-23WAHUOB.js.map +1 -0
- package/dist/skills/debug-run/SKILL.md +33 -22
- package/dist/skills/debug-run/history/1.2.0.md +262 -0
- package/dist/skills/debug-run/history/1.3.0.md +273 -0
- package/dist/skills/debug-run/version.json +1 -1
- package/dist/skills/optimize-cache/SKILL.md +206 -0
- package/dist/{spec-RA3CFEKG.js → spec-LM5XHOQ5.js} +54 -25
- package/dist/spec-LM5XHOQ5.js.map +1 -0
- package/dist/{src-LB4HBTJQ.js → src-22RI5VP2.js} +19 -11
- package/dist/src-22RI5VP2.js.map +1 -0
- package/dist/src-BGDRMOKC.js +5748 -0
- package/dist/src-BGDRMOKC.js.map +1 -0
- package/dist/{src-N3TPKGTY.js → src-NCJPUAE6.js} +3 -2
- package/dist/{src-UVDX5UP6.js → src-Y3K7UJEF.js} +4 -2
- package/dist/{start-PSEQSQA3.js → start-SWY55CZX.js} +5 -4
- package/dist/{start-PSEQSQA3.js.map → start-SWY55CZX.js.map} +1 -1
- package/dist/{tag-YY6YAABQ.js → tag-YSU2XXPI.js} +6 -5
- package/dist/{task-IQC3YR5K.js → task-NLBKLD7D.js} +5 -4
- package/dist/{task-IQC3YR5K.js.map → task-NLBKLD7D.js.map} +1 -1
- package/dist/{test-suite-DZNJFXDW.js → test-suite-QCPWZ2LS.js} +9 -6
- package/dist/{test-suite-DZNJFXDW.js.map → test-suite-QCPWZ2LS.js.map} +1 -1
- package/dist/{trace-HXIW7U2D.js → trace-A3ZY6K26.js} +6 -4
- package/dist/{triage-ORG45R5W.js → triage-TT4BMDBU.js} +6 -5
- package/dist/triage-TT4BMDBU.js.map +1 -0
- package/dist/{upgrade-L2VYMP2V.js → upgrade-6ZUFETKX.js} +3 -3
- package/dist/{workflow-XYFH5LTP.js → workflow-2CX3ZNOQ.js} +241 -237
- package/dist/workflow-2CX3ZNOQ.js.map +1 -0
- package/dist/{workflow-cache-NQJQFWMV.js → workflow-cache-GXNE6SU2.js} +140 -7
- package/dist/workflow-cache-GXNE6SU2.js.map +1 -0
- package/dist/{workflow-debug-BGD4UIXU.js → workflow-debug-PRX3DWGD.js} +8 -7
- package/dist/{workflow-debug-BGD4UIXU.js.map → workflow-debug-PRX3DWGD.js.map} +1 -1
- package/dist/{workflow-proposals-MTUDX46O.js → workflow-proposals-BW327WGL.js} +5 -4
- package/dist/{workflow-proposals-MTUDX46O.js.map → workflow-proposals-BW327WGL.js.map} +1 -1
- package/package.json +2 -1
- package/dist/chunk-4PNOV7OV.js.map +0 -1
- package/dist/chunk-A4OFTUVV.js.map +0 -1
- package/dist/chunk-B2VISN2V.js.map +0 -1
- package/dist/chunk-GKY2KXO5.js.map +0 -1
- package/dist/chunk-JICSYFRJ.js +0 -46
- package/dist/chunk-JICSYFRJ.js.map +0 -1
- package/dist/chunk-QFDOWABX.js.map +0 -1
- package/dist/chunk-SJJW77WN.js.map +0 -1
- package/dist/chunk-WOHL4FTB.js.map +0 -1
- package/dist/credential-COLTBV6D.js.map +0 -1
- package/dist/credential-template-EEPYFG7R.js.map +0 -1
- package/dist/doctor-OTSIWV6G.js.map +0 -1
- package/dist/feature-flag-T2LRZME3.js.map +0 -1
- package/dist/mcp-54IJEOUA.js.map +0 -1
- package/dist/property-UXLOLPTD.js.map +0 -1
- package/dist/record-4TR2UIIS.js.map +0 -1
- package/dist/session-MYFNZPRP.js.map +0 -1
- package/dist/skill-KM34LDMO.js.map +0 -1
- package/dist/spec-RA3CFEKG.js.map +0 -1
- package/dist/src-LB4HBTJQ.js.map +0 -1
- package/dist/workflow-XYFH5LTP.js.map +0 -1
- package/dist/workflow-cache-NQJQFWMV.js.map +0 -1
- /package/dist/{auth-EN6NQCJY.js.map → auth-VUHL74FH.js.map} +0 -0
- /package/dist/{chunk-XQXVG7RA.js.map → chunk-EEN2TZUQ.js.map} +0 -0
- /package/dist/{chunk-I4QLI3JO.js.map → chunk-EJ4U242G.js.map} +0 -0
- /package/dist/{chunk-CLAWT7BJ.js.map → chunk-ENDHMYEJ.js.map} +0 -0
- /package/dist/{src-N3TPKGTY.js.map → chunk-G4UYGRZR.js.map} +0 -0
- /package/dist/{chunk-N7HFALX3.js.map → chunk-VGTKUOYS.js.map} +0 -0
- /package/dist/{chunk-Q4BO4Z5V.js.map → chunk-ZTOE3ND3.js.map} +0 -0
- /package/dist/{install-DXSNWZKO.js.map → install-FYZ3HNZK.js.map} +0 -0
- /package/dist/{src-UVDX5UP6.js.map → src-NCJPUAE6.js.map} +0 -0
- /package/dist/{tag-YY6YAABQ.js.map → src-Y3K7UJEF.js.map} +0 -0
- /package/dist/{trace-HXIW7U2D.js.map → tag-YSU2XXPI.js.map} +0 -0
- /package/dist/{triage-ORG45R5W.js.map → trace-A3ZY6K26.js.map} +0 -0
- /package/dist/{upgrade-L2VYMP2V.js.map → upgrade-6ZUFETKX.js.map} +0 -0
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { createRequire as __cr } from "module"; const require = __cr(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
apiRequest
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-SJJW77WN.js";
|
|
4
|
+
} from "./chunk-CQE46HSM.js";
|
|
6
5
|
import "./chunk-3CZU7XCS.js";
|
|
7
6
|
import {
|
|
8
7
|
getArgValue,
|
|
9
8
|
hasFlag,
|
|
10
9
|
resolveConfig
|
|
11
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-PZ4LCN6K.js";
|
|
11
|
+
import "./chunk-JZMJUPZP.js";
|
|
12
12
|
import "./chunk-JWHYXEA2.js";
|
|
13
|
+
import "./chunk-QGI4UCJX.js";
|
|
13
14
|
import "./chunk-VKVL7WBN.js";
|
|
14
15
|
|
|
15
16
|
// src/scenarios.ts
|
|
@@ -277,4 +278,4 @@ async function handleReject(argv, apiUrl, token) {
|
|
|
277
278
|
export {
|
|
278
279
|
runScenarios
|
|
279
280
|
};
|
|
280
|
-
//# sourceMappingURL=scenarios-
|
|
281
|
+
//# sourceMappingURL=scenarios-HCIDY725.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/scenarios.ts"],"sourcesContent":["/**\n * `canary scenarios` — drive the scenario candidate review queue.\n *\n * Minimal lifecycle CLI for Phase D of the scenario suite:\n * list / get / claim / commit / reject / bundle\n *\n * Designed to be invoked by an agent (every prompt has a flag\n * equivalent — no interactive input required).\n *\n * @module\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { createHash } from 'node:crypto';\nimport { spawnSync } from 'node:child_process';\nimport process from 'node:process';\nimport { resolveConfig, getArgValue, hasFlag } from './auth.js';\nimport { apiRequest } from './cli-helpers.js';\n\ninterface ScenarioCandidate {\n id: string;\n fingerprint: string;\n status: 'pending' | 'claimed' | 'committed' | 'rejected' | 'duplicate';\n sourceTrigger: 'cache_failure' | 'l3_invocation' | 'sampled' | 'manual';\n sourceRunId: string | null;\n sourceStepIdx: number | null;\n hostSlug: string;\n featureSlug: string | null;\n s3KeyBundle: string;\n bundleBytes: number | null;\n bundleSha256: string | null;\n relatedToFingerprint: string | null;\n capturedAt: string;\n claimedBy: string | null;\n claimedAt: string | null;\n resolutionCommit: string | null;\n resolutionScenarioId: string | null;\n rejectionReason: string | null;\n}\n\ninterface ListResponse {\n ok: boolean;\n error?: string;\n candidates?: ScenarioCandidate[];\n}\n\ninterface SingleResponse {\n ok: boolean;\n error?: string;\n candidate?: ScenarioCandidate;\n}\n\ninterface BundleResponse {\n ok: boolean;\n error?: string;\n url?: string;\n expiresInSeconds?: number;\n sha256?: string | null;\n bytes?: number | null;\n}\n\nfunction printHelp(): void {\n console.log(`canary scenarios — scenario candidate review queue\n\nSubcommands:\n list List pending candidates (LIFO, newest first)\n get <id> Print a single candidate as JSON\n bundle <id> Print the signed bundle URL (for piping into curl)\n claim <id> Claim a candidate; downloads + unzips the bundle\n into apps/api/tests/scenarios/_pending/<id>/\n commit <id> Mark candidate committed\n --commit-sha <sha> (required) git sha of the landing commit\n --scenario-id <name> (required) <host>__<feature>__<hash> in the suite\n reject <id> --reason <r> Mark candidate rejected without committing\n\nCommon flags:\n --json Machine-readable output (for agents)\n --limit <n> list: max rows to return (default 50, max 200)\n --claimed-by <name> claim: who is claiming (default: $USER or 'agent')\n --workdir <path> claim: where to unzip the bundle\n (default: apps/api/tests/scenarios/_pending/<id>)\n`);\n}\n\nexport async function runScenarios(argv: string[]): Promise<void> {\n const sub = argv[0];\n if (!sub || sub === '--help' || sub === '-h') {\n printHelp();\n return;\n }\n\n const rest = argv.slice(1);\n const config = await resolveConfig(rest);\n const { apiUrl, token } = config;\n\n switch (sub) {\n case 'list':\n return handleList(rest, apiUrl, token);\n case 'get':\n return handleGet(rest, apiUrl, token);\n case 'bundle':\n return handleBundle(rest, apiUrl, token);\n case 'claim':\n return handleClaim(rest, apiUrl, token);\n case 'commit':\n return handleCommit(rest, apiUrl, token);\n case 'reject':\n return handleReject(rest, apiUrl, token);\n default:\n console.error(`Unknown subcommand: ${sub}`);\n printHelp();\n process.exit(1);\n }\n}\n\nasync function handleList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const jsonOutput = hasFlag(argv, '--json');\n const limitStr = getArgValue(argv, '--limit');\n const limit = limitStr ? Number.parseInt(limitStr, 10) : 50;\n\n const path = `/superadmin/scenarios/candidates?limit=${limit}`;\n const result = await apiRequest<ListResponse>(apiUrl, token, 'GET', path);\n if (!result.ok || !result.candidates) {\n console.error(`Error: ${result.error ?? 'unknown'}`);\n process.exit(1);\n }\n\n if (jsonOutput) {\n console.log(JSON.stringify(result.candidates, null, 2));\n return;\n }\n\n if (result.candidates.length === 0) {\n console.log('No pending scenario candidates.');\n return;\n }\n console.log(`${result.candidates.length} pending candidate(s):`);\n for (const c of result.candidates) {\n const ageMin = Math.round((Date.now() - new Date(c.capturedAt).getTime()) / 60000);\n console.log(\n ` ${c.id} trigger=${c.sourceTrigger} host=${c.hostSlug} age=${ageMin}m`\n );\n }\n}\n\nasync function handleGet(argv: string[], apiUrl: string, token: string): Promise<void> {\n const id = argv[0];\n if (!id || id.startsWith('--')) {\n console.error('Usage: canary scenarios get <id>');\n process.exit(1);\n }\n const result = await apiRequest<SingleResponse>(\n apiUrl,\n token,\n 'GET',\n `/superadmin/scenarios/candidates/${id}`\n );\n if (!result.ok || !result.candidate) {\n console.error(`Error: ${result.error ?? 'unknown'}`);\n process.exit(1);\n }\n console.log(JSON.stringify(result.candidate, null, 2));\n}\n\nasync function handleBundle(argv: string[], apiUrl: string, token: string): Promise<void> {\n const id = argv[0];\n if (!id || id.startsWith('--')) {\n console.error('Usage: canary scenarios bundle <id>');\n process.exit(1);\n }\n const result = await apiRequest<BundleResponse>(\n apiUrl,\n token,\n 'GET',\n `/superadmin/scenarios/candidates/${id}/bundle`\n );\n if (!result.ok || !result.url) {\n console.error(`Error: ${result.error ?? 'unknown'}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n console.log(result.url);\n}\n\nasync function handleClaim(argv: string[], apiUrl: string, token: string): Promise<void> {\n const id = argv[0];\n if (!id || id.startsWith('--')) {\n console.error('Usage: canary scenarios claim <id> [--claimed-by <name>] [--workdir <path>]');\n process.exit(1);\n }\n const claimedBy = getArgValue(argv, '--claimed-by') ?? process.env.USER ?? 'agent';\n const workdir =\n getArgValue(argv, '--workdir') ??\n path.resolve(process.cwd(), 'apps/api/tests/scenarios/_pending', id);\n\n const claim = await apiRequest<SingleResponse>(\n apiUrl,\n token,\n 'POST',\n `/superadmin/scenarios/candidates/${id}/claim`,\n { claimedBy }\n );\n if (!claim.ok || !claim.candidate) {\n console.error(`Claim failed: ${claim.error ?? 'unknown'}`);\n process.exit(1);\n }\n\n const bundleResp = await apiRequest<BundleResponse>(\n apiUrl,\n token,\n 'GET',\n `/superadmin/scenarios/candidates/${id}/bundle`\n );\n if (!bundleResp.ok || !bundleResp.url) {\n console.error(`Bundle URL fetch failed: ${bundleResp.error ?? 'unknown'}`);\n process.exit(1);\n }\n\n fs.mkdirSync(workdir, { recursive: true });\n const dl = await fetch(bundleResp.url);\n if (!dl.ok) {\n console.error(`Bundle download failed: HTTP ${dl.status}`);\n process.exit(1);\n }\n const buf = Buffer.from(await dl.arrayBuffer());\n if (bundleResp.sha256) {\n const got = createHash('sha256').update(buf).digest('hex');\n if (got !== bundleResp.sha256) {\n console.error(`Bundle sha256 mismatch: expected ${bundleResp.sha256}, got ${got}`);\n process.exit(1);\n }\n }\n\n const zipPath = path.join(workdir, 'bundle.zip');\n fs.writeFileSync(zipPath, buf);\n\n // Try to unzip via the system `unzip` command; fall through with a hint\n // if unavailable so the operator can extract by hand.\n const unzip = spawnSync('unzip', ['-o', zipPath, '-d', workdir], {\n stdio: 'pipe',\n encoding: 'utf8',\n });\n const extracted = unzip.status === 0;\n if (extracted) {\n fs.unlinkSync(zipPath);\n }\n\n if (hasFlag(argv, '--json')) {\n console.log(\n JSON.stringify(\n {\n ok: true,\n candidate: claim.candidate,\n workdir,\n bundleZipPath: extracted ? null : zipPath,\n },\n null,\n 2\n )\n );\n return;\n }\n if (extracted) {\n console.log(`Claimed ${id}; bundle unzipped at ${workdir}`);\n console.log(` source: ${claim.candidate.sourceTrigger} on host ${claim.candidate.hostSlug}`);\n console.log(` contents:`);\n for (const entry of fs.readdirSync(workdir).sort()) {\n console.log(` ${entry}`);\n }\n } else {\n console.log(`Claimed ${id}; bundle saved at ${zipPath}`);\n console.log(` (system 'unzip' not found; extract manually:`);\n console.log(` unzip ${zipPath} -d ${workdir})`);\n }\n}\n\nasync function handleCommit(argv: string[], apiUrl: string, token: string): Promise<void> {\n const id = argv[0];\n if (!id || id.startsWith('--')) {\n console.error(\n 'Usage: canary scenarios commit <id> --commit-sha <sha> --scenario-id <id>'\n );\n process.exit(1);\n }\n const commitSha = getArgValue(argv, '--commit-sha');\n const scenarioId = getArgValue(argv, '--scenario-id');\n if (!commitSha || !scenarioId) {\n console.error('Error: --commit-sha and --scenario-id are required.');\n process.exit(1);\n }\n const result = await apiRequest<SingleResponse>(\n apiUrl,\n token,\n 'POST',\n `/superadmin/scenarios/candidates/${id}/commit`,\n { commitSha, scenarioId }\n );\n if (!result.ok || !result.candidate) {\n console.error(`Commit failed: ${result.error ?? 'unknown'}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(result.candidate, null, 2));\n return;\n }\n console.log(`Marked ${id} committed → ${scenarioId} @ ${commitSha}`);\n}\n\nasync function handleReject(argv: string[], apiUrl: string, token: string): Promise<void> {\n const id = argv[0];\n if (!id || id.startsWith('--')) {\n console.error('Usage: canary scenarios reject <id> --reason <text>');\n process.exit(1);\n }\n const reason = getArgValue(argv, '--reason');\n if (!reason) {\n console.error('Error: --reason is required.');\n process.exit(1);\n }\n const result = await apiRequest<SingleResponse>(\n apiUrl,\n token,\n 'POST',\n `/superadmin/scenarios/candidates/${id}/reject`,\n { reason }\n );\n if (!result.ok || !result.candidate) {\n console.error(`Reject failed: ${result.error ?? 'unknown'}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(result.candidate, null, 2));\n return;\n }\n console.log(`Rejected ${id}: ${reason}`);\n}\n"],"mappings":"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","names":["path"]}
|
|
1
|
+
{"version":3,"sources":["../src/scenarios.ts"],"sourcesContent":["/**\n * `canary scenarios` — drive the scenario candidate review queue.\n *\n * Minimal lifecycle CLI for Phase D of the scenario suite:\n * list / get / claim / commit / reject / bundle\n *\n * Designed to be invoked by an agent (every prompt has a flag\n * equivalent — no interactive input required).\n *\n * @module\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { createHash } from 'node:crypto';\nimport { spawnSync } from 'node:child_process';\nimport process from 'node:process';\nimport { resolveConfig, getArgValue, hasFlag } from './auth.js';\nimport { apiRequest } from './cli-helpers.js';\n\ninterface ScenarioCandidate {\n id: string;\n fingerprint: string;\n status: 'pending' | 'claimed' | 'committed' | 'rejected' | 'duplicate';\n sourceTrigger: 'cache_failure' | 'l3_invocation' | 'sampled' | 'manual';\n sourceRunId: string | null;\n sourceStepIdx: number | null;\n hostSlug: string;\n featureSlug: string | null;\n s3KeyBundle: string;\n bundleBytes: number | null;\n bundleSha256: string | null;\n relatedToFingerprint: string | null;\n capturedAt: string;\n claimedBy: string | null;\n claimedAt: string | null;\n resolutionCommit: string | null;\n resolutionScenarioId: string | null;\n rejectionReason: string | null;\n}\n\ninterface ListResponse {\n ok: boolean;\n error?: string;\n candidates?: ScenarioCandidate[];\n}\n\ninterface SingleResponse {\n ok: boolean;\n error?: string;\n candidate?: ScenarioCandidate;\n}\n\ninterface BundleResponse {\n ok: boolean;\n error?: string;\n url?: string;\n expiresInSeconds?: number;\n sha256?: string | null;\n bytes?: number | null;\n}\n\nfunction printHelp(): void {\n console.log(`canary scenarios — scenario candidate review queue\n\nSubcommands:\n list List pending candidates (LIFO, newest first)\n get <id> Print a single candidate as JSON\n bundle <id> Print the signed bundle URL (for piping into curl)\n claim <id> Claim a candidate; downloads + unzips the bundle\n into apps/api/tests/scenarios/_pending/<id>/\n commit <id> Mark candidate committed\n --commit-sha <sha> (required) git sha of the landing commit\n --scenario-id <name> (required) <host>__<feature>__<hash> in the suite\n reject <id> --reason <r> Mark candidate rejected without committing\n\nCommon flags:\n --json Machine-readable output (for agents)\n --limit <n> list: max rows to return (default 50, max 200)\n --claimed-by <name> claim: who is claiming (default: $USER or 'agent')\n --workdir <path> claim: where to unzip the bundle\n (default: apps/api/tests/scenarios/_pending/<id>)\n`);\n}\n\nexport async function runScenarios(argv: string[]): Promise<void> {\n const sub = argv[0];\n if (!sub || sub === '--help' || sub === '-h') {\n printHelp();\n return;\n }\n\n const rest = argv.slice(1);\n const config = await resolveConfig(rest);\n const { apiUrl, token } = config;\n\n switch (sub) {\n case 'list':\n return handleList(rest, apiUrl, token);\n case 'get':\n return handleGet(rest, apiUrl, token);\n case 'bundle':\n return handleBundle(rest, apiUrl, token);\n case 'claim':\n return handleClaim(rest, apiUrl, token);\n case 'commit':\n return handleCommit(rest, apiUrl, token);\n case 'reject':\n return handleReject(rest, apiUrl, token);\n default:\n console.error(`Unknown subcommand: ${sub}`);\n printHelp();\n process.exit(1);\n }\n}\n\nasync function handleList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const jsonOutput = hasFlag(argv, '--json');\n const limitStr = getArgValue(argv, '--limit');\n const limit = limitStr ? Number.parseInt(limitStr, 10) : 50;\n\n const path = `/superadmin/scenarios/candidates?limit=${limit}`;\n const result = await apiRequest<ListResponse>(apiUrl, token, 'GET', path);\n if (!result.ok || !result.candidates) {\n console.error(`Error: ${result.error ?? 'unknown'}`);\n process.exit(1);\n }\n\n if (jsonOutput) {\n console.log(JSON.stringify(result.candidates, null, 2));\n return;\n }\n\n if (result.candidates.length === 0) {\n console.log('No pending scenario candidates.');\n return;\n }\n console.log(`${result.candidates.length} pending candidate(s):`);\n for (const c of result.candidates) {\n const ageMin = Math.round((Date.now() - new Date(c.capturedAt).getTime()) / 60000);\n console.log(\n ` ${c.id} trigger=${c.sourceTrigger} host=${c.hostSlug} age=${ageMin}m`\n );\n }\n}\n\nasync function handleGet(argv: string[], apiUrl: string, token: string): Promise<void> {\n const id = argv[0];\n if (!id || id.startsWith('--')) {\n console.error('Usage: canary scenarios get <id>');\n process.exit(1);\n }\n const result = await apiRequest<SingleResponse>(\n apiUrl,\n token,\n 'GET',\n `/superadmin/scenarios/candidates/${id}`\n );\n if (!result.ok || !result.candidate) {\n console.error(`Error: ${result.error ?? 'unknown'}`);\n process.exit(1);\n }\n console.log(JSON.stringify(result.candidate, null, 2));\n}\n\nasync function handleBundle(argv: string[], apiUrl: string, token: string): Promise<void> {\n const id = argv[0];\n if (!id || id.startsWith('--')) {\n console.error('Usage: canary scenarios bundle <id>');\n process.exit(1);\n }\n const result = await apiRequest<BundleResponse>(\n apiUrl,\n token,\n 'GET',\n `/superadmin/scenarios/candidates/${id}/bundle`\n );\n if (!result.ok || !result.url) {\n console.error(`Error: ${result.error ?? 'unknown'}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n console.log(result.url);\n}\n\nasync function handleClaim(argv: string[], apiUrl: string, token: string): Promise<void> {\n const id = argv[0];\n if (!id || id.startsWith('--')) {\n console.error('Usage: canary scenarios claim <id> [--claimed-by <name>] [--workdir <path>]');\n process.exit(1);\n }\n const claimedBy = getArgValue(argv, '--claimed-by') ?? process.env.USER ?? 'agent';\n const workdir =\n getArgValue(argv, '--workdir') ??\n path.resolve(process.cwd(), 'apps/api/tests/scenarios/_pending', id);\n\n const claim = await apiRequest<SingleResponse>(\n apiUrl,\n token,\n 'POST',\n `/superadmin/scenarios/candidates/${id}/claim`,\n { claimedBy }\n );\n if (!claim.ok || !claim.candidate) {\n console.error(`Claim failed: ${claim.error ?? 'unknown'}`);\n process.exit(1);\n }\n\n const bundleResp = await apiRequest<BundleResponse>(\n apiUrl,\n token,\n 'GET',\n `/superadmin/scenarios/candidates/${id}/bundle`\n );\n if (!bundleResp.ok || !bundleResp.url) {\n console.error(`Bundle URL fetch failed: ${bundleResp.error ?? 'unknown'}`);\n process.exit(1);\n }\n\n fs.mkdirSync(workdir, { recursive: true });\n const dl = await fetch(bundleResp.url);\n if (!dl.ok) {\n console.error(`Bundle download failed: HTTP ${dl.status}`);\n process.exit(1);\n }\n const buf = Buffer.from(await dl.arrayBuffer());\n if (bundleResp.sha256) {\n const got = createHash('sha256').update(buf).digest('hex');\n if (got !== bundleResp.sha256) {\n console.error(`Bundle sha256 mismatch: expected ${bundleResp.sha256}, got ${got}`);\n process.exit(1);\n }\n }\n\n const zipPath = path.join(workdir, 'bundle.zip');\n fs.writeFileSync(zipPath, buf);\n\n // Try to unzip via the system `unzip` command; fall through with a hint\n // if unavailable so the operator can extract by hand.\n const unzip = spawnSync('unzip', ['-o', zipPath, '-d', workdir], {\n stdio: 'pipe',\n encoding: 'utf8',\n });\n const extracted = unzip.status === 0;\n if (extracted) {\n fs.unlinkSync(zipPath);\n }\n\n if (hasFlag(argv, '--json')) {\n console.log(\n JSON.stringify(\n {\n ok: true,\n candidate: claim.candidate,\n workdir,\n bundleZipPath: extracted ? null : zipPath,\n },\n null,\n 2\n )\n );\n return;\n }\n if (extracted) {\n console.log(`Claimed ${id}; bundle unzipped at ${workdir}`);\n console.log(` source: ${claim.candidate.sourceTrigger} on host ${claim.candidate.hostSlug}`);\n console.log(` contents:`);\n for (const entry of fs.readdirSync(workdir).sort()) {\n console.log(` ${entry}`);\n }\n } else {\n console.log(`Claimed ${id}; bundle saved at ${zipPath}`);\n console.log(` (system 'unzip' not found; extract manually:`);\n console.log(` unzip ${zipPath} -d ${workdir})`);\n }\n}\n\nasync function handleCommit(argv: string[], apiUrl: string, token: string): Promise<void> {\n const id = argv[0];\n if (!id || id.startsWith('--')) {\n console.error(\n 'Usage: canary scenarios commit <id> --commit-sha <sha> --scenario-id <id>'\n );\n process.exit(1);\n }\n const commitSha = getArgValue(argv, '--commit-sha');\n const scenarioId = getArgValue(argv, '--scenario-id');\n if (!commitSha || !scenarioId) {\n console.error('Error: --commit-sha and --scenario-id are required.');\n process.exit(1);\n }\n const result = await apiRequest<SingleResponse>(\n apiUrl,\n token,\n 'POST',\n `/superadmin/scenarios/candidates/${id}/commit`,\n { commitSha, scenarioId }\n );\n if (!result.ok || !result.candidate) {\n console.error(`Commit failed: ${result.error ?? 'unknown'}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(result.candidate, null, 2));\n return;\n }\n console.log(`Marked ${id} committed → ${scenarioId} @ ${commitSha}`);\n}\n\nasync function handleReject(argv: string[], apiUrl: string, token: string): Promise<void> {\n const id = argv[0];\n if (!id || id.startsWith('--')) {\n console.error('Usage: canary scenarios reject <id> --reason <text>');\n process.exit(1);\n }\n const reason = getArgValue(argv, '--reason');\n if (!reason) {\n console.error('Error: --reason is required.');\n process.exit(1);\n }\n const result = await apiRequest<SingleResponse>(\n apiUrl,\n token,\n 'POST',\n `/superadmin/scenarios/candidates/${id}/reject`,\n { reason }\n );\n if (!result.ok || !result.candidate) {\n console.error(`Reject failed: ${result.error ?? 'unknown'}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(result.candidate, null, 2));\n return;\n }\n console.log(`Rejected ${id}: ${reason}`);\n}\n"],"mappings":"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","names":["path"]}
|
|
@@ -2,10 +2,11 @@ import { createRequire as __cr } from "module"; const require = __cr(import.meta
|
|
|
2
2
|
import {
|
|
3
3
|
LocalBrowserHost,
|
|
4
4
|
USER_PAUSED_ERROR
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-EJ4U242G.js";
|
|
6
|
+
import "./chunk-G4UYGRZR.js";
|
|
6
7
|
import {
|
|
7
8
|
INTERACTION_CAPTURE_SCRIPT
|
|
8
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-5GD47G2D.js";
|
|
9
10
|
import {
|
|
10
11
|
callTool,
|
|
11
12
|
createSession,
|
|
@@ -23,22 +24,23 @@ import {
|
|
|
23
24
|
downloadStorageState,
|
|
24
25
|
selectCredential,
|
|
25
26
|
uploadStorageState
|
|
26
|
-
} from "./chunk-
|
|
27
|
-
import "./chunk-SJJW77WN.js";
|
|
27
|
+
} from "./chunk-CQE46HSM.js";
|
|
28
28
|
import "./chunk-3CZU7XCS.js";
|
|
29
29
|
import {
|
|
30
30
|
getArgValue,
|
|
31
31
|
hasFlag,
|
|
32
32
|
resolveConfig
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-PZ4LCN6K.js";
|
|
34
|
+
import "./chunk-JZMJUPZP.js";
|
|
34
35
|
import {
|
|
35
36
|
BrowserToolExecutor,
|
|
36
37
|
PlaywrightClient,
|
|
37
38
|
captureElementAtPoint,
|
|
38
39
|
dispatchBrowserTool,
|
|
39
40
|
dispatchBrowserToolWithTimeout
|
|
40
|
-
} from "./chunk-
|
|
41
|
+
} from "./chunk-QQVWGWPI.js";
|
|
41
42
|
import "./chunk-JWHYXEA2.js";
|
|
43
|
+
import "./chunk-QGI4UCJX.js";
|
|
42
44
|
import "./chunk-6LEZCKKV.js";
|
|
43
45
|
import {
|
|
44
46
|
consoleLogger
|
|
@@ -2257,6 +2259,24 @@ function buildToolArgs(toolName, argv) {
|
|
|
2257
2259
|
args.ref = getArgValue(argv, "--ref");
|
|
2258
2260
|
args.element = getArgValue(argv, "--element") ?? "";
|
|
2259
2261
|
break;
|
|
2262
|
+
case "drag": {
|
|
2263
|
+
const startRef = getArgValue(argv, "--start-ref");
|
|
2264
|
+
const endRef = getArgValue(argv, "--end-ref");
|
|
2265
|
+
if (startRef) args.startRef = startRef;
|
|
2266
|
+
if (endRef) args.endRef = endRef;
|
|
2267
|
+
for (const [flag, key] of [
|
|
2268
|
+
["--start-x", "startX"],
|
|
2269
|
+
["--start-y", "startY"],
|
|
2270
|
+
["--end-x", "endX"],
|
|
2271
|
+
["--end-y", "endY"]
|
|
2272
|
+
]) {
|
|
2273
|
+
const value = getArgValue(argv, flag);
|
|
2274
|
+
if (value) args[key] = parseInt(value, 10);
|
|
2275
|
+
}
|
|
2276
|
+
args.startElement = getArgValue(argv, "--start-element") ?? "";
|
|
2277
|
+
args.endElement = getArgValue(argv, "--end-element") ?? "";
|
|
2278
|
+
break;
|
|
2279
|
+
}
|
|
2260
2280
|
case "tabs": {
|
|
2261
2281
|
args.action = getArgValue(argv, "--action") ?? "list";
|
|
2262
2282
|
const index = getArgValue(argv, "--index");
|
|
@@ -2272,6 +2292,37 @@ function buildToolArgs(toolName, argv) {
|
|
|
2272
2292
|
case "console_messages":
|
|
2273
2293
|
args.onlyErrors = hasFlag(argv, "--only-errors");
|
|
2274
2294
|
break;
|
|
2295
|
+
case "file_upload": {
|
|
2296
|
+
const paths = getArgValue(argv, "--paths");
|
|
2297
|
+
args.paths = paths ? paths.split(",").map((p) => p.trim()).filter(Boolean) : [];
|
|
2298
|
+
break;
|
|
2299
|
+
}
|
|
2300
|
+
case "resize": {
|
|
2301
|
+
const width = getArgValue(argv, "--width");
|
|
2302
|
+
const height = getArgValue(argv, "--height");
|
|
2303
|
+
if (width) args.width = parseInt(width, 10);
|
|
2304
|
+
if (height) args.height = parseInt(height, 10);
|
|
2305
|
+
break;
|
|
2306
|
+
}
|
|
2307
|
+
case "dismiss_overlay": {
|
|
2308
|
+
const strategy = getArgValue(argv, "--strategy");
|
|
2309
|
+
if (strategy) args.preferredStrategy = strategy;
|
|
2310
|
+
break;
|
|
2311
|
+
}
|
|
2312
|
+
case "handle_dialog": {
|
|
2313
|
+
args.action = getArgValue(argv, "--action") ?? "accept";
|
|
2314
|
+
const promptText = getArgValue(argv, "--prompt-text");
|
|
2315
|
+
if (promptText) args.promptText = promptText;
|
|
2316
|
+
break;
|
|
2317
|
+
}
|
|
2318
|
+
case "read_download": {
|
|
2319
|
+
const id = getArgValue(argv, "--id");
|
|
2320
|
+
if (id) args.downloadId = parseInt(id, 10);
|
|
2321
|
+
break;
|
|
2322
|
+
}
|
|
2323
|
+
case "pdf_read":
|
|
2324
|
+
args.url = getArgValue(argv, "--url");
|
|
2325
|
+
break;
|
|
2275
2326
|
}
|
|
2276
2327
|
return args;
|
|
2277
2328
|
}
|
|
@@ -2292,7 +2343,14 @@ var TOOL_ALIASES = {
|
|
|
2292
2343
|
tabs: "tabs",
|
|
2293
2344
|
wait: "wait_for",
|
|
2294
2345
|
console: "console_messages",
|
|
2295
|
-
network: "network_requests"
|
|
2346
|
+
network: "network_requests",
|
|
2347
|
+
upload: "file_upload",
|
|
2348
|
+
resize: "resize",
|
|
2349
|
+
dismiss: "dismiss_overlay",
|
|
2350
|
+
dialog: "handle_dialog",
|
|
2351
|
+
downloads: "list_downloads",
|
|
2352
|
+
"read-download": "read_download",
|
|
2353
|
+
pdf: "pdf_read"
|
|
2296
2354
|
};
|
|
2297
2355
|
function printHelp() {
|
|
2298
2356
|
console.log(
|
|
@@ -2326,10 +2384,19 @@ function printHelp() {
|
|
|
2326
2384
|
" press --key <key> Press keyboard key",
|
|
2327
2385
|
" scroll --direction <dir> [--amount <n>]",
|
|
2328
2386
|
" hover --ref <ref> [--element <desc>]",
|
|
2387
|
+
" drag --start-ref <ref> --end-ref <ref> [--start-element <desc>] [--end-element <desc>]",
|
|
2388
|
+
" drag --start-x <n> --start-y <n> --end-x <n> --end-y <n>",
|
|
2329
2389
|
" tabs [--action list|new|close|select] [--index <n>]",
|
|
2330
2390
|
" wait --text <text> [--timeout <ms>]",
|
|
2331
2391
|
" console [--only-errors] Show console messages",
|
|
2332
2392
|
" network Show network requests",
|
|
2393
|
+
" upload --paths <p1,p2,...> Upload one or more files",
|
|
2394
|
+
" resize --width <n> --height <n> Resize the browser viewport",
|
|
2395
|
+
" dialog --action accept|dismiss [--prompt-text <text>]",
|
|
2396
|
+
" dismiss [--strategy escape|close_button|backdrop|auto]",
|
|
2397
|
+
" downloads List files downloaded this session",
|
|
2398
|
+
" read-download [--id <n>] Read a downloaded file (PDF text extracted)",
|
|
2399
|
+
" pdf --url <url> Fetch a PDF and extract its text",
|
|
2333
2400
|
"",
|
|
2334
2401
|
"Start options:",
|
|
2335
2402
|
" --credential [<name|id>] Use a credential (interactive if no value)",
|
|
@@ -2409,6 +2476,7 @@ async function runSession(argv) {
|
|
|
2409
2476
|
}
|
|
2410
2477
|
}
|
|
2411
2478
|
export {
|
|
2479
|
+
buildToolArgs,
|
|
2412
2480
|
runSession
|
|
2413
2481
|
};
|
|
2414
|
-
//# sourceMappingURL=session-
|
|
2482
|
+
//# sourceMappingURL=session-Y5RHU54D.js.map
|