@piagent/platform 1.6.0 → 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 +104 -0
- package/README.md +24 -15
- package/README.vi.md +36 -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 +27 -3
- package/benchmarks/production-v1/suite.json +5 -1
- 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 +16 -16
- package/docs/authority-manifest.md +1 -1
- package/docs/auto-delegation-policy.md +38 -73
- 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 +30 -35
- package/docs/context-engine.md +5 -3
- package/docs/context-window-policy.md +37 -1
- package/docs/distribution-standard.md +9 -9
- package/docs/en/architecture.md +26 -13
- package/docs/languages.json +4 -4
- package/docs/operator-manual-vietnamese.md +26 -46
- 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 +7 -0
- package/docs/quality-benchmark.md +299 -23
- 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/runtime-harness-standard.md +3 -3
- package/docs/security-threat-model.md +1 -1
- package/docs/subagent-orchestration-capabilities.md +19 -51
- package/docs/subagents-and-multiagent.md +21 -47
- package/docs/task-implementation-contract.md +3 -3
- package/docs/task-lifecycle-vietnamese.md +1 -1
- package/docs/team-onboarding.md +7 -7
- package/docs/third-party-neutrality.md +7 -0
- package/docs/usage-observability.md +1 -1
- package/docs/vi/architecture.md +26 -13
- package/docs-site/architecture.html +1 -1
- package/docs-site/benchmark.html +89 -95
- package/docs-site/commands.html +1 -1
- package/docs-site/content/benchmark.html +88 -94
- package/docs-site/content/en/benchmark.html +134 -90
- package/docs-site/content/en/index.html +19 -19
- package/docs-site/content/en/runtime.html +5 -5
- package/docs-site/content/en/whats-new.html +23 -1
- package/docs-site/content/en/workflows.html +2 -2
- package/docs-site/content/index.html +19 -19
- package/docs-site/content/runtime.html +6 -6
- package/docs-site/content/whats-new.html +23 -1
- package/docs-site/content/workflows.html +2 -2
- package/docs-site/context-engine.html +1 -1
- package/docs-site/en/architecture.html +1 -1
- package/docs-site/en/benchmark.html +135 -91
- package/docs-site/en/commands.html +1 -1
- package/docs-site/en/context-engine.html +1 -1
- package/docs-site/en/index.html +20 -20
- 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 +6 -6
- 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 -2
- package/docs-site/en/workflows.html +3 -3
- package/docs-site/index.html +20 -20
- 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 +7 -7
- 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 -2
- package/docs-site/workflows.html +3 -3
- 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-assurance-evidence.invalid.json +1 -1
- package/evals/fixtures/benchmark-assurance-evidence.valid.json +1 -1
- 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/codex-relative-efficiency-v1.invalid.json +4 -0
- package/evals/fixtures/codex-relative-efficiency-v1.valid.json +94 -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/helper-request.invalid.json +1 -1
- package/evals/fixtures/helper-request.valid.json +1 -1
- package/evals/fixtures/host-contract-plan.invalid.json +42 -0
- package/evals/fixtures/host-contract-plan.valid.json +41 -0
- package/evals/fixtures/piagent-webui/subagent-tree-v1.valid.json +7 -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/fixtures/task-authority-snapshot.valid.json +4 -4
- package/evals/fs4-readiness-matrix.v1.json +2 -2
- 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 +10 -6
- package/evals/fs5-pilot-protocol.v1.json +3 -3
- package/evals/fs5-pilot-protocol.v2.json +8 -8
- package/evals/fs5-pilot-protocol.v3.json +8 -8
- package/evals/fs5-pilot-protocol.v4.json +7 -7
- package/evals/fs5-pilot-protocol.v5.json +10 -8
- 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.v1.json +1 -1
- package/evals/private-holdout-v1/public-exposure.v2.json +273 -0
- package/evals/runtime-conformance-v1/README.md +43 -0
- package/evals/runtime-conformance-v1/evaluate-paid-canary.mjs +198 -0
- package/evals/runtime-conformance-v1/lane.json +57 -0
- package/evals/runtime-conformance-v1/paid-canary.json +31 -0
- package/evals/runtime-conformance-v1/runner.mjs +456 -0
- package/package.json +9 -4
- package/packages/piagent-core/README.md +15 -6
- 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 +699 -0
- 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 +111 -110
- 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 +67 -52
- 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 +70 -7
- 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 +462 -0
- 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 +343 -8
- package/packages/piagent-core/benchmark/benchmark-release-claim-controls.js +132 -0
- package/packages/piagent-core/benchmark/benchmark-report.js +94 -5
- 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-causal.js +244 -0
- 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 +246 -33
- 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 +232 -4
- package/packages/piagent-core/benchmark/benchmark-summary-support.js +33 -1
- 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 +410 -37
- 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 +6 -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 +1000 -0
- 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 +208 -180
- 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 +12 -17
- package/packages/piagent-core/extensions/context-index-policy.js +4 -0
- package/packages/piagent-core/extensions/context-query-paths.js +57 -0
- package/packages/piagent-core/extensions/criterion-context-pack.js +109 -4
- package/packages/piagent-core/extensions/criterion-graph.js +4 -1
- package/packages/piagent-core/extensions/failure-types.ts +2 -2
- package/packages/piagent-core/extensions/fallback-base-policy.ts +101 -0
- package/packages/piagent-core/extensions/guard-types.ts +9 -1
- package/packages/piagent-core/extensions/piagent-guard.ts +374 -364
- 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-lifecycle.js +32 -0
- package/packages/piagent-core/extensions/task-runtime-audit.js +8 -2
- package/packages/piagent-core/extensions/task-state.js +140 -43
- 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 +109 -20
- package/packages/piagent-core/extensions/workflow-catalog.ts +98 -0
- package/packages/piagent-core/extensions/workspace-evidence-roots.js +52 -16
- 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 +43 -2
- package/packages/piagent-core/policy/authority-manifest.v1.json +3 -3
- package/packages/piagent-core/prompts/be-to-fe.md +2 -8
- package/packages/piagent-core/prompts/plan.md +1 -1
- package/packages/piagent-core/prompts/platform-improve.md +2 -6
- package/packages/piagent-core/prompts/review.md +2 -7
- package/packages/piagent-core/prompts/scout.md +1 -1
- package/packages/piagent-core/prompts/task.md +4 -3
- 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 +83 -89
- package/packages/piagent-core/runtime/hooks/input-hook.ts +98 -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 +150 -19
- package/packages/piagent-core/runtime/hooks/tool-result-hook.ts +111 -92
- 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/hooks/tool-result-value-helpers.ts +66 -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/bounded-emission-guard.ts +286 -0
- package/packages/piagent-core/runtime/inspection/runtime-event-store.ts +37 -7
- 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/task-subagent-tree.ts +27 -4
- package/packages/piagent-core/runtime/inspection/tool-failure-classification.ts +69 -11
- package/packages/piagent-core/runtime/inspection/webui-snapshot.ts +104 -22
- 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/orchestration/helper-lifecycle.ts +16 -12
- package/packages/piagent-core/runtime/orchestration/minimal-delegation-policy.ts +71 -0
- package/packages/piagent-core/runtime/orchestration/owned-work-budget.ts +28 -20
- package/packages/piagent-core/runtime/orchestration/role-policy.ts +27 -9
- package/packages/piagent-core/runtime/orchestration/subagent-tool-policy.ts +329 -0
- package/packages/piagent-core/runtime/policy/block-remedy.ts +0 -4
- 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 +15 -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/edit-freshness-guard.ts +102 -0
- package/packages/piagent-core/runtime/quality/exact-output-contract.ts +20 -10
- package/packages/piagent-core/runtime/quality/performance-assurance.ts +3 -3
- 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 +12 -3
- package/packages/piagent-core/runtime/recovery/diagnostic-delivery.ts +61 -0
- package/packages/piagent-core/runtime/recovery/handoff-projection.ts +196 -58
- 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/pristine-task-policy-refresh.ts +91 -0
- package/packages/piagent-core/runtime/recovery/recovery-policy.ts +31 -40
- package/packages/piagent-core/runtime/recovery/resume-state.ts +120 -19
- package/packages/piagent-core/runtime/recovery/semantic-repair-handshake.ts +7 -13
- package/packages/piagent-core/runtime/recovery/task-evidence-coverage-refresh.ts +217 -0
- package/packages/piagent-core/runtime/registration/activity-inspector-command.ts +2 -1
- package/packages/piagent-core/runtime/registration/context-commands.ts +28 -10
- package/packages/piagent-core/runtime/registration/knowledge-tools.ts +9 -5
- package/packages/piagent-core/runtime/registration/operator-catalogs.ts +4 -9
- package/packages/piagent-core/runtime/registration/operator-request-intake.ts +49 -0
- package/packages/piagent-core/runtime/registration/policy-tools.ts +8 -6
- package/packages/piagent-core/runtime/registration/session-commands.ts +10 -8
- package/packages/piagent-core/runtime/registration/session-wait-tool.ts +54 -0
- package/packages/piagent-core/runtime/registration/task-completion-tools.ts +39 -20
- package/packages/piagent-core/runtime/registration/task-evidence-tools.ts +21 -12
- package/packages/piagent-core/runtime/registration/task-start-conditional-mutation.ts +45 -0
- package/packages/piagent-core/runtime/registration/task-start-guidance.ts +24 -15
- package/packages/piagent-core/runtime/registration/task-start-manifest.ts +54 -0
- package/packages/piagent-core/runtime/registration/task-start-tool.ts +79 -79
- package/packages/piagent-core/runtime/registration/workflow-commands.ts +64 -93
- package/packages/piagent-core/runtime/runtime-limits.ts +16 -2
- package/packages/piagent-core/runtime/session/adaptive-context-analysis.ts +461 -0
- package/packages/piagent-core/runtime/session/adaptive-context-governor.ts +464 -0
- package/packages/piagent-core/runtime/session/adaptive-context-ledger.ts +265 -0
- package/packages/piagent-core/runtime/session/completion-signals.ts +23 -0
- package/packages/piagent-core/runtime/session/message-signals.ts +6 -18
- package/packages/piagent-core/runtime/session/operator-request-carry.ts +44 -0
- package/packages/piagent-core/runtime/session/retrieval-evidence-runtime.ts +188 -0
- package/packages/piagent-core/runtime/session/runtime-state.ts +37 -39
- package/packages/piagent-core/runtime/session/source-checkout-read-grants.ts +35 -0
- package/packages/piagent-core/runtime/session/system-prompt.ts +76 -14
- package/packages/piagent-core/runtime/session/task-contract-presentation.ts +39 -0
- 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 +10 -9
- package/packages/piagent-core/runtime/tools/session-wait.ts +42 -0
- package/packages/piagent-core/runtime/tools/tool-groups.ts +22 -5
- 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 +101 -0
- 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 +201 -0
- package/packages/piagent-core/runtime/workflows/task-followup-policy.ts +163 -0
- package/packages/piagent-core/runtime/workflows/task-intake.ts +276 -169
- 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-core/subagents/piagent-oracle.md +5 -3
- package/packages/piagent-core/subagents/piagent-planner.md +6 -4
- package/packages/piagent-core/subagents/piagent-reviewer.md +5 -3
- package/packages/piagent-core/subagents/piagent-scout.md +4 -2
- package/packages/piagent-core/subagents/piagent-worker.md +6 -4
- package/packages/piagent-webui/dist/client/assets/{MarkdownMessage-CxeZqTte.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 +13 -3
- package/packages/piagent-webui/extension/review-controller.ts +29 -6
- package/packages/piagent-webui/extension/same-session-bridge.ts +7 -8
- package/packages/piagent-webui/extension/session-stream-adapter.ts +88 -16
- 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 +170 -32
- 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-lifecycle.ts +237 -0
- package/packages/piagent-webui/gateway/session-operation-retry-control.ts +38 -0
- package/packages/piagent-webui/gateway/session-operation-settlement.ts +28 -0
- package/packages/piagent-webui/gateway/session-operation-watchdog.ts +9 -2
- 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 +118 -117
- package/packages/piagent-webui/ownership/session-lease-store.ts +5 -2
- package/packages/piagent-webui/server/core-inspection-provider.ts +75 -15
- 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 +150 -11
- 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/codex-relative-efficiency-v1.schema.json +155 -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 +46 -5
- 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/subagent-tree-v1.schema.json +11 -1
- package/schemas/piagent-webui/transcript-v1.schema.json +2 -1
- package/schemas/project-profile.schema.json +1 -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 +45 -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 +224 -387
- package/scripts/benchmark-runner-finalization.mjs +144 -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-subagents.sh +42 -34
- package/scripts/fs4-readiness-evaluation.mjs +7 -1
- package/scripts/helper-evaluation.mjs +1 -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/team-doctor.sh +1 -1
- package/scripts/typescript-loader.mjs +135 -1
- package/scripts/update-global.mjs +6 -7
- package/scripts/verify-local.sh +41 -55
- package/scripts/verify-release-identity.mjs +5 -3
- package/packages/piagent-webui/dist/client/assets/index-DynIMe8I.js +0 -176
|
@@ -1,19 +1,97 @@
|
|
|
1
1
|
import { classifyContextTask } from "../../extensions/context-engine.js";
|
|
2
|
-
import {
|
|
2
|
+
import { acceptanceContractConjuncts } from "../../extensions/acceptance-contract-conjunction.js";
|
|
3
|
+
import { matchesProtectedPath, normalizePathCandidate } from "../../extensions/policy-core.js";
|
|
3
4
|
import type { ReviewLens } from "../../extensions/guard-types.js";
|
|
4
|
-
import { LONG_INPUT_CHARS
|
|
5
|
+
import { LONG_INPUT_CHARS } from "../runtime-limits.ts";
|
|
6
|
+
import { classifyConditionalRepairIntent } from "./task-repair-intent.ts";
|
|
7
|
+
import {
|
|
8
|
+
foldChangeIntent,
|
|
9
|
+
hasChangeIntent,
|
|
10
|
+
isExplicitChangeRequest,
|
|
11
|
+
isLightweightNonAuthorizingChangeLanguage,
|
|
12
|
+
isNonAuthorizingChangeLanguage
|
|
13
|
+
} from "./change-clarification.ts";
|
|
14
|
+
import {
|
|
15
|
+
completedFollowupScope,
|
|
16
|
+
hasConditionalRepairIntent,
|
|
17
|
+
type PriorTaskScopeEvidence
|
|
18
|
+
} from "./task-followup-policy.ts";
|
|
19
|
+
export { boundedRuntimeIntakeMessage } from "./runtime-intake-compaction.ts";
|
|
20
|
+
export { resolveTaskScopePatterns } from "./task-scope-resolution.ts";
|
|
21
|
+
export type { TaskScopeResolution } from "./task-scope-resolution.ts";
|
|
5
22
|
|
|
6
23
|
const AUTO_INTAKE_MAX_PROMPT_CHARS = LONG_INPUT_CHARS;
|
|
7
24
|
const AUTO_TASK_SUMMARY_CHARS = 700;
|
|
8
25
|
const AUTO_ACCEPTANCE_CRITERION_CHARS = 600;
|
|
9
26
|
const AUTO_ACCEPTANCE_CRITERIA_MAX = 12;
|
|
10
|
-
const AUTO_INTAKE_CHANGE_INTENT = /\b(?:add|build|change|correct|create|fix|implement|modify|refactor|remove|rename|repair|replace|update|write|sua|them|doi|cap nhat|xoa|tao)\b/i;
|
|
11
27
|
const AUTO_INTAKE_READ_ONLY_LEAD = /^\s*\/?(?:analy[sz]e|audit|check|discuss|explain|inspect|plan|research|review|scout|summari[sz]e|why|how|can\s+(?:you|we)|kiem tra|nghien cuu|giai thich|danh gia)\b/i;
|
|
12
28
|
const AUTO_INTAKE_MANUAL_RISK = /\b(?:credential|database|deploy|destructive|encryption|external provider|payment|permission|production|publish|secret|token rotation)\b/i;
|
|
13
29
|
const AUTO_READ_ONLY_INTENT = /\b(?:analy[sz]e|audit|check|diagnos(?:e|is)|explain|inspect|investigate|plan|research|review|scout|summari[sz]e|triage|kiem tra|nghien cuu|giai thich|danh gia)\b/i;
|
|
14
|
-
const
|
|
30
|
+
const AUTO_STANDALONE_NO_MUTATION = /\bwithout\s+(?:editing|changing|modifying|mutating|touching|writing)(?=\s*(?:[.!?]|$))/i;
|
|
31
|
+
// Candidate wording is separated from the following qualifier. This keeps a
|
|
32
|
+
// durable zero-delta instruction distinct from local path authority and from a
|
|
33
|
+
// temporary "inspect first, edit later" instruction.
|
|
34
|
+
const AUTO_NO_MUTATION_CANDIDATES = [
|
|
35
|
+
AUTO_STANDALONE_NO_MUTATION,
|
|
36
|
+
/\b(?:do not|don't|must not|never)\s+(?:edit|change|modify|mutate|touch|write(?:\s+to)?)(?:\s+(?:or|and)\s+create)?\s+(?:(?:any|all|the|this|entire)\s+)?(?:files?|code|source(?:\s+files?)?|project(?:\s+files?)?|workspace|repo(?:sitory)?|anything)\b/i,
|
|
37
|
+
/\b(?:do not|don't|must not|never)\s+create\s+(?:or|and)\s+(?:edit|change|modify|mutate|touch|write(?:\s+to)?)\s+(?:(?:any|all|the|this|entire)\s+)?(?:files?|code|source(?:\s+files?)?|project(?:\s+files?)?|workspace|repo(?:sitory)?|anything)\b/i,
|
|
38
|
+
/\b(?:do not|don't|must not|never)\s+make\s+(?:any\s+)?(?:changes?|edits?|mutations?)(?:\s+to\s+(?:(?:any|all|the)\s+)?(?:files?|code|source(?:\s+files?)?|project(?:\s+files?)?|workspace|repo(?:sitory)?))?\b/i,
|
|
39
|
+
/\b(?:make\s+)?no\s+(?:(?:code|source|project|file|workspace|repo(?:sitory)?)\s+)?(?:changes?|edits?|mutations?)(?:\s+to\s+(?:(?:any|all|the)\s+)?(?:files?|code|source(?:\s+files?)?|project(?:\s+files?)?|workspace|repo(?:sitory)?))?\b/i,
|
|
40
|
+
/\bno\s+(?:project|source)\s+files?\s+(?:are\s+)?(?:changed|edited|modified|mutated)\b/i,
|
|
41
|
+
/\bwithout\s+(?:editing|changing|modifying|mutating|touching|writing(?:\s+to)?)\s+(?:(?:any|all|the)\s+)?(?:files?|code|source(?:\s+files?)?|project(?:\s+files?)?|workspace|repo(?:sitory)?)\b/i,
|
|
42
|
+
/\bleave\s+(?:(?:all|the|this|entire)\s+)?(?:files?|code|source|project|workspace|repo(?:sitory)?)\s+(?:fully\s+)?(?:unchanged|unmodified)\b/i,
|
|
43
|
+
/\b(?:zero\s+task\s+delta|mutation[- ]free)\b/i,
|
|
44
|
+
/\bkh(?:o|ô)ng\s+(?:s(?:u|ử)a|edit|thay\s+(?:d|đ)(?:o|ổ)i)\s+(?:b(?:a|ấ)t\s+k(?:y|ỳ)\s+)?(?:file|source|project|workspace|repo)\b/i
|
|
45
|
+
];
|
|
46
|
+
const AUTO_BOUNDARY_TAIL_PREFIX = "^(?:\\s|[,.;:!?()\\[\\]{}—–-])*(?:but\\s+)?";
|
|
47
|
+
const AUTO_LOCAL_BOUNDARY_TAIL = new RegExp(`${AUTO_BOUNDARY_TAIL_PREFIX}(?:outside|beyond|under|within|inside|in|on|for(?!\\s+now\\b)|except(?:\\s+for)?|other\\s+than|apart\\s+from|to\\b|only\\s+(?:(?:edit|change|modify|mutate|touch|write)\\b|(?:in|under|within|outside)\\b|(?:[a-z0-9_.@*?-]+\\/))|ngo(?:a|à)i\\b|tr(?:u|ừ)\\b)`, "i");
|
|
48
|
+
const AUTO_TEMPORARY_BOUNDARY_TAIL = new RegExp(`${AUTO_BOUNDARY_TAIL_PREFIX}(?:(?:not\\s+)?yet\\b|right\\s+now\\b|for\\s+now\\b|at\\s+(?:(?:this|the\\s+current)\\s+(?:step|stage|phase|time)|the\\s+moment)\\b|during\\s+(?:(?:this|the\\s+current)\\s+)?(?:step|stage|phase|planning)\\b|while\\b|unless\\b|until\\b|before\\b|hi(?:e|ệ)n\\s+t(?:a|ạ)i\\b|b(?:a|â)y\\s+gi(?:o|ờ)\\b)`, "i");
|
|
49
|
+
const AUTO_GLOBAL_NO_ACCESS_BOUNDARY = /\b(?:do not|don't|must not|never)\s+(?:read|execute|write|delete|restore|hash|echo|compare)(?:\s*,\s*(?:read|execute|write|delete|restore|hash|echo|compare)){1,6}(?:\s*,?\s*or\s+(?:read|execute|write|delete|restore|hash|echo|compare))?\s+(?:any\s+|the\s+|this\s+)?(?:project|workspace|repository|repo|audit|environment)(?:\s+or\s+(?:project|workspace|repository|repo|audit|environment))?\s+(?:content|data|files?|records?|history)\b/i;
|
|
50
|
+
const AUTO_PROTECTED_ACCESS_DENIAL = /\b(?:do not|don't|must not|never)\s+(?:inspect|read|open|access|copy|print|echo|reveal|expose|export|disclose)\s+(?:(?:the|a|an|any|all|this|that|complete|raw)\s+){0,3}(?:protected(?:[- ](?:credentials?|files?|data|material|secrets?|tokens?))?|credentials?|secrets?|tokens?|passwords?|api[- ]?keys?|auth(?:entication)?(?:\s+(?:data|material|values?|tokens?))?)\b/i;
|
|
51
|
+
// Some refusal prompts establish the protected object in the preceding
|
|
52
|
+
// boundary sentence and then refer to it only as "the file". Admit that
|
|
53
|
+
// grammar only when both halves are explicit; a generic file denial alone is
|
|
54
|
+
// not protected-material authority.
|
|
55
|
+
const AUTO_PROTECTED_MATERIAL_BOUNDARY_CONTEXT = /\bthis\s+request\s+crosses\s+the\s+protected[- ]material\s+boundary\b/i;
|
|
56
|
+
const AUTO_GENERIC_FILE_ACCESS_DENIAL = /\b(?:do not|don't|must not|never)\s+(?:inspect|read|open|access)\s+(?:(?:the|this|that|requested|referenced|target(?:ed)?)\s+){0,2}(?:files?|paths?)\b/i;
|
|
57
|
+
const AUTO_DESTRUCTIVE_HISTORY_BOUNDARY_CONTEXT = /\bthis\s+request\s+crosses\s+the\s+destructive[- ]history\s+boundary\b/i;
|
|
58
|
+
const AUTO_AUDIT_LEDGER_ACCESS_DENIAL = /\b(?:do not|don't|must not|never)\s+(?:read|inspect|open|access)(?:\s*,\s*(?:truncate|delete|move|overwrite)){1,4}(?:\s*,?\s*(?:or|and)\s+(?:truncate|delete|move|overwrite))?\s+(?:the|this)\s+audit\s+(?:ledger|history|log)\b/i;
|
|
59
|
+
const AUTO_REFUSAL_INTENT = /\b(?:refuse|decline|reject)\b/i;
|
|
60
|
+
const AUTO_REFUSAL_NEGATION = /\b(?:do not|don't|must not|never)\s+(?:refuse|decline|reject)\b/i;
|
|
61
|
+
const AUTO_GLOBAL_READ_ONLY_PATTERNS = [
|
|
62
|
+
/^\s*\/?read-only\s*(?:$|[.!?:;—–-])/im,
|
|
63
|
+
/^\s*\/?read-only\s+(?:task|run|session)\s*(?:$|[.!?:;—–-]|\b(?:to|for)\b)/im,
|
|
64
|
+
/^\s*\/?read-only\s+(?:assessment|review)\s*(?:$|[.!?:;—–-]|\b(?:of|for)\b)/im,
|
|
65
|
+
/\b(?:as|in)\s+(?:a\s+)?read-only\s+(?:mode|task|run|session|assessment|review)\b/i,
|
|
66
|
+
/\b(?:use|perform|conduct|run)\s+(?:a\s+)?read-only\s+(?:task|run|assessment|review)\b/i,
|
|
67
|
+
/\b(?:keep\s+)?(?:this\s+|the\s+)?(?:task|run|session|workspace|project|repo|repository)\s+(?:(?:is|must|should)\s+(?:be\s+|remain\s+)?|remain\s+)?read-only\b/i,
|
|
68
|
+
// A task-wide refusal may forbid every material operation without using the
|
|
69
|
+
// literal phrase "read-only" or naming a file mutation. Keep this narrow:
|
|
70
|
+
// require a compound operation list and a global project/audit data object.
|
|
71
|
+
AUTO_GLOBAL_NO_ACCESS_BOUNDARY
|
|
72
|
+
];
|
|
15
73
|
const AUTO_EXECUTION_INTENT = /(?:\b(?:run|execute|execution|rerun|re-run|chay)\b.{0,80}\b(?:tests?|build|checks?|gates?|lint|typecheck|package|pack|verify|verification)\b|\b(?:npm|pnpm|yarn|bun)\s+(?:test|pack|run\s+(?:build|check|lint|typecheck|verify))\b)/i;
|
|
16
74
|
|
|
75
|
+
function explicitSourceWorkflow(text: string): boolean {
|
|
76
|
+
const signal = classifyContextTask(text);
|
|
77
|
+
return Boolean(signal.workflowId && signal.changeMode === "source-change");
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** A question about whether to mutate is conversational context, not mutation authority. */
|
|
81
|
+
export function isNonAuthorizingChangeClarification(prompt: string): boolean {
|
|
82
|
+
const text = String(prompt ?? "").trim();
|
|
83
|
+
if (!text) return false;
|
|
84
|
+
if (explicitSourceWorkflow(text)) return false;
|
|
85
|
+
return isNonAuthorizingChangeLanguage(text);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Only a short yes/no-or-choice continuation may bypass repository retrieval. */
|
|
89
|
+
export function isLightweightNonAuthorizingChangeContinuation(prompt: string): boolean {
|
|
90
|
+
const text = String(prompt ?? "").trim();
|
|
91
|
+
if (!text || explicitSourceWorkflow(text)) return false;
|
|
92
|
+
return isLightweightNonAuthorizingChangeLanguage(text);
|
|
93
|
+
}
|
|
94
|
+
|
|
17
95
|
export const AUTO_INTAKE_SNAPSHOT_PATTERNS = [
|
|
18
96
|
"src/**", "app/**", "lib/**", "packages/**", "test/**", "tests/**", "spec/**", "__tests__/**"
|
|
19
97
|
];
|
|
@@ -22,6 +100,59 @@ function uniqueStrings(values: string[]): string[] {
|
|
|
22
100
|
return [...new Set(values)];
|
|
23
101
|
}
|
|
24
102
|
|
|
103
|
+
// Bare "without editing." is a directive only in prose, not quoted UI text,
|
|
104
|
+
// an example block, or repository data quoted by the operator.
|
|
105
|
+
function boundaryDirectiveProse(text: string): string {
|
|
106
|
+
let fence: string | undefined;
|
|
107
|
+
return text.split("\n").map(line => {
|
|
108
|
+
const marker = line.match(/^\s*(`{3,}|~{3,})/);
|
|
109
|
+
if (marker) {
|
|
110
|
+
if (!fence) fence = marker[1];
|
|
111
|
+
else if (marker[1][0] === fence[0] && marker[1].length >= fence.length) fence = undefined;
|
|
112
|
+
return "<quoted-content>";
|
|
113
|
+
}
|
|
114
|
+
if (fence || /^\s*>/.test(line)) return "<quoted-content>";
|
|
115
|
+
return line.replace(/`[^`\n]*`|"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|“[^”]*”|‘[^’]*’/g, "<quoted-content>");
|
|
116
|
+
}).join("\n");
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function noMutationBoundarySignals(text: string): { taskWide: boolean; temporary: boolean } {
|
|
120
|
+
let temporary = false;
|
|
121
|
+
for (const pattern of AUTO_NO_MUTATION_CANDIDATES) {
|
|
122
|
+
const candidateText = pattern === AUTO_STANDALONE_NO_MUTATION ? boundaryDirectiveProse(text) : text;
|
|
123
|
+
const matcher = new RegExp(pattern.source, `${pattern.flags}g`);
|
|
124
|
+
for (const match of candidateText.matchAll(matcher)) {
|
|
125
|
+
const tail = candidateText.slice((match.index ?? 0) + match[0].length, (match.index ?? 0) + match[0].length + 160);
|
|
126
|
+
if (AUTO_LOCAL_BOUNDARY_TAIL.test(tail)) continue;
|
|
127
|
+
if (AUTO_TEMPORARY_BOUNDARY_TAIL.test(tail)) {
|
|
128
|
+
temporary = true;
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
return { taskWide: true, temporary };
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return { taskWide: false, temporary };
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function hasGlobalReadOnlyBoundary(text: string): boolean {
|
|
138
|
+
return AUTO_GLOBAL_READ_ONLY_PATTERNS.some((pattern) => pattern.test(text));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function hasGlobalNoAccessBoundary(text: string): boolean {
|
|
142
|
+
return AUTO_GLOBAL_NO_ACCESS_BOUNDARY.test(text);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export function hasProtectedRefusalBoundary(text: string): boolean {
|
|
146
|
+
const accessDenied = AUTO_PROTECTED_ACCESS_DENIAL.test(text)
|
|
147
|
+
|| (AUTO_PROTECTED_MATERIAL_BOUNDARY_CONTEXT.test(text) && AUTO_GENERIC_FILE_ACCESS_DENIAL.test(text));
|
|
148
|
+
const directive = boundaryDirectiveProse(text);
|
|
149
|
+
return AUTO_REFUSAL_INTENT.test(text)
|
|
150
|
+
&& !AUTO_REFUSAL_NEGATION.test(text)
|
|
151
|
+
&& ((accessDenied && noMutationBoundarySignals(text).taskWide)
|
|
152
|
+
|| (AUTO_REFUSAL_INTENT.test(directive) && AUTO_DESTRUCTIVE_HISTORY_BOUNDARY_CONTEXT.test(directive)
|
|
153
|
+
&& AUTO_AUDIT_LEDGER_ACCESS_DENIAL.test(directive)));
|
|
154
|
+
}
|
|
155
|
+
|
|
25
156
|
const PLAUSIBLE_SCOPE_ROOT = /^(?:\.github|app|apps|bin|config|docs|examples|lib|logs|packages|pages|public|scripts|spec|src|test|tests|vendor|__tests__)(?:\/|$)/i;
|
|
26
157
|
const PLAUSIBLE_SCOPE_FILE = /(?:^|\/)(?:\.[^/]+|[^/]+\.(?:bash|c|cc|cjs|cpp|css|csv|env|go|graphql|gql|h|hpp|html|java|js|json|jsx|kt|kts|md|mdx|mjs|php|proto|py|rb|rs|scss|sh|sql|svg|swift|toml|ts|tsx|txt|xml|yaml|yml))$/i;
|
|
27
158
|
|
|
@@ -34,28 +165,40 @@ function plausibleTaskScopePath(value: string): boolean {
|
|
|
34
165
|
}
|
|
35
166
|
|
|
36
167
|
export function automaticTaskSummary(prompt: string): string {
|
|
37
|
-
return String(prompt ?? "").replace(/\s+/g, " ").trim().slice(0, AUTO_TASK_SUMMARY_CHARS);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export function boundedRuntimeIntakeMessage(value: string): string {
|
|
41
|
-
const text = String(value ?? "").replace(/\r\n/g, "\n");
|
|
42
|
-
if (text.length <= RUNTIME_INTAKE_MESSAGE_MAX_CHARS) return text;
|
|
43
|
-
const marker = "\n\n[Piagent intake guidance compacted; the complete operator request and durable Task Contract remain authoritative.]\n\n";
|
|
44
|
-
const available = RUNTIME_INTAKE_MESSAGE_MAX_CHARS - marker.length;
|
|
45
|
-
const head = Math.floor(available * 0.58);
|
|
46
|
-
return `${text.slice(0, head).trimEnd()}${marker}${text.slice(-(available - head)).trimStart()}`;
|
|
47
|
-
}
|
|
168
|
+
return String(prompt ?? "").replace(/\s+/g, " ").trim().slice(0, AUTO_TASK_SUMMARY_CHARS); }
|
|
48
169
|
|
|
49
170
|
export function automaticTaskIntakeEligible(prompt: string, readProtectedPaths: string[]): boolean {
|
|
50
171
|
const text = String(prompt ?? "").trim();
|
|
51
172
|
if (!text || text.length > AUTO_INTAKE_MAX_PROMPT_CHARS) return false;
|
|
173
|
+
const folded = foldChangeIntent(text);
|
|
174
|
+
const explicitChange = isExplicitChangeRequest(folded);
|
|
175
|
+
if (isNonAuthorizingChangeClarification(text)) return false;
|
|
176
|
+
const noMutationBoundary = noMutationBoundarySignals(text);
|
|
177
|
+
// Verification-only execution keeps the source-task lane so the configured
|
|
178
|
+
// verifier is available, with mutation forbidden by its separate policy.
|
|
179
|
+
// For every non-execution task, a durable zero-delta boundary wins over
|
|
180
|
+
// incidental mutation verbs inside the prohibition itself.
|
|
181
|
+
if (noMutationBoundary.taskWide && !AUTO_EXECUTION_INTENT.test(folded)) return false;
|
|
182
|
+
if (noMutationBoundary.temporary && !noMutationBoundary.taskWide) return false;
|
|
183
|
+
if (hasGlobalReadOnlyBoundary(text)) return false;
|
|
52
184
|
const signal = classifyContextTask(text);
|
|
53
|
-
|
|
185
|
+
const conditionalRepair = hasConditionalRepairIntent(text);
|
|
186
|
+
// Explicit non-execution workflows own their operation semantics; an implementation verb inside
|
|
187
|
+
// /plan, /discuss, or a git workflow must not create a source-change task early.
|
|
188
|
+
// A review that explicitly makes repair conditional on observed evidence is
|
|
189
|
+
// different: it needs verifier authority and may legitimately finish with
|
|
190
|
+
// either zero delta or a scoped repair.
|
|
191
|
+
if (signal.workflow !== "task" && !(signal.workflow === "review" && conditionalRepair)) return false;
|
|
192
|
+
if (AUTO_EXECUTION_INTENT.test(folded)) {
|
|
193
|
+
if (/\bpiagent_task_start\b/i.test(text)) return false;
|
|
194
|
+
return !signal.paths.some((candidate) => matchesProtectedPath(candidate, readProtectedPaths));
|
|
195
|
+
}
|
|
196
|
+
if (conditionalRepair) {
|
|
54
197
|
if (/\bpiagent_task_start\b/i.test(text)) return false;
|
|
55
198
|
return !signal.paths.some((candidate) => matchesProtectedPath(candidate, readProtectedPaths));
|
|
56
199
|
}
|
|
57
|
-
if (
|
|
58
|
-
if (AUTO_INTAKE_READ_ONLY_LEAD.test(
|
|
200
|
+
if (!hasChangeIntent(folded) && !explicitChange) return false;
|
|
201
|
+
if ((AUTO_INTAKE_READ_ONLY_LEAD.test(folded) && !explicitChange) || AUTO_INTAKE_MANUAL_RISK.test(folded)) return false;
|
|
59
202
|
if (/\bpiagent_task_start\b/i.test(text)) return false;
|
|
60
203
|
return !signal.paths.some((candidate) => matchesProtectedPath(candidate, readProtectedPaths));
|
|
61
204
|
}
|
|
@@ -63,54 +206,59 @@ export function automaticTaskIntakeEligible(prompt: string, readProtectedPaths:
|
|
|
63
206
|
export function automaticReadOnlyTaskIntakeEligible(prompt: string, readProtectedPaths: string[]): boolean {
|
|
64
207
|
const text = String(prompt ?? "").trim();
|
|
65
208
|
if (!text || text.length > AUTO_INTAKE_MAX_PROMPT_CHARS) return false;
|
|
209
|
+
const folded = foldChangeIntent(text);
|
|
210
|
+
if (isNonAuthorizingChangeClarification(text)) return false;
|
|
66
211
|
const signal = classifyContextTask(text);
|
|
67
|
-
if (
|
|
68
|
-
|
|
69
|
-
|
|
212
|
+
if (["usage", "permission", "context", "discuss", "plan", "release", "onboard"].includes(signal.workflow)) return false;
|
|
213
|
+
const protectedRefusalBoundary = hasProtectedRefusalBoundary(text);
|
|
214
|
+
const readOnlyBoundary = noMutationBoundarySignals(text).taskWide || hasGlobalReadOnlyBoundary(text) || protectedRefusalBoundary;
|
|
215
|
+
if (!AUTO_READ_ONLY_INTENT.test(folded) && !readOnlyBoundary) return false;
|
|
216
|
+
if (hasChangeIntent(folded) && !readOnlyBoundary) return false;
|
|
70
217
|
if (/\bpiagent_task_start\b/i.test(text)) return false;
|
|
71
|
-
|
|
218
|
+
const protectedTarget = signal.paths.some((candidate) => matchesProtectedPath(candidate, readProtectedPaths));
|
|
219
|
+
return !protectedTarget || hasGlobalNoAccessBoundary(text) || protectedRefusalBoundary;
|
|
72
220
|
}
|
|
73
221
|
|
|
74
222
|
export function automaticTaskIntakeMode(prompt: string, readProtectedPaths: string[]): "source-change" | "read-only" | undefined {
|
|
75
223
|
if (automaticTaskIntakeEligible(prompt, readProtectedPaths)) return "source-change";
|
|
76
|
-
|
|
77
|
-
return undefined;
|
|
224
|
+
return automaticReadOnlyTaskIntakeEligible(prompt, readProtectedPaths) ? "read-only" : undefined;
|
|
78
225
|
}
|
|
79
226
|
|
|
80
227
|
export function automaticTaskMutationPolicy(
|
|
81
228
|
prompt: string,
|
|
82
229
|
changeMode: "source-change" | "read-only"
|
|
83
|
-
): "required" | "forbidden" {
|
|
84
|
-
|
|
230
|
+
): "required" | "allowed" | "forbidden" {
|
|
231
|
+
const text = String(prompt ?? "");
|
|
232
|
+
// A feature can intentionally become read-only while the implementation
|
|
233
|
+
// still requires source changes. Only a task-wide boundary may suppress
|
|
234
|
+
// mutation; incidental domain wording such as "list/detail read-only" must
|
|
235
|
+
// never convert a delegated implementation into a zero-delta task.
|
|
236
|
+
if (changeMode === "read-only" || noMutationBoundarySignals(text).taskWide || hasGlobalReadOnlyBoundary(text)) {
|
|
237
|
+
return "forbidden";
|
|
238
|
+
}
|
|
239
|
+
return classifyConditionalRepairIntent(text) === "conditional-only" ? "allowed" : "required";
|
|
85
240
|
}
|
|
86
241
|
|
|
87
242
|
export function automaticTaskRiskLane(prompt: string): "tiny" | "normal" {
|
|
88
243
|
return classifyContextTask(prompt).lane === "tiny" ? "tiny" : "normal";
|
|
89
244
|
}
|
|
90
245
|
|
|
91
|
-
function splitAcceptanceCriterion(value: string): string[] {
|
|
246
|
+
function splitAcceptanceCriterion(value: string, grouped = false): string[] {
|
|
92
247
|
const normalized = value.replace(/^\s*(?:[-*+] |\d+[.)]\s+)/, "").replace(/\s+/g, " ").trim();
|
|
93
|
-
if (!normalized
|
|
94
|
-
const label = normalized.match(/^(\[[^\]\n]{1,40}\])\s+/)?.[1] ?? "";
|
|
95
|
-
|
|
248
|
+
if (!normalized) return [];
|
|
249
|
+
const label = grouped ? "" : normalized.match(/^(\[[^\]\n]{1,40}\])\s+/)?.[1] ?? "";
|
|
250
|
+
const body = label ? normalized.slice(label.length).trim() : normalized;
|
|
96
251
|
const prefix = label ? `${label} ` : "";
|
|
97
252
|
const available = AUTO_ACCEPTANCE_CRITERION_CHARS - prefix.length;
|
|
98
253
|
const fragments: string[] = [];
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
: clause && clause.index! + 1 >= Math.floor(available / 2)
|
|
107
|
-
? clause.index! + 1
|
|
108
|
-
: whitespace;
|
|
109
|
-
const cut = preferred > 0 ? preferred : available;
|
|
110
|
-
fragments.push(`${prefix}${remaining.slice(0, cut).trim()}`);
|
|
111
|
-
remaining = remaining.slice(cut).trim();
|
|
254
|
+
const units = acceptanceContractConjuncts(body, { preserveSeparators: true })
|
|
255
|
+
.flatMap((clause) => clause.split(/(?<=[.!?])\s+(?=(?:[`"'([{]|[\p{Lu}\p{N}]|(?:do|must|never|verify)\b))/u))
|
|
256
|
+
.filter((item) => item.trim());
|
|
257
|
+
for (const unit of units) {
|
|
258
|
+
const remaining = unit.trim();
|
|
259
|
+
if (remaining.length > available) throw acceptanceCriteriaOverflow();
|
|
260
|
+
if (remaining) fragments.push(`${prefix}${remaining}`);
|
|
112
261
|
}
|
|
113
|
-
if (remaining) fragments.push(`${prefix}${remaining}`);
|
|
114
262
|
return fragments;
|
|
115
263
|
}
|
|
116
264
|
|
|
@@ -122,76 +270,105 @@ function isPathOnlyCriterion(value: string): boolean {
|
|
|
122
270
|
return /^(?:[A-Za-z0-9_@.-]+\/)+[A-Za-z0-9_@.-]+$/.test(normalized);
|
|
123
271
|
}
|
|
124
272
|
|
|
125
|
-
function
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
273
|
+
function acceptanceCriteriaOverflow(): RangeError {
|
|
274
|
+
return new RangeError(`Automatic intake cannot retain every requirement within ${AUTO_ACCEPTANCE_CRITERIA_MAX} criteria of ${AUTO_ACCEPTANCE_CRITERION_CHARS} characters. No task was created by this intake. Use explicit bounded tasks without omitting requirements.`);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
function groupedAcceptanceCriteria(values: string[], limit: number): string[] {
|
|
278
|
+
// Repack the source text, not a ranked sample of its obligations. Keep generic
|
|
279
|
+
// verification/safety criteria separate so they cannot stand in for user clauses.
|
|
280
|
+
// Preserve clause boundaries as line breaks: receipts require independent
|
|
281
|
+
// evidence for the whole multiline criterion, including unpunctuated bullets.
|
|
282
|
+
const groups: string[] = [];
|
|
283
|
+
let current = "";
|
|
284
|
+
for (const value of values) {
|
|
285
|
+
if (current && current.length + 1 + value.length > AUTO_ACCEPTANCE_CRITERION_CHARS) {
|
|
286
|
+
groups.push(current);
|
|
287
|
+
current = "";
|
|
288
|
+
}
|
|
289
|
+
current = current ? `${current}\n${value}` : value;
|
|
290
|
+
}
|
|
291
|
+
if (current) groups.push(current);
|
|
292
|
+
if (groups.length > limit) throw acceptanceCriteriaOverflow();
|
|
293
|
+
return groups;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
function isStandaloneOpaqueMetadata(line: string, current: string): boolean {
|
|
297
|
+
// Preserve JSON, code, Markdown separators and punctuated exact tokens. A
|
|
298
|
+
// lone identifier-like token after a closed sentence is metadata/padding,
|
|
299
|
+
// not a criterion; the lossless operatorRequest remains the authority for it.
|
|
300
|
+
return /^[A-Za-z0-9_]+$/.test(line) && !/[.!?;:]$/.test(line)
|
|
301
|
+
&& (!current || /[.!?;:]$/.test(current));
|
|
132
302
|
}
|
|
133
303
|
|
|
134
|
-
function
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
const highSignal = /\b(?:do not|fail(?:s|ed)?(?:[-\s]+)closed|invalid|missing|must|never|reject(?:s|ed|ion)?|throws?|typeerror|without mutat(?:e|ing)|unchanged)\b/i;
|
|
138
|
-
const required = values.filter((criterion) => highSignal.test(criterion));
|
|
139
|
-
const selectedRequired = evenlySpacedCriteria(required, Math.min(limit, required.length));
|
|
140
|
-
const selected = new Set(selectedRequired);
|
|
141
|
-
const remaining = values.filter((criterion) => !selected.has(criterion));
|
|
142
|
-
for (const criterion of evenlySpacedCriteria(remaining, limit - selected.size)) selected.add(criterion);
|
|
143
|
-
return values.filter((criterion) => selected.has(criterion));
|
|
304
|
+
function isStandaloneAcceptanceLabel(value: string): boolean {
|
|
305
|
+
const normalized = value.trim();
|
|
306
|
+
return /^(?:acceptance criteria|behavior|contract|constraints|expected behavior|expected output|requirements|rules|validation):$/i.test(normalized);
|
|
144
307
|
}
|
|
145
308
|
|
|
146
309
|
export function automaticAcceptanceCriteria(
|
|
147
310
|
prompt: string,
|
|
148
|
-
changeMode: "source-change" | "read-only" = "source-change"
|
|
311
|
+
changeMode: "source-change" | "read-only" = "source-change",
|
|
312
|
+
mutationPolicy: "required" | "allowed" | "forbidden" = changeMode === "read-only" ? "forbidden" : "required"
|
|
149
313
|
): string[] {
|
|
150
314
|
const lines = String(prompt ?? "").split(/\r?\n/);
|
|
151
|
-
const criteria: string[] = [];
|
|
152
|
-
const obligation = /\b(?:add|change only|do not|emits?|ensure|exactly|fail(?:s|ed)?(?:[-\s]+)closed|invalid|missing|must|never|preserve|reject|returns?|throw|without)\b/i;
|
|
315
|
+
const criterionGroups: Array<{ source: string; criteria: string[] }> = [];
|
|
153
316
|
let current = "";
|
|
154
|
-
let currentIsBullet = false;
|
|
155
317
|
const push = (value: string) => {
|
|
156
318
|
if (isPathOnlyCriterion(value)) return;
|
|
157
|
-
|
|
319
|
+
const source = value.replace(/^\s*(?:[-*+] |\d+[.)]\s+)/, "").replace(/\s+/g, " ").trim();
|
|
320
|
+
criterionGroups.push({ source, criteria: splitAcceptanceCriterion(source) });
|
|
158
321
|
};
|
|
159
322
|
const flush = () => {
|
|
160
|
-
if (current
|
|
323
|
+
if (current) push(current);
|
|
161
324
|
current = "";
|
|
162
|
-
currentIsBullet = false;
|
|
163
325
|
};
|
|
164
|
-
|
|
326
|
+
const listItem = /^(?:[-*+] |\d+[.)]\s+)/;
|
|
327
|
+
for (const [index, line] of lines.entries()) {
|
|
165
328
|
const trimmed = line.trim();
|
|
166
|
-
if (
|
|
329
|
+
if (listItem.test(trimmed)) {
|
|
330
|
+
if (isStandaloneAcceptanceLabel(current)) {
|
|
331
|
+
current = `${current} ${trimmed.replace(listItem, "")}`;
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
167
334
|
flush();
|
|
168
335
|
current = trimmed;
|
|
169
|
-
currentIsBullet = true;
|
|
170
336
|
continue;
|
|
171
337
|
}
|
|
172
338
|
if (!trimmed) {
|
|
339
|
+
const next = lines.slice(index + 1).find((candidate) => candidate.trim())?.trim() ?? "";
|
|
340
|
+
if (isStandaloneAcceptanceLabel(current) && listItem.test(next)) continue;
|
|
173
341
|
flush();
|
|
174
342
|
continue;
|
|
175
343
|
}
|
|
344
|
+
if (isStandaloneOpaqueMetadata(trimmed, current)) continue;
|
|
176
345
|
current = current ? `${current} ${trimmed}` : trimmed;
|
|
177
346
|
}
|
|
178
347
|
flush();
|
|
179
|
-
const generic = changeMode === "read-only"
|
|
348
|
+
const generic = changeMode === "read-only" || mutationPolicy === "forbidden"
|
|
180
349
|
? ["No project files are changed.", "The final response addresses the requested diagnostic result."]
|
|
181
|
-
:
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
const
|
|
186
|
-
|
|
350
|
+
: mutationPolicy === "allowed"
|
|
351
|
+
? ["Every configured verification command passes against the final working tree."]
|
|
352
|
+
: ["The configured verification command passes after the final mutation."];
|
|
353
|
+
const limit = AUTO_ACCEPTANCE_CRITERIA_MAX - generic.length;
|
|
354
|
+
const atomic = criterionGroups.flatMap((group) => group.criteria);
|
|
355
|
+
const selected = atomic.length <= limit
|
|
356
|
+
? atomic
|
|
357
|
+
: groupedAcceptanceCriteria(criterionGroups.flatMap((group) => splitAcceptanceCriterion(group.source, true)), AUTO_ACCEPTANCE_CRITERIA_MAX);
|
|
358
|
+
if (new Set(selected).size !== selected.length) throw acceptanceCriteriaOverflow();
|
|
359
|
+
const available = AUTO_ACCEPTANCE_CRITERIA_MAX - selected.length;
|
|
360
|
+
return [...selected, ...generic.filter((criterion) => !selected.includes(criterion)).slice(0, available)];
|
|
187
361
|
}
|
|
188
362
|
|
|
189
363
|
export function manualTaskIntakeEligible(prompt: string, readProtectedPaths: string[]): boolean {
|
|
190
364
|
const text = String(prompt ?? "").trim();
|
|
191
365
|
if (!text || text.length > LONG_INPUT_CHARS) return false;
|
|
366
|
+
const folded = foldChangeIntent(text);
|
|
367
|
+
const explicitChange = isExplicitChangeRequest(folded);
|
|
368
|
+
if (isNonAuthorizingChangeClarification(text)) return false;
|
|
192
369
|
const signal = classifyContextTask(text);
|
|
193
|
-
if (signal.workflow !== "task" || !
|
|
194
|
-
if (AUTO_INTAKE_READ_ONLY_LEAD.test(
|
|
370
|
+
if (signal.workflow !== "task" || (!hasChangeIntent(folded) && !explicitChange)) return false;
|
|
371
|
+
if ((AUTO_INTAKE_READ_ONLY_LEAD.test(folded) && !explicitChange) || /\bpiagent_task_start\b/i.test(text)) return false;
|
|
195
372
|
if (signal.paths.length === 0) return true;
|
|
196
373
|
return signal.paths.some((candidate) => !matchesProtectedPath(candidate, readProtectedPaths));
|
|
197
374
|
}
|
|
@@ -236,97 +413,27 @@ function inferredProjectScope(prompt: string, projectFiles: string[]): string[]
|
|
|
236
413
|
.map((item) => item.path);
|
|
237
414
|
}
|
|
238
415
|
|
|
239
|
-
export
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
const STANDARD_SCOPE_ROOT = /^(?:\.github|app|apps|bin|config|docs|examples|lib|logs|packages|pages|plans|public|scripts|services|spec|src|test|tests|vendor|__tests__)(?:\/|$)/i;
|
|
247
|
-
|
|
248
|
-
function wildcardPrefix(value: string): string {
|
|
249
|
-
const index = value.search(/[*?{}\[\]]/);
|
|
250
|
-
return (index < 0 ? value : value.slice(0, index)).replace(/\/+$/, "");
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
function nestedDirectoryMatches(prefix: string, projectFiles: string[]): string[] {
|
|
254
|
-
if (!prefix) return [];
|
|
255
|
-
const segments = prefix.split("/").filter(Boolean);
|
|
256
|
-
const matches = new Set<string>();
|
|
257
|
-
for (const file of projectFiles) {
|
|
258
|
-
const parts = normalizePathCandidate(file).split("/");
|
|
259
|
-
for (let index = 0; index <= parts.length - 1 - segments.length; index += 1) {
|
|
260
|
-
if (segments.every((segment, offset) => parts[index + offset] === segment)) {
|
|
261
|
-
matches.add(parts.slice(0, index + segments.length).join("/"));
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
return [...matches].sort();
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
export function resolveTaskScopePatterns(scope: string[], projectFiles: string[]): TaskScopeResolution {
|
|
269
|
-
const files = uniqueStrings(projectFiles.map(normalizePathCandidate).filter(Boolean));
|
|
270
|
-
const resolved: string[] = [];
|
|
271
|
-
const mappings: Array<{ from: string; to: string }> = [];
|
|
272
|
-
const ambiguous: Array<{ input: string; candidates: string[] }> = [];
|
|
273
|
-
const unmatched: string[] = [];
|
|
274
|
-
for (const raw of scope) {
|
|
275
|
-
const candidate = normalizePathCandidate(raw);
|
|
276
|
-
if (!candidate) continue;
|
|
277
|
-
if (files.includes(candidate) || files.some((file) => matchesAnyPath(file, [candidate]))) {
|
|
278
|
-
resolved.push(candidate);
|
|
279
|
-
continue;
|
|
280
|
-
}
|
|
281
|
-
const hasWildcard = /[*?{}\[\]]/.test(candidate);
|
|
282
|
-
if (hasWildcard) {
|
|
283
|
-
const prefix = wildcardPrefix(candidate);
|
|
284
|
-
const directories = nestedDirectoryMatches(prefix, files);
|
|
285
|
-
if (directories.length === 1) {
|
|
286
|
-
const suffix = candidate.slice(prefix.length).replace(/^\/+/, "");
|
|
287
|
-
const canonical = suffix ? `${directories[0]}/${suffix}` : directories[0];
|
|
288
|
-
resolved.push(canonical);
|
|
289
|
-
mappings.push({ from: candidate, to: canonical });
|
|
290
|
-
} else if (directories.length > 1 && prefix && !STANDARD_SCOPE_ROOT.test(prefix)) {
|
|
291
|
-
ambiguous.push({ input: candidate, candidates: directories.slice(0, 12).map((directory) => {
|
|
292
|
-
const suffix = candidate.slice(prefix.length).replace(/^\/+/, "");
|
|
293
|
-
return suffix ? `${directory}/${suffix}` : directory;
|
|
294
|
-
}) });
|
|
295
|
-
} else if (directories.length === 0 && prefix && !prefix.includes("/") && !STANDARD_SCOPE_ROOT.test(prefix) && !raw.startsWith("./")) {
|
|
296
|
-
unmatched.push(candidate);
|
|
297
|
-
} else {
|
|
298
|
-
resolved.push(candidate);
|
|
299
|
-
}
|
|
300
|
-
continue;
|
|
301
|
-
}
|
|
302
|
-
const suffixMatches = files.filter((file) => file === candidate || file.endsWith(`/${candidate}`));
|
|
303
|
-
if (suffixMatches.length === 1) {
|
|
304
|
-
resolved.push(suffixMatches[0]);
|
|
305
|
-
mappings.push({ from: candidate, to: suffixMatches[0] });
|
|
306
|
-
} else if (suffixMatches.length > 1) {
|
|
307
|
-
ambiguous.push({ input: candidate, candidates: suffixMatches.slice(0, 12) });
|
|
308
|
-
} else if (!candidate.includes("/") && !raw.startsWith("./")) {
|
|
309
|
-
unmatched.push(candidate);
|
|
310
|
-
} else {
|
|
311
|
-
resolved.push(candidate);
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
return { scope: uniqueStrings(resolved), mappings, ambiguous, unmatched: uniqueStrings(unmatched) };
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
export function automaticTaskScope(prompt: string, context: Array<{ path: string }>, projectFiles: string[] = []): string[] {
|
|
416
|
+
export function automaticTaskScope(
|
|
417
|
+
prompt: string,
|
|
418
|
+
context: Array<{ path: string }>,
|
|
419
|
+
projectFiles: string[] = [],
|
|
420
|
+
priorTask?: PriorTaskScopeEvidence
|
|
421
|
+
): string[] {
|
|
318
422
|
const signal = classifyContextTask(prompt);
|
|
319
423
|
const explicit = signal.paths.filter(plausibleTaskScopePath);
|
|
320
|
-
const
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
424
|
+
const completedTaskScope = completedFollowupScope(prompt, priorTask, plausibleTaskScopePath);
|
|
425
|
+
const navigated = completedTaskScope.length > 0
|
|
426
|
+
? completedTaskScope
|
|
427
|
+
: context
|
|
428
|
+
.map((item) => normalizePathCandidate(item.path))
|
|
429
|
+
.filter((candidate): candidate is string => Boolean(
|
|
430
|
+
candidate
|
|
431
|
+
&& candidate !== "."
|
|
432
|
+
&& !candidate.startsWith(".pi/")
|
|
433
|
+
&& !["AGENTS.md", "README.md", "REVIEW_GUIDELINES.md"].includes(candidate)
|
|
434
|
+
&& /^(?:app|apps|lib|packages|services|spec|src|test|tests|__tests__)\//.test(candidate)
|
|
435
|
+
))
|
|
436
|
+
.slice(0, 8);
|
|
330
437
|
const inferred = explicit.length === 0 && navigated.length === 0
|
|
331
438
|
? inferredProjectScope(prompt, projectFiles)
|
|
332
439
|
: [];
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { LONG_INPUT_CHARS } from "../runtime-limits.ts";
|
|
2
|
+
import { foldChangeIntent, isExplicitChangeRequest } from "./change-clarification.ts";
|
|
3
|
+
|
|
4
|
+
const INSPECTION = /\b(?:audit|check|inspect|review|tests?|verify|verification|validate|rerun|re-run|recheck|re-check|kiem tra|ra soat|xac minh|danh gia|chay lai)\b/i;
|
|
5
|
+
const REPAIR = "(?:address|change|correct(?:ing)?|edit|fix|patch|repair|resolve|update|cap nhat|chinh sua|khac phuc|sua)";
|
|
6
|
+
const ACTION = "(?:add|apply|build|create|implement|modify|mutate|refactor|remove|rename|replace|write|them|tao|xoa|doi|" + REPAIR + ")";
|
|
7
|
+
const PREFIX_CONDITION = /^(?:(?:please|only|chi|em|anh)\s+)*(?:if|when|neu|khi)\b/i;
|
|
8
|
+
const REPAIR_LEAD = new RegExp(`^(?:(?:please|only|chi|em|anh)\\s+)*${REPAIR}\\b`, "i");
|
|
9
|
+
const CONDITIONAL_REPAIR = [
|
|
10
|
+
new RegExp(`^(?:(?:please|only|chi|em|anh)\\s+)*(?:if|when|neu|khi)\\b.*\\b${REPAIR}\\b`, "i"),
|
|
11
|
+
new RegExp(`\\b${REPAIR}\\b.*\\b(?:if|when|neu|khi)\\b.*\\b(?:fail(?:s|ed|ures?|ing)?|issues?|errors?|problems?|defects?|findings?|tests?|verification|verifier|needed|necessary|required|found|detected|discovered|can|co|loi|van de)\\b`, "i"),
|
|
12
|
+
new RegExp(`\\b${REPAIR}\\b.*\\b(?:as\\s+(?:needed|necessary|required)|(?:any|all|every)\\s+(?:(?:additional|remaining|new)\\s+)?(?:failures?|issues?|errors?|problems?|defects?|findings?)|whatever\\s+fails|(?:failures?|issues?|errors?|problems?|defects?|findings?)\\s+(?:(?:(?:if|when)\\s+)?(?:found|detected|discovered)|if\\s+any|(?:you|we)\\s+find)|loi|van de)\\b`, "i"),
|
|
13
|
+
new RegExp(`\\b${REPAIR}\\b\\s+(?:(?:any|all|every)\\s+)?(?:failures?|issues?|errors?|problems?|defects?|findings?|failing\\s+tests?)\\b`, "i")
|
|
14
|
+
];
|
|
15
|
+
const DIRECTIVE_PREFIX = "(?:(?:you|we|the task|your task)\\s+(?:must|need to|have to)|(?:can|could|would|will)\\s+you|i\\s+(?:need|want)\\s+you\\s+to|(?:em|anh)\\s+(?:phai|can)|must|please|only|chi|em|anh|also|always|still|regardless|in any case|bat buoc)";
|
|
16
|
+
const DIRECTIVE_LEAD = new RegExp(`^(?:${DIRECTIVE_PREFIX}\\b[,;:]?\\s+)*`, "i");
|
|
17
|
+
const ACTION_SEPARATOR = new RegExp(`(?:,\\s*|\\b(?:and|then|but|va|roi|nhung|sau do)\\s+)(?=(?:${DIRECTIVE_PREFIX}\\b[,;:]?\\s+)*${ACTION}\\b)`, "i");
|
|
18
|
+
const NEGATED_REPAIR = /\b(?:do not|don't|must not|never|khong|dung)\s+(?:ever\s+)?(?:fix|repair|edit|change|update|sua|chinh sua|cap nhat)\b/i;
|
|
19
|
+
|
|
20
|
+
// Examples, quoted data and fenced snippets cannot make an otherwise required
|
|
21
|
+
// implementation optional. Keep line boundaries while masking literal text.
|
|
22
|
+
function instructionText(text: string): string {
|
|
23
|
+
let quote = "", escaped = false, result = "";
|
|
24
|
+
for (let index = 0; index < text.length; index++) {
|
|
25
|
+
const character = text[index];
|
|
26
|
+
if (quote) {
|
|
27
|
+
result += character === "\n" ? "\n" : " ";
|
|
28
|
+
if (character === quote && !escaped) quote = "";
|
|
29
|
+
escaped = character === "\\" && !escaped;
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const apostrophe = character === "'" && /[\p{L}\p{N}]/u.test(text[index - 1] ?? "") && /[\p{L}\p{N}]/u.test(text[index + 1] ?? "");
|
|
33
|
+
if ((character === "`" || character === '"' || character === "'") && !apostrophe) { quote = character; escaped = false; result += " "; }
|
|
34
|
+
else result += character;
|
|
35
|
+
}
|
|
36
|
+
return result.replace(/^\s*>[^\n]*$/gm, "");
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export type ConditionalRepairIntent = "none" | "conditional-only" | "mixed";
|
|
40
|
+
|
|
41
|
+
/** Linguistic evidence only: task scope, approval and observed failures still gate writes. */
|
|
42
|
+
export function classifyConditionalRepairIntent(text: string): ConditionalRepairIntent {
|
|
43
|
+
if (text.length > LONG_INPUT_CHARS) return "none";
|
|
44
|
+
const visible = foldChangeIntent(instructionText(text));
|
|
45
|
+
if (!INSPECTION.test(visible)) return "none";
|
|
46
|
+
let conditional = false, unconditional = false;
|
|
47
|
+
const statements = visible.split(/(?<=[.!?;:])\s+|\n+|\b(?:but|however|nevertheless|nhung|tuy nhien)\b[,:]?\s*|(?:,|\b(?:and|then|va|roi)\b)\s*(?=(?:if|when|neu|khi)\b)/)
|
|
48
|
+
.map((part) => part.replace(/^\s*(?:[-*+]\s+|\d+[.)]\s+)/, "").trim()).filter(Boolean);
|
|
49
|
+
for (const statement of statements) {
|
|
50
|
+
if (PREFIX_CONDITION.test(statement) && CONDITIONAL_REPAIR.some((pattern) => pattern.test(statement)) && !NEGATED_REPAIR.test(statement)) {
|
|
51
|
+
conditional = true;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
for (const clause of statement.split(ACTION_SEPARATOR)) {
|
|
55
|
+
const directive = clause.trim().replace(DIRECTIVE_LEAD, "");
|
|
56
|
+
const repairCommand = REPAIR_LEAD.test(directive);
|
|
57
|
+
const imperative = repairCommand || isExplicitChangeRequest(directive);
|
|
58
|
+
if (!imperative && NEGATED_REPAIR.test(clause)) continue;
|
|
59
|
+
// Qualify the repair command itself, not a repair word inside the
|
|
60
|
+
// description of a different mandatory implementation command.
|
|
61
|
+
const qualified = repairCommand && CONDITIONAL_REPAIR.some((pattern) => pattern.test(clause));
|
|
62
|
+
if (qualified) conditional = true;
|
|
63
|
+
else if (imperative) unconditional = true;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return !conditional ? "none" : unconditional ? "mixed" : "conditional-only";
|
|
67
|
+
}
|