issue-flow 0.17.0 → 0.18.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 (110) hide show
  1. package/dist/{agent-TB6W7PT7.js → agent-HMZTXCRT.js} +5 -5
  2. package/dist/{analyze-6M3KEOX7.js → analyze-Q4ONIWRZ.js} +10 -10
  3. package/dist/{apply-ADB3ZK7W.js → apply-EEFPY2W4.js} +5 -5
  4. package/dist/{bench-FM7I7EIV.js → bench-WWWXLTFH.js} +9 -9
  5. package/dist/{chunk-KZ5EY5XX.js → chunk-34OCSKOB.js} +7 -7
  6. package/dist/{chunk-UWDCIFTP.js → chunk-45WZ6GMI.js} +27 -43
  7. package/dist/chunk-45WZ6GMI.js.map +1 -0
  8. package/dist/{chunk-QMIQR7EE.js → chunk-62GVVZQO.js} +3 -3
  9. package/dist/{chunk-YII4U7ZD.js → chunk-6K2LCFG6.js} +2 -2
  10. package/dist/{chunk-A4H7P7T7.js → chunk-7UMMFOL2.js} +3 -3
  11. package/dist/chunk-7UMMFOL2.js.map +1 -0
  12. package/dist/{chunk-HJBF4WD2.js → chunk-CWSQVHVV.js} +59 -25
  13. package/dist/chunk-CWSQVHVV.js.map +1 -0
  14. package/dist/{chunk-SGTTR4XW.js → chunk-E4I6MMHD.js} +4 -4
  15. package/dist/{chunk-6YQT3SSM.js → chunk-ECU7YO7S.js} +2 -2
  16. package/dist/{chunk-MI5TREN3.js → chunk-EG2MGDP5.js} +6 -6
  17. package/dist/{chunk-RCZJQUTC.js → chunk-HOAHMERN.js} +43 -10
  18. package/dist/chunk-HOAHMERN.js.map +1 -0
  19. package/dist/{chunk-HLAPOUEM.js → chunk-KMCS76ZW.js} +3 -3
  20. package/dist/{chunk-KZXQWC7U.js → chunk-KRAGAUKD.js} +8 -8
  21. package/dist/{chunk-E6KXCV3T.js → chunk-LGHND47K.js} +2 -2
  22. package/dist/{chunk-DV7HUC4Z.js → chunk-LI35PIIS.js} +2 -2
  23. package/dist/{chunk-Z5O2XBWA.js → chunk-LTH6XYZ3.js} +5 -5
  24. package/dist/{chunk-2SUFAE6X.js → chunk-NEWNXZ65.js} +21 -12
  25. package/dist/{chunk-2SUFAE6X.js.map → chunk-NEWNXZ65.js.map} +1 -1
  26. package/dist/{chunk-LPWPFIIB.js → chunk-OODXFCQV.js} +7 -7
  27. package/dist/{chunk-ISZ54SVE.js → chunk-PMLE7KAQ.js} +17 -9
  28. package/dist/chunk-PMLE7KAQ.js.map +1 -0
  29. package/dist/{chunk-HY5HLFDU.js → chunk-QF7VEL3M.js} +115 -14
  30. package/dist/chunk-QF7VEL3M.js.map +1 -0
  31. package/dist/{chunk-B3TSS7BT.js → chunk-QJ44VG5G.js} +2 -2
  32. package/dist/{chunk-VE3IYNDN.js → chunk-SA6HXL4Y.js} +2 -2
  33. package/dist/{chunk-UK4E2FUA.js → chunk-TZYINKCC.js} +75 -53
  34. package/dist/chunk-TZYINKCC.js.map +1 -0
  35. package/dist/{chunk-32JSYXEK.js → chunk-V7QOIQYC.js} +2 -2
  36. package/dist/{chunk-ANI2NTR4.js → chunk-XUEMATVY.js} +6 -6
  37. package/dist/{chunk-D6ZBGJ3L.js → chunk-ZVZMWNCG.js} +129 -35
  38. package/dist/chunk-ZVZMWNCG.js.map +1 -0
  39. package/dist/cli.js +35 -35
  40. package/dist/cli.js.map +1 -1
  41. package/dist/{config-KGZUPAUP.js → config-LEBZZCJP.js} +4 -4
  42. package/dist/{conventions-RYN7OXJN.js → conventions-XOT6YW5L.js} +6 -6
  43. package/dist/{execute-QL3ZQIAP.js → execute-LELOSR5T.js} +14 -14
  44. package/dist/{generate-CX6KNHZS.js → generate-JGW5JSKB.js} +10 -10
  45. package/dist/{init-PDVQDRS6.js → init-TO6MUXO4.js} +7 -5
  46. package/dist/{operations-CAKIT2BO.js → operations-O4FORFIH.js} +4 -4
  47. package/dist/{plan-PRORGS3L.js → plan-OXAT344Q.js} +12 -12
  48. package/dist/{policy-WX6O2JID.js → policy-U5NBFAO5.js} +5 -5
  49. package/dist/{pr-27RMQI5F.js → pr-UZHNKKZC.js} +12 -12
  50. package/dist/{pr-review-VNESMAMT.js → pr-review-Q4ACAWDM.js} +9 -9
  51. package/dist/{prd-ZNC4T5BS.js → prd-6CYEMLDY.js} +12 -12
  52. package/dist/{recorder-N7U66HCO.js → recorder-2BAKPBRA.js} +2 -2
  53. package/dist/{resume-VLWIE264.js → resume-URCU6CIJ.js} +26 -26
  54. package/dist/{review-7CREJDKB.js → review-LVZT2TMW.js} +13 -13
  55. package/dist/{routing-VCDYHSXA.js → routing-EK6RBZM4.js} +6 -6
  56. package/dist/run-2RXJCJKT.js +56 -0
  57. package/dist/{usage-U7QNGCPK.js → usage-KTMYXAPF.js} +3 -3
  58. package/dist/{web-HUNDHCJ4.js → web-B5UPHHR5.js} +8 -8
  59. package/package.json +1 -1
  60. package/web/AGENTS.md +115 -7
  61. package/web/public/app.css +393 -245
  62. package/web/public/app.js +108 -38
  63. package/web/public/index.html +106 -78
  64. package/dist/chunk-A4H7P7T7.js.map +0 -1
  65. package/dist/chunk-D6ZBGJ3L.js.map +0 -1
  66. package/dist/chunk-HJBF4WD2.js.map +0 -1
  67. package/dist/chunk-HY5HLFDU.js.map +0 -1
  68. package/dist/chunk-ISZ54SVE.js.map +0 -1
  69. package/dist/chunk-RCZJQUTC.js.map +0 -1
  70. package/dist/chunk-UK4E2FUA.js.map +0 -1
  71. package/dist/chunk-UWDCIFTP.js.map +0 -1
  72. package/dist/run-3MPORLF5.js +0 -56
  73. /package/dist/{agent-TB6W7PT7.js.map → agent-HMZTXCRT.js.map} +0 -0
  74. /package/dist/{analyze-6M3KEOX7.js.map → analyze-Q4ONIWRZ.js.map} +0 -0
  75. /package/dist/{apply-ADB3ZK7W.js.map → apply-EEFPY2W4.js.map} +0 -0
  76. /package/dist/{bench-FM7I7EIV.js.map → bench-WWWXLTFH.js.map} +0 -0
  77. /package/dist/{chunk-KZ5EY5XX.js.map → chunk-34OCSKOB.js.map} +0 -0
  78. /package/dist/{chunk-QMIQR7EE.js.map → chunk-62GVVZQO.js.map} +0 -0
  79. /package/dist/{chunk-YII4U7ZD.js.map → chunk-6K2LCFG6.js.map} +0 -0
  80. /package/dist/{chunk-SGTTR4XW.js.map → chunk-E4I6MMHD.js.map} +0 -0
  81. /package/dist/{chunk-6YQT3SSM.js.map → chunk-ECU7YO7S.js.map} +0 -0
  82. /package/dist/{chunk-MI5TREN3.js.map → chunk-EG2MGDP5.js.map} +0 -0
  83. /package/dist/{chunk-HLAPOUEM.js.map → chunk-KMCS76ZW.js.map} +0 -0
  84. /package/dist/{chunk-KZXQWC7U.js.map → chunk-KRAGAUKD.js.map} +0 -0
  85. /package/dist/{chunk-E6KXCV3T.js.map → chunk-LGHND47K.js.map} +0 -0
  86. /package/dist/{chunk-DV7HUC4Z.js.map → chunk-LI35PIIS.js.map} +0 -0
  87. /package/dist/{chunk-Z5O2XBWA.js.map → chunk-LTH6XYZ3.js.map} +0 -0
  88. /package/dist/{chunk-LPWPFIIB.js.map → chunk-OODXFCQV.js.map} +0 -0
  89. /package/dist/{chunk-B3TSS7BT.js.map → chunk-QJ44VG5G.js.map} +0 -0
  90. /package/dist/{chunk-VE3IYNDN.js.map → chunk-SA6HXL4Y.js.map} +0 -0
  91. /package/dist/{chunk-32JSYXEK.js.map → chunk-V7QOIQYC.js.map} +0 -0
  92. /package/dist/{chunk-ANI2NTR4.js.map → chunk-XUEMATVY.js.map} +0 -0
  93. /package/dist/{config-KGZUPAUP.js.map → config-LEBZZCJP.js.map} +0 -0
  94. /package/dist/{conventions-RYN7OXJN.js.map → conventions-XOT6YW5L.js.map} +0 -0
  95. /package/dist/{execute-QL3ZQIAP.js.map → execute-LELOSR5T.js.map} +0 -0
  96. /package/dist/{generate-CX6KNHZS.js.map → generate-JGW5JSKB.js.map} +0 -0
  97. /package/dist/{init-PDVQDRS6.js.map → init-TO6MUXO4.js.map} +0 -0
  98. /package/dist/{operations-CAKIT2BO.js.map → operations-O4FORFIH.js.map} +0 -0
  99. /package/dist/{plan-PRORGS3L.js.map → plan-OXAT344Q.js.map} +0 -0
  100. /package/dist/{policy-WX6O2JID.js.map → policy-U5NBFAO5.js.map} +0 -0
  101. /package/dist/{pr-27RMQI5F.js.map → pr-UZHNKKZC.js.map} +0 -0
  102. /package/dist/{pr-review-VNESMAMT.js.map → pr-review-Q4ACAWDM.js.map} +0 -0
  103. /package/dist/{prd-ZNC4T5BS.js.map → prd-6CYEMLDY.js.map} +0 -0
  104. /package/dist/{recorder-N7U66HCO.js.map → recorder-2BAKPBRA.js.map} +0 -0
  105. /package/dist/{resume-VLWIE264.js.map → resume-URCU6CIJ.js.map} +0 -0
  106. /package/dist/{review-7CREJDKB.js.map → review-LVZT2TMW.js.map} +0 -0
  107. /package/dist/{routing-VCDYHSXA.js.map → routing-EK6RBZM4.js.map} +0 -0
  108. /package/dist/{run-3MPORLF5.js.map → run-2RXJCJKT.js.map} +0 -0
  109. /package/dist/{usage-U7QNGCPK.js.map → usage-KTMYXAPF.js.map} +0 -0
  110. /package/dist/{web-HUNDHCJ4.js.map → web-B5UPHHR5.js.map} +0 -0
@@ -3,15 +3,15 @@ import {
3
3
  applyAcceptanceToPlan,
4
4
  formatVerificationLine,
5
5
  runAcceptanceGate
6
- } from "./chunk-6YQT3SSM.js";
6
+ } from "./chunk-ECU7YO7S.js";
7
7
  import {
8
8
  issuePlaceholders,
9
9
  resolveCommandIssue
10
- } from "./chunk-VE3IYNDN.js";
10
+ } from "./chunk-SA6HXL4Y.js";
11
11
  import {
12
12
  publishPhaseMetrics,
13
13
  resolvePolicyPlaceholders
14
- } from "./chunk-HLAPOUEM.js";
14
+ } from "./chunk-KMCS76ZW.js";
15
15
  import {
16
16
  applyPlaceholders,
17
17
  loadPrompt
@@ -19,10 +19,10 @@ import {
19
19
  import {
20
20
  DEFAULT_HEADLESS_TIMEOUT_MS,
21
21
  runHeadless
22
- } from "./chunk-UK4E2FUA.js";
22
+ } from "./chunk-TZYINKCC.js";
23
23
  import {
24
24
  resolveIssuePaths
25
- } from "./chunk-DV7HUC4Z.js";
25
+ } from "./chunk-LI35PIIS.js";
26
26
  import {
27
27
  getGlobalTimeout,
28
28
  printError,
@@ -163,4 +163,4 @@ async function runReview(issue, resolvedIssue) {
163
163
  export {
164
164
  runReview
165
165
  };
166
- //# sourceMappingURL=chunk-MI5TREN3.js.map
166
+ //# sourceMappingURL=chunk-EG2MGDP5.js.map
@@ -4,14 +4,15 @@ import {
4
4
  PRIORS_VERSION,
5
5
  RECOMMENDED_POLICY_VERSION,
6
6
  decideRouting
7
- } from "./chunk-D6ZBGJ3L.js";
7
+ } from "./chunk-ZVZMWNCG.js";
8
8
  import {
9
9
  GLOBAL_CONFIG_FILENAME,
10
- loadRoutingConfig
11
- } from "./chunk-HY5HLFDU.js";
10
+ loadRoutingConfig,
11
+ probeReadinessInventory
12
+ } from "./chunk-QF7VEL3M.js";
12
13
  import {
13
14
  resolveIssuePaths
14
- } from "./chunk-DV7HUC4Z.js";
15
+ } from "./chunk-LI35PIIS.js";
15
16
  import {
16
17
  printError,
17
18
  printInfo,
@@ -112,6 +113,7 @@ async function runRoutingReport(options) {
112
113
  }
113
114
  async function runRoutingExplain(options = {}) {
114
115
  const config = await loadRoutingConfig();
116
+ const inventory = await probeReadinessInventory();
115
117
  const phases = AGENT_PHASES.map((phase) => {
116
118
  const decision = decideRouting({
117
119
  phase,
@@ -119,21 +121,47 @@ async function runRoutingExplain(options = {}) {
119
121
  actualProvider: "claude",
120
122
  mode: config.mode === "off" ? "shadow" : config.mode,
121
123
  profile: config.profile,
122
- policy: config.policy
124
+ policy: config.policy,
125
+ readiness: inventory
123
126
  });
127
+ const ranking = (decision?.candidates ?? []).filter((candidate) => candidate.eligible).slice(0, 5).map((candidate) => ({
128
+ harness: candidate.harness,
129
+ provider: candidate.provider,
130
+ model: candidate.model,
131
+ tier: candidate.tier,
132
+ score: candidate.score,
133
+ reasonCodes: candidate.reasonCodes
134
+ }));
124
135
  return {
125
136
  phase,
126
137
  target: decision?.selected ?? null,
127
- origin: config.policy === "recommended" ? "recommended policy" : "adaptive score"
138
+ origin: config.policy === "recommended" ? "recommended policy" : "adaptive score",
139
+ reasonCodes: decision?.reasonCodes ?? [],
140
+ ranking
128
141
  };
129
142
  });
130
143
  if (options.json === true) {
131
144
  console.log(
132
- JSON.stringify({ schemaVersion: ROUTING_COMMAND_SCHEMA_VERSION, config, phases }, null, 2)
145
+ JSON.stringify(
146
+ {
147
+ schemaVersion: ROUTING_COMMAND_SCHEMA_VERSION,
148
+ config,
149
+ inventory,
150
+ phases
151
+ },
152
+ null,
153
+ 2
154
+ )
133
155
  );
134
156
  return 0;
135
157
  }
136
158
  printInfo(`routing policy: ${config.policy ?? "adaptive"} (${config.mode})`);
159
+ printInfo("inventory");
160
+ for (const provider of Object.values(inventory.providers)) {
161
+ printInfo(
162
+ ` ${provider.provider.padEnd(12)} ${provider.state.padEnd(12)} auth=${provider.authentication} \xB7 ${provider.detail}`
163
+ );
164
+ }
137
165
  for (const phase of phases) {
138
166
  printInfo(
139
167
  `${phase.phase.padEnd(12)} ${targetLabel(phase.target ?? void 0)} (${phase.origin})`
@@ -175,9 +203,14 @@ async function runRoutingUse(policy, options = {}) {
175
203
  try {
176
204
  const file = await writeRoutingPreference({
177
205
  target: options.project === true ? "project" : "global",
178
- values: { policy: "recommended" }
206
+ values: {
207
+ policy: "recommended",
208
+ ...options.active === true ? { mode: "active" } : {}
209
+ }
179
210
  });
180
- printSuccess(`Wrote recommended routing policy to ${file}`);
211
+ printSuccess(
212
+ `Wrote recommended routing policy${options.active === true ? " in active mode" : ""} to ${file}`
213
+ );
181
214
  return 0;
182
215
  } catch (error) {
183
216
  printError(error instanceof Error ? error.message : String(error));
@@ -193,4 +226,4 @@ export {
193
226
  writeRoutingPreference,
194
227
  runRoutingUse
195
228
  };
196
- //# sourceMappingURL=chunk-RCZJQUTC.js.map
229
+ //# sourceMappingURL=chunk-HOAHMERN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/routing.ts"],"sourcesContent":["import { mkdir, readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { probeReadinessInventory } from '../agents/availability.js';\nimport { AGENT_PHASES } from '../agents/types.js';\nimport { GLOBAL_CONFIG_FILENAME, loadRoutingConfig } from '../config.js';\nimport { loadTaskPlan } from '../core/state-manager.js';\nimport { decideRouting } from '../routing/decide.js';\nimport { MODEL_CATALOG_VERSION } from '../routing/models.js';\nimport { RECOMMENDED_POLICY_VERSION } from '../routing/policy.js';\nimport { PRIORS_VERSION } from '../routing/priors.js';\nimport { type RoutingConfigInput, routingConfigInputSchema } from '../schemas.js';\nimport { getGlobalRoot } from '../storage/paths.js';\nimport { resolveIssuePaths } from '../storage/resolve.js';\nimport { printError, printInfo, printSuccess } from '../ui/logger.js';\nimport { writeFileAtomic } from '../utils/fs.js';\nimport { getProjectRoot } from '../utils/git.js';\n\nexport const ROUTING_COMMAND_SCHEMA_VERSION = 1;\n\nfunction targetLabel(\n target:\n | { harness: string; provider: string; model?: string | null; tier?: string }\n | string\n | undefined,\n): string {\n if (target === undefined) return '—';\n if (typeof target === 'string') return target;\n const tier = target.tier ? `:${target.tier}` : '';\n const model = target.model ? ` · ${target.model}` : '';\n return `${target.provider}${tier}${model}`;\n}\n\nfunction targetKey(\n target:\n | { harness: string; provider: string; model?: string | null; tier?: string }\n | string\n | undefined,\n): string {\n if (target === undefined) return '—';\n if (typeof target === 'string') return target;\n return `${target.harness}:${target.provider}:${target.model ?? ''}`;\n}\n\nexport async function runRoutingInspect(options: { json?: boolean }): Promise<number> {\n const config = await loadRoutingConfig();\n const sample = decideRouting({\n phase: 'execute',\n actualHarness: 'claude-code',\n mode: config.mode,\n profile: config.profile,\n });\n if (options.json === true) {\n console.log(\n JSON.stringify(\n {\n schemaVersion: ROUTING_COMMAND_SCHEMA_VERSION,\n priorsVersion: PRIORS_VERSION,\n modelCatalogVersion: MODEL_CATALOG_VERSION,\n recommendedPolicyVersion: RECOMMENDED_POLICY_VERSION,\n config,\n sample,\n },\n null,\n 2,\n ),\n );\n return 0;\n }\n printInfo(`routing.mode: ${config.mode} (default shadow — records, does not act)`);\n printInfo(`routing.profile: ${config.profile}`);\n if (sample) {\n printInfo(\n `sample selected=${targetLabel(sample.selected)} actual=${targetLabel(sample.actual)} class=${sample.taskClass}`,\n );\n }\n return 0;\n}\n\nexport async function runRoutingReport(options: {\n issue?: string;\n json?: boolean;\n}): Promise<number> {\n if (options.issue === undefined) {\n printInfo('Pass --issue N to compare selected vs actual on that plan.');\n return 0;\n }\n const paths = await resolveIssuePaths(options.issue);\n const plan = await loadTaskPlan(paths.tasksFile);\n const records = plan.executions ?? [];\n let agree = 0;\n let total = 0;\n for (const record of records) {\n const decision = record.routingDecision;\n if (decision === undefined || decision === null) continue;\n total += 1;\n if (targetKey(decision.selected) === targetKey(decision.actual)) agree += 1;\n }\n const rate = total === 0 ? 0 : agree / total;\n if (options.json === true) {\n console.log(\n JSON.stringify({ schemaVersion: ROUTING_COMMAND_SCHEMA_VERSION, total, agree, rate }),\n );\n return 0;\n }\n printInfo(`shadow agreement: ${agree}/${total} (${(rate * 100).toFixed(0)}%)`);\n return 0;\n}\n\nexport async function runRoutingExplain(options: { json?: boolean } = {}): Promise<number> {\n const config = await loadRoutingConfig();\n const inventory = await probeReadinessInventory();\n const phases = AGENT_PHASES.map((phase) => {\n const decision = decideRouting({\n phase,\n actualHarness: 'claude-code',\n actualProvider: 'claude',\n mode: config.mode === 'off' ? 'shadow' : config.mode,\n profile: config.profile,\n policy: config.policy,\n readiness: inventory,\n });\n const ranking = (decision?.candidates ?? [])\n .filter((candidate) => candidate.eligible)\n .slice(0, 5)\n .map((candidate) => ({\n harness: candidate.harness,\n provider: candidate.provider,\n model: candidate.model,\n tier: candidate.tier,\n score: candidate.score,\n reasonCodes: candidate.reasonCodes,\n }));\n return {\n phase,\n target: decision?.selected ?? null,\n origin: config.policy === 'recommended' ? 'recommended policy' : 'adaptive score',\n reasonCodes: decision?.reasonCodes ?? [],\n ranking,\n };\n });\n if (options.json === true) {\n console.log(\n JSON.stringify(\n {\n schemaVersion: ROUTING_COMMAND_SCHEMA_VERSION,\n config,\n inventory,\n phases,\n },\n null,\n 2,\n ),\n );\n return 0;\n }\n printInfo(`routing policy: ${config.policy ?? 'adaptive'} (${config.mode})`);\n printInfo('inventory');\n for (const provider of Object.values(inventory.providers)) {\n printInfo(\n ` ${provider.provider.padEnd(12)} ${provider.state.padEnd(12)} auth=${provider.authentication} · ${provider.detail}`,\n );\n }\n for (const phase of phases) {\n printInfo(\n `${phase.phase.padEnd(12)} ${targetLabel(phase.target ?? undefined)} (${phase.origin})`,\n );\n }\n return 0;\n}\n\nexport async function writeRoutingPreference(input: {\n target: 'global' | 'project';\n values: RoutingConfigInput;\n projectRoot?: string;\n}): Promise<string> {\n const parsed = routingConfigInputSchema.safeParse(input.values);\n if (!parsed.success || Object.keys(parsed.data).length === 0) {\n throw new Error(\n parsed.success\n ? 'At least one routing setting is required.'\n : `Invalid routing setting: ${parsed.error.issues[0]?.message ?? 'invalid value'}.`,\n );\n }\n const path =\n input.target === 'global'\n ? join(getGlobalRoot(), GLOBAL_CONFIG_FILENAME)\n : join(input.projectRoot ?? (await getProjectRoot()), '.issue-flow.json');\n let existing: Record<string, unknown> = {};\n try {\n const value: unknown = JSON.parse(await readFile(path, 'utf-8'));\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n existing = value as Record<string, unknown>;\n }\n } catch (error: unknown) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw new Error(`Could not read ${path}: ${(error as Error).message}`);\n }\n }\n const current =\n existing.routing !== null &&\n typeof existing.routing === 'object' &&\n !Array.isArray(existing.routing)\n ? (existing.routing as Record<string, unknown>)\n : {};\n existing.routing = { ...current, ...parsed.data };\n await mkdir(dirname(path), { recursive: true });\n await writeFileAtomic(path, `${JSON.stringify(existing, null, 2)}\\n`);\n return path;\n}\n\nexport async function runRoutingUse(\n policy: string,\n options: { active?: boolean; global?: boolean; project?: boolean } = {},\n): Promise<number> {\n if (policy !== 'recommended') {\n printError(`Unknown routing policy '${policy}'. Valid policy: recommended.`);\n return 1;\n }\n try {\n const file = await writeRoutingPreference({\n target: options.project === true ? 'project' : 'global',\n values: {\n policy: 'recommended',\n ...(options.active === true ? { mode: 'active' as const } : {}),\n },\n });\n printSuccess(\n `Wrote recommended routing policy${options.active === true ? ' in active mode' : ''} to ${file}`,\n );\n return 0;\n } catch (error) {\n printError(error instanceof Error ? error.message : String(error));\n return 1;\n }\n}\n"],"mappings":"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","names":[]}
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  DEFAULT_BRANCH_CONVENTION,
4
4
  loadRepositoryPolicy
5
- } from "./chunk-E6KXCV3T.js";
5
+ } from "./chunk-LGHND47K.js";
6
6
  import {
7
7
  loadPolicyConfig
8
- } from "./chunk-HY5HLFDU.js";
8
+ } from "./chunk-QF7VEL3M.js";
9
9
  import {
10
10
  getBaseBranch
11
11
  } from "./chunk-YVPZUN6X.js";
@@ -294,4 +294,4 @@ export {
294
294
  publishStoryMetrics,
295
295
  resolvePolicyPlaceholders
296
296
  };
297
- //# sourceMappingURL=chunk-HLAPOUEM.js.map
297
+ //# sourceMappingURL=chunk-KMCS76ZW.js.map
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ensureWebMonitor
4
- } from "./chunk-2SUFAE6X.js";
4
+ } from "./chunk-NEWNXZ65.js";
5
5
  import {
6
6
  applyAcceptanceToPlan,
7
7
  resolveIssueDir,
8
8
  runAcceptanceGate
9
- } from "./chunk-6YQT3SSM.js";
9
+ } from "./chunk-ECU7YO7S.js";
10
10
  import {
11
11
  groupBy,
12
12
  summarize
@@ -18,21 +18,21 @@ import {
18
18
  publishIterationMetrics,
19
19
  publishStoryMetrics,
20
20
  resolvePolicyPlaceholders
21
- } from "./chunk-HLAPOUEM.js";
21
+ } from "./chunk-KMCS76ZW.js";
22
22
  import {
23
23
  applyPlaceholders,
24
24
  loadPrompt
25
25
  } from "./chunk-7F7LGMVO.js";
26
26
  import {
27
27
  invokeSelectedAgent
28
- } from "./chunk-UK4E2FUA.js";
28
+ } from "./chunk-TZYINKCC.js";
29
29
  import {
30
30
  getPackageVersion
31
31
  } from "./chunk-C5TL7T4V.js";
32
32
  import {
33
33
  archiveFolderName,
34
34
  commitMessage
35
- } from "./chunk-E6KXCV3T.js";
35
+ } from "./chunk-LGHND47K.js";
36
36
  import {
37
37
  createConfig,
38
38
  getActiveResilienceConfig,
@@ -42,10 +42,10 @@ import {
42
42
  resolveAgentFor,
43
43
  resolvePaths,
44
44
  validateDependencies
45
- } from "./chunk-HY5HLFDU.js";
45
+ } from "./chunk-QF7VEL3M.js";
46
46
  import {
47
47
  resolveIssuePaths
48
- } from "./chunk-DV7HUC4Z.js";
48
+ } from "./chunk-LI35PIIS.js";
49
49
  import {
50
50
  formatDuration,
51
51
  getIcons,
@@ -1019,4 +1019,4 @@ export {
1019
1019
  stripMarkdown,
1020
1020
  runExecute
1021
1021
  };
1022
- //# sourceMappingURL=chunk-KZXQWC7U.js.map
1022
+ //# sourceMappingURL=chunk-KRAGAUKD.js.map
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  loadPolicyConfig,
4
4
  mergeConfigLayers
5
- } from "./chunk-HY5HLFDU.js";
5
+ } from "./chunk-QF7VEL3M.js";
6
6
  import {
7
7
  printWarning
8
8
  } from "./chunk-XZUEFTUP.js";
@@ -1559,4 +1559,4 @@ export {
1559
1559
  issueReferenceLines,
1560
1560
  loadRepositoryPolicy
1561
1561
  };
1562
- //# sourceMappingURL=chunk-E6KXCV3T.js.map
1562
+ //# sourceMappingURL=chunk-LGHND47K.js.map
@@ -19,7 +19,7 @@ import {
19
19
  } from "./chunk-YVPZUN6X.js";
20
20
  import {
21
21
  bindTelemetry
22
- } from "./chunk-YII4U7ZD.js";
22
+ } from "./chunk-6K2LCFG6.js";
23
23
  import {
24
24
  isoNow
25
25
  } from "./chunk-SOM4QA6C.js";
@@ -280,4 +280,4 @@ export {
280
280
  resolveQueuePaths,
281
281
  resolveIssuePaths
282
282
  };
283
- //# sourceMappingURL=chunk-DV7HUC4Z.js.map
283
+ //# sourceMappingURL=chunk-LI35PIIS.js.map
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  publishPhaseMetrics,
7
7
  resolvePolicyPlaceholders
8
- } from "./chunk-HLAPOUEM.js";
8
+ } from "./chunk-KMCS76ZW.js";
9
9
  import {
10
10
  applyPlaceholders,
11
11
  loadPrompt
@@ -13,13 +13,13 @@ import {
13
13
  import {
14
14
  DEFAULT_HEADLESS_TIMEOUT_MS,
15
15
  runHeadless
16
- } from "./chunk-UK4E2FUA.js";
16
+ } from "./chunk-TZYINKCC.js";
17
17
  import {
18
18
  loadPrReviewConfig
19
- } from "./chunk-HY5HLFDU.js";
19
+ } from "./chunk-QF7VEL3M.js";
20
20
  import {
21
21
  resolveIssuePaths
22
- } from "./chunk-DV7HUC4Z.js";
22
+ } from "./chunk-LI35PIIS.js";
23
23
  import {
24
24
  getGlobalTimeout,
25
25
  printError,
@@ -802,4 +802,4 @@ export {
802
802
  exitCodeFor,
803
803
  runPrReview
804
804
  };
805
- //# sourceMappingURL=chunk-Z5O2XBWA.js.map
805
+ //# sourceMappingURL=chunk-LTH6XYZ3.js.map
@@ -1,23 +1,23 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  writeAgentPreference
4
- } from "./chunk-UWDCIFTP.js";
4
+ } from "./chunk-45WZ6GMI.js";
5
5
  import {
6
6
  writeRoutingPreference
7
- } from "./chunk-RCZJQUTC.js";
7
+ } from "./chunk-HOAHMERN.js";
8
8
  import {
9
9
  resolvePackageDir
10
10
  } from "./chunk-7F7LGMVO.js";
11
11
  import {
12
12
  MODEL_CATALOG
13
- } from "./chunk-D6ZBGJ3L.js";
13
+ } from "./chunk-ZVZMWNCG.js";
14
14
  import {
15
15
  getPackageVersion
16
16
  } from "./chunk-C5TL7T4V.js";
17
17
  import {
18
18
  loadRoutingConfig,
19
19
  probeAgent
20
- } from "./chunk-HY5HLFDU.js";
20
+ } from "./chunk-QF7VEL3M.js";
21
21
  import {
22
22
  printInfo,
23
23
  printWarning
@@ -315,13 +315,22 @@ async function startWebServer(options) {
315
315
  effective: snapshot?.configuration ?? null,
316
316
  capturedForSession: snapshot?.sessionId ?? null,
317
317
  routing: await loadRoutingConfig(),
318
- catalog: harnesses.map((harness, index) => ({
319
- harness,
320
- provider: providers[index],
321
- installed: availability[index]?.installed ?? false,
322
- authenticated: availability[index]?.authenticated ?? false,
323
- models: MODEL_CATALOG[harness] ?? []
324
- })),
318
+ catalog: harnesses.map((harness, index) => {
319
+ const entry = availability[index];
320
+ return {
321
+ harness,
322
+ provider: providers[index],
323
+ installed: entry?.installed ?? false,
324
+ authenticated: entry?.authenticated ?? false,
325
+ authentication: entry?.authentication ?? "failed",
326
+ state: entry?.state ?? "unavailable",
327
+ source: entry?.source ?? "probe",
328
+ observedAt: entry?.observedAt ?? null,
329
+ expiresAt: entry?.expiresAt ?? null,
330
+ detail: entry?.detail ?? null,
331
+ models: MODEL_CATALOG[harness] ?? []
332
+ };
333
+ }),
325
334
  writable: isLoopbackHost(options.host),
326
335
  writeScope: "global preferences for future executions"
327
336
  });
@@ -930,4 +939,4 @@ export {
930
939
  stopWebMonitor,
931
940
  ensureWebMonitor
932
941
  };
933
- //# sourceMappingURL=chunk-2SUFAE6X.js.map
942
+ //# sourceMappingURL=chunk-NEWNXZ65.js.map