@hassangameryt/freeflow 0.3.0 → 0.5.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 (692) hide show
  1. package/.claude-plugin/marketplace.json +4 -4
  2. package/.claude-plugin/plugin.json +6 -2
  3. package/.codex-plugin/plugin.json +9 -9
  4. package/README.md +190 -127
  5. package/assets/feedback-loop.png +0 -0
  6. package/assets/freeflow_workflow_map.png +0 -0
  7. package/assets/workflow.png +0 -0
  8. package/{skills → capabilities}/output-router/SKILL.md +21 -17
  9. package/{skills → capabilities}/output-router/references/safety-policy.md +1 -1
  10. package/capabilities/output-router/references/setup.md +110 -0
  11. package/command-surface.json +62 -7
  12. package/hooks/freeflow-runtime-context.mjs +572 -154
  13. package/hooks/hooks.json +26 -1
  14. package/hooks/tests/check-runtime-context-hook.sh +375 -0
  15. package/package.json +24 -24
  16. package/pi-extension/dist/index.js +264 -80
  17. package/pi-extension/dist/integrations/mcp-config.js +29 -0
  18. package/pi-extension/dist/output-router/host-producer-identification.js +232 -0
  19. package/pi-extension/dist/output-router/native-safety-net.js +216 -0
  20. package/pi-extension/dist/output-router/observed-tool-routing.js +122 -0
  21. package/pi-extension/dist/output-router/renderers.js +1023 -0
  22. package/pi-extension/dist/output-router/router-tools.js +554 -0
  23. package/pi-extension/dist/output-router/schemas.js +383 -0
  24. package/pi-extension/dist/output-router/status.js +744 -0
  25. package/pi-extension/dist/output-router/utils.js +502 -0
  26. package/pi-extension/dist/runtime/runtime-context.js +798 -0
  27. package/pi-extension/dist/settings/settings-tui.js +314 -0
  28. package/pi-extension/dist/settings/settings-ui.js +1487 -0
  29. package/pi-extension/freeflow/index.js +1 -0
  30. package/pi-extension/src/index.ts +230 -56
  31. package/pi-extension/src/{host-producer-identification.ts → output-router/host-producer-identification.ts} +37 -7
  32. package/pi-extension/src/{native-safety-net.ts → output-router/native-safety-net.ts} +8 -12
  33. package/pi-extension/src/{observed-tool-routing.ts → output-router/observed-tool-routing.ts} +19 -11
  34. package/pi-extension/src/{renderers.ts → output-router/renderers.ts} +246 -55
  35. package/pi-extension/src/{router-tools.ts → output-router/router-tools.ts} +130 -29
  36. package/pi-extension/src/{schemas.ts → output-router/schemas.ts} +171 -43
  37. package/pi-extension/src/output-router/status.ts +791 -0
  38. package/pi-extension/src/{utils.ts → output-router/utils.ts} +80 -18
  39. package/pi-extension/src/runtime/runtime-context.ts +895 -0
  40. package/pi-extension/src/settings/settings-tui.ts +408 -0
  41. package/pi-extension/src/settings/settings-ui.ts +1730 -0
  42. package/pi-extension/tests/integration/pi-extension.test.js +4020 -0
  43. package/pi-extension/tests/output-router/observed-producers.test.js +132 -0
  44. package/pi-extension/tests/output-router/search.test.js +722 -0
  45. package/pi-extension/tests/settings/settings-tui.test.js +243 -0
  46. package/router/dist/benchmarks/benchmark-harness.d.ts +16 -13
  47. package/router/dist/benchmarks/benchmark-harness.js +62 -62
  48. package/router/dist/benchmarks/benchmarks.d.ts +80 -73
  49. package/router/dist/benchmarks/benchmarks.js +860 -761
  50. package/router/dist/benchmarks/codex-qa-benchmarks.d.ts +71 -67
  51. package/router/dist/benchmarks/codex-qa-benchmarks.js +429 -390
  52. package/router/dist/benchmarks/command-benchmarks.d.ts +107 -92
  53. package/router/dist/benchmarks/command-benchmarks.js +616 -571
  54. package/router/dist/benchmarks/context-mode-normalized-benchmarks.d.ts +64 -56
  55. package/router/dist/benchmarks/context-mode-normalized-benchmarks.js +679 -613
  56. package/router/dist/benchmarks/context-mode-real-deep-benchmark.d.ts +103 -95
  57. package/router/dist/benchmarks/context-mode-real-deep-benchmark.js +1188 -1103
  58. package/router/dist/benchmarks/context-saving-baseline.d.ts +47 -41
  59. package/router/dist/benchmarks/context-saving-baseline.js +405 -374
  60. package/router/dist/benchmarks/index-benchmarks.d.ts +74 -69
  61. package/router/dist/benchmarks/index-benchmarks.js +761 -661
  62. package/router/dist/benchmarks/storage-policy-benchmarks.d.ts +80 -69
  63. package/router/dist/benchmarks/storage-policy-benchmarks.js +549 -469
  64. package/router/dist/benchmarks/vault-index-benchmarks.d.ts +43 -34
  65. package/router/dist/benchmarks/vault-index-benchmarks.js +294 -229
  66. package/router/dist/config/config.d.ts +62 -55
  67. package/router/dist/config/config.js +552 -373
  68. package/router/dist/config/router-contract.d.ts +2 -2
  69. package/router/dist/config/router-contract.js +38 -38
  70. package/router/dist/config/schema.d.ts +19 -10
  71. package/router/dist/config/schema.js +586 -538
  72. package/router/dist/config/types.d.ts +413 -361
  73. package/router/dist/config/types.js +19 -8
  74. package/router/dist/evidence/bounded-evidence.d.ts +26 -26
  75. package/router/dist/evidence/bounded-evidence.js +265 -252
  76. package/router/dist/evidence/evidence-range-selector.d.ts +16 -14
  77. package/router/dist/evidence/evidence-range-selector.js +192 -191
  78. package/router/dist/evidence/evidence-search.d.ts +18 -16
  79. package/router/dist/evidence/evidence-search.js +401 -377
  80. package/router/dist/evidence/evidence.d.ts +17 -17
  81. package/router/dist/evidence/evidence.js +163 -159
  82. package/router/dist/evidence/failure-contracts.d.ts +25 -15
  83. package/router/dist/evidence/failure-contracts.js +132 -126
  84. package/router/dist/evidence/line-ranges.d.ts +17 -15
  85. package/router/dist/evidence/line-ranges.js +18 -18
  86. package/router/dist/experiments/local-index.d.ts +47 -41
  87. package/router/dist/experiments/local-index.js +477 -458
  88. package/router/dist/local/local-traversal.d.ts +18 -0
  89. package/router/dist/local/local-traversal.js +334 -0
  90. package/router/dist/processing/engine.d.ts +94 -70
  91. package/router/dist/processing/engine.js +462 -364
  92. package/router/dist/processing/reducers.d.ts +208 -194
  93. package/router/dist/processing/reducers.js +1434 -1256
  94. package/router/dist/processing/renderers.d.ts +24 -18
  95. package/router/dist/processing/renderers.js +161 -152
  96. package/router/dist/processing/scripts.d.ts +80 -67
  97. package/router/dist/processing/scripts.js +343 -290
  98. package/router/dist/repo/repo-traversal.d.ts +9 -9
  99. package/router/dist/repo/repo-traversal.js +205 -202
  100. package/router/dist/routing/observed-reducers.d.ts +25 -19
  101. package/router/dist/routing/observed-reducers.js +559 -545
  102. package/router/dist/routing/observed-routing.d.ts +23 -14
  103. package/router/dist/routing/observed-routing.js +319 -318
  104. package/router/dist/routing/parsers.d.ts +10 -10
  105. package/router/dist/routing/parsers.js +454 -406
  106. package/router/dist/routing/run-filters.d.ts +45 -41
  107. package/router/dist/routing/run-filters.js +215 -207
  108. package/router/dist/routing/run-reducers.d.ts +45 -26
  109. package/router/dist/routing/run-reducers.js +102 -90
  110. package/router/dist/sandbox/adapter-roots.d.ts +34 -26
  111. package/router/dist/sandbox/adapter-roots.js +43 -41
  112. package/router/dist/sandbox/eryx-python-adapter.d.ts +9 -5
  113. package/router/dist/sandbox/eryx-python-adapter.js +659 -588
  114. package/router/dist/sandbox/jq-wasm-adapter.d.ts +3 -3
  115. package/router/dist/sandbox/jq-wasm-adapter.js +319 -311
  116. package/router/dist/sandbox/quickjs-wasi-adapter.d.ts +9 -5
  117. package/router/dist/sandbox/quickjs-wasi-adapter.js +336 -333
  118. package/router/dist/sandbox/script-sandbox.d.ts +105 -84
  119. package/router/dist/sandbox/script-sandbox.js +294 -260
  120. package/router/dist/setup/script-transform-adapters.d.ts +23 -19
  121. package/router/dist/setup/script-transform-adapters.js +223 -204
  122. package/router/dist/tools/batch.d.ts +27 -16
  123. package/router/dist/tools/batch.js +493 -416
  124. package/router/dist/tools/run.d.ts +47 -35
  125. package/router/dist/tools/run.js +1172 -1087
  126. package/router/dist/tools/search.d.ts +53 -31
  127. package/router/dist/tools/search.js +1224 -1065
  128. package/router/dist/transform/engine.d.ts +121 -96
  129. package/router/dist/transform/engine.js +1853 -1736
  130. package/router/dist/vault/vault-index.d.ts +97 -78
  131. package/router/dist/vault/vault-index.js +347 -342
  132. package/router/dist/vault/vault.d.ts +109 -74
  133. package/router/dist/vault/vault.js +528 -533
  134. package/runtime/interaction-contract.md +16 -0
  135. package/skills/bypass/SKILL.md +52 -38
  136. package/skills/commit-work/SKILL.md +54 -46
  137. package/skills/commit-work/references/staging-decisions.md +46 -24
  138. package/skills/decision-gate/SKILL.md +48 -0
  139. package/skills/design-for-depth/SKILL.md +75 -59
  140. package/skills/design-for-depth/references/design-pressure-signals.md +56 -7
  141. package/skills/design-for-depth/references/interface-design-loop.md +156 -0
  142. package/skills/design-for-depth/references/software-design-philosophy.md +32 -3
  143. package/skills/diagnose-failure/SKILL.md +65 -60
  144. package/skills/diagnose-failure/references/diagnostic-loop-catalog.md +36 -0
  145. package/skills/diagnose-failure/references/flaky-and-performance.md +30 -18
  146. package/skills/discuss/SKILL.md +121 -0
  147. package/skills/discuss/references/checkpoints.md +66 -0
  148. package/skills/evaluate-skill/SKILL.md +62 -53
  149. package/skills/evaluate-skill/references/definition-schema.md +345 -0
  150. package/skills/evaluate-skill/references/evaluation-design.md +86 -0
  151. package/skills/evaluate-skill/references/execution-and-evidence.md +85 -0
  152. package/skills/evaluate-skill/references/review-and-revision.md +51 -0
  153. package/skills/evaluate-skill/scripts/lib/definitions.mjs +296 -0
  154. package/skills/evaluate-skill/scripts/lib/evidence.mjs +46 -0
  155. package/skills/evaluate-skill/scripts/lib/grade-comparison.mjs +60 -0
  156. package/skills/evaluate-skill/scripts/lib/grade-interaction.mjs +148 -0
  157. package/skills/evaluate-skill/scripts/lib/grade-support.mjs +126 -0
  158. package/skills/evaluate-skill/scripts/lib/grade-workspace.mjs +192 -0
  159. package/skills/evaluate-skill/scripts/lib/grade.mjs +56 -0
  160. package/skills/evaluate-skill/scripts/lib/pi.mjs +489 -0
  161. package/skills/evaluate-skill/scripts/lib/process.mjs +79 -0
  162. package/skills/evaluate-skill/scripts/lib/rpc.mjs +444 -0
  163. package/skills/evaluate-skill/scripts/lib/runner.mjs +346 -0
  164. package/skills/evaluate-skill/scripts/lib/sandbox.mjs +409 -0
  165. package/skills/evaluate-skill/scripts/lib/view.mjs +337 -0
  166. package/skills/evaluate-skill/scripts/pi-guard.mjs +164 -0
  167. package/skills/evaluate-skill/scripts/skill-eval.mjs +101 -0
  168. package/skills/execute-work/SKILL.md +99 -0
  169. package/skills/execute-work/references/code-practices.md +78 -0
  170. package/skills/execute-work/references/execution-loop.md +77 -0
  171. package/skills/finish-branch/SKILL.md +117 -0
  172. package/skills/finish-branch/references/integration-options.md +80 -0
  173. package/skills/handoff/SKILL.md +65 -39
  174. package/skills/handoff/references/templates.md +104 -27
  175. package/skills/launch-work/SKILL.md +116 -0
  176. package/skills/launch-work/references/launch-readiness.md +85 -0
  177. package/skills/migration-work/SKILL.md +115 -0
  178. package/skills/migration-work/references/migration-lifecycle.md +82 -0
  179. package/skills/mode-contract/SKILL.md +72 -52
  180. package/skills/release-work/SKILL.md +118 -0
  181. package/skills/release-work/references/release-evidence.md +78 -0
  182. package/skills/review-artifact/SKILL.md +77 -69
  183. package/skills/review-artifact/references/reviewer-prompt.md +133 -42
  184. package/skills/review-work/SKILL.md +82 -57
  185. package/skills/review-work/references/reviewer-prompt.md +97 -60
  186. package/skills/review-work/references/security-risk-lens.md +67 -0
  187. package/skills/setup-freeflow/SKILL.md +54 -68
  188. package/skills/setup-freeflow/references/activation-contract.md +84 -69
  189. package/skills/setup-freeflow/references/host-setup.md +50 -17
  190. package/skills/simplify-code/SKILL.md +80 -0
  191. package/skills/simplify-code/references/simplification-patterns.md +70 -0
  192. package/skills/tdd/SKILL.md +96 -0
  193. package/skills/tdd/references/test-design.md +96 -0
  194. package/skills/track-work/SKILL.md +84 -0
  195. package/skills/track-work/references/working-record-schema.md +378 -0
  196. package/skills/verify-work/SKILL.md +59 -38
  197. package/skills/verify-work/references/browser-runtime-evidence.md +55 -0
  198. package/skills/verify-work/references/integration-evidence.md +51 -0
  199. package/skills/verify-work/references/performance-evidence.md +57 -0
  200. package/skills/workflow/SKILL.md +53 -59
  201. package/skills/workflow/references/domain-skill-composition.md +57 -0
  202. package/skills/workflow/references/workflow-loop.md +92 -0
  203. package/skills/write-plan/SKILL.md +85 -58
  204. package/skills/write-plan/references/plan-shapes.md +132 -46
  205. package/skills/write-skill/SKILL.md +82 -51
  206. package/skills/write-skill/references/activation-boundaries.md +62 -0
  207. package/skills/write-skill/references/agent-first-instructions.md +87 -0
  208. package/skills/write-skill/references/progressive-disclosure.md +63 -0
  209. package/skills/write-skill/scripts/lib/skill-author.mjs +653 -0
  210. package/skills/write-skill/scripts/skill-author.mjs +104 -0
  211. package/skills/write-spec/SKILL.md +65 -54
  212. package/skills/write-spec/references/artifact-standards.md +60 -41
  213. package/skills/write-spec/references/decision-records.md +77 -0
  214. package/skills/write-spec/references/spec-shapes.md +119 -60
  215. package/evals/README.md +0 -32
  216. package/evals/fixtures/copy-conventions.md +0 -31
  217. package/evals/fixtures/output-router/README.md +0 -12
  218. package/evals/fixtures/output-router/failed-command-output.txt +0 -9
  219. package/evals/fixtures/output-router/large-router-manual.md +0 -63
  220. package/evals/fixtures/output-router/native-large-output.txt +0 -40
  221. package/evals/fixtures/output-router/noisy-test-output.txt +0 -30
  222. package/evals/fixtures/output-router/verification-output.txt +0 -8
  223. package/evals/fixtures/tiny-artifact-review-app/README.md +0 -5
  224. package/evals/fixtures/tiny-artifact-review-app/docs/billing-policy.md +0 -10
  225. package/evals/fixtures/tiny-artifact-review-app/docs/specs/billing-webhook-api-draft.md +0 -21
  226. package/evals/fixtures/tiny-artifact-review-app/docs/specs/failed-payment-grace-period.md +0 -24
  227. package/evals/fixtures/tiny-artifact-review-app/docs/specs/immediate-downgrade.md +0 -17
  228. package/evals/fixtures/tiny-artifact-review-app/tests/billing.test.md +0 -8
  229. package/evals/fixtures/tiny-commit-ambiguous-app/.freeflow-eval-setup.sh +0 -15
  230. package/evals/fixtures/tiny-commit-ambiguous-app/README.md +0 -3
  231. package/evals/fixtures/tiny-commit-ambiguous-app/src/billing.ts +0 -5
  232. package/evals/fixtures/tiny-commit-ambiguous-app/src/settings-page.ts +0 -1
  233. package/evals/fixtures/tiny-commit-ambiguous-app/tests/settings.test.md +0 -5
  234. package/evals/fixtures/tiny-commit-app/.freeflow-eval-setup.sh +0 -14
  235. package/evals/fixtures/tiny-commit-app/README.md +0 -3
  236. package/evals/fixtures/tiny-commit-app/docs/specs/settings-title.md +0 -5
  237. package/evals/fixtures/tiny-commit-app/src/billing.ts +0 -5
  238. package/evals/fixtures/tiny-commit-app/src/settings-page.ts +0 -1
  239. package/evals/fixtures/tiny-commit-app/tests/settings.test.md +0 -5
  240. package/evals/fixtures/tiny-commit-everything-app/.freeflow-eval-setup.sh +0 -15
  241. package/evals/fixtures/tiny-commit-everything-app/README.md +0 -3
  242. package/evals/fixtures/tiny-commit-everything-app/docs/specs/settings-title.md +0 -5
  243. package/evals/fixtures/tiny-commit-everything-app/src/billing.ts +0 -5
  244. package/evals/fixtures/tiny-commit-everything-app/src/settings-page.ts +0 -1
  245. package/evals/fixtures/tiny-commit-everything-app/tests/settings.test.md +0 -5
  246. package/evals/fixtures/tiny-commit-staged-app/.freeflow-eval-setup.sh +0 -15
  247. package/evals/fixtures/tiny-commit-staged-app/README.md +0 -3
  248. package/evals/fixtures/tiny-commit-staged-app/docs/specs/settings-title.md +0 -5
  249. package/evals/fixtures/tiny-commit-staged-app/src/billing.ts +0 -5
  250. package/evals/fixtures/tiny-commit-staged-app/src/settings-page.ts +0 -1
  251. package/evals/fixtures/tiny-commit-staged-app/tests/settings.test.md +0 -5
  252. package/evals/fixtures/tiny-commit-staged-mixed-app/.freeflow-eval-setup.sh +0 -15
  253. package/evals/fixtures/tiny-commit-staged-mixed-app/README.md +0 -3
  254. package/evals/fixtures/tiny-commit-staged-mixed-app/docs/billing-policy.md +0 -3
  255. package/evals/fixtures/tiny-commit-staged-mixed-app/docs/release-notes.md +0 -3
  256. package/evals/fixtures/tiny-commit-staged-mixed-app/src/billing.ts +0 -5
  257. package/evals/fixtures/tiny-dashboard-stale-app/README.md +0 -11
  258. package/evals/fixtures/tiny-dashboard-stale-app/src/api-client.ts +0 -13
  259. package/evals/fixtures/tiny-dashboard-stale-app/src/dashboard-data.ts +0 -19
  260. package/evals/fixtures/tiny-dashboard-stale-app/tests/dashboard-data.test.md +0 -9
  261. package/evals/fixtures/tiny-decision-destination-app/README.md +0 -6
  262. package/evals/fixtures/tiny-decision-destination-app/src/risk.ts +0 -8
  263. package/evals/fixtures/tiny-decision-destination-app/tests/risk.test.md +0 -4
  264. package/evals/fixtures/tiny-design-depth-app/README.md +0 -15
  265. package/evals/fixtures/tiny-design-depth-app/src/routes.ts +0 -25
  266. package/evals/fixtures/tiny-design-depth-app/src/sendEmail.ts +0 -3
  267. package/evals/fixtures/tiny-design-depth-app/src/sendSms.ts +0 -3
  268. package/evals/fixtures/tiny-design-depth-app/src/telemetry.ts +0 -3
  269. package/evals/fixtures/tiny-design-depth-app/tests/routes.test.md +0 -12
  270. package/evals/fixtures/tiny-eval-method-app/README.md +0 -8
  271. package/evals/fixtures/tiny-eval-method-app/evals/reports/review-pr-eval-result.md +0 -5
  272. package/evals/fixtures/tiny-eval-method-app/evals/reports/triage-question-failure.md +0 -17
  273. package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.diff +0 -11
  274. package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.md +0 -3
  275. package/evals/fixtures/tiny-eval-method-app/skills/review-pr/SKILL.md +0 -10
  276. package/evals/fixtures/tiny-eval-method-app/skills/triage-question/SKILL.md +0 -10
  277. package/evals/fixtures/tiny-execute-plan-app/README.md +0 -5
  278. package/evals/fixtures/tiny-execute-plan-app/checks/settings-and-billing-check.sh +0 -5
  279. package/evals/fixtures/tiny-execute-plan-app/docs/billing-policy.md +0 -10
  280. package/evals/fixtures/tiny-execute-plan-app/docs/plans/immediate-downgrade-plan.md +0 -11
  281. package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-plan.md +0 -12
  282. package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-with-bad-check.md +0 -15
  283. package/evals/fixtures/tiny-execute-plan-app/docs/plans/unverified-billing-plan.md +0 -9
  284. package/evals/fixtures/tiny-execute-plan-app/docs/specs/failed-payment-grace-period.md +0 -9
  285. package/evals/fixtures/tiny-execute-plan-app/docs/specs/settings-title.md +0 -9
  286. package/evals/fixtures/tiny-execute-plan-app/src/billing.ts +0 -7
  287. package/evals/fixtures/tiny-execute-plan-app/src/settings-page.ts +0 -1
  288. package/evals/fixtures/tiny-execute-plan-app/tests/billing.test.md +0 -7
  289. package/evals/fixtures/tiny-execute-plan-app/tests/settings.test.md +0 -5
  290. package/evals/fixtures/tiny-execute-review-loop-app/README.md +0 -5
  291. package/evals/fixtures/tiny-execute-review-loop-app/docs/billing-policy.md +0 -9
  292. package/evals/fixtures/tiny-execute-review-loop-app/docs/plans/settings-title-plan.md +0 -12
  293. package/evals/fixtures/tiny-execute-review-loop-app/docs/review/previous-agent-summary.md +0 -15
  294. package/evals/fixtures/tiny-execute-review-loop-app/docs/review/review-pass-1-non-pass.md +0 -11
  295. package/evals/fixtures/tiny-execute-review-loop-app/docs/specs/settings-title.md +0 -9
  296. package/evals/fixtures/tiny-execute-review-loop-app/src/billing.ts +0 -7
  297. package/evals/fixtures/tiny-execute-review-loop-app/src/settings-page.ts +0 -1
  298. package/evals/fixtures/tiny-execute-review-loop-app/tests/billing.test.md +0 -7
  299. package/evals/fixtures/tiny-execute-review-loop-app/tests/settings.test.md +0 -5
  300. package/evals/fixtures/tiny-flaky-session-app/README.md +0 -10
  301. package/evals/fixtures/tiny-flaky-session-app/src/session-timeout.ts +0 -13
  302. package/evals/fixtures/tiny-flaky-session-app/tests/session-timeout.test.md +0 -8
  303. package/evals/fixtures/tiny-handoff-app/README.md +0 -5
  304. package/evals/fixtures/tiny-handoff-app/docs/billing-policy.md +0 -10
  305. package/evals/fixtures/tiny-handoff-app/docs/handoffs/old-agent-handoff.md +0 -8
  306. package/evals/fixtures/tiny-handoff-app/docs/plans/billing-retry-plan.md +0 -11
  307. package/evals/fixtures/tiny-handoff-app/src/billing.ts +0 -7
  308. package/evals/fixtures/tiny-handoff-report-app/README.md +0 -3
  309. package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.diff +0 -1
  310. package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.md +0 -1
  311. package/evals/fixtures/tiny-handoff-report-app/evals/scores/hof-003-score.txt +0 -4
  312. package/evals/fixtures/tiny-plan-app/README.md +0 -5
  313. package/evals/fixtures/tiny-plan-app/docs/billing-policy.md +0 -10
  314. package/evals/fixtures/tiny-plan-app/docs/specs/failed-payment-grace-period.md +0 -25
  315. package/evals/fixtures/tiny-plan-app/src/billing.ts +0 -17
  316. package/evals/fixtures/tiny-plan-app/src/settings-page.ts +0 -1
  317. package/evals/fixtures/tiny-plan-app/tests/billing.test.md +0 -8
  318. package/evals/fixtures/tiny-plan-app/tests/settings.test.md +0 -5
  319. package/evals/fixtures/tiny-plan-strict-api-app/README.md +0 -3
  320. package/evals/fixtures/tiny-plan-strict-api-app/docs/billing-policy.md +0 -5
  321. package/evals/fixtures/tiny-plan-strict-api-app/docs/specs/billing-webhook-api.md +0 -25
  322. package/evals/fixtures/tiny-plan-strict-api-app/src/billing.ts +0 -5
  323. package/evals/fixtures/tiny-plan-strict-api-app/src/webhooks.ts +0 -3
  324. package/evals/fixtures/tiny-plan-strict-api-app/tests/billing-webhook.test.md +0 -8
  325. package/evals/fixtures/tiny-post-setup-invalid-config-app/.freeflow/config.json +0 -3
  326. package/evals/fixtures/tiny-post-setup-invalid-config-app/AGENTS.md +0 -15
  327. package/evals/fixtures/tiny-post-setup-invalid-config-app/README.md +0 -16
  328. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/auth-review.md +0 -15
  329. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/billing-policy.md +0 -10
  330. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/copy-conventions.md +0 -15
  331. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/auth-middleware.ts +0 -12
  332. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/billing.ts +0 -20
  333. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/login-copy.ts +0 -1
  334. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/settings-page.ts +0 -1
  335. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/auth-middleware.test.md +0 -8
  336. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/billing.test.md +0 -8
  337. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/copy.test.md +0 -7
  338. package/evals/fixtures/tiny-post-setup-missing-config-app/AGENTS.md +0 -15
  339. package/evals/fixtures/tiny-post-setup-missing-config-app/README.md +0 -16
  340. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/auth-review.md +0 -15
  341. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/billing-policy.md +0 -10
  342. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/copy-conventions.md +0 -15
  343. package/evals/fixtures/tiny-post-setup-missing-config-app/src/auth-middleware.ts +0 -12
  344. package/evals/fixtures/tiny-post-setup-missing-config-app/src/billing.ts +0 -20
  345. package/evals/fixtures/tiny-post-setup-missing-config-app/src/login-copy.ts +0 -1
  346. package/evals/fixtures/tiny-post-setup-missing-config-app/src/settings-page.ts +0 -1
  347. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/auth-middleware.test.md +0 -8
  348. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/billing.test.md +0 -8
  349. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/copy.test.md +0 -7
  350. package/evals/fixtures/tiny-post-setup-source-conflict-app/.freeflow/config.json +0 -3
  351. package/evals/fixtures/tiny-post-setup-source-conflict-app/AGENTS.md +0 -15
  352. package/evals/fixtures/tiny-post-setup-source-conflict-app/README.md +0 -16
  353. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/auth-review.md +0 -15
  354. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/billing-policy.md +0 -10
  355. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/copy-conventions.md +0 -15
  356. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/auth-middleware.ts +0 -12
  357. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/billing.ts +0 -20
  358. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/login-copy.ts +0 -1
  359. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/settings-page.ts +0 -1
  360. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/auth-middleware.test.md +0 -8
  361. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/billing.test.md +0 -8
  362. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/copy.test.md +0 -7
  363. package/evals/fixtures/tiny-report-performance-app/README.md +0 -11
  364. package/evals/fixtures/tiny-report-performance-app/docs/performance.md +0 -10
  365. package/evals/fixtures/tiny-report-performance-app/src/report-summary.ts +0 -29
  366. package/evals/fixtures/tiny-report-performance-app/tests/report-performance.test.md +0 -8
  367. package/evals/fixtures/tiny-review-request-app/README.md +0 -3
  368. package/evals/fixtures/tiny-review-request-app/docs/billing-policy.md +0 -5
  369. package/evals/fixtures/tiny-review-request-app/docs/plans/billing-webhook-api.md +0 -19
  370. package/evals/fixtures/tiny-review-request-app/docs/review/previous-agent-summary.md +0 -20
  371. package/evals/fixtures/tiny-review-request-app/docs/specs/billing-webhook-api.md +0 -25
  372. package/evals/fixtures/tiny-review-request-app/src/billing.ts +0 -11
  373. package/evals/fixtures/tiny-review-request-app/src/webhooks.ts +0 -19
  374. package/evals/fixtures/tiny-review-request-app/tests/billing-webhook.test.md +0 -8
  375. package/evals/fixtures/tiny-review-work-app/README.md +0 -5
  376. package/evals/fixtures/tiny-review-work-app/docs/billing-policy.md +0 -9
  377. package/evals/fixtures/tiny-review-work-app/docs/plans/settings-title-plan.md +0 -12
  378. package/evals/fixtures/tiny-review-work-app/docs/review/previous-agent-summary.md +0 -15
  379. package/evals/fixtures/tiny-review-work-app/docs/specs/settings-title.md +0 -9
  380. package/evals/fixtures/tiny-review-work-app/src/billing.ts +0 -7
  381. package/evals/fixtures/tiny-review-work-app/src/settings-page.ts +0 -1
  382. package/evals/fixtures/tiny-review-work-app/tests/billing.test.md +0 -7
  383. package/evals/fixtures/tiny-review-work-app/tests/settings.test.md +0 -5
  384. package/evals/fixtures/tiny-saas-app/README.md +0 -16
  385. package/evals/fixtures/tiny-saas-app/docs/auth-review.md +0 -15
  386. package/evals/fixtures/tiny-saas-app/docs/billing-policy.md +0 -10
  387. package/evals/fixtures/tiny-saas-app/docs/copy-conventions.md +0 -15
  388. package/evals/fixtures/tiny-saas-app/docs/specs/settings-title.md +0 -13
  389. package/evals/fixtures/tiny-saas-app/src/auth-middleware.ts +0 -12
  390. package/evals/fixtures/tiny-saas-app/src/billing.ts +0 -20
  391. package/evals/fixtures/tiny-saas-app/src/login-copy.ts +0 -1
  392. package/evals/fixtures/tiny-saas-app/src/settings-page.ts +0 -1
  393. package/evals/fixtures/tiny-saas-app/tests/auth-middleware.test.md +0 -8
  394. package/evals/fixtures/tiny-saas-app/tests/billing.test.md +0 -8
  395. package/evals/fixtures/tiny-saas-app/tests/copy.test.md +0 -7
  396. package/evals/fixtures/tiny-setup-agents-app/AGENTS.md +0 -6
  397. package/evals/fixtures/tiny-setup-both-app/AGENTS.md +0 -5
  398. package/evals/fixtures/tiny-setup-both-app/CLAUDE.md +0 -5
  399. package/evals/fixtures/tiny-setup-claude-app/CLAUDE.md +0 -6
  400. package/evals/fixtures/tiny-setup-codex-rules-app/.codex/rules/shell.rules +0 -5
  401. package/evals/fixtures/tiny-setup-codex-rules-app/AGENTS.md +0 -6
  402. package/evals/fixtures/tiny-setup-conflict-app/AGENTS.md +0 -6
  403. package/evals/fixtures/tiny-setup-existing-block-app/AGENTS.md +0 -14
  404. package/evals/fixtures/tiny-setup-four-rules-app/CLAUDE.md +0 -6
  405. package/evals/fixtures/tiny-skill-dev-app/README.md +0 -10
  406. package/evals/fixtures/tiny-skill-dev-app/evals/prompts/review-pr-001.txt +0 -8
  407. package/evals/fixtures/tiny-skill-dev-app/evals/reports/review-pr-failure.md +0 -17
  408. package/evals/fixtures/tiny-skill-dev-app/skills/review-pr/SKILL.md +0 -13
  409. package/evals/fixtures/tiny-team-app/README.md +0 -5
  410. package/evals/fixtures/tiny-team-app/docs/product.md +0 -6
  411. package/evals/fixtures/tiny-team-app/src/teams.ts +0 -9
  412. package/evals/fixtures/tiny-team-app/src/users.ts +0 -5
  413. package/evals/fixtures/tiny-team-app/tests/teams.test.md +0 -7
  414. package/evals/fixtures/tiny-verify-app/README.md +0 -5
  415. package/evals/fixtures/tiny-verify-app/src/settings-nav.ts +0 -1
  416. package/evals/fixtures/tiny-verify-app/src/settings-page.ts +0 -1
  417. package/evals/fixtures/tiny-verify-app/tests/settings.test.md +0 -7
  418. package/evals/prompts/aon-001.txt +0 -2
  419. package/evals/prompts/byp-001.txt +0 -2
  420. package/evals/prompts/byp-002.txt +0 -2
  421. package/evals/prompts/cap-001.txt +0 -3
  422. package/evals/prompts/cap-002.txt +0 -3
  423. package/evals/prompts/cmd-001.txt +0 -3
  424. package/evals/prompts/cmd-002.txt +0 -3
  425. package/evals/prompts/cmd-003.txt +0 -6
  426. package/evals/prompts/cmd-004.txt +0 -5
  427. package/evals/prompts/cmd-005.txt +0 -5
  428. package/evals/prompts/cmd-006.txt +0 -5
  429. package/evals/prompts/cmd-007.txt +0 -5
  430. package/evals/prompts/cmd-008.txt +0 -5
  431. package/evals/prompts/cmd-009.txt +0 -8
  432. package/evals/prompts/cmd-010.txt +0 -5
  433. package/evals/prompts/cmd-011.txt +0 -5
  434. package/evals/prompts/cmd-012.txt +0 -5
  435. package/evals/prompts/cmd-013.txt +0 -5
  436. package/evals/prompts/cmd-014.txt +0 -7
  437. package/evals/prompts/cmd-015.txt +0 -7
  438. package/evals/prompts/cmd-016.txt +0 -5
  439. package/evals/prompts/cmt-001.txt +0 -1
  440. package/evals/prompts/cmt-002.txt +0 -1
  441. package/evals/prompts/cmt-003.txt +0 -1
  442. package/evals/prompts/cmt-004.txt +0 -1
  443. package/evals/prompts/cmt-005.txt +0 -1
  444. package/evals/prompts/dfd-001.txt +0 -3
  445. package/evals/prompts/dia-001.txt +0 -3
  446. package/evals/prompts/dia-002.txt +0 -3
  447. package/evals/prompts/dia-003.txt +0 -3
  448. package/evals/prompts/dis-001.txt +0 -5
  449. package/evals/prompts/dis-002.txt +0 -5
  450. package/evals/prompts/esk-001.txt +0 -5
  451. package/evals/prompts/esk-002.txt +0 -5
  452. package/evals/prompts/esk-003.txt +0 -5
  453. package/evals/prompts/grc-001.txt +0 -3
  454. package/evals/prompts/hof-001.txt +0 -3
  455. package/evals/prompts/hof-002.txt +0 -1
  456. package/evals/prompts/hof-003.txt +0 -1
  457. package/evals/prompts/hof-004.txt +0 -1
  458. package/evals/prompts/hof-005.txt +0 -1
  459. package/evals/prompts/ivg-001.txt +0 -1
  460. package/evals/prompts/ivg-002.txt +0 -11
  461. package/evals/prompts/ivg-003.txt +0 -1
  462. package/evals/prompts/ivg-004.txt +0 -1
  463. package/evals/prompts/mode-001.txt +0 -3
  464. package/evals/prompts/mode-002.txt +0 -1
  465. package/evals/prompts/mode-003.txt +0 -3
  466. package/evals/prompts/mode-004.txt +0 -3
  467. package/evals/prompts/mode-005.txt +0 -3
  468. package/evals/prompts/mode-006.txt +0 -3
  469. package/evals/prompts/mode-007.txt +0 -3
  470. package/evals/prompts/otr-001.txt +0 -3
  471. package/evals/prompts/otr-002.txt +0 -3
  472. package/evals/prompts/rar-001.txt +0 -5
  473. package/evals/prompts/rar-002.txt +0 -3
  474. package/evals/prompts/rar-003.txt +0 -6
  475. package/evals/prompts/rar-004.txt +0 -15
  476. package/evals/prompts/rar-005.txt +0 -10
  477. package/evals/prompts/rbr-001.txt +0 -3
  478. package/evals/prompts/rbr-002.txt +0 -3
  479. package/evals/prompts/rbr-003.txt +0 -7
  480. package/evals/prompts/rev-001.txt +0 -3
  481. package/evals/prompts/rev-002.txt +0 -5
  482. package/evals/prompts/rev-003.txt +0 -6
  483. package/evals/prompts/rev-004.txt +0 -1
  484. package/evals/prompts/rev-005.txt +0 -15
  485. package/evals/prompts/rev-006.txt +0 -5
  486. package/evals/prompts/stp-001.txt +0 -1
  487. package/evals/prompts/stp-002.txt +0 -1
  488. package/evals/prompts/stp-003.txt +0 -1
  489. package/evals/prompts/stp-004.txt +0 -1
  490. package/evals/prompts/stp-005.txt +0 -1
  491. package/evals/prompts/stp-006.txt +0 -1
  492. package/evals/prompts/stp-007.txt +0 -1
  493. package/evals/prompts/stp-008.txt +0 -1
  494. package/evals/prompts/stp-009.txt +0 -1
  495. package/evals/prompts/stp-010.txt +0 -1
  496. package/evals/prompts/stp-011.txt +0 -1
  497. package/evals/prompts/vfy-003.txt +0 -1
  498. package/evals/prompts/wpl-001.txt +0 -3
  499. package/evals/prompts/wpl-002.txt +0 -5
  500. package/evals/prompts/wpl-003.txt +0 -3
  501. package/evals/prompts/wpl-004.txt +0 -5
  502. package/evals/prompts/wpl-005.txt +0 -1
  503. package/evals/prompts/wrc-001.txt +0 -10
  504. package/evals/prompts/wrc-002.txt +0 -3
  505. package/evals/prompts/wsk-001.txt +0 -6
  506. package/evals/prompts/wsp-001.txt +0 -5
  507. package/evals/prompts/wsp-002.txt +0 -15
  508. package/evals/prompts/wsp-003.txt +0 -3
  509. package/evals/prompts/wsp-004.txt +0 -15
  510. package/evals/prompts/wsp-005.txt +0 -5
  511. package/evals/prompts/wsp-006.txt +0 -12
  512. package/evals/prompts/wsp-007.txt +0 -9
  513. package/evals/prompts/wsp-008.txt +0 -13
  514. package/evals/prompts/xpl-001.txt +0 -1
  515. package/evals/prompts/xpl-002.txt +0 -3
  516. package/evals/prompts/xpl-003.txt +0 -3
  517. package/evals/prompts/xpl-004.txt +0 -3
  518. package/evals/prompts/xpl-005.txt +0 -5
  519. package/evals/prompts/xpl-006.txt +0 -3
  520. package/evals/registries/adversarial-evals.json +0 -39
  521. package/evals/registries/fixture-evals.json +0 -2513
  522. package/evals/registries/handoff-evals.json +0 -74
  523. package/evals/registries/legacy-evals.json +0 -147
  524. package/evals/registries/skill-evidence.json +0 -193
  525. package/evals/registries/verify-work-evals.json +0 -46
  526. package/evals/reports/acceptance/v0.1-acceptance-report.md +0 -130
  527. package/evals/reports/by-command-surface/command-surface-1-report.md +0 -45
  528. package/evals/reports/by-command-surface/command-surface-10-report.md +0 -76
  529. package/evals/reports/by-command-surface/command-surface-11-report.md +0 -77
  530. package/evals/reports/by-command-surface/command-surface-12-report.md +0 -91
  531. package/evals/reports/by-command-surface/command-surface-13-report.md +0 -64
  532. package/evals/reports/by-command-surface/command-surface-14-report.md +0 -66
  533. package/evals/reports/by-command-surface/command-surface-15-report.md +0 -124
  534. package/evals/reports/by-command-surface/command-surface-16-report.md +0 -39
  535. package/evals/reports/by-command-surface/command-surface-2-report.md +0 -80
  536. package/evals/reports/by-command-surface/command-surface-3-report.md +0 -86
  537. package/evals/reports/by-command-surface/command-surface-4-report.md +0 -76
  538. package/evals/reports/by-command-surface/command-surface-5-report.md +0 -80
  539. package/evals/reports/by-command-surface/command-surface-6-report.md +0 -74
  540. package/evals/reports/by-command-surface/command-surface-7-report.md +0 -84
  541. package/evals/reports/by-command-surface/command-surface-8-report.md +0 -79
  542. package/evals/reports/by-command-surface/command-surface-9-report.md +0 -79
  543. package/evals/reports/by-command-surface/command-surface-matrix.md +0 -91
  544. package/evals/reports/by-skill/bypass-1-report.md +0 -124
  545. package/evals/reports/by-skill/capture-decisions-1-report.md +0 -99
  546. package/evals/reports/by-skill/capture-decisions-2-report.md +0 -102
  547. package/evals/reports/by-skill/commit-work-1-report.md +0 -165
  548. package/evals/reports/by-skill/commit-work-2-report.md +0 -109
  549. package/evals/reports/by-skill/design-for-depth-1-report.md +0 -95
  550. package/evals/reports/by-skill/diagnose-failure-1-report.md +0 -91
  551. package/evals/reports/by-skill/diagnose-failure-2-report.md +0 -94
  552. package/evals/reports/by-skill/discover-1-report.md +0 -118
  553. package/evals/reports/by-skill/evaluate-skill-2-report.md +0 -71
  554. package/evals/reports/by-skill/execute-plan-1-report.md +0 -103
  555. package/evals/reports/by-skill/execute-plan-2-report.md +0 -112
  556. package/evals/reports/by-skill/execute-plan-3-report.md +0 -87
  557. package/evals/reports/by-skill/grill-context-1-report.md +0 -103
  558. package/evals/reports/by-skill/handoff-1-report.md +0 -123
  559. package/evals/reports/by-skill/handoff-2-report.md +0 -105
  560. package/evals/reports/by-skill/handoff-3-report.md +0 -100
  561. package/evals/reports/by-skill/handoff-7-report.md +0 -77
  562. package/evals/reports/by-skill/interview-gate-1-report.md +0 -63
  563. package/evals/reports/by-skill/interview-gate-2-report.md +0 -105
  564. package/evals/reports/by-skill/mode-contract-1-report.md +0 -74
  565. package/evals/reports/by-skill/mode-contract-2-report.md +0 -87
  566. package/evals/reports/by-skill/mode-contract-3-report.md +0 -65
  567. package/evals/reports/by-skill/mode-contract-4-report.md +0 -71
  568. package/evals/reports/by-skill/mode-contract-5-report.md +0 -70
  569. package/evals/reports/by-skill/output-router-1-report.md +0 -76
  570. package/evals/reports/by-skill/output-router-2-report.md +0 -65
  571. package/evals/reports/by-skill/research-1-report.md +0 -144
  572. package/evals/reports/by-skill/research-brief-1-report.md +0 -94
  573. package/evals/reports/by-skill/research-brief-2-report.md +0 -75
  574. package/evals/reports/by-skill/review-artifact-1-report.md +0 -91
  575. package/evals/reports/by-skill/review-artifact-2-report.md +0 -79
  576. package/evals/reports/by-skill/review-artifact-3-report.md +0 -120
  577. package/evals/reports/by-skill/review-artifact-4-report.md +0 -89
  578. package/evals/reports/by-skill/review-artifact-5-report.md +0 -66
  579. package/evals/reports/by-skill/review-work-1-report.md +0 -85
  580. package/evals/reports/by-skill/review-work-2-report.md +0 -87
  581. package/evals/reports/by-skill/review-work-3-report.md +0 -104
  582. package/evals/reports/by-skill/review-work-4-report.md +0 -108
  583. package/evals/reports/by-skill/review-work-5-report.md +0 -73
  584. package/evals/reports/by-skill/review-work-6-report.md +0 -66
  585. package/evals/reports/by-skill/setup-freeflow-1-report.md +0 -199
  586. package/evals/reports/by-skill/setup-freeflow-2-report.md +0 -105
  587. package/evals/reports/by-skill/setup-freeflow-3-report.md +0 -105
  588. package/evals/reports/by-skill/setup-freeflow-4-report.md +0 -88
  589. package/evals/reports/by-skill/setup-freeflow-5-report.md +0 -115
  590. package/evals/reports/by-skill/skill-authoring-1-report.md +0 -81
  591. package/evals/reports/by-skill/verify-work-1-report.md +0 -111
  592. package/evals/reports/by-skill/verify-work-2-report.md +0 -120
  593. package/evals/reports/by-skill/workflow-1-report.md +0 -65
  594. package/evals/reports/by-skill/write-plan-1-report.md +0 -123
  595. package/evals/reports/by-skill/write-plan-2-report.md +0 -98
  596. package/evals/reports/by-skill/write-plan-3-report.md +0 -110
  597. package/evals/reports/by-skill/write-spec-1-report.md +0 -88
  598. package/evals/reports/by-skill/write-spec-2-report.md +0 -89
  599. package/evals/reports/by-skill/write-spec-3-report.md +0 -90
  600. package/evals/reports/by-skill/write-spec-4-report.md +0 -167
  601. package/evals/reports/harness/claude-harness-1-report.md +0 -103
  602. package/evals/reports/harness/eval-harness-1-report.md +0 -91
  603. package/evals/reports/iterations/iteration-1-report.md +0 -71
  604. package/evals/reports/iterations/iteration-2-report.md +0 -78
  605. package/evals/reports/iterations/iteration-3-report.md +0 -118
  606. package/evals/reports/iterations/iteration-4-report.md +0 -131
  607. package/evals/reports/iterations/iteration-5-report.md +0 -149
  608. package/evals/reports/iterations/iteration-6-report.md +0 -136
  609. package/evals/reports/runtime/always-on-runtime-1-report.md +0 -107
  610. package/evals/reports/runtime/context-mode-normalized-benchmark-1-report.md +0 -52
  611. package/evals/reports/runtime/context-mode-real-deep-baseline-1-report.md +0 -410
  612. package/evals/reports/runtime/context-mode-real-deep-final-slice-11-report.md +0 -203
  613. package/evals/reports/runtime/context-mode-real-deep-final-slice-11-review.md +0 -51
  614. package/evals/reports/runtime/context-saving-native-tools-baseline-1-report.md +0 -99
  615. package/evals/reports/runtime/eryx-python-compatibility-reprobe-1-report.md +0 -166
  616. package/evals/reports/runtime/eryx-python-proof-spike-1-report.md +0 -96
  617. package/evals/reports/runtime/eryx-python-proof-spike-2-report.md +0 -151
  618. package/evals/reports/runtime/eryx-python-script-derive-execution-1-report.md +0 -233
  619. package/evals/reports/runtime/jq-script-derive-execution-1-report.md +0 -215
  620. package/evals/reports/runtime/jq-wasm-proof-spike-1-report.md +0 -67
  621. package/evals/reports/runtime/output-router-benchmark-1-report.md +0 -81
  622. package/evals/reports/runtime/output-router-capture-derive-provider-eval-1-report.md +0 -35
  623. package/evals/reports/runtime/output-router-codex-large-index-sqlite-adhoc-report.md +0 -150
  624. package/evals/reports/runtime/output-router-codex-qa-benchmark-1-report.md +0 -46
  625. package/evals/reports/runtime/output-router-command-benchmark-1-report.md +0 -62
  626. package/evals/reports/runtime/output-router-index-benchmark-1-report.md +0 -64
  627. package/evals/reports/runtime/output-router-regression-1-report.md +0 -81
  628. package/evals/reports/runtime/output-router-transform-eval-1-report.md +0 -28
  629. package/evals/reports/runtime/pi-observed-routing-eval-1-report.md +0 -44
  630. package/evals/reports/runtime/quickjs-script-derive-execution-1-report.md +0 -159
  631. package/evals/reports/runtime/quickjs-wasi-proof-spike-1-report.md +0 -55
  632. package/evals/reports/runtime/render-format-row-protocol-1-report.md +0 -58
  633. package/evals/reports/runtime/script-sandbox-adapter-selection-review-1-report.md +0 -84
  634. package/evals/reports/runtime/script-sandbox-probe-resource-hardening-1-report.md +0 -51
  635. package/evals/reports/runtime/storage-policy-benchmark-1-report.md +0 -176
  636. package/evals/reports/runtime/vault-index-storage-spike-1-report.md +0 -39
  637. package/evals/reports/runtime/workflow-context-hook-1-report.md +0 -82
  638. package/evals/runbooks/adversarial-eval-runbook.md +0 -28
  639. package/evals/runbooks/fixture-eval-runbook.md +0 -137
  640. package/evals/runbooks/handoff-eval-runbook.md +0 -22
  641. package/evals/runbooks/verify-work-eval-runbook.md +0 -27
  642. package/evals/scripts/audit-command-surface.sh +0 -160
  643. package/evals/scripts/check-activation-contract.sh +0 -121
  644. package/evals/scripts/check-runtime-context-hook.sh +0 -183
  645. package/evals/scripts/grade-fixture-eval.sh +0 -446
  646. package/evals/scripts/run-claude-fixture-eval.sh +0 -26
  647. package/evals/scripts/run-codex-fixture-eval.sh +0 -26
  648. package/evals/scripts/run-eryx-python-proof-spike.js +0 -559
  649. package/evals/scripts/run-fixture-eval-by-id.sh +0 -23
  650. package/evals/scripts/run-fixture-eval.sh +0 -464
  651. package/evals/scripts/run-jq-wasm-proof-spike.js +0 -299
  652. package/evals/scripts/run-output-router-transform-eval.js +0 -115
  653. package/evals/scripts/run-pi-observed-routing-eval.js +0 -478
  654. package/evals/scripts/run-quickjs-wasi-proof-spike.js +0 -339
  655. package/evals/scripts/skill-evidence.sh +0 -316
  656. package/evals/scripts/validate-release-metadata.sh +0 -486
  657. package/evals/suites/v0.1-acceptance-suite.md +0 -131
  658. package/pi-extension/dist/host-producer-identification.js +0 -186
  659. package/pi-extension/dist/mcp-config.js +0 -30
  660. package/pi-extension/dist/native-safety-net.js +0 -209
  661. package/pi-extension/dist/observed-tool-routing.js +0 -114
  662. package/pi-extension/dist/renderers.js +0 -835
  663. package/pi-extension/dist/router-tools.js +0 -438
  664. package/pi-extension/dist/runtime-context.js +0 -288
  665. package/pi-extension/dist/schemas.js +0 -254
  666. package/pi-extension/dist/status.js +0 -449
  667. package/pi-extension/dist/utils.js +0 -467
  668. package/pi-extension/src/runtime-context.ts +0 -347
  669. package/pi-extension/src/status.ts +0 -505
  670. package/plugin-docs/README.md +0 -40
  671. package/plugin-docs/adr/0001-three-modes.md +0 -27
  672. package/plugin-docs/adr/0002-evals-before-hooks.md +0 -17
  673. package/plugin-docs/adr/0003-release-boundary.md +0 -21
  674. package/plugin-docs/adr/0004-discover-replaces-shallow-discovery-skills.md +0 -26
  675. package/plugin-docs/adr/README.md +0 -10
  676. package/plugin-docs/architecture.md +0 -89
  677. package/plugin-docs/output-router.md +0 -396
  678. package/plugin-docs/release-evidence.md +0 -77
  679. package/plugin-docs/skills.md +0 -44
  680. package/plugin-docs/workflow.md +0 -57
  681. package/skills/diagnose-failure/references/feedback-loop-catalog.md +0 -25
  682. package/skills/discover/ARTIFACT-DESTINATIONS.md +0 -58
  683. package/skills/discover/CHECKPOINTS.md +0 -74
  684. package/skills/discover/SKILL.md +0 -173
  685. package/skills/evaluate-skill/references/eval-patterns.md +0 -41
  686. package/skills/evaluate-skill/references/grading-priority.md +0 -33
  687. package/skills/execute-plan/SKILL.md +0 -133
  688. package/skills/execute-plan/references/execution-map.md +0 -122
  689. package/skills/interview-gate/SKILL.md +0 -90
  690. package/skills/setup-freeflow/references/output-router-setup.md +0 -102
  691. package/skills/workflow/references/workflow-map.md +0 -104
  692. /package/pi-extension/src/{mcp-config.ts → integrations/mcp-config.ts} +0 -0
@@ -1,453 +1,632 @@
1
1
  import { isValidPostToolRoutingMode, validatePositiveIntegerThreshold } from "./router-contract.js";
2
- import { OBSERVED_ROUTING_FAILURE_MODES, OBSERVED_ROUTING_PERSISTENCE_MODES, OUTPUT_ROUTER_PROFILES, RESERVED_OBSERVED_ROUTING_PERSISTENCE_MODES, STORAGE_POLICY_MODES, } from "./types.js";
3
- export const OUTPUT_ROUTER_SKILL_PATH = "skills/output-router/SKILL.md";
2
+ import {
3
+ OBSERVED_ROUTING_FAILURE_MODES,
4
+ OBSERVED_ROUTING_PERSISTENCE_MODES,
5
+ OUTPUT_ROUTER_PROFILES,
6
+ RESERVED_OBSERVED_ROUTING_PERSISTENCE_MODES,
7
+ STORAGE_POLICY_MODES,
8
+ } from "./types.js";
9
+ export const OUTPUT_ROUTER_SKILL_PATH = "capabilities/output-router/SKILL.md";
4
10
  export const DEFAULT_VAULT_ROOT = "~/.cache/freeflow-router/vault";
5
11
  export const DEFAULT_POST_TOOL_ROUTING = "off";
6
- export const DEFAULT_OUTPUT_ROUTER_ENABLED = true;
12
+ export const DEFAULT_OUTPUT_ROUTER_ENABLED = false;
7
13
  export const DEFAULT_OUTPUT_ROUTER_PROFILE = "standard";
8
14
  export const DEFAULT_STORAGE_POLICY = "hybrid-dedupe";
9
15
  export const DEFAULT_VAULT_RETENTION = {
10
- strategy: "ttl",
11
- ttlDays: 7,
16
+ strategy: "ttl",
17
+ ttlDays: 7,
12
18
  };
13
19
  export const DEFAULT_ROUTER_THRESHOLDS = {
14
- largeOutputBytes: 64_000,
15
- largeOutputLines: 1_000,
20
+ largeOutputBytes: 64_000,
21
+ largeOutputLines: 1_000,
16
22
  };
17
23
  export const DEFAULT_OBSERVED_ROUTING_PERSISTENCE = "none";
18
24
  export const SAFE_OBSERVED_ROUTING_PERSISTENCE_FALLBACK = "metadata-only";
19
25
  export const DEFAULT_OBSERVED_ROUTING_CONFIG = {
20
- enabled: false,
21
- onRoutingFailure: "fail-open",
22
- mcp: { servers: {} },
23
- web: { enabled: false, persistence: DEFAULT_OBSERVED_ROUTING_PERSISTENCE },
24
- fetch: { enabled: false, persistence: DEFAULT_OBSERVED_ROUTING_PERSISTENCE },
25
- codeSearch: { enabled: false, persistence: DEFAULT_OBSERVED_ROUTING_PERSISTENCE },
26
+ enabled: false,
27
+ onRoutingFailure: "fail-open",
28
+ mcp: { servers: {} },
29
+ web: { enabled: false, persistence: DEFAULT_OBSERVED_ROUTING_PERSISTENCE },
30
+ fetch: { enabled: false, persistence: DEFAULT_OBSERVED_ROUTING_PERSISTENCE },
31
+ codeSearch: { enabled: false, persistence: DEFAULT_OBSERVED_ROUTING_PERSISTENCE },
26
32
  };
27
33
  export const SCRIPT_TRANSFORM_LANGUAGES = ["javascript", "python", "jq"];
28
34
  export const DEFAULT_SCRIPT_TRANSFORM_LIMITS = {
29
- timeoutMs: 5_000,
30
- maxInputBytes: 1_048_576,
31
- maxOutputBytes: 65_536,
35
+ timeoutMs: 5_000,
36
+ maxInputBytes: 1_048_576,
37
+ maxOutputBytes: 65_536,
32
38
  };
33
39
  export const MAX_SCRIPT_TRANSFORM_LIMITS = {
34
- timeoutMs: 30_000,
35
- maxInputBytes: 10_485_760,
36
- maxOutputBytes: 1_048_576,
40
+ timeoutMs: 30_000,
41
+ maxInputBytes: 10_485_760,
42
+ maxOutputBytes: 1_048_576,
37
43
  };
38
44
  export const DEFAULT_SCRIPT_TRANSFORM_CONFIG = {
39
- enabled: false,
40
- sandbox: "auto",
41
- languages: [...SCRIPT_TRANSFORM_LANGUAGES],
42
- network: "off",
43
- limits: { ...DEFAULT_SCRIPT_TRANSFORM_LIMITS },
44
- rawScriptPersistence: "disabled",
45
+ enabled: false,
46
+ sandbox: "auto",
47
+ languages: [...SCRIPT_TRANSFORM_LANGUAGES],
48
+ network: "off",
49
+ limits: { ...DEFAULT_SCRIPT_TRANSFORM_LIMITS },
50
+ rawScriptPersistence: "disabled",
45
51
  };
46
52
  export const DEFAULT_LOCAL_FREEFLOW_CONFIG = {
47
- processing: {
48
- unsafeUnsandboxed: {
49
- enabled: false,
50
- },
53
+ processing: {
54
+ unsafeUnsandboxed: {
55
+ enabled: false,
51
56
  },
57
+ },
52
58
  };
53
59
  export function createDefaultRouterConfig(options = {}) {
54
- return {
55
- enabled: DEFAULT_OUTPUT_ROUTER_ENABLED,
56
- profile: DEFAULT_OUTPUT_ROUTER_PROFILE,
57
- postToolRouting: DEFAULT_POST_TOOL_ROUTING,
58
- storagePolicy: DEFAULT_STORAGE_POLICY,
59
- thresholds: { ...DEFAULT_ROUTER_THRESHOLDS },
60
- vault: {
61
- root: options.vaultRoot ?? DEFAULT_VAULT_ROOT,
62
- retention: options.vaultRetention ?? DEFAULT_VAULT_RETENTION,
63
- },
64
- };
60
+ return {
61
+ enabled: DEFAULT_OUTPUT_ROUTER_ENABLED,
62
+ profile: DEFAULT_OUTPUT_ROUTER_PROFILE,
63
+ postToolRouting: DEFAULT_POST_TOOL_ROUTING,
64
+ storagePolicy: DEFAULT_STORAGE_POLICY,
65
+ thresholds: { ...DEFAULT_ROUTER_THRESHOLDS },
66
+ vault: {
67
+ root: options.vaultRoot ?? DEFAULT_VAULT_ROOT,
68
+ retention: options.vaultRetention ?? DEFAULT_VAULT_RETENTION,
69
+ },
70
+ };
65
71
  }
66
72
  export function normalizeRouterConfig(input) {
67
- const config = createDefaultRouterConfig();
68
- const warnings = [];
69
- if (input === undefined || input === null) {
70
- return { config, warnings };
71
- }
72
- if (!isRecord(input)) {
73
- return {
74
- config,
75
- warnings: ["outputRouter config must be an object; using built-in output router defaults."],
76
- };
77
- }
78
- applyRouterEnabled(config, warnings, input.enabled);
79
- applyRouterProfile(config, warnings, input.profile);
80
- applyPostToolRouting(config, warnings, input.postToolRouting);
81
- applyStringEnum(config, warnings, input.storagePolicy, "storagePolicy", "outputRouter.storagePolicy", STORAGE_POLICY_MODES, DEFAULT_STORAGE_POLICY);
82
- applyPositiveInteger(config.thresholds, warnings, input.largeOutputBytes, "largeOutputBytes");
83
- applyPositiveInteger(config.thresholds, warnings, input.largeOutputLines, "largeOutputLines");
84
- applyVaultRoot(config, warnings, input.vaultRoot);
85
- applyVaultRetention(config, warnings, input.vaultRetentionDays);
86
- applyHints(config, warnings, input.generatedPaths, input.noisyCommandHints);
73
+ const config = createDefaultRouterConfig();
74
+ const warnings = [];
75
+ if (input === undefined || input === null) {
87
76
  return { config, warnings };
77
+ }
78
+ if (!isRecord(input)) {
79
+ return {
80
+ config,
81
+ warnings: ["outputRouter config must be an object; using built-in output router defaults."],
82
+ };
83
+ }
84
+ applyRouterEnabled(config, warnings, input.enabled);
85
+ applyRouterProfile(config, warnings, input.profile);
86
+ applyPostToolRouting(config, warnings, input.postToolRouting);
87
+ applyStringEnum(
88
+ config,
89
+ warnings,
90
+ input.storagePolicy,
91
+ "storagePolicy",
92
+ "outputRouter.storagePolicy",
93
+ STORAGE_POLICY_MODES,
94
+ DEFAULT_STORAGE_POLICY,
95
+ );
96
+ applyRouterThresholds(config, warnings, input);
97
+ applyRouterVault(config, warnings, input);
98
+ applyRouterHints(config, warnings, input);
99
+ return { config, warnings };
88
100
  }
89
101
  export function normalizeObservedRoutingConfig(input) {
90
- const config = createDefaultObservedRoutingConfig();
91
- const warnings = [];
92
- if (input === undefined || input === null) {
93
- return { config, warnings };
94
- }
95
- if (!isRecord(input)) {
96
- return {
97
- config,
98
- warnings: ["observedRouting config must be an object; observed routing is off by default."],
99
- };
100
- }
101
- applyObservedRoutingEnabled(config, warnings, input.enabled);
102
- applyStringEnum(config, warnings, input.onRoutingFailure, "onRoutingFailure", "observedRouting.onRoutingFailure", OBSERVED_ROUTING_FAILURE_MODES, DEFAULT_OBSERVED_ROUTING_CONFIG.onRoutingFailure);
103
- applyObservedMcpConfig(config, warnings, input.mcp);
104
- config.web = parseObservedProducerConfig(input.web, "observedRouting.web", warnings);
105
- config.fetch = parseObservedProducerConfig(input.fetch, "observedRouting.fetch", warnings);
106
- config.codeSearch = parseObservedProducerConfig(input.codeSearch, "observedRouting.codeSearch", warnings);
102
+ const config = createDefaultObservedRoutingConfig();
103
+ const warnings = [];
104
+ if (input === undefined || input === null) {
107
105
  return { config, warnings };
106
+ }
107
+ if (!isRecord(input)) {
108
+ return {
109
+ config,
110
+ warnings: ["observedRouting config must be an object; observed routing is off by default."],
111
+ };
112
+ }
113
+ applyObservedRoutingEnabled(config, warnings, input.enabled);
114
+ applyStringEnum(
115
+ config,
116
+ warnings,
117
+ input.onRoutingFailure,
118
+ "onRoutingFailure",
119
+ "observedRouting.onRoutingFailure",
120
+ OBSERVED_ROUTING_FAILURE_MODES,
121
+ DEFAULT_OBSERVED_ROUTING_CONFIG.onRoutingFailure,
122
+ );
123
+ applyObservedMcpConfig(config, warnings, input.mcp);
124
+ config.web = parseObservedProducerConfig(input.web, "observedRouting.web", warnings);
125
+ config.fetch = parseObservedProducerConfig(input.fetch, "observedRouting.fetch", warnings);
126
+ config.codeSearch = parseObservedProducerConfig(input.codeSearch, "observedRouting.codeSearch", warnings);
127
+ return { config, warnings };
108
128
  }
109
129
  export function normalizeScriptTransformConfig(input) {
110
- const config = {
111
- ...DEFAULT_SCRIPT_TRANSFORM_CONFIG,
112
- languages: [...DEFAULT_SCRIPT_TRANSFORM_CONFIG.languages],
113
- limits: { ...DEFAULT_SCRIPT_TRANSFORM_CONFIG.limits },
114
- };
115
- const warnings = [];
116
- if (input === undefined || input === null) {
117
- return { config, warnings };
118
- }
119
- if (!isRecord(input)) {
120
- return {
121
- config,
122
- warnings: ["scriptTransform config must be an object; script transform is disabled by default."],
123
- };
124
- }
125
- if (input.enabled !== undefined) {
126
- if (typeof input.enabled === "boolean") {
127
- config.enabled = input.enabled;
128
- }
129
- else {
130
- warnings.push(`Invalid scriptTransform.enabled=${JSON.stringify(input.enabled)}; using false.`);
131
- }
132
- }
133
- applyStringEnum(config, warnings, input.sandbox, "sandbox", "scriptTransform.sandbox", ["auto"], DEFAULT_SCRIPT_TRANSFORM_CONFIG.sandbox);
134
- applyStringEnum(config, warnings, input.network, "network", "scriptTransform.network", ["off"], DEFAULT_SCRIPT_TRANSFORM_CONFIG.network);
135
- applyStringEnum(config, warnings, input.rawScriptPersistence, "rawScriptPersistence", "scriptTransform.rawScriptPersistence", ["disabled"], DEFAULT_SCRIPT_TRANSFORM_CONFIG.rawScriptPersistence);
136
- applyScriptTransformLanguages(config, warnings, input.languages);
137
- applyScriptTransformLimits(config, warnings, input.limits);
130
+ const config = {
131
+ ...DEFAULT_SCRIPT_TRANSFORM_CONFIG,
132
+ languages: [...DEFAULT_SCRIPT_TRANSFORM_CONFIG.languages],
133
+ limits: { ...DEFAULT_SCRIPT_TRANSFORM_CONFIG.limits },
134
+ };
135
+ const warnings = [];
136
+ if (input === undefined || input === null) {
138
137
  return { config, warnings };
138
+ }
139
+ if (!isRecord(input)) {
140
+ return {
141
+ config,
142
+ warnings: ["scriptTransform config must be an object; script transform is disabled by default."],
143
+ };
144
+ }
145
+ if (input.enabled !== undefined) {
146
+ if (typeof input.enabled === "boolean") {
147
+ config.enabled = input.enabled;
148
+ } else {
149
+ warnings.push(`Invalid scriptTransform.enabled=${JSON.stringify(input.enabled)}; using false.`);
150
+ }
151
+ }
152
+ applyStringEnum(
153
+ config,
154
+ warnings,
155
+ input.sandbox,
156
+ "sandbox",
157
+ "scriptTransform.sandbox",
158
+ ["auto"],
159
+ DEFAULT_SCRIPT_TRANSFORM_CONFIG.sandbox,
160
+ );
161
+ applyStringEnum(
162
+ config,
163
+ warnings,
164
+ input.network,
165
+ "network",
166
+ "scriptTransform.network",
167
+ ["off"],
168
+ DEFAULT_SCRIPT_TRANSFORM_CONFIG.network,
169
+ );
170
+ applyStringEnum(
171
+ config,
172
+ warnings,
173
+ input.rawScriptPersistence,
174
+ "rawScriptPersistence",
175
+ "scriptTransform.rawScriptPersistence",
176
+ ["disabled"],
177
+ DEFAULT_SCRIPT_TRANSFORM_CONFIG.rawScriptPersistence,
178
+ );
179
+ applyScriptTransformLanguages(config, warnings, input.languages);
180
+ applyScriptTransformLimits(config, warnings, input.limits);
181
+ return { config, warnings };
139
182
  }
140
183
  export function normalizeLocalFreeflowConfig(input) {
141
- const config = {
142
- processing: {
143
- unsafeUnsandboxed: { ...DEFAULT_LOCAL_FREEFLOW_CONFIG.processing.unsafeUnsandboxed },
144
- },
184
+ const config = {
185
+ processing: {
186
+ unsafeUnsandboxed: { ...DEFAULT_LOCAL_FREEFLOW_CONFIG.processing.unsafeUnsandboxed },
187
+ },
188
+ };
189
+ const warnings = [];
190
+ if (input === undefined || input === null) {
191
+ return { config, warnings };
192
+ }
193
+ if (!isRecord(input)) {
194
+ return {
195
+ config,
196
+ warnings: [".freeflow/local.json must be an object; local unsafe processing opt-ins are disabled."],
145
197
  };
146
- const warnings = [];
147
- if (input === undefined || input === null) {
148
- return { config, warnings };
149
- }
150
- if (!isRecord(input)) {
151
- return {
152
- config,
153
- warnings: [".freeflow/local.json must be an object; local unsafe processing opt-ins are disabled."],
154
- };
155
- }
156
- if (input.processing === undefined) {
157
- return { config, warnings };
158
- }
159
- if (!isRecord(input.processing)) {
160
- warnings.push("Invalid local processing config; expected an object. unsafeUnsandboxed remains disabled.");
161
- return { config, warnings };
162
- }
163
- const unsafe = input.processing.unsafeUnsandboxed;
164
- if (unsafe === undefined) {
165
- return { config, warnings };
166
- }
167
- if (!isRecord(unsafe)) {
168
- warnings.push("Invalid local processing.unsafeUnsandboxed config; expected an object with enabled boolean. unsafeUnsandboxed remains disabled.");
169
- return { config, warnings };
170
- }
171
- if (typeof unsafe.enabled === "boolean") {
172
- config.processing.unsafeUnsandboxed.enabled = unsafe.enabled;
173
- }
174
- else if (unsafe.enabled !== undefined) {
175
- warnings.push(`Invalid local processing.unsafeUnsandboxed.enabled=${JSON.stringify(unsafe.enabled)}; using false.`);
176
- }
198
+ }
199
+ if (input.processing === undefined) {
200
+ return { config, warnings };
201
+ }
202
+ if (!isRecord(input.processing)) {
203
+ warnings.push("Invalid local processing config; expected an object. unsafeUnsandboxed remains disabled.");
177
204
  return { config, warnings };
205
+ }
206
+ const unsafe = input.processing.unsafeUnsandboxed;
207
+ if (unsafe === undefined) {
208
+ return { config, warnings };
209
+ }
210
+ if (!isRecord(unsafe)) {
211
+ warnings.push(
212
+ "Invalid local processing.unsafeUnsandboxed config; expected an object with enabled boolean. unsafeUnsandboxed remains disabled.",
213
+ );
214
+ return { config, warnings };
215
+ }
216
+ if (typeof unsafe.enabled === "boolean") {
217
+ config.processing.unsafeUnsandboxed.enabled = unsafe.enabled;
218
+ } else if (unsafe.enabled !== undefined) {
219
+ warnings.push(`Invalid local processing.unsafeUnsandboxed.enabled=${JSON.stringify(unsafe.enabled)}; using false.`);
220
+ }
221
+ return { config, warnings };
178
222
  }
179
223
  export function normalizeFreeflowConfig(input) {
180
- const warnings = [];
181
- if (input !== undefined && input !== null && !isRecord(input)) {
182
- const router = normalizeRouterConfig(undefined);
183
- const observedRouting = normalizeObservedRoutingConfig(undefined);
184
- const scriptTransform = normalizeScriptTransformConfig(undefined);
185
- return {
186
- config: {
187
- outputRouter: router.config,
188
- observedRouting: observedRouting.config,
189
- scriptTransform: scriptTransform.config,
190
- },
191
- warnings: ["Freeflow config must be an object; using built-in defaults."],
192
- };
193
- }
194
- const source = isRecord(input) ? input : {};
195
- if (source.processing !== undefined) {
196
- warnings.push(".freeflow/config.json processing config is ignored; unsafe unsandboxed processing must be enabled in local-only .freeflow/local.json.");
197
- }
198
- const router = normalizeRouterConfig(source.outputRouter);
199
- const observedRouting = normalizeObservedRoutingConfig(source.observedRouting);
200
- const scriptTransform = normalizeScriptTransformConfig(source.scriptTransform);
201
- warnings.push(...router.warnings, ...observedRouting.warnings, ...scriptTransform.warnings);
224
+ const warnings = [];
225
+ if (input !== undefined && input !== null && !isRecord(input)) {
226
+ const router = normalizeRouterConfig(undefined);
227
+ const observedRouting = normalizeObservedRoutingConfig(undefined);
228
+ const scriptTransform = normalizeScriptTransformConfig(undefined);
202
229
  return {
203
- config: {
204
- outputRouter: router.config,
205
- observedRouting: observedRouting.config,
206
- scriptTransform: scriptTransform.config,
207
- },
208
- warnings,
230
+ config: {
231
+ outputRouter: router.config,
232
+ observedRouting: observedRouting.config,
233
+ scriptTransform: scriptTransform.config,
234
+ },
235
+ warnings: ["Freeflow config must be an object; using built-in defaults."],
209
236
  };
237
+ }
238
+ const source = isRecord(input) ? input : {};
239
+ if (source.processing !== undefined) {
240
+ warnings.push(
241
+ ".freeflow/config.json processing config is ignored; unsafe unsandboxed processing must be enabled in local-only .freeflow/local.json.",
242
+ );
243
+ }
244
+ const routerSource = source.outputRouter;
245
+ const routerSourceRecord = isRecord(routerSource) ? routerSource : {};
246
+ const router = normalizeRouterConfig(routerSource);
247
+ const observedRoutingSource =
248
+ routerSourceRecord.observedRouting !== undefined ? routerSourceRecord.observedRouting : source.observedRouting;
249
+ const observedRouting = normalizeObservedRoutingConfig(observedRoutingSource);
250
+ const observedRoutingWarnings =
251
+ routerSourceRecord.observedRouting !== undefined
252
+ ? prefixConfigWarnings(observedRouting.warnings, "observedRouting", "outputRouter.observedRouting")
253
+ : observedRouting.warnings;
254
+ const scriptTransformSource =
255
+ routerSourceRecord.scriptTransform !== undefined ? routerSourceRecord.scriptTransform : source.scriptTransform;
256
+ const scriptTransform = normalizeScriptTransformConfig(scriptTransformSource);
257
+ const scriptTransformWarnings =
258
+ routerSourceRecord.scriptTransform !== undefined
259
+ ? prefixConfigWarnings(scriptTransform.warnings, "scriptTransform", "outputRouter.scriptTransform")
260
+ : scriptTransform.warnings;
261
+ const effectiveObservedRouting = router.config.enabled
262
+ ? observedRouting.config
263
+ : { ...observedRouting.config, enabled: false };
264
+ const effectiveScriptTransform = router.config.enabled
265
+ ? scriptTransform.config
266
+ : { ...scriptTransform.config, enabled: false };
267
+ warnings.push(...router.warnings, ...observedRoutingWarnings, ...scriptTransformWarnings);
268
+ return {
269
+ config: {
270
+ outputRouter: router.config,
271
+ observedRouting: effectiveObservedRouting,
272
+ scriptTransform: effectiveScriptTransform,
273
+ },
274
+ warnings,
275
+ };
210
276
  }
211
277
  function isRecord(value) {
212
- return typeof value === "object" && value !== null && !Array.isArray(value);
278
+ return typeof value === "object" && value !== null && !Array.isArray(value);
279
+ }
280
+ function prefixConfigWarnings(warnings, from, to) {
281
+ return warnings.map((warning) => warning.replaceAll(from, to));
213
282
  }
214
283
  function applyRouterEnabled(config, warnings, value) {
215
- if (value === undefined) {
216
- return;
217
- }
218
- if (typeof value === "boolean") {
219
- config.enabled = value;
220
- return;
221
- }
222
- warnings.push(`Invalid outputRouter.enabled=${JSON.stringify(value)}; using ${DEFAULT_OUTPUT_ROUTER_ENABLED}.`);
284
+ if (value === undefined) {
285
+ return;
286
+ }
287
+ if (typeof value === "boolean") {
288
+ config.enabled = value;
289
+ return;
290
+ }
291
+ warnings.push(`Invalid outputRouter.enabled=${JSON.stringify(value)}; using ${DEFAULT_OUTPUT_ROUTER_ENABLED}.`);
223
292
  }
224
293
  function applyRouterProfile(config, warnings, value) {
225
- if (value === undefined) {
226
- return;
227
- }
228
- if (isStringIn(value, OUTPUT_ROUTER_PROFILES)) {
229
- config.profile = value;
230
- return;
231
- }
232
- warnings.push(`Invalid outputRouter.profile=${JSON.stringify(value)}; using ${DEFAULT_OUTPUT_ROUTER_PROFILE}.`);
294
+ if (value === undefined) {
295
+ return;
296
+ }
297
+ if (isStringIn(value, OUTPUT_ROUTER_PROFILES)) {
298
+ config.profile = value;
299
+ return;
300
+ }
301
+ warnings.push(`Invalid outputRouter.profile=${JSON.stringify(value)}; using ${DEFAULT_OUTPUT_ROUTER_PROFILE}.`);
233
302
  }
234
303
  function applyPostToolRouting(config, warnings, value) {
235
- if (value === undefined) {
236
- return;
237
- }
238
- if (isValidPostToolRoutingMode(value)) {
239
- config.postToolRouting = value;
240
- return;
241
- }
242
- warnings.push(`Invalid outputRouter.postToolRouting=${JSON.stringify(value)}; using ${DEFAULT_POST_TOOL_ROUTING}.`);
304
+ if (value === undefined) {
305
+ return;
306
+ }
307
+ if (isValidPostToolRoutingMode(value)) {
308
+ config.postToolRouting = value;
309
+ return;
310
+ }
311
+ warnings.push(`Invalid outputRouter.postToolRouting=${JSON.stringify(value)}; using ${DEFAULT_POST_TOOL_ROUTING}.`);
243
312
  }
244
- function applyPositiveInteger(thresholds, warnings, value, key) {
245
- if (value === undefined) {
246
- return;
247
- }
248
- if (validatePositiveIntegerThreshold(value, `outputRouter.${key}`).length === 0) {
249
- thresholds[key] = value;
250
- return;
251
- }
252
- warnings.push(`Invalid outputRouter.${key}=${JSON.stringify(value)}; using ${DEFAULT_ROUTER_THRESHOLDS[key]}.`);
313
+ function applyRouterThresholds(config, warnings, input) {
314
+ const thresholds = input.thresholds;
315
+ const thresholdRecord = isRecord(thresholds) ? thresholds : {};
316
+ if (thresholds !== undefined && !isRecord(thresholds)) {
317
+ warnings.push("Invalid outputRouter.thresholds; expected an object with positive integer thresholds.");
318
+ }
319
+ applyPositiveInteger(
320
+ config.thresholds,
321
+ warnings,
322
+ thresholdRecord.largeOutputBytes ?? input.largeOutputBytes,
323
+ "largeOutputBytes",
324
+ thresholdRecord.largeOutputBytes !== undefined
325
+ ? "outputRouter.thresholds.largeOutputBytes"
326
+ : "outputRouter.largeOutputBytes",
327
+ );
328
+ applyPositiveInteger(
329
+ config.thresholds,
330
+ warnings,
331
+ thresholdRecord.largeOutputLines ?? input.largeOutputLines,
332
+ "largeOutputLines",
333
+ thresholdRecord.largeOutputLines !== undefined
334
+ ? "outputRouter.thresholds.largeOutputLines"
335
+ : "outputRouter.largeOutputLines",
336
+ );
253
337
  }
254
- function applyVaultRoot(config, warnings, value) {
255
- if (value === undefined) {
256
- return;
257
- }
258
- if (typeof value === "string" && value.trim().length > 0) {
259
- config.vault.root = value;
260
- return;
261
- }
262
- warnings.push(`Invalid outputRouter.vaultRoot=${JSON.stringify(value)}; using ${DEFAULT_VAULT_ROOT}.`);
338
+ function applyPositiveInteger(thresholds, warnings, value, key, path) {
339
+ if (value === undefined) {
340
+ return;
341
+ }
342
+ if (validatePositiveIntegerThreshold(value, path).length === 0) {
343
+ thresholds[key] = value;
344
+ return;
345
+ }
346
+ warnings.push(`Invalid ${path}=${JSON.stringify(value)}; using ${DEFAULT_ROUTER_THRESHOLDS[key]}.`);
263
347
  }
264
- function applyVaultRetention(config, warnings, value) {
265
- if (value === undefined) {
266
- return;
267
- }
268
- if (validatePositiveIntegerThreshold(value, "outputRouter.vaultRetentionDays").length === 0) {
269
- config.vault.retention = { strategy: "ttl", ttlDays: value };
270
- return;
271
- }
272
- warnings.push(`Invalid outputRouter.vaultRetentionDays=${JSON.stringify(value)}; using ${DEFAULT_VAULT_RETENTION.ttlDays}.`);
348
+ function applyRouterVault(config, warnings, input) {
349
+ const vault = input.vault;
350
+ const vaultRecord = isRecord(vault) ? vault : {};
351
+ if (vault !== undefined && !isRecord(vault)) {
352
+ warnings.push("Invalid outputRouter.vault; expected an object with root and retention.");
353
+ }
354
+ applyVaultRoot(
355
+ config,
356
+ warnings,
357
+ vaultRecord.root ?? input.vaultRoot,
358
+ vaultRecord.root !== undefined ? "outputRouter.vault.root" : "outputRouter.vaultRoot",
359
+ );
360
+ const retention = vaultRecord.retention;
361
+ if (retention !== undefined) {
362
+ applyVaultRetentionPolicy(config, warnings, retention);
363
+ } else {
364
+ applyVaultRetentionDays(
365
+ config,
366
+ warnings,
367
+ vaultRecord.retentionDays ?? input.vaultRetentionDays,
368
+ vaultRecord.retentionDays !== undefined ? "outputRouter.vault.retentionDays" : "outputRouter.vaultRetentionDays",
369
+ );
370
+ }
273
371
  }
274
- function applyHints(config, warnings, generatedPaths, noisyCommandHints) {
275
- const hints = {};
276
- if (generatedPaths !== undefined) {
277
- const parsed = parseStringArray(generatedPaths, "generatedPaths", warnings);
278
- if (parsed) {
279
- hints.generatedPathGlobs = parsed;
280
- }
281
- }
282
- if (noisyCommandHints !== undefined) {
283
- const parsed = parseStringArray(noisyCommandHints, "noisyCommandHints", warnings);
284
- if (parsed) {
285
- hints.noisyCommandPatterns = parsed;
286
- }
287
- }
288
- if (hints.generatedPathGlobs || hints.noisyCommandPatterns) {
289
- config.hints = hints;
290
- }
372
+ function applyVaultRoot(config, warnings, value, path) {
373
+ if (value === undefined) {
374
+ return;
375
+ }
376
+ if (typeof value === "string" && value.trim().length > 0) {
377
+ config.vault.root = value;
378
+ return;
379
+ }
380
+ warnings.push(`Invalid ${path}=${JSON.stringify(value)}; using ${DEFAULT_VAULT_ROOT}.`);
381
+ }
382
+ function applyVaultRetentionPolicy(config, warnings, value) {
383
+ if (!isRecord(value)) {
384
+ warnings.push(
385
+ "Invalid outputRouter.vault.retention; expected { strategy: 'ttl', ttlDays } or { strategy: 'manual' }.",
386
+ );
387
+ return;
388
+ }
389
+ if (value.strategy === "manual") {
390
+ config.vault.retention = { strategy: "manual" };
391
+ return;
392
+ }
393
+ if (value.strategy === undefined || value.strategy === "ttl") {
394
+ applyVaultRetentionDays(config, warnings, value.ttlDays, "outputRouter.vault.retention.ttlDays");
395
+ return;
396
+ }
397
+ warnings.push(
398
+ `Invalid outputRouter.vault.retention.strategy=${JSON.stringify(value.strategy)}; using ${DEFAULT_VAULT_RETENTION.strategy}.`,
399
+ );
400
+ }
401
+ function applyVaultRetentionDays(config, warnings, value, path) {
402
+ if (value === undefined) {
403
+ return;
404
+ }
405
+ if (validatePositiveIntegerThreshold(value, path).length === 0) {
406
+ config.vault.retention = { strategy: "ttl", ttlDays: value };
407
+ return;
408
+ }
409
+ warnings.push(`Invalid ${path}=${JSON.stringify(value)}; using ${DEFAULT_VAULT_RETENTION.ttlDays}.`);
410
+ }
411
+ function applyRouterHints(config, warnings, input) {
412
+ const hintsInput = input.hints;
413
+ const hintsRecord = isRecord(hintsInput) ? hintsInput : {};
414
+ if (hintsInput !== undefined && !isRecord(hintsInput)) {
415
+ warnings.push(
416
+ "Invalid outputRouter.hints; expected an object with generatedPathGlobs/noisyCommandPatterns arrays.",
417
+ );
418
+ }
419
+ const generatedPaths = hintsRecord.generatedPathGlobs ?? input.generatedPaths;
420
+ const noisyCommandHints = hintsRecord.noisyCommandPatterns ?? input.noisyCommandHints;
421
+ const hints = {};
422
+ if (generatedPaths !== undefined) {
423
+ const parsed = parseStringArray(
424
+ generatedPaths,
425
+ hintsRecord.generatedPathGlobs !== undefined
426
+ ? "outputRouter.hints.generatedPathGlobs"
427
+ : "outputRouter.generatedPaths",
428
+ warnings,
429
+ );
430
+ if (parsed) {
431
+ hints.generatedPathGlobs = parsed;
432
+ }
433
+ }
434
+ if (noisyCommandHints !== undefined) {
435
+ const parsed = parseStringArray(
436
+ noisyCommandHints,
437
+ hintsRecord.noisyCommandPatterns !== undefined
438
+ ? "outputRouter.hints.noisyCommandPatterns"
439
+ : "outputRouter.noisyCommandHints",
440
+ warnings,
441
+ );
442
+ if (parsed) {
443
+ hints.noisyCommandPatterns = parsed;
444
+ }
445
+ }
446
+ if (hints.generatedPathGlobs || hints.noisyCommandPatterns) {
447
+ config.hints = hints;
448
+ }
291
449
  }
292
450
  function applyScriptTransformLanguages(config, warnings, value) {
293
- if (value === undefined) {
294
- return;
295
- }
296
- if (!Array.isArray(value)) {
297
- warnings.push("Invalid scriptTransform.languages; expected an array of supported language ids.");
298
- return;
299
- }
300
- const languages = [];
301
- for (const item of value) {
302
- if (isStringIn(item, SCRIPT_TRANSFORM_LANGUAGES)) {
303
- if (!languages.includes(item)) {
304
- languages.push(item);
305
- }
306
- }
307
- else {
308
- warnings.push(`Invalid scriptTransform.languages entry=${JSON.stringify(item)}; supported languages are ${SCRIPT_TRANSFORM_LANGUAGES.join(", ")}.`);
309
- }
310
- }
311
- if (languages.length > 0) {
312
- config.languages = languages;
313
- }
451
+ if (value === undefined) {
452
+ return;
453
+ }
454
+ if (!Array.isArray(value)) {
455
+ warnings.push("Invalid scriptTransform.languages; expected an array of supported language ids.");
456
+ return;
457
+ }
458
+ const languages = [];
459
+ for (const item of value) {
460
+ if (isStringIn(item, SCRIPT_TRANSFORM_LANGUAGES)) {
461
+ if (!languages.includes(item)) {
462
+ languages.push(item);
463
+ }
464
+ } else {
465
+ warnings.push(
466
+ `Invalid scriptTransform.languages entry=${JSON.stringify(item)}; supported languages are ${SCRIPT_TRANSFORM_LANGUAGES.join(", ")}.`,
467
+ );
468
+ }
469
+ }
470
+ if (languages.length > 0) {
471
+ config.languages = languages;
472
+ }
314
473
  }
315
474
  function applyScriptTransformLimits(config, warnings, value) {
316
- if (value === undefined) {
317
- return;
318
- }
319
- if (!isRecord(value)) {
320
- warnings.push("Invalid scriptTransform.limits; expected an object with positive integer limits.");
321
- return;
322
- }
323
- applyScriptLimit(config, warnings, value.timeoutMs, "timeoutMs");
324
- applyScriptLimit(config, warnings, value.maxInputBytes, "maxInputBytes");
325
- applyScriptLimit(config, warnings, value.maxOutputBytes, "maxOutputBytes");
475
+ if (value === undefined) {
476
+ return;
477
+ }
478
+ if (!isRecord(value)) {
479
+ warnings.push("Invalid scriptTransform.limits; expected an object with positive integer limits.");
480
+ return;
481
+ }
482
+ applyScriptLimit(config, warnings, value.timeoutMs, "timeoutMs");
483
+ applyScriptLimit(config, warnings, value.maxInputBytes, "maxInputBytes");
484
+ applyScriptLimit(config, warnings, value.maxOutputBytes, "maxOutputBytes");
326
485
  }
327
486
  function applyScriptLimit(config, warnings, value, key) {
328
- if (value === undefined) {
329
- return;
330
- }
331
- const max = MAX_SCRIPT_TRANSFORM_LIMITS[key];
332
- if (Number.isInteger(value) && Number(value) > 0 && Number(value) <= max) {
333
- config.limits[key] = Number(value);
334
- return;
335
- }
336
- warnings.push(`Invalid scriptTransform.limits.${key}=${JSON.stringify(value)}; using ${DEFAULT_SCRIPT_TRANSFORM_LIMITS[key]}.`);
487
+ if (value === undefined) {
488
+ return;
489
+ }
490
+ const max = MAX_SCRIPT_TRANSFORM_LIMITS[key];
491
+ if (Number.isInteger(value) && Number(value) > 0 && Number(value) <= max) {
492
+ config.limits[key] = Number(value);
493
+ return;
494
+ }
495
+ warnings.push(
496
+ `Invalid scriptTransform.limits.${key}=${JSON.stringify(value)}; using ${DEFAULT_SCRIPT_TRANSFORM_LIMITS[key]}.`,
497
+ );
337
498
  }
338
499
  function applyStringEnum(config, warnings, value, key, path, allowed, fallback) {
339
- if (value === undefined) {
340
- return;
341
- }
342
- if (isStringIn(value, allowed)) {
343
- config[String(key)] = value;
344
- return;
345
- }
346
- warnings.push(`Invalid ${path}=${JSON.stringify(value)}; using ${fallback}.`);
500
+ if (value === undefined) {
501
+ return;
502
+ }
503
+ if (isStringIn(value, allowed)) {
504
+ config[String(key)] = value;
505
+ return;
506
+ }
507
+ warnings.push(`Invalid ${path}=${JSON.stringify(value)}; using ${fallback}.`);
347
508
  }
348
509
  function createDefaultObservedRoutingConfig() {
349
- return {
350
- enabled: DEFAULT_OBSERVED_ROUTING_CONFIG.enabled,
351
- onRoutingFailure: DEFAULT_OBSERVED_ROUTING_CONFIG.onRoutingFailure,
352
- mcp: { servers: {} },
353
- web: { ...DEFAULT_OBSERVED_ROUTING_CONFIG.web },
354
- fetch: { ...DEFAULT_OBSERVED_ROUTING_CONFIG.fetch },
355
- codeSearch: { ...DEFAULT_OBSERVED_ROUTING_CONFIG.codeSearch },
356
- };
510
+ return {
511
+ enabled: DEFAULT_OBSERVED_ROUTING_CONFIG.enabled,
512
+ onRoutingFailure: DEFAULT_OBSERVED_ROUTING_CONFIG.onRoutingFailure,
513
+ mcp: { servers: {} },
514
+ web: { ...DEFAULT_OBSERVED_ROUTING_CONFIG.web },
515
+ fetch: { ...DEFAULT_OBSERVED_ROUTING_CONFIG.fetch },
516
+ codeSearch: { ...DEFAULT_OBSERVED_ROUTING_CONFIG.codeSearch },
517
+ };
357
518
  }
358
519
  function applyObservedRoutingEnabled(config, warnings, value) {
359
- if (value === undefined) {
360
- return;
361
- }
362
- if (typeof value === "boolean") {
363
- config.enabled = value;
364
- return;
365
- }
366
- warnings.push(`Invalid observedRouting.enabled=${JSON.stringify(value)}; using ${DEFAULT_OBSERVED_ROUTING_CONFIG.enabled}.`);
520
+ if (value === undefined) {
521
+ return;
522
+ }
523
+ if (typeof value === "boolean") {
524
+ config.enabled = value;
525
+ return;
526
+ }
527
+ warnings.push(
528
+ `Invalid observedRouting.enabled=${JSON.stringify(value)}; using ${DEFAULT_OBSERVED_ROUTING_CONFIG.enabled}.`,
529
+ );
367
530
  }
368
531
  function applyObservedMcpConfig(config, warnings, value) {
369
- if (value === undefined) {
370
- return;
371
- }
372
- if (!isRecord(value)) {
373
- warnings.push("Invalid observedRouting.mcp; expected an object with explicit servers. MCP observed routing remains disabled.");
374
- return;
375
- }
376
- if (value.servers === undefined) {
377
- return;
378
- }
379
- if (!isRecord(value.servers)) {
380
- warnings.push("Invalid observedRouting.mcp.servers; expected an object keyed by MCP server id.");
381
- return;
382
- }
383
- for (const [serverId, serverConfig] of Object.entries(value.servers)) {
384
- const normalizedServerId = parseConfigString(serverId, "observedRouting.mcp.servers server id", warnings);
385
- if (!normalizedServerId) {
386
- continue;
387
- }
388
- config.mcp.servers[normalizedServerId] = parseObservedProducerConfig(serverConfig, `observedRouting.mcp.servers.${normalizedServerId}`, warnings);
389
- }
532
+ if (value === undefined) {
533
+ return;
534
+ }
535
+ if (!isRecord(value)) {
536
+ warnings.push(
537
+ "Invalid observedRouting.mcp; expected an object with explicit servers. MCP observed routing remains disabled.",
538
+ );
539
+ return;
540
+ }
541
+ if (value.servers === undefined) {
542
+ return;
543
+ }
544
+ if (!isRecord(value.servers)) {
545
+ warnings.push("Invalid observedRouting.mcp.servers; expected an object keyed by MCP server id.");
546
+ return;
547
+ }
548
+ for (const [serverId, serverConfig] of Object.entries(value.servers)) {
549
+ const normalizedServerId = parseConfigString(serverId, "observedRouting.mcp.servers server id", warnings);
550
+ if (!normalizedServerId) {
551
+ continue;
552
+ }
553
+ config.mcp.servers[normalizedServerId] = parseObservedProducerConfig(
554
+ serverConfig,
555
+ `observedRouting.mcp.servers.${normalizedServerId}`,
556
+ warnings,
557
+ );
558
+ }
390
559
  }
391
560
  function parseObservedProducerConfig(value, path, warnings) {
392
- const fallback = { enabled: false, persistence: DEFAULT_OBSERVED_ROUTING_PERSISTENCE };
393
- if (value === undefined || value === null) {
394
- return fallback;
395
- }
396
- if (!isRecord(value)) {
397
- warnings.push(`Invalid ${path}; expected an object with enabled and persistence. Observed routing remains disabled for this producer.`);
398
- return fallback;
399
- }
400
- const enabled = parseObservedProducerEnabled(value.enabled, path, warnings);
401
- const persistence = parseObservedPersistence(value.persistence, `${path}.persistence`, enabled, warnings);
402
- return { enabled, persistence };
561
+ const fallback = { enabled: false, persistence: DEFAULT_OBSERVED_ROUTING_PERSISTENCE };
562
+ if (value === undefined || value === null) {
563
+ return fallback;
564
+ }
565
+ if (!isRecord(value)) {
566
+ warnings.push(
567
+ `Invalid ${path}; expected an object with enabled and persistence. Observed routing remains disabled for this producer.`,
568
+ );
569
+ return fallback;
570
+ }
571
+ const enabled = parseObservedProducerEnabled(value.enabled, path, warnings);
572
+ const persistence = parseObservedPersistence(value.persistence, `${path}.persistence`, enabled, warnings);
573
+ return { enabled, persistence };
403
574
  }
404
575
  function parseObservedProducerEnabled(value, path, warnings) {
405
- if (value === undefined) {
406
- return false;
407
- }
408
- if (typeof value === "boolean") {
409
- return value;
410
- }
411
- warnings.push(`Invalid ${path}.enabled=${JSON.stringify(value)}; using false.`);
576
+ if (value === undefined) {
412
577
  return false;
578
+ }
579
+ if (typeof value === "boolean") {
580
+ return value;
581
+ }
582
+ warnings.push(`Invalid ${path}.enabled=${JSON.stringify(value)}; using false.`);
583
+ return false;
413
584
  }
414
585
  function parseObservedPersistence(value, path, enabled, warnings) {
415
- if (value === undefined) {
416
- if (enabled) {
417
- warnings.push(`Missing ${path}; setup must choose persistence explicitly. Using ${SAFE_OBSERVED_ROUTING_PERSISTENCE_FALLBACK}.`);
418
- return SAFE_OBSERVED_ROUTING_PERSISTENCE_FALLBACK;
419
- }
420
- return DEFAULT_OBSERVED_ROUTING_PERSISTENCE;
421
- }
422
- if (isStringIn(value, OBSERVED_ROUTING_PERSISTENCE_MODES)) {
423
- return value;
424
- }
425
- if (isStringIn(value, RESERVED_OBSERVED_ROUTING_PERSISTENCE_MODES)) {
426
- warnings.push(`Unsupported ${path}=${JSON.stringify(value)}; redacted persistence is reserved for future work. Using ${SAFE_OBSERVED_ROUTING_PERSISTENCE_FALLBACK}.`);
427
- return SAFE_OBSERVED_ROUTING_PERSISTENCE_FALLBACK;
428
- }
429
- const fallback = enabled ? SAFE_OBSERVED_ROUTING_PERSISTENCE_FALLBACK : DEFAULT_OBSERVED_ROUTING_PERSISTENCE;
430
- warnings.push(`Invalid ${path}=${JSON.stringify(value)}; expected exact, metadata-only, or none. Using ${fallback}.`);
431
- return fallback;
586
+ if (value === undefined) {
587
+ if (enabled) {
588
+ warnings.push(
589
+ `Missing ${path}; setup must choose persistence explicitly. Using ${SAFE_OBSERVED_ROUTING_PERSISTENCE_FALLBACK}.`,
590
+ );
591
+ return SAFE_OBSERVED_ROUTING_PERSISTENCE_FALLBACK;
592
+ }
593
+ return DEFAULT_OBSERVED_ROUTING_PERSISTENCE;
594
+ }
595
+ if (isStringIn(value, OBSERVED_ROUTING_PERSISTENCE_MODES)) {
596
+ return value;
597
+ }
598
+ if (isStringIn(value, RESERVED_OBSERVED_ROUTING_PERSISTENCE_MODES)) {
599
+ warnings.push(
600
+ `Unsupported ${path}=${JSON.stringify(value)}; redacted persistence is reserved for future work. Using ${SAFE_OBSERVED_ROUTING_PERSISTENCE_FALLBACK}.`,
601
+ );
602
+ return SAFE_OBSERVED_ROUTING_PERSISTENCE_FALLBACK;
603
+ }
604
+ const fallback = enabled ? SAFE_OBSERVED_ROUTING_PERSISTENCE_FALLBACK : DEFAULT_OBSERVED_ROUTING_PERSISTENCE;
605
+ warnings.push(`Invalid ${path}=${JSON.stringify(value)}; expected exact, metadata-only, or none. Using ${fallback}.`);
606
+ return fallback;
432
607
  }
433
608
  function parseConfigString(value, path, warnings) {
434
- if (typeof value !== "string" || value.trim().length === 0 || /[\u0000-\u001F\u007F-\u009F\u2028\u2029]/.test(value)) {
435
- warnings.push(`Invalid ${path}; expected a non-empty single-line string.`);
436
- return undefined;
437
- }
438
- return value.trim();
609
+ if (
610
+ typeof value !== "string" ||
611
+ value.trim().length === 0 ||
612
+ /[\u0000-\u001F\u007F-\u009F\u2028\u2029]/.test(value)
613
+ ) {
614
+ warnings.push(`Invalid ${path}; expected a non-empty single-line string.`);
615
+ return undefined;
616
+ }
617
+ return value.trim();
439
618
  }
440
619
  function isStringIn(value, allowed) {
441
- return typeof value === "string" && allowed.includes(value);
620
+ return typeof value === "string" && allowed.includes(value);
442
621
  }
443
- function parseStringArray(value, key, warnings) {
444
- if (!Array.isArray(value)) {
445
- warnings.push(`Invalid outputRouter.${key}; expected an array of strings.`);
446
- return undefined;
447
- }
448
- if (!value.every((item) => typeof item === "string")) {
449
- warnings.push(`Invalid outputRouter.${key}; expected an array of strings.`);
450
- return undefined;
451
- }
452
- return value;
622
+ function parseStringArray(value, path, warnings) {
623
+ if (!Array.isArray(value)) {
624
+ warnings.push(`Invalid ${path}; expected an array of strings.`);
625
+ return undefined;
626
+ }
627
+ if (!value.every((item) => typeof item === "string")) {
628
+ warnings.push(`Invalid ${path}; expected an array of strings.`);
629
+ return undefined;
630
+ }
631
+ return value;
453
632
  }