@hassangameryt/freeflow 0.2.0 → 0.3.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 (639) hide show
  1. package/.agents/plugins/marketplace.json +1 -1
  2. package/.claude-plugin/marketplace.json +2 -2
  3. package/{plugins/freeflow/.claude-plugin → .claude-plugin}/plugin.json +1 -1
  4. package/{plugins/freeflow/.codex-plugin → .codex-plugin}/plugin.json +1 -1
  5. package/README.md +19 -14
  6. package/assets/freeflow-plugin-icon.png +0 -0
  7. package/{plugins/freeflow/command-surface.json → command-surface.json} +10 -2
  8. package/evals/README.md +32 -0
  9. package/evals/fixtures/copy-conventions.md +31 -0
  10. package/evals/fixtures/output-router/README.md +12 -0
  11. package/evals/fixtures/output-router/failed-command-output.txt +9 -0
  12. package/evals/fixtures/output-router/large-router-manual.md +63 -0
  13. package/evals/fixtures/output-router/native-large-output.txt +40 -0
  14. package/evals/fixtures/output-router/noisy-test-output.txt +30 -0
  15. package/evals/fixtures/output-router/verification-output.txt +8 -0
  16. package/evals/fixtures/tiny-artifact-review-app/README.md +5 -0
  17. package/evals/fixtures/tiny-artifact-review-app/docs/billing-policy.md +10 -0
  18. package/evals/fixtures/tiny-artifact-review-app/docs/specs/billing-webhook-api-draft.md +21 -0
  19. package/evals/fixtures/tiny-artifact-review-app/docs/specs/failed-payment-grace-period.md +24 -0
  20. package/evals/fixtures/tiny-artifact-review-app/docs/specs/immediate-downgrade.md +17 -0
  21. package/evals/fixtures/tiny-artifact-review-app/tests/billing.test.md +8 -0
  22. package/evals/fixtures/tiny-commit-ambiguous-app/.freeflow-eval-setup.sh +15 -0
  23. package/evals/fixtures/tiny-commit-ambiguous-app/README.md +3 -0
  24. package/evals/fixtures/tiny-commit-ambiguous-app/src/billing.ts +5 -0
  25. package/evals/fixtures/tiny-commit-ambiguous-app/src/settings-page.ts +1 -0
  26. package/evals/fixtures/tiny-commit-ambiguous-app/tests/settings.test.md +5 -0
  27. package/evals/fixtures/tiny-commit-app/.freeflow-eval-setup.sh +14 -0
  28. package/evals/fixtures/tiny-commit-app/README.md +3 -0
  29. package/evals/fixtures/tiny-commit-app/docs/specs/settings-title.md +5 -0
  30. package/evals/fixtures/tiny-commit-app/src/billing.ts +5 -0
  31. package/evals/fixtures/tiny-commit-app/src/settings-page.ts +1 -0
  32. package/evals/fixtures/tiny-commit-app/tests/settings.test.md +5 -0
  33. package/evals/fixtures/tiny-commit-everything-app/.freeflow-eval-setup.sh +15 -0
  34. package/evals/fixtures/tiny-commit-everything-app/README.md +3 -0
  35. package/evals/fixtures/tiny-commit-everything-app/docs/specs/settings-title.md +5 -0
  36. package/evals/fixtures/tiny-commit-everything-app/src/billing.ts +5 -0
  37. package/evals/fixtures/tiny-commit-everything-app/src/settings-page.ts +1 -0
  38. package/evals/fixtures/tiny-commit-everything-app/tests/settings.test.md +5 -0
  39. package/evals/fixtures/tiny-commit-staged-app/.freeflow-eval-setup.sh +15 -0
  40. package/evals/fixtures/tiny-commit-staged-app/README.md +3 -0
  41. package/evals/fixtures/tiny-commit-staged-app/docs/specs/settings-title.md +5 -0
  42. package/evals/fixtures/tiny-commit-staged-app/src/billing.ts +5 -0
  43. package/evals/fixtures/tiny-commit-staged-app/src/settings-page.ts +1 -0
  44. package/evals/fixtures/tiny-commit-staged-app/tests/settings.test.md +5 -0
  45. package/evals/fixtures/tiny-commit-staged-mixed-app/.freeflow-eval-setup.sh +15 -0
  46. package/evals/fixtures/tiny-commit-staged-mixed-app/README.md +3 -0
  47. package/evals/fixtures/tiny-commit-staged-mixed-app/docs/billing-policy.md +3 -0
  48. package/evals/fixtures/tiny-commit-staged-mixed-app/docs/release-notes.md +3 -0
  49. package/evals/fixtures/tiny-commit-staged-mixed-app/src/billing.ts +5 -0
  50. package/evals/fixtures/tiny-dashboard-stale-app/README.md +11 -0
  51. package/evals/fixtures/tiny-dashboard-stale-app/src/api-client.ts +13 -0
  52. package/evals/fixtures/tiny-dashboard-stale-app/src/dashboard-data.ts +19 -0
  53. package/evals/fixtures/tiny-dashboard-stale-app/tests/dashboard-data.test.md +9 -0
  54. package/evals/fixtures/tiny-decision-destination-app/README.md +6 -0
  55. package/evals/fixtures/tiny-decision-destination-app/src/risk.ts +8 -0
  56. package/evals/fixtures/tiny-decision-destination-app/tests/risk.test.md +4 -0
  57. package/evals/fixtures/tiny-design-depth-app/README.md +15 -0
  58. package/evals/fixtures/tiny-design-depth-app/src/routes.ts +25 -0
  59. package/evals/fixtures/tiny-design-depth-app/src/sendEmail.ts +3 -0
  60. package/evals/fixtures/tiny-design-depth-app/src/sendSms.ts +3 -0
  61. package/evals/fixtures/tiny-design-depth-app/src/telemetry.ts +3 -0
  62. package/evals/fixtures/tiny-design-depth-app/tests/routes.test.md +12 -0
  63. package/evals/fixtures/tiny-eval-method-app/README.md +8 -0
  64. package/evals/fixtures/tiny-eval-method-app/evals/reports/review-pr-eval-result.md +5 -0
  65. package/evals/fixtures/tiny-eval-method-app/evals/reports/triage-question-failure.md +17 -0
  66. package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.diff +11 -0
  67. package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.md +3 -0
  68. package/evals/fixtures/tiny-eval-method-app/skills/review-pr/SKILL.md +10 -0
  69. package/evals/fixtures/tiny-eval-method-app/skills/triage-question/SKILL.md +10 -0
  70. package/evals/fixtures/tiny-execute-plan-app/README.md +5 -0
  71. package/evals/fixtures/tiny-execute-plan-app/checks/settings-and-billing-check.sh +5 -0
  72. package/evals/fixtures/tiny-execute-plan-app/docs/billing-policy.md +10 -0
  73. package/evals/fixtures/tiny-execute-plan-app/docs/plans/immediate-downgrade-plan.md +11 -0
  74. package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-plan.md +12 -0
  75. package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-with-bad-check.md +15 -0
  76. package/evals/fixtures/tiny-execute-plan-app/docs/plans/unverified-billing-plan.md +9 -0
  77. package/evals/fixtures/tiny-execute-plan-app/docs/specs/failed-payment-grace-period.md +9 -0
  78. package/evals/fixtures/tiny-execute-plan-app/docs/specs/settings-title.md +9 -0
  79. package/evals/fixtures/tiny-execute-plan-app/src/billing.ts +7 -0
  80. package/evals/fixtures/tiny-execute-plan-app/src/settings-page.ts +1 -0
  81. package/evals/fixtures/tiny-execute-plan-app/tests/billing.test.md +7 -0
  82. package/evals/fixtures/tiny-execute-plan-app/tests/settings.test.md +5 -0
  83. package/evals/fixtures/tiny-execute-review-loop-app/README.md +5 -0
  84. package/evals/fixtures/tiny-execute-review-loop-app/docs/billing-policy.md +9 -0
  85. package/evals/fixtures/tiny-execute-review-loop-app/docs/plans/settings-title-plan.md +12 -0
  86. package/evals/fixtures/tiny-execute-review-loop-app/docs/review/previous-agent-summary.md +15 -0
  87. package/evals/fixtures/tiny-execute-review-loop-app/docs/review/review-pass-1-non-pass.md +11 -0
  88. package/evals/fixtures/tiny-execute-review-loop-app/docs/specs/settings-title.md +9 -0
  89. package/evals/fixtures/tiny-execute-review-loop-app/src/billing.ts +7 -0
  90. package/evals/fixtures/tiny-execute-review-loop-app/src/settings-page.ts +1 -0
  91. package/evals/fixtures/tiny-execute-review-loop-app/tests/billing.test.md +7 -0
  92. package/evals/fixtures/tiny-execute-review-loop-app/tests/settings.test.md +5 -0
  93. package/evals/fixtures/tiny-flaky-session-app/README.md +10 -0
  94. package/evals/fixtures/tiny-flaky-session-app/src/session-timeout.ts +13 -0
  95. package/evals/fixtures/tiny-flaky-session-app/tests/session-timeout.test.md +8 -0
  96. package/evals/fixtures/tiny-handoff-app/README.md +5 -0
  97. package/evals/fixtures/tiny-handoff-app/docs/billing-policy.md +10 -0
  98. package/evals/fixtures/tiny-handoff-app/docs/handoffs/old-agent-handoff.md +8 -0
  99. package/evals/fixtures/tiny-handoff-app/docs/plans/billing-retry-plan.md +11 -0
  100. package/evals/fixtures/tiny-handoff-app/src/billing.ts +7 -0
  101. package/evals/fixtures/tiny-handoff-report-app/README.md +3 -0
  102. package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.diff +1 -0
  103. package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.md +1 -0
  104. package/evals/fixtures/tiny-handoff-report-app/evals/scores/hof-003-score.txt +4 -0
  105. package/evals/fixtures/tiny-plan-app/README.md +5 -0
  106. package/evals/fixtures/tiny-plan-app/docs/billing-policy.md +10 -0
  107. package/evals/fixtures/tiny-plan-app/docs/specs/failed-payment-grace-period.md +25 -0
  108. package/evals/fixtures/tiny-plan-app/src/billing.ts +17 -0
  109. package/evals/fixtures/tiny-plan-app/src/settings-page.ts +1 -0
  110. package/evals/fixtures/tiny-plan-app/tests/billing.test.md +8 -0
  111. package/evals/fixtures/tiny-plan-app/tests/settings.test.md +5 -0
  112. package/evals/fixtures/tiny-plan-strict-api-app/README.md +3 -0
  113. package/evals/fixtures/tiny-plan-strict-api-app/docs/billing-policy.md +5 -0
  114. package/evals/fixtures/tiny-plan-strict-api-app/docs/specs/billing-webhook-api.md +25 -0
  115. package/evals/fixtures/tiny-plan-strict-api-app/src/billing.ts +5 -0
  116. package/evals/fixtures/tiny-plan-strict-api-app/src/webhooks.ts +3 -0
  117. package/evals/fixtures/tiny-plan-strict-api-app/tests/billing-webhook.test.md +8 -0
  118. package/evals/fixtures/tiny-post-setup-invalid-config-app/.freeflow/config.json +3 -0
  119. package/evals/fixtures/tiny-post-setup-invalid-config-app/AGENTS.md +15 -0
  120. package/evals/fixtures/tiny-post-setup-invalid-config-app/README.md +16 -0
  121. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/auth-review.md +15 -0
  122. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/billing-policy.md +10 -0
  123. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/copy-conventions.md +15 -0
  124. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/auth-middleware.ts +12 -0
  125. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/billing.ts +20 -0
  126. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/login-copy.ts +1 -0
  127. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/settings-page.ts +1 -0
  128. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/auth-middleware.test.md +8 -0
  129. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/billing.test.md +8 -0
  130. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/copy.test.md +7 -0
  131. package/evals/fixtures/tiny-post-setup-missing-config-app/AGENTS.md +15 -0
  132. package/evals/fixtures/tiny-post-setup-missing-config-app/README.md +16 -0
  133. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/auth-review.md +15 -0
  134. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/billing-policy.md +10 -0
  135. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/copy-conventions.md +15 -0
  136. package/evals/fixtures/tiny-post-setup-missing-config-app/src/auth-middleware.ts +12 -0
  137. package/evals/fixtures/tiny-post-setup-missing-config-app/src/billing.ts +20 -0
  138. package/evals/fixtures/tiny-post-setup-missing-config-app/src/login-copy.ts +1 -0
  139. package/evals/fixtures/tiny-post-setup-missing-config-app/src/settings-page.ts +1 -0
  140. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/auth-middleware.test.md +8 -0
  141. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/billing.test.md +8 -0
  142. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/copy.test.md +7 -0
  143. package/evals/fixtures/tiny-post-setup-source-conflict-app/.freeflow/config.json +3 -0
  144. package/evals/fixtures/tiny-post-setup-source-conflict-app/AGENTS.md +15 -0
  145. package/evals/fixtures/tiny-post-setup-source-conflict-app/README.md +16 -0
  146. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/auth-review.md +15 -0
  147. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/billing-policy.md +10 -0
  148. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/copy-conventions.md +15 -0
  149. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/auth-middleware.ts +12 -0
  150. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/billing.ts +20 -0
  151. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/login-copy.ts +1 -0
  152. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/settings-page.ts +1 -0
  153. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/auth-middleware.test.md +8 -0
  154. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/billing.test.md +8 -0
  155. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/copy.test.md +7 -0
  156. package/evals/fixtures/tiny-report-performance-app/README.md +11 -0
  157. package/evals/fixtures/tiny-report-performance-app/docs/performance.md +10 -0
  158. package/evals/fixtures/tiny-report-performance-app/src/report-summary.ts +29 -0
  159. package/evals/fixtures/tiny-report-performance-app/tests/report-performance.test.md +8 -0
  160. package/evals/fixtures/tiny-review-request-app/README.md +3 -0
  161. package/evals/fixtures/tiny-review-request-app/docs/billing-policy.md +5 -0
  162. package/evals/fixtures/tiny-review-request-app/docs/plans/billing-webhook-api.md +19 -0
  163. package/evals/fixtures/tiny-review-request-app/docs/review/previous-agent-summary.md +20 -0
  164. package/evals/fixtures/tiny-review-request-app/docs/specs/billing-webhook-api.md +25 -0
  165. package/evals/fixtures/tiny-review-request-app/src/billing.ts +11 -0
  166. package/evals/fixtures/tiny-review-request-app/src/webhooks.ts +19 -0
  167. package/evals/fixtures/tiny-review-request-app/tests/billing-webhook.test.md +8 -0
  168. package/evals/fixtures/tiny-review-work-app/README.md +5 -0
  169. package/evals/fixtures/tiny-review-work-app/docs/billing-policy.md +9 -0
  170. package/evals/fixtures/tiny-review-work-app/docs/plans/settings-title-plan.md +12 -0
  171. package/evals/fixtures/tiny-review-work-app/docs/review/previous-agent-summary.md +15 -0
  172. package/evals/fixtures/tiny-review-work-app/docs/specs/settings-title.md +9 -0
  173. package/evals/fixtures/tiny-review-work-app/src/billing.ts +7 -0
  174. package/evals/fixtures/tiny-review-work-app/src/settings-page.ts +1 -0
  175. package/evals/fixtures/tiny-review-work-app/tests/billing.test.md +7 -0
  176. package/evals/fixtures/tiny-review-work-app/tests/settings.test.md +5 -0
  177. package/evals/fixtures/tiny-saas-app/README.md +16 -0
  178. package/evals/fixtures/tiny-saas-app/docs/auth-review.md +15 -0
  179. package/evals/fixtures/tiny-saas-app/docs/billing-policy.md +10 -0
  180. package/evals/fixtures/tiny-saas-app/docs/copy-conventions.md +15 -0
  181. package/evals/fixtures/tiny-saas-app/docs/specs/settings-title.md +13 -0
  182. package/evals/fixtures/tiny-saas-app/src/auth-middleware.ts +12 -0
  183. package/evals/fixtures/tiny-saas-app/src/billing.ts +20 -0
  184. package/evals/fixtures/tiny-saas-app/src/login-copy.ts +1 -0
  185. package/evals/fixtures/tiny-saas-app/src/settings-page.ts +1 -0
  186. package/evals/fixtures/tiny-saas-app/tests/auth-middleware.test.md +8 -0
  187. package/evals/fixtures/tiny-saas-app/tests/billing.test.md +8 -0
  188. package/evals/fixtures/tiny-saas-app/tests/copy.test.md +7 -0
  189. package/evals/fixtures/tiny-setup-agents-app/AGENTS.md +6 -0
  190. package/evals/fixtures/tiny-setup-both-app/AGENTS.md +5 -0
  191. package/evals/fixtures/tiny-setup-both-app/CLAUDE.md +5 -0
  192. package/evals/fixtures/tiny-setup-claude-app/CLAUDE.md +6 -0
  193. package/evals/fixtures/tiny-setup-codex-rules-app/.codex/rules/shell.rules +5 -0
  194. package/evals/fixtures/tiny-setup-codex-rules-app/AGENTS.md +6 -0
  195. package/evals/fixtures/tiny-setup-conflict-app/AGENTS.md +6 -0
  196. package/evals/fixtures/tiny-setup-existing-block-app/AGENTS.md +14 -0
  197. package/evals/fixtures/tiny-setup-four-rules-app/CLAUDE.md +6 -0
  198. package/evals/fixtures/tiny-skill-dev-app/README.md +10 -0
  199. package/evals/fixtures/tiny-skill-dev-app/evals/prompts/review-pr-001.txt +8 -0
  200. package/evals/fixtures/tiny-skill-dev-app/evals/reports/review-pr-failure.md +17 -0
  201. package/evals/fixtures/tiny-skill-dev-app/skills/review-pr/SKILL.md +13 -0
  202. package/evals/fixtures/tiny-team-app/README.md +5 -0
  203. package/evals/fixtures/tiny-team-app/docs/product.md +6 -0
  204. package/evals/fixtures/tiny-team-app/src/teams.ts +9 -0
  205. package/evals/fixtures/tiny-team-app/src/users.ts +5 -0
  206. package/evals/fixtures/tiny-team-app/tests/teams.test.md +7 -0
  207. package/evals/fixtures/tiny-verify-app/README.md +5 -0
  208. package/evals/fixtures/tiny-verify-app/src/settings-nav.ts +1 -0
  209. package/evals/fixtures/tiny-verify-app/src/settings-page.ts +1 -0
  210. package/evals/fixtures/tiny-verify-app/tests/settings.test.md +7 -0
  211. package/evals/prompts/aon-001.txt +2 -0
  212. package/evals/prompts/byp-001.txt +2 -0
  213. package/evals/prompts/byp-002.txt +2 -0
  214. package/evals/prompts/cap-001.txt +3 -0
  215. package/evals/prompts/cap-002.txt +3 -0
  216. package/evals/prompts/cmd-001.txt +3 -0
  217. package/evals/prompts/cmd-002.txt +3 -0
  218. package/evals/prompts/cmd-003.txt +6 -0
  219. package/evals/prompts/cmd-004.txt +5 -0
  220. package/evals/prompts/cmd-005.txt +5 -0
  221. package/evals/prompts/cmd-006.txt +5 -0
  222. package/evals/prompts/cmd-007.txt +5 -0
  223. package/evals/prompts/cmd-008.txt +5 -0
  224. package/evals/prompts/cmd-009.txt +8 -0
  225. package/evals/prompts/cmd-010.txt +5 -0
  226. package/evals/prompts/cmd-011.txt +5 -0
  227. package/evals/prompts/cmd-012.txt +5 -0
  228. package/evals/prompts/cmd-013.txt +5 -0
  229. package/evals/prompts/cmd-014.txt +7 -0
  230. package/evals/prompts/cmd-015.txt +7 -0
  231. package/evals/prompts/cmd-016.txt +5 -0
  232. package/evals/prompts/cmt-001.txt +1 -0
  233. package/evals/prompts/cmt-002.txt +1 -0
  234. package/evals/prompts/cmt-003.txt +1 -0
  235. package/evals/prompts/cmt-004.txt +1 -0
  236. package/evals/prompts/cmt-005.txt +1 -0
  237. package/evals/prompts/dfd-001.txt +3 -0
  238. package/evals/prompts/dia-001.txt +3 -0
  239. package/evals/prompts/dia-002.txt +3 -0
  240. package/evals/prompts/dia-003.txt +3 -0
  241. package/evals/prompts/dis-001.txt +5 -0
  242. package/evals/prompts/dis-002.txt +5 -0
  243. package/evals/prompts/esk-001.txt +5 -0
  244. package/evals/prompts/esk-002.txt +5 -0
  245. package/evals/prompts/esk-003.txt +5 -0
  246. package/evals/prompts/grc-001.txt +3 -0
  247. package/evals/prompts/hof-001.txt +3 -0
  248. package/evals/prompts/hof-002.txt +1 -0
  249. package/evals/prompts/hof-003.txt +1 -0
  250. package/evals/prompts/hof-004.txt +1 -0
  251. package/evals/prompts/hof-005.txt +1 -0
  252. package/evals/prompts/ivg-001.txt +1 -0
  253. package/evals/prompts/ivg-002.txt +11 -0
  254. package/evals/prompts/ivg-003.txt +1 -0
  255. package/evals/prompts/ivg-004.txt +1 -0
  256. package/evals/prompts/mode-001.txt +3 -0
  257. package/evals/prompts/mode-002.txt +1 -0
  258. package/evals/prompts/mode-003.txt +3 -0
  259. package/evals/prompts/mode-004.txt +3 -0
  260. package/evals/prompts/mode-005.txt +3 -0
  261. package/evals/prompts/mode-006.txt +3 -0
  262. package/evals/prompts/mode-007.txt +3 -0
  263. package/evals/prompts/otr-001.txt +3 -0
  264. package/evals/prompts/otr-002.txt +3 -0
  265. package/evals/prompts/rar-001.txt +5 -0
  266. package/evals/prompts/rar-002.txt +3 -0
  267. package/evals/prompts/rar-003.txt +6 -0
  268. package/evals/prompts/rar-004.txt +15 -0
  269. package/evals/prompts/rar-005.txt +10 -0
  270. package/evals/prompts/rbr-001.txt +3 -0
  271. package/evals/prompts/rbr-002.txt +3 -0
  272. package/evals/prompts/rbr-003.txt +7 -0
  273. package/evals/prompts/rev-001.txt +3 -0
  274. package/evals/prompts/rev-002.txt +5 -0
  275. package/evals/prompts/rev-003.txt +6 -0
  276. package/evals/prompts/rev-004.txt +1 -0
  277. package/evals/prompts/rev-005.txt +15 -0
  278. package/evals/prompts/rev-006.txt +5 -0
  279. package/evals/prompts/stp-001.txt +1 -0
  280. package/evals/prompts/stp-002.txt +1 -0
  281. package/evals/prompts/stp-003.txt +1 -0
  282. package/evals/prompts/stp-004.txt +1 -0
  283. package/evals/prompts/stp-005.txt +1 -0
  284. package/evals/prompts/stp-006.txt +1 -0
  285. package/evals/prompts/stp-007.txt +1 -0
  286. package/evals/prompts/stp-008.txt +1 -0
  287. package/evals/prompts/stp-009.txt +1 -0
  288. package/evals/prompts/stp-010.txt +1 -0
  289. package/evals/prompts/stp-011.txt +1 -0
  290. package/evals/prompts/vfy-003.txt +1 -0
  291. package/evals/prompts/wpl-001.txt +3 -0
  292. package/evals/prompts/wpl-002.txt +5 -0
  293. package/evals/prompts/wpl-003.txt +3 -0
  294. package/evals/prompts/wpl-004.txt +5 -0
  295. package/evals/prompts/wpl-005.txt +1 -0
  296. package/evals/prompts/wrc-001.txt +10 -0
  297. package/evals/prompts/wrc-002.txt +3 -0
  298. package/evals/prompts/wsk-001.txt +6 -0
  299. package/evals/prompts/wsp-001.txt +5 -0
  300. package/evals/prompts/wsp-002.txt +15 -0
  301. package/evals/prompts/wsp-003.txt +3 -0
  302. package/evals/prompts/wsp-004.txt +15 -0
  303. package/evals/prompts/wsp-005.txt +5 -0
  304. package/evals/prompts/wsp-006.txt +12 -0
  305. package/evals/prompts/wsp-007.txt +9 -0
  306. package/evals/prompts/wsp-008.txt +13 -0
  307. package/evals/prompts/xpl-001.txt +1 -0
  308. package/evals/prompts/xpl-002.txt +3 -0
  309. package/evals/prompts/xpl-003.txt +3 -0
  310. package/evals/prompts/xpl-004.txt +3 -0
  311. package/evals/prompts/xpl-005.txt +5 -0
  312. package/evals/prompts/xpl-006.txt +3 -0
  313. package/evals/registries/adversarial-evals.json +39 -0
  314. package/evals/registries/fixture-evals.json +2513 -0
  315. package/evals/registries/handoff-evals.json +74 -0
  316. package/evals/registries/legacy-evals.json +147 -0
  317. package/evals/registries/skill-evidence.json +193 -0
  318. package/evals/registries/verify-work-evals.json +46 -0
  319. package/evals/reports/acceptance/v0.1-acceptance-report.md +130 -0
  320. package/evals/reports/by-command-surface/command-surface-1-report.md +45 -0
  321. package/evals/reports/by-command-surface/command-surface-10-report.md +76 -0
  322. package/evals/reports/by-command-surface/command-surface-11-report.md +77 -0
  323. package/evals/reports/by-command-surface/command-surface-12-report.md +91 -0
  324. package/evals/reports/by-command-surface/command-surface-13-report.md +64 -0
  325. package/evals/reports/by-command-surface/command-surface-14-report.md +66 -0
  326. package/evals/reports/by-command-surface/command-surface-15-report.md +124 -0
  327. package/evals/reports/by-command-surface/command-surface-16-report.md +39 -0
  328. package/evals/reports/by-command-surface/command-surface-2-report.md +80 -0
  329. package/evals/reports/by-command-surface/command-surface-3-report.md +86 -0
  330. package/evals/reports/by-command-surface/command-surface-4-report.md +76 -0
  331. package/evals/reports/by-command-surface/command-surface-5-report.md +80 -0
  332. package/evals/reports/by-command-surface/command-surface-6-report.md +74 -0
  333. package/evals/reports/by-command-surface/command-surface-7-report.md +84 -0
  334. package/evals/reports/by-command-surface/command-surface-8-report.md +79 -0
  335. package/evals/reports/by-command-surface/command-surface-9-report.md +79 -0
  336. package/evals/reports/by-command-surface/command-surface-matrix.md +91 -0
  337. package/evals/reports/by-skill/bypass-1-report.md +124 -0
  338. package/evals/reports/by-skill/capture-decisions-1-report.md +99 -0
  339. package/evals/reports/by-skill/capture-decisions-2-report.md +102 -0
  340. package/evals/reports/by-skill/commit-work-1-report.md +165 -0
  341. package/evals/reports/by-skill/commit-work-2-report.md +109 -0
  342. package/evals/reports/by-skill/design-for-depth-1-report.md +95 -0
  343. package/evals/reports/by-skill/diagnose-failure-1-report.md +91 -0
  344. package/evals/reports/by-skill/diagnose-failure-2-report.md +94 -0
  345. package/evals/reports/by-skill/discover-1-report.md +118 -0
  346. package/evals/reports/by-skill/evaluate-skill-2-report.md +71 -0
  347. package/evals/reports/by-skill/execute-plan-1-report.md +103 -0
  348. package/evals/reports/by-skill/execute-plan-2-report.md +112 -0
  349. package/evals/reports/by-skill/execute-plan-3-report.md +87 -0
  350. package/evals/reports/by-skill/grill-context-1-report.md +103 -0
  351. package/evals/reports/by-skill/handoff-1-report.md +123 -0
  352. package/evals/reports/by-skill/handoff-2-report.md +105 -0
  353. package/evals/reports/by-skill/handoff-3-report.md +100 -0
  354. package/evals/reports/by-skill/handoff-7-report.md +77 -0
  355. package/evals/reports/by-skill/interview-gate-1-report.md +63 -0
  356. package/evals/reports/by-skill/interview-gate-2-report.md +105 -0
  357. package/evals/reports/by-skill/mode-contract-1-report.md +74 -0
  358. package/evals/reports/by-skill/mode-contract-2-report.md +87 -0
  359. package/evals/reports/by-skill/mode-contract-3-report.md +65 -0
  360. package/evals/reports/by-skill/mode-contract-4-report.md +71 -0
  361. package/evals/reports/by-skill/mode-contract-5-report.md +70 -0
  362. package/evals/reports/by-skill/output-router-1-report.md +76 -0
  363. package/evals/reports/by-skill/output-router-2-report.md +65 -0
  364. package/evals/reports/by-skill/research-1-report.md +144 -0
  365. package/evals/reports/by-skill/research-brief-1-report.md +94 -0
  366. package/evals/reports/by-skill/research-brief-2-report.md +75 -0
  367. package/evals/reports/by-skill/review-artifact-1-report.md +91 -0
  368. package/evals/reports/by-skill/review-artifact-2-report.md +79 -0
  369. package/evals/reports/by-skill/review-artifact-3-report.md +120 -0
  370. package/evals/reports/by-skill/review-artifact-4-report.md +89 -0
  371. package/evals/reports/by-skill/review-artifact-5-report.md +66 -0
  372. package/evals/reports/by-skill/review-work-1-report.md +85 -0
  373. package/evals/reports/by-skill/review-work-2-report.md +87 -0
  374. package/evals/reports/by-skill/review-work-3-report.md +104 -0
  375. package/evals/reports/by-skill/review-work-4-report.md +108 -0
  376. package/evals/reports/by-skill/review-work-5-report.md +73 -0
  377. package/evals/reports/by-skill/review-work-6-report.md +66 -0
  378. package/evals/reports/by-skill/setup-freeflow-1-report.md +199 -0
  379. package/evals/reports/by-skill/setup-freeflow-2-report.md +105 -0
  380. package/evals/reports/by-skill/setup-freeflow-3-report.md +105 -0
  381. package/evals/reports/by-skill/setup-freeflow-4-report.md +88 -0
  382. package/evals/reports/by-skill/setup-freeflow-5-report.md +115 -0
  383. package/evals/reports/by-skill/skill-authoring-1-report.md +81 -0
  384. package/evals/reports/by-skill/verify-work-1-report.md +111 -0
  385. package/evals/reports/by-skill/verify-work-2-report.md +120 -0
  386. package/evals/reports/by-skill/workflow-1-report.md +65 -0
  387. package/evals/reports/by-skill/write-plan-1-report.md +123 -0
  388. package/evals/reports/by-skill/write-plan-2-report.md +98 -0
  389. package/evals/reports/by-skill/write-plan-3-report.md +110 -0
  390. package/evals/reports/by-skill/write-spec-1-report.md +88 -0
  391. package/evals/reports/by-skill/write-spec-2-report.md +89 -0
  392. package/evals/reports/by-skill/write-spec-3-report.md +90 -0
  393. package/evals/reports/by-skill/write-spec-4-report.md +167 -0
  394. package/evals/reports/harness/claude-harness-1-report.md +103 -0
  395. package/evals/reports/harness/eval-harness-1-report.md +91 -0
  396. package/evals/reports/iterations/iteration-1-report.md +71 -0
  397. package/evals/reports/iterations/iteration-2-report.md +78 -0
  398. package/evals/reports/iterations/iteration-3-report.md +118 -0
  399. package/evals/reports/iterations/iteration-4-report.md +131 -0
  400. package/evals/reports/iterations/iteration-5-report.md +149 -0
  401. package/evals/reports/iterations/iteration-6-report.md +136 -0
  402. package/evals/reports/runtime/always-on-runtime-1-report.md +107 -0
  403. package/evals/reports/runtime/context-mode-normalized-benchmark-1-report.md +52 -0
  404. package/evals/reports/runtime/context-mode-real-deep-baseline-1-report.md +410 -0
  405. package/evals/reports/runtime/context-mode-real-deep-final-slice-11-report.md +203 -0
  406. package/evals/reports/runtime/context-mode-real-deep-final-slice-11-review.md +51 -0
  407. package/evals/reports/runtime/context-saving-native-tools-baseline-1-report.md +99 -0
  408. package/evals/reports/runtime/eryx-python-compatibility-reprobe-1-report.md +166 -0
  409. package/evals/reports/runtime/eryx-python-proof-spike-1-report.md +96 -0
  410. package/evals/reports/runtime/eryx-python-proof-spike-2-report.md +151 -0
  411. package/evals/reports/runtime/eryx-python-script-derive-execution-1-report.md +233 -0
  412. package/evals/reports/runtime/jq-script-derive-execution-1-report.md +215 -0
  413. package/evals/reports/runtime/jq-wasm-proof-spike-1-report.md +67 -0
  414. package/evals/reports/runtime/output-router-benchmark-1-report.md +81 -0
  415. package/evals/reports/runtime/output-router-capture-derive-provider-eval-1-report.md +35 -0
  416. package/evals/reports/runtime/output-router-codex-large-index-sqlite-adhoc-report.md +150 -0
  417. package/evals/reports/runtime/output-router-codex-qa-benchmark-1-report.md +46 -0
  418. package/evals/reports/runtime/output-router-command-benchmark-1-report.md +62 -0
  419. package/evals/reports/runtime/output-router-index-benchmark-1-report.md +64 -0
  420. package/evals/reports/runtime/output-router-regression-1-report.md +81 -0
  421. package/evals/reports/runtime/output-router-transform-eval-1-report.md +28 -0
  422. package/evals/reports/runtime/pi-observed-routing-eval-1-report.md +44 -0
  423. package/evals/reports/runtime/quickjs-script-derive-execution-1-report.md +159 -0
  424. package/evals/reports/runtime/quickjs-wasi-proof-spike-1-report.md +55 -0
  425. package/evals/reports/runtime/render-format-row-protocol-1-report.md +58 -0
  426. package/evals/reports/runtime/script-sandbox-adapter-selection-review-1-report.md +84 -0
  427. package/evals/reports/runtime/script-sandbox-probe-resource-hardening-1-report.md +51 -0
  428. package/evals/reports/runtime/storage-policy-benchmark-1-report.md +176 -0
  429. package/evals/reports/runtime/vault-index-storage-spike-1-report.md +39 -0
  430. package/evals/reports/runtime/workflow-context-hook-1-report.md +82 -0
  431. package/evals/runbooks/adversarial-eval-runbook.md +28 -0
  432. package/evals/runbooks/fixture-eval-runbook.md +137 -0
  433. package/evals/runbooks/handoff-eval-runbook.md +22 -0
  434. package/evals/runbooks/verify-work-eval-runbook.md +27 -0
  435. package/evals/scripts/audit-command-surface.sh +160 -0
  436. package/evals/scripts/check-activation-contract.sh +121 -0
  437. package/evals/scripts/check-runtime-context-hook.sh +183 -0
  438. package/evals/scripts/grade-fixture-eval.sh +446 -0
  439. package/evals/scripts/run-claude-fixture-eval.sh +26 -0
  440. package/evals/scripts/run-codex-fixture-eval.sh +26 -0
  441. package/evals/scripts/run-eryx-python-proof-spike.js +559 -0
  442. package/evals/scripts/run-fixture-eval-by-id.sh +23 -0
  443. package/evals/scripts/run-fixture-eval.sh +464 -0
  444. package/evals/scripts/run-jq-wasm-proof-spike.js +299 -0
  445. package/evals/scripts/run-output-router-transform-eval.js +115 -0
  446. package/evals/scripts/run-pi-observed-routing-eval.js +478 -0
  447. package/evals/scripts/run-quickjs-wasi-proof-spike.js +339 -0
  448. package/evals/scripts/skill-evidence.sh +316 -0
  449. package/evals/scripts/validate-release-metadata.sh +486 -0
  450. package/evals/suites/v0.1-acceptance-suite.md +131 -0
  451. package/{plugins/freeflow/hooks → hooks}/freeflow-runtime-context.mjs +46 -12
  452. package/package.json +39 -19
  453. package/pi-extension/dist/host-producer-identification.js +186 -0
  454. package/pi-extension/dist/index.js +85 -0
  455. package/pi-extension/dist/mcp-config.js +30 -0
  456. package/pi-extension/dist/native-safety-net.js +209 -0
  457. package/pi-extension/dist/observed-tool-routing.js +114 -0
  458. package/pi-extension/dist/renderers.js +835 -0
  459. package/pi-extension/dist/router-tools.js +438 -0
  460. package/pi-extension/dist/runtime-context.js +288 -0
  461. package/pi-extension/dist/schemas.js +254 -0
  462. package/pi-extension/dist/status.js +449 -0
  463. package/pi-extension/dist/utils.js +467 -0
  464. package/pi-extension/src/host-producer-identification.ts +226 -0
  465. package/pi-extension/src/index.ts +121 -0
  466. package/pi-extension/src/mcp-config.ts +32 -0
  467. package/pi-extension/src/native-safety-net.ts +252 -0
  468. package/pi-extension/src/observed-tool-routing.ts +126 -0
  469. package/pi-extension/src/renderers.ts +917 -0
  470. package/pi-extension/src/router-tools.ts +478 -0
  471. package/pi-extension/src/runtime-context.ts +347 -0
  472. package/pi-extension/src/schemas.ts +259 -0
  473. package/pi-extension/src/status.ts +505 -0
  474. package/pi-extension/src/utils.ts +492 -0
  475. package/pi-extension/tsconfig.json +16 -0
  476. package/{plugins/freeflow/docs → plugin-docs}/README.md +3 -3
  477. package/plugin-docs/adr/0002-evals-before-hooks.md +17 -0
  478. package/{plugins/freeflow/docs → plugin-docs}/adr/0003-release-boundary.md +2 -2
  479. package/plugin-docs/adr/0004-discover-replaces-shallow-discovery-skills.md +26 -0
  480. package/plugin-docs/adr/README.md +10 -0
  481. package/plugin-docs/architecture.md +89 -0
  482. package/plugin-docs/output-router.md +396 -0
  483. package/plugin-docs/release-evidence.md +77 -0
  484. package/{plugins/freeflow/docs → plugin-docs}/skills.md +3 -2
  485. package/{plugins/freeflow/docs → plugin-docs}/workflow.md +4 -4
  486. package/{plugins/freeflow/router/dist → router/dist/benchmarks}/benchmark-harness.js +1 -1
  487. package/{plugins/freeflow/router/dist → router/dist/benchmarks}/benchmarks.js +14 -14
  488. package/{plugins/freeflow/router/dist → router/dist/benchmarks}/codex-qa-benchmarks.js +6 -6
  489. package/{plugins/freeflow/router/dist → router/dist/benchmarks}/command-benchmarks.d.ts +1 -1
  490. package/{plugins/freeflow/router/dist → router/dist/benchmarks}/command-benchmarks.js +11 -10
  491. package/router/dist/benchmarks/context-mode-normalized-benchmarks.d.ts +74 -0
  492. package/router/dist/benchmarks/context-mode-normalized-benchmarks.js +707 -0
  493. package/router/dist/benchmarks/context-mode-real-deep-benchmark.d.ts +124 -0
  494. package/router/dist/benchmarks/context-mode-real-deep-benchmark.js +1295 -0
  495. package/router/dist/benchmarks/context-saving-baseline.d.ts +54 -0
  496. package/router/dist/benchmarks/context-saving-baseline.js +439 -0
  497. package/{plugins/freeflow/router/dist → router/dist/benchmarks}/index-benchmarks.d.ts +16 -2
  498. package/{plugins/freeflow/router/dist → router/dist/benchmarks}/index-benchmarks.js +330 -26
  499. package/router/dist/benchmarks/storage-policy-benchmarks.d.ts +90 -0
  500. package/router/dist/benchmarks/storage-policy-benchmarks.js +538 -0
  501. package/router/dist/benchmarks/vault-index-benchmarks.d.ts +47 -0
  502. package/router/dist/benchmarks/vault-index-benchmarks.js +257 -0
  503. package/router/dist/config/config.d.ts +96 -0
  504. package/router/dist/config/config.js +453 -0
  505. package/{plugins/freeflow/router/dist → router/dist/config}/schema.js +248 -2
  506. package/router/dist/config/types.d.ts +521 -0
  507. package/router/dist/config/types.js +30 -0
  508. package/{plugins/freeflow/router/dist → router/dist/evidence}/bounded-evidence.d.ts +1 -1
  509. package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence-range-selector.js +65 -14
  510. package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence-search.js +18 -2
  511. package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence.d.ts +1 -1
  512. package/router/dist/evidence/failure-contracts.d.ts +27 -0
  513. package/router/dist/evidence/failure-contracts.js +160 -0
  514. package/router/dist/index.d.ts +30 -0
  515. package/router/dist/index.js +32 -0
  516. package/router/dist/processing/engine.d.ts +108 -0
  517. package/router/dist/processing/engine.js +435 -0
  518. package/router/dist/processing/reducers.d.ts +266 -0
  519. package/router/dist/processing/reducers.js +1495 -0
  520. package/router/dist/processing/renderers.d.ts +25 -0
  521. package/router/dist/processing/renderers.js +186 -0
  522. package/router/dist/processing/scripts.d.ts +78 -0
  523. package/router/dist/processing/scripts.js +333 -0
  524. package/router/dist/routing/observed-reducers.d.ts +35 -0
  525. package/router/dist/routing/observed-reducers.js +647 -0
  526. package/router/dist/routing/observed-routing.d.ts +17 -0
  527. package/router/dist/routing/observed-routing.js +377 -0
  528. package/{plugins/freeflow/router/dist → router/dist/routing}/parsers.d.ts +1 -1
  529. package/{plugins/freeflow/router/dist → router/dist/routing}/parsers.js +1 -1
  530. package/router/dist/routing/run-filters.d.ts +56 -0
  531. package/router/dist/routing/run-filters.js +230 -0
  532. package/router/dist/routing/run-reducers.d.ts +30 -0
  533. package/router/dist/routing/run-reducers.js +110 -0
  534. package/router/dist/sandbox/adapter-roots.d.ts +38 -0
  535. package/router/dist/sandbox/adapter-roots.js +64 -0
  536. package/router/dist/sandbox/eryx-python-adapter.d.ts +9 -0
  537. package/router/dist/sandbox/eryx-python-adapter.js +797 -0
  538. package/router/dist/sandbox/jq-wasm-adapter.d.ts +9 -0
  539. package/router/dist/sandbox/jq-wasm-adapter.js +421 -0
  540. package/router/dist/sandbox/quickjs-wasi-adapter.d.ts +9 -0
  541. package/router/dist/sandbox/quickjs-wasi-adapter.js +381 -0
  542. package/router/dist/sandbox/script-sandbox.d.ts +113 -0
  543. package/router/dist/sandbox/script-sandbox.js +303 -0
  544. package/router/dist/setup/script-transform-adapters.d.ts +28 -0
  545. package/router/dist/setup/script-transform-adapters.js +259 -0
  546. package/router/dist/tools/batch.d.ts +22 -0
  547. package/router/dist/tools/batch.js +509 -0
  548. package/router/dist/tools/run.d.ts +50 -0
  549. package/router/dist/tools/run.js +1219 -0
  550. package/router/dist/tools/search.d.ts +44 -0
  551. package/{plugins/freeflow/router/dist/retrieve.js → router/dist/tools/search.js} +395 -45
  552. package/router/dist/transform/engine.d.ts +143 -0
  553. package/router/dist/transform/engine.js +1955 -0
  554. package/router/dist/vault/vault-index.d.ts +106 -0
  555. package/router/dist/vault/vault-index.js +411 -0
  556. package/{plugins/freeflow/router/dist → router/dist/vault}/vault.d.ts +24 -1
  557. package/{plugins/freeflow/router/dist → router/dist/vault}/vault.js +152 -1
  558. package/skills/design-for-depth/SKILL.md +90 -0
  559. package/skills/design-for-depth/references/design-pressure-signals.md +265 -0
  560. package/skills/design-for-depth/references/software-design-philosophy.md +219 -0
  561. package/{plugins/freeflow/skills → skills}/diagnose-failure/SKILL.md +6 -1
  562. package/{plugins/freeflow/skills/research → skills/discover}/ARTIFACT-DESTINATIONS.md +4 -4
  563. package/{plugins/freeflow/skills/research → skills/discover}/CHECKPOINTS.md +4 -4
  564. package/skills/discover/SKILL.md +173 -0
  565. package/{plugins/freeflow/skills → skills}/execute-plan/SKILL.md +5 -4
  566. package/{plugins/freeflow/skills → skills}/execute-plan/references/execution-map.md +2 -2
  567. package/{plugins/freeflow/skills → skills}/mode-contract/SKILL.md +9 -4
  568. package/skills/output-router/SKILL.md +202 -0
  569. package/skills/output-router/references/safety-policy.md +40 -0
  570. package/{plugins/freeflow/skills → skills}/review-artifact/SKILL.md +5 -2
  571. package/{plugins/freeflow/skills → skills}/review-artifact/references/reviewer-prompt.md +2 -1
  572. package/{plugins/freeflow/skills → skills}/review-work/SKILL.md +6 -1
  573. package/{plugins/freeflow/skills → skills}/setup-freeflow/SKILL.md +21 -9
  574. package/{plugins/freeflow/skills → skills}/setup-freeflow/references/activation-contract.md +11 -10
  575. package/{plugins/freeflow/skills → skills}/setup-freeflow/references/host-setup.md +3 -3
  576. package/skills/setup-freeflow/references/output-router-setup.md +102 -0
  577. package/{plugins/freeflow/skills → skills}/verify-work/SKILL.md +3 -1
  578. package/{plugins/freeflow/skills → skills}/workflow/SKILL.md +16 -14
  579. package/{plugins/freeflow/skills → skills}/workflow/references/workflow-map.md +16 -14
  580. package/{plugins/freeflow/skills → skills}/write-plan/SKILL.md +9 -1
  581. package/{plugins/freeflow/skills → skills}/write-spec/SKILL.md +9 -6
  582. package/plugins/freeflow/docs/adr/0002-evals-before-hooks.md +0 -17
  583. package/plugins/freeflow/docs/adr/0004-research-replaces-shallow-discovery-skills.md +0 -26
  584. package/plugins/freeflow/docs/adr/README.md +0 -8
  585. package/plugins/freeflow/docs/architecture.md +0 -86
  586. package/plugins/freeflow/docs/output-router.md +0 -212
  587. package/plugins/freeflow/docs/release-evidence.md +0 -69
  588. package/plugins/freeflow/pi-extension/index.js +0 -1176
  589. package/plugins/freeflow/router/dist/config.d.ts +0 -22
  590. package/plugins/freeflow/router/dist/config.js +0 -114
  591. package/plugins/freeflow/router/dist/experimental-local-index.d.ts +0 -1
  592. package/plugins/freeflow/router/dist/experimental-local-index.js +0 -1
  593. package/plugins/freeflow/router/dist/index.d.ts +0 -12
  594. package/plugins/freeflow/router/dist/index.js +0 -12
  595. package/plugins/freeflow/router/dist/retrieve.d.ts +0 -33
  596. package/plugins/freeflow/router/dist/run.d.ts +0 -26
  597. package/plugins/freeflow/router/dist/run.js +0 -356
  598. package/plugins/freeflow/router/dist/types.d.ts +0 -234
  599. package/plugins/freeflow/router/dist/types.js +0 -9
  600. package/plugins/freeflow/skills/output-router/SKILL.md +0 -69
  601. package/plugins/freeflow/skills/output-router/references/safety-policy.md +0 -33
  602. package/plugins/freeflow/skills/research/LANGUAGE.md +0 -61
  603. package/plugins/freeflow/skills/research/SKILL.md +0 -128
  604. package/plugins/freeflow/skills/setup-freeflow/references/output-router-setup.md +0 -52
  605. /package/{plugins/freeflow/assets → assets}/freeflow-plugin-icon-transparent.png +0 -0
  606. /package/{plugins/freeflow/hooks → hooks}/hooks.json +0 -0
  607. /package/{plugins/freeflow/docs → plugin-docs}/adr/0001-three-modes.md +0 -0
  608. /package/{plugins/freeflow/router/dist → router/dist/benchmarks}/benchmark-harness.d.ts +0 -0
  609. /package/{plugins/freeflow/router/dist → router/dist/benchmarks}/benchmarks.d.ts +0 -0
  610. /package/{plugins/freeflow/router/dist → router/dist/benchmarks}/codex-qa-benchmarks.d.ts +0 -0
  611. /package/{plugins/freeflow/router/dist → router/dist/config}/router-contract.d.ts +0 -0
  612. /package/{plugins/freeflow/router/dist → router/dist/config}/router-contract.js +0 -0
  613. /package/{plugins/freeflow/router/dist → router/dist/config}/schema.d.ts +0 -0
  614. /package/{plugins/freeflow/router/dist → router/dist/evidence}/bounded-evidence.js +0 -0
  615. /package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence-range-selector.d.ts +0 -0
  616. /package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence-search.d.ts +0 -0
  617. /package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence.js +0 -0
  618. /package/{plugins/freeflow/router/dist → router/dist/evidence}/line-ranges.d.ts +0 -0
  619. /package/{plugins/freeflow/router/dist → router/dist/evidence}/line-ranges.js +0 -0
  620. /package/{plugins/freeflow/router → router}/dist/experiments/local-index.d.ts +0 -0
  621. /package/{plugins/freeflow/router → router}/dist/experiments/local-index.js +0 -0
  622. /package/{plugins/freeflow/router/dist → router/dist/repo}/repo-traversal.d.ts +0 -0
  623. /package/{plugins/freeflow/router/dist → router/dist/repo}/repo-traversal.js +0 -0
  624. /package/{plugins/freeflow/skills → skills}/bypass/SKILL.md +0 -0
  625. /package/{plugins/freeflow/skills → skills}/commit-work/SKILL.md +0 -0
  626. /package/{plugins/freeflow/skills → skills}/commit-work/references/staging-decisions.md +0 -0
  627. /package/{plugins/freeflow/skills → skills}/diagnose-failure/references/feedback-loop-catalog.md +0 -0
  628. /package/{plugins/freeflow/skills → skills}/diagnose-failure/references/flaky-and-performance.md +0 -0
  629. /package/{plugins/freeflow/skills → skills}/evaluate-skill/SKILL.md +0 -0
  630. /package/{plugins/freeflow/skills → skills}/evaluate-skill/references/eval-patterns.md +0 -0
  631. /package/{plugins/freeflow/skills → skills}/evaluate-skill/references/grading-priority.md +0 -0
  632. /package/{plugins/freeflow/skills → skills}/handoff/SKILL.md +0 -0
  633. /package/{plugins/freeflow/skills → skills}/handoff/references/templates.md +0 -0
  634. /package/{plugins/freeflow/skills → skills}/interview-gate/SKILL.md +0 -0
  635. /package/{plugins/freeflow/skills → skills}/review-work/references/reviewer-prompt.md +0 -0
  636. /package/{plugins/freeflow/skills → skills}/write-plan/references/plan-shapes.md +0 -0
  637. /package/{plugins/freeflow/skills → skills}/write-skill/SKILL.md +0 -0
  638. /package/{plugins/freeflow/skills → skills}/write-spec/references/artifact-standards.md +0 -0
  639. /package/{plugins/freeflow/skills → skills}/write-spec/references/spec-shapes.md +0 -0
@@ -1,11 +1,16 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { readFile } from "node:fs/promises";
3
3
  import { resolve } from "node:path";
4
- import { buildBoundedEdgeChunks, buildBoundedExcerpt } from "./bounded-evidence.js";
5
- import { findBestLineForQuery, searchRepoEvidenceCandidates, } from "./evidence-search.js";
6
- import { resolveExactLineRange } from "./line-ranges.js";
7
- import { collectRepoTextFileRefs, resolveRepoPath } from "./repo-traversal.js";
8
- import { createVault, readOutputText, readVaultRecord } from "./vault.js";
4
+ import { buildBoundedEdgeChunks, buildBoundedExcerpt } from "../evidence/bounded-evidence.js";
5
+ import { findBestLineForQuery, searchRepoEvidenceCandidates, } from "../evidence/evidence-search.js";
6
+ import { resolveExactLineRange } from "../evidence/line-ranges.js";
7
+ import { collectRepoTextFileRefs, resolveRepoPath } from "../repo/repo-traversal.js";
8
+ import { createLocalVaultIndex } from "../vault/vault-index.js";
9
+ import { createVault, readOutputText, readVaultRecord } from "../vault/vault.js";
10
+ export const FREEFLOW_SEARCH_ACTIONS = ["query", "locate", "get", "retrieve", "expand", "explain", "transform"];
11
+ export function searchActionForRetrievalAction(action) {
12
+ return action;
13
+ }
9
14
  const DEFAULT_CONTEXT_LINES = 2;
10
15
  const DEFAULT_QUERY_TOP_K = 1;
11
16
  const DEFAULT_LOCATE_TOP_K = 5;
@@ -29,7 +34,7 @@ const BOUNDED_EVIDENCE_CAPS = {
29
34
  expandLines80MaxLines: EXPAND_LINES_80_MAX_LINES,
30
35
  exactChunkMaxBytes: EXACT_CHUNK_MAX_BYTES,
31
36
  };
32
- export async function freeflowRetrieve(options) {
37
+ export async function freeflowSearch(options) {
33
38
  const preserve = options.preserve ?? "important";
34
39
  try {
35
40
  if (options.source.kind === "vault") {
@@ -42,6 +47,9 @@ export async function freeflowRetrieve(options) {
42
47
  if (options.action === "locate") {
43
48
  return await locateRepo(root, options, preserve);
44
49
  }
50
+ if (options.action === "get") {
51
+ return await getRepo(root, options, preserve);
52
+ }
45
53
  if (options.action === "expand") {
46
54
  return await expandRepoEvidence(root, options, preserve);
47
55
  }
@@ -55,44 +63,65 @@ export async function freeflowRetrieve(options) {
55
63
  }
56
64
  catch (error) {
57
65
  const message = error instanceof Error ? error.message : String(error);
58
- return errorResult(preserve, `freeflow_retrieve failed while reading ${options.source.kind} source: ${message}`);
66
+ return errorResult(preserve, `freeflow_search failed while reading ${options.source.kind} source: ${message}`);
59
67
  }
60
68
  }
61
69
  async function retrieveVault(options, preserve) {
62
70
  if (options.action === "retrieve") {
71
+ if (!hasVaultOutputId(options)) {
72
+ return errorResult(preserve, "Vault retrieve requires source.outputId.");
73
+ }
63
74
  return retrieveVaultLines(options, preserve);
64
75
  }
65
76
  if (options.action === "expand") {
77
+ if (!hasVaultOutputId(options)) {
78
+ return errorResult(preserve, "Vault expansion requires source.outputId for exact raw recovery.");
79
+ }
66
80
  return expandVaultEvidence(options, preserve);
67
81
  }
68
82
  if (options.action === "explain") {
83
+ if (!hasVaultOutputId(options)) {
84
+ return errorResult(preserve, "Vault explain requires source.outputId.");
85
+ }
69
86
  return explainVaultOutput(options, preserve);
70
87
  }
71
- if (options.action !== "query") {
88
+ if (options.action !== "query" && options.action !== "locate" && options.action !== "get") {
72
89
  return errorResult(preserve, `Vault retrieval action ${options.action} is not implemented yet.`);
73
90
  }
74
91
  if (!options.query?.trim()) {
92
+ return errorResult(preserve, `Vault ${options.action} requires a non-empty query string.`);
93
+ }
94
+ if (hasVaultOutputId(options) && (options.action === "query" || options.action === "get")) {
95
+ return querySingleVaultOutput(options, preserve, options.action);
96
+ }
97
+ return queryVaultIndex(options, preserve, options.action);
98
+ }
99
+ async function querySingleVaultOutput(options, preserve, action = "query") {
100
+ const query = options.query?.trim();
101
+ if (!query) {
75
102
  return errorResult(preserve, "Vault query requires a non-empty query string.");
76
103
  }
77
- const stream = options.source.stream ?? "combined";
78
104
  const vault = createVault({ root: options.source.root });
105
+ const record = await readVaultRecord(vault, options.source.sessionId, options.source.outputId);
106
+ const stream = resolveVaultStream(record, options.source.stream);
79
107
  const text = await readOutputText(vault, options.source.sessionId, options.source.outputId, stream);
80
108
  const lines = splitLines(text);
81
- const candidateLine = findBestLineForQuery(lines, options.query);
109
+ const candidateLine = findBestLineForQuery(lines, query);
82
110
  if (candidateLine === null) {
83
111
  return {
84
112
  toolStatus: "ok",
85
- decisionId: decisionId("vault-query", options.source.outputId, stream, options.query, "none"),
113
+ decisionId: decisionId(`vault-${action}`, options.source.outputId, stream, query, "none"),
86
114
  preserve,
87
115
  source: { kind: "vault", outputId: options.source.outputId, stream },
116
+ ...vaultRecordResultFields(record),
88
117
  routing: {
89
118
  status: "routed",
90
119
  route: "retrieve",
91
- reason: "Deterministic lexical vault retrieval found no matching output evidence.",
120
+ reason: action === "get" ? "Freeflow search get found no matching vaulted output evidence." : "Deterministic lexical vault retrieval found no matching output evidence.",
92
121
  },
93
122
  evidence: [],
94
123
  recovery: {
95
- how: `Refine the query or use freeflow_retrieve action=retrieve with outputId=${options.source.outputId} and an exact line range.`,
124
+ how: `Refine the query or use freeflow_search action=retrieve with outputId=${options.source.outputId} and an exact line range.`,
96
125
  outputId: options.source.outputId,
97
126
  },
98
127
  };
@@ -100,41 +129,157 @@ async function retrieveVault(options, preserve) {
100
129
  const start = Math.max(0, candidateLine - DEFAULT_CONTEXT_LINES);
101
130
  const end = Math.min(lines.length - 1, candidateLine + DEFAULT_CONTEXT_LINES);
102
131
  const evidenceLines = `${start + 1}-${end + 1}`;
132
+ const match = matchMetadataForText(lines[candidateLine] ?? "", query);
103
133
  const evidence = {
104
- id: evidenceIdFor(`${options.source.outputId}:${stream}`, evidenceLines, options.query),
134
+ id: evidenceIdFor(`${options.source.outputId}:${stream}`, evidenceLines, query),
105
135
  source: { kind: "vault", outputId: options.source.outputId, stream },
106
136
  path: `${options.source.outputId}:${stream}`,
107
137
  lines: evidenceLines,
108
138
  excerpt: excerptForLineRange(lines, { start: start + 1, end: end + 1 }, "small"),
109
- why: `Deterministic lexical match for query terms in vaulted ${stream} output near line ${candidateLine + 1}.`,
139
+ why: action === "get"
140
+ ? `Best vaulted get match near line ${candidateLine + 1}; matchType=${match.type} confidence=${match.confidence.toFixed(2)}.`
141
+ : `Deterministic lexical match for query terms in vaulted ${stream} output near line ${candidateLine + 1}.`,
110
142
  window: "small",
111
143
  expandable: true,
144
+ ...(action === "get" ? { match } : {}),
112
145
  };
113
146
  return {
114
147
  toolStatus: "ok",
115
- decisionId: decisionId("vault-query", options.source.outputId, stream, options.query, evidenceLines),
148
+ decisionId: decisionId(`vault-${action}`, options.source.outputId, stream, query, evidenceLines),
116
149
  preserve,
117
150
  source: { kind: "vault", outputId: options.source.outputId, stream },
151
+ ...vaultRecordResultFields(record),
118
152
  routing: {
119
153
  status: "routed",
120
154
  route: "retrieve",
121
- reason: `Deterministic lexical retrieval selected vaulted outputId=${options.source.outputId} stream=${stream} lines=${evidenceLines}.`,
155
+ reason: action === "get"
156
+ ? `Freeflow search get selected best vaulted outputId=${options.source.outputId} stream=${stream} lines=${evidenceLines}; matchType=${match.type} confidence=${match.confidence.toFixed(2)}.`
157
+ : `Deterministic lexical retrieval selected vaulted outputId=${options.source.outputId} stream=${stream} lines=${evidenceLines}.`,
122
158
  },
123
159
  evidence: [evidence],
124
160
  recovery: {
125
- how: `Use freeflow_retrieve action=expand with evidenceId=${evidence.id}, or action=retrieve with outputId=${options.source.outputId} and stream=${stream}.`,
161
+ how: action === "get"
162
+ ? `Use freeflow_search action=retrieve with outputId=${options.source.outputId}, stream=${stream}, and lineRange=${evidenceLines} for exact recovery; use action=expand with evidenceId=${evidence.id} for more context.`
163
+ : `Use freeflow_search action=expand with evidenceId=${evidence.id}, or action=retrieve with outputId=${options.source.outputId} and stream=${stream}.`,
126
164
  outputId: options.source.outputId,
127
165
  evidenceId: evidence.id,
128
166
  },
129
167
  };
130
168
  }
169
+ async function queryVaultIndex(options, preserve, action) {
170
+ const query = options.query?.trim();
171
+ if (!query) {
172
+ return errorResult(preserve, `Vault ${action} requires a non-empty query string.`);
173
+ }
174
+ const topK = parseTopK(options.topK, action === "locate" ? DEFAULT_LOCATE_TOP_K : DEFAULT_QUERY_TOP_K);
175
+ if (typeof topK === "string") {
176
+ return errorResult(preserve, topK);
177
+ }
178
+ const vault = createVault({ root: options.source.root });
179
+ const indexResult = await createLocalVaultIndex(vault).queryVault(query, vaultIndexFiltersFromSource(options.source, options.filters), {
180
+ topK,
181
+ maxExcerptBytes: action === "locate" ? LINE_PREVIEW_MAX_BYTES : QUERY_EXCERPT_MAX_BYTES,
182
+ });
183
+ if (indexResult.matches.length === 0) {
184
+ return {
185
+ toolStatus: "ok",
186
+ decisionId: decisionId(`vault-${action}-index`, query, String(topK), "none"),
187
+ preserve,
188
+ routing: {
189
+ status: "routed",
190
+ route: "retrieve",
191
+ reason: `Vault-wide ${action} found no matching indexed evidence for the current filters.`,
192
+ },
193
+ evidence: [],
194
+ recovery: {
195
+ how: "Refine the query, adjust vault filters, or use source.outputId with action=retrieve/explain when the exact output is known.",
196
+ },
197
+ };
198
+ }
199
+ const evidence = indexResult.matches.map((match) => evidenceFromVaultIndexMatch(match, query, action));
200
+ const first = indexResult.matches[0];
201
+ const firstEvidence = evidence[0];
202
+ if (!first || !firstEvidence) {
203
+ return errorResult(preserve, `Vault ${action} produced no usable indexed evidence.`);
204
+ }
205
+ return {
206
+ toolStatus: "ok",
207
+ decisionId: decisionId(`vault-${action}-index`, query, String(topK), evidence.map((packet) => `${packet.path}:${packet.lines ?? ""}`).join("|")),
208
+ preserve,
209
+ source: sourceRefForVaultIndexMatch(first),
210
+ routing: {
211
+ status: "routed",
212
+ route: "retrieve",
213
+ reason: action === "locate"
214
+ ? `Located ${evidence.length} indexed vault candidate(s) without raw output retrieval; top result ${first.outputId}${first.stream ? `:${first.stream}` : ""}${firstEvidence.lines ? `:${firstEvidence.lines}` : ""}.`
215
+ : action === "get"
216
+ ? `Freeflow search get selected best indexed vault match ${first.outputId}${first.stream ? `:${first.stream}` : ""}${firstEvidence.lines ? `:${firstEvidence.lines}` : ""}; matchType=${firstEvidence.match?.type ?? "lexical"} confidence=${(firstEvidence.match?.confidence ?? scoreConfidence(first.score)).toFixed(2)}.`
217
+ : `Vault-wide query selected ${evidence.length} indexed candidate(s); top result ${first.outputId}${first.stream ? `:${first.stream}` : ""}${firstEvidence.lines ? `:${firstEvidence.lines}` : ""}.`,
218
+ },
219
+ evidence,
220
+ recovery: {
221
+ how: first.metadataOnly
222
+ ? `Top match ${first.outputId} is metadata-only; use freeflow_search action=explain with outputId=${first.outputId} for recoverability details.`
223
+ : `Use freeflow_search action=expand with source.outputId=${first.outputId} and evidenceId=${firstEvidence.id}, or action=retrieve with outputId=${first.outputId}${first.stream ? ` and stream=${first.stream}` : ""}.`,
224
+ outputId: first.outputId,
225
+ evidenceId: firstEvidence.id,
226
+ },
227
+ };
228
+ }
229
+ function evidenceFromVaultIndexMatch(match, query, action) {
230
+ const source = sourceRefForVaultIndexMatch(match);
231
+ const lines = match.lineStart !== undefined && match.lineEnd !== undefined ? `${match.lineStart}-${match.lineEnd}` : undefined;
232
+ const path = `${match.outputId}${match.stream ? `:${match.stream}` : ":metadata"}`;
233
+ const matchMetadata = match.metadataOnly ? { type: "metadata", confidence: scoreConfidence(match.score) } : matchMetadataForText(match.excerpt, query, match.score);
234
+ const why = match.metadataOnly
235
+ ? `Indexed metadata-only ${action} match for query terms; raw content is not recoverable from this entry.`
236
+ : action === "get"
237
+ ? `Best indexed vault get match; matchType=${matchMetadata.type} confidence=${matchMetadata.confidence.toFixed(2)} score=${match.score}.`
238
+ : `Indexed vault ${action} match for query terms with score ${match.score}.`;
239
+ return {
240
+ id: evidenceIdFor(path, lines ?? match.chunkId, query),
241
+ source,
242
+ path,
243
+ ...(lines !== undefined ? { lines } : {}),
244
+ excerpt: match.excerpt,
245
+ why,
246
+ window: "small",
247
+ expandable: !match.metadataOnly && lines !== undefined && match.stream !== undefined,
248
+ ...(action === "get" ? { match: matchMetadata } : {}),
249
+ };
250
+ }
251
+ function sourceRefForVaultIndexMatch(match) {
252
+ return {
253
+ kind: "vault",
254
+ outputId: match.outputId,
255
+ ...(match.stream !== undefined ? { stream: match.stream } : {}),
256
+ };
257
+ }
258
+ function vaultIndexFiltersFromSource(source, filters) {
259
+ return {
260
+ ...filters,
261
+ sessionId: filters?.sessionId ?? source.sessionId,
262
+ ...(source.outputId !== undefined ? { outputId: source.outputId } : {}),
263
+ ...(source.producerKind !== undefined ? { producerKind: source.producerKind } : {}),
264
+ ...(source.server !== undefined ? { server: source.server } : {}),
265
+ ...(source.tool !== undefined ? { tool: source.tool } : {}),
266
+ ...(source.hostToolName !== undefined ? { hostToolName: source.hostToolName } : {}),
267
+ ...(source.stream !== undefined ? { stream: source.stream } : {}),
268
+ ...(source.recordKind !== undefined ? { recordKind: source.recordKind } : {}),
269
+ ...(source.recoverability !== undefined ? { recoverability: source.recoverability } : {}),
270
+ };
271
+ }
272
+ function hasVaultOutputId(options) {
273
+ return typeof options.source.outputId === "string" && options.source.outputId.length > 0;
274
+ }
131
275
  async function retrieveVaultLines(options, preserve) {
132
- const stream = options.source.stream ?? "combined";
133
276
  const lineRange = options.lineRange;
134
277
  if (!lineRange) {
135
278
  return errorResult(preserve, "Vault retrieve requires a valid 1-based lineRange.");
136
279
  }
137
280
  const vault = createVault({ root: options.source.root });
281
+ const record = await readVaultRecord(vault, options.source.sessionId, options.source.outputId);
282
+ const stream = resolveVaultStream(record, options.source.stream);
138
283
  const text = await readOutputText(vault, options.source.sessionId, options.source.outputId, stream);
139
284
  const lines = splitLines(text);
140
285
  const resolvedRange = resolveExactLineRange({
@@ -150,7 +295,7 @@ async function retrieveVaultLines(options, preserve) {
150
295
  const evidenceLines = `${start}-${end}`;
151
296
  const excerpt = lines.slice(start - 1, end).join("\n");
152
297
  if (byteLength(excerpt) > EXACT_LINE_RANGE_MAX_BYTES) {
153
- return retrieveVaultLineRangeOverCap(options, preserve, stream, lines, { start, end }, byteLength(excerpt));
298
+ return retrieveVaultLineRangeOverCap(options, preserve, stream, record, lines, { start, end }, byteLength(excerpt));
154
299
  }
155
300
  const evidence = {
156
301
  id: evidenceIdFor(`${options.source.outputId}:${stream}`, evidenceLines, "retrieve"),
@@ -167,6 +312,7 @@ async function retrieveVaultLines(options, preserve) {
167
312
  decisionId: decisionId("vault-retrieve", options.source.outputId, stream, evidenceLines),
168
313
  preserve,
169
314
  source: { kind: "vault", outputId: options.source.outputId, stream },
315
+ ...vaultRecordResultFields(record),
170
316
  routing: {
171
317
  status: "routed",
172
318
  route: "retrieve",
@@ -174,13 +320,13 @@ async function retrieveVaultLines(options, preserve) {
174
320
  },
175
321
  evidence: [evidence],
176
322
  recovery: {
177
- how: `Use freeflow_retrieve action=expand with evidenceId=${evidence.id} for more vaulted output context.`,
323
+ how: `Use freeflow_search action=expand with evidenceId=${evidence.id} for more vaulted output context.`,
178
324
  outputId: options.source.outputId,
179
325
  evidenceId: evidence.id,
180
326
  },
181
327
  };
182
328
  }
183
- function retrieveVaultLineRangeOverCap(options, preserve, stream, lines, requestedRange, requestedBytes) {
329
+ function retrieveVaultLineRangeOverCap(options, preserve, stream, record, lines, requestedRange, requestedBytes) {
184
330
  const evidence = buildBoundedEdgeChunks({ lines, range: requestedRange, caps: BOUNDED_EVIDENCE_CAPS }).map((chunk, index) => {
185
331
  const evidenceLines = chunk.linesLabel;
186
332
  return {
@@ -199,6 +345,7 @@ function retrieveVaultLineRangeOverCap(options, preserve, stream, lines, request
199
345
  decisionId: decisionId("vault-retrieve-lines-over-cap", options.source.outputId, stream, `${requestedRange.start}-${requestedRange.end}`, String(requestedBytes)),
200
346
  preserve,
201
347
  source: { kind: "vault", outputId: options.source.outputId, stream },
348
+ ...vaultRecordResultFields(record),
202
349
  routing: {
203
350
  status: "partial",
204
351
  route: "retrieve",
@@ -206,12 +353,12 @@ function retrieveVaultLineRangeOverCap(options, preserve, stream, lines, request
206
353
  },
207
354
  evidence,
208
355
  recovery: {
209
- how: `Use narrower freeflow_retrieve action=retrieve lineRange spans for exact vaulted output recovery, or native vault file access if a full raw span is required.`,
356
+ how: `Use narrower freeflow_search action=retrieve lineRange spans for exact vaulted output recovery, or native vault file access if a full raw span is required.`,
210
357
  outputId: options.source.outputId,
211
358
  },
212
359
  };
213
360
  }
214
- function expandVaultEvidenceOverCap(options, preserve, stream, evidence, lines, expandedRange, expandedBytes) {
361
+ function expandVaultEvidenceOverCap(options, preserve, stream, record, evidence, lines, expandedRange, expandedBytes) {
215
362
  const chunks = buildBoundedEdgeChunks({ lines, range: expandedRange, caps: BOUNDED_EVIDENCE_CAPS }).map((chunk, index) => {
216
363
  const evidenceLines = chunk.linesLabel;
217
364
  return {
@@ -231,6 +378,7 @@ function expandVaultEvidenceOverCap(options, preserve, stream, evidence, lines,
231
378
  decisionId: decisionId("vault-expand-over-cap", evidence.id, expandedLines, String(expandedBytes)),
232
379
  preserve,
233
380
  source: { kind: "vault", outputId: options.source.outputId, stream },
381
+ ...vaultRecordResultFields(record),
234
382
  routing: {
235
383
  status: "partial",
236
384
  route: "retrieve",
@@ -238,7 +386,7 @@ function expandVaultEvidenceOverCap(options, preserve, stream, evidence, lines,
238
386
  },
239
387
  evidence: chunks,
240
388
  recovery: {
241
- how: `Use narrower freeflow_retrieve action=retrieve lineRange spans for exact vaulted output recovery.`,
389
+ how: `Use narrower freeflow_search action=retrieve lineRange spans for exact vaulted output recovery.`,
242
390
  outputId: options.source.outputId,
243
391
  evidenceId: evidence.id,
244
392
  },
@@ -249,20 +397,21 @@ async function expandVaultEvidence(options, preserve) {
249
397
  if (!evidence?.lines || evidence.source.kind !== "vault") {
250
398
  return errorResult(preserve, "Vault expansion requires a previous vault evidence packet with lines.");
251
399
  }
252
- const stream = options.source.stream ?? evidence.source.stream ?? "combined";
253
400
  const originalRange = parseLineRange(evidence.lines);
254
401
  if (!originalRange) {
255
402
  return errorResult(preserve, `Cannot expand unsupported vault evidence line range ${evidence.lines}.`);
256
403
  }
257
404
  const expansion = options.expansion ?? "lines_30";
258
405
  const vault = createVault({ root: options.source.root });
406
+ const record = await readVaultRecord(vault, options.source.sessionId, options.source.outputId);
407
+ const stream = resolveVaultStream(record, options.source.stream ?? evidence.source.stream);
259
408
  const text = await readOutputText(vault, options.source.sessionId, options.source.outputId, stream);
260
409
  const lines = splitLines(text);
261
410
  const expandedRange = expandLineRange(originalRange, lines.length, expansion);
262
411
  const window = windowForExpansion(expansion);
263
412
  const expandedExcerpt = lines.slice(expandedRange.start - 1, expandedRange.end).join("\n");
264
413
  if (expansion === "full" && byteLength(expandedExcerpt) > EXACT_LINE_RANGE_MAX_BYTES) {
265
- return expandVaultEvidenceOverCap(options, preserve, stream, evidence, lines, expandedRange, byteLength(expandedExcerpt));
414
+ return expandVaultEvidenceOverCap(options, preserve, stream, record, evidence, lines, expandedRange, byteLength(expandedExcerpt));
266
415
  }
267
416
  const bounded = buildBoundedExcerpt({ lines, range: expandedRange, window, caps: BOUNDED_EVIDENCE_CAPS });
268
417
  const expandedLines = bounded.linesLabel;
@@ -283,6 +432,7 @@ async function expandVaultEvidence(options, preserve) {
283
432
  decisionId: decisionId("vault-expand", evidence.id, expandedLines),
284
433
  preserve,
285
434
  source: { kind: "vault", outputId: options.source.outputId, stream },
435
+ ...vaultRecordResultFields(record),
286
436
  routing: {
287
437
  status: "routed",
288
438
  route: "retrieve",
@@ -290,7 +440,7 @@ async function expandVaultEvidence(options, preserve) {
290
440
  },
291
441
  evidence: [expandedEvidence],
292
442
  recovery: {
293
- how: `Use freeflow_retrieve action=retrieve with outputId=${options.source.outputId}, stream=${stream}, and an exact line range for precise recovery.`,
443
+ how: `Use freeflow_search action=retrieve with outputId=${options.source.outputId}, stream=${stream}, and an exact line range for precise recovery.`,
294
444
  outputId: options.source.outputId,
295
445
  evidenceId: evidence.id,
296
446
  },
@@ -299,9 +449,10 @@ async function expandVaultEvidence(options, preserve) {
299
449
  async function explainVaultOutput(options, preserve) {
300
450
  const vault = createVault({ root: options.source.root });
301
451
  const record = await readVaultRecord(vault, options.source.sessionId, options.source.outputId);
302
- const details = record.kind === "command"
303
- ? `kind=command executionStatus=${record.executionStatus} exitCode=${record.exitCode} decisions=${record.decisionIds.join(",")}`
304
- : `kind=${record.kind} decisions=${record.decisionIds.join(",")}`;
452
+ const producer = producerForVaultRecord(record);
453
+ const persistence = persistenceForVaultRecord(record);
454
+ const details = vaultRecordDetails(record);
455
+ const recovery = vaultRecordRecovery(record, options.source.stream);
305
456
  const source = { kind: "vault", outputId: options.source.outputId };
306
457
  if (options.source.stream !== undefined) {
307
458
  Object.assign(source, { stream: options.source.stream });
@@ -311,15 +462,138 @@ async function explainVaultOutput(options, preserve) {
311
462
  decisionId: decisionId("vault-explain", options.source.outputId, record.contentHashSha256),
312
463
  preserve,
313
464
  source,
465
+ ...vaultRecordResultFields(record),
314
466
  routing: {
315
467
  status: "routed",
316
468
  route: "retrieve",
317
- reason: `Vault outputId=${options.source.outputId} ${details}. Raw output is recoverable from the vault record without rerunning the original command.`,
469
+ reason: `Vault outputId=${options.source.outputId} ${details}; producer=${producer.kind}; persistence.status=${persistence.status}; recoverability=${persistence.recoverability}. ${recovery.reason}`,
318
470
  },
319
471
  evidence: [],
320
- recovery: {
321
- how: `Use freeflow_retrieve action=retrieve with outputId=${options.source.outputId}, stream=stdout|stderr|combined, and an exact lineRange to recover raw command output.`,
322
- outputId: options.source.outputId,
472
+ recovery: recovery.hint,
473
+ };
474
+ }
475
+ function resolveVaultStream(record, requested) {
476
+ if (requested !== undefined) {
477
+ return requested;
478
+ }
479
+ if (record.kind === "command") {
480
+ return "combined";
481
+ }
482
+ if (record.kind === "text") {
483
+ return "raw";
484
+ }
485
+ if (record.kind === "metadata") {
486
+ throw new Error("Metadata only records store no raw stream.");
487
+ }
488
+ throw new Error("Repo file reference records store metadata only and have no raw stream.");
489
+ }
490
+ function vaultRecordResultFields(record) {
491
+ const fields = {
492
+ producer: producerForVaultRecord(record),
493
+ persistence: persistenceForVaultRecord(record),
494
+ };
495
+ const recordId = record.recordId;
496
+ if (typeof recordId === "string") {
497
+ fields.recordId = recordId;
498
+ }
499
+ if (record.lineage !== undefined) {
500
+ fields.lineage = record.lineage;
501
+ }
502
+ return fields;
503
+ }
504
+ function producerForVaultRecord(record) {
505
+ const producer = record.producer;
506
+ if (producer?.kind) {
507
+ return producer;
508
+ }
509
+ if (record.kind === "command") {
510
+ return { kind: "command" };
511
+ }
512
+ if (record.kind === "text" || record.kind === "metadata") {
513
+ if (record.sourceKind === "native") {
514
+ return { kind: "native" };
515
+ }
516
+ if (record.sourceKind === "mcp") {
517
+ return { kind: "mcp" };
518
+ }
519
+ if (record.sourceKind === "web") {
520
+ return { kind: "web" };
521
+ }
522
+ if (record.sourceKind === "fetch") {
523
+ return { kind: "fetch" };
524
+ }
525
+ if (record.sourceKind === "code_search") {
526
+ return { kind: "code_search" };
527
+ }
528
+ return { kind: "other" };
529
+ }
530
+ return { kind: "repo" };
531
+ }
532
+ function persistenceForVaultRecord(record) {
533
+ const persistence = record.persistence;
534
+ if (persistence?.status && persistence.recoverability) {
535
+ return persistence;
536
+ }
537
+ if (record.kind === "repo-file" || record.kind === "metadata") {
538
+ return { status: "metadata_only", recoverability: "metadata_only", outputId: record.outputId };
539
+ }
540
+ return {
541
+ status: "vaulted",
542
+ recoverability: "exact",
543
+ recoveryOutputId: record.outputId,
544
+ outputId: record.outputId,
545
+ };
546
+ }
547
+ function vaultRecordDetails(record) {
548
+ const decisions = Array.isArray(record.decisionIds) ? record.decisionIds.join(",") : "";
549
+ const recordId = record.recordId;
550
+ const recordIdText = typeof recordId === "string" ? ` recordId=${recordId}` : "";
551
+ if (record.kind === "command") {
552
+ return `kind=command${recordIdText} executionStatus=${record.executionStatus} exitCode=${record.exitCode} decisions=${decisions}`;
553
+ }
554
+ if (record.kind === "text") {
555
+ return `kind=text${recordIdText} sourceKind=${record.sourceKind} decisions=${decisions}`;
556
+ }
557
+ if (record.kind === "metadata") {
558
+ return `kind=metadata${recordIdText} sourceKind=${record.sourceKind} rawLines=${record.lineCounts.raw} rawBytes=${record.byteCounts.raw} decisions=${decisions}`;
559
+ }
560
+ return `kind=repo-file${recordIdText} path=${record.path} decisions=${decisions}`;
561
+ }
562
+ function vaultRecordRecovery(record, requestedStream) {
563
+ const persistence = persistenceForVaultRecord(record);
564
+ const recoveryOutputId = persistence.recoveryOutputId ?? persistence.outputId ?? record.outputId;
565
+ if (persistence.recoverability === "exact") {
566
+ const stream = requestedStream ?? resolveVaultStream(record);
567
+ const streamText = record.kind === "command" && requestedStream === undefined ? "stdout|stderr|combined" : stream;
568
+ return {
569
+ reason: `Exact content is recoverable from the vault with recoveryOutputId=${recoveryOutputId}.`,
570
+ hint: {
571
+ how: `Use freeflow_search action=retrieve with outputId=${recoveryOutputId}, stream=${streamText}, and an exact lineRange to recover exact vaulted content.`,
572
+ outputId: recoveryOutputId,
573
+ },
574
+ };
575
+ }
576
+ if (persistence.recoverability === "redacted") {
577
+ return {
578
+ reason: `Only redacted content is recoverable from the vault; exact raw content is intentionally unavailable.`,
579
+ hint: {
580
+ how: `Use freeflow_search action=retrieve with outputId=${recoveryOutputId} to recover redacted persisted content. Exact raw recovery is unavailable.`,
581
+ outputId: recoveryOutputId,
582
+ },
583
+ };
584
+ }
585
+ if (persistence.recoverability === "metadata_only") {
586
+ return {
587
+ reason: "Only metadata was persisted; no raw content recovery is promised.",
588
+ hint: {
589
+ how: "Only vault metadata is available for this record. There is no raw content stream to recover.",
590
+ },
591
+ };
592
+ }
593
+ return {
594
+ reason: "No content was persisted; recovery is unavailable.",
595
+ hint: {
596
+ how: "No persisted content is available for this record.",
323
597
  },
324
598
  };
325
599
  }
@@ -375,11 +649,63 @@ async function queryRepo(root, options, preserve) {
375
649
  },
376
650
  evidence,
377
651
  recovery: {
378
- how: `Use freeflow_retrieve action=expand with evidenceId=${first.id} for more surrounding context, action=locate for candidate paths, or action=retrieve with path=${firstCandidate.file.path} for an explicit span.`,
652
+ how: `Use freeflow_search action=expand with evidenceId=${first.id} for more surrounding context, action=locate for candidate paths, or action=retrieve with path=${firstCandidate.file.path} for an explicit span.`,
379
653
  evidenceId: first.id,
380
654
  },
381
655
  };
382
656
  }
657
+ async function getRepo(root, options, preserve) {
658
+ if (!options.query?.trim()) {
659
+ return errorResult(preserve, "Repo get requires a non-empty query string.");
660
+ }
661
+ const query = options.query.trim();
662
+ const files = await readRepoTextFiles(root, options.source.path, options.generatedPathGlobs);
663
+ const candidates = searchRepoEvidenceCandidates({
664
+ files,
665
+ query,
666
+ topK: 1,
667
+ defaultContextLines: DEFAULT_CONTEXT_LINES,
668
+ queryCoverageMaxLines: QUERY_COVERAGE_MAX_LINES,
669
+ });
670
+ const candidate = candidates[0];
671
+ if (!candidate) {
672
+ return {
673
+ toolStatus: "ok",
674
+ decisionId: decisionId("repo-get", query, root, "none"),
675
+ preserve,
676
+ source: { kind: "repo", path: options.source.path ?? "." },
677
+ routing: {
678
+ status: "routed",
679
+ route: "retrieve",
680
+ reason: "Freeflow search get found no matching repo evidence.",
681
+ },
682
+ evidence: [],
683
+ recovery: {
684
+ how: "Refine the query, use action=locate for candidate paths, or use native read for a known whole file.",
685
+ },
686
+ };
687
+ }
688
+ const match = matchMetadataForCandidate(candidate);
689
+ const evidence = evidenceFromCandidate(candidate, query);
690
+ evidence.why = `Best repo get match; matchType=${match.type} confidence=${match.confidence.toFixed(2)}. ${evidence.why}`;
691
+ evidence.match = match;
692
+ return {
693
+ toolStatus: "ok",
694
+ decisionId: decisionId("repo-get", query, evidence.path ?? candidate.file.path, evidence.lines ?? ""),
695
+ preserve,
696
+ source: { kind: "repo", path: candidate.file.path },
697
+ routing: {
698
+ status: "routed",
699
+ route: "retrieve",
700
+ reason: `Freeflow search get selected best repo match ${candidate.file.path}:${evidence.lines}; matchType=${match.type} confidence=${match.confidence.toFixed(2)} (${candidate.reason}).`,
701
+ },
702
+ evidence: [evidence],
703
+ recovery: {
704
+ how: `Use freeflow_search action=retrieve with path=${candidate.file.path} and lineRange=${evidence.lines} for exact recovery, or action=expand with evidenceId=${evidence.id}.`,
705
+ evidenceId: evidence.id,
706
+ },
707
+ };
708
+ }
383
709
  async function locateRepo(root, options, preserve) {
384
710
  if (!options.query?.trim()) {
385
711
  return errorResult(preserve, "Repo locate requires a non-empty query string.");
@@ -442,7 +768,7 @@ async function locateRepo(root, options, preserve) {
442
768
  },
443
769
  evidence,
444
770
  recovery: {
445
- how: `Use freeflow_retrieve action=retrieve with path=${firstCandidate.file.path} for an explicit span, or action=expand with evidenceId=${first.id}.`,
771
+ how: `Use freeflow_search action=retrieve with path=${firstCandidate.file.path} for an explicit span, or action=expand with evidenceId=${first.id}.`,
446
772
  evidenceId: first.id,
447
773
  },
448
774
  };
@@ -486,7 +812,7 @@ async function expandRepoEvidence(root, options, preserve) {
486
812
  recovery: {
487
813
  how: expansion === "full"
488
814
  ? `Use native read for direct whole-file behavior if needed for ${evidence.path}.`
489
- : `Use freeflow_retrieve action=expand with expansion=lines_80 or full for more context from ${evidence.path}.`,
815
+ : `Use freeflow_search action=expand with expansion=lines_80 or full for more context from ${evidence.path}.`,
490
816
  evidenceId: evidence.id,
491
817
  },
492
818
  };
@@ -524,7 +850,7 @@ async function retrieveRepoPath(root, options, preserve) {
524
850
  },
525
851
  evidence: [evidence],
526
852
  recovery: {
527
- how: `Use freeflow_retrieve action=expand with evidenceId=${evidence.id} for more context from ${file.path}.`,
853
+ how: `Use freeflow_search action=expand with evidenceId=${evidence.id} for more context from ${file.path}.`,
528
854
  evidenceId: evidence.id,
529
855
  },
530
856
  };
@@ -544,7 +870,7 @@ function expandRepoEvidenceOverCap(file, evidence, expandedRange, preserve, expa
544
870
  },
545
871
  evidence: chunks,
546
872
  recovery: {
547
- how: `Use narrower freeflow_retrieve action=retrieve lineRange spans for exact content recovery from ${file.path}, or native read for direct whole-file host behavior.`,
873
+ how: `Use narrower freeflow_search action=retrieve lineRange spans for exact content recovery from ${file.path}, or native read for direct whole-file host behavior.`,
548
874
  evidenceId: evidence.id,
549
875
  },
550
876
  };
@@ -585,7 +911,7 @@ function retrieveRepoLineRange(file, lineRange, preserve) {
585
911
  },
586
912
  evidence: [evidence],
587
913
  recovery: {
588
- how: `Use freeflow_retrieve action=expand with evidenceId=${evidence.id} for more context from ${file.path}.`,
914
+ how: `Use freeflow_search action=expand with evidenceId=${evidence.id} for more context from ${file.path}.`,
589
915
  evidenceId: evidence.id,
590
916
  },
591
917
  };
@@ -604,7 +930,7 @@ function retrieveRepoLineRangeOverCap(file, requestedRange, preserve, requestedB
604
930
  },
605
931
  evidence,
606
932
  recovery: {
607
- how: `Use narrower freeflow_retrieve action=retrieve lineRange spans for exact content recovery from ${file.path}, or native read for direct whole-file host behavior.`,
933
+ how: `Use narrower freeflow_search action=retrieve lineRange spans for exact content recovery from ${file.path}, or native read for direct whole-file host behavior.`,
608
934
  },
609
935
  };
610
936
  }
@@ -666,7 +992,7 @@ function retrieveFullFile(file, maxFullBytes) {
666
992
  },
667
993
  evidence,
668
994
  recovery: {
669
- how: `Use freeflow_retrieve action=retrieve with path=${file.path} and an explicit span to recover exact content, or native read for direct whole-file output.`,
995
+ how: `Use freeflow_search action=retrieve with path=${file.path} and an explicit span to recover exact content, or native read for direct whole-file output.`,
670
996
  },
671
997
  };
672
998
  }
@@ -677,7 +1003,7 @@ function explainRepoDecision(options, preserve) {
677
1003
  }
678
1004
  const recovery = {
679
1005
  how: decision.recovery?.how ??
680
- "Use freeflow_retrieve action=expand with a returned evidence id, or action=retrieve for an explicit repo span.",
1006
+ "Use freeflow_search action=expand with a returned evidence id, or action=retrieve for an explicit repo span.",
681
1007
  };
682
1008
  if (decision.recovery?.outputId !== undefined) {
683
1009
  Object.assign(recovery, { outputId: decision.recovery.outputId });
@@ -751,6 +1077,30 @@ function parseTopK(value, defaultValue) {
751
1077
  }
752
1078
  return value;
753
1079
  }
1080
+ function matchMetadataForCandidate(candidate) {
1081
+ return {
1082
+ type: candidate.exactNormalizedPhrase ? "exact_phrase" : "lexical",
1083
+ confidence: candidate.exactNormalizedPhrase ? 0.95 : scoreConfidence(candidate.score),
1084
+ };
1085
+ }
1086
+ function matchMetadataForText(text, query, score) {
1087
+ const normalizedText = normalizeComparableText(text);
1088
+ const normalizedQuery = normalizeComparableText(query);
1089
+ const exact = normalizedQuery.length > 0 && normalizedText.includes(normalizedQuery);
1090
+ return {
1091
+ type: exact ? "exact_phrase" : "lexical",
1092
+ confidence: exact ? 0.95 : scoreConfidence(score),
1093
+ };
1094
+ }
1095
+ function scoreConfidence(score) {
1096
+ if (score === undefined || !Number.isFinite(score) || score <= 0) {
1097
+ return 0.6;
1098
+ }
1099
+ return Math.max(0.6, Math.min(0.9, score / (score + 10)));
1100
+ }
1101
+ function normalizeComparableText(value) {
1102
+ return value.toLowerCase().replace(/[^a-z0-9_.$/-]+/g, " ").replace(/\s+/g, " ").trim();
1103
+ }
754
1104
  function evidenceFromCandidate(candidate, query) {
755
1105
  const defaultStart = Math.max(0, candidate.lineIndex - DEFAULT_CONTEXT_LINES);
756
1106
  const defaultEnd = Math.min(candidate.file.lines.length - 1, candidate.lineIndex + DEFAULT_CONTEXT_LINES);
@@ -849,7 +1199,7 @@ function errorResult(preserve, reason) {
849
1199
  },
850
1200
  evidence: [],
851
1201
  recovery: {
852
- how: "Use native read for a known whole file, or retry freeflow_retrieve with a supported repo query.",
1202
+ how: "Use native read for a known whole file, or retry freeflow_search with a supported repo query.",
853
1203
  },
854
1204
  };
855
1205
  }