issue-flow 0.16.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 (168) hide show
  1. package/dist/agent-HMZTXCRT.js +30 -0
  2. package/dist/{analyze-556KCJKZ.js → analyze-Q4ONIWRZ.js} +22 -22
  3. package/dist/{apply-WVV7G7WN.js → apply-EEFPY2W4.js} +14 -14
  4. package/dist/{bench-UBFGKUHR.js → bench-WWWXLTFH.js} +23 -23
  5. package/dist/{chunk-GV2DABNZ.js → chunk-34OCSKOB.js} +12 -12
  6. package/dist/chunk-3R27MJ5R.js +25 -0
  7. package/dist/chunk-3R27MJ5R.js.map +1 -0
  8. package/dist/{chunk-PGN2VX4Y.js → chunk-45WZ6GMI.js} +32 -48
  9. package/dist/chunk-45WZ6GMI.js.map +1 -0
  10. package/dist/{chunk-H3EYBJZU.js → chunk-62GVVZQO.js} +10 -10
  11. package/dist/{chunk-GPLP7EPL.js → chunk-6K2LCFG6.js} +10 -10
  12. package/dist/{chunk-GPLP7EPL.js.map → chunk-6K2LCFG6.js.map} +1 -1
  13. package/dist/{chunk-OGVWJO4S.js → chunk-7F7LGMVO.js} +3 -3
  14. package/dist/{chunk-X6GY3CM2.js → chunk-7UMMFOL2.js} +104 -104
  15. package/dist/chunk-7UMMFOL2.js.map +1 -0
  16. package/dist/{chunk-OLUOZLU5.js → chunk-CWSQVHVV.js} +1691 -1075
  17. package/dist/chunk-CWSQVHVV.js.map +1 -0
  18. package/dist/{chunk-MXCOSPLJ.js → chunk-DGRTJD5R.js} +3 -3
  19. package/dist/{chunk-ROIIEVZH.js → chunk-DUS5ZNKL.js} +474 -361
  20. package/dist/chunk-DUS5ZNKL.js.map +1 -0
  21. package/dist/{chunk-BSBJXPLC.js → chunk-E4I6MMHD.js} +10 -10
  22. package/dist/{chunk-QZOBR6YF.js → chunk-ECU7YO7S.js} +4 -4
  23. package/dist/chunk-ECU7YO7S.js.map +1 -0
  24. package/dist/{chunk-EPFC4LHT.js → chunk-EG2MGDP5.js} +9 -9
  25. package/dist/chunk-HOAHMERN.js +229 -0
  26. package/dist/chunk-HOAHMERN.js.map +1 -0
  27. package/dist/{chunk-QVLIIGBU.js → chunk-ICM463EO.js} +60 -13
  28. package/dist/chunk-ICM463EO.js.map +1 -0
  29. package/dist/{chunk-4FUWWBTP.js → chunk-KMCS76ZW.js} +8 -8
  30. package/dist/{chunk-SW2MF47D.js → chunk-KRAGAUKD.js} +19 -19
  31. package/dist/{chunk-OOX3RMD3.js → chunk-LGHND47K.js} +4 -4
  32. package/dist/{chunk-VTF4RWS5.js → chunk-LI35PIIS.js} +7 -7
  33. package/dist/{chunk-Q2TZA6AC.js → chunk-LTH6XYZ3.js} +14 -14
  34. package/dist/{chunk-YA6FWFYW.js → chunk-NEWNXZ65.js} +62 -11
  35. package/dist/chunk-NEWNXZ65.js.map +1 -0
  36. package/dist/{chunk-2H43OVTU.js → chunk-OODXFCQV.js} +11 -11
  37. package/dist/{chunk-KV2K7MK2.js → chunk-PMLE7KAQ.js} +20 -12
  38. package/dist/chunk-PMLE7KAQ.js.map +1 -0
  39. package/dist/{chunk-R42YHLDV.js → chunk-PPZ3K4YM.js} +2 -2
  40. package/dist/{chunk-J2LJB2OH.js → chunk-QF7VEL3M.js} +739 -579
  41. package/dist/chunk-QF7VEL3M.js.map +1 -0
  42. package/dist/{chunk-VK65RNFA.js → chunk-QJ44VG5G.js} +3 -3
  43. package/dist/{chunk-FKWYD44M.js → chunk-QPGEFLMY.js} +2 -2
  44. package/dist/{chunk-NQCR3HSU.js → chunk-RNFUVKC3.js} +3 -3
  45. package/dist/{chunk-G5LACAXO.js → chunk-RYOUZ6EK.js} +2 -2
  46. package/dist/{chunk-MCLPSL6B.js → chunk-SA6HXL4Y.js} +3 -3
  47. package/dist/{chunk-GVOZ6NDO.js → chunk-SOM4QA6C.js} +3 -3
  48. package/dist/{chunk-73TS2H42.js → chunk-TZYINKCC.js} +154 -34
  49. package/dist/chunk-TZYINKCC.js.map +1 -0
  50. package/dist/{chunk-DBEMD34J.js → chunk-V7QOIQYC.js} +8 -8
  51. package/dist/{chunk-IAMIBZRF.js → chunk-WCCZJL7W.js} +2 -2
  52. package/dist/{chunk-OGN2NX57.js → chunk-XUEMATVY.js} +9 -9
  53. package/dist/{chunk-SVDEWOUD.js → chunk-XZUEFTUP.js} +6 -6
  54. package/dist/{chunk-WLJVL25O.js → chunk-YUNBOUQH.js} +6 -6
  55. package/dist/{chunk-WNROH2YE.js → chunk-YVPZUN6X.js} +2 -2
  56. package/dist/chunk-ZVZMWNCG.js +415 -0
  57. package/dist/chunk-ZVZMWNCG.js.map +1 -0
  58. package/dist/cli.js +57 -49
  59. package/dist/cli.js.map +1 -1
  60. package/dist/{config-UE7IP36J.js → config-LEBZZCJP.js} +13 -13
  61. package/dist/{conventions-Z3QC2NSG.js → conventions-XOT6YW5L.js} +15 -15
  62. package/dist/{diagnostics-2Z5HFQOO.js → diagnostics-HTCWF7F4.js} +7 -7
  63. package/dist/execute-LELOSR5T.js +37 -0
  64. package/dist/{generate-PB4L7V5N.js → generate-JGW5JSKB.js} +22 -22
  65. package/dist/{git-7MUOGVRG.js → git-A2IP32PQ.js} +2 -2
  66. package/dist/init-TO6MUXO4.js +26 -0
  67. package/dist/{operations-QDJAFZUN.js → operations-O4FORFIH.js} +15 -15
  68. package/dist/{permissions-XVXXENVP.js → permissions-G4XCAESF.js} +4 -4
  69. package/dist/plan-OXAT344Q.js +34 -0
  70. package/dist/{policy-6WQZB6B2.js → policy-U5NBFAO5.js} +14 -14
  71. package/dist/pr-UZHNKKZC.js +39 -0
  72. package/dist/pr-review-Q4ACAWDM.js +32 -0
  73. package/dist/prd-6CYEMLDY.js +33 -0
  74. package/dist/{ps-CX7756QG.js → ps-76L6ZAZL.js} +12 -12
  75. package/dist/{recorder-RK6XZYF3.js → recorder-2BAKPBRA.js} +7 -7
  76. package/dist/{registry-POSB35Q4.js → registry-XLHHYLTR.js} +5 -5
  77. package/dist/{resume-OQJZV3JH.js → resume-URCU6CIJ.js} +39 -38
  78. package/dist/{resume-OQJZV3JH.js.map → resume-URCU6CIJ.js.map} +1 -1
  79. package/dist/review-LVZT2TMW.js +35 -0
  80. package/dist/routing-EK6RBZM4.js +33 -0
  81. package/dist/run-2RXJCJKT.js +56 -0
  82. package/dist/{session-publisher-VVXOCJ2S.js → session-publisher-KAJQRHNZ.js} +3 -2
  83. package/dist/{state-manager-TIC73GQY.js → state-manager-UPHO2EA2.js} +4 -4
  84. package/dist/state-manager-UPHO2EA2.js.map +1 -0
  85. package/dist/{usage-WDDNSIHP.js → usage-KTMYXAPF.js} +12 -12
  86. package/dist/{web-IPGY52AK.js → web-B5UPHHR5.js} +20 -18
  87. package/dist/{web-IPGY52AK.js.map → web-B5UPHHR5.js.map} +1 -1
  88. package/package.json +6 -5
  89. package/web/AGENTS.md +125 -18
  90. package/web/public/app.css +420 -234
  91. package/web/public/app.js +371 -80
  92. package/web/public/index.html +106 -78
  93. package/dist/agent-PMWCDWOW.js +0 -30
  94. package/dist/chunk-73TS2H42.js.map +0 -1
  95. package/dist/chunk-7Z4Y3VKM.js +0 -26
  96. package/dist/chunk-7Z4Y3VKM.js.map +0 -1
  97. package/dist/chunk-AOAQU7PD.js +0 -180
  98. package/dist/chunk-AOAQU7PD.js.map +0 -1
  99. package/dist/chunk-J2LJB2OH.js.map +0 -1
  100. package/dist/chunk-KV2K7MK2.js.map +0 -1
  101. package/dist/chunk-OLUOZLU5.js.map +0 -1
  102. package/dist/chunk-PGN2VX4Y.js.map +0 -1
  103. package/dist/chunk-QVLIIGBU.js.map +0 -1
  104. package/dist/chunk-QZOBR6YF.js.map +0 -1
  105. package/dist/chunk-ROIIEVZH.js.map +0 -1
  106. package/dist/chunk-X6GY3CM2.js.map +0 -1
  107. package/dist/chunk-YA6FWFYW.js.map +0 -1
  108. package/dist/execute-QYLJ5L4T.js +0 -36
  109. package/dist/init-XBERAZ4O.js +0 -24
  110. package/dist/plan-RXOW32KY.js +0 -34
  111. package/dist/pr-3WFYAVA7.js +0 -39
  112. package/dist/pr-review-RK63ZEMM.js +0 -32
  113. package/dist/prd-LRV6IW3E.js +0 -33
  114. package/dist/review-AEFISJZD.js +0 -35
  115. package/dist/routing-EA5NJGNU.js +0 -94
  116. package/dist/routing-EA5NJGNU.js.map +0 -1
  117. package/dist/run-HSC7R33Y.js +0 -55
  118. /package/dist/{agent-PMWCDWOW.js.map → agent-HMZTXCRT.js.map} +0 -0
  119. /package/dist/{analyze-556KCJKZ.js.map → analyze-Q4ONIWRZ.js.map} +0 -0
  120. /package/dist/{apply-WVV7G7WN.js.map → apply-EEFPY2W4.js.map} +0 -0
  121. /package/dist/{bench-UBFGKUHR.js.map → bench-WWWXLTFH.js.map} +0 -0
  122. /package/dist/{chunk-GV2DABNZ.js.map → chunk-34OCSKOB.js.map} +0 -0
  123. /package/dist/{chunk-H3EYBJZU.js.map → chunk-62GVVZQO.js.map} +0 -0
  124. /package/dist/{chunk-OGVWJO4S.js.map → chunk-7F7LGMVO.js.map} +0 -0
  125. /package/dist/{chunk-MXCOSPLJ.js.map → chunk-DGRTJD5R.js.map} +0 -0
  126. /package/dist/{chunk-BSBJXPLC.js.map → chunk-E4I6MMHD.js.map} +0 -0
  127. /package/dist/{chunk-EPFC4LHT.js.map → chunk-EG2MGDP5.js.map} +0 -0
  128. /package/dist/{chunk-4FUWWBTP.js.map → chunk-KMCS76ZW.js.map} +0 -0
  129. /package/dist/{chunk-SW2MF47D.js.map → chunk-KRAGAUKD.js.map} +0 -0
  130. /package/dist/{chunk-OOX3RMD3.js.map → chunk-LGHND47K.js.map} +0 -0
  131. /package/dist/{chunk-VTF4RWS5.js.map → chunk-LI35PIIS.js.map} +0 -0
  132. /package/dist/{chunk-Q2TZA6AC.js.map → chunk-LTH6XYZ3.js.map} +0 -0
  133. /package/dist/{chunk-2H43OVTU.js.map → chunk-OODXFCQV.js.map} +0 -0
  134. /package/dist/{chunk-R42YHLDV.js.map → chunk-PPZ3K4YM.js.map} +0 -0
  135. /package/dist/{chunk-VK65RNFA.js.map → chunk-QJ44VG5G.js.map} +0 -0
  136. /package/dist/{chunk-FKWYD44M.js.map → chunk-QPGEFLMY.js.map} +0 -0
  137. /package/dist/{chunk-NQCR3HSU.js.map → chunk-RNFUVKC3.js.map} +0 -0
  138. /package/dist/{chunk-G5LACAXO.js.map → chunk-RYOUZ6EK.js.map} +0 -0
  139. /package/dist/{chunk-MCLPSL6B.js.map → chunk-SA6HXL4Y.js.map} +0 -0
  140. /package/dist/{chunk-GVOZ6NDO.js.map → chunk-SOM4QA6C.js.map} +0 -0
  141. /package/dist/{chunk-DBEMD34J.js.map → chunk-V7QOIQYC.js.map} +0 -0
  142. /package/dist/{chunk-IAMIBZRF.js.map → chunk-WCCZJL7W.js.map} +0 -0
  143. /package/dist/{chunk-OGN2NX57.js.map → chunk-XUEMATVY.js.map} +0 -0
  144. /package/dist/{chunk-SVDEWOUD.js.map → chunk-XZUEFTUP.js.map} +0 -0
  145. /package/dist/{chunk-WLJVL25O.js.map → chunk-YUNBOUQH.js.map} +0 -0
  146. /package/dist/{chunk-WNROH2YE.js.map → chunk-YVPZUN6X.js.map} +0 -0
  147. /package/dist/{config-UE7IP36J.js.map → config-LEBZZCJP.js.map} +0 -0
  148. /package/dist/{conventions-Z3QC2NSG.js.map → conventions-XOT6YW5L.js.map} +0 -0
  149. /package/dist/{diagnostics-2Z5HFQOO.js.map → diagnostics-HTCWF7F4.js.map} +0 -0
  150. /package/dist/{execute-QYLJ5L4T.js.map → execute-LELOSR5T.js.map} +0 -0
  151. /package/dist/{generate-PB4L7V5N.js.map → generate-JGW5JSKB.js.map} +0 -0
  152. /package/dist/{git-7MUOGVRG.js.map → git-A2IP32PQ.js.map} +0 -0
  153. /package/dist/{init-XBERAZ4O.js.map → init-TO6MUXO4.js.map} +0 -0
  154. /package/dist/{operations-QDJAFZUN.js.map → operations-O4FORFIH.js.map} +0 -0
  155. /package/dist/{permissions-XVXXENVP.js.map → permissions-G4XCAESF.js.map} +0 -0
  156. /package/dist/{plan-RXOW32KY.js.map → plan-OXAT344Q.js.map} +0 -0
  157. /package/dist/{policy-6WQZB6B2.js.map → policy-U5NBFAO5.js.map} +0 -0
  158. /package/dist/{pr-3WFYAVA7.js.map → pr-UZHNKKZC.js.map} +0 -0
  159. /package/dist/{pr-review-RK63ZEMM.js.map → pr-review-Q4ACAWDM.js.map} +0 -0
  160. /package/dist/{prd-LRV6IW3E.js.map → prd-6CYEMLDY.js.map} +0 -0
  161. /package/dist/{ps-CX7756QG.js.map → ps-76L6ZAZL.js.map} +0 -0
  162. /package/dist/{recorder-RK6XZYF3.js.map → recorder-2BAKPBRA.js.map} +0 -0
  163. /package/dist/{registry-POSB35Q4.js.map → registry-XLHHYLTR.js.map} +0 -0
  164. /package/dist/{review-AEFISJZD.js.map → review-LVZT2TMW.js.map} +0 -0
  165. /package/dist/{run-HSC7R33Y.js.map → routing-EK6RBZM4.js.map} +0 -0
  166. /package/dist/{session-publisher-VVXOCJ2S.js.map → run-2RXJCJKT.js.map} +0 -0
  167. /package/dist/{state-manager-TIC73GQY.js.map → session-publisher-KAJQRHNZ.js.map} +0 -0
  168. /package/dist/{usage-WDDNSIHP.js.map → usage-KTMYXAPF.js.map} +0 -0
@@ -1,180 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- ANTIGRAVITY_CAPABILITIES,
4
- CLAUDE_CAPABILITIES,
5
- CODEX_CAPABILITIES,
6
- CURSOR_CAPABILITIES
7
- } from "./chunk-QVLIIGBU.js";
8
-
9
- // src/routing/priors.ts
10
- var PRIORS_VERSION = "1";
11
- var PRIORS = {
12
- bugfix: { "claude-code": 0.7, "codex-cli": 0.95, "cursor-cli": 0.65, "antigravity-cli": 0.6 },
13
- feature: { "claude-code": 0.85, "codex-cli": 0.8, "cursor-cli": 0.7, "antigravity-cli": 0.65 },
14
- refactor: { "claude-code": 0.75, "codex-cli": 0.9, "cursor-cli": 0.65, "antigravity-cli": 0.6 },
15
- docs: { "claude-code": 0.8, "codex-cli": 0.7, "cursor-cli": 0.75, "antigravity-cli": 0.7 },
16
- test: { "claude-code": 0.7, "codex-cli": 0.9, "cursor-cli": 0.65, "antigravity-cli": 0.6 },
17
- infra: { "claude-code": 0.8, "codex-cli": 0.75, "cursor-cli": 0.6, "antigravity-cli": 0.55 },
18
- analysis: { "claude-code": 0.95, "codex-cli": 0.6, "cursor-cli": 0.7, "antigravity-cli": 0.65 }
19
- };
20
- function priorFor(taskClass, harness) {
21
- return PRIORS[taskClass][harness] ?? 0.5;
22
- }
23
-
24
- // src/routing/analyze.ts
25
- var RISK_PATHS = [/auth/i, /migrat/i, /infra/i, /\.github\//i, /permission/i, /secret/i];
26
- function analyzeTask(signals = {}) {
27
- const hay = [
28
- signals.title ?? "",
29
- signals.body ?? "",
30
- ...signals.labels ?? [],
31
- ...signals.paths ?? []
32
- ].join(" ").toLowerCase();
33
- const taskClass = classify(hay, signals);
34
- const risk = RISK_PATHS.some(
35
- (pattern) => (signals.paths ?? []).some((path) => pattern.test(path))
36
- ) ? "high" : /security|auth|migrat/.test(hay) ? "high" : /refactor|large|epic/.test(hay) ? "medium" : "low";
37
- return { taskClass, risk };
38
- }
39
- function classify(hay, signals) {
40
- if (/\bdocs?\b|readme|changelog/.test(hay)) return "docs";
41
- if (/\btest|spec|coverage/.test(hay)) return "test";
42
- if (/\bcie?|deploy|infra|workflow|docker/.test(hay)) return "infra";
43
- if (/\banaly[sz]e|investigat|research/.test(hay)) return "analysis";
44
- if (/\bbug|fix|regres+ion|crash/.test(hay)) return "bugfix";
45
- if (/\brefactor|cleanup|extract/.test(hay)) return "refactor";
46
- if (/\bfeat|feature|add |implement/.test(hay)) return "feature";
47
- if ((signals.labels ?? []).some((label) => /bug/i.test(label))) return "bugfix";
48
- if ((signals.labels ?? []).some((label) => /enhancement|feature/i.test(label))) return "feature";
49
- return "feature";
50
- }
51
-
52
- // src/routing/capabilities.ts
53
- function filterEligible(input) {
54
- const reasons = [];
55
- if (input.requiresExtraDirectories && input.capabilities.extraDirectories === "none") {
56
- reasons.push("MISSING_CAPABILITY:extraDirectories");
57
- }
58
- return { eligible: reasons.length === 0, reasonCodes: reasons };
59
- }
60
-
61
- // src/routing/score.ts
62
- var DELTA = 0.2;
63
- var MIN_SAMPLE_SIZE = 8;
64
- var PROFILE_MULTIPLIER = {
65
- economy: 0.9,
66
- balanced: 1,
67
- quality: 1.05,
68
- speed: 1.02
69
- };
70
- function clampLearned(value) {
71
- return Math.max(-DELTA, Math.min(DELTA, value));
72
- }
73
- function scoreCandidates(inputs) {
74
- const profile = inputs[0]?.profile ?? "balanced";
75
- const scored = inputs.map((input) => {
76
- const prior = priorFor(input.taskClass, input.harness);
77
- const samples = input.samples ?? 0;
78
- const rawLearned = samples >= MIN_SAMPLE_SIZE ? input.learned ?? 0 : 0;
79
- const learned = clampLearned(rawLearned);
80
- const multiplier = PROFILE_MULTIPLIER[profile];
81
- const score = input.eligible ? (prior + learned) * multiplier : 0;
82
- const reasonCodes = [...input.reasonCodes];
83
- if (input.eligible && samples === 0) reasonCodes.push("COLD_START");
84
- if (input.eligible && learned > 0) reasonCodes.push("HIGH_HISTORICAL_SUCCESS");
85
- if (input.costStatus === "unknown") {
86
- }
87
- return {
88
- harness: input.harness,
89
- provider: input.provider,
90
- model: input.model ?? null,
91
- eligible: input.eligible,
92
- prior,
93
- learned,
94
- samples,
95
- score,
96
- reasonCodes
97
- };
98
- });
99
- return scored.sort((a, b) => {
100
- if (b.score !== a.score) return b.score - a.score;
101
- return a.harness.localeCompare(b.harness);
102
- });
103
- }
104
- function pickSelected(candidates) {
105
- const eligible = candidates.filter((candidate) => candidate.eligible);
106
- if (eligible.length === 0) {
107
- throw new Error(
108
- `No eligible routing candidate: ${candidates.map((c) => `${c.harness} (${c.reasonCodes.join(",")})`).join("; ")}`
109
- );
110
- }
111
- return eligible[0];
112
- }
113
-
114
- // src/routing/decide.ts
115
- var CAPS = {
116
- "claude-code": CLAUDE_CAPABILITIES,
117
- "codex-cli": CODEX_CAPABILITIES,
118
- "cursor-cli": CURSOR_CAPABILITIES,
119
- "antigravity-cli": ANTIGRAVITY_CAPABILITIES
120
- };
121
- var PROVIDER = {
122
- "claude-code": "claude",
123
- "codex-cli": "codex",
124
- "cursor-cli": "cursor",
125
- "antigravity-cli": "antigravity"
126
- };
127
- function decideRouting(input) {
128
- if (input.mode === "off") return null;
129
- const analyzed = analyzeTask(input.signals ?? {});
130
- const profile = input.profile ?? "balanced";
131
- if (input.skipScore) {
132
- return {
133
- policyVersion: PRIORS_VERSION,
134
- profile,
135
- taskClass: analyzed.taskClass,
136
- risk: analyzed.risk,
137
- mode: input.mode,
138
- candidates: [],
139
- selected: input.actualHarness,
140
- actual: input.actualHarness,
141
- reasonCodes: ["EXPLICIT_CONFIG"]
142
- };
143
- }
144
- const scored = scoreCandidates(
145
- Object.keys(CAPS).map((harness) => {
146
- const eligibility = filterEligible({
147
- harness,
148
- capabilities: CAPS[harness],
149
- phase: input.phase,
150
- requiresExtraDirectories: input.requiresExtraDirectories === true
151
- });
152
- return {
153
- harness,
154
- provider: PROVIDER[harness] ?? harness,
155
- eligible: eligibility.eligible,
156
- reasonCodes: eligibility.reasonCodes,
157
- taskClass: analyzed.taskClass,
158
- profile
159
- };
160
- })
161
- );
162
- const selected = pickSelected(scored);
163
- return {
164
- policyVersion: PRIORS_VERSION,
165
- profile,
166
- taskClass: analyzed.taskClass,
167
- risk: analyzed.risk,
168
- mode: input.mode,
169
- candidates: scored,
170
- selected: selected.harness,
171
- actual: input.actualHarness,
172
- reasonCodes: selected.reasonCodes.includes("COLD_START") ? ["HIGH_PRIOR", ...selected.reasonCodes] : selected.reasonCodes
173
- };
174
- }
175
-
176
- export {
177
- PRIORS_VERSION,
178
- decideRouting
179
- };
180
- //# sourceMappingURL=chunk-AOAQU7PD.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/routing/priors.ts","../src/routing/analyze.ts","../src/routing/capabilities.ts","../src/routing/score.ts","../src/routing/decide.ts"],"sourcesContent":["import type { TaskClass } from './types.js';\n\n/** Bump when a cell's provenance changes. */\nexport const PRIORS_VERSION = '1';\n\n/**\n * Cold-start priors. Provenance: author judgement on 2026-08-30 from the\n * #79 baseline and the #76 capability matrix — not measured affinity.\n */\nexport const PRIORS: Record<TaskClass, Record<string, number>> = {\n bugfix: { 'claude-code': 0.7, 'codex-cli': 0.95, 'cursor-cli': 0.65, 'antigravity-cli': 0.6 },\n feature: { 'claude-code': 0.85, 'codex-cli': 0.8, 'cursor-cli': 0.7, 'antigravity-cli': 0.65 },\n refactor: { 'claude-code': 0.75, 'codex-cli': 0.9, 'cursor-cli': 0.65, 'antigravity-cli': 0.6 },\n docs: { 'claude-code': 0.8, 'codex-cli': 0.7, 'cursor-cli': 0.75, 'antigravity-cli': 0.7 },\n test: { 'claude-code': 0.7, 'codex-cli': 0.9, 'cursor-cli': 0.65, 'antigravity-cli': 0.6 },\n infra: { 'claude-code': 0.8, 'codex-cli': 0.75, 'cursor-cli': 0.6, 'antigravity-cli': 0.55 },\n analysis: { 'claude-code': 0.95, 'codex-cli': 0.6, 'cursor-cli': 0.7, 'antigravity-cli': 0.65 },\n};\n\nexport function priorFor(taskClass: TaskClass, harness: string): number {\n return PRIORS[taskClass][harness] ?? 0.5;\n}\n","import type { RiskLevel, TaskClass, TaskSignals } from './types.js';\n\nconst RISK_PATHS = [/auth/i, /migrat/i, /infra/i, /\\.github\\//i, /permission/i, /secret/i];\n\nexport interface AnalyzedTask {\n taskClass: TaskClass;\n risk: RiskLevel;\n}\n\n/** Deterministic. No model, no I/O. Every class is reachable. */\nexport function analyzeTask(signals: TaskSignals = {}): AnalyzedTask {\n const hay = [\n signals.title ?? '',\n signals.body ?? '',\n ...(signals.labels ?? []),\n ...(signals.paths ?? []),\n ]\n .join(' ')\n .toLowerCase();\n\n const taskClass = classify(hay, signals);\n const risk = RISK_PATHS.some((pattern) =>\n (signals.paths ?? []).some((path) => pattern.test(path)),\n )\n ? 'high'\n : /security|auth|migrat/.test(hay)\n ? 'high'\n : /refactor|large|epic/.test(hay)\n ? 'medium'\n : 'low';\n\n return { taskClass, risk };\n}\n\nfunction classify(hay: string, signals: TaskSignals): TaskClass {\n if (/\\bdocs?\\b|readme|changelog/.test(hay)) return 'docs';\n if (/\\btest|spec|coverage/.test(hay)) return 'test';\n if (/\\bcie?|deploy|infra|workflow|docker/.test(hay)) return 'infra';\n if (/\\banaly[sz]e|investigat|research/.test(hay)) return 'analysis';\n if (/\\bbug|fix|regres+ion|crash/.test(hay)) return 'bugfix';\n if (/\\brefactor|cleanup|extract/.test(hay)) return 'refactor';\n if (/\\bfeat|feature|add |implement/.test(hay)) return 'feature';\n if ((signals.labels ?? []).some((label) => /bug/i.test(label))) return 'bugfix';\n if ((signals.labels ?? []).some((label) => /enhancement|feature/i.test(label))) return 'feature';\n return 'feature';\n}\n","import type { AgentCapabilities, AgentPhase } from '../agents/types.js';\n\nexport interface EligibilityInput {\n harness: string;\n capabilities: AgentCapabilities;\n phase: AgentPhase;\n requiresExtraDirectories: boolean;\n}\n\nexport interface Eligibility {\n eligible: boolean;\n reasonCodes: string[];\n}\n\n/**\n * Restriction missing (`toolAllowlist`) is ignored. Enablement missing\n * (`extraDirectories`) is ineligible when the phase needs addDirs.\n */\nexport function filterEligible(input: EligibilityInput): Eligibility {\n const reasons: string[] = [];\n if (input.requiresExtraDirectories && input.capabilities.extraDirectories === 'none') {\n reasons.push('MISSING_CAPABILITY:extraDirectories');\n }\n return { eligible: reasons.length === 0, reasonCodes: reasons };\n}\n","import { priorFor } from './priors.js';\nimport type { Candidate, RoutingProfile, TaskClass } from './types.js';\n\nexport const DELTA = 0.2;\nexport const MIN_SAMPLE_SIZE = 8;\n\nconst PROFILE_MULTIPLIER: Record<RoutingProfile, number> = {\n economy: 0.9,\n balanced: 1,\n quality: 1.05,\n speed: 1.02,\n};\n\nexport interface ScoreInput {\n harness: string;\n provider: string;\n model?: string | null;\n eligible: boolean;\n reasonCodes: string[];\n taskClass: TaskClass;\n learned?: number;\n samples?: number;\n profile?: RoutingProfile;\n /** Cost status from #78. `unknown` never scores cost. */\n costStatus?: 'reported' | 'estimated' | 'unknown';\n}\n\nexport function clampLearned(value: number): number {\n return Math.max(-DELTA, Math.min(DELTA, value));\n}\n\nexport function scoreCandidates(inputs: readonly ScoreInput[]): Candidate[] {\n const profile = inputs[0]?.profile ?? 'balanced';\n const scored: Candidate[] = inputs.map((input) => {\n const prior = priorFor(input.taskClass, input.harness);\n const samples = input.samples ?? 0;\n const rawLearned = samples >= MIN_SAMPLE_SIZE ? (input.learned ?? 0) : 0;\n const learned = clampLearned(rawLearned);\n const multiplier = PROFILE_MULTIPLIER[profile];\n const score = input.eligible ? (prior + learned) * multiplier : 0;\n const reasonCodes = [...input.reasonCodes];\n if (input.eligible && samples === 0) reasonCodes.push('COLD_START');\n if (input.eligible && learned > 0) reasonCodes.push('HIGH_HISTORICAL_SUCCESS');\n if (input.costStatus === 'unknown') {\n // unknown (including subscription) is not $0 and does not score cost.\n }\n return {\n harness: input.harness,\n provider: input.provider,\n model: input.model ?? null,\n eligible: input.eligible,\n prior,\n learned,\n samples,\n score,\n reasonCodes,\n };\n });\n\n return scored.sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score;\n return a.harness.localeCompare(b.harness);\n });\n}\n\nexport function pickSelected(candidates: readonly Candidate[]): Candidate {\n const eligible = candidates.filter((candidate) => candidate.eligible);\n if (eligible.length === 0) {\n throw new Error(\n `No eligible routing candidate: ${candidates.map((c) => `${c.harness} (${c.reasonCodes.join(',')})`).join('; ')}`,\n );\n }\n return eligible[0] as Candidate;\n}\n","import type { AgentPhase } from '../agents/types.js';\nimport {\n ANTIGRAVITY_CAPABILITIES,\n CLAUDE_CAPABILITIES,\n CODEX_CAPABILITIES,\n CURSOR_CAPABILITIES,\n} from '../agents/types.js';\nimport { analyzeTask } from './analyze.js';\nimport { filterEligible } from './capabilities.js';\nimport { PRIORS_VERSION } from './priors.js';\nimport { pickSelected, scoreCandidates } from './score.js';\nimport type { RoutingDecision, RoutingMode, RoutingProfile, TaskSignals } from './types.js';\n\nconst CAPS = {\n 'claude-code': CLAUDE_CAPABILITIES,\n 'codex-cli': CODEX_CAPABILITIES,\n 'cursor-cli': CURSOR_CAPABILITIES,\n 'antigravity-cli': ANTIGRAVITY_CAPABILITIES,\n} as const;\n\nconst PROVIDER: Record<string, string> = {\n 'claude-code': 'claude',\n 'codex-cli': 'codex',\n 'cursor-cli': 'cursor',\n 'antigravity-cli': 'antigravity',\n};\n\nexport function decideRouting(input: {\n signals?: TaskSignals;\n phase: AgentPhase;\n actualHarness: string;\n mode: RoutingMode;\n profile?: RoutingProfile;\n requiresExtraDirectories?: boolean;\n skipScore?: boolean;\n}): RoutingDecision | null {\n if (input.mode === 'off') return null;\n const analyzed = analyzeTask(input.signals ?? {});\n const profile = input.profile ?? 'balanced';\n\n if (input.skipScore) {\n return {\n policyVersion: PRIORS_VERSION,\n profile,\n taskClass: analyzed.taskClass,\n risk: analyzed.risk,\n mode: input.mode,\n candidates: [],\n selected: input.actualHarness,\n actual: input.actualHarness,\n reasonCodes: ['EXPLICIT_CONFIG'],\n };\n }\n\n const scored = scoreCandidates(\n (Object.keys(CAPS) as (keyof typeof CAPS)[]).map((harness) => {\n const eligibility = filterEligible({\n harness,\n capabilities: CAPS[harness],\n phase: input.phase,\n requiresExtraDirectories: input.requiresExtraDirectories === true,\n });\n return {\n harness,\n provider: PROVIDER[harness] ?? harness,\n eligible: eligibility.eligible,\n reasonCodes: eligibility.reasonCodes,\n taskClass: analyzed.taskClass,\n profile,\n };\n }),\n );\n const selected = pickSelected(scored);\n return {\n policyVersion: PRIORS_VERSION,\n profile,\n taskClass: analyzed.taskClass,\n risk: analyzed.risk,\n mode: input.mode,\n candidates: scored,\n selected: selected.harness,\n actual: input.actualHarness,\n reasonCodes: selected.reasonCodes.includes('COLD_START')\n ? ['HIGH_PRIOR', ...selected.reasonCodes]\n : selected.reasonCodes,\n };\n}\n"],"mappings":"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","names":[]}