@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,40 +0,0 @@
1
- import type { EvidenceWindow } from "./types.js";
2
- export interface LineRange {
3
- start: number;
4
- end: number;
5
- }
6
- export interface BoundedEvidenceCaps {
7
- queryExcerptMaxBytes: number;
8
- linePreviewMaxBytes: number;
9
- expandLines30MaxBytes: number;
10
- expandLines30MaxLines: number;
11
- expandLines80MaxBytes: number;
12
- expandLines80MaxLines: number;
13
- exactChunkMaxBytes: number;
14
- }
15
- export interface BuildBoundedExcerptOptions {
16
- lines: readonly string[];
17
- range: LineRange;
18
- window: EvidenceWindow;
19
- caps: BoundedEvidenceCaps;
20
- exactNormalizedPhrase?: string;
21
- }
22
- export interface BoundedExcerpt {
23
- range: LineRange;
24
- linesLabel: string;
25
- excerpt: string;
26
- truncatedByLineCap: boolean;
27
- truncatedByByteCap: boolean;
28
- }
29
- export interface BoundedEdgeChunk {
30
- range: LineRange;
31
- linesLabel: string;
32
- edge: "head" | "tail";
33
- excerpt: string;
34
- }
35
- export declare function buildBoundedEdgeChunks(options: {
36
- lines: readonly string[];
37
- range: LineRange;
38
- caps: BoundedEvidenceCaps;
39
- }): BoundedEdgeChunk[];
40
- export declare function buildBoundedExcerpt(options: BuildBoundedExcerptOptions): BoundedExcerpt;
@@ -1,310 +0,0 @@
1
- const TRUNCATION_SUFFIX = " … [truncated; expand or retrieve exact lines for recovery]";
2
- const TRUNCATION_PREFIX = "[truncated head; expand or retrieve exact lines for recovery] … ";
3
- export function buildBoundedEdgeChunks(options) {
4
- return overCapEdgeRanges(options.lines, options.range, options.caps).map((range) => {
5
- const excerpt = range.edge === "tail"
6
- ? truncateTailToUtf8Bytes(linesForRange(options.lines, range), options.caps.exactChunkMaxBytes)
7
- : truncateToUtf8Bytes(linesForRange(options.lines, range), options.caps.exactChunkMaxBytes);
8
- return {
9
- range: { start: range.start, end: range.end },
10
- linesLabel: `${range.start}-${range.end}`,
11
- edge: range.edge,
12
- excerpt,
13
- };
14
- });
15
- }
16
- export function buildBoundedExcerpt(options) {
17
- const capped = capLineRangeForWindow(options.range, options.window, options.caps);
18
- const selected = options.lines.slice(capped.range.start - 1, capped.range.end);
19
- const maxBytes = maxExcerptBytesForWindow(options.window, options.caps);
20
- if (maxBytes !== null && options.exactNormalizedPhrase !== undefined) {
21
- const exactExcerpt = excerptAroundNormalizedPhrase(selected.join("\n"), options.exactNormalizedPhrase, maxBytes);
22
- if (exactExcerpt !== null) {
23
- return {
24
- range: capped.range,
25
- linesLabel: `${capped.range.start}-${capped.range.end}`,
26
- excerpt: exactExcerpt,
27
- truncatedByLineCap: capped.truncated,
28
- truncatedByByteCap: byteLength(selected.join("\n")) > maxBytes,
29
- };
30
- }
31
- }
32
- const previewedLines = maxBytes !== null
33
- ? selected.map((line) => truncateLinePreview(line, options.caps.linePreviewMaxBytes, options.exactNormalizedPhrase))
34
- : selected;
35
- const uncappedExcerpt = previewedLines.join("\n");
36
- const excerpt = maxBytes === null ? uncappedExcerpt : truncateToUtf8Bytes(uncappedExcerpt, maxBytes);
37
- return {
38
- range: capped.range,
39
- linesLabel: `${capped.range.start}-${capped.range.end}`,
40
- excerpt,
41
- truncatedByLineCap: capped.truncated,
42
- truncatedByByteCap: maxBytes !== null && byteLength(uncappedExcerpt) > maxBytes,
43
- };
44
- }
45
- function overCapEdgeRanges(lines, range, caps) {
46
- const lineCount = range.end - range.start + 1;
47
- const chunkLineCount = Math.min(10, Math.max(1, Math.floor(lineCount / 2)));
48
- const headRange = shrinkRangeToMaxBytes(lines, { start: range.start, end: Math.min(range.end, range.start + chunkLineCount - 1) }, "head", caps);
49
- const tailRange = shrinkRangeToMaxBytes(lines, { start: Math.max(range.start, range.end - chunkLineCount + 1), end: range.end }, "tail", caps);
50
- const head = { ...headRange, edge: "head" };
51
- const tail = { ...tailRange, edge: "tail" };
52
- if (tail.start <= head.end) {
53
- return byteLength(linesForRange(lines, head)) > caps.exactChunkMaxBytes ? [head, tail] : [head];
54
- }
55
- return [head, tail];
56
- }
57
- function shrinkRangeToMaxBytes(lines, range, edge, caps) {
58
- let current = range;
59
- while (current.end > current.start && byteLength(linesForRange(lines, current)) > caps.exactChunkMaxBytes) {
60
- current = edge === "head" ? { start: current.start, end: current.end - 1 } : { start: current.start + 1, end: current.end };
61
- }
62
- return current;
63
- }
64
- function linesForRange(lines, range) {
65
- return lines.slice(range.start - 1, range.end).join("\n");
66
- }
67
- function capLineRangeForWindow(range, window, caps) {
68
- const maxLines = maxLinesForWindow(window, caps);
69
- const lineCount = range.end - range.start + 1;
70
- if (maxLines === null || lineCount <= maxLines) {
71
- return { range, truncated: false };
72
- }
73
- return {
74
- range: { start: range.start, end: range.start + maxLines - 1 },
75
- truncated: true,
76
- };
77
- }
78
- function maxLinesForWindow(window, caps) {
79
- if (window === "lines_30") {
80
- return caps.expandLines30MaxLines;
81
- }
82
- if (window === "lines_80") {
83
- return caps.expandLines80MaxLines;
84
- }
85
- return null;
86
- }
87
- function maxExcerptBytesForWindow(window, caps) {
88
- if (window === "small" || window === "section") {
89
- return caps.queryExcerptMaxBytes;
90
- }
91
- if (window === "lines_30") {
92
- return caps.expandLines30MaxBytes;
93
- }
94
- if (window === "lines_80") {
95
- return caps.expandLines80MaxBytes;
96
- }
97
- return null;
98
- }
99
- function excerptAroundNormalizedPhrase(text, exactNormalizedPhrase, maxBytes) {
100
- const span = normalizedPhraseRawSpan(text, exactNormalizedPhrase);
101
- if (span === null) {
102
- return null;
103
- }
104
- return truncateToUtf8BytesAroundSpan(text, span, maxBytes);
105
- }
106
- function truncateLinePreview(text, maxBytes, exactNormalizedPhrase) {
107
- if (exactNormalizedPhrase === undefined || byteLength(text) <= maxBytes) {
108
- return truncateToUtf8Bytes(text, maxBytes);
109
- }
110
- const span = normalizedPhraseRawSpan(text, exactNormalizedPhrase);
111
- if (span === null) {
112
- return truncateToUtf8Bytes(text, maxBytes);
113
- }
114
- return truncateToUtf8BytesAroundSpan(text, span, maxBytes);
115
- }
116
- function truncateToUtf8Bytes(text, maxBytes) {
117
- if (byteLength(text) <= maxBytes) {
118
- return text;
119
- }
120
- const suffixBytes = byteLength(TRUNCATION_SUFFIX);
121
- const contentBytes = Math.max(0, maxBytes - suffixBytes);
122
- return `${truncateHeadToUtf8Bytes(text, contentBytes)}${TRUNCATION_SUFFIX}`;
123
- }
124
- function truncateToUtf8BytesAroundSpan(text, span, maxBytes) {
125
- if (byteLength(text) <= maxBytes) {
126
- return text;
127
- }
128
- const prefix = span.start > 0 ? TRUNCATION_PREFIX : "";
129
- const suffix = span.end < text.length ? TRUNCATION_SUFFIX : "";
130
- const budget = maxBytes - byteLength(prefix) - byteLength(suffix);
131
- const phrase = text.slice(span.start, span.end);
132
- const phraseBytes = byteLength(phrase);
133
- if (budget <= 0 || phraseBytes >= budget) {
134
- return truncateToUtf8Bytes(text.slice(span.start), maxBytes);
135
- }
136
- const contextBudget = budget - phraseBytes;
137
- const beforeBudget = Math.floor(contextBudget / 2);
138
- const afterBudget = contextBudget - beforeBudget;
139
- let start = span.start;
140
- while (start > 0 && byteLength(text.slice(start - 1, span.start)) <= beforeBudget) {
141
- start -= 1;
142
- }
143
- if (byteLength(text.slice(start, span.start)) > beforeBudget) {
144
- start += 1;
145
- }
146
- let end = span.end;
147
- while (end < text.length && byteLength(text.slice(span.end, end + 1)) <= afterBudget) {
148
- end += 1;
149
- }
150
- if (byteLength(text.slice(span.end, end)) > afterBudget) {
151
- end -= 1;
152
- }
153
- start = moveToCodePointStartBoundary(text, start);
154
- end = moveToCodePointEndBoundary(text, end);
155
- const actualPrefix = start > 0 ? prefix : "";
156
- const actualSuffix = end < text.length ? suffix : "";
157
- return `${actualPrefix}${text.slice(start, end)}${actualSuffix}`;
158
- }
159
- function normalizedPhraseRawSpan(text, normalizedPhrase) {
160
- const phraseTokens = normalizedPhrase.split(/\s+/).filter(Boolean);
161
- if (phraseTokens.length === 0) {
162
- return null;
163
- }
164
- const spans = tokenSpansForPhrase(text);
165
- for (let startIndex = 0; startIndex <= spans.length - phraseTokens.length; startIndex += 1) {
166
- let matched = true;
167
- for (let offset = 0; offset < phraseTokens.length; offset += 1) {
168
- if (spans[startIndex + offset]?.token !== phraseTokens[offset]) {
169
- matched = false;
170
- break;
171
- }
172
- }
173
- if (matched) {
174
- const first = spans[startIndex];
175
- const last = spans[startIndex + phraseTokens.length - 1];
176
- if (first !== undefined && last !== undefined) {
177
- return { start: first.start, end: last.end };
178
- }
179
- }
180
- }
181
- return null;
182
- }
183
- function tokenSpansForPhrase(text) {
184
- const spans = [];
185
- for (const match of text.matchAll(/[A-Za-z0-9_./-]+/g)) {
186
- const rawToken = match[0];
187
- const start = match.index ?? 0;
188
- const end = start + rawToken.length;
189
- for (const token of expandedIdentifierTokens(rawToken)) {
190
- if (token.length >= 2) {
191
- spans.push({ token, start, end });
192
- }
193
- }
194
- }
195
- return spans;
196
- }
197
- function expandedIdentifierTokens(token) {
198
- if (!token) {
199
- return [];
200
- }
201
- const lower = token.toLowerCase();
202
- if (!needsIdentifierSplit(token)) {
203
- return [lower];
204
- }
205
- const variants = new Set();
206
- addTokenVariant(variants, lower);
207
- for (const part of splitIdentifierToken(token)) {
208
- addTokenVariant(variants, part.toLowerCase());
209
- }
210
- return Array.from(variants);
211
- }
212
- function addTokenVariant(variants, token) {
213
- if (token) {
214
- variants.add(token);
215
- }
216
- }
217
- function needsIdentifierSplit(token) {
218
- if (/[._/-]/.test(token)) {
219
- return true;
220
- }
221
- for (let index = 1; index < token.length; index += 1) {
222
- const previous = token.charCodeAt(index - 1);
223
- const current = token.charCodeAt(index);
224
- const next = index + 1 < token.length ? token.charCodeAt(index + 1) : 0;
225
- const previousIsLowerOrDigit = (previous >= 97 && previous <= 122) || (previous >= 48 && previous <= 57);
226
- const previousIsUpper = previous >= 65 && previous <= 90;
227
- const currentIsUpper = current >= 65 && current <= 90;
228
- const nextIsLower = next >= 97 && next <= 122;
229
- if ((previousIsLowerOrDigit && currentIsUpper) || (previousIsUpper && currentIsUpper && nextIsLower)) {
230
- return true;
231
- }
232
- }
233
- return false;
234
- }
235
- function splitIdentifierToken(token) {
236
- const separated = token
237
- .replace(/[._/-]+/g, " ")
238
- .replace(/([a-z0-9])([A-Z])/g, "$1 $2")
239
- .replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2");
240
- return separated.split(/\s+/).filter(Boolean);
241
- }
242
- function truncateTailToUtf8Bytes(text, maxBytes) {
243
- if (byteLength(text) <= maxBytes) {
244
- return text;
245
- }
246
- const prefixBytes = byteLength(TRUNCATION_PREFIX);
247
- const contentBytes = Math.max(0, maxBytes - prefixBytes);
248
- return `${TRUNCATION_PREFIX}${truncateTailToUtf8BytesContent(text, contentBytes)}`;
249
- }
250
- function truncateHeadToUtf8Bytes(text, maxBytes) {
251
- if (maxBytes <= 0) {
252
- return "";
253
- }
254
- if (byteLength(text) <= maxBytes) {
255
- return text;
256
- }
257
- let low = 0;
258
- let high = text.length;
259
- while (low < high) {
260
- const mid = Math.ceil((low + high) / 2);
261
- if (byteLength(text.slice(0, mid)) <= maxBytes) {
262
- low = mid;
263
- }
264
- else {
265
- high = mid - 1;
266
- }
267
- }
268
- return text.slice(0, moveToCodePointEndBoundary(text, low));
269
- }
270
- function truncateTailToUtf8BytesContent(text, maxBytes) {
271
- if (maxBytes <= 0) {
272
- return "";
273
- }
274
- if (byteLength(text) <= maxBytes) {
275
- return text;
276
- }
277
- let low = 0;
278
- let high = text.length;
279
- while (low < high) {
280
- const mid = Math.floor((low + high) / 2);
281
- if (byteLength(text.slice(mid)) <= maxBytes) {
282
- high = mid;
283
- }
284
- else {
285
- low = mid + 1;
286
- }
287
- }
288
- return text.slice(moveToCodePointStartBoundary(text, low));
289
- }
290
- function moveToCodePointStartBoundary(text, index) {
291
- if (index > 0 && index < text.length && isLowSurrogate(text.charCodeAt(index))) {
292
- return index + 1;
293
- }
294
- return index;
295
- }
296
- function moveToCodePointEndBoundary(text, index) {
297
- if (index > 0 && isHighSurrogate(text.charCodeAt(index - 1))) {
298
- return index - 1;
299
- }
300
- return index;
301
- }
302
- function isHighSurrogate(code) {
303
- return code >= 0xd800 && code <= 0xdbff;
304
- }
305
- function isLowSurrogate(code) {
306
- return code >= 0xdc00 && code <= 0xdfff;
307
- }
308
- function byteLength(text) {
309
- return Buffer.byteLength(text, "utf8");
310
- }
@@ -1,91 +0,0 @@
1
- export interface RunCodexQaBenchmarksOptions {
2
- iterations?: number;
3
- generatedAt?: string;
4
- }
5
- export interface CodexQaBenchmarkReport {
6
- generatedAt: string;
7
- iterations: number;
8
- summary: CodexQaBenchmarkSummary;
9
- fixtures: CodexQaBenchmarkFixtureResult[];
10
- skippedExternalTools: CodexQaSkippedExternalTool[];
11
- }
12
- export interface CodexQaBenchmarkSummary {
13
- fixtures: number;
14
- modeResults: number;
15
- improved: CodexQaModeSummary;
16
- nativeBaseline: CodexQaModeSummary;
17
- sandboxFailureFixed: boolean;
18
- generatedFalsePositiveCount: number;
19
- }
20
- export interface CodexQaModeSummary {
21
- passed: number;
22
- failed: number;
23
- skipped: number;
24
- answerCorrect: number;
25
- citationCorrect: number;
26
- evidenceCorrect: number;
27
- generatedFalsePositiveCount: number;
28
- totalRawBytes: number;
29
- totalContextBytes: number;
30
- totalRawTokensApprox: number;
31
- totalContextTokensApprox: number;
32
- weightedByteReductionPercent: number;
33
- weightedTokenReductionPercent: number;
34
- }
35
- export interface CodexQaBenchmarkFixtureResult {
36
- id: string;
37
- title: string;
38
- question: string;
39
- expected: CodexQaExpected;
40
- results: CodexQaModeResult[];
41
- }
42
- export interface CodexQaExpected {
43
- path: string;
44
- requiredEvidence: string[];
45
- requiredAnswer: string[];
46
- sourceCitationStatus: "skipped-unavailable" | "checked";
47
- }
48
- export interface CodexQaModeResult {
49
- mode: CodexQaBenchmarkMode;
50
- toolPathUsed: string;
51
- skipped: boolean;
52
- skipReason?: string;
53
- proxyCalls: number;
54
- rawBytes: number;
55
- rawTokensApprox: number;
56
- contextBytes: number;
57
- contextTokensApprox: number;
58
- byteReductionPercent: number;
59
- tokenReductionPercent: number;
60
- latencyMs: {
61
- p50: number;
62
- p95: number;
63
- };
64
- actualPath?: string;
65
- actualLines?: string;
66
- answer: string;
67
- evidenceExcerpt: string;
68
- correctness: CodexQaCorrectness;
69
- notes: string[];
70
- }
71
- export interface CodexQaCorrectness {
72
- passed: boolean;
73
- answerCorrect: boolean;
74
- citationCorrect: boolean;
75
- evidenceCorrect: boolean;
76
- generatedFalsePositive: boolean;
77
- }
78
- export interface CodexQaSkippedExternalTool {
79
- name: string;
80
- reason: string;
81
- }
82
- type CodexQaBenchmarkMode = "native-broad-search-proxy" | "improved-freeflow-router";
83
- export declare function runCodexQaBenchmarks(options?: RunCodexQaBenchmarksOptions): Promise<CodexQaBenchmarkReport>;
84
- export declare function writeCodexQaBenchmarkReports(report: CodexQaBenchmarkReport, markdownReportPath: string, options?: {
85
- jsonReportPath?: string | false | undefined;
86
- }): Promise<{
87
- markdown: string;
88
- json?: string;
89
- }>;
90
- export declare function renderCodexQaBenchmarkReport(report: CodexQaBenchmarkReport): string;
91
- export {};