@piagent/platform 1.6.1 → 1.8.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/CHANGELOG.md +71 -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/model-options.md +20 -15
- 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 +3 -0
- package/docs/quality-benchmark.md +128 -8
- package/docs/quickstart-vietnamese.md +2 -2
- package/docs/release-install-policy.md +38 -11
- 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 +23 -0
- package/docs-site/content/runtime.html +2 -2
- package/docs-site/content/whats-new.html +23 -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 +24 -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 +24 -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/model-route-policy.ts +33 -13
- package/packages/piagent-core/runtime/model/model-route-types.ts +10 -6
- 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-DMU7Xe_O.js} +1 -1
- package/packages/piagent-webui/dist/client/assets/index-Cui9AAV_.js +176 -0
- package/packages/piagent-webui/dist/client/assets/{index-BV-_03yl.css → index-DVahUVWy.css} +1 -1
- 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 +14 -6
- 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/configure-model-scope.sh +6 -2
- package/scripts/fs4-readiness-evaluation.mjs +7 -1
- package/scripts/install-global.sh +2 -2
- package/scripts/model-route-evaluation-core.ts +1 -0
- package/scripts/phase-tools-evaluation.mjs +1 -0
- package/scripts/pi-auto.sh +7 -1
- package/scripts/pi-model-route.mjs +1 -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/setup.sh +2 -2
- package/scripts/typescript-loader.mjs +135 -1
- package/scripts/update-global.mjs +6 -7
- package/scripts/verify-local.sh +37 -56
- package/scripts/verify-release-identity.mjs +5 -3
- package/templates/global/settings.json +5 -1
- package/packages/piagent-webui/dist/client/assets/index-CgOEyRPG.js +0 -176
|
@@ -1,94 +1,52 @@
|
|
|
1
1
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import {
|
|
3
|
+
WORKFLOW_OPTIONS,
|
|
4
|
+
type WorkflowId,
|
|
5
|
+
resolveWorkflowId,
|
|
6
|
+
workflowCommandNames,
|
|
7
|
+
workflowHelpLines,
|
|
8
|
+
workflowOption
|
|
9
|
+
} from "../workflows/webui-workflow.ts";
|
|
10
|
+
import { buildOnboardingWorkflowPrompt, buildWorkflowFollowUp } from "../workflows/workflow-follow-up.ts";
|
|
11
|
+
|
|
12
|
+
import type { TaskContract } from "../../extensions/guard-types.js";
|
|
13
|
+
import { activeSessionTask } from "../../extensions/task-state.js";
|
|
14
|
+
import { isUncertainSendContinuation, terminalUncertainSendReceipt } from "../session/uncertain-send-continuation.ts";
|
|
2
15
|
|
|
3
16
|
type ExtensionContext = any;
|
|
4
17
|
|
|
5
18
|
export function registerWorkflowCommands(pi: ExtensionAPI, deps: Record<string, any>): any {
|
|
6
19
|
const {
|
|
7
|
-
|
|
20
|
+
ONBOARDING_COMMAND_ACTIONS, WORKFLOW_COMMAND_EXCLUSIONS, buildContextIndexStatus,
|
|
8
21
|
buildUsageSnapshot, commandArgs, emitProfileStatus, emitProfileTechStatus, emitRuntimeMessage,
|
|
9
22
|
fs, loadProfileFromContext, prefixCompletions, projectContextFilePath, projectProfilePath,
|
|
10
23
|
registerRuntimeCommand, resolveMemorySettings, runProfileTechWizard, selectRuntimeAction, sendWorkflowFollowUp,
|
|
11
24
|
freshRequestParts, shortTaskLabel, techStackPath
|
|
12
25
|
} = deps;
|
|
13
|
-
type WorkflowCommandName = "task" | "scout" | "be-to-fe" | "discuss" | "plan" | "review" | "platform-improve" | "commit" | "pr" | "onboard";
|
|
14
|
-
|
|
15
|
-
const WORKFLOW_ALIASES: Record<string, WorkflowCommandName> = {
|
|
16
|
-
task: "task",
|
|
17
|
-
implement: "task",
|
|
18
|
-
scout: "scout",
|
|
19
|
-
audit: "scout",
|
|
20
|
-
"be-to-fe": "be-to-fe",
|
|
21
|
-
befe: "be-to-fe",
|
|
22
|
-
discuss: "discuss",
|
|
23
|
-
clarify: "discuss",
|
|
24
|
-
plan: "plan",
|
|
25
|
-
review: "review",
|
|
26
|
-
"platform-improve": "platform-improve",
|
|
27
|
-
platform: "platform-improve",
|
|
28
|
-
commit: "commit",
|
|
29
|
-
pr: "pr",
|
|
30
|
-
onboard: "onboard",
|
|
31
|
-
"onboard-project": "onboard"
|
|
32
|
-
};
|
|
33
|
-
|
|
34
26
|
function workflowChoices(): Array<{ value: string; label: string; description: string; recommended?: boolean }> {
|
|
35
27
|
return [
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
{ value: "commit", label: "Commit", description: "Guarded local commit workflow" },
|
|
43
|
-
{ value: "pr", label: "PR", description: "Guarded pull request preparation" },
|
|
44
|
-
{ value: "onboard", label: "Onboard", description: "First-read project onboarding scout" },
|
|
45
|
-
{ value: "platform-improve", label: "Platform", description: "Improve Pi Agent Platform itself" },
|
|
28
|
+
...WORKFLOW_OPTIONS.map((option) => ({
|
|
29
|
+
value: option.id,
|
|
30
|
+
label: option.label,
|
|
31
|
+
description: option.description,
|
|
32
|
+
...(option.id === "task" ? { recommended: true } : {})
|
|
33
|
+
})),
|
|
46
34
|
{ value: "help", label: "Help", description: "Show typed workflow forms" }
|
|
47
35
|
];
|
|
48
36
|
}
|
|
49
37
|
|
|
50
|
-
function buildOnboardingWorkflowPrompt(focus: string): string {
|
|
51
|
-
return [
|
|
52
|
-
"Run the Pi Agent Platform first-read onboarding workflow for this repository.",
|
|
53
|
-
"",
|
|
54
|
-
`Optional focus: ${focus.trim() || "whole repository"}`,
|
|
55
|
-
"",
|
|
56
|
-
"Preconditions:",
|
|
57
|
-
"- The operator has logged in and selected the intended model/thinking level.",
|
|
58
|
-
"- Stay read-only except writing Piagent onboarding state through piagent tools.",
|
|
59
|
-
"",
|
|
60
|
-
"Mandatory flow:",
|
|
61
|
-
"1. Call piagent_context with detail=full.",
|
|
62
|
-
"2. If the project is unprofiled, call piagent_profile_options, do a lightweight root scout, recommend a profile, and use piagent_profile_apply only after the operator choice is clear.",
|
|
63
|
-
"3. Prefer /profile setup or piagent_profile_tech_options + piagent_profile_tech_apply for tech stack selection.",
|
|
64
|
-
"4. Re-call piagent_context after profile/tech changes.",
|
|
65
|
-
"5. Call piagent_memory_status and treat memory as advisory.",
|
|
66
|
-
"6. Read AGENTS.md, README/package/build config, required context, docs/architecture files, source map, and verify command definitions. Do not ingest the whole repo.",
|
|
67
|
-
"7. Identify project purpose, stack/runtime, ownership boundaries, high-risk areas, protected paths, verify commands, MCP/tool capabilities, selected tech stack, memory policy, and conventions.",
|
|
68
|
-
"8. Write a concise .pi/project-context.md snapshot and record it with piagent_project_onboarding_record so .pi/context-index.json is generated.",
|
|
69
|
-
"9. Call piagent_context_index_status and report pending/stale warnings.",
|
|
70
|
-
"",
|
|
71
|
-
"Final output: profile, tech stack, context files read, verification matrix, high-risk areas, context-index status, memory status, and any missing operator decisions."
|
|
72
|
-
].join("\n");
|
|
73
|
-
}
|
|
74
|
-
|
|
75
38
|
function emitWorkflowHelp(ctx: ExtensionContext): void {
|
|
76
|
-
emitRuntimeMessage(ctx, "piagent-workflow-help",
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
"readOnly: /workflow scout <area/spec/risk>",
|
|
80
|
-
"beToFe: /workflow be-to-fe <BE spec/change + FE outcome>",
|
|
81
|
-
"clarify: /workflow discuss <rough idea>",
|
|
82
|
-
"plan: /workflow plan <goal>",
|
|
83
|
-
"review: /workflow review <target or diff>",
|
|
84
|
-
"git: /workflow commit [message] | /workflow pr [title]",
|
|
85
|
-
"onboard: /workflow onboard [focus]",
|
|
86
|
-
"aliases still work: /task, /scout, /be-to-fe, /commit, /pr"
|
|
87
|
-
].join("\n"), { workflows: workflowChoices().map((choice) => choice.value) });
|
|
39
|
+
emitRuntimeMessage(ctx, "piagent-workflow-help", workflowHelpLines().join("\n"), {
|
|
40
|
+
workflows: WORKFLOW_OPTIONS.map((option) => option.id)
|
|
41
|
+
});
|
|
88
42
|
}
|
|
89
43
|
|
|
90
44
|
async function runWorkflowNamespace(raw: string, ctx: ExtensionContext): Promise<void> {
|
|
91
45
|
const { action, rest } = commandArgs(raw);
|
|
46
|
+
if (action === "help") {
|
|
47
|
+
emitWorkflowHelp(ctx);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
92
50
|
if (!action) {
|
|
93
51
|
const chosen = await selectRuntimeAction(ctx, "Piagent workflow", workflowChoices(), "task");
|
|
94
52
|
if (!chosen || chosen === "help") {
|
|
@@ -107,8 +65,8 @@ export function registerWorkflowCommands(pi: ExtensionAPI, deps: Record<string,
|
|
|
107
65
|
].join("\n"), { workflow: chosen });
|
|
108
66
|
return;
|
|
109
67
|
}
|
|
110
|
-
const workflow =
|
|
111
|
-
if (!workflow
|
|
68
|
+
const workflow = resolveWorkflowId(action);
|
|
69
|
+
if (!workflow) {
|
|
112
70
|
emitRuntimeMessage(ctx, "piagent-workflow-error", `unknown workflow: ${action}\nRun /workflow help`, { action }, { message: `Unknown workflow: ${action}`, level: "warning" });
|
|
113
71
|
return;
|
|
114
72
|
}
|
|
@@ -117,7 +75,7 @@ export function registerWorkflowCommands(pi: ExtensionAPI, deps: Record<string,
|
|
|
117
75
|
ctx.ui.notify("Workflow launched: onboard", "info");
|
|
118
76
|
return;
|
|
119
77
|
}
|
|
120
|
-
if (!rest.trim()) {
|
|
78
|
+
if (!rest.trim() && workflowOption(workflow)?.requestRequired !== false) {
|
|
121
79
|
emitRuntimeMessage(ctx, "piagent-workflow-needs-request", [
|
|
122
80
|
`workflow: ${workflow}`,
|
|
123
81
|
`run: /workflow ${workflow} <request>`,
|
|
@@ -125,7 +83,13 @@ export function registerWorkflowCommands(pi: ExtensionAPI, deps: Record<string,
|
|
|
125
83
|
].join("\n"), { workflow });
|
|
126
84
|
return;
|
|
127
85
|
}
|
|
128
|
-
|
|
86
|
+
// Namespace commands run before the input hook. Recover a current durable
|
|
87
|
+
// receipt here so their deferred extension prompt cannot open a model turn.
|
|
88
|
+
if (isUncertainSendContinuation(rest) && ctx.isIdle()) {
|
|
89
|
+
const receipt = terminalUncertainSendReceipt(ctx.cwd, activeSessionTask(ctx.cwd, ctx.sessionManager.getSessionId()) as TaskContract | undefined);
|
|
90
|
+
if (receipt) { emitRuntimeMessage(ctx, receipt.customType, receipt.content, receipt.details); return; }
|
|
91
|
+
}
|
|
92
|
+
sendWorkflowFollowUp(buildWorkflowFollowUp(workflow, rest));
|
|
129
93
|
ctx.ui.notify(`Workflow launched: ${workflow}`, "info");
|
|
130
94
|
}
|
|
131
95
|
|
|
@@ -150,20 +114,16 @@ export function registerWorkflowCommands(pi: ExtensionAPI, deps: Record<string,
|
|
|
150
114
|
const sections: Record<string, string[]> = {
|
|
151
115
|
overview: [
|
|
152
116
|
"Piagent command surface:",
|
|
153
|
-
"runtime: /workflow | /piagent-inspector | /usage | /context | /permission | /commands | /profile | /memory | /onboard | /fresh",
|
|
117
|
+
"runtime: /workflow | /piagent-inspector | /usage | /context | /permission | /fast | /commands | /profile | /memory | /onboard | /fresh",
|
|
154
118
|
"native: /model | /name | /session | /resume | /compact | /mcp",
|
|
155
|
-
|
|
119
|
+
`workflow: /workflow ${WORKFLOW_OPTIONS.map((option) => option.id).join("|")} <request>`,
|
|
156
120
|
"mcp: /mcp is Pi native; governed MCP checks stay at /piagent-mcp to avoid collision",
|
|
157
121
|
"legacy: /piagent-* commands still work where they existed",
|
|
158
122
|
"principle: runtime commands run immediately; workflows intentionally launch an agent turn"
|
|
159
123
|
],
|
|
160
124
|
workflow: [
|
|
161
125
|
"Workflow entrypoint:",
|
|
162
|
-
|
|
163
|
-
"/workflow task <request>",
|
|
164
|
-
"/workflow scout <read-only request>",
|
|
165
|
-
"/workflow be-to-fe <BE spec/change + FE outcome>",
|
|
166
|
-
"/workflow onboard [focus]"
|
|
126
|
+
...workflowHelpLines()
|
|
167
127
|
],
|
|
168
128
|
usage: [
|
|
169
129
|
"Usage/session:",
|
|
@@ -171,7 +131,7 @@ export function registerWorkflowCommands(pi: ExtensionAPI, deps: Record<string,
|
|
|
171
131
|
"/piagent-inspector",
|
|
172
132
|
"/usage history",
|
|
173
133
|
"Pi native: /name <task name>",
|
|
174
|
-
|
|
134
|
+
`/fresh ${WORKFLOW_OPTIONS.map((option) => option.id).join("|")} <request>`,
|
|
175
135
|
"native: /session | /resume"
|
|
176
136
|
],
|
|
177
137
|
context: [
|
|
@@ -193,8 +153,16 @@ export function registerWorkflowCommands(pi: ExtensionAPI, deps: Record<string,
|
|
|
193
153
|
"Model:",
|
|
194
154
|
"/model or Ctrl+L opens Pi native selector",
|
|
195
155
|
"/model-options shows local Piagent model guidance",
|
|
156
|
+
"/fast status|on|off controls the OpenAI Codex Fast service tier without changing model/thinking",
|
|
196
157
|
"Ctrl+P cycles model scope; Shift+Tab cycles thinking"
|
|
197
158
|
],
|
|
159
|
+
fast: [
|
|
160
|
+
"Fast service tier:",
|
|
161
|
+
"/fast status",
|
|
162
|
+
"/fast on",
|
|
163
|
+
"/fast off",
|
|
164
|
+
"Fast is a zero-model-turn session setting; model/thinking stay unchanged and provider quota or pricing may differ"
|
|
165
|
+
],
|
|
198
166
|
memory: [
|
|
199
167
|
"Memory:",
|
|
200
168
|
"/memory",
|
|
@@ -240,6 +208,7 @@ export function registerWorkflowCommands(pi: ExtensionAPI, deps: Record<string,
|
|
|
240
208
|
{ value: "context", label: "Context", description: "Index/search/preflight/compact" },
|
|
241
209
|
{ value: "permission", label: "Permission", description: "Read/write/full access controls" },
|
|
242
210
|
{ value: "model", label: "Model", description: "Native model selector and thinking" },
|
|
211
|
+
{ value: "fast", label: "Fast mode", description: "Status and OpenAI Codex Fast service tier control" },
|
|
243
212
|
{ value: "mcp", label: "MCP", description: "Governed MCP commands" },
|
|
244
213
|
{ value: "subagents", label: "Subagents", description: "Health, fleet, cost" },
|
|
245
214
|
{ value: "terminal", label: "Terminal", description: "piagent-* helpers" }
|
|
@@ -339,7 +308,7 @@ export function registerWorkflowCommands(pi: ExtensionAPI, deps: Record<string,
|
|
|
339
308
|
registerRuntimeCommand(pi, "workflow", {
|
|
340
309
|
description: "One menu for Piagent task, scout, review, git, and onboarding workflows",
|
|
341
310
|
getArgumentCompletions: (prefix: string) => prefixCompletions(
|
|
342
|
-
|
|
311
|
+
workflowCommandNames().filter((name) => !WORKFLOW_COMMAND_EXCLUSIONS.includes(name)),
|
|
343
312
|
prefix
|
|
344
313
|
),
|
|
345
314
|
handler: async (args, ctx) => {
|
|
@@ -376,16 +345,16 @@ export function registerWorkflowCommands(pi: ExtensionAPI, deps: Record<string,
|
|
|
376
345
|
handler: async (args, ctx) => runOnboardingCommand(String(args ?? ""), ctx)
|
|
377
346
|
});
|
|
378
347
|
|
|
379
|
-
async function startFreshWorkflow(workflow:
|
|
348
|
+
async function startFreshWorkflow(workflow: WorkflowId, args: string, ctx: any) {
|
|
380
349
|
const parsed = freshRequestParts(String(args ?? ""));
|
|
381
350
|
const request = parsed.request;
|
|
382
|
-
if (!request) {
|
|
351
|
+
if (!request && workflowOption(workflow)?.requestRequired !== false) {
|
|
383
352
|
ctx.ui.notify(`Usage: /fresh ${workflow} <request>`, "warning");
|
|
384
353
|
return;
|
|
385
354
|
}
|
|
386
355
|
|
|
387
|
-
const label = parsed.sessionTitle ?? shortTaskLabel(request);
|
|
388
|
-
const command = `/${workflow}
|
|
356
|
+
const label = parsed.sessionTitle ?? shortTaskLabel(request || workflow);
|
|
357
|
+
const command = [`/${workflow}`, request].filter(Boolean).join(" ");
|
|
389
358
|
const result = await ctx.newSession({
|
|
390
359
|
withSession: async (nextCtx) => {
|
|
391
360
|
pi.setSessionName(`pi:${label}`);
|
|
@@ -398,18 +367,20 @@ export function registerWorkflowCommands(pi: ExtensionAPI, deps: Record<string,
|
|
|
398
367
|
}
|
|
399
368
|
|
|
400
369
|
registerRuntimeCommand(pi, "fresh", {
|
|
401
|
-
description: "Open a fresh governed session for
|
|
402
|
-
getArgumentCompletions: (prefix: string) => prefixCompletions(
|
|
370
|
+
description: "Open a fresh governed session for any Piagent workflow",
|
|
371
|
+
getArgumentCompletions: (prefix: string) => prefixCompletions([...workflowCommandNames({ aliases: false }), "help"], prefix),
|
|
403
372
|
handler: async (args, ctx) => {
|
|
404
373
|
const { action, rest } = commandArgs(String(args ?? ""));
|
|
405
374
|
if (!action || action === "help") {
|
|
406
|
-
emitRuntimeMessage(ctx, "piagent-fresh-help",
|
|
375
|
+
emitRuntimeMessage(ctx, "piagent-fresh-help", [
|
|
376
|
+
"namespace: /fresh",
|
|
377
|
+
...WORKFLOW_OPTIONS.map((option) => `/fresh ${option.id} ${option.argumentHint}`)
|
|
378
|
+
].join("\n"));
|
|
407
379
|
return;
|
|
408
380
|
}
|
|
409
|
-
const
|
|
410
|
-
const
|
|
411
|
-
|
|
412
|
-
: [action, rest].filter(Boolean).join(" ");
|
|
381
|
+
const resolved = resolveWorkflowId(action);
|
|
382
|
+
const workflow = resolved ?? "task";
|
|
383
|
+
const request = resolved ? rest : [action, rest].filter(Boolean).join(" ");
|
|
413
384
|
await startFreshWorkflow(workflow, request, ctx);
|
|
414
385
|
}
|
|
415
386
|
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
function normalizeLanguageSignal(text: string): string {
|
|
2
|
+
// Preserve the Vietnamese progressive phrase before removing tone marks.
|
|
3
|
+
// Without this, both "đang làm" (still working) and "đáng làm" (worth doing)
|
|
4
|
+
// collapse to `dang lam`, so a perfectly final heading such as
|
|
5
|
+
// "Các ứng dụng đáng làm" is misclassified as an incomplete handoff.
|
|
6
|
+
const progressive = text.normalize("NFC").toLowerCase().replace(/đang\s+làm/gu, " piagent_in_progress ");
|
|
7
|
+
return progressive
|
|
8
|
+
.normalize("NFKD")
|
|
9
|
+
.replace(/\p{M}/gu, "")
|
|
10
|
+
.replaceAll("đ", "d");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function looksLikeIncompleteHandoff(text: string): boolean {
|
|
14
|
+
const normalized = normalizeLanguageSignal(text);
|
|
15
|
+
return /\b(?:not done|not complete|not finished|still working|blocked|cannot complete|unable to complete|need clarification|tests? (?:fail|failed|failing)|verification (?:fail|failed|failing)|chua xong|chua hoan tat|chua hoan thanh|piagent_in_progress|(?:van|piagent|agent|em|toi|minh|chung toi) dang (?:lam|xu ly)|bi chan|can lam them|test (?:loi|fail))\b/.test(normalized);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function looksLikeCompletionClaim(text: string): boolean {
|
|
19
|
+
const normalized = normalizeLanguageSignal(text);
|
|
20
|
+
if (!normalized.trim() || normalized.includes("[piagent completion gate:")) return false;
|
|
21
|
+
if (looksLikeIncompleteHandoff(text)) return false;
|
|
22
|
+
return /\b(?:done|completed|complete|finished|fixed|implemented|resolved|shipped|all tests pass(?:ed)?|tests? pass(?:ed)?|da xong|da sua|da fix|da hoan tat|da hoan thanh|da trien khai|test da pass|kiem tra da pass|ready\b[\s\S]{0,48}\b(?:test|review|use|ship)|san sang\b[\s\S]{0,48}\b(?:test|kiem tra|su dung))\b/.test(normalized);
|
|
23
|
+
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
2
2
|
|
|
3
|
+
export { looksLikeCompletionClaim, looksLikeIncompleteHandoff } from "./completion-signals.ts";
|
|
4
|
+
|
|
3
5
|
export function assistantMessageText(message: unknown): string {
|
|
4
6
|
if (!message || typeof message !== "object" || (message as { role?: unknown }).role !== "assistant") return "";
|
|
5
7
|
const content = (message as { content?: unknown }).content;
|
|
@@ -15,28 +17,10 @@ export function assistantMessageHasToolCall(message: unknown): boolean {
|
|
|
15
17
|
return Array.isArray(content) && content.some((item) => item && typeof item === "object" && (item as { type?: unknown }).type === "toolCall");
|
|
16
18
|
}
|
|
17
19
|
|
|
18
|
-
function
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
// "Các ứng dụng đáng làm" is misclassified as an incomplete handoff.
|
|
23
|
-
const progressive = text.normalize("NFC").toLowerCase().replace(/đang\s+làm/gu, " piagent_in_progress ");
|
|
24
|
-
return progressive
|
|
25
|
-
.normalize("NFKD")
|
|
26
|
-
.replace(/\p{M}/gu, "")
|
|
27
|
-
.replaceAll("đ", "d");
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export function looksLikeIncompleteHandoff(text: string): boolean {
|
|
31
|
-
const normalized = normalizeLanguageSignal(text);
|
|
32
|
-
return /\b(?:not done|not complete|not finished|still working|blocked|cannot complete|unable to complete|need clarification|tests? (?:fail|failed|failing)|verification (?:fail|failed|failing)|chua xong|chua hoan tat|chua hoan thanh|piagent_in_progress|(?:van|piagent|agent|em|toi|minh|chung toi) dang (?:lam|xu ly)|bi chan|can lam them|test (?:loi|fail))\b/.test(normalized);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export function looksLikeCompletionClaim(text: string): boolean {
|
|
36
|
-
const normalized = normalizeLanguageSignal(text);
|
|
37
|
-
if (!normalized.trim() || normalized.includes("[piagent completion gate:")) return false;
|
|
38
|
-
if (looksLikeIncompleteHandoff(text)) return false;
|
|
39
|
-
return /\b(?:done|completed|complete|finished|fixed|implemented|resolved|shipped|all tests pass(?:ed)?|tests? pass(?:ed)?|da xong|da sua|da fix|da hoan tat|da hoan thanh|da trien khai|test da pass|kiem tra da pass)\b/.test(normalized);
|
|
20
|
+
export function prependAssistantNotice<T extends { content?: unknown }>(message: T, notice: string) {
|
|
21
|
+
const content = Array.isArray(message.content) ? [{ type: "text" as const, text: notice }, ...message.content]
|
|
22
|
+
: [{ type: "text" as const, text: `${notice}${typeof message.content === "string" ? message.content : assistantMessageText(message)}` }];
|
|
23
|
+
return { ...message, content };
|
|
40
24
|
}
|
|
41
25
|
|
|
42
26
|
export function modelLabel(ctx: ExtensionContext): string {
|
|
@@ -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 {
|