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