@piagent/platform 1.6.1 → 1.7.1
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/CHANGELOG.md +55 -0
- package/README.md +8 -2
- package/README.vi.md +11 -2
- package/adapters/common/assurance-producers.json +109 -0
- package/adapters/common/structured-assurance-facts.mjs +153 -0
- package/adapters/node-typescript/contract-families.json +2811 -0
- package/adapters/node-typescript/contract-families.md +90 -0
- package/benchmarks/production-v1/grade.mjs +20 -0
- package/benchmarks/production-v1/spend-control.v1.json +3 -3
- package/benchmarks/production-v2/grade.mjs +892 -0
- package/benchmarks/production-v2/project/README.md +7 -0
- package/benchmarks/production-v2/project/config/service.json +4 -0
- package/benchmarks/production-v2/project/data/audit-ledger.jsonl +1 -0
- package/benchmarks/production-v2/project/docs/ops.md +3 -0
- package/benchmarks/production-v2/project/logs/incident.log +2 -0
- package/benchmarks/production-v2/project/package.json +11 -0
- package/benchmarks/production-v2/project/scripts/check.mjs +21 -0
- package/benchmarks/production-v2/project/src/backend/auth.js +3 -0
- package/benchmarks/production-v2/project/src/backend/billing-window.js +4 -0
- package/benchmarks/production-v2/project/src/backend/cache.js +15 -0
- package/benchmarks/production-v2/project/src/backend/invoice.js +4 -0
- package/benchmarks/production-v2/project/src/backend/revocation-cache.js +3 -0
- package/benchmarks/production-v2/project/src/data/csv.js +3 -0
- package/benchmarks/production-v2/project/src/data/dedup.js +5 -0
- package/benchmarks/production-v2/project/src/data/migration.js +9 -0
- package/benchmarks/production-v2/project/src/data/ndjson-stream.js +5 -0
- package/benchmarks/production-v2/project/src/data/versioned-replay.js +8 -0
- package/benchmarks/production-v2/project/src/frontend/chat-events.js +7 -0
- package/benchmarks/production-v2/project/src/frontend/pagination.js +8 -0
- package/benchmarks/production-v2/project/src/frontend/request-lifecycle.js +15 -0
- package/benchmarks/production-v2/project/src/frontend/search-state.js +8 -0
- package/benchmarks/production-v2/project/src/frontend/unicode-search.js +7 -0
- package/benchmarks/production-v2/project/src/fullstack/contract-sync.js +10 -0
- package/benchmarks/production-v2/project/src/platform/args.js +10 -0
- package/benchmarks/production-v2/project/src/platform/config.js +7 -0
- package/benchmarks/production-v2/project/src/platform/workflow-session.js +9 -0
- package/benchmarks/production-v2/project/src/platform/workspace.js +13 -0
- package/benchmarks/production-v2/project/src/reliability/checkpoint.js +5 -0
- package/benchmarks/production-v2/project/src/reliability/expiry.js +5 -0
- package/benchmarks/production-v2/project/src/reliability/retry.js +15 -0
- package/benchmarks/production-v2/project/test/smoke.test.js +21 -0
- package/benchmarks/production-v2/project/vendor/README.md +1 -0
- package/benchmarks/production-v2/prompts/abort-reconnect-supersession.md +11 -0
- package/benchmarks/production-v2/prompts/backend-frontend-contract-sync.md +12 -0
- package/benchmarks/production-v2/prompts/billing-cutoff-clock-skew.md +11 -0
- package/benchmarks/production-v2/prompts/bounded-retry.md +7 -0
- package/benchmarks/production-v2/prompts/chunked-record-boundary.md +9 -0
- package/benchmarks/production-v2/prompts/cli-double-dash.md +7 -0
- package/benchmarks/production-v2/prompts/config-precedence.md +6 -0
- package/benchmarks/production-v2/prompts/destructive-history-refusal.md +3 -0
- package/benchmarks/production-v2/prompts/expiry-boundary.md +7 -0
- package/benchmarks/production-v2/prompts/idempotent-replay-conflict.md +11 -0
- package/benchmarks/production-v2/prompts/incident-diagnosis.md +4 -0
- package/benchmarks/production-v2/prompts/invoice-rounding.md +9 -0
- package/benchmarks/production-v2/prompts/journeys/config-precedence-scout.md +3 -0
- package/benchmarks/production-v2/prompts/journeys/expiry-boundary-scout.md +3 -0
- package/benchmarks/production-v2/prompts/journeys/quoted-csv-scout.md +3 -0
- package/benchmarks/production-v2/prompts/journeys/recover-after-uncertain-send.md +4 -0
- package/benchmarks/production-v2/prompts/journeys/repository-prompt-injection-scout.md +4 -0
- package/benchmarks/production-v2/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
- package/benchmarks/production-v2/prompts/journeys/stable-dedup-scout.md +3 -0
- package/benchmarks/production-v2/prompts/journeys/stale-search-response-scout.md +3 -0
- package/benchmarks/production-v2/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
- package/benchmarks/production-v2/prompts/journeys/verify-current-contract.md +4 -0
- package/benchmarks/production-v2/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
- package/benchmarks/production-v2/prompts/pagination-boundary.md +7 -0
- package/benchmarks/production-v2/prompts/protected-env-refusal.md +2 -0
- package/benchmarks/production-v2/prompts/quoted-csv.md +6 -0
- package/benchmarks/production-v2/prompts/reconnect-chat-event-order.md +19 -0
- package/benchmarks/production-v2/prompts/repository-prompt-injection.md +5 -0
- package/benchmarks/production-v2/prompts/resumable-checkpoint-partial-failure.md +11 -0
- package/benchmarks/production-v2/prompts/revoked-session-cache.md +10 -0
- package/benchmarks/production-v2/prompts/schema-migration.md +6 -0
- package/benchmarks/production-v2/prompts/stable-dedup.md +6 -0
- package/benchmarks/production-v2/prompts/stale-search-response.md +6 -0
- package/benchmarks/production-v2/prompts/tenant-cache-isolation.md +6 -0
- package/benchmarks/production-v2/prompts/tenant-role-authorization.md +6 -0
- package/benchmarks/production-v2/prompts/unicode-search.md +6 -0
- package/benchmarks/production-v2/prompts/workflow-switch-same-session.md +30 -0
- package/benchmarks/production-v2/prompts/workspace-order.md +7 -0
- package/benchmarks/production-v2/spend-control.v1.json +115 -0
- package/benchmarks/production-v2/suite.json +1009 -0
- package/benchmarks/production-v2/variant.mjs +169 -0
- package/benchmarks/production-v3/CONTRACT-REVISION-20260922.md +31 -0
- package/benchmarks/production-v3/calibration/corpus.v1.json +63 -0
- package/benchmarks/production-v3/calibration/human-review-rubric.v1.json +36 -0
- package/benchmarks/production-v3/grade.mjs +1017 -0
- package/benchmarks/production-v3/project/README.md +7 -0
- package/benchmarks/production-v3/project/config/service.json +4 -0
- package/benchmarks/production-v3/project/data/audit-ledger.jsonl +1 -0
- package/benchmarks/production-v3/project/docs/ops.md +3 -0
- package/benchmarks/production-v3/project/logs/incident.log +2 -0
- package/benchmarks/production-v3/project/package.json +11 -0
- package/benchmarks/production-v3/project/scripts/check.mjs +21 -0
- package/benchmarks/production-v3/project/src/backend/auth.js +3 -0
- package/benchmarks/production-v3/project/src/backend/billing-window.js +4 -0
- package/benchmarks/production-v3/project/src/backend/cache.js +15 -0
- package/benchmarks/production-v3/project/src/backend/invoice.js +4 -0
- package/benchmarks/production-v3/project/src/backend/revocation-cache.js +12 -0
- package/benchmarks/production-v3/project/src/data/csv.js +3 -0
- package/benchmarks/production-v3/project/src/data/dedup.js +5 -0
- package/benchmarks/production-v3/project/src/data/migration.js +9 -0
- package/benchmarks/production-v3/project/src/data/ndjson-stream.js +5 -0
- package/benchmarks/production-v3/project/src/data/versioned-replay.js +8 -0
- package/benchmarks/production-v3/project/src/frontend/chat-events.js +7 -0
- package/benchmarks/production-v3/project/src/frontend/pagination.js +8 -0
- package/benchmarks/production-v3/project/src/frontend/request-lifecycle.js +23 -0
- package/benchmarks/production-v3/project/src/frontend/search-state.js +8 -0
- package/benchmarks/production-v3/project/src/frontend/unicode-search.js +7 -0
- package/benchmarks/production-v3/project/src/fullstack/contract-sync.js +10 -0
- package/benchmarks/production-v3/project/src/platform/args.js +10 -0
- package/benchmarks/production-v3/project/src/platform/config.js +7 -0
- package/benchmarks/production-v3/project/src/platform/workflow-session.js +9 -0
- package/benchmarks/production-v3/project/src/platform/workspace.js +13 -0
- package/benchmarks/production-v3/project/src/reliability/checkpoint.js +5 -0
- package/benchmarks/production-v3/project/src/reliability/expiry.js +14 -0
- package/benchmarks/production-v3/project/src/reliability/retry.js +15 -0
- package/benchmarks/production-v3/project/test/smoke.test.js +21 -0
- package/benchmarks/production-v3/project/vendor/README.md +1 -0
- package/benchmarks/production-v3/prompts/abort-reconnect-supersession.md +11 -0
- package/benchmarks/production-v3/prompts/backend-frontend-contract-sync.md +20 -0
- package/benchmarks/production-v3/prompts/billing-cutoff-clock-skew.md +11 -0
- package/benchmarks/production-v3/prompts/bounded-retry.md +7 -0
- package/benchmarks/production-v3/prompts/chunked-record-boundary.md +11 -0
- package/benchmarks/production-v3/prompts/cli-double-dash.md +7 -0
- package/benchmarks/production-v3/prompts/config-precedence.md +6 -0
- package/benchmarks/production-v3/prompts/destructive-history-refusal.md +9 -0
- package/benchmarks/production-v3/prompts/expiry-boundary.md +14 -0
- package/benchmarks/production-v3/prompts/idempotent-replay-conflict.md +13 -0
- package/benchmarks/production-v3/prompts/incident-diagnosis.md +4 -0
- package/benchmarks/production-v3/prompts/invoice-rounding.md +9 -0
- package/benchmarks/production-v3/prompts/journeys/config-precedence-scout.md +3 -0
- package/benchmarks/production-v3/prompts/journeys/expiry-boundary-scout.md +3 -0
- package/benchmarks/production-v3/prompts/journeys/quoted-csv-scout.md +3 -0
- package/benchmarks/production-v3/prompts/journeys/recover-after-uncertain-send.md +4 -0
- package/benchmarks/production-v3/prompts/journeys/repository-prompt-injection-scout.md +4 -0
- package/benchmarks/production-v3/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
- package/benchmarks/production-v3/prompts/journeys/stable-dedup-scout.md +3 -0
- package/benchmarks/production-v3/prompts/journeys/stale-search-response-scout.md +3 -0
- package/benchmarks/production-v3/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
- package/benchmarks/production-v3/prompts/journeys/verify-current-contract.md +4 -0
- package/benchmarks/production-v3/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
- package/benchmarks/production-v3/prompts/pagination-boundary.md +9 -0
- package/benchmarks/production-v3/prompts/protected-env-refusal.md +8 -0
- package/benchmarks/production-v3/prompts/quoted-csv.md +6 -0
- package/benchmarks/production-v3/prompts/reconnect-chat-event-order.md +20 -0
- package/benchmarks/production-v3/prompts/repository-prompt-injection.md +5 -0
- package/benchmarks/production-v3/prompts/resumable-checkpoint-partial-failure.md +15 -0
- package/benchmarks/production-v3/prompts/revoked-session-cache.md +10 -0
- package/benchmarks/production-v3/prompts/schema-migration.md +6 -0
- package/benchmarks/production-v3/prompts/stable-dedup.md +6 -0
- package/benchmarks/production-v3/prompts/stale-search-response.md +6 -0
- package/benchmarks/production-v3/prompts/tenant-cache-isolation.md +6 -0
- package/benchmarks/production-v3/prompts/tenant-role-authorization.md +6 -0
- package/benchmarks/production-v3/prompts/unicode-search.md +6 -0
- package/benchmarks/production-v3/prompts/workflow-switch-same-session.md +30 -0
- package/benchmarks/production-v3/prompts/workspace-order.md +7 -0
- package/benchmarks/production-v3/public-checks/abort-reconnect-supersession.js +34 -0
- package/benchmarks/production-v3/public-checks/expiry-boundary.js +29 -0
- package/benchmarks/production-v3/public-checks/revoked-session-cache.js +20 -0
- package/benchmarks/production-v3/spend-control.v1.json +121 -0
- package/benchmarks/production-v3/suite.json +1010 -0
- package/benchmarks/production-v3/variant.mjs +178 -0
- package/catalog/capabilities.json +2 -2
- package/docs/benchmark-codex-mcp-metadata-contract-v1.md +159 -0
- package/docs/benchmark-codex-mcp-metadata-contract-v2.md +182 -0
- package/docs/benchmark-codex-mcp-metadata-contract-v3.md +194 -0
- package/docs/benchmark-public-contract-addendum-v2.md +85 -0
- package/docs/benchmark-public-contract-addendum-v3.md +116 -0
- package/docs/command-reference-vietnamese.md +10 -7
- package/docs/context-window-policy.md +3 -3
- package/docs/distribution-standard.md +9 -9
- package/docs/languages.json +2 -2
- package/docs/operator-manual-vietnamese.md +12 -12
- package/docs/piagent-codex-benchmark-recovery-plan.md +1817 -0
- package/docs/piagent-core-evaluation-specs-2026-09-06.json +706 -0
- package/docs/piagent-core-improvement-plan.md +528 -0
- package/docs/piagent-core-offline-implementation-2026-09-06.md +219 -0
- package/docs/piagent-core-plan-checkpoint-2026-09-06.json +69 -0
- package/docs/piagent-core-reasoning-research-2026-09-06.md +225 -0
- package/docs/piagent-core-research-sources-2026-09-06.json +416 -0
- package/docs/piagent-open-session-wait.md +19 -0
- package/docs/piagent-runtime-benchmark-execution-plan.md +685 -0
- package/docs/publishing-for-teams.md +2 -0
- package/docs/quality-benchmark.md +128 -8
- package/docs/quickstart-vietnamese.md +2 -2
- package/docs/release-install-policy.md +32 -9
- package/docs/research/harness-next-evidence-review.md +113 -0
- package/docs/team-onboarding.md +7 -7
- package/docs/third-party-neutrality.md +7 -0
- package/docs/usage-observability.md +1 -1
- package/docs-site/architecture.html +1 -1
- package/docs-site/benchmark.html +1 -1
- package/docs-site/commands.html +1 -1
- package/docs-site/content/en/runtime.html +1 -1
- package/docs-site/content/en/whats-new.html +11 -0
- package/docs-site/content/runtime.html +2 -2
- package/docs-site/content/whats-new.html +11 -0
- package/docs-site/context-engine.html +1 -1
- package/docs-site/en/architecture.html +1 -1
- package/docs-site/en/benchmark.html +1 -1
- package/docs-site/en/commands.html +1 -1
- package/docs-site/en/context-engine.html +1 -1
- package/docs-site/en/index.html +1 -1
- package/docs-site/en/mcp-approval.html +1 -1
- package/docs-site/en/mcp-auth.html +1 -1
- package/docs-site/en/mcp-servers.html +1 -1
- package/docs-site/en/mcp.html +1 -1
- package/docs-site/en/permissions.html +1 -1
- package/docs-site/en/profiles.html +1 -1
- package/docs-site/en/quickstart.html +1 -1
- package/docs-site/en/runtime.html +2 -2
- package/docs-site/en/scope.html +1 -1
- package/docs-site/en/security.html +1 -1
- package/docs-site/en/team.html +1 -1
- package/docs-site/en/whats-new.html +12 -1
- package/docs-site/en/workflows.html +1 -1
- package/docs-site/index.html +1 -1
- package/docs-site/mcp-approval.html +1 -1
- package/docs-site/mcp-auth.html +1 -1
- package/docs-site/mcp-servers.html +1 -1
- package/docs-site/mcp.html +1 -1
- package/docs-site/permissions.html +1 -1
- package/docs-site/profiles.html +1 -1
- package/docs-site/quickstart.html +1 -1
- package/docs-site/runtime.html +3 -3
- package/docs-site/scope.html +1 -1
- package/docs-site/security.html +1 -1
- package/docs-site/team.html +1 -1
- package/docs-site/whats-new.html +12 -1
- package/docs-site/workflows.html +1 -1
- package/evals/architecture-conformance-v1/lane.json +18 -0
- package/evals/architecture-conformance-v1/runner.mjs +77 -0
- package/evals/fixtures/approved-host-contracts.invalid.json +43 -0
- package/evals/fixtures/approved-host-contracts.valid.json +43 -0
- package/evals/fixtures/benchmark-attempt-outcome.invalid.json +42 -0
- package/evals/fixtures/benchmark-attempt-outcome.valid.json +42 -0
- package/evals/fixtures/benchmark-independent-verification-plan.invalid.json +7 -0
- package/evals/fixtures/benchmark-independent-verification-plan.valid.json +21 -0
- package/evals/fixtures/composite-criterion.invalid.json +10 -0
- package/evals/fixtures/composite-criterion.valid.json +33 -0
- package/evals/fixtures/contract-family-library.invalid.json +42 -0
- package/evals/fixtures/contract-family-library.valid.json +41 -0
- package/evals/fixtures/contract-selection-recipe.invalid.json +29 -0
- package/evals/fixtures/contract-selection-recipe.valid.json +29 -0
- package/evals/fixtures/host-contract-plan.invalid.json +42 -0
- package/evals/fixtures/host-contract-plan.valid.json +41 -0
- package/evals/fixtures/scoped-project-verification-receipt-v2.invalid.json +42 -0
- package/evals/fixtures/scoped-project-verification-receipt-v2.valid.json +42 -0
- package/evals/fixtures/scoped-project-verification-receipt-v3.invalid.json +57 -0
- package/evals/fixtures/scoped-project-verification-receipt-v3.valid.json +57 -0
- package/evals/fixtures/scoped-verification-receipt-v1.invalid.json +40 -0
- package/evals/fixtures/scoped-verification-receipt-v1.valid.json +40 -0
- package/evals/fs5-artifact-archive/README.md +32 -0
- package/evals/fs5-artifact-archive/manifest.json +148 -0
- package/evals/fs5-artifact-archive/sha256/1f073f6d42c093a3182685e0e096144c8b3befd87594aeea1af05ce17653860c.txt +380 -0
- package/evals/fs5-artifact-archive/sha256/1ff46984c5ff668647dfad94248cd9dcfb72384a8aa529279345582f90d7486a.txt +331 -0
- package/evals/fs5-artifact-archive/sha256/20a5e1ef1cab3234a888b876b3cec52e702a05bc5ac000b691f94c651beed9ca.txt +800 -0
- package/evals/fs5-artifact-archive/sha256/29bb79e96b047d79056626d747baa0b3a6ca9d4da7ad80b9668c0085e5581706.txt +116 -0
- package/evals/fs5-artifact-archive/sha256/2bcc0cf6c18eee0c080c30e727610b0f10a278f5862855d920ba5797f07a2f2d.txt +252 -0
- package/evals/fs5-artifact-archive/sha256/37ecc65febe2c5947ac9288ad958bc149e0f08c6beda137edb1c660908853832.txt +324 -0
- package/evals/fs5-artifact-archive/sha256/5d937632d2cfff34dbbb781dd367bb78feb64c36d571c36ca15f2cc40c576af8.txt +142 -0
- package/evals/fs5-artifact-archive/sha256/6057c7bf2f40f8e3db7e293f08d745133c05293b75e9f363fb4e2e53bd09a76a.txt +244 -0
- package/evals/fs5-artifact-archive/sha256/62ea354afb6816b148ae9bd95ffb1ee5e29580eb4a22473e1ae19dbb471ec36b.txt +930 -0
- package/evals/fs5-artifact-archive/sha256/8987775b742f3b3650d75cce84e6d58fcdd3dfb835d03dac4c2bfe6d9eea3a2e.txt +903 -0
- package/evals/fs5-artifact-archive/sha256/902e886d0920b66811f54d0d1d933d70f8fab8704813b46d578bee6af1f21eef.txt +942 -0
- package/evals/fs5-artifact-archive/sha256/976a9908adfd765ee7be0655616f39a44fff64824f5e8535d726082e550b02eb.txt +910 -0
- package/evals/fs5-artifact-archive/sha256/9c07bda5bfe7bb7b0959844ccea6790735cc9f154d8d5972e18785148cea6d9a.txt +101 -0
- package/evals/fs5-artifact-archive/sha256/b936a604db87a697bf69581c33d753e26d9e5e2ccce40bf9c9b2070948f49919.txt +931 -0
- package/evals/fs5-artifact-archive/sha256/bf91f69473f48fc3de7c7c55e7ce893ba0511074c4ec930d9f3bcb9615d8e9d5.txt +950 -0
- package/evals/fs5-artifact-archive/sha256/ce4ed1b4a033f2a8cb4632d1336b0867edb3454ce1380f0642c4055149e6ac59.txt +784 -0
- package/evals/fs5-artifact-archive/sha256/db97f444db8ba604512daf0aa26b3fe1e2a120ace2b21d4730db5b18aa0c528f.txt +950 -0
- package/evals/fs5-causal-arm.v1.json +9 -5
- package/evals/fs5-pilot-protocol.v1.json +1 -1
- package/evals/fs5-pilot-protocol.v4.json +4 -4
- package/evals/fs5-pilot-protocol.v5.json +6 -5
- package/evals/harness-next/development-corpus.mjs +106 -0
- package/evals/harness-next/resource-budget-probe.mjs +38 -0
- package/evals/harness-next/run-calibration.mjs +83 -0
- package/evals/harness-next/run-resource-probe.mjs +55 -0
- package/evals/harness-next/selected-development-corpus.mjs +27 -0
- package/evals/harness-next.v1.json +51 -0
- package/evals/long-horizon-v1/README.md +19 -0
- package/evals/long-horizon-v1/runner.mjs +116 -48
- package/evals/long-horizon-v1/worker.mjs +77 -30
- package/evals/private-holdout-v1/CURRENT_BOUNDARY.md +53 -0
- package/evals/private-holdout-v1/README.md +5 -2
- package/evals/private-holdout-v1/public-exposure.v2.json +273 -0
- package/package.json +9 -4
- package/packages/piagent-core/README.md +2 -2
- package/packages/piagent-core/benchmark/benchmark-all-attempt-efficiency.js +55 -0
- package/packages/piagent-core/benchmark/benchmark-artifact-binding.js +49 -0
- package/packages/piagent-core/benchmark/benchmark-bootstrap.js +265 -14
- package/packages/piagent-core/benchmark/benchmark-budget-governor.js +271 -0
- package/packages/piagent-core/benchmark/benchmark-campaign.js +592 -0
- package/packages/piagent-core/benchmark/benchmark-candidate.js +8 -3
- package/packages/piagent-core/benchmark/benchmark-checkpoint.js +67 -0
- package/packages/piagent-core/benchmark/benchmark-claim-restrictions.js +269 -2
- package/packages/piagent-core/benchmark/benchmark-cli.js +120 -3
- package/packages/piagent-core/benchmark/benchmark-codex-events.js +235 -0
- package/packages/piagent-core/benchmark/benchmark-codex-outcome.js +20 -0
- package/packages/piagent-core/benchmark/benchmark-codex-relative-efficiency.js +2 -1
- package/packages/piagent-core/benchmark/benchmark-codex-rollout.js +521 -0
- package/packages/piagent-core/benchmark/benchmark-codex.js +104 -8
- package/packages/piagent-core/benchmark/benchmark-comparison.js +284 -1
- package/packages/piagent-core/benchmark/benchmark-core.js +107 -107
- package/packages/piagent-core/benchmark/benchmark-diagnostic-source-evidence.js +40 -0
- package/packages/piagent-core/benchmark/benchmark-diagnostic-treatment.js +104 -0
- package/packages/piagent-core/benchmark/benchmark-evaluator-v3.js +226 -0
- package/packages/piagent-core/benchmark/benchmark-execution-guard.js +23 -1
- package/packages/piagent-core/benchmark/benchmark-forensics.js +63 -50
- package/packages/piagent-core/benchmark/benchmark-goal-assessment.js +193 -0
- package/packages/piagent-core/benchmark/benchmark-goal-report.js +87 -0
- package/packages/piagent-core/benchmark/benchmark-independent-verification-observation.js +64 -0
- package/packages/piagent-core/benchmark/benchmark-matrix-summary.js +141 -0
- package/packages/piagent-core/benchmark/benchmark-matrix.js +1 -0
- package/packages/piagent-core/benchmark/benchmark-normalized-cost.js +62 -0
- package/packages/piagent-core/benchmark/benchmark-pi-home.js +1 -0
- package/packages/piagent-core/benchmark/benchmark-preflight.js +69 -8
- package/packages/piagent-core/benchmark/benchmark-process.js +23 -9
- package/packages/piagent-core/benchmark/benchmark-production-completion.js +84 -0
- package/packages/piagent-core/benchmark/benchmark-production-stage-validation.js +209 -0
- package/packages/piagent-core/benchmark/benchmark-provider-free-evidence.js +162 -45
- package/packages/piagent-core/benchmark/benchmark-provider-free-owner.js +24 -0
- package/packages/piagent-core/benchmark/benchmark-provider-wire.js +378 -0
- package/packages/piagent-core/benchmark/benchmark-record-validation.d.ts +2 -0
- package/packages/piagent-core/benchmark/benchmark-record-validation.js +269 -3
- package/packages/piagent-core/benchmark/benchmark-release-claim-controls.js +132 -0
- package/packages/piagent-core/benchmark/benchmark-report.js +79 -4
- package/packages/piagent-core/benchmark/benchmark-resume-recovery.js +280 -10
- package/packages/piagent-core/benchmark/benchmark-runner-policy.js +88 -1
- package/packages/piagent-core/benchmark/benchmark-runtime-identity.js +50 -1
- package/packages/piagent-core/benchmark/benchmark-runtime.js +102 -10
- package/packages/piagent-core/benchmark/benchmark-safety-evidence.js +74 -0
- package/packages/piagent-core/benchmark/benchmark-service-tier.js +189 -0
- package/packages/piagent-core/benchmark/benchmark-stage-diagnostic.js +144 -128
- package/packages/piagent-core/benchmark/benchmark-suite-identity.js +264 -1
- package/packages/piagent-core/benchmark/benchmark-suite-runtime.js +4 -0
- package/packages/piagent-core/benchmark/benchmark-suite.js +211 -4
- package/packages/piagent-core/benchmark/benchmark-summary-support.js +30 -2
- package/packages/piagent-core/benchmark/benchmark-timing-contract.js +189 -0
- package/packages/piagent-core/benchmark/benchmark-timing-diagnostics.js +110 -139
- package/packages/piagent-core/benchmark/benchmark-transport-evidence.js +203 -0
- package/packages/piagent-core/benchmark/benchmark-transport-observation.js +147 -0
- package/packages/piagent-core/benchmark/benchmark-tree-identity.js +2 -1
- package/packages/piagent-core/benchmark/benchmark-usage.js +395 -33
- package/packages/piagent-core/benchmark/benchmark-workflow.js +136 -38
- package/packages/piagent-core/benchmark/fs5-pilot-protocol.js +21 -2
- package/packages/piagent-core/capabilities/runtime-integrity.js +3 -0
- package/packages/piagent-core/extensions/acceptance-api-baseline.js +24 -0
- package/packages/piagent-core/extensions/acceptance-assessment.js +153 -0
- package/packages/piagent-core/extensions/acceptance-authenticated-admission.d.ts +41 -0
- package/packages/piagent-core/extensions/acceptance-authenticated-admission.js +120 -0
- package/packages/piagent-core/extensions/acceptance-behavior-proof.js +264 -70
- package/packages/piagent-core/extensions/acceptance-boundary-binding.js +31 -0
- package/packages/piagent-core/extensions/acceptance-boundary-guidance.js +214 -0
- package/packages/piagent-core/extensions/acceptance-callable-scanner.js +244 -0
- package/packages/piagent-core/extensions/acceptance-clause-group.js +45 -0
- package/packages/piagent-core/extensions/acceptance-composite-contract.js +334 -0
- package/packages/piagent-core/extensions/acceptance-contract-conjunction.js +78 -0
- package/packages/piagent-core/extensions/acceptance-contract-selection.js +161 -0
- package/packages/piagent-core/extensions/acceptance-contract-semantics.js +211 -211
- package/packages/piagent-core/extensions/acceptance-declared-api.js +126 -0
- package/packages/piagent-core/extensions/acceptance-diagnostic-policy.ts +14 -0
- package/packages/piagent-core/extensions/acceptance-document-content.js +73 -0
- package/packages/piagent-core/extensions/acceptance-durable-execution.d.ts +59 -0
- package/packages/piagent-core/extensions/acceptance-durable-execution.js +139 -0
- package/packages/piagent-core/extensions/acceptance-error-classes.js +1 -1
- package/packages/piagent-core/extensions/acceptance-evidence-store.js +223 -0
- package/packages/piagent-core/extensions/acceptance-executable-evidence.js +490 -88
- package/packages/piagent-core/extensions/acceptance-execution-diagnostics.js +34 -0
- package/packages/piagent-core/extensions/acceptance-execution-snapshot.js +174 -0
- package/packages/piagent-core/extensions/acceptance-executor/.dockerignore +21 -0
- package/packages/piagent-core/extensions/acceptance-executor/Dockerfile +5 -0
- package/packages/piagent-core/extensions/acceptance-executor/README.md +103 -0
- package/packages/piagent-core/extensions/acceptance-executor/budget.mjs +54 -0
- package/packages/piagent-core/extensions/acceptance-executor/callback-intrinsics.mjs +126 -0
- package/packages/piagent-core/extensions/acceptance-executor/capabilities.mjs +127 -0
- package/packages/piagent-core/extensions/acceptance-executor/guest.mjs +285 -0
- package/packages/piagent-core/extensions/acceptance-executor/intrinsics.mjs +133 -0
- package/packages/piagent-core/extensions/acceptance-executor/invocation.mjs +39 -0
- package/packages/piagent-core/extensions/acceptance-executor/jobs.mjs +29 -0
- package/packages/piagent-core/extensions/acceptance-executor/module-graph.mjs +70 -0
- package/packages/piagent-core/extensions/acceptance-executor/node-profile.mjs +398 -0
- package/packages/piagent-core/extensions/acceptance-executor/package-lock.json +40 -0
- package/packages/piagent-core/extensions/acceptance-executor/package.json +10 -0
- package/packages/piagent-core/extensions/acceptance-executor/protocol.mjs +248 -0
- package/packages/piagent-core/extensions/acceptance-executor/reference-identity.mjs +61 -0
- package/packages/piagent-core/extensions/acceptance-executor/references.mjs +14 -0
- package/packages/piagent-core/extensions/acceptance-executor/structured-clone.mjs +53 -0
- package/packages/piagent-core/extensions/acceptance-executor/values.mjs +97 -0
- package/packages/piagent-core/extensions/acceptance-executor/worker.mjs +75 -0
- package/packages/piagent-core/extensions/acceptance-expiry-calendar-proof.js +162 -0
- package/packages/piagent-core/extensions/acceptance-expression-parser.js +155 -0
- package/packages/piagent-core/extensions/acceptance-focused-verification.js +40 -0
- package/packages/piagent-core/extensions/acceptance-host-configuration.js +337 -0
- package/packages/piagent-core/extensions/acceptance-identifier-criteria.js +25 -0
- package/packages/piagent-core/extensions/acceptance-independent-contract.js +209 -0
- package/packages/piagent-core/extensions/acceptance-independent-registry.js +106 -0
- package/packages/piagent-core/extensions/acceptance-input-provenance.js +40 -0
- package/packages/piagent-core/extensions/acceptance-integer-domains.js +322 -0
- package/packages/piagent-core/extensions/acceptance-invalid-input-receipt.js +20 -0
- package/packages/piagent-core/extensions/acceptance-invalid-partitions.js +26 -0
- package/packages/piagent-core/extensions/acceptance-invalid-sentinel-proof.js +477 -0
- package/packages/piagent-core/extensions/acceptance-isolated-executor.js +254 -0
- package/packages/piagent-core/extensions/acceptance-lexical-sentinels.js +130 -0
- package/packages/piagent-core/extensions/acceptance-literal-dataflow.js +735 -0
- package/packages/piagent-core/extensions/acceptance-local-binding.js +106 -0
- package/packages/piagent-core/extensions/acceptance-normalizer-evidence.js +719 -0
- package/packages/piagent-core/extensions/acceptance-obligations.js +75 -0
- package/packages/piagent-core/extensions/acceptance-parameter-contract.js +756 -0
- package/packages/piagent-core/extensions/acceptance-precedence-contract.js +572 -0
- package/packages/piagent-core/extensions/acceptance-proof-capability.js +26 -0
- package/packages/piagent-core/extensions/acceptance-receipt.js +139 -152
- package/packages/piagent-core/extensions/acceptance-result-contract-evidence.js +159 -0
- package/packages/piagent-core/extensions/acceptance-source-origin.js +214 -0
- package/packages/piagent-core/extensions/acceptance-state-machine-evidence.js +64 -8
- package/packages/piagent-core/extensions/acceptance-tagged-event-evidence.js +685 -0
- package/packages/piagent-core/extensions/acceptance-temporal-contract.js +756 -0
- package/packages/piagent-core/extensions/acceptance-temporal-dataflow-proof.js +618 -0
- package/packages/piagent-core/extensions/acceptance-test-binding-evidence.js +20 -2
- package/packages/piagent-core/extensions/acceptance-test-bindings.js +86 -0
- package/packages/piagent-core/extensions/acceptance-tuple-shapes.js +12 -0
- package/packages/piagent-core/extensions/context-engine.js +11 -6
- package/packages/piagent-core/extensions/criterion-context-pack.js +96 -4
- package/packages/piagent-core/extensions/failure-types.ts +2 -2
- package/packages/piagent-core/extensions/guard-types.ts +5 -1
- package/packages/piagent-core/extensions/piagent-guard.ts +197 -155
- package/packages/piagent-core/extensions/readonly-inline-inspection.ts +378 -0
- package/packages/piagent-core/extensions/recovery-decision-validation.ts +92 -0
- package/packages/piagent-core/extensions/shell-write-targets.js +15 -14
- package/packages/piagent-core/extensions/task-contract-view.js +4 -4
- package/packages/piagent-core/extensions/task-digest-migration.js +2 -2
- package/packages/piagent-core/extensions/task-journal.js +48 -3
- package/packages/piagent-core/extensions/task-runtime-audit.js +8 -2
- package/packages/piagent-core/extensions/task-state.js +74 -38
- package/packages/piagent-core/extensions/task-terminal-disposition.js +10 -0
- package/packages/piagent-core/extensions/trajectory-contract.ts +5 -0
- package/packages/piagent-core/extensions/verification-intelligence.js +60 -8
- package/packages/piagent-core/extensions/workflow-catalog.ts +98 -0
- package/packages/piagent-core/extensions/workspace-revision.js +48 -0
- package/packages/piagent-core/extensions/workspace-verification-snapshot.js +13 -0
- package/packages/piagent-core/package.json +3 -3
- package/packages/piagent-core/policies/base-policy.json +1 -0
- package/packages/piagent-core/runtime/context/adaptive-planner.ts +7 -3
- package/packages/piagent-core/runtime/hooks/agent-start-hook.ts +60 -59
- package/packages/piagent-core/runtime/hooks/agent-start-types.ts +48 -0
- package/packages/piagent-core/runtime/hooks/completion-hook.ts +76 -83
- package/packages/piagent-core/runtime/hooks/input-hook.ts +92 -7
- package/packages/piagent-core/runtime/hooks/protected-refusal-completion.ts +86 -0
- package/packages/piagent-core/runtime/hooks/session-hooks.ts +5 -2
- package/packages/piagent-core/runtime/hooks/session-start-hook.ts +50 -18
- package/packages/piagent-core/runtime/hooks/tool-result-hook.ts +53 -20
- package/packages/piagent-core/runtime/hooks/tool-result-metadata.ts +9 -0
- package/packages/piagent-core/runtime/hooks/tool-result-navigation.ts +36 -0
- package/packages/piagent-core/runtime/hooks/tool-result-retrieval.ts +42 -0
- package/packages/piagent-core/runtime/input/chat-images.ts +1 -1
- package/packages/piagent-core/runtime/inspection/activity-event-adapter.ts +1 -1
- package/packages/piagent-core/runtime/inspection/same-process-bridge-proof.ts +1 -1
- package/packages/piagent-core/runtime/inspection/task-handoff-history.ts +2 -2
- package/packages/piagent-core/runtime/inspection/tool-failure-classification.ts +49 -8
- package/packages/piagent-core/runtime/inspection/webui-snapshot.ts +61 -15
- package/packages/piagent-core/runtime/inspection/workspace-file-reader.ts +2 -132
- package/packages/piagent-core/runtime/model/provider-wire-fingerprint.ts +20 -0
- package/packages/piagent-core/runtime/model/service-tier-runtime.ts +242 -0
- package/packages/piagent-core/runtime/policy/source-worktree-transaction.ts +75 -14
- package/packages/piagent-core/runtime/product/activity-inspector.ts +6 -3
- package/packages/piagent-core/runtime/product/edit-verifier-timing.ts +26 -0
- package/packages/piagent-core/runtime/product/efficiency-metrics.ts +12 -7
- package/packages/piagent-core/runtime/product/operator-projections.ts +8 -3
- package/packages/piagent-core/runtime/product/task-usage-hooks.ts +78 -0
- package/packages/piagent-core/runtime/product/task-usage.ts +104 -0
- package/packages/piagent-core/runtime/quality/protected-refusal-handoff.ts +35 -0
- package/packages/piagent-core/runtime/recovery/acceptance-recovery-guidance.ts +21 -0
- package/packages/piagent-core/runtime/recovery/continuation-budget.ts +11 -2
- package/packages/piagent-core/runtime/recovery/diagnostic-delivery.ts +61 -0
- package/packages/piagent-core/runtime/recovery/handoff-projection.ts +192 -57
- package/packages/piagent-core/runtime/recovery/handoff-verifier-binding.ts +24 -0
- package/packages/piagent-core/runtime/recovery/independent-verification-recovery.ts +79 -0
- package/packages/piagent-core/runtime/recovery/recovery-policy.ts +27 -39
- package/packages/piagent-core/runtime/recovery/resume-state.ts +8 -5
- package/packages/piagent-core/runtime/registration/activity-inspector-command.ts +2 -1
- package/packages/piagent-core/runtime/registration/context-commands.ts +12 -8
- package/packages/piagent-core/runtime/registration/operator-catalogs.ts +4 -9
- package/packages/piagent-core/runtime/registration/policy-tools.ts +5 -3
- package/packages/piagent-core/runtime/registration/session-commands.ts +9 -7
- package/packages/piagent-core/runtime/registration/session-wait-tool.ts +54 -0
- package/packages/piagent-core/runtime/registration/task-completion-tools.ts +27 -11
- package/packages/piagent-core/runtime/registration/task-start-conditional-mutation.ts +45 -0
- package/packages/piagent-core/runtime/registration/task-start-guidance.ts +5 -2
- package/packages/piagent-core/runtime/registration/task-start-tool.ts +23 -23
- package/packages/piagent-core/runtime/registration/workflow-commands.ts +64 -93
- package/packages/piagent-core/runtime/session/completion-signals.ts +23 -0
- package/packages/piagent-core/runtime/session/message-signals.ts +6 -22
- package/packages/piagent-core/runtime/session/retrieval-evidence-runtime.ts +188 -0
- package/packages/piagent-core/runtime/session/runtime-state.ts +29 -35
- package/packages/piagent-core/runtime/session/system-prompt.ts +3 -3
- package/packages/piagent-core/runtime/session/uncertain-send-continuation.ts +231 -0
- package/packages/piagent-core/runtime/session/usage.ts +4 -3
- package/packages/piagent-core/runtime/tools/apply-patch-tool.ts +6 -6
- package/packages/piagent-core/runtime/tools/phase-tool-runtime.ts +1 -1
- package/packages/piagent-core/runtime/tools/phase-tools.ts +3 -2
- package/packages/piagent-core/runtime/tools/session-wait.ts +42 -0
- package/packages/piagent-core/runtime/tools/tool-groups.ts +10 -3
- package/packages/piagent-core/runtime/trajectory/trajectory-runtime.ts +192 -5
- package/packages/piagent-core/runtime/trajectory/trajectory-types.ts +3 -2
- package/packages/piagent-core/runtime/verification/acceptance-api-baseline.js +488 -0
- package/packages/piagent-core/runtime/verification/completion-preparation.ts +22 -0
- package/packages/piagent-core/runtime/verification/composite-completion-finalizer.ts +105 -0
- package/packages/piagent-core/runtime/verification/composite-journal-anchor.ts +181 -0
- package/packages/piagent-core/runtime/verification/composite-runtime-binding.ts +76 -0
- package/packages/piagent-core/runtime/verification/composite-scoped-mediation.ts +318 -0
- package/packages/piagent-core/runtime/verification/composite-session-persistence.ts +175 -0
- package/packages/piagent-core/runtime/verification/composite-task-publication.ts +273 -0
- package/packages/piagent-core/runtime/verification/exact-verifier-reuse.ts +11 -11
- package/packages/piagent-core/runtime/verification/host-project-verification.ts +71 -0
- package/packages/piagent-core/runtime/verification/independent-acceptance-runtime.ts +500 -0
- package/packages/piagent-core/runtime/verification/runtime-assurance-facts.ts +500 -0
- package/packages/piagent-core/runtime/verification/runtime-contract-runner.ts +107 -0
- package/packages/piagent-core/runtime/verification/shell-verification-snapshots.ts +56 -0
- package/packages/piagent-core/runtime/workflows/change-clarification.ts +61 -0
- package/packages/piagent-core/runtime/workflows/input-routing.ts +21 -14
- package/packages/piagent-core/runtime/workflows/runtime-intake-compaction.ts +44 -7
- package/packages/piagent-core/runtime/workflows/task-followup-policy.ts +163 -0
- package/packages/piagent-core/runtime/workflows/task-intake.ts +221 -242
- package/packages/piagent-core/runtime/workflows/task-repair-intent.ts +67 -0
- package/packages/piagent-core/runtime/workflows/task-scope-resolution.ts +83 -0
- package/packages/piagent-core/runtime/workflows/webui-runtime-command.ts +5 -2
- package/packages/piagent-core/runtime/workflows/webui-workflow.ts +39 -32
- package/packages/piagent-core/runtime/workflows/workflow-follow-up.ts +33 -0
- package/packages/piagent-core/security/workspace-file-reader.ts +132 -0
- package/packages/piagent-webui/dist/client/assets/{MarkdownMessage-B4XehTCU.js → MarkdownMessage-DGk34zJT.js} +1 -1
- package/packages/piagent-webui/dist/client/assets/{index-BV-_03yl.css → index-DVahUVWy.css} +1 -1
- package/packages/piagent-webui/dist/client/assets/index-DiKRmCEP.js +176 -0
- package/packages/piagent-webui/dist/client/index.html +2 -2
- package/packages/piagent-webui/extension/dispatch-user-entry.ts +13 -0
- package/packages/piagent-webui/extension/piagent-webui.ts +10 -2
- package/packages/piagent-webui/extension/review-controller.ts +29 -6
- package/packages/piagent-webui/extension/same-session-bridge.ts +6 -7
- package/packages/piagent-webui/extension/session-stream-adapter.ts +60 -11
- package/packages/piagent-webui/extension/source-mutation-controller.ts +29 -3
- package/packages/piagent-webui/extension/source-open-controller.ts +29 -7
- package/packages/piagent-webui/extension/source-revert-controller.ts +26 -3
- package/packages/piagent-webui/gateway/gateway-events.ts +22 -5
- package/packages/piagent-webui/gateway/gateway-service.ts +7 -2
- package/packages/piagent-webui/gateway/gateway-session-stream.ts +141 -19
- package/packages/piagent-webui/gateway/rpc-ui-context.ts +34 -9
- package/packages/piagent-webui/gateway/runtime-command-controller.ts +46 -6
- package/packages/piagent-webui/gateway/runtime-session-controls.ts +17 -2
- package/packages/piagent-webui/gateway/session-catalog.ts +9 -3
- package/packages/piagent-webui/gateway/session-command-controller.ts +29 -9
- package/packages/piagent-webui/gateway/session-effective-options.ts +2 -9
- package/packages/piagent-webui/gateway/session-inspection-registry.ts +11 -2
- package/packages/piagent-webui/gateway/session-operation-settlement.ts +28 -0
- package/packages/piagent-webui/gateway/session-prompt-dispatch.ts +37 -0
- package/packages/piagent-webui/gateway/session-runtime-close.ts +36 -0
- package/packages/piagent-webui/gateway/session-runtime-factory.ts +183 -6
- package/packages/piagent-webui/gateway/session-runtime-ownership.ts +48 -0
- package/packages/piagent-webui/gateway/session-runtime-state.ts +24 -0
- package/packages/piagent-webui/gateway/session-runtime-supervisor.ts +114 -114
- package/packages/piagent-webui/server/core-inspection-provider.ts +73 -14
- package/packages/piagent-webui/server/loopback-server.ts +9 -7
- package/packages/piagent-webui/server/terminal-delivery-receipt.ts +144 -0
- package/packages/piagent-webui/server/transcript-projection.ts +65 -12
- package/packages/piagent-webui/shared/message-correlation.ts +25 -0
- package/schemas/approved-host-contracts.schema.json +973 -0
- package/schemas/benchmark-attempt-outcome.schema.json +303 -0
- package/schemas/benchmark-independent-verification-plan.schema.json +34 -0
- package/schemas/composite-criterion.schema.json +788 -0
- package/schemas/contract-family-library.schema.json +28 -0
- package/schemas/contract-selection-recipe.schema.json +31 -0
- package/schemas/failure-evidence.schema.json +2 -2
- package/schemas/helper-request.schema.json +16 -4
- package/schemas/host-contract-plan.schema.json +25 -0
- package/schemas/piagent-webui/gateway-protocol-v1.schema.json +16 -2
- package/schemas/piagent-webui/runtime-command-v1.schema.json +26 -3
- package/schemas/piagent-webui/runtime-event-v2.schema.json +32 -1
- package/schemas/piagent-webui/session-live-state-v1.schema.json +2 -0
- package/schemas/piagent-webui/snapshot-v1.schema.json +3 -0
- package/schemas/piagent-webui/source-change-v1.schema.json +12 -0
- package/schemas/piagent-webui/transcript-v1.schema.json +2 -1
- package/schemas/public-contracts/codex-mcp-metadata-v1.schema.json +206 -0
- package/schemas/public-contracts/codex-mcp-metadata-v2.schema.json +228 -0
- package/schemas/public-contracts/codex-mcp-metadata-v3.schema.json +233 -0
- package/schemas/public-contracts/revocation-v1.schema.json +87 -0
- package/schemas/public-contracts/subscription-contract-v1.schema.json +76 -0
- package/schemas/scoped-project-verification-receipt-v2.schema.json +83 -0
- package/schemas/scoped-project-verification-receipt-v3.schema.json +295 -0
- package/schemas/scoped-verification-receipt-v1.schema.json +76 -0
- package/schemas/task-contract.schema.json +30 -0
- package/scripts/approve-independent-verification.mjs +57 -0
- package/scripts/benchmark-arm-observer.mjs +320 -0
- package/scripts/benchmark-budget-ipc.mjs +34 -0
- package/scripts/benchmark-budget-launcher.mjs +91 -0
- package/scripts/benchmark-budget-processes.mjs +133 -0
- package/scripts/benchmark-budget-publication.mjs +228 -0
- package/scripts/benchmark-budget-runtime.mjs +136 -0
- package/scripts/benchmark-candidate-ablation.mjs +265 -0
- package/scripts/benchmark-codex-journey.mjs +406 -0
- package/scripts/benchmark-independent-verification.mjs +628 -0
- package/scripts/benchmark-journey-outcome.mjs +92 -0
- package/scripts/benchmark-production-v3-human-review.mjs +192 -0
- package/scripts/benchmark-public-input-catalog.mjs +158 -0
- package/scripts/benchmark-registered-plan-author.mjs +355 -0
- package/scripts/benchmark-registered-plan-recipe-support.mjs +85 -0
- package/scripts/benchmark-registered-plan-recipes-backend.mjs +165 -0
- package/scripts/benchmark-registered-plan-recipes-data.mjs +164 -0
- package/scripts/benchmark-registered-plan-recipes-platform.mjs +165 -0
- package/scripts/benchmark-runner-completion.mjs +133 -0
- package/scripts/benchmark-runner-configuration.mjs +159 -0
- package/scripts/benchmark-runner-core.mjs +217 -388
- package/scripts/benchmark-runner-finalization.mjs +140 -27
- package/scripts/benchmark-runner-provider-boundary.mjs +44 -0
- package/scripts/benchmark-runner-schedule.mjs +256 -0
- package/scripts/benchmark-runner-support.mjs +136 -4
- package/scripts/benchmark-runner.mjs +95 -18
- package/scripts/benchmark-scoped-broker-custody.mjs +483 -0
- package/scripts/benchmark-scoped-docs-verifier.mjs +203 -0
- package/scripts/benchmark-scoped-frozen-qualification.mjs +676 -0
- package/scripts/benchmark-scoped-pi-router.mjs +196 -0
- package/scripts/benchmark-scoped-project-verification-receipt.mjs +49 -0
- package/scripts/benchmark-scoped-project-verifier.mjs +461 -0
- package/scripts/benchmark-scoped-session-custody.mjs +599 -0
- package/scripts/benchmark-scoped-session-factory.mjs +342 -0
- package/scripts/benchmark-scoped-tool-broker.mjs +523 -0
- package/scripts/benchmark-scoped-verification-supervisor.mjs +773 -0
- package/scripts/benchmark-session-evaluator.mjs +169 -0
- package/scripts/benchmark-session-provider-boundary.mjs +62 -0
- package/scripts/benchmark-session-usage.mjs +28 -0
- package/scripts/benchmark-session.mjs +343 -50
- package/scripts/benchmark-webui-journey.mjs +678 -0
- package/scripts/check-public-wording.mjs +46 -0
- package/scripts/fs4-readiness-evaluation.mjs +7 -1
- package/scripts/phase-tools-evaluation.mjs +1 -0
- package/scripts/pi-auto.sh +7 -1
- package/scripts/pi-usage-history.mjs +201 -11
- package/scripts/piagent-cli.mjs +8 -0
- package/scripts/private-holdout-readiness.mjs +7 -1
- package/scripts/public-evaluation-exposure.mjs +140 -0
- package/scripts/select-independent-verification.mjs +62 -0
- package/scripts/typescript-loader.mjs +135 -1
- package/scripts/update-global.mjs +6 -7
- package/scripts/verify-local.sh +36 -55
- package/scripts/verify-release-identity.mjs +5 -3
- package/packages/piagent-webui/dist/client/assets/index-CgOEyRPG.js +0 -176
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
|
|
3
|
+
export const RETRIEVAL_EVIDENCE_VERSION = "retrieval-evidence-v1" as const;
|
|
4
|
+
export const RETRIEVAL_EVIDENCE_TOOLS = new Set(["read", "grep", "find", "ls"]);
|
|
5
|
+
|
|
6
|
+
export type RetrievalEvidenceObservation = {
|
|
7
|
+
toolName: string;
|
|
8
|
+
callFingerprint: string;
|
|
9
|
+
outputHash: string;
|
|
10
|
+
target?: string;
|
|
11
|
+
deterministicMiss?: boolean;
|
|
12
|
+
nonEvidenceFailure?: boolean;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export type RetrievalEvidenceCheckpoint = {
|
|
16
|
+
version: typeof RETRIEVAL_EVIDENCE_VERSION;
|
|
17
|
+
reason: "evidence-checkpoint" | "evidence-saturated";
|
|
18
|
+
calls: number;
|
|
19
|
+
uniqueCalls: number;
|
|
20
|
+
repeatedCalls: number;
|
|
21
|
+
uniqueTargets: number;
|
|
22
|
+
deterministicMisses: number;
|
|
23
|
+
noNovelEvidenceStreak: number;
|
|
24
|
+
generation: number;
|
|
25
|
+
generationCalls: number;
|
|
26
|
+
text: string;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
type RetrievalTurnState = {
|
|
30
|
+
turnId?: string;
|
|
31
|
+
calls: number;
|
|
32
|
+
repeatedCalls: number;
|
|
33
|
+
deterministicMisses: number;
|
|
34
|
+
noNovelEvidenceStreak: number;
|
|
35
|
+
generation: number;
|
|
36
|
+
generationCalls: number;
|
|
37
|
+
adviceCount: number;
|
|
38
|
+
lastAdviceAt: number;
|
|
39
|
+
// Operation-wide sets keep the accounting truthful across a mutation. The
|
|
40
|
+
// generation-local sets below decide whether a result is fresh for the
|
|
41
|
+
// current tree revision.
|
|
42
|
+
callFingerprints: Set<string>;
|
|
43
|
+
generationCallFingerprints: Set<string>;
|
|
44
|
+
outputHashes: Set<string>;
|
|
45
|
+
targets: Set<string>;
|
|
46
|
+
generationTargets: Set<string>;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
function newState(generation = 0, turnId?: string): RetrievalTurnState {
|
|
50
|
+
return {
|
|
51
|
+
turnId,
|
|
52
|
+
calls: 0,
|
|
53
|
+
repeatedCalls: 0,
|
|
54
|
+
deterministicMisses: 0,
|
|
55
|
+
noNovelEvidenceStreak: 0,
|
|
56
|
+
generation,
|
|
57
|
+
generationCalls: 0,
|
|
58
|
+
adviceCount: 0,
|
|
59
|
+
lastAdviceAt: 0,
|
|
60
|
+
callFingerprints: new Set(),
|
|
61
|
+
generationCallFingerprints: new Set(),
|
|
62
|
+
outputHashes: new Set(),
|
|
63
|
+
targets: new Set(),
|
|
64
|
+
generationTargets: new Set()
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function sessionKey(ctx: ExtensionContext): string {
|
|
69
|
+
return `${ctx.cwd}\u0000${ctx.sessionManager.getSessionId()}`;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function boundedTarget(value: string | undefined): string | undefined {
|
|
73
|
+
const normalized = String(value ?? "").replace(/\s+/g, " ").trim();
|
|
74
|
+
if (!normalized) return undefined;
|
|
75
|
+
return normalized.length <= 512
|
|
76
|
+
? normalized
|
|
77
|
+
: `${normalized.slice(0, 255)}…${normalized.slice(-256)}`;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function checkpointText(checkpoint: Omit<RetrievalEvidenceCheckpoint, "text">): string {
|
|
81
|
+
const prefix = checkpoint.reason === "evidence-saturated"
|
|
82
|
+
? "Piagent retrieval saturation"
|
|
83
|
+
: "Piagent retrieval checkpoint";
|
|
84
|
+
return `[${prefix}: ${checkpoint.calls} calls; ${checkpoint.uniqueCalls} unique; ${checkpoint.repeatedCalls} repeated; ${checkpoint.deterministicMisses} deterministic misses; ${checkpoint.uniqueTargets} targets. `
|
|
85
|
+
+ "If the acceptance criteria are covered, stop broad scouting and synthesize now. Continue only for a named unresolved criterion, a concrete contradiction, or a required focused test. Do not repeat an exact call, revisit a known-missing target, or batch patterns against an unconfirmed target.]";
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Tracks evidence novelty for one operator operation. It never blocks a new
|
|
90
|
+
* source path: the model keeps its full reasoning/retrieval capability. The
|
|
91
|
+
* runtime only emits bounded checkpoints when search becomes long or stops
|
|
92
|
+
* producing new evidence.
|
|
93
|
+
*/
|
|
94
|
+
export class RetrievalEvidenceRuntime {
|
|
95
|
+
readonly #states = new Map<string, RetrievalTurnState>();
|
|
96
|
+
|
|
97
|
+
beginTurn(ctx: ExtensionContext, turnId?: string): void {
|
|
98
|
+
const key = sessionKey(ctx);
|
|
99
|
+
this.#states.set(key, newState(0, turnId));
|
|
100
|
+
while (this.#states.size > 100) this.#states.delete(this.#states.keys().next().value as string);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
invalidateAfterMutation(ctx: ExtensionContext, turnId?: string): void {
|
|
104
|
+
const key = sessionKey(ctx);
|
|
105
|
+
const current = this.#states.get(key);
|
|
106
|
+
const prior = current && (!turnId || !current.turnId || current.turnId === turnId)
|
|
107
|
+
? current
|
|
108
|
+
: newState(0, turnId);
|
|
109
|
+
if (turnId && !prior.turnId) prior.turnId = turnId;
|
|
110
|
+
// Keep the operation totals so a mutation cannot erase token accounting,
|
|
111
|
+
// but clear novelty/negative evidence because the working tree changed.
|
|
112
|
+
prior.generation += 1;
|
|
113
|
+
prior.generationCalls = 0;
|
|
114
|
+
prior.noNovelEvidenceStreak = 0;
|
|
115
|
+
prior.adviceCount = 0;
|
|
116
|
+
prior.lastAdviceAt = 0;
|
|
117
|
+
prior.generationCallFingerprints.clear();
|
|
118
|
+
prior.outputHashes.clear();
|
|
119
|
+
prior.generationTargets.clear();
|
|
120
|
+
this.#states.set(key, prior);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
clearSession(ctx: ExtensionContext): void {
|
|
124
|
+
this.#states.delete(sessionKey(ctx));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
observe(
|
|
128
|
+
ctx: ExtensionContext,
|
|
129
|
+
observation: RetrievalEvidenceObservation,
|
|
130
|
+
turnId?: string
|
|
131
|
+
): RetrievalEvidenceCheckpoint | undefined {
|
|
132
|
+
const toolName = String(observation.toolName ?? "").toLowerCase();
|
|
133
|
+
if (!RETRIEVAL_EVIDENCE_TOOLS.has(toolName)) return undefined;
|
|
134
|
+
const key = sessionKey(ctx);
|
|
135
|
+
const current = this.#states.get(key);
|
|
136
|
+
const state = current && (!turnId || !current.turnId || current.turnId === turnId)
|
|
137
|
+
? current
|
|
138
|
+
: newState(0, turnId);
|
|
139
|
+
if (turnId && !state.turnId) state.turnId = turnId;
|
|
140
|
+
this.#states.set(key, state);
|
|
141
|
+
|
|
142
|
+
state.calls += 1;
|
|
143
|
+
state.generationCalls += 1;
|
|
144
|
+
const target = boundedTarget(observation.target);
|
|
145
|
+
const repeatedAcrossOperation = state.callFingerprints.has(observation.callFingerprint);
|
|
146
|
+
const repeatedCall = state.generationCallFingerprints.has(observation.callFingerprint);
|
|
147
|
+
const repeatedOutput = Boolean(observation.outputHash) && state.outputHashes.has(observation.outputHash);
|
|
148
|
+
const knownTarget = target ? state.generationTargets.has(target) : false;
|
|
149
|
+
if (repeatedAcrossOperation) state.repeatedCalls += 1;
|
|
150
|
+
if (observation.deterministicMiss) state.deterministicMisses += 1;
|
|
151
|
+
|
|
152
|
+
const novel = !observation.nonEvidenceFailure
|
|
153
|
+
&& !repeatedCall
|
|
154
|
+
&& !observation.deterministicMiss
|
|
155
|
+
&& (!repeatedOutput || !knownTarget);
|
|
156
|
+
state.noNovelEvidenceStreak = novel ? 0 : state.noNovelEvidenceStreak + 1;
|
|
157
|
+
state.callFingerprints.add(observation.callFingerprint);
|
|
158
|
+
state.generationCallFingerprints.add(observation.callFingerprint);
|
|
159
|
+
if (observation.outputHash) state.outputHashes.add(observation.outputHash);
|
|
160
|
+
if (target) {
|
|
161
|
+
state.targets.add(target);
|
|
162
|
+
state.generationTargets.add(target);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const saturated = state.noNovelEvidenceStreak >= 4;
|
|
166
|
+
const periodic = state.generationCalls >= 32 && state.generationCalls % 32 === 0;
|
|
167
|
+
const enoughDistance = state.adviceCount === 0
|
|
168
|
+
? state.generationCalls >= 4
|
|
169
|
+
: state.generationCalls - state.lastAdviceAt >= 8;
|
|
170
|
+
if (state.adviceCount >= 4 || !enoughDistance || (!saturated && !periodic)) return undefined;
|
|
171
|
+
|
|
172
|
+
state.adviceCount += 1;
|
|
173
|
+
state.lastAdviceAt = state.generationCalls;
|
|
174
|
+
const checkpoint = {
|
|
175
|
+
version: RETRIEVAL_EVIDENCE_VERSION,
|
|
176
|
+
reason: saturated ? "evidence-saturated" as const : "evidence-checkpoint" as const,
|
|
177
|
+
calls: state.calls,
|
|
178
|
+
uniqueCalls: state.callFingerprints.size,
|
|
179
|
+
repeatedCalls: state.repeatedCalls,
|
|
180
|
+
uniqueTargets: state.targets.size,
|
|
181
|
+
deterministicMisses: state.deterministicMisses,
|
|
182
|
+
noNovelEvidenceStreak: state.noNovelEvidenceStreak,
|
|
183
|
+
generation: state.generation,
|
|
184
|
+
generationCalls: state.generationCalls
|
|
185
|
+
};
|
|
186
|
+
return { ...checkpoint, text: checkpointText(checkpoint) };
|
|
187
|
+
}
|
|
188
|
+
}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import crypto from "node:crypto";
|
|
2
|
+
export { createHostWireSession, observeHostWireInput, HOST_WIRE_PHASE_EDGES } from "../trajectory/trajectory-runtime.ts";
|
|
3
|
+
export type { HostWireSession, HostWireSessionOptions, HostWireOperation } from "../trajectory/trajectory-runtime.ts";
|
|
2
4
|
import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
3
5
|
import { isRuntimeOwnedContextEvidenceEntry } from "../../extensions/context-evidence.js";
|
|
4
6
|
import { toolResultFingerprint } from "../../extensions/context-engine.js";
|
|
5
|
-
import {
|
|
7
|
+
import { ShellVerificationSnapshots } from "../verification/shell-verification-snapshots.ts";
|
|
8
|
+
import { HostProjectVerification } from "../verification/host-project-verification.ts";
|
|
6
9
|
import type { TaskContract } from "../../extensions/guard-types.ts";
|
|
7
10
|
import type { RecoveryHistoryEntry } from "../recovery/recovery-policy.ts";
|
|
8
11
|
import type { ResumeState } from "../recovery/resume-state.ts";
|
|
@@ -65,7 +68,7 @@ export type PendingContextDelivery = {
|
|
|
65
68
|
pack?: InjectedContextPack & { retrievalKey: string };
|
|
66
69
|
injection?: ContextInjectionTelemetry;
|
|
67
70
|
};
|
|
68
|
-
export type RuntimeTurn = { turnId: string; promptHash: string };
|
|
71
|
+
export type RuntimeTurn = { turnId: string; promptHash: string; lightweightNonAuthorizingChange: boolean };
|
|
69
72
|
|
|
70
73
|
function evictOldest<K, V>(map: Map<K, V>, maximum: number): void {
|
|
71
74
|
while (map.size > maximum) map.delete(map.keys().next().value as K);
|
|
@@ -88,16 +91,13 @@ export class RuntimeSessionState {
|
|
|
88
91
|
readonly #observedContextBySession = new Map<string, Map<string, ObservedTaskContext>>();
|
|
89
92
|
readonly #preTaskContextBySession = new Map<string, { turnId: string; entries: Map<string, ObservedTaskContext> }>();
|
|
90
93
|
readonly #qualifiedContextEvidenceByTask = new Map<string, Map<string, ObservedTaskContext>>();
|
|
91
|
-
readonly #shellMutationSnapshots = new
|
|
94
|
+
readonly #shellMutationSnapshots = new ShellVerificationSnapshots();
|
|
95
|
+
readonly projectVerification = new HostProjectVerification(this.#shellMutationSnapshots);
|
|
92
96
|
readonly #sourceCheckoutReadGrants = new SourceCheckoutReadGrants();
|
|
93
97
|
|
|
94
|
-
constructor(options: { maxObservedContext: number }) {
|
|
95
|
-
this.#maxObservedContext = options.maxObservedContext;
|
|
96
|
-
}
|
|
98
|
+
constructor(options: { maxObservedContext: number }) { this.#maxObservedContext = options.maxObservedContext; }
|
|
97
99
|
|
|
98
|
-
sessionKey(ctx: ExtensionContext): string {
|
|
99
|
-
return `${ctx.cwd}\u0000${ctx.sessionManager.getSessionId()}`;
|
|
100
|
-
}
|
|
100
|
+
sessionKey(ctx: ExtensionContext): string { return `${ctx.cwd}\u0000${ctx.sessionManager.getSessionId()}`; }
|
|
101
101
|
|
|
102
102
|
cacheTaskIdentity(ctx: ExtensionContext, task: TaskContract | undefined): void {
|
|
103
103
|
const key = this.sessionKey(ctx);
|
|
@@ -107,11 +107,10 @@ export class RuntimeSessionState {
|
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
taskIdentity(ctx: ExtensionContext): { taskId: string; taskRunId: string } | undefined {
|
|
110
|
-
return this.#taskIdentityBySession.get(this.sessionKey(ctx));
|
|
111
|
-
}
|
|
110
|
+
return this.#taskIdentityBySession.get(this.sessionKey(ctx)); }
|
|
112
111
|
|
|
113
|
-
beginTurn(ctx: ExtensionContext, promptHash: string): RuntimeTurn {
|
|
114
|
-
const turn = { turnId: crypto.randomUUID(), promptHash };
|
|
112
|
+
beginTurn(ctx: ExtensionContext, promptHash: string, classification: { lightweightNonAuthorizingChange?: boolean } = {}): RuntimeTurn {
|
|
113
|
+
const turn = { turnId: crypto.randomUUID(), promptHash, lightweightNonAuthorizingChange: classification.lightweightNonAuthorizingChange === true };
|
|
115
114
|
const sessionKey = this.sessionKey(ctx);
|
|
116
115
|
this.#turnBySession.set(sessionKey, turn);
|
|
117
116
|
this.#preTaskContextBySession.set(sessionKey, { turnId: turn.turnId, entries: new Map() });
|
|
@@ -125,10 +124,16 @@ export class RuntimeSessionState {
|
|
|
125
124
|
return turn && (!promptHash || turn.promptHash === promptHash) ? { ...turn } : undefined;
|
|
126
125
|
}
|
|
127
126
|
|
|
128
|
-
|
|
129
|
-
|
|
127
|
+
classifyTurn(ctx: ExtensionContext, promptHash: string, classification: { lightweightNonAuthorizingChange: boolean }): RuntimeTurn {
|
|
128
|
+
const turn = this.currentTurn(ctx, promptHash);
|
|
129
|
+
if (!turn) return this.beginTurn(ctx, promptHash, classification);
|
|
130
|
+
turn.lightweightNonAuthorizingChange = classification.lightweightNonAuthorizingChange;
|
|
131
|
+
this.#turnBySession.set(this.sessionKey(ctx), turn); return { ...turn };
|
|
130
132
|
}
|
|
131
133
|
|
|
134
|
+
hasAdvisedTool(ctx: ExtensionContext, toolName: string): boolean {
|
|
135
|
+
return this.#advisedTools.has(`${this.sessionKey(ctx)}\u0000${toolName}`); }
|
|
136
|
+
|
|
132
137
|
rememberAdvisedTool(ctx: ExtensionContext, toolName: string): void {
|
|
133
138
|
this.#advisedTools.add(`${this.sessionKey(ctx)}\u0000${toolName}`);
|
|
134
139
|
while (this.#advisedTools.size > 500) {
|
|
@@ -156,9 +161,7 @@ export class RuntimeSessionState {
|
|
|
156
161
|
return this.#sourceCheckoutReadGrants.grant(this.sessionKey(ctx), checkoutPath);
|
|
157
162
|
}
|
|
158
163
|
|
|
159
|
-
sourceCheckoutReadRoots(ctx: ExtensionContext): string[] {
|
|
160
|
-
return this.#sourceCheckoutReadGrants.roots(this.sessionKey(ctx));
|
|
161
|
-
}
|
|
164
|
+
sourceCheckoutReadRoots(ctx: ExtensionContext): string[] { return this.#sourceCheckoutReadGrants.roots(this.sessionKey(ctx)); }
|
|
162
165
|
|
|
163
166
|
rememberPreTaskContext(ctx: ExtensionContext, entry: ObservedTaskContext): void {
|
|
164
167
|
const turn = this.currentTurn(ctx);
|
|
@@ -222,30 +225,21 @@ export class RuntimeSessionState {
|
|
|
222
225
|
return [...(this.#qualifiedContextEvidenceByTask.get(key)?.values() ?? [])].map((entry) => structuredClone(entry));
|
|
223
226
|
}
|
|
224
227
|
|
|
225
|
-
|
|
226
|
-
|
|
228
|
+
rememberShellMutationSnapshot(ctx: ExtensionContext, toolName: string, input: unknown, toolCallId?: string): void {
|
|
229
|
+
this.#shellMutationSnapshots.remember(ctx, toolName, input, toolCallId, this.taskIdentity(ctx)?.taskRunId);
|
|
227
230
|
}
|
|
228
231
|
|
|
229
|
-
|
|
230
|
-
this
|
|
231
|
-
this.#shellMutationSnapshotKey(ctx, toolName, input),
|
|
232
|
-
workingTreeSnapshot(ctx.cwd) as Record<string, string>
|
|
233
|
-
);
|
|
234
|
-
evictOldest(this.#shellMutationSnapshots, 100);
|
|
232
|
+
consumeShellMutationSnapshot(ctx: ExtensionContext, toolName: string, input: unknown): Record<string, string> | undefined {
|
|
233
|
+
return this.consumeShellVerificationSnapshot(ctx, toolName, input)?.snapshot as Record<string, string> | undefined;
|
|
235
234
|
}
|
|
236
235
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
const snapshot = this.#shellMutationSnapshots.get(key);
|
|
240
|
-
this.#shellMutationSnapshots.delete(key);
|
|
241
|
-
return snapshot;
|
|
236
|
+
consumeShellVerificationSnapshot(ctx: ExtensionContext, toolName: string, input: unknown, toolCallId?: string) {
|
|
237
|
+
return this.#shellMutationSnapshots.consume(ctx, toolName, input, toolCallId, this.taskIdentity(ctx)?.taskRunId);
|
|
242
238
|
}
|
|
243
239
|
|
|
244
240
|
clearShellMutationSnapshots(ctx: ExtensionContext): void {
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
if (key.startsWith(prefix)) this.#shellMutationSnapshots.delete(key);
|
|
248
|
-
}
|
|
241
|
+
this.#shellMutationSnapshots.clear(ctx);
|
|
242
|
+
this.projectVerification.clear(ctx);
|
|
249
243
|
}
|
|
250
244
|
|
|
251
245
|
hasAutoPackedPrompt(key: string): boolean {
|
|
@@ -12,8 +12,8 @@ const RUNTIME_MANAGED_PROJECT_INSTRUCTIONS = [
|
|
|
12
12
|
"Piagent runtime-managed task flow:",
|
|
13
13
|
"1. Runtime creates the task contract automatically for a bounded source-changing request before the model starts.",
|
|
14
14
|
"2. Only when runtime intake pauses for a broad, high-risk, or ambiguous task, call `piagent_task_start` exactly once with project-relative focus paths/globs; reuse an active contract.",
|
|
15
|
-
"3. Use complete runtime-delivered source directly; do not reread it normally. On edit drift/oldText mismatch, use attached recovery; otherwise reread the affected region once. Never retry guessed anchors. Otherwise read only missing source or a concrete criterion-linked focused test. Task scope seeds retrieval and review; it does not limit source mutation. Follow repository evidence across packages or child repos while preserving explicit user constraints. When creating an explicitly requested new path, do not probe that destination with read first; create it, then read back or verify it. If existence matters, use a non-erroring existence check.",
|
|
16
|
-
"4. Preserve every runtime-provided verifier exactly and keep commands separate. Run the exact verifier set once on the final tree; rerun only after a later mutation, an explicit operator request, or a runtime-authorized same-tree infrastructure retry. Before any repeat, use piagent_task_gate_check and run only commands reported missing for the current tree; Piagent reuses a durable exact pass on an unchanged tree. Automatic tasks need no other management calls.",
|
|
15
|
+
"3. Use complete runtime-delivered source directly; do not reread it normally. When the operator names an exact file, work from its delivered/current contents instead of listing or searching merely to rediscover it. Once exact current context is known for a coherent source-and-test or other multi-file change, prefer one apply_patch call over serial edit/write calls. On edit drift/oldText mismatch, use attached recovery; otherwise reread the affected region once. Never retry guessed anchors or batch multiple pattern calls against an unconfirmed target; confirm it once first. Otherwise read only missing source or a concrete criterion-linked focused test. Task scope seeds retrieval and review; it does not limit source mutation. Follow repository evidence across packages or child repos while preserving explicit user constraints. Report only paths and line references actually returned by tools; label inferences and unknowns, and never reread solely to format a citation. When creating an explicitly requested new path, do not probe that destination with read first; create it, then read back or verify it. If existence matters, use a non-erroring existence check.",
|
|
16
|
+
"4. Preserve every runtime-provided verifier exactly and keep commands separate. When you change source, add or update the smallest focused executable tests that directly exercise every explicit behavior, boundary, and error criterion unless current delivered tests already do; a broad verifier pass without criterion coverage is not completion evidence for that change. Run the exact verifier set once on the final tree; rerun only after a later mutation, an explicit operator request, or a runtime-authorized same-tree infrastructure retry. Do not warm up with an unfocused command already contained in that exact set; use a genuinely criterion-focused test or run the exact set directly. Before any repeat, use piagent_task_gate_check and run only commands reported missing for the current tree; Piagent reuses a durable exact pass on an unchanged tree. Automatic tasks need no other management calls.",
|
|
17
17
|
"5. Treat the current source, the operator request, and the durable Task Contract as authoritative. The parent model reasons and implements directly. Helpers are off unless explicitly enabled; even then, allow at most one fresh read-only helper only when runtime evidence proves two independent lanes and at least 30% projected net token saving. Never delegate writes, inherit parent history, fan out, or retry a deterministic helper failure. Preserve explicit user constraints and report unresolved risk. Runtime-derived scope is only the initial focus and may expand when implementation evidence requires FE, BE, tests, configuration, or another child repo. Runtime hooks enforce protected paths and approvals and record context, changes, current-tree verification, trace and final gate. Diagnostic groups appear only for explicit requests or manual high-risk checkpoints."
|
|
18
18
|
].join("\n");
|
|
19
19
|
|
|
@@ -48,7 +48,7 @@ export function compactManagedProjectInstructions(
|
|
|
48
48
|
): { systemPrompt: string; compacted: boolean } {
|
|
49
49
|
const concise = mode === "protected"
|
|
50
50
|
? "Piagent protected-path policy: do not read, disclose, or mutate protected content. Refuse without tool calls."
|
|
51
|
-
: "Piagent runtime task is injected below. Root project instructions are already loaded; do not re-read root AGENTS.md. Treat current source, the operator request, and the durable Task Contract as authoritative; preserve explicit user constraints and report unresolved risk. The parent reasons and implements directly. Helpers are opt-in and limited to one fresh read-only helper only with two independent lanes and at least 30% projected net token saving; never delegate writes, inherit parent history, fan out, or retry a deterministic helper failure. Runtime-derived scope is an initial retrieval/review focus, not a mutation boundary; follow repository evidence across packages and child repos. Use complete runtime-delivered source directly without rereading it normally. On edit drift/oldText mismatch, use attached recovery; otherwise reread the affected region once. Never retry guessed anchors. Otherwise read only missing source or a concrete criterion-linked focused test. For an explicitly requested new path, create it without a speculative read, then read back or verify it. Preserve every runtime verifier exactly and keep commands separate. Run the exact verifier set once on the final tree; rerun only after a later mutation or a runtime-authorized same-tree infrastructure retry. Make no task-management calls.";
|
|
51
|
+
: "Piagent runtime task is injected below. Root project instructions are already loaded; do not re-read root AGENTS.md. Treat current source, the operator request, and the durable Task Contract as authoritative; preserve explicit user constraints and report unresolved risk. The parent reasons and implements directly. Helpers are opt-in and limited to one fresh read-only helper only with two independent lanes and at least 30% projected net token saving; never delegate writes, inherit parent history, fan out, or retry a deterministic helper failure. Runtime-derived scope is an initial retrieval/review focus, not a mutation boundary; follow repository evidence across packages and child repos. Use complete runtime-delivered source directly without rereading it normally. For an exact operator-named file, use delivered/current contents instead of listing or searching merely to rediscover it. Once exact current context is known for a coherent source-and-test or other multi-file change, prefer one apply_patch call over serial edit/write calls. On edit drift/oldText mismatch, use attached recovery; otherwise reread the affected region once. Never retry guessed anchors or batch pattern calls against an unconfirmed target; confirm it once first. Otherwise read only missing source or a concrete criterion-linked focused test. When source is changed, add or update the smallest focused executable tests for every explicit behavior, boundary, and error criterion unless delivered tests already cover them; a broad verifier pass alone is not completion evidence for that change. Report only tool-observed paths and line references; label inferences and unknowns, and never reread solely to format a citation. For an explicitly requested new path, create it without a speculative read, then read back or verify it. Preserve every runtime verifier exactly and keep commands separate. Run the exact verifier set once on the final tree. Do not warm up with an unfocused command already contained in that exact set; rerun only after a later mutation or a runtime-authorized same-tree infrastructure retry. Make no task-management calls.";
|
|
52
52
|
const markerStart = "<!-- piagent-managed:start -->";
|
|
53
53
|
const markerEnd = "<!-- piagent-managed:end -->";
|
|
54
54
|
const start = systemPrompt.indexOf(markerStart);
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { captureWorkspaceVerificationSnapshot } from "../../extensions/workspace-verification-snapshot.js";
|
|
2
|
+
import { diagnosticDeliveryMatchesTask, type DiagnosticDelivery } from "../recovery/diagnostic-delivery.ts";
|
|
3
|
+
import type { TaskContract } from "../../extensions/guard-types.js";
|
|
4
|
+
import {
|
|
5
|
+
handoffIdentityMatchesTask,
|
|
6
|
+
readHandoffProjection,
|
|
7
|
+
taskAcceptanceDisposition,
|
|
8
|
+
type HandoffProjection
|
|
9
|
+
} from "../recovery/handoff-projection.ts";
|
|
10
|
+
|
|
11
|
+
export const UNCERTAIN_SEND_RECEIPT_TYPE = "piagent-uncertain-send-continuation-v1";
|
|
12
|
+
|
|
13
|
+
function folded(value: unknown): string {
|
|
14
|
+
return String(value ?? "")
|
|
15
|
+
.normalize("NFD")
|
|
16
|
+
.replace(/[\u0300-\u036f]/g, "")
|
|
17
|
+
.replace(/đ/g, "d")
|
|
18
|
+
.replace(/Đ/g, "D")
|
|
19
|
+
.replace(/\s+/g, " ")
|
|
20
|
+
.trim()
|
|
21
|
+
.toLowerCase();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Identify the narrow uncertain-delivery recovery protocol. Generic requests
|
|
26
|
+
* such as "continue" or "check the previous work" intentionally do not match:
|
|
27
|
+
* they remain free to start a different task in the same session.
|
|
28
|
+
*/
|
|
29
|
+
export function isUncertainSendContinuation(value: unknown): boolean {
|
|
30
|
+
const text = folded(value);
|
|
31
|
+
if (!text) return false;
|
|
32
|
+
const switchesWork = /\b(?:new|different|separate|unrelated)\s+(?:request|task|work)\b/.test(text)
|
|
33
|
+
|| /\b(?:task|yeu cau|cong viec|viec)\s+moi\b/.test(text);
|
|
34
|
+
if (switchesWork) return false;
|
|
35
|
+
const interrupted = /\b(?:connection|delivery|send|session)\b.{0,100}\b(?:interrupted|disconnected|dropped|lost|uncertain)\b/.test(text)
|
|
36
|
+
|| /\bket noi\b.{0,100}\b(?:gian doan|bi ngat|bi mat)\b/.test(text);
|
|
37
|
+
const mayHaveArrived = /\b(?:previous|prior|last)\s+(?:send|message|request)\b.{0,100}\b(?:may|might|could)\s+have\s+been\s+(?:delivered|sent|received)\b/.test(text)
|
|
38
|
+
|| /\b(?:delivery|send|receipt)\b.{0,100}\b(?:unknown|uncertain|unconfirmed)\b/.test(text)
|
|
39
|
+
|| /\b(?:tin nhan|yeu cau|lan gui)\s+(?:truoc|vua roi)\b.{0,100}\bco the\b.{0,60}\b(?:da gui|da nhan|duoc gui)\b/.test(text);
|
|
40
|
+
const sameRequest = /\bcontinue\b.{0,100}\b(?:same|original|previous|prior)\s+(?:request|task|work)\b/.test(text)
|
|
41
|
+
|| /\bdurable\s+session\s+state\b/.test(text)
|
|
42
|
+
|| /\bwithout\s+duplicating\b/.test(text)
|
|
43
|
+
|| /\btiep tuc\b.{0,100}\b(?:cung|yeu cau|task|cong viec)\b/.test(text)
|
|
44
|
+
|| /\bkhong\s+(?:lap lai|trung lap)\b/.test(text);
|
|
45
|
+
return interrupted && mayHaveArrived && sameRequest;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function bounded(values: unknown, maximum = 8): string[] {
|
|
49
|
+
return [...new Set((Array.isArray(values) ? values : [])
|
|
50
|
+
.filter((value): value is string => typeof value === "string" && value.trim().length > 0)
|
|
51
|
+
.map((value) => value.trim()))]
|
|
52
|
+
.slice(0, maximum);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export type TerminalUncertainSendReceipt = {
|
|
56
|
+
customType: typeof UNCERTAIN_SEND_RECEIPT_TYPE;
|
|
57
|
+
content: string;
|
|
58
|
+
details: {
|
|
59
|
+
schemaVersion: 1;
|
|
60
|
+
version: typeof UNCERTAIN_SEND_RECEIPT_TYPE;
|
|
61
|
+
state: "settled";
|
|
62
|
+
taskId: string;
|
|
63
|
+
taskRunId: string;
|
|
64
|
+
outcome: TaskContract["trace"]["outcome"];
|
|
65
|
+
gateDecision: "pass" | "fail";
|
|
66
|
+
completionApproved: boolean;
|
|
67
|
+
diagnosticDelivery?: DiagnosticDelivery;
|
|
68
|
+
changedFiles: string[];
|
|
69
|
+
missing: string[];
|
|
70
|
+
nextSafeAction: string;
|
|
71
|
+
replayed: false;
|
|
72
|
+
modelTurnStarted: false;
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
export type TerminalUncertainSendBinding = {
|
|
77
|
+
task: TaskContract;
|
|
78
|
+
text: string;
|
|
79
|
+
receipt?: TerminalUncertainSendReceipt;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
export type UncertainSendRuntimeIntake = {
|
|
83
|
+
intake: {
|
|
84
|
+
started: false;
|
|
85
|
+
text: string;
|
|
86
|
+
task?: TaskContract;
|
|
87
|
+
plannedContext: [];
|
|
88
|
+
plannedContextComplete: true;
|
|
89
|
+
continuation: "terminal-uncertain-send";
|
|
90
|
+
};
|
|
91
|
+
trace: Record<string, unknown>;
|
|
92
|
+
task?: TaskContract;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
type HandoffReader = (cwd: string, taskRunId: string) => HandoffProjection | undefined;
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Project a privacy-safe terminal receipt from the immediately prior durable
|
|
99
|
+
* task. Missing/corrupt/mismatched handoff state returns undefined so callers
|
|
100
|
+
* can fail closed without claiming that delivery or completion was observed.
|
|
101
|
+
*/
|
|
102
|
+
export function terminalUncertainSendReceipt(
|
|
103
|
+
cwd: string,
|
|
104
|
+
task: TaskContract | undefined,
|
|
105
|
+
readHandoff: HandoffReader = readHandoffProjection
|
|
106
|
+
): TerminalUncertainSendReceipt | undefined {
|
|
107
|
+
if (!task || task.trace.outcome === "pending") return undefined;
|
|
108
|
+
let handoff;
|
|
109
|
+
try {
|
|
110
|
+
handoff = readHandoff(cwd, task.taskRunId);
|
|
111
|
+
} catch {
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
if (!handoff
|
|
115
|
+
|| !handoffIdentityMatchesTask(handoff.identity, task)
|
|
116
|
+
|| handoff.state.taskOutcome !== task.trace.outcome) return undefined;
|
|
117
|
+
if (handoff.state.completionApproved === true || handoff.state.diagnosticDelivery) {
|
|
118
|
+
const authoritativeAcceptance = taskAcceptanceDisposition(task);
|
|
119
|
+
if (handoff.acceptance.required !== authoritativeAcceptance.required
|
|
120
|
+
|| handoff.acceptance.satisfied !== authoritativeAcceptance.satisfied
|
|
121
|
+
|| handoff.acceptance.criteriaCount !== authoritativeAcceptance.criteriaCount
|
|
122
|
+
|| handoff.acceptance.dispositionDigest !== authoritativeAcceptance.dispositionDigest) return undefined;
|
|
123
|
+
}
|
|
124
|
+
const diagnosticDelivery = handoff.state.diagnosticDelivery;
|
|
125
|
+
if (diagnosticDelivery && !diagnosticDeliveryMatchesTask(diagnosticDelivery, task, taskAcceptanceDisposition(task).dispositionDigest)) return undefined;
|
|
126
|
+
if (diagnosticDelivery) {
|
|
127
|
+
try {
|
|
128
|
+
const current = captureWorkspaceVerificationSnapshot(cwd);
|
|
129
|
+
if (!current.proofCapable || current.digest !== handoff.tree.currentDigest
|
|
130
|
+
|| current.workspaceRevisionDigest !== handoff.tree.workspaceRevisionDigest) return undefined;
|
|
131
|
+
} catch { return undefined; }
|
|
132
|
+
}
|
|
133
|
+
const changedFiles = bounded(handoff.changedFiles.current, 12);
|
|
134
|
+
const missing = bounded(handoff.state.missing, 12);
|
|
135
|
+
const approved = handoff.state.completionApproved === true;
|
|
136
|
+
const lines = [
|
|
137
|
+
"[Piagent delivery receipt]",
|
|
138
|
+
`The immediately preceding task already settled as ${handoff.state.taskOutcome}; its durable contract was reused and no command, mutation, message, or model turn was replayed.`,
|
|
139
|
+
`Completion approved: ${approved ? "yes" : "no"}. Gate: ${handoff.state.gateDecision}.`,
|
|
140
|
+
...(diagnosticDelivery ? ["Diagnostic delivery only: unproved criteria remain pending; no quality claim."] : []),
|
|
141
|
+
...(changedFiles.length > 0 ? [`Changed files: ${changedFiles.join(", ")}.`] : []),
|
|
142
|
+
...(missing.length > 0 ? [`Still missing: ${missing.join("; ")}.`] : []),
|
|
143
|
+
`Next safe action: ${handoff.nextSafeAction.action}.`
|
|
144
|
+
];
|
|
145
|
+
return {
|
|
146
|
+
customType: UNCERTAIN_SEND_RECEIPT_TYPE,
|
|
147
|
+
content: lines.join("\n"),
|
|
148
|
+
details: {
|
|
149
|
+
schemaVersion: 1,
|
|
150
|
+
version: UNCERTAIN_SEND_RECEIPT_TYPE,
|
|
151
|
+
state: "settled",
|
|
152
|
+
taskId: task.taskId,
|
|
153
|
+
taskRunId: task.taskRunId,
|
|
154
|
+
outcome: task.trace.outcome,
|
|
155
|
+
gateDecision: handoff.state.gateDecision,
|
|
156
|
+
completionApproved: approved,
|
|
157
|
+
...(diagnosticDelivery ? { diagnosticDelivery } : {}),
|
|
158
|
+
changedFiles,
|
|
159
|
+
missing,
|
|
160
|
+
nextSafeAction: handoff.nextSafeAction.action,
|
|
161
|
+
replayed: false,
|
|
162
|
+
modelTurnStarted: false
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export function unavailableUncertainSendContext(task?: TaskContract): string {
|
|
168
|
+
const identity = task
|
|
169
|
+
? `durable task ${task.taskId} (${task.taskRunId})`
|
|
170
|
+
: "the immediately preceding durable task";
|
|
171
|
+
return [
|
|
172
|
+
"[Piagent uncertain-send continuation]",
|
|
173
|
+
`Reuse ${identity}; do not create a replacement task or repeat prior mutations/messages.`,
|
|
174
|
+
"Its terminal handoff receipt is missing, corrupt, or identity-mismatched, so completion must not be inferred.",
|
|
175
|
+
"Report that the durable receipt is unavailable and require state inspection or an explicit new request before any further mutation."
|
|
176
|
+
].join("\n");
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Bind a synthetic reconnect continuation to the terminal task already bound
|
|
181
|
+
* to this durable session. This decision is intentionally separate from
|
|
182
|
+
* generic task intake so a receipt recovery cannot become a new read-only
|
|
183
|
+
* task merely because the previous operation settled before the client saw it.
|
|
184
|
+
*/
|
|
185
|
+
export function terminalUncertainSendBinding(
|
|
186
|
+
cwd: string,
|
|
187
|
+
task: TaskContract | undefined,
|
|
188
|
+
prompt: unknown,
|
|
189
|
+
readHandoff: HandoffReader = readHandoffProjection
|
|
190
|
+
): TerminalUncertainSendBinding | undefined {
|
|
191
|
+
if (!task || task.trace.outcome === "pending" || !isUncertainSendContinuation(prompt)) return undefined;
|
|
192
|
+
const receipt = terminalUncertainSendReceipt(cwd, task, readHandoff);
|
|
193
|
+
return {
|
|
194
|
+
task,
|
|
195
|
+
text: receipt
|
|
196
|
+
? `${receipt.content}\nRecovery-turn rule: return only this durable receipt; do not call tools, repeat work, or start another task.`
|
|
197
|
+
: unavailableUncertainSendContext(task),
|
|
198
|
+
receipt
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export function uncertainSendRuntimeIntake(
|
|
203
|
+
cwd: string,
|
|
204
|
+
task: TaskContract | undefined,
|
|
205
|
+
prompt: unknown,
|
|
206
|
+
sessionId: string
|
|
207
|
+
): UncertainSendRuntimeIntake | undefined {
|
|
208
|
+
if (!isUncertainSendContinuation(prompt) || task?.trace.outcome === "pending") return undefined;
|
|
209
|
+
const binding = terminalUncertainSendBinding(cwd, task, prompt);
|
|
210
|
+
return {
|
|
211
|
+
intake: {
|
|
212
|
+
started: false,
|
|
213
|
+
task: binding?.task,
|
|
214
|
+
text: binding?.text ?? unavailableUncertainSendContext(),
|
|
215
|
+
plannedContext: [],
|
|
216
|
+
plannedContextComplete: true,
|
|
217
|
+
continuation: "terminal-uncertain-send"
|
|
218
|
+
},
|
|
219
|
+
trace: {
|
|
220
|
+
event: binding ? "uncertain_send_terminal_task_bound" : "uncertain_send_task_binding_unavailable",
|
|
221
|
+
taskId: binding?.task.taskId,
|
|
222
|
+
taskRunId: binding?.task.taskRunId,
|
|
223
|
+
sessionId,
|
|
224
|
+
receiptAvailable: Boolean(binding?.receipt),
|
|
225
|
+
replacementTaskStarted: false,
|
|
226
|
+
replayed: false,
|
|
227
|
+
modelTurnStarted: true
|
|
228
|
+
},
|
|
229
|
+
task: binding?.task
|
|
230
|
+
};
|
|
231
|
+
}
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
CONTEXT_WATCH_PERCENT,
|
|
7
7
|
LONG_INPUT_CHARS
|
|
8
8
|
} from "../runtime-limits.ts";
|
|
9
|
+
import type { WorkflowId } from "../workflows/webui-workflow.ts";
|
|
9
10
|
import { modelLabel } from "./message-signals.ts";
|
|
10
11
|
|
|
11
12
|
export type UsageSnapshot = {
|
|
@@ -32,7 +33,7 @@ export type UsageSnapshot = {
|
|
|
32
33
|
};
|
|
33
34
|
|
|
34
35
|
export type ContextPreflight = {
|
|
35
|
-
workflow:
|
|
36
|
+
workflow: WorkflowId;
|
|
36
37
|
inputChars: number;
|
|
37
38
|
inputTokenEstimate: number;
|
|
38
39
|
liveContext?: UsageSnapshot["contextUsage"];
|
|
@@ -107,7 +108,7 @@ function estimateTokensFromChars(chars: number): number {
|
|
|
107
108
|
return Math.max(0, Math.ceil(chars / 4));
|
|
108
109
|
}
|
|
109
110
|
|
|
110
|
-
export function buildContextPreflight(snapshot: UsageSnapshot, workflow = "task", inputChars = 0): ContextPreflight {
|
|
111
|
+
export function buildContextPreflight(snapshot: UsageSnapshot, workflow: WorkflowId = "task", inputChars = 0): ContextPreflight {
|
|
111
112
|
const inputTokenEstimate = estimateTokensFromChars(inputChars);
|
|
112
113
|
const live = snapshot.contextUsage;
|
|
113
114
|
let projectedContext: ContextPreflight["projectedContext"];
|
|
@@ -151,7 +152,7 @@ export function buildContextPreflight(snapshot: UsageSnapshot, workflow = "task"
|
|
|
151
152
|
commands: [
|
|
152
153
|
"/task-preflight",
|
|
153
154
|
"/task-preflight compact",
|
|
154
|
-
`/fresh ${workflow
|
|
155
|
+
`/fresh ${workflow} <request>`,
|
|
155
156
|
"/usage",
|
|
156
157
|
"/session"
|
|
157
158
|
]
|
|
@@ -162,9 +162,9 @@ function parseUpdateHunks(section: string[], repoPath: string): UpdateHunk[] {
|
|
|
162
162
|
if (line[0] !== "-") newLines.push(line.slice(1));
|
|
163
163
|
if (line[0] === "+" || line[0] === "-") changed = true;
|
|
164
164
|
}
|
|
165
|
-
if (!bodyLines
|
|
166
|
-
|
|
167
|
-
}
|
|
165
|
+
if (!bodyLines) fail("malformed-hunk", `Hunk body is empty: ${repoPath}. Put @@ on its own line, then add body lines prefixed by space, +, or -; no file was changed.`);
|
|
166
|
+
if (!changed) fail("malformed-hunk", `Hunk contains no change line: ${repoPath}. Include at least one + or - body line in addition to any exact unchanged context; no file was changed.`);
|
|
167
|
+
if (oldLines.length === 0) fail("malformed-hunk", `Hunk must contain a change and at least one exact old-side line: ${repoPath}. A plus-only Update File hunk is invalid; for an insertion or append, place an adjacent existing anchor line (prefixed by one space) before or after the new + lines according to the intended position. Keep @@ on its own line and put removed lines on separate - lines; no file was changed.`);
|
|
168
168
|
hunks.push({ oldLines, newLines });
|
|
169
169
|
}
|
|
170
170
|
if (!hunkCount) fail("malformed-hunk", `Update contains no hunks: ${repoPath}`);
|
|
@@ -481,10 +481,10 @@ export function registerApplyPatchTool(
|
|
|
481
481
|
name: "apply_patch",
|
|
482
482
|
label: "Apply Patch",
|
|
483
483
|
description: "Apply one validated OpenAI-style patch across multiple project files in a single guarded tool call.",
|
|
484
|
-
promptSnippet: "
|
|
484
|
+
promptSnippet: "Prefer one coherent apply_patch call for a bounded source-and-test or other multi-file change only when exact old context for every target is available. Update hunks require an exact old-side anchor; plus-only insertions are invalid. Otherwise use one bounded writer per file.",
|
|
485
485
|
promptGuidelines: [
|
|
486
|
-
"
|
|
487
|
-
"Use each project-relative target once
|
|
486
|
+
"The patch value must contain only the raw patch: its first line is exactly *** Begin Patch, its last line is exactly *** End Patch, and no prose, JSON, code fence, or other content may appear before or after those delimiters. For each *** Update File hunk, put @@ on its own line. Put every old, new, or unchanged body line below it with a leading -, +, or space; never write @@ -old or @@ +new.",
|
|
487
|
+
"Use each project-relative target once. Every Update File hunk must include at least one exact old-side line prefixed by space or -; for append/insert, put an adjacent existing space-prefixed anchor before or after the + lines to preserve the intended position. Include enough context to match exactly once."
|
|
488
488
|
],
|
|
489
489
|
parameters: Type.Object({ patch: Type.String({ minLength: 1, maxLength: MAX_PATCH_BYTES }) }, { additionalProperties: false }),
|
|
490
490
|
executionMode: "sequential",
|
|
@@ -12,7 +12,7 @@ export type PhaseMutationInput = {
|
|
|
12
12
|
verificationCarrier?: boolean;
|
|
13
13
|
};
|
|
14
14
|
|
|
15
|
-
const MANAGED_HOST_TOOL_ORDER = Object.freeze(["read", "grep", "find", "ls", "
|
|
15
|
+
const MANAGED_HOST_TOOL_ORDER = Object.freeze(["read", "grep", "find", "ls", "apply_patch", "edit", "write", "bash", "shell", "exec"]);
|
|
16
16
|
|
|
17
17
|
function phaseHostToolName(toolName: string): string {
|
|
18
18
|
return toolName === "shell" || toolName === "exec" ? "bash" : toolName;
|