@hassangameryt/freeflow 0.2.0 → 0.4.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 (312) hide show
  1. package/.agents/plugins/marketplace.json +1 -1
  2. package/.claude-plugin/marketplace.json +4 -4
  3. package/{plugins/freeflow/.claude-plugin → .claude-plugin}/plugin.json +5 -2
  4. package/{plugins/freeflow/.codex-plugin → .codex-plugin}/plugin.json +8 -9
  5. package/README.md +194 -127
  6. package/assets/feedback-loop.png +0 -0
  7. package/assets/freeflow-plugin-icon.png +0 -0
  8. package/assets/freeflow_workflow_map.png +0 -0
  9. package/assets/workflow.png +0 -0
  10. package/command-surface.json +129 -0
  11. package/hooks/freeflow-runtime-context.mjs +419 -0
  12. package/hooks/tests/check-runtime-context-hook.sh +223 -0
  13. package/package.json +41 -22
  14. package/pi-extension/dist/index.js +269 -0
  15. package/pi-extension/dist/integrations/mcp-config.js +29 -0
  16. package/pi-extension/dist/output-router/host-producer-identification.js +232 -0
  17. package/pi-extension/dist/output-router/native-safety-net.js +216 -0
  18. package/pi-extension/dist/output-router/observed-tool-routing.js +122 -0
  19. package/pi-extension/dist/output-router/renderers.js +1023 -0
  20. package/pi-extension/dist/output-router/router-tools.js +554 -0
  21. package/pi-extension/dist/output-router/schemas.js +383 -0
  22. package/pi-extension/dist/output-router/status.js +744 -0
  23. package/pi-extension/dist/output-router/utils.js +502 -0
  24. package/pi-extension/dist/runtime/runtime-context.js +798 -0
  25. package/pi-extension/dist/settings/settings-tui.js +314 -0
  26. package/pi-extension/dist/settings/settings-ui.js +1487 -0
  27. package/pi-extension/freeflow/index.js +1 -0
  28. package/pi-extension/src/index.ts +295 -0
  29. package/pi-extension/src/integrations/mcp-config.ts +32 -0
  30. package/pi-extension/src/output-router/host-producer-identification.ts +256 -0
  31. package/pi-extension/src/output-router/native-safety-net.ts +248 -0
  32. package/pi-extension/src/output-router/observed-tool-routing.ts +134 -0
  33. package/pi-extension/src/output-router/renderers.ts +1108 -0
  34. package/pi-extension/src/output-router/router-tools.ts +579 -0
  35. package/pi-extension/src/output-router/schemas.ts +387 -0
  36. package/pi-extension/src/output-router/status.ts +791 -0
  37. package/pi-extension/src/output-router/utils.ts +554 -0
  38. package/pi-extension/src/runtime/runtime-context.ts +895 -0
  39. package/pi-extension/src/settings/settings-tui.ts +408 -0
  40. package/pi-extension/src/settings/settings-ui.ts +1730 -0
  41. package/pi-extension/tests/integration/pi-extension.test.js +4018 -0
  42. package/pi-extension/tests/output-router/observed-producers.test.js +132 -0
  43. package/pi-extension/tests/output-router/search.test.js +722 -0
  44. package/pi-extension/tests/settings/settings-tui.test.js +243 -0
  45. package/pi-extension/tsconfig.json +16 -0
  46. package/{plugins/freeflow/router/dist → router/dist/benchmarks}/benchmark-harness.d.ts +16 -13
  47. package/router/dist/benchmarks/benchmark-harness.js +92 -0
  48. package/router/dist/benchmarks/benchmarks.d.ts +109 -0
  49. package/router/dist/benchmarks/benchmarks.js +979 -0
  50. package/router/dist/benchmarks/codex-qa-benchmarks.d.ts +95 -0
  51. package/router/dist/benchmarks/codex-qa-benchmarks.js +500 -0
  52. package/router/dist/benchmarks/command-benchmarks.d.ts +143 -0
  53. package/router/dist/benchmarks/command-benchmarks.js +698 -0
  54. package/router/dist/benchmarks/context-mode-normalized-benchmarks.d.ts +82 -0
  55. package/router/dist/benchmarks/context-mode-normalized-benchmarks.js +773 -0
  56. package/router/dist/benchmarks/context-mode-real-deep-benchmark.d.ts +132 -0
  57. package/router/dist/benchmarks/context-mode-real-deep-benchmark.js +1380 -0
  58. package/router/dist/benchmarks/context-saving-baseline.d.ts +60 -0
  59. package/router/dist/benchmarks/context-saving-baseline.js +470 -0
  60. package/router/dist/benchmarks/index-benchmarks.d.ts +103 -0
  61. package/router/dist/benchmarks/index-benchmarks.js +862 -0
  62. package/router/dist/benchmarks/storage-policy-benchmarks.d.ts +101 -0
  63. package/router/dist/benchmarks/storage-policy-benchmarks.js +618 -0
  64. package/router/dist/benchmarks/vault-index-benchmarks.d.ts +56 -0
  65. package/router/dist/benchmarks/vault-index-benchmarks.js +322 -0
  66. package/router/dist/config/config.d.ts +103 -0
  67. package/router/dist/config/config.js +632 -0
  68. package/{plugins/freeflow/router/dist → router/dist/config}/router-contract.d.ts +2 -2
  69. package/router/dist/config/router-contract.js +54 -0
  70. package/{plugins/freeflow/router/dist → router/dist/config}/schema.d.ts +19 -10
  71. package/router/dist/config/schema.js +648 -0
  72. package/router/dist/config/types.d.ts +573 -0
  73. package/router/dist/config/types.js +41 -0
  74. package/router/dist/evidence/bounded-evidence.d.ts +40 -0
  75. package/router/dist/evidence/bounded-evidence.js +323 -0
  76. package/router/dist/evidence/evidence-range-selector.d.ts +24 -0
  77. package/router/dist/evidence/evidence-range-selector.js +232 -0
  78. package/router/dist/evidence/evidence-search.d.ts +27 -0
  79. package/router/dist/evidence/evidence-search.js +490 -0
  80. package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence.d.ts +18 -18
  81. package/router/dist/evidence/evidence.js +200 -0
  82. package/router/dist/evidence/failure-contracts.d.ts +37 -0
  83. package/router/dist/evidence/failure-contracts.js +166 -0
  84. package/router/dist/evidence/line-ranges.d.ts +24 -0
  85. package/router/dist/evidence/line-ranges.js +22 -0
  86. package/router/dist/experiments/local-index.d.ts +64 -0
  87. package/router/dist/experiments/local-index.js +581 -0
  88. package/router/dist/index.d.ts +30 -0
  89. package/router/dist/index.js +32 -0
  90. package/router/dist/local/local-traversal.d.ts +18 -0
  91. package/router/dist/local/local-traversal.js +334 -0
  92. package/router/dist/processing/engine.d.ts +132 -0
  93. package/router/dist/processing/engine.js +533 -0
  94. package/router/dist/processing/reducers.d.ts +280 -0
  95. package/router/dist/processing/reducers.js +1673 -0
  96. package/router/dist/processing/renderers.d.ts +31 -0
  97. package/router/dist/processing/renderers.js +195 -0
  98. package/router/dist/processing/scripts.d.ts +91 -0
  99. package/router/dist/processing/scripts.js +386 -0
  100. package/{plugins/freeflow/router/dist → router/dist/repo}/repo-traversal.d.ts +9 -9
  101. package/router/dist/repo/repo-traversal.js +245 -0
  102. package/router/dist/routing/observed-reducers.d.ts +41 -0
  103. package/router/dist/routing/observed-reducers.js +661 -0
  104. package/router/dist/routing/observed-routing.d.ts +26 -0
  105. package/router/dist/routing/observed-routing.js +378 -0
  106. package/router/dist/routing/parsers.d.ts +16 -0
  107. package/router/dist/routing/parsers.js +521 -0
  108. package/router/dist/routing/run-filters.d.ts +60 -0
  109. package/router/dist/routing/run-filters.js +238 -0
  110. package/router/dist/routing/run-reducers.d.ts +49 -0
  111. package/router/dist/routing/run-reducers.js +122 -0
  112. package/router/dist/sandbox/adapter-roots.d.ts +46 -0
  113. package/router/dist/sandbox/adapter-roots.js +66 -0
  114. package/router/dist/sandbox/eryx-python-adapter.d.ts +13 -0
  115. package/router/dist/sandbox/eryx-python-adapter.js +868 -0
  116. package/router/dist/sandbox/jq-wasm-adapter.d.ts +9 -0
  117. package/router/dist/sandbox/jq-wasm-adapter.js +429 -0
  118. package/router/dist/sandbox/quickjs-wasi-adapter.d.ts +13 -0
  119. package/router/dist/sandbox/quickjs-wasi-adapter.js +384 -0
  120. package/router/dist/sandbox/script-sandbox.d.ts +134 -0
  121. package/router/dist/sandbox/script-sandbox.js +337 -0
  122. package/router/dist/setup/script-transform-adapters.d.ts +32 -0
  123. package/router/dist/setup/script-transform-adapters.js +278 -0
  124. package/router/dist/tools/batch.d.ts +33 -0
  125. package/router/dist/tools/batch.js +586 -0
  126. package/router/dist/tools/run.d.ts +62 -0
  127. package/router/dist/tools/run.js +1304 -0
  128. package/router/dist/tools/search.d.ts +66 -0
  129. package/router/dist/tools/search.js +1364 -0
  130. package/router/dist/transform/engine.d.ts +168 -0
  131. package/router/dist/transform/engine.js +2072 -0
  132. package/router/dist/vault/vault-index.d.ts +125 -0
  133. package/router/dist/vault/vault-index.js +416 -0
  134. package/router/dist/vault/vault.d.ts +138 -0
  135. package/router/dist/vault/vault.js +630 -0
  136. package/runtime/interaction-contract.md +16 -0
  137. package/skills/bypass/SKILL.md +82 -0
  138. package/skills/commit-work/SKILL.md +106 -0
  139. package/skills/commit-work/references/staging-decisions.md +73 -0
  140. package/skills/decision-gate/SKILL.md +48 -0
  141. package/skills/design-for-depth/SKILL.md +106 -0
  142. package/skills/design-for-depth/references/design-pressure-signals.md +314 -0
  143. package/skills/design-for-depth/references/interface-design-loop.md +156 -0
  144. package/skills/design-for-depth/references/software-design-philosophy.md +248 -0
  145. package/skills/diagnose-failure/SKILL.md +105 -0
  146. package/skills/diagnose-failure/references/diagnostic-loop-catalog.md +36 -0
  147. package/skills/diagnose-failure/references/flaky-and-performance.md +43 -0
  148. package/skills/discuss/SKILL.md +121 -0
  149. package/skills/discuss/references/checkpoints.md +66 -0
  150. package/skills/evaluate-skill/SKILL.md +105 -0
  151. package/skills/evaluate-skill/references/definition-schema.md +345 -0
  152. package/skills/evaluate-skill/references/evaluation-design.md +86 -0
  153. package/skills/evaluate-skill/references/execution-and-evidence.md +85 -0
  154. package/skills/evaluate-skill/references/review-and-revision.md +51 -0
  155. package/skills/evaluate-skill/scripts/lib/definitions.mjs +296 -0
  156. package/skills/evaluate-skill/scripts/lib/evidence.mjs +46 -0
  157. package/skills/evaluate-skill/scripts/lib/grade-comparison.mjs +60 -0
  158. package/skills/evaluate-skill/scripts/lib/grade-interaction.mjs +148 -0
  159. package/skills/evaluate-skill/scripts/lib/grade-support.mjs +126 -0
  160. package/skills/evaluate-skill/scripts/lib/grade-workspace.mjs +192 -0
  161. package/skills/evaluate-skill/scripts/lib/grade.mjs +56 -0
  162. package/skills/evaluate-skill/scripts/lib/pi.mjs +489 -0
  163. package/skills/evaluate-skill/scripts/lib/process.mjs +79 -0
  164. package/skills/evaluate-skill/scripts/lib/rpc.mjs +444 -0
  165. package/skills/evaluate-skill/scripts/lib/runner.mjs +346 -0
  166. package/skills/evaluate-skill/scripts/lib/sandbox.mjs +409 -0
  167. package/skills/evaluate-skill/scripts/lib/view.mjs +337 -0
  168. package/skills/evaluate-skill/scripts/pi-guard.mjs +164 -0
  169. package/skills/evaluate-skill/scripts/skill-eval.mjs +101 -0
  170. package/skills/execute-work/SKILL.md +99 -0
  171. package/skills/execute-work/references/code-practices.md +78 -0
  172. package/skills/execute-work/references/execution-loop.md +77 -0
  173. package/skills/finish-branch/SKILL.md +117 -0
  174. package/skills/finish-branch/references/integration-options.md +80 -0
  175. package/skills/handoff/SKILL.md +92 -0
  176. package/skills/handoff/references/templates.md +141 -0
  177. package/skills/launch-work/SKILL.md +116 -0
  178. package/skills/launch-work/references/launch-readiness.md +85 -0
  179. package/skills/migration-work/SKILL.md +115 -0
  180. package/skills/migration-work/references/migration-lifecycle.md +82 -0
  181. package/skills/mode-contract/SKILL.md +82 -0
  182. package/skills/output-router/SKILL.md +206 -0
  183. package/skills/output-router/references/safety-policy.md +40 -0
  184. package/skills/release-work/SKILL.md +118 -0
  185. package/skills/release-work/references/release-evidence.md +78 -0
  186. package/skills/review-artifact/SKILL.md +126 -0
  187. package/skills/review-artifact/references/reviewer-prompt.md +148 -0
  188. package/skills/review-work/SKILL.md +126 -0
  189. package/skills/review-work/references/reviewer-prompt.md +134 -0
  190. package/skills/review-work/references/security-risk-lens.md +67 -0
  191. package/skills/setup-freeflow/SKILL.md +98 -0
  192. package/skills/setup-freeflow/references/activation-contract.md +120 -0
  193. package/skills/setup-freeflow/references/host-setup.md +72 -0
  194. package/skills/setup-freeflow/references/output-router-setup.md +110 -0
  195. package/skills/simplify-code/SKILL.md +80 -0
  196. package/skills/simplify-code/references/simplification-patterns.md +70 -0
  197. package/skills/tdd/SKILL.md +96 -0
  198. package/skills/tdd/references/test-design.md +96 -0
  199. package/skills/track-work/SKILL.md +84 -0
  200. package/skills/track-work/references/working-record-schema.md +378 -0
  201. package/skills/verify-work/SKILL.md +85 -0
  202. package/skills/verify-work/references/browser-runtime-evidence.md +55 -0
  203. package/skills/verify-work/references/integration-evidence.md +51 -0
  204. package/skills/verify-work/references/performance-evidence.md +57 -0
  205. package/skills/workflow/SKILL.md +91 -0
  206. package/skills/workflow/references/domain-skill-composition.md +57 -0
  207. package/skills/workflow/references/workflow-loop.md +92 -0
  208. package/skills/write-plan/SKILL.md +123 -0
  209. package/skills/write-plan/references/plan-shapes.md +156 -0
  210. package/skills/write-skill/SKILL.md +119 -0
  211. package/skills/write-skill/references/activation-boundaries.md +62 -0
  212. package/skills/write-skill/references/agent-first-instructions.md +87 -0
  213. package/skills/write-skill/references/progressive-disclosure.md +63 -0
  214. package/skills/write-skill/scripts/lib/skill-author.mjs +653 -0
  215. package/skills/write-skill/scripts/skill-author.mjs +104 -0
  216. package/skills/write-spec/SKILL.md +104 -0
  217. package/skills/write-spec/references/artifact-standards.md +86 -0
  218. package/skills/write-spec/references/decision-records.md +77 -0
  219. package/skills/write-spec/references/spec-shapes.md +128 -0
  220. package/plugins/freeflow/command-surface.json +0 -77
  221. package/plugins/freeflow/docs/README.md +0 -40
  222. package/plugins/freeflow/docs/adr/0001-three-modes.md +0 -27
  223. package/plugins/freeflow/docs/adr/0002-evals-before-hooks.md +0 -17
  224. package/plugins/freeflow/docs/adr/0003-release-boundary.md +0 -21
  225. package/plugins/freeflow/docs/adr/0004-research-replaces-shallow-discovery-skills.md +0 -26
  226. package/plugins/freeflow/docs/adr/README.md +0 -8
  227. package/plugins/freeflow/docs/architecture.md +0 -86
  228. package/plugins/freeflow/docs/output-router.md +0 -212
  229. package/plugins/freeflow/docs/release-evidence.md +0 -69
  230. package/plugins/freeflow/docs/skills.md +0 -43
  231. package/plugins/freeflow/docs/workflow.md +0 -57
  232. package/plugins/freeflow/hooks/freeflow-runtime-context.mjs +0 -257
  233. package/plugins/freeflow/pi-extension/index.js +0 -1176
  234. package/plugins/freeflow/router/dist/benchmark-harness.js +0 -92
  235. package/plugins/freeflow/router/dist/benchmarks.d.ts +0 -102
  236. package/plugins/freeflow/router/dist/benchmarks.js +0 -880
  237. package/plugins/freeflow/router/dist/bounded-evidence.d.ts +0 -40
  238. package/plugins/freeflow/router/dist/bounded-evidence.js +0 -310
  239. package/plugins/freeflow/router/dist/codex-qa-benchmarks.d.ts +0 -91
  240. package/plugins/freeflow/router/dist/codex-qa-benchmarks.js +0 -461
  241. package/plugins/freeflow/router/dist/command-benchmarks.d.ts +0 -128
  242. package/plugins/freeflow/router/dist/command-benchmarks.js +0 -652
  243. package/plugins/freeflow/router/dist/config.d.ts +0 -22
  244. package/plugins/freeflow/router/dist/config.js +0 -114
  245. package/plugins/freeflow/router/dist/evidence-range-selector.d.ts +0 -22
  246. package/plugins/freeflow/router/dist/evidence-range-selector.js +0 -180
  247. package/plugins/freeflow/router/dist/evidence-search.d.ts +0 -25
  248. package/plugins/freeflow/router/dist/evidence-search.js +0 -450
  249. package/plugins/freeflow/router/dist/evidence.js +0 -196
  250. package/plugins/freeflow/router/dist/experimental-local-index.d.ts +0 -1
  251. package/plugins/freeflow/router/dist/experimental-local-index.js +0 -1
  252. package/plugins/freeflow/router/dist/experiments/local-index.d.ts +0 -58
  253. package/plugins/freeflow/router/dist/experiments/local-index.js +0 -562
  254. package/plugins/freeflow/router/dist/index-benchmarks.d.ts +0 -84
  255. package/plugins/freeflow/router/dist/index-benchmarks.js +0 -458
  256. package/plugins/freeflow/router/dist/index.d.ts +0 -12
  257. package/plugins/freeflow/router/dist/index.js +0 -12
  258. package/plugins/freeflow/router/dist/line-ranges.d.ts +0 -22
  259. package/plugins/freeflow/router/dist/line-ranges.js +0 -22
  260. package/plugins/freeflow/router/dist/parsers.d.ts +0 -16
  261. package/plugins/freeflow/router/dist/parsers.js +0 -473
  262. package/plugins/freeflow/router/dist/repo-traversal.js +0 -242
  263. package/plugins/freeflow/router/dist/retrieve.d.ts +0 -33
  264. package/plugins/freeflow/router/dist/retrieve.js +0 -855
  265. package/plugins/freeflow/router/dist/router-contract.js +0 -54
  266. package/plugins/freeflow/router/dist/run.d.ts +0 -26
  267. package/plugins/freeflow/router/dist/run.js +0 -356
  268. package/plugins/freeflow/router/dist/schema.js +0 -354
  269. package/plugins/freeflow/router/dist/types.d.ts +0 -234
  270. package/plugins/freeflow/router/dist/types.js +0 -9
  271. package/plugins/freeflow/router/dist/vault.d.ts +0 -80
  272. package/plugins/freeflow/router/dist/vault.js +0 -484
  273. package/plugins/freeflow/skills/bypass/SKILL.md +0 -68
  274. package/plugins/freeflow/skills/commit-work/SKILL.md +0 -98
  275. package/plugins/freeflow/skills/commit-work/references/staging-decisions.md +0 -51
  276. package/plugins/freeflow/skills/diagnose-failure/SKILL.md +0 -95
  277. package/plugins/freeflow/skills/diagnose-failure/references/feedback-loop-catalog.md +0 -25
  278. package/plugins/freeflow/skills/diagnose-failure/references/flaky-and-performance.md +0 -31
  279. package/plugins/freeflow/skills/evaluate-skill/SKILL.md +0 -96
  280. package/plugins/freeflow/skills/evaluate-skill/references/eval-patterns.md +0 -41
  281. package/plugins/freeflow/skills/evaluate-skill/references/grading-priority.md +0 -33
  282. package/plugins/freeflow/skills/execute-plan/SKILL.md +0 -132
  283. package/plugins/freeflow/skills/execute-plan/references/execution-map.md +0 -122
  284. package/plugins/freeflow/skills/handoff/SKILL.md +0 -66
  285. package/plugins/freeflow/skills/handoff/references/templates.md +0 -64
  286. package/plugins/freeflow/skills/interview-gate/SKILL.md +0 -90
  287. package/plugins/freeflow/skills/mode-contract/SKILL.md +0 -79
  288. package/plugins/freeflow/skills/output-router/SKILL.md +0 -69
  289. package/plugins/freeflow/skills/output-router/references/safety-policy.md +0 -33
  290. package/plugins/freeflow/skills/research/ARTIFACT-DESTINATIONS.md +0 -58
  291. package/plugins/freeflow/skills/research/CHECKPOINTS.md +0 -74
  292. package/plugins/freeflow/skills/research/LANGUAGE.md +0 -61
  293. package/plugins/freeflow/skills/research/SKILL.md +0 -128
  294. package/plugins/freeflow/skills/review-artifact/SKILL.md +0 -115
  295. package/plugins/freeflow/skills/review-artifact/references/reviewer-prompt.md +0 -56
  296. package/plugins/freeflow/skills/review-work/SKILL.md +0 -96
  297. package/plugins/freeflow/skills/review-work/references/reviewer-prompt.md +0 -97
  298. package/plugins/freeflow/skills/setup-freeflow/SKILL.md +0 -94
  299. package/plugins/freeflow/skills/setup-freeflow/references/activation-contract.md +0 -99
  300. package/plugins/freeflow/skills/setup-freeflow/references/host-setup.md +0 -35
  301. package/plugins/freeflow/skills/setup-freeflow/references/output-router-setup.md +0 -52
  302. package/plugins/freeflow/skills/verify-work/SKILL.md +0 -62
  303. package/plugins/freeflow/skills/workflow/SKILL.md +0 -95
  304. package/plugins/freeflow/skills/workflow/references/workflow-map.md +0 -102
  305. package/plugins/freeflow/skills/write-plan/SKILL.md +0 -88
  306. package/plugins/freeflow/skills/write-plan/references/plan-shapes.md +0 -70
  307. package/plugins/freeflow/skills/write-skill/SKILL.md +0 -88
  308. package/plugins/freeflow/skills/write-spec/SKILL.md +0 -90
  309. package/plugins/freeflow/skills/write-spec/references/artifact-standards.md +0 -67
  310. package/plugins/freeflow/skills/write-spec/references/spec-shapes.md +0 -69
  311. /package/{plugins/freeflow/assets → assets}/freeflow-plugin-icon-transparent.png +0 -0
  312. /package/{plugins/freeflow/hooks → hooks}/hooks.json +0 -0
@@ -1,114 +0,0 @@
1
- import { isValidPostToolRoutingMode, validatePositiveIntegerThreshold } from "./router-contract.js";
2
- export const OUTPUT_ROUTER_SKILL_PATH = "plugins/freeflow/skills/output-router/SKILL.md";
3
- export const DEFAULT_VAULT_ROOT = "~/.cache/freeflow-router/vault";
4
- export const DEFAULT_POST_TOOL_ROUTING = "off";
5
- export const DEFAULT_VAULT_RETENTION = {
6
- strategy: "ttl",
7
- ttlDays: 7,
8
- };
9
- export const DEFAULT_ROUTER_THRESHOLDS = {
10
- largeOutputBytes: 64_000,
11
- largeOutputLines: 1_000,
12
- };
13
- export function createDefaultRouterConfig(options = {}) {
14
- return {
15
- postToolRouting: DEFAULT_POST_TOOL_ROUTING,
16
- thresholds: { ...DEFAULT_ROUTER_THRESHOLDS },
17
- vault: {
18
- root: options.vaultRoot ?? DEFAULT_VAULT_ROOT,
19
- retention: options.vaultRetention ?? DEFAULT_VAULT_RETENTION,
20
- },
21
- };
22
- }
23
- export function normalizeRouterConfig(input) {
24
- const config = createDefaultRouterConfig();
25
- const warnings = [];
26
- if (input === undefined || input === null) {
27
- return { config, warnings };
28
- }
29
- if (!isRecord(input)) {
30
- return {
31
- config,
32
- warnings: ["outputRouter config must be an object; using built-in output router defaults."],
33
- };
34
- }
35
- applyPostToolRouting(config, warnings, input.postToolRouting);
36
- applyPositiveInteger(config.thresholds, warnings, input.largeOutputBytes, "largeOutputBytes");
37
- applyPositiveInteger(config.thresholds, warnings, input.largeOutputLines, "largeOutputLines");
38
- applyVaultRoot(config, warnings, input.vaultRoot);
39
- applyVaultRetention(config, warnings, input.vaultRetentionDays);
40
- applyHints(config, warnings, input.generatedPaths, input.noisyCommandHints);
41
- return { config, warnings };
42
- }
43
- function isRecord(value) {
44
- return typeof value === "object" && value !== null && !Array.isArray(value);
45
- }
46
- function applyPostToolRouting(config, warnings, value) {
47
- if (value === undefined) {
48
- return;
49
- }
50
- if (isValidPostToolRoutingMode(value)) {
51
- config.postToolRouting = value;
52
- return;
53
- }
54
- warnings.push(`Invalid outputRouter.postToolRouting=${JSON.stringify(value)}; using ${DEFAULT_POST_TOOL_ROUTING}.`);
55
- }
56
- function applyPositiveInteger(thresholds, warnings, value, key) {
57
- if (value === undefined) {
58
- return;
59
- }
60
- if (validatePositiveIntegerThreshold(value, `outputRouter.${key}`).length === 0) {
61
- thresholds[key] = value;
62
- return;
63
- }
64
- warnings.push(`Invalid outputRouter.${key}=${JSON.stringify(value)}; using ${DEFAULT_ROUTER_THRESHOLDS[key]}.`);
65
- }
66
- function applyVaultRoot(config, warnings, value) {
67
- if (value === undefined) {
68
- return;
69
- }
70
- if (typeof value === "string" && value.trim().length > 0) {
71
- config.vault.root = value;
72
- return;
73
- }
74
- warnings.push(`Invalid outputRouter.vaultRoot=${JSON.stringify(value)}; using ${DEFAULT_VAULT_ROOT}.`);
75
- }
76
- function applyVaultRetention(config, warnings, value) {
77
- if (value === undefined) {
78
- return;
79
- }
80
- if (validatePositiveIntegerThreshold(value, "outputRouter.vaultRetentionDays").length === 0) {
81
- config.vault.retention = { strategy: "ttl", ttlDays: value };
82
- return;
83
- }
84
- warnings.push(`Invalid outputRouter.vaultRetentionDays=${JSON.stringify(value)}; using ${DEFAULT_VAULT_RETENTION.ttlDays}.`);
85
- }
86
- function applyHints(config, warnings, generatedPaths, noisyCommandHints) {
87
- const hints = {};
88
- if (generatedPaths !== undefined) {
89
- const parsed = parseStringArray(generatedPaths, "generatedPaths", warnings);
90
- if (parsed) {
91
- hints.generatedPathGlobs = parsed;
92
- }
93
- }
94
- if (noisyCommandHints !== undefined) {
95
- const parsed = parseStringArray(noisyCommandHints, "noisyCommandHints", warnings);
96
- if (parsed) {
97
- hints.noisyCommandPatterns = parsed;
98
- }
99
- }
100
- if (hints.generatedPathGlobs || hints.noisyCommandPatterns) {
101
- config.hints = hints;
102
- }
103
- }
104
- function parseStringArray(value, key, warnings) {
105
- if (!Array.isArray(value)) {
106
- warnings.push(`Invalid outputRouter.${key}; expected an array of strings.`);
107
- return undefined;
108
- }
109
- if (!value.every((item) => typeof item === "string")) {
110
- warnings.push(`Invalid outputRouter.${key}; expected an array of strings.`);
111
- return undefined;
112
- }
113
- return value;
114
- }
@@ -1,22 +0,0 @@
1
- export interface LineRange {
2
- start: number;
3
- end: number;
4
- }
5
- export type EvidenceChunkKind = "section" | "symbol" | "window";
6
- export type EvidenceRangeMatchKind = "exact-phrase" | "coverage" | "best-line";
7
- export interface SelectEvidenceRangeForChunkOptions {
8
- lines: readonly string[];
9
- chunkRange: LineRange;
10
- chunkKind: EvidenceChunkKind;
11
- queryTokens: readonly string[];
12
- normalizedQueryPhrase: string;
13
- chunkHasExactPhrase: boolean;
14
- defaultContextLines: number;
15
- queryCoverageMaxLines: number;
16
- }
17
- export interface EvidenceRangeSelection {
18
- range: LineRange;
19
- anchorLine: number;
20
- matchKind: EvidenceRangeMatchKind;
21
- }
22
- export declare function selectEvidenceRangeForChunk(options: SelectEvidenceRangeForChunkOptions): EvidenceRangeSelection;
@@ -1,180 +0,0 @@
1
- export function selectEvidenceRangeForChunk(options) {
2
- const exactRange = options.chunkHasExactPhrase ? exactPhraseRangeForChunk(options) : null;
3
- const chunkLength = options.chunkRange.end - options.chunkRange.start + 1;
4
- const anchorLineIndex = exactRange ? exactRange.start - 1 : bestLineIndexInChunk(options);
5
- if (exactRange) {
6
- return {
7
- range: {
8
- start: Math.max(options.chunkRange.start, exactRange.start - options.defaultContextLines),
9
- end: Math.min(options.chunkRange.end, exactRange.end + options.defaultContextLines),
10
- },
11
- anchorLine: exactRange.start,
12
- matchKind: "exact-phrase",
13
- };
14
- }
15
- if (options.chunkKind === "symbol" || chunkLength <= options.defaultContextLines * 2 + 4) {
16
- return {
17
- range: options.chunkRange,
18
- anchorLine: anchorLineIndex + 1,
19
- matchKind: exactRange ? "exact-phrase" : "best-line",
20
- };
21
- }
22
- const coverageRange = queryCoverageRangeForChunk(options);
23
- if (coverageRange) {
24
- return {
25
- range: coverageRange,
26
- anchorLine: coverageRange.start,
27
- matchKind: "coverage",
28
- };
29
- }
30
- return {
31
- range: {
32
- start: Math.max(options.chunkRange.start, anchorLineIndex + 1 - options.defaultContextLines),
33
- end: Math.min(options.chunkRange.end, anchorLineIndex + 1 + options.defaultContextLines),
34
- },
35
- anchorLine: anchorLineIndex + 1,
36
- matchKind: "best-line",
37
- };
38
- }
39
- function exactPhraseRangeForChunk(options) {
40
- if (options.normalizedQueryPhrase === "") {
41
- return null;
42
- }
43
- for (let lineIndex = options.chunkRange.start - 1; lineIndex < options.chunkRange.end; lineIndex += 1) {
44
- const line = options.lines[lineIndex] ?? "";
45
- if (hasExactNormalizedPhrase(line, options.normalizedQueryPhrase)) {
46
- return { start: lineIndex + 1, end: lineIndex + 1 };
47
- }
48
- }
49
- for (let startIndex = options.chunkRange.start - 1; startIndex < options.chunkRange.end; startIndex += 1) {
50
- let text = "";
51
- for (let endIndex = startIndex; endIndex < options.chunkRange.end; endIndex += 1) {
52
- const line = options.lines[endIndex] ?? "";
53
- text = text === "" ? line : `${text}\n${line}`;
54
- if (hasExactNormalizedPhrase(text, options.normalizedQueryPhrase)) {
55
- return { start: startIndex + 1, end: endIndex + 1 };
56
- }
57
- }
58
- }
59
- return null;
60
- }
61
- function bestLineIndexInChunk(options) {
62
- let bestIndex = options.chunkRange.start - 1;
63
- let bestScore = 0;
64
- for (let lineIndex = options.chunkRange.start - 1; lineIndex < options.chunkRange.end; lineIndex += 1) {
65
- const line = options.lines[lineIndex] ?? "";
66
- const score = scoreText(line, options.queryTokens) * 4 + (line.trimStart().startsWith("#") ? 2 : 0);
67
- if (score > bestScore) {
68
- bestIndex = lineIndex;
69
- bestScore = score;
70
- }
71
- }
72
- return bestIndex;
73
- }
74
- function queryCoverageRangeForChunk(options) {
75
- if (options.chunkKind !== "section" || options.queryTokens.length < 2) {
76
- return null;
77
- }
78
- const remainingTokens = new Set(options.queryTokens);
79
- const matchingLines = [];
80
- for (let lineIndex = options.chunkRange.start - 1; lineIndex < options.chunkRange.end; lineIndex += 1) {
81
- const line = options.lines[lineIndex] ?? "";
82
- const lineTokens = new Set(tokenizeForSearch(line));
83
- let matchedLine = false;
84
- for (const token of options.queryTokens) {
85
- if (lineTokens.has(token)) {
86
- remainingTokens.delete(token);
87
- matchedLine = true;
88
- }
89
- }
90
- if (matchedLine) {
91
- matchingLines.push(lineIndex + 1);
92
- }
93
- if (remainingTokens.size === 0) {
94
- break;
95
- }
96
- }
97
- if (remainingTokens.size > 0 || matchingLines.length === 0) {
98
- return null;
99
- }
100
- const start = Math.max(options.chunkRange.start, Math.min(...matchingLines) - options.defaultContextLines);
101
- const end = Math.min(options.chunkRange.end, Math.max(...matchingLines) + options.defaultContextLines);
102
- if (end - start + 1 > options.queryCoverageMaxLines) {
103
- return null;
104
- }
105
- return { start, end };
106
- }
107
- function hasExactNormalizedPhrase(text, normalizedQueryPhrase) {
108
- return normalizedQueryPhrase !== "" && normalizePhraseSequence(text).includes(normalizedQueryPhrase);
109
- }
110
- function normalizePhraseSequence(text) {
111
- const tokens = tokenizeForPhrase(text);
112
- return tokens.length >= 2 ? tokens.join(" ") : "";
113
- }
114
- function tokenizeForSearch(text) {
115
- return text
116
- .split(/[^A-Za-z0-9_./-]+/)
117
- .flatMap((token) => expandedIdentifierTokens(token.trim()))
118
- .filter((token) => token.length >= 2);
119
- }
120
- function tokenizeForPhrase(text) {
121
- return tokenizeForSearch(text);
122
- }
123
- function scoreText(text, tokens) {
124
- const lower = text.toLowerCase();
125
- return tokens.reduce((score, token) => score + countOccurrences(lower, token), 0);
126
- }
127
- function countOccurrences(text, token) {
128
- let count = 0;
129
- let index = text.indexOf(token);
130
- while (index !== -1) {
131
- count += 1;
132
- index = text.indexOf(token, index + token.length);
133
- }
134
- return count;
135
- }
136
- function expandedIdentifierTokens(token) {
137
- if (!token) {
138
- return [];
139
- }
140
- const lower = token.toLowerCase();
141
- if (!needsIdentifierSplit(token)) {
142
- return [lower];
143
- }
144
- const variants = new Set();
145
- addTokenVariant(variants, lower);
146
- for (const part of splitIdentifierToken(token)) {
147
- addTokenVariant(variants, part.toLowerCase());
148
- }
149
- return Array.from(variants);
150
- }
151
- function addTokenVariant(variants, token) {
152
- if (token) {
153
- variants.add(token);
154
- }
155
- }
156
- function needsIdentifierSplit(token) {
157
- if (/[._/-]/.test(token)) {
158
- return true;
159
- }
160
- for (let index = 1; index < token.length; index += 1) {
161
- const previous = token.charCodeAt(index - 1);
162
- const current = token.charCodeAt(index);
163
- const next = index + 1 < token.length ? token.charCodeAt(index + 1) : 0;
164
- const previousIsLowerOrDigit = (previous >= 97 && previous <= 122) || (previous >= 48 && previous <= 57);
165
- const previousIsUpper = previous >= 65 && previous <= 90;
166
- const currentIsUpper = current >= 65 && current <= 90;
167
- const nextIsLower = next >= 97 && next <= 122;
168
- if ((previousIsLowerOrDigit && currentIsUpper) || (previousIsUpper && currentIsUpper && nextIsLower)) {
169
- return true;
170
- }
171
- }
172
- return false;
173
- }
174
- function splitIdentifierToken(token) {
175
- return token
176
- .replace(/([a-z0-9])([A-Z])/g, "$1 $2")
177
- .replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2")
178
- .split(/[._/\-\s]+/)
179
- .filter((part) => part.length > 0);
180
- }
@@ -1,25 +0,0 @@
1
- export interface EvidenceSearchLineRange {
2
- start: number;
3
- end: number;
4
- }
5
- export interface EvidenceSearchFile {
6
- path: string;
7
- lines: readonly string[];
8
- }
9
- export interface EvidenceSearchCandidate<TFile extends EvidenceSearchFile = EvidenceSearchFile> {
10
- file: TFile;
11
- lineIndex: number;
12
- score: number;
13
- reason: string;
14
- range?: EvidenceSearchLineRange;
15
- exactNormalizedPhrase?: string;
16
- }
17
- export interface SearchRepoEvidenceCandidatesOptions<TFile extends EvidenceSearchFile = EvidenceSearchFile> {
18
- files: readonly TFile[];
19
- query: string;
20
- topK: number;
21
- defaultContextLines?: number;
22
- queryCoverageMaxLines?: number;
23
- }
24
- export declare function searchRepoEvidenceCandidates<TFile extends EvidenceSearchFile>(options: SearchRepoEvidenceCandidatesOptions<TFile>): EvidenceSearchCandidate<TFile>[];
25
- export declare function findBestLineForQuery(lines: readonly string[], query: string): number | null;