@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.
- package/.agents/plugins/marketplace.json +1 -1
- package/.claude-plugin/marketplace.json +2 -2
- package/{plugins/freeflow/.claude-plugin → .claude-plugin}/plugin.json +1 -1
- package/{plugins/freeflow/.codex-plugin → .codex-plugin}/plugin.json +1 -1
- package/README.md +19 -14
- package/assets/freeflow-plugin-icon.png +0 -0
- package/{plugins/freeflow/command-surface.json → command-surface.json} +10 -2
- package/evals/README.md +32 -0
- package/evals/fixtures/copy-conventions.md +31 -0
- package/evals/fixtures/output-router/README.md +12 -0
- package/evals/fixtures/output-router/failed-command-output.txt +9 -0
- package/evals/fixtures/output-router/large-router-manual.md +63 -0
- package/evals/fixtures/output-router/native-large-output.txt +40 -0
- package/evals/fixtures/output-router/noisy-test-output.txt +30 -0
- package/evals/fixtures/output-router/verification-output.txt +8 -0
- package/evals/fixtures/tiny-artifact-review-app/README.md +5 -0
- package/evals/fixtures/tiny-artifact-review-app/docs/billing-policy.md +10 -0
- package/evals/fixtures/tiny-artifact-review-app/docs/specs/billing-webhook-api-draft.md +21 -0
- package/evals/fixtures/tiny-artifact-review-app/docs/specs/failed-payment-grace-period.md +24 -0
- package/evals/fixtures/tiny-artifact-review-app/docs/specs/immediate-downgrade.md +17 -0
- package/evals/fixtures/tiny-artifact-review-app/tests/billing.test.md +8 -0
- package/evals/fixtures/tiny-commit-ambiguous-app/.freeflow-eval-setup.sh +15 -0
- package/evals/fixtures/tiny-commit-ambiguous-app/README.md +3 -0
- package/evals/fixtures/tiny-commit-ambiguous-app/src/billing.ts +5 -0
- package/evals/fixtures/tiny-commit-ambiguous-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-commit-ambiguous-app/tests/settings.test.md +5 -0
- package/evals/fixtures/tiny-commit-app/.freeflow-eval-setup.sh +14 -0
- package/evals/fixtures/tiny-commit-app/README.md +3 -0
- package/evals/fixtures/tiny-commit-app/docs/specs/settings-title.md +5 -0
- package/evals/fixtures/tiny-commit-app/src/billing.ts +5 -0
- package/evals/fixtures/tiny-commit-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-commit-app/tests/settings.test.md +5 -0
- package/evals/fixtures/tiny-commit-everything-app/.freeflow-eval-setup.sh +15 -0
- package/evals/fixtures/tiny-commit-everything-app/README.md +3 -0
- package/evals/fixtures/tiny-commit-everything-app/docs/specs/settings-title.md +5 -0
- package/evals/fixtures/tiny-commit-everything-app/src/billing.ts +5 -0
- package/evals/fixtures/tiny-commit-everything-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-commit-everything-app/tests/settings.test.md +5 -0
- package/evals/fixtures/tiny-commit-staged-app/.freeflow-eval-setup.sh +15 -0
- package/evals/fixtures/tiny-commit-staged-app/README.md +3 -0
- package/evals/fixtures/tiny-commit-staged-app/docs/specs/settings-title.md +5 -0
- package/evals/fixtures/tiny-commit-staged-app/src/billing.ts +5 -0
- package/evals/fixtures/tiny-commit-staged-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-commit-staged-app/tests/settings.test.md +5 -0
- package/evals/fixtures/tiny-commit-staged-mixed-app/.freeflow-eval-setup.sh +15 -0
- package/evals/fixtures/tiny-commit-staged-mixed-app/README.md +3 -0
- package/evals/fixtures/tiny-commit-staged-mixed-app/docs/billing-policy.md +3 -0
- package/evals/fixtures/tiny-commit-staged-mixed-app/docs/release-notes.md +3 -0
- package/evals/fixtures/tiny-commit-staged-mixed-app/src/billing.ts +5 -0
- package/evals/fixtures/tiny-dashboard-stale-app/README.md +11 -0
- package/evals/fixtures/tiny-dashboard-stale-app/src/api-client.ts +13 -0
- package/evals/fixtures/tiny-dashboard-stale-app/src/dashboard-data.ts +19 -0
- package/evals/fixtures/tiny-dashboard-stale-app/tests/dashboard-data.test.md +9 -0
- package/evals/fixtures/tiny-decision-destination-app/README.md +6 -0
- package/evals/fixtures/tiny-decision-destination-app/src/risk.ts +8 -0
- package/evals/fixtures/tiny-decision-destination-app/tests/risk.test.md +4 -0
- package/evals/fixtures/tiny-design-depth-app/README.md +15 -0
- package/evals/fixtures/tiny-design-depth-app/src/routes.ts +25 -0
- package/evals/fixtures/tiny-design-depth-app/src/sendEmail.ts +3 -0
- package/evals/fixtures/tiny-design-depth-app/src/sendSms.ts +3 -0
- package/evals/fixtures/tiny-design-depth-app/src/telemetry.ts +3 -0
- package/evals/fixtures/tiny-design-depth-app/tests/routes.test.md +12 -0
- package/evals/fixtures/tiny-eval-method-app/README.md +8 -0
- package/evals/fixtures/tiny-eval-method-app/evals/reports/review-pr-eval-result.md +5 -0
- package/evals/fixtures/tiny-eval-method-app/evals/reports/triage-question-failure.md +17 -0
- package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.diff +11 -0
- package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.md +3 -0
- package/evals/fixtures/tiny-eval-method-app/skills/review-pr/SKILL.md +10 -0
- package/evals/fixtures/tiny-eval-method-app/skills/triage-question/SKILL.md +10 -0
- package/evals/fixtures/tiny-execute-plan-app/README.md +5 -0
- package/evals/fixtures/tiny-execute-plan-app/checks/settings-and-billing-check.sh +5 -0
- package/evals/fixtures/tiny-execute-plan-app/docs/billing-policy.md +10 -0
- package/evals/fixtures/tiny-execute-plan-app/docs/plans/immediate-downgrade-plan.md +11 -0
- package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-plan.md +12 -0
- package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-with-bad-check.md +15 -0
- package/evals/fixtures/tiny-execute-plan-app/docs/plans/unverified-billing-plan.md +9 -0
- package/evals/fixtures/tiny-execute-plan-app/docs/specs/failed-payment-grace-period.md +9 -0
- package/evals/fixtures/tiny-execute-plan-app/docs/specs/settings-title.md +9 -0
- package/evals/fixtures/tiny-execute-plan-app/src/billing.ts +7 -0
- package/evals/fixtures/tiny-execute-plan-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-execute-plan-app/tests/billing.test.md +7 -0
- package/evals/fixtures/tiny-execute-plan-app/tests/settings.test.md +5 -0
- package/evals/fixtures/tiny-execute-review-loop-app/README.md +5 -0
- package/evals/fixtures/tiny-execute-review-loop-app/docs/billing-policy.md +9 -0
- package/evals/fixtures/tiny-execute-review-loop-app/docs/plans/settings-title-plan.md +12 -0
- package/evals/fixtures/tiny-execute-review-loop-app/docs/review/previous-agent-summary.md +15 -0
- package/evals/fixtures/tiny-execute-review-loop-app/docs/review/review-pass-1-non-pass.md +11 -0
- package/evals/fixtures/tiny-execute-review-loop-app/docs/specs/settings-title.md +9 -0
- package/evals/fixtures/tiny-execute-review-loop-app/src/billing.ts +7 -0
- package/evals/fixtures/tiny-execute-review-loop-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-execute-review-loop-app/tests/billing.test.md +7 -0
- package/evals/fixtures/tiny-execute-review-loop-app/tests/settings.test.md +5 -0
- package/evals/fixtures/tiny-flaky-session-app/README.md +10 -0
- package/evals/fixtures/tiny-flaky-session-app/src/session-timeout.ts +13 -0
- package/evals/fixtures/tiny-flaky-session-app/tests/session-timeout.test.md +8 -0
- package/evals/fixtures/tiny-handoff-app/README.md +5 -0
- package/evals/fixtures/tiny-handoff-app/docs/billing-policy.md +10 -0
- package/evals/fixtures/tiny-handoff-app/docs/handoffs/old-agent-handoff.md +8 -0
- package/evals/fixtures/tiny-handoff-app/docs/plans/billing-retry-plan.md +11 -0
- package/evals/fixtures/tiny-handoff-app/src/billing.ts +7 -0
- package/evals/fixtures/tiny-handoff-report-app/README.md +3 -0
- package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.diff +1 -0
- package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.md +1 -0
- package/evals/fixtures/tiny-handoff-report-app/evals/scores/hof-003-score.txt +4 -0
- package/evals/fixtures/tiny-plan-app/README.md +5 -0
- package/evals/fixtures/tiny-plan-app/docs/billing-policy.md +10 -0
- package/evals/fixtures/tiny-plan-app/docs/specs/failed-payment-grace-period.md +25 -0
- package/evals/fixtures/tiny-plan-app/src/billing.ts +17 -0
- package/evals/fixtures/tiny-plan-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-plan-app/tests/billing.test.md +8 -0
- package/evals/fixtures/tiny-plan-app/tests/settings.test.md +5 -0
- package/evals/fixtures/tiny-plan-strict-api-app/README.md +3 -0
- package/evals/fixtures/tiny-plan-strict-api-app/docs/billing-policy.md +5 -0
- package/evals/fixtures/tiny-plan-strict-api-app/docs/specs/billing-webhook-api.md +25 -0
- package/evals/fixtures/tiny-plan-strict-api-app/src/billing.ts +5 -0
- package/evals/fixtures/tiny-plan-strict-api-app/src/webhooks.ts +3 -0
- package/evals/fixtures/tiny-plan-strict-api-app/tests/billing-webhook.test.md +8 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/.freeflow/config.json +3 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/AGENTS.md +15 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/README.md +16 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/auth-review.md +15 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/billing-policy.md +10 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/copy-conventions.md +15 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/src/auth-middleware.ts +12 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/src/billing.ts +20 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/src/login-copy.ts +1 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/auth-middleware.test.md +8 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/billing.test.md +8 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/copy.test.md +7 -0
- package/evals/fixtures/tiny-post-setup-missing-config-app/AGENTS.md +15 -0
- package/evals/fixtures/tiny-post-setup-missing-config-app/README.md +16 -0
- package/evals/fixtures/tiny-post-setup-missing-config-app/docs/auth-review.md +15 -0
- package/evals/fixtures/tiny-post-setup-missing-config-app/docs/billing-policy.md +10 -0
- package/evals/fixtures/tiny-post-setup-missing-config-app/docs/copy-conventions.md +15 -0
- package/evals/fixtures/tiny-post-setup-missing-config-app/src/auth-middleware.ts +12 -0
- package/evals/fixtures/tiny-post-setup-missing-config-app/src/billing.ts +20 -0
- package/evals/fixtures/tiny-post-setup-missing-config-app/src/login-copy.ts +1 -0
- package/evals/fixtures/tiny-post-setup-missing-config-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-post-setup-missing-config-app/tests/auth-middleware.test.md +8 -0
- package/evals/fixtures/tiny-post-setup-missing-config-app/tests/billing.test.md +8 -0
- package/evals/fixtures/tiny-post-setup-missing-config-app/tests/copy.test.md +7 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/.freeflow/config.json +3 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/AGENTS.md +15 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/README.md +16 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/auth-review.md +15 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/billing-policy.md +10 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/copy-conventions.md +15 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/src/auth-middleware.ts +12 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/src/billing.ts +20 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/src/login-copy.ts +1 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/auth-middleware.test.md +8 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/billing.test.md +8 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/copy.test.md +7 -0
- package/evals/fixtures/tiny-report-performance-app/README.md +11 -0
- package/evals/fixtures/tiny-report-performance-app/docs/performance.md +10 -0
- package/evals/fixtures/tiny-report-performance-app/src/report-summary.ts +29 -0
- package/evals/fixtures/tiny-report-performance-app/tests/report-performance.test.md +8 -0
- package/evals/fixtures/tiny-review-request-app/README.md +3 -0
- package/evals/fixtures/tiny-review-request-app/docs/billing-policy.md +5 -0
- package/evals/fixtures/tiny-review-request-app/docs/plans/billing-webhook-api.md +19 -0
- package/evals/fixtures/tiny-review-request-app/docs/review/previous-agent-summary.md +20 -0
- package/evals/fixtures/tiny-review-request-app/docs/specs/billing-webhook-api.md +25 -0
- package/evals/fixtures/tiny-review-request-app/src/billing.ts +11 -0
- package/evals/fixtures/tiny-review-request-app/src/webhooks.ts +19 -0
- package/evals/fixtures/tiny-review-request-app/tests/billing-webhook.test.md +8 -0
- package/evals/fixtures/tiny-review-work-app/README.md +5 -0
- package/evals/fixtures/tiny-review-work-app/docs/billing-policy.md +9 -0
- package/evals/fixtures/tiny-review-work-app/docs/plans/settings-title-plan.md +12 -0
- package/evals/fixtures/tiny-review-work-app/docs/review/previous-agent-summary.md +15 -0
- package/evals/fixtures/tiny-review-work-app/docs/specs/settings-title.md +9 -0
- package/evals/fixtures/tiny-review-work-app/src/billing.ts +7 -0
- package/evals/fixtures/tiny-review-work-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-review-work-app/tests/billing.test.md +7 -0
- package/evals/fixtures/tiny-review-work-app/tests/settings.test.md +5 -0
- package/evals/fixtures/tiny-saas-app/README.md +16 -0
- package/evals/fixtures/tiny-saas-app/docs/auth-review.md +15 -0
- package/evals/fixtures/tiny-saas-app/docs/billing-policy.md +10 -0
- package/evals/fixtures/tiny-saas-app/docs/copy-conventions.md +15 -0
- package/evals/fixtures/tiny-saas-app/docs/specs/settings-title.md +13 -0
- package/evals/fixtures/tiny-saas-app/src/auth-middleware.ts +12 -0
- package/evals/fixtures/tiny-saas-app/src/billing.ts +20 -0
- package/evals/fixtures/tiny-saas-app/src/login-copy.ts +1 -0
- package/evals/fixtures/tiny-saas-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-saas-app/tests/auth-middleware.test.md +8 -0
- package/evals/fixtures/tiny-saas-app/tests/billing.test.md +8 -0
- package/evals/fixtures/tiny-saas-app/tests/copy.test.md +7 -0
- package/evals/fixtures/tiny-setup-agents-app/AGENTS.md +6 -0
- package/evals/fixtures/tiny-setup-both-app/AGENTS.md +5 -0
- package/evals/fixtures/tiny-setup-both-app/CLAUDE.md +5 -0
- package/evals/fixtures/tiny-setup-claude-app/CLAUDE.md +6 -0
- package/evals/fixtures/tiny-setup-codex-rules-app/.codex/rules/shell.rules +5 -0
- package/evals/fixtures/tiny-setup-codex-rules-app/AGENTS.md +6 -0
- package/evals/fixtures/tiny-setup-conflict-app/AGENTS.md +6 -0
- package/evals/fixtures/tiny-setup-existing-block-app/AGENTS.md +14 -0
- package/evals/fixtures/tiny-setup-four-rules-app/CLAUDE.md +6 -0
- package/evals/fixtures/tiny-skill-dev-app/README.md +10 -0
- package/evals/fixtures/tiny-skill-dev-app/evals/prompts/review-pr-001.txt +8 -0
- package/evals/fixtures/tiny-skill-dev-app/evals/reports/review-pr-failure.md +17 -0
- package/evals/fixtures/tiny-skill-dev-app/skills/review-pr/SKILL.md +13 -0
- package/evals/fixtures/tiny-team-app/README.md +5 -0
- package/evals/fixtures/tiny-team-app/docs/product.md +6 -0
- package/evals/fixtures/tiny-team-app/src/teams.ts +9 -0
- package/evals/fixtures/tiny-team-app/src/users.ts +5 -0
- package/evals/fixtures/tiny-team-app/tests/teams.test.md +7 -0
- package/evals/fixtures/tiny-verify-app/README.md +5 -0
- package/evals/fixtures/tiny-verify-app/src/settings-nav.ts +1 -0
- package/evals/fixtures/tiny-verify-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-verify-app/tests/settings.test.md +7 -0
- package/evals/prompts/aon-001.txt +2 -0
- package/evals/prompts/byp-001.txt +2 -0
- package/evals/prompts/byp-002.txt +2 -0
- package/evals/prompts/cap-001.txt +3 -0
- package/evals/prompts/cap-002.txt +3 -0
- package/evals/prompts/cmd-001.txt +3 -0
- package/evals/prompts/cmd-002.txt +3 -0
- package/evals/prompts/cmd-003.txt +6 -0
- package/evals/prompts/cmd-004.txt +5 -0
- package/evals/prompts/cmd-005.txt +5 -0
- package/evals/prompts/cmd-006.txt +5 -0
- package/evals/prompts/cmd-007.txt +5 -0
- package/evals/prompts/cmd-008.txt +5 -0
- package/evals/prompts/cmd-009.txt +8 -0
- package/evals/prompts/cmd-010.txt +5 -0
- package/evals/prompts/cmd-011.txt +5 -0
- package/evals/prompts/cmd-012.txt +5 -0
- package/evals/prompts/cmd-013.txt +5 -0
- package/evals/prompts/cmd-014.txt +7 -0
- package/evals/prompts/cmd-015.txt +7 -0
- package/evals/prompts/cmd-016.txt +5 -0
- package/evals/prompts/cmt-001.txt +1 -0
- package/evals/prompts/cmt-002.txt +1 -0
- package/evals/prompts/cmt-003.txt +1 -0
- package/evals/prompts/cmt-004.txt +1 -0
- package/evals/prompts/cmt-005.txt +1 -0
- package/evals/prompts/dfd-001.txt +3 -0
- package/evals/prompts/dia-001.txt +3 -0
- package/evals/prompts/dia-002.txt +3 -0
- package/evals/prompts/dia-003.txt +3 -0
- package/evals/prompts/dis-001.txt +5 -0
- package/evals/prompts/dis-002.txt +5 -0
- package/evals/prompts/esk-001.txt +5 -0
- package/evals/prompts/esk-002.txt +5 -0
- package/evals/prompts/esk-003.txt +5 -0
- package/evals/prompts/grc-001.txt +3 -0
- package/evals/prompts/hof-001.txt +3 -0
- package/evals/prompts/hof-002.txt +1 -0
- package/evals/prompts/hof-003.txt +1 -0
- package/evals/prompts/hof-004.txt +1 -0
- package/evals/prompts/hof-005.txt +1 -0
- package/evals/prompts/ivg-001.txt +1 -0
- package/evals/prompts/ivg-002.txt +11 -0
- package/evals/prompts/ivg-003.txt +1 -0
- package/evals/prompts/ivg-004.txt +1 -0
- package/evals/prompts/mode-001.txt +3 -0
- package/evals/prompts/mode-002.txt +1 -0
- package/evals/prompts/mode-003.txt +3 -0
- package/evals/prompts/mode-004.txt +3 -0
- package/evals/prompts/mode-005.txt +3 -0
- package/evals/prompts/mode-006.txt +3 -0
- package/evals/prompts/mode-007.txt +3 -0
- package/evals/prompts/otr-001.txt +3 -0
- package/evals/prompts/otr-002.txt +3 -0
- package/evals/prompts/rar-001.txt +5 -0
- package/evals/prompts/rar-002.txt +3 -0
- package/evals/prompts/rar-003.txt +6 -0
- package/evals/prompts/rar-004.txt +15 -0
- package/evals/prompts/rar-005.txt +10 -0
- package/evals/prompts/rbr-001.txt +3 -0
- package/evals/prompts/rbr-002.txt +3 -0
- package/evals/prompts/rbr-003.txt +7 -0
- package/evals/prompts/rev-001.txt +3 -0
- package/evals/prompts/rev-002.txt +5 -0
- package/evals/prompts/rev-003.txt +6 -0
- package/evals/prompts/rev-004.txt +1 -0
- package/evals/prompts/rev-005.txt +15 -0
- package/evals/prompts/rev-006.txt +5 -0
- package/evals/prompts/stp-001.txt +1 -0
- package/evals/prompts/stp-002.txt +1 -0
- package/evals/prompts/stp-003.txt +1 -0
- package/evals/prompts/stp-004.txt +1 -0
- package/evals/prompts/stp-005.txt +1 -0
- package/evals/prompts/stp-006.txt +1 -0
- package/evals/prompts/stp-007.txt +1 -0
- package/evals/prompts/stp-008.txt +1 -0
- package/evals/prompts/stp-009.txt +1 -0
- package/evals/prompts/stp-010.txt +1 -0
- package/evals/prompts/stp-011.txt +1 -0
- package/evals/prompts/vfy-003.txt +1 -0
- package/evals/prompts/wpl-001.txt +3 -0
- package/evals/prompts/wpl-002.txt +5 -0
- package/evals/prompts/wpl-003.txt +3 -0
- package/evals/prompts/wpl-004.txt +5 -0
- package/evals/prompts/wpl-005.txt +1 -0
- package/evals/prompts/wrc-001.txt +10 -0
- package/evals/prompts/wrc-002.txt +3 -0
- package/evals/prompts/wsk-001.txt +6 -0
- package/evals/prompts/wsp-001.txt +5 -0
- package/evals/prompts/wsp-002.txt +15 -0
- package/evals/prompts/wsp-003.txt +3 -0
- package/evals/prompts/wsp-004.txt +15 -0
- package/evals/prompts/wsp-005.txt +5 -0
- package/evals/prompts/wsp-006.txt +12 -0
- package/evals/prompts/wsp-007.txt +9 -0
- package/evals/prompts/wsp-008.txt +13 -0
- package/evals/prompts/xpl-001.txt +1 -0
- package/evals/prompts/xpl-002.txt +3 -0
- package/evals/prompts/xpl-003.txt +3 -0
- package/evals/prompts/xpl-004.txt +3 -0
- package/evals/prompts/xpl-005.txt +5 -0
- package/evals/prompts/xpl-006.txt +3 -0
- package/evals/registries/adversarial-evals.json +39 -0
- package/evals/registries/fixture-evals.json +2513 -0
- package/evals/registries/handoff-evals.json +74 -0
- package/evals/registries/legacy-evals.json +147 -0
- package/evals/registries/skill-evidence.json +193 -0
- package/evals/registries/verify-work-evals.json +46 -0
- package/evals/reports/acceptance/v0.1-acceptance-report.md +130 -0
- package/evals/reports/by-command-surface/command-surface-1-report.md +45 -0
- package/evals/reports/by-command-surface/command-surface-10-report.md +76 -0
- package/evals/reports/by-command-surface/command-surface-11-report.md +77 -0
- package/evals/reports/by-command-surface/command-surface-12-report.md +91 -0
- package/evals/reports/by-command-surface/command-surface-13-report.md +64 -0
- package/evals/reports/by-command-surface/command-surface-14-report.md +66 -0
- package/evals/reports/by-command-surface/command-surface-15-report.md +124 -0
- package/evals/reports/by-command-surface/command-surface-16-report.md +39 -0
- package/evals/reports/by-command-surface/command-surface-2-report.md +80 -0
- package/evals/reports/by-command-surface/command-surface-3-report.md +86 -0
- package/evals/reports/by-command-surface/command-surface-4-report.md +76 -0
- package/evals/reports/by-command-surface/command-surface-5-report.md +80 -0
- package/evals/reports/by-command-surface/command-surface-6-report.md +74 -0
- package/evals/reports/by-command-surface/command-surface-7-report.md +84 -0
- package/evals/reports/by-command-surface/command-surface-8-report.md +79 -0
- package/evals/reports/by-command-surface/command-surface-9-report.md +79 -0
- package/evals/reports/by-command-surface/command-surface-matrix.md +91 -0
- package/evals/reports/by-skill/bypass-1-report.md +124 -0
- package/evals/reports/by-skill/capture-decisions-1-report.md +99 -0
- package/evals/reports/by-skill/capture-decisions-2-report.md +102 -0
- package/evals/reports/by-skill/commit-work-1-report.md +165 -0
- package/evals/reports/by-skill/commit-work-2-report.md +109 -0
- package/evals/reports/by-skill/design-for-depth-1-report.md +95 -0
- package/evals/reports/by-skill/diagnose-failure-1-report.md +91 -0
- package/evals/reports/by-skill/diagnose-failure-2-report.md +94 -0
- package/evals/reports/by-skill/discover-1-report.md +118 -0
- package/evals/reports/by-skill/evaluate-skill-2-report.md +71 -0
- package/evals/reports/by-skill/execute-plan-1-report.md +103 -0
- package/evals/reports/by-skill/execute-plan-2-report.md +112 -0
- package/evals/reports/by-skill/execute-plan-3-report.md +87 -0
- package/evals/reports/by-skill/grill-context-1-report.md +103 -0
- package/evals/reports/by-skill/handoff-1-report.md +123 -0
- package/evals/reports/by-skill/handoff-2-report.md +105 -0
- package/evals/reports/by-skill/handoff-3-report.md +100 -0
- package/evals/reports/by-skill/handoff-7-report.md +77 -0
- package/evals/reports/by-skill/interview-gate-1-report.md +63 -0
- package/evals/reports/by-skill/interview-gate-2-report.md +105 -0
- package/evals/reports/by-skill/mode-contract-1-report.md +74 -0
- package/evals/reports/by-skill/mode-contract-2-report.md +87 -0
- package/evals/reports/by-skill/mode-contract-3-report.md +65 -0
- package/evals/reports/by-skill/mode-contract-4-report.md +71 -0
- package/evals/reports/by-skill/mode-contract-5-report.md +70 -0
- package/evals/reports/by-skill/output-router-1-report.md +76 -0
- package/evals/reports/by-skill/output-router-2-report.md +65 -0
- package/evals/reports/by-skill/research-1-report.md +144 -0
- package/evals/reports/by-skill/research-brief-1-report.md +94 -0
- package/evals/reports/by-skill/research-brief-2-report.md +75 -0
- package/evals/reports/by-skill/review-artifact-1-report.md +91 -0
- package/evals/reports/by-skill/review-artifact-2-report.md +79 -0
- package/evals/reports/by-skill/review-artifact-3-report.md +120 -0
- package/evals/reports/by-skill/review-artifact-4-report.md +89 -0
- package/evals/reports/by-skill/review-artifact-5-report.md +66 -0
- package/evals/reports/by-skill/review-work-1-report.md +85 -0
- package/evals/reports/by-skill/review-work-2-report.md +87 -0
- package/evals/reports/by-skill/review-work-3-report.md +104 -0
- package/evals/reports/by-skill/review-work-4-report.md +108 -0
- package/evals/reports/by-skill/review-work-5-report.md +73 -0
- package/evals/reports/by-skill/review-work-6-report.md +66 -0
- package/evals/reports/by-skill/setup-freeflow-1-report.md +199 -0
- package/evals/reports/by-skill/setup-freeflow-2-report.md +105 -0
- package/evals/reports/by-skill/setup-freeflow-3-report.md +105 -0
- package/evals/reports/by-skill/setup-freeflow-4-report.md +88 -0
- package/evals/reports/by-skill/setup-freeflow-5-report.md +115 -0
- package/evals/reports/by-skill/skill-authoring-1-report.md +81 -0
- package/evals/reports/by-skill/verify-work-1-report.md +111 -0
- package/evals/reports/by-skill/verify-work-2-report.md +120 -0
- package/evals/reports/by-skill/workflow-1-report.md +65 -0
- package/evals/reports/by-skill/write-plan-1-report.md +123 -0
- package/evals/reports/by-skill/write-plan-2-report.md +98 -0
- package/evals/reports/by-skill/write-plan-3-report.md +110 -0
- package/evals/reports/by-skill/write-spec-1-report.md +88 -0
- package/evals/reports/by-skill/write-spec-2-report.md +89 -0
- package/evals/reports/by-skill/write-spec-3-report.md +90 -0
- package/evals/reports/by-skill/write-spec-4-report.md +167 -0
- package/evals/reports/harness/claude-harness-1-report.md +103 -0
- package/evals/reports/harness/eval-harness-1-report.md +91 -0
- package/evals/reports/iterations/iteration-1-report.md +71 -0
- package/evals/reports/iterations/iteration-2-report.md +78 -0
- package/evals/reports/iterations/iteration-3-report.md +118 -0
- package/evals/reports/iterations/iteration-4-report.md +131 -0
- package/evals/reports/iterations/iteration-5-report.md +149 -0
- package/evals/reports/iterations/iteration-6-report.md +136 -0
- package/evals/reports/runtime/always-on-runtime-1-report.md +107 -0
- package/evals/reports/runtime/context-mode-normalized-benchmark-1-report.md +52 -0
- package/evals/reports/runtime/context-mode-real-deep-baseline-1-report.md +410 -0
- package/evals/reports/runtime/context-mode-real-deep-final-slice-11-report.md +203 -0
- package/evals/reports/runtime/context-mode-real-deep-final-slice-11-review.md +51 -0
- package/evals/reports/runtime/context-saving-native-tools-baseline-1-report.md +99 -0
- package/evals/reports/runtime/eryx-python-compatibility-reprobe-1-report.md +166 -0
- package/evals/reports/runtime/eryx-python-proof-spike-1-report.md +96 -0
- package/evals/reports/runtime/eryx-python-proof-spike-2-report.md +151 -0
- package/evals/reports/runtime/eryx-python-script-derive-execution-1-report.md +233 -0
- package/evals/reports/runtime/jq-script-derive-execution-1-report.md +215 -0
- package/evals/reports/runtime/jq-wasm-proof-spike-1-report.md +67 -0
- package/evals/reports/runtime/output-router-benchmark-1-report.md +81 -0
- package/evals/reports/runtime/output-router-capture-derive-provider-eval-1-report.md +35 -0
- package/evals/reports/runtime/output-router-codex-large-index-sqlite-adhoc-report.md +150 -0
- package/evals/reports/runtime/output-router-codex-qa-benchmark-1-report.md +46 -0
- package/evals/reports/runtime/output-router-command-benchmark-1-report.md +62 -0
- package/evals/reports/runtime/output-router-index-benchmark-1-report.md +64 -0
- package/evals/reports/runtime/output-router-regression-1-report.md +81 -0
- package/evals/reports/runtime/output-router-transform-eval-1-report.md +28 -0
- package/evals/reports/runtime/pi-observed-routing-eval-1-report.md +44 -0
- package/evals/reports/runtime/quickjs-script-derive-execution-1-report.md +159 -0
- package/evals/reports/runtime/quickjs-wasi-proof-spike-1-report.md +55 -0
- package/evals/reports/runtime/render-format-row-protocol-1-report.md +58 -0
- package/evals/reports/runtime/script-sandbox-adapter-selection-review-1-report.md +84 -0
- package/evals/reports/runtime/script-sandbox-probe-resource-hardening-1-report.md +51 -0
- package/evals/reports/runtime/storage-policy-benchmark-1-report.md +176 -0
- package/evals/reports/runtime/vault-index-storage-spike-1-report.md +39 -0
- package/evals/reports/runtime/workflow-context-hook-1-report.md +82 -0
- package/evals/runbooks/adversarial-eval-runbook.md +28 -0
- package/evals/runbooks/fixture-eval-runbook.md +137 -0
- package/evals/runbooks/handoff-eval-runbook.md +22 -0
- package/evals/runbooks/verify-work-eval-runbook.md +27 -0
- package/evals/scripts/audit-command-surface.sh +160 -0
- package/evals/scripts/check-activation-contract.sh +121 -0
- package/evals/scripts/check-runtime-context-hook.sh +183 -0
- package/evals/scripts/grade-fixture-eval.sh +446 -0
- package/evals/scripts/run-claude-fixture-eval.sh +26 -0
- package/evals/scripts/run-codex-fixture-eval.sh +26 -0
- package/evals/scripts/run-eryx-python-proof-spike.js +559 -0
- package/evals/scripts/run-fixture-eval-by-id.sh +23 -0
- package/evals/scripts/run-fixture-eval.sh +464 -0
- package/evals/scripts/run-jq-wasm-proof-spike.js +299 -0
- package/evals/scripts/run-output-router-transform-eval.js +115 -0
- package/evals/scripts/run-pi-observed-routing-eval.js +478 -0
- package/evals/scripts/run-quickjs-wasi-proof-spike.js +339 -0
- package/evals/scripts/skill-evidence.sh +316 -0
- package/evals/scripts/validate-release-metadata.sh +486 -0
- package/evals/suites/v0.1-acceptance-suite.md +131 -0
- package/{plugins/freeflow/hooks → hooks}/freeflow-runtime-context.mjs +46 -12
- package/package.json +39 -19
- package/pi-extension/dist/host-producer-identification.js +186 -0
- package/pi-extension/dist/index.js +85 -0
- package/pi-extension/dist/mcp-config.js +30 -0
- package/pi-extension/dist/native-safety-net.js +209 -0
- package/pi-extension/dist/observed-tool-routing.js +114 -0
- package/pi-extension/dist/renderers.js +835 -0
- package/pi-extension/dist/router-tools.js +438 -0
- package/pi-extension/dist/runtime-context.js +288 -0
- package/pi-extension/dist/schemas.js +254 -0
- package/pi-extension/dist/status.js +449 -0
- package/pi-extension/dist/utils.js +467 -0
- package/pi-extension/src/host-producer-identification.ts +226 -0
- package/pi-extension/src/index.ts +121 -0
- package/pi-extension/src/mcp-config.ts +32 -0
- package/pi-extension/src/native-safety-net.ts +252 -0
- package/pi-extension/src/observed-tool-routing.ts +126 -0
- package/pi-extension/src/renderers.ts +917 -0
- package/pi-extension/src/router-tools.ts +478 -0
- package/pi-extension/src/runtime-context.ts +347 -0
- package/pi-extension/src/schemas.ts +259 -0
- package/pi-extension/src/status.ts +505 -0
- package/pi-extension/src/utils.ts +492 -0
- package/pi-extension/tsconfig.json +16 -0
- package/{plugins/freeflow/docs → plugin-docs}/README.md +3 -3
- package/plugin-docs/adr/0002-evals-before-hooks.md +17 -0
- package/{plugins/freeflow/docs → plugin-docs}/adr/0003-release-boundary.md +2 -2
- package/plugin-docs/adr/0004-discover-replaces-shallow-discovery-skills.md +26 -0
- package/plugin-docs/adr/README.md +10 -0
- package/plugin-docs/architecture.md +89 -0
- package/plugin-docs/output-router.md +396 -0
- package/plugin-docs/release-evidence.md +77 -0
- package/{plugins/freeflow/docs → plugin-docs}/skills.md +3 -2
- package/{plugins/freeflow/docs → plugin-docs}/workflow.md +4 -4
- package/{plugins/freeflow/router/dist → router/dist/benchmarks}/benchmark-harness.js +1 -1
- package/{plugins/freeflow/router/dist → router/dist/benchmarks}/benchmarks.js +14 -14
- package/{plugins/freeflow/router/dist → router/dist/benchmarks}/codex-qa-benchmarks.js +6 -6
- package/{plugins/freeflow/router/dist → router/dist/benchmarks}/command-benchmarks.d.ts +1 -1
- package/{plugins/freeflow/router/dist → router/dist/benchmarks}/command-benchmarks.js +11 -10
- package/router/dist/benchmarks/context-mode-normalized-benchmarks.d.ts +74 -0
- package/router/dist/benchmarks/context-mode-normalized-benchmarks.js +707 -0
- package/router/dist/benchmarks/context-mode-real-deep-benchmark.d.ts +124 -0
- package/router/dist/benchmarks/context-mode-real-deep-benchmark.js +1295 -0
- package/router/dist/benchmarks/context-saving-baseline.d.ts +54 -0
- package/router/dist/benchmarks/context-saving-baseline.js +439 -0
- package/{plugins/freeflow/router/dist → router/dist/benchmarks}/index-benchmarks.d.ts +16 -2
- package/{plugins/freeflow/router/dist → router/dist/benchmarks}/index-benchmarks.js +330 -26
- package/router/dist/benchmarks/storage-policy-benchmarks.d.ts +90 -0
- package/router/dist/benchmarks/storage-policy-benchmarks.js +538 -0
- package/router/dist/benchmarks/vault-index-benchmarks.d.ts +47 -0
- package/router/dist/benchmarks/vault-index-benchmarks.js +257 -0
- package/router/dist/config/config.d.ts +96 -0
- package/router/dist/config/config.js +453 -0
- package/{plugins/freeflow/router/dist → router/dist/config}/schema.js +248 -2
- package/router/dist/config/types.d.ts +521 -0
- package/router/dist/config/types.js +30 -0
- package/{plugins/freeflow/router/dist → router/dist/evidence}/bounded-evidence.d.ts +1 -1
- package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence-range-selector.js +65 -14
- package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence-search.js +18 -2
- package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence.d.ts +1 -1
- package/router/dist/evidence/failure-contracts.d.ts +27 -0
- package/router/dist/evidence/failure-contracts.js +160 -0
- package/router/dist/index.d.ts +30 -0
- package/router/dist/index.js +32 -0
- package/router/dist/processing/engine.d.ts +108 -0
- package/router/dist/processing/engine.js +435 -0
- package/router/dist/processing/reducers.d.ts +266 -0
- package/router/dist/processing/reducers.js +1495 -0
- package/router/dist/processing/renderers.d.ts +25 -0
- package/router/dist/processing/renderers.js +186 -0
- package/router/dist/processing/scripts.d.ts +78 -0
- package/router/dist/processing/scripts.js +333 -0
- package/router/dist/routing/observed-reducers.d.ts +35 -0
- package/router/dist/routing/observed-reducers.js +647 -0
- package/router/dist/routing/observed-routing.d.ts +17 -0
- package/router/dist/routing/observed-routing.js +377 -0
- package/{plugins/freeflow/router/dist → router/dist/routing}/parsers.d.ts +1 -1
- package/{plugins/freeflow/router/dist → router/dist/routing}/parsers.js +1 -1
- package/router/dist/routing/run-filters.d.ts +56 -0
- package/router/dist/routing/run-filters.js +230 -0
- package/router/dist/routing/run-reducers.d.ts +30 -0
- package/router/dist/routing/run-reducers.js +110 -0
- package/router/dist/sandbox/adapter-roots.d.ts +38 -0
- package/router/dist/sandbox/adapter-roots.js +64 -0
- package/router/dist/sandbox/eryx-python-adapter.d.ts +9 -0
- package/router/dist/sandbox/eryx-python-adapter.js +797 -0
- package/router/dist/sandbox/jq-wasm-adapter.d.ts +9 -0
- package/router/dist/sandbox/jq-wasm-adapter.js +421 -0
- package/router/dist/sandbox/quickjs-wasi-adapter.d.ts +9 -0
- package/router/dist/sandbox/quickjs-wasi-adapter.js +381 -0
- package/router/dist/sandbox/script-sandbox.d.ts +113 -0
- package/router/dist/sandbox/script-sandbox.js +303 -0
- package/router/dist/setup/script-transform-adapters.d.ts +28 -0
- package/router/dist/setup/script-transform-adapters.js +259 -0
- package/router/dist/tools/batch.d.ts +22 -0
- package/router/dist/tools/batch.js +509 -0
- package/router/dist/tools/run.d.ts +50 -0
- package/router/dist/tools/run.js +1219 -0
- package/router/dist/tools/search.d.ts +44 -0
- package/{plugins/freeflow/router/dist/retrieve.js → router/dist/tools/search.js} +395 -45
- package/router/dist/transform/engine.d.ts +143 -0
- package/router/dist/transform/engine.js +1955 -0
- package/router/dist/vault/vault-index.d.ts +106 -0
- package/router/dist/vault/vault-index.js +411 -0
- package/{plugins/freeflow/router/dist → router/dist/vault}/vault.d.ts +24 -1
- package/{plugins/freeflow/router/dist → router/dist/vault}/vault.js +152 -1
- package/skills/design-for-depth/SKILL.md +90 -0
- package/skills/design-for-depth/references/design-pressure-signals.md +265 -0
- package/skills/design-for-depth/references/software-design-philosophy.md +219 -0
- package/{plugins/freeflow/skills → skills}/diagnose-failure/SKILL.md +6 -1
- package/{plugins/freeflow/skills/research → skills/discover}/ARTIFACT-DESTINATIONS.md +4 -4
- package/{plugins/freeflow/skills/research → skills/discover}/CHECKPOINTS.md +4 -4
- package/skills/discover/SKILL.md +173 -0
- package/{plugins/freeflow/skills → skills}/execute-plan/SKILL.md +5 -4
- package/{plugins/freeflow/skills → skills}/execute-plan/references/execution-map.md +2 -2
- package/{plugins/freeflow/skills → skills}/mode-contract/SKILL.md +9 -4
- package/skills/output-router/SKILL.md +202 -0
- package/skills/output-router/references/safety-policy.md +40 -0
- package/{plugins/freeflow/skills → skills}/review-artifact/SKILL.md +5 -2
- package/{plugins/freeflow/skills → skills}/review-artifact/references/reviewer-prompt.md +2 -1
- package/{plugins/freeflow/skills → skills}/review-work/SKILL.md +6 -1
- package/{plugins/freeflow/skills → skills}/setup-freeflow/SKILL.md +21 -9
- package/{plugins/freeflow/skills → skills}/setup-freeflow/references/activation-contract.md +11 -10
- package/{plugins/freeflow/skills → skills}/setup-freeflow/references/host-setup.md +3 -3
- package/skills/setup-freeflow/references/output-router-setup.md +102 -0
- package/{plugins/freeflow/skills → skills}/verify-work/SKILL.md +3 -1
- package/{plugins/freeflow/skills → skills}/workflow/SKILL.md +16 -14
- package/{plugins/freeflow/skills → skills}/workflow/references/workflow-map.md +16 -14
- package/{plugins/freeflow/skills → skills}/write-plan/SKILL.md +9 -1
- package/{plugins/freeflow/skills → skills}/write-spec/SKILL.md +9 -6
- package/plugins/freeflow/docs/adr/0002-evals-before-hooks.md +0 -17
- package/plugins/freeflow/docs/adr/0004-research-replaces-shallow-discovery-skills.md +0 -26
- package/plugins/freeflow/docs/adr/README.md +0 -8
- package/plugins/freeflow/docs/architecture.md +0 -86
- package/plugins/freeflow/docs/output-router.md +0 -212
- package/plugins/freeflow/docs/release-evidence.md +0 -69
- package/plugins/freeflow/pi-extension/index.js +0 -1176
- package/plugins/freeflow/router/dist/config.d.ts +0 -22
- package/plugins/freeflow/router/dist/config.js +0 -114
- package/plugins/freeflow/router/dist/experimental-local-index.d.ts +0 -1
- package/plugins/freeflow/router/dist/experimental-local-index.js +0 -1
- package/plugins/freeflow/router/dist/index.d.ts +0 -12
- package/plugins/freeflow/router/dist/index.js +0 -12
- package/plugins/freeflow/router/dist/retrieve.d.ts +0 -33
- package/plugins/freeflow/router/dist/run.d.ts +0 -26
- package/plugins/freeflow/router/dist/run.js +0 -356
- package/plugins/freeflow/router/dist/types.d.ts +0 -234
- package/plugins/freeflow/router/dist/types.js +0 -9
- package/plugins/freeflow/skills/output-router/SKILL.md +0 -69
- package/plugins/freeflow/skills/output-router/references/safety-policy.md +0 -33
- package/plugins/freeflow/skills/research/LANGUAGE.md +0 -61
- package/plugins/freeflow/skills/research/SKILL.md +0 -128
- package/plugins/freeflow/skills/setup-freeflow/references/output-router-setup.md +0 -52
- /package/{plugins/freeflow/assets → assets}/freeflow-plugin-icon-transparent.png +0 -0
- /package/{plugins/freeflow/hooks → hooks}/hooks.json +0 -0
- /package/{plugins/freeflow/docs → plugin-docs}/adr/0001-three-modes.md +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/benchmarks}/benchmark-harness.d.ts +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/benchmarks}/benchmarks.d.ts +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/benchmarks}/codex-qa-benchmarks.d.ts +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/config}/router-contract.d.ts +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/config}/router-contract.js +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/config}/schema.d.ts +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/evidence}/bounded-evidence.js +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence-range-selector.d.ts +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence-search.d.ts +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence.js +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/evidence}/line-ranges.d.ts +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/evidence}/line-ranges.js +0 -0
- /package/{plugins/freeflow/router → router}/dist/experiments/local-index.d.ts +0 -0
- /package/{plugins/freeflow/router → router}/dist/experiments/local-index.js +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/repo}/repo-traversal.d.ts +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/repo}/repo-traversal.js +0 -0
- /package/{plugins/freeflow/skills → skills}/bypass/SKILL.md +0 -0
- /package/{plugins/freeflow/skills → skills}/commit-work/SKILL.md +0 -0
- /package/{plugins/freeflow/skills → skills}/commit-work/references/staging-decisions.md +0 -0
- /package/{plugins/freeflow/skills → skills}/diagnose-failure/references/feedback-loop-catalog.md +0 -0
- /package/{plugins/freeflow/skills → skills}/diagnose-failure/references/flaky-and-performance.md +0 -0
- /package/{plugins/freeflow/skills → skills}/evaluate-skill/SKILL.md +0 -0
- /package/{plugins/freeflow/skills → skills}/evaluate-skill/references/eval-patterns.md +0 -0
- /package/{plugins/freeflow/skills → skills}/evaluate-skill/references/grading-priority.md +0 -0
- /package/{plugins/freeflow/skills → skills}/handoff/SKILL.md +0 -0
- /package/{plugins/freeflow/skills → skills}/handoff/references/templates.md +0 -0
- /package/{plugins/freeflow/skills → skills}/interview-gate/SKILL.md +0 -0
- /package/{plugins/freeflow/skills → skills}/review-work/references/reviewer-prompt.md +0 -0
- /package/{plugins/freeflow/skills → skills}/write-plan/references/plan-shapes.md +0 -0
- /package/{plugins/freeflow/skills → skills}/write-skill/SKILL.md +0 -0
- /package/{plugins/freeflow/skills → skills}/write-spec/references/artifact-standards.md +0 -0
- /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 "
|
|
5
|
-
import { findBestLineForQuery, searchRepoEvidenceCandidates, } from "
|
|
6
|
-
import { resolveExactLineRange } from "
|
|
7
|
-
import { collectRepoTextFileRefs, resolveRepoPath } from "
|
|
8
|
-
import {
|
|
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
|
|
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, `
|
|
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,
|
|
109
|
+
const candidateLine = findBestLineForQuery(lines, query);
|
|
82
110
|
if (candidateLine === null) {
|
|
83
111
|
return {
|
|
84
112
|
toolStatus: "ok",
|
|
85
|
-
decisionId: decisionId(
|
|
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
|
|
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,
|
|
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:
|
|
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(
|
|
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:
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
303
|
-
|
|
304
|
-
|
|
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}.
|
|
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
|
-
|
|
322
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
}
|