@runcofactor/cli 0.13.0 → 0.15.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 (147) hide show
  1. package/dist/account-22LMP5PX.js +255 -0
  2. package/dist/account-22LMP5PX.js.map +1 -0
  3. package/dist/{api-catalog-7HLEN7C2.js → api-catalog-WTFQNLK6.js} +5 -5
  4. package/dist/{attachment-OVNQD6Z2.js → attachment-U3NKVPEY.js} +5 -5
  5. package/dist/augmentor-5GMNAX4M.js +198 -0
  6. package/dist/augmentor-5GMNAX4M.js.map +1 -0
  7. package/dist/{auth-VUHL74FH.js → auth-VQG2CDUD.js} +3 -3
  8. package/dist/{chunk-PZ4LCN6K.js → chunk-3X3NW7QA.js} +2 -2
  9. package/dist/{chunk-VGTKUOYS.js → chunk-46IUJXSD.js} +2 -2
  10. package/dist/{chunk-YN763NWQ.js → chunk-7VMO2WOZ.js} +10 -4
  11. package/dist/chunk-7VMO2WOZ.js.map +1 -0
  12. package/dist/{chunk-Z5LUTUDN.js → chunk-CMGI7UZD.js} +3 -3
  13. package/dist/{chunk-EEN2TZUQ.js → chunk-FNPMWDUQ.js} +3 -3
  14. package/dist/{chunk-EJ4U242G.js → chunk-HDFYUFBI.js} +2 -2
  15. package/dist/{chunk-JZMJUPZP.js → chunk-JMJVGMXI.js} +2 -2
  16. package/dist/{chunk-JZMJUPZP.js.map → chunk-JMJVGMXI.js.map} +1 -1
  17. package/dist/{chunk-QGI4UCJX.js → chunk-JYGNMKZ5.js} +62 -35
  18. package/dist/chunk-JYGNMKZ5.js.map +1 -0
  19. package/dist/{chunk-CRHPDPRS.js → chunk-KCHKFYVX.js} +30 -8
  20. package/dist/{chunk-CRHPDPRS.js.map → chunk-KCHKFYVX.js.map} +1 -1
  21. package/dist/{chunk-ZD3KHESI.js → chunk-KRWRUU6R.js} +27 -7
  22. package/dist/chunk-KRWRUU6R.js.map +1 -0
  23. package/dist/{chunk-ENDHMYEJ.js → chunk-NHTEKEYE.js} +3 -3
  24. package/dist/{chunk-CQE46HSM.js → chunk-PRBRSIZP.js} +14 -8
  25. package/dist/chunk-PRBRSIZP.js.map +1 -0
  26. package/dist/{chunk-NL7CVG56.js → chunk-UETBLPKM.js} +57 -10
  27. package/dist/chunk-UETBLPKM.js.map +1 -0
  28. package/dist/{chunk-QQVWGWPI.js → chunk-VGYN2KU2.js} +8494 -1504
  29. package/dist/chunk-VGYN2KU2.js.map +1 -0
  30. package/dist/{chunk-ZTOE3ND3.js → chunk-XJ5YYYGC.js} +4 -4
  31. package/dist/{credential-LO2SEEHU.js → credential-E6KUHRGU.js} +5 -5
  32. package/dist/{credential-template-ZN7W7734.js → credential-template-4GPOPBGD.js} +5 -5
  33. package/dist/{debug-workflow-R3RYYAXK.js → debug-workflow-XCLCY6S7.js} +5 -5
  34. package/dist/{docs-DIAFBDXQ.js → docs-COCZYMW6.js} +95 -11
  35. package/dist/docs-COCZYMW6.js.map +1 -0
  36. package/dist/{doctor-NZPUSCRE.js → doctor-ERIVTCQS.js} +3 -3
  37. package/dist/{environment-RQVU4P5M.js → environment-7Y4BV6XY.js} +5 -5
  38. package/dist/{feature-flag-XG26RURR.js → feature-flag-MHONEX6T.js} +98 -12
  39. package/dist/feature-flag-MHONEX6T.js.map +1 -0
  40. package/dist/index.js +107 -51
  41. package/dist/index.js.map +1 -1
  42. package/dist/{init-EDNLKGPT.js → init-OROOM4HF.js} +5 -5
  43. package/dist/{install-FYZ3HNZK.js → install-OJFXHY6U.js} +5 -5
  44. package/dist/{issues-NNRVTJ4L.js → issues-32GONR6C.js} +5 -5
  45. package/dist/{knobs-A2BOBH22.js → knobs-UQGGY3CP.js} +7 -6
  46. package/dist/knobs-UQGGY3CP.js.map +1 -0
  47. package/dist/{list-F33VZ4BJ.js → list-ZMIKEC5P.js} +5 -5
  48. package/dist/{local-DQDTM3XA.js → local-PUD24GGQ.js} +7 -7
  49. package/dist/{login-BUMVIB36.js → login-BSO7YX2D.js} +5 -5
  50. package/dist/{mcp-B5Y5CDMQ.js → mcp-4LS7OJUT.js} +9 -9
  51. package/dist/{mcp-B5Y5CDMQ.js.map → mcp-4LS7OJUT.js.map} +1 -1
  52. package/dist/{pdf-extract-ABWV3L5X.js → pdf-extract-YHE54XU4.js} +2 -2
  53. package/dist/product-3JKSJCBC.js +346 -0
  54. package/dist/product-3JKSJCBC.js.map +1 -0
  55. package/dist/{property-NJ4SRXQG.js → property-K5DBL4UE.js} +5 -5
  56. package/dist/{psql-VBZFCMNR.js → psql-PQFUFTSE.js} +3 -3
  57. package/dist/{record-WAO36O7G.js → record-EIIYLFJ4.js} +6 -6
  58. package/dist/{redis-DHZXHL4S.js → redis-BU36EZZI.js} +3 -3
  59. package/dist/redis-BU36EZZI.js.map +1 -0
  60. package/dist/{release-STJKUKTE.js → release-LYC2P7DZ.js} +5 -5
  61. package/dist/{sandbox-DWSGLY7B.js → sandbox-CKHXXZHU.js} +51 -7
  62. package/dist/sandbox-CKHXXZHU.js.map +1 -0
  63. package/dist/{scenarios-HCIDY725.js → scenarios-2XJ2G3KR.js} +5 -5
  64. package/dist/{session-Y5RHU54D.js → session-UTOD5ZYH.js} +8 -9
  65. package/dist/session-UTOD5ZYH.js.map +1 -0
  66. package/dist/{skill-23WAHUOB.js → skill-GMAERMQL.js} +10 -10
  67. package/dist/{skill-23WAHUOB.js.map → skill-GMAERMQL.js.map} +1 -1
  68. package/dist/skills/debug-run/SKILL.md +7 -1
  69. package/dist/skills/debug-run/history/1.3.1.md +279 -0
  70. package/dist/skills/debug-run/version.json +1 -1
  71. package/dist/skills/optimize-cache/SKILL.md +29 -2
  72. package/dist/{spec-LM5XHOQ5.js → spec-2NP36U3Y.js} +5 -5
  73. package/dist/{src-22RI5VP2.js → src-4T6GHXVO.js} +2 -2
  74. package/dist/{src-NCJPUAE6.js → src-CG52HEE7.js} +10 -8
  75. package/dist/{src-Y3K7UJEF.js → src-PK5OZXCM.js} +2 -2
  76. package/dist/{src-BGDRMOKC.js → src-UEOOC425.js} +295 -102
  77. package/dist/src-UEOOC425.js.map +1 -0
  78. package/dist/{start-SWY55CZX.js → start-3C7EEFW2.js} +5 -5
  79. package/dist/{tag-YSU2XXPI.js → tag-JSHOMLBR.js} +6 -6
  80. package/dist/{task-NLBKLD7D.js → task-YGWVYTBJ.js} +5 -5
  81. package/dist/{test-suite-QCPWZ2LS.js → test-suite-LI7ZH367.js} +10 -8
  82. package/dist/{test-suite-QCPWZ2LS.js.map → test-suite-LI7ZH367.js.map} +1 -1
  83. package/dist/trace-UMLOSIIR.js +16 -0
  84. package/dist/{triage-TT4BMDBU.js → triage-ZWJG4NBJ.js} +6 -6
  85. package/dist/{upgrade-6ZUFETKX.js → upgrade-S7CGEK6H.js} +3 -3
  86. package/dist/{workflow-2CX3ZNOQ.js → workflow-T4HSAOGW.js} +86 -15
  87. package/dist/workflow-T4HSAOGW.js.map +1 -0
  88. package/dist/{workflow-cache-GXNE6SU2.js → workflow-cache-XVEZ36KF.js} +8 -8
  89. package/dist/{workflow-debug-PRX3DWGD.js → workflow-debug-T2BULXZ7.js} +9 -9
  90. package/dist/{workflow-proposals-BW327WGL.js → workflow-proposals-XXEZICN2.js} +5 -7
  91. package/dist/workflow-proposals-XXEZICN2.js.map +1 -0
  92. package/package.json +1 -1
  93. package/dist/chunk-CQE46HSM.js.map +0 -1
  94. package/dist/chunk-NL7CVG56.js.map +0 -1
  95. package/dist/chunk-QGI4UCJX.js.map +0 -1
  96. package/dist/chunk-QQVWGWPI.js.map +0 -1
  97. package/dist/chunk-YN763NWQ.js.map +0 -1
  98. package/dist/chunk-ZD3KHESI.js.map +0 -1
  99. package/dist/docs-DIAFBDXQ.js.map +0 -1
  100. package/dist/feature-flag-XG26RURR.js.map +0 -1
  101. package/dist/knobs-A2BOBH22.js.map +0 -1
  102. package/dist/redis-DHZXHL4S.js.map +0 -1
  103. package/dist/sandbox-DWSGLY7B.js.map +0 -1
  104. package/dist/session-Y5RHU54D.js.map +0 -1
  105. package/dist/src-BGDRMOKC.js.map +0 -1
  106. package/dist/trace-A3ZY6K26.js +0 -16
  107. package/dist/workflow-2CX3ZNOQ.js.map +0 -1
  108. package/dist/workflow-proposals-BW327WGL.js.map +0 -1
  109. /package/dist/{api-catalog-7HLEN7C2.js.map → api-catalog-WTFQNLK6.js.map} +0 -0
  110. /package/dist/{attachment-OVNQD6Z2.js.map → attachment-U3NKVPEY.js.map} +0 -0
  111. /package/dist/{auth-VUHL74FH.js.map → auth-VQG2CDUD.js.map} +0 -0
  112. /package/dist/{chunk-PZ4LCN6K.js.map → chunk-3X3NW7QA.js.map} +0 -0
  113. /package/dist/{chunk-VGTKUOYS.js.map → chunk-46IUJXSD.js.map} +0 -0
  114. /package/dist/{chunk-Z5LUTUDN.js.map → chunk-CMGI7UZD.js.map} +0 -0
  115. /package/dist/{chunk-EEN2TZUQ.js.map → chunk-FNPMWDUQ.js.map} +0 -0
  116. /package/dist/{chunk-EJ4U242G.js.map → chunk-HDFYUFBI.js.map} +0 -0
  117. /package/dist/{chunk-ENDHMYEJ.js.map → chunk-NHTEKEYE.js.map} +0 -0
  118. /package/dist/{chunk-ZTOE3ND3.js.map → chunk-XJ5YYYGC.js.map} +0 -0
  119. /package/dist/{credential-LO2SEEHU.js.map → credential-E6KUHRGU.js.map} +0 -0
  120. /package/dist/{credential-template-ZN7W7734.js.map → credential-template-4GPOPBGD.js.map} +0 -0
  121. /package/dist/{debug-workflow-R3RYYAXK.js.map → debug-workflow-XCLCY6S7.js.map} +0 -0
  122. /package/dist/{doctor-NZPUSCRE.js.map → doctor-ERIVTCQS.js.map} +0 -0
  123. /package/dist/{environment-RQVU4P5M.js.map → environment-7Y4BV6XY.js.map} +0 -0
  124. /package/dist/{init-EDNLKGPT.js.map → init-OROOM4HF.js.map} +0 -0
  125. /package/dist/{install-FYZ3HNZK.js.map → install-OJFXHY6U.js.map} +0 -0
  126. /package/dist/{issues-NNRVTJ4L.js.map → issues-32GONR6C.js.map} +0 -0
  127. /package/dist/{list-F33VZ4BJ.js.map → list-ZMIKEC5P.js.map} +0 -0
  128. /package/dist/{local-DQDTM3XA.js.map → local-PUD24GGQ.js.map} +0 -0
  129. /package/dist/{login-BUMVIB36.js.map → login-BSO7YX2D.js.map} +0 -0
  130. /package/dist/{pdf-extract-ABWV3L5X.js.map → pdf-extract-YHE54XU4.js.map} +0 -0
  131. /package/dist/{property-NJ4SRXQG.js.map → property-K5DBL4UE.js.map} +0 -0
  132. /package/dist/{psql-VBZFCMNR.js.map → psql-PQFUFTSE.js.map} +0 -0
  133. /package/dist/{record-WAO36O7G.js.map → record-EIIYLFJ4.js.map} +0 -0
  134. /package/dist/{release-STJKUKTE.js.map → release-LYC2P7DZ.js.map} +0 -0
  135. /package/dist/{scenarios-HCIDY725.js.map → scenarios-2XJ2G3KR.js.map} +0 -0
  136. /package/dist/{spec-LM5XHOQ5.js.map → spec-2NP36U3Y.js.map} +0 -0
  137. /package/dist/{src-22RI5VP2.js.map → src-4T6GHXVO.js.map} +0 -0
  138. /package/dist/{src-NCJPUAE6.js.map → src-CG52HEE7.js.map} +0 -0
  139. /package/dist/{src-Y3K7UJEF.js.map → src-PK5OZXCM.js.map} +0 -0
  140. /package/dist/{start-SWY55CZX.js.map → start-3C7EEFW2.js.map} +0 -0
  141. /package/dist/{tag-YSU2XXPI.js.map → tag-JSHOMLBR.js.map} +0 -0
  142. /package/dist/{task-NLBKLD7D.js.map → task-YGWVYTBJ.js.map} +0 -0
  143. /package/dist/{trace-A3ZY6K26.js.map → trace-UMLOSIIR.js.map} +0 -0
  144. /package/dist/{triage-TT4BMDBU.js.map → triage-ZWJG4NBJ.js.map} +0 -0
  145. /package/dist/{upgrade-6ZUFETKX.js.map → upgrade-S7CGEK6H.js.map} +0 -0
  146. /package/dist/{workflow-cache-GXNE6SU2.js.map → workflow-cache-XVEZ36KF.js.map} +0 -0
  147. /package/dist/{workflow-debug-PRX3DWGD.js.map → workflow-debug-T2BULXZ7.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/workflow-proposals.ts","../src/proposals-format.ts"],"sourcesContent":["/**\n * `canary workflow proposals <verb>` — list / get / diff / accept / reject /\n * revert workflow proposals.\n *\n * Output mode auto-detects: JSON when piped (`!process.stdout.isTTY`), pretty\n * text when running interactively. `--json` and `--text` flags force either\n * mode. Designed so an agent can pipe JSON straight into `jq` without any\n * extra flag, and a human gets the readable report at a terminal.\n */\n\nimport process from 'node:process';\nimport {\n diffSnapshots,\n fromApiSnapshot,\n type SnapshotDiff,\n} from '@chatsdet/workflow-diff';\nimport { getArgValue, hasFlag } from './auth.js';\n\n/**\n * Like `getArgValue` but also accepts the `--key=value` form that many\n * agents emit by default. Falls back to the space-separated form. Matches\n * only exact `--key=` to avoid false-positives on `--status-filter=x` when\n * looking for `--status`.\n */\nfunction getArg(argv: string[], key: string): string | undefined {\n const prefix = `${key}=`;\n const eq = argv.find((a) => a.startsWith(prefix));\n if (eq) return eq.slice(prefix.length);\n return getArgValue(argv, key);\n}\n\n/** @internal — exported for unit tests only. */\nexport const _internalsForTesting = { getArg };\nimport { apiRequest } from './cli-helpers.js';\nimport { renderProposalList, renderProposalDiff } from './proposals-format.js';\n\n// ── Types ────────────────────────────────────────────────────────────────\n\nexport interface ProposalSummary {\n id: string;\n workflowId: string;\n title: string;\n description: string | null;\n source: 'agent' | 'user' | 'import' | 'api';\n status: 'pending' | 'accepted' | 'rejected' | 'stale';\n createdByUserId: string | null;\n decidedByUserId: string | null;\n decidedAt: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ProposalDetail extends ProposalSummary {\n snapshotJson: {\n nodes?: Array<{\n id: string;\n nodeType: string;\n orderIndex?: number;\n configJson?: Record<string, unknown>;\n }>;\n edges?: Array<{\n id: string;\n sourceNodeId: string;\n targetNodeId: string;\n edgeType?: string | null;\n }>;\n };\n sourceMetadata: Record<string, unknown> | null;\n}\n\ninterface WorkflowDetail {\n id: string;\n nodes: Array<{\n id: string;\n nodeType: string;\n orderIndex?: number;\n configJson?: Record<string, unknown>;\n }>;\n edges: Array<{\n id: string;\n sourceNodeId: string;\n targetNodeId: string;\n edgeType?: string | null;\n }>;\n updatedAt?: string;\n}\n\n// ── Dispatcher ───────────────────────────────────────────────────────────\n\nexport async function handleWorkflowProposals(\n argv: string[],\n apiUrl: string,\n token: string,\n): Promise<void> {\n const [verb, ...rest] = argv;\n switch (verb) {\n case 'list':\n await handleList(rest, apiUrl, token);\n break;\n case 'get':\n await handleGet(rest, apiUrl, token);\n break;\n case 'diff':\n await handleDiff(rest, apiUrl, token);\n break;\n case 'accept':\n await handleAccept(rest, apiUrl, token);\n break;\n case 'reject':\n await handleReject(rest, apiUrl, token);\n break;\n case 'revert':\n await handleRevert(rest, apiUrl, token);\n break;\n default:\n printHelp();\n process.exit(verb ? 1 : 0);\n }\n}\n\nfunction printHelp() {\n console.error(\n [\n 'Usage: canary workflow proposals <verb> <workflowId> [<proposalId>] [options]',\n '',\n 'Verbs:',\n ' list <wf> list proposals for a workflow',\n ' get <wf> <pid> fetch a proposal (full snapshot)',\n ' diff <wf> <pid> show the diff against the current draft',\n ' accept <wf> <pid> apply the proposal (full or --select=id1,id2)',\n ' reject <wf> <pid> reject the proposal (no draft change)',\n ' revert <wf> <pid> revert a previously-accepted proposal to pending',\n '',\n 'Global options:',\n ' --json force JSON output',\n ' --text force pretty-text output (default when stdout is a TTY)',\n ' --status=<status> (list) filter by pending|accepted|rejected|stale|all',\n ' --include-unchanged (diff) also list rows that did not change',\n ' --select=<ids> (accept) comma-separated node ids to accept (default: all)',\n ].join('\\n'),\n );\n}\n\n// ── Output-mode helper ───────────────────────────────────────────────────\n\nfunction wantsJson(argv: string[]): boolean {\n if (hasFlag(argv, '--json')) return true;\n if (hasFlag(argv, '--text')) return false;\n return !process.stdout.isTTY;\n}\n\nfunction emit(argv: string[], textFallback: string, json: unknown): void {\n if (wantsJson(argv)) {\n console.log(JSON.stringify(json, null, 2));\n } else {\n console.log(textFallback);\n }\n}\n\nfunction requireArgs(\n argv: string[],\n n: number,\n verb: string,\n): asserts argv is string[] {\n if (argv.length < n) {\n console.error(\n `Error: canary workflow proposals ${verb} requires ${n} argument${n === 1 ? '' : 's'}`,\n );\n printHelp();\n process.exit(1);\n }\n}\n\n// ── Handlers ─────────────────────────────────────────────────────────────\n\nasync function handleList(\n argv: string[],\n apiUrl: string,\n token: string,\n): Promise<void> {\n requireArgs(argv, 1, 'list');\n const [workflowId] = argv;\n const status = getArg(argv, '--status') ?? 'pending';\n const query = status === 'all' ? '' : `?status=${encodeURIComponent(status)}`;\n\n const result = await apiRequest<{\n ok: boolean;\n data?: ProposalSummary[];\n error?: string;\n }>(apiUrl, token, 'GET', `/workflows/${workflowId}/proposals${query}`);\n\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'failed to list proposals'}`);\n process.exit(1);\n }\n\n const proposals = result.data ?? [];\n emit(argv, renderProposalList(proposals), {\n workflowId,\n count: proposals.length,\n proposals,\n });\n}\n\nasync function handleGet(\n argv: string[],\n apiUrl: string,\n token: string,\n): Promise<void> {\n requireArgs(argv, 2, 'get');\n const [workflowId, proposalId] = argv;\n\n const result = await apiRequest<{\n ok: boolean;\n data?: ProposalDetail;\n error?: string;\n }>(apiUrl, token, 'GET', `/workflows/${workflowId}/proposals/${proposalId}`);\n\n if (!result.ok || !result.data) {\n console.error(`Error: ${result.error ?? 'proposal not found'}`);\n process.exit(1);\n }\n\n const prop = result.data;\n const text = [\n `Proposal: ${prop.title}`,\n `Source: ${prop.source} Status: ${prop.status}`,\n `Created: ${prop.createdAt}`,\n `Nodes: ${prop.snapshotJson.nodes?.length ?? 0} Edges: ${prop.snapshotJson.edges?.length ?? 0}`,\n ].join('\\n');\n emit(argv, text, prop);\n}\n\nasync function handleDiff(\n argv: string[],\n apiUrl: string,\n token: string,\n): Promise<void> {\n requireArgs(argv, 2, 'diff');\n const [workflowId, proposalId] = argv;\n\n const [propRes, wfRes] = await Promise.all([\n apiRequest<{ ok: boolean; data?: ProposalDetail; error?: string }>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${workflowId}/proposals/${proposalId}`,\n ),\n apiRequest<{ ok: boolean; workflow?: WorkflowDetail; error?: string }>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${workflowId}`,\n ),\n ]);\n\n if (!propRes.ok || !propRes.data) {\n console.error(`Error: ${propRes.error ?? 'proposal not found'}`);\n process.exit(1);\n }\n if (!wfRes.workflow) {\n console.error(`Error: ${wfRes.error ?? 'workflow not found'}`);\n process.exit(1);\n }\n\n const proposal = propRes.data;\n const workflow = wfRes.workflow;\n\n const current = fromApiSnapshot({\n nodes: workflow.nodes,\n edges: workflow.edges,\n });\n const proposed = fromApiSnapshot(proposal.snapshotJson);\n const diff = diffSnapshots(current, proposed);\n\n const payload = buildDiffPayload(proposal, proposed, diff);\n const includeUnchanged = hasFlag(argv, '--include-unchanged');\n emit(argv, renderProposalDiff(payload, { includeUnchanged }), payload);\n}\n\nasync function handleAccept(\n argv: string[],\n apiUrl: string,\n token: string,\n): Promise<void> {\n requireArgs(argv, 2, 'accept');\n const [workflowId, proposalId] = argv;\n const selectArg = getArg(argv, '--select');\n const body: { selection?: { acceptedNodeIds: string[] } } = {};\n if (selectArg) {\n const ids = selectArg.split(',').map((s) => s.trim()).filter(Boolean);\n body.selection = { acceptedNodeIds: ids };\n }\n\n const result = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/proposals/${proposalId}/accept`,\n selectArg ? body : undefined,\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'accept failed'}`);\n process.exit(1);\n }\n\n emit(\n argv,\n selectArg\n ? `Accepted ${body.selection!.acceptedNodeIds.length} changes from ${proposalId}.`\n : `Accepted proposal ${proposalId} in full.`,\n { ok: true, proposalId, workflowId, partial: Boolean(selectArg) },\n );\n}\n\nasync function handleReject(\n argv: string[],\n apiUrl: string,\n token: string,\n): Promise<void> {\n requireArgs(argv, 2, 'reject');\n const [workflowId, proposalId] = argv;\n const result = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/proposals/${proposalId}/reject`,\n );\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'reject failed'}`);\n process.exit(1);\n }\n emit(argv, `Rejected proposal ${proposalId}.`, {\n ok: true,\n proposalId,\n workflowId,\n });\n}\n\nasync function handleRevert(\n argv: string[],\n apiUrl: string,\n token: string,\n): Promise<void> {\n requireArgs(argv, 2, 'revert');\n const [workflowId, proposalId] = argv;\n const result = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/proposals/${proposalId}/revert`,\n );\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'revert failed'}`);\n process.exit(1);\n }\n emit(argv, `Reverted proposal ${proposalId} back to pending.`, {\n ok: true,\n proposalId,\n workflowId,\n });\n}\n\n// ── Diff payload shaper ──────────────────────────────────────────────────\n\nexport interface DiffPayload {\n proposal: {\n id: string;\n title: string;\n source: string;\n status: string;\n stale: boolean;\n createdAt: string;\n decidedAt: string | null;\n };\n summary: {\n addedNodes: number;\n removedNodes: number;\n changedNodes: number;\n addedEdges: number;\n removedEdges: number;\n touchedCount: number;\n isEmpty: boolean;\n };\n nodes: {\n added: Array<{\n id: string;\n nodeType: string;\n configJson: Record<string, unknown>;\n }>;\n removed: Array<{\n id: string;\n nodeType: string;\n configJson: Record<string, unknown>;\n }>;\n changed: Array<{\n id: string;\n nodeType: string;\n typeChanged: boolean;\n beforeType?: string;\n afterType?: string;\n fieldChanges: Array<{ path: string; before: unknown; after: unknown }>;\n }>;\n };\n edges: {\n added: Array<{\n sourceNodeId: string;\n targetNodeId: string;\n edgeType: string | null;\n }>;\n removed: Array<{\n sourceNodeId: string;\n targetNodeId: string;\n edgeType: string | null;\n }>;\n };\n}\n\nfunction buildDiffPayload(\n proposal: ProposalDetail,\n proposedSnap: ReturnType<typeof fromApiSnapshot>,\n diff: SnapshotDiff,\n): DiffPayload {\n // Build a proposed-nodes map so the diff payload can include configJson\n // for each changed node (the diff itself only has field-level changes).\n const byId = new Map(proposedSnap.nodes.map((n) => [n.id, n]));\n\n return {\n proposal: {\n id: proposal.id,\n title: proposal.title,\n source: proposal.source,\n status: proposal.status,\n stale: proposal.status === 'stale',\n createdAt: proposal.createdAt,\n decidedAt: proposal.decidedAt,\n },\n summary: {\n addedNodes: diff.addedNodes.length,\n removedNodes: diff.removedNodes.length,\n changedNodes: diff.changedNodes.length,\n addedEdges: diff.addedEdges.length,\n removedEdges: diff.removedEdges.length,\n touchedCount: diff.touchedCount,\n isEmpty: diff.isEmpty,\n },\n nodes: {\n added: diff.addedNodes.map((n) => ({\n id: n.id,\n nodeType: n.nodeType,\n configJson: n.configJson,\n })),\n removed: diff.removedNodes.map((n) => ({\n id: n.id,\n nodeType: n.nodeType,\n configJson: n.configJson,\n })),\n changed: diff.changedNodes.map((c) => ({\n id: c.id,\n nodeType: c.nodeType,\n typeChanged: c.typeChanged,\n beforeType: c.beforeType,\n afterType: c.afterType,\n fieldChanges: c.fieldChanges,\n })),\n },\n edges: {\n added: diff.addedEdges.map((e) => ({\n sourceNodeId: e.sourceNodeId,\n targetNodeId: e.targetNodeId,\n edgeType: e.edgeType ?? null,\n })),\n removed: diff.removedEdges.map((e) => ({\n sourceNodeId: e.sourceNodeId,\n targetNodeId: e.targetNodeId,\n edgeType: e.edgeType ?? null,\n })),\n },\n };\n void byId;\n}\n","/**\n * Pretty-text renderers for `canary workflow proposals list | diff`.\n * Pure — no fetching, easy to test.\n */\n\nimport { getNodeDisplayTitle } from '@chatsdet/workflow-diff';\nimport type { ProposalSummary, DiffPayload } from './workflow-proposals.js';\n\nconst STATUS_DOTS: Record<string, string> = {\n pending: '●',\n accepted: '✓',\n rejected: '✗',\n stale: '⚠',\n};\n\nexport function renderProposalList(proposals: ProposalSummary[]): string {\n if (proposals.length === 0) return 'No proposals.';\n const rows = proposals.map((p) => {\n const dot = STATUS_DOTS[p.status] ?? '•';\n return `${dot} ${pad(p.status, 10)} ${pad(p.source, 8)} ${p.id.slice(0, 8)}… ${p.title}`;\n });\n return [\n `${proposals.length} proposal${proposals.length === 1 ? '' : 's'}`,\n '',\n ...rows,\n ].join('\\n');\n}\n\nexport function renderProposalDiff(\n payload: DiffPayload,\n opts: { includeUnchanged?: boolean } = {},\n): string {\n const { proposal, summary, nodes, edges } = payload;\n const staleNote = proposal.stale ? ' ⚠ STALE' : '';\n const header = [\n `Proposal: ${proposal.title}`,\n `Source: ${proposal.source} Status: ${proposal.status}${staleNote}`,\n `Created: ${proposal.createdAt}`,\n '',\n `Summary: ${summary.addedNodes} added · ${summary.removedNodes} removed · ${summary.changedNodes} changed · ${summary.touchedCount} touched`,\n ];\n\n if (summary.isEmpty) {\n return [...header, '', 'No changes — proposal matches the current draft.'].join('\\n');\n }\n\n const blocks: string[] = [];\n\n for (const n of nodes.added) {\n blocks.push(\n `+ ${pad(n.nodeType.toUpperCase(), 14)} ${getNodeDisplayTitle(n.nodeType, n.configJson)} (${n.id})`,\n );\n }\n for (const n of nodes.removed) {\n blocks.push(\n `- ${pad(n.nodeType.toUpperCase(), 14)} ${getNodeDisplayTitle(n.nodeType, n.configJson)} (${n.id})`,\n );\n }\n for (const c of nodes.changed) {\n const lines = [\n `~ ${pad(c.nodeType.toUpperCase(), 14)} ${c.id}`,\n ];\n if (c.typeChanged) {\n lines.push(` nodeType: ${c.beforeType} → ${c.afterType}`);\n }\n for (const fc of c.fieldChanges) {\n lines.push(` ${fc.path}: ${fmt(fc.before)} → ${fmt(fc.after)}`);\n }\n blocks.push(lines.join('\\n'));\n }\n\n const edgeLine = `Edges: +${summary.addedEdges} -${summary.removedEdges}`;\n if (edges.added.length === 0 && edges.removed.length === 0) {\n return [...header, '', ...blocks, '', edgeLine].join('\\n');\n }\n const edgeLines = [\n ...edges.added.map(\n (e) => ` + ${e.sourceNodeId} → ${e.targetNodeId}${e.edgeType ? ` [${e.edgeType}]` : ''}`,\n ),\n ...edges.removed.map(\n (e) => ` - ${e.sourceNodeId} → ${e.targetNodeId}${e.edgeType ? ` [${e.edgeType}]` : ''}`,\n ),\n ];\n\n const out = [...header, '', ...blocks, '', edgeLine, ...edgeLines];\n\n // --include-unchanged is a passthrough hook for a future expansion; today\n // the diff engine doesn't surface unchanged nodes, so we just note that.\n if (opts.includeUnchanged) {\n out.push('', '(--include-unchanged has no additional output in v1)');\n }\n\n return out.join('\\n');\n}\n\nfunction pad(s: string, n: number): string {\n return s.length >= n ? s : s + ' '.repeat(n - s.length);\n}\n\nfunction fmt(v: unknown): string {\n if (v === undefined) return '(none)';\n if (v === null) return 'null';\n if (typeof v === 'string') return JSON.stringify(v);\n if (typeof v === 'number' || typeof v === 'boolean') return String(v);\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n"],"mappings":"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","names":[]}