@piagent/platform 1.6.1 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (654) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/README.md +8 -2
  3. package/README.vi.md +11 -2
  4. package/adapters/common/assurance-producers.json +109 -0
  5. package/adapters/common/structured-assurance-facts.mjs +153 -0
  6. package/adapters/node-typescript/contract-families.json +2811 -0
  7. package/adapters/node-typescript/contract-families.md +90 -0
  8. package/benchmarks/production-v1/grade.mjs +20 -0
  9. package/benchmarks/production-v1/spend-control.v1.json +3 -3
  10. package/benchmarks/production-v2/grade.mjs +892 -0
  11. package/benchmarks/production-v2/project/README.md +7 -0
  12. package/benchmarks/production-v2/project/config/service.json +4 -0
  13. package/benchmarks/production-v2/project/data/audit-ledger.jsonl +1 -0
  14. package/benchmarks/production-v2/project/docs/ops.md +3 -0
  15. package/benchmarks/production-v2/project/logs/incident.log +2 -0
  16. package/benchmarks/production-v2/project/package.json +11 -0
  17. package/benchmarks/production-v2/project/scripts/check.mjs +21 -0
  18. package/benchmarks/production-v2/project/src/backend/auth.js +3 -0
  19. package/benchmarks/production-v2/project/src/backend/billing-window.js +4 -0
  20. package/benchmarks/production-v2/project/src/backend/cache.js +15 -0
  21. package/benchmarks/production-v2/project/src/backend/invoice.js +4 -0
  22. package/benchmarks/production-v2/project/src/backend/revocation-cache.js +3 -0
  23. package/benchmarks/production-v2/project/src/data/csv.js +3 -0
  24. package/benchmarks/production-v2/project/src/data/dedup.js +5 -0
  25. package/benchmarks/production-v2/project/src/data/migration.js +9 -0
  26. package/benchmarks/production-v2/project/src/data/ndjson-stream.js +5 -0
  27. package/benchmarks/production-v2/project/src/data/versioned-replay.js +8 -0
  28. package/benchmarks/production-v2/project/src/frontend/chat-events.js +7 -0
  29. package/benchmarks/production-v2/project/src/frontend/pagination.js +8 -0
  30. package/benchmarks/production-v2/project/src/frontend/request-lifecycle.js +15 -0
  31. package/benchmarks/production-v2/project/src/frontend/search-state.js +8 -0
  32. package/benchmarks/production-v2/project/src/frontend/unicode-search.js +7 -0
  33. package/benchmarks/production-v2/project/src/fullstack/contract-sync.js +10 -0
  34. package/benchmarks/production-v2/project/src/platform/args.js +10 -0
  35. package/benchmarks/production-v2/project/src/platform/config.js +7 -0
  36. package/benchmarks/production-v2/project/src/platform/workflow-session.js +9 -0
  37. package/benchmarks/production-v2/project/src/platform/workspace.js +13 -0
  38. package/benchmarks/production-v2/project/src/reliability/checkpoint.js +5 -0
  39. package/benchmarks/production-v2/project/src/reliability/expiry.js +5 -0
  40. package/benchmarks/production-v2/project/src/reliability/retry.js +15 -0
  41. package/benchmarks/production-v2/project/test/smoke.test.js +21 -0
  42. package/benchmarks/production-v2/project/vendor/README.md +1 -0
  43. package/benchmarks/production-v2/prompts/abort-reconnect-supersession.md +11 -0
  44. package/benchmarks/production-v2/prompts/backend-frontend-contract-sync.md +12 -0
  45. package/benchmarks/production-v2/prompts/billing-cutoff-clock-skew.md +11 -0
  46. package/benchmarks/production-v2/prompts/bounded-retry.md +7 -0
  47. package/benchmarks/production-v2/prompts/chunked-record-boundary.md +9 -0
  48. package/benchmarks/production-v2/prompts/cli-double-dash.md +7 -0
  49. package/benchmarks/production-v2/prompts/config-precedence.md +6 -0
  50. package/benchmarks/production-v2/prompts/destructive-history-refusal.md +3 -0
  51. package/benchmarks/production-v2/prompts/expiry-boundary.md +7 -0
  52. package/benchmarks/production-v2/prompts/idempotent-replay-conflict.md +11 -0
  53. package/benchmarks/production-v2/prompts/incident-diagnosis.md +4 -0
  54. package/benchmarks/production-v2/prompts/invoice-rounding.md +9 -0
  55. package/benchmarks/production-v2/prompts/journeys/config-precedence-scout.md +3 -0
  56. package/benchmarks/production-v2/prompts/journeys/expiry-boundary-scout.md +3 -0
  57. package/benchmarks/production-v2/prompts/journeys/quoted-csv-scout.md +3 -0
  58. package/benchmarks/production-v2/prompts/journeys/recover-after-uncertain-send.md +4 -0
  59. package/benchmarks/production-v2/prompts/journeys/repository-prompt-injection-scout.md +4 -0
  60. package/benchmarks/production-v2/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
  61. package/benchmarks/production-v2/prompts/journeys/stable-dedup-scout.md +3 -0
  62. package/benchmarks/production-v2/prompts/journeys/stale-search-response-scout.md +3 -0
  63. package/benchmarks/production-v2/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
  64. package/benchmarks/production-v2/prompts/journeys/verify-current-contract.md +4 -0
  65. package/benchmarks/production-v2/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
  66. package/benchmarks/production-v2/prompts/pagination-boundary.md +7 -0
  67. package/benchmarks/production-v2/prompts/protected-env-refusal.md +2 -0
  68. package/benchmarks/production-v2/prompts/quoted-csv.md +6 -0
  69. package/benchmarks/production-v2/prompts/reconnect-chat-event-order.md +19 -0
  70. package/benchmarks/production-v2/prompts/repository-prompt-injection.md +5 -0
  71. package/benchmarks/production-v2/prompts/resumable-checkpoint-partial-failure.md +11 -0
  72. package/benchmarks/production-v2/prompts/revoked-session-cache.md +10 -0
  73. package/benchmarks/production-v2/prompts/schema-migration.md +6 -0
  74. package/benchmarks/production-v2/prompts/stable-dedup.md +6 -0
  75. package/benchmarks/production-v2/prompts/stale-search-response.md +6 -0
  76. package/benchmarks/production-v2/prompts/tenant-cache-isolation.md +6 -0
  77. package/benchmarks/production-v2/prompts/tenant-role-authorization.md +6 -0
  78. package/benchmarks/production-v2/prompts/unicode-search.md +6 -0
  79. package/benchmarks/production-v2/prompts/workflow-switch-same-session.md +30 -0
  80. package/benchmarks/production-v2/prompts/workspace-order.md +7 -0
  81. package/benchmarks/production-v2/spend-control.v1.json +115 -0
  82. package/benchmarks/production-v2/suite.json +1009 -0
  83. package/benchmarks/production-v2/variant.mjs +169 -0
  84. package/benchmarks/production-v3/CONTRACT-REVISION-20260922.md +31 -0
  85. package/benchmarks/production-v3/calibration/corpus.v1.json +63 -0
  86. package/benchmarks/production-v3/calibration/human-review-rubric.v1.json +36 -0
  87. package/benchmarks/production-v3/grade.mjs +1017 -0
  88. package/benchmarks/production-v3/project/README.md +7 -0
  89. package/benchmarks/production-v3/project/config/service.json +4 -0
  90. package/benchmarks/production-v3/project/data/audit-ledger.jsonl +1 -0
  91. package/benchmarks/production-v3/project/docs/ops.md +3 -0
  92. package/benchmarks/production-v3/project/logs/incident.log +2 -0
  93. package/benchmarks/production-v3/project/package.json +11 -0
  94. package/benchmarks/production-v3/project/scripts/check.mjs +21 -0
  95. package/benchmarks/production-v3/project/src/backend/auth.js +3 -0
  96. package/benchmarks/production-v3/project/src/backend/billing-window.js +4 -0
  97. package/benchmarks/production-v3/project/src/backend/cache.js +15 -0
  98. package/benchmarks/production-v3/project/src/backend/invoice.js +4 -0
  99. package/benchmarks/production-v3/project/src/backend/revocation-cache.js +12 -0
  100. package/benchmarks/production-v3/project/src/data/csv.js +3 -0
  101. package/benchmarks/production-v3/project/src/data/dedup.js +5 -0
  102. package/benchmarks/production-v3/project/src/data/migration.js +9 -0
  103. package/benchmarks/production-v3/project/src/data/ndjson-stream.js +5 -0
  104. package/benchmarks/production-v3/project/src/data/versioned-replay.js +8 -0
  105. package/benchmarks/production-v3/project/src/frontend/chat-events.js +7 -0
  106. package/benchmarks/production-v3/project/src/frontend/pagination.js +8 -0
  107. package/benchmarks/production-v3/project/src/frontend/request-lifecycle.js +23 -0
  108. package/benchmarks/production-v3/project/src/frontend/search-state.js +8 -0
  109. package/benchmarks/production-v3/project/src/frontend/unicode-search.js +7 -0
  110. package/benchmarks/production-v3/project/src/fullstack/contract-sync.js +10 -0
  111. package/benchmarks/production-v3/project/src/platform/args.js +10 -0
  112. package/benchmarks/production-v3/project/src/platform/config.js +7 -0
  113. package/benchmarks/production-v3/project/src/platform/workflow-session.js +9 -0
  114. package/benchmarks/production-v3/project/src/platform/workspace.js +13 -0
  115. package/benchmarks/production-v3/project/src/reliability/checkpoint.js +5 -0
  116. package/benchmarks/production-v3/project/src/reliability/expiry.js +14 -0
  117. package/benchmarks/production-v3/project/src/reliability/retry.js +15 -0
  118. package/benchmarks/production-v3/project/test/smoke.test.js +21 -0
  119. package/benchmarks/production-v3/project/vendor/README.md +1 -0
  120. package/benchmarks/production-v3/prompts/abort-reconnect-supersession.md +11 -0
  121. package/benchmarks/production-v3/prompts/backend-frontend-contract-sync.md +20 -0
  122. package/benchmarks/production-v3/prompts/billing-cutoff-clock-skew.md +11 -0
  123. package/benchmarks/production-v3/prompts/bounded-retry.md +7 -0
  124. package/benchmarks/production-v3/prompts/chunked-record-boundary.md +11 -0
  125. package/benchmarks/production-v3/prompts/cli-double-dash.md +7 -0
  126. package/benchmarks/production-v3/prompts/config-precedence.md +6 -0
  127. package/benchmarks/production-v3/prompts/destructive-history-refusal.md +9 -0
  128. package/benchmarks/production-v3/prompts/expiry-boundary.md +14 -0
  129. package/benchmarks/production-v3/prompts/idempotent-replay-conflict.md +13 -0
  130. package/benchmarks/production-v3/prompts/incident-diagnosis.md +4 -0
  131. package/benchmarks/production-v3/prompts/invoice-rounding.md +9 -0
  132. package/benchmarks/production-v3/prompts/journeys/config-precedence-scout.md +3 -0
  133. package/benchmarks/production-v3/prompts/journeys/expiry-boundary-scout.md +3 -0
  134. package/benchmarks/production-v3/prompts/journeys/quoted-csv-scout.md +3 -0
  135. package/benchmarks/production-v3/prompts/journeys/recover-after-uncertain-send.md +4 -0
  136. package/benchmarks/production-v3/prompts/journeys/repository-prompt-injection-scout.md +4 -0
  137. package/benchmarks/production-v3/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
  138. package/benchmarks/production-v3/prompts/journeys/stable-dedup-scout.md +3 -0
  139. package/benchmarks/production-v3/prompts/journeys/stale-search-response-scout.md +3 -0
  140. package/benchmarks/production-v3/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
  141. package/benchmarks/production-v3/prompts/journeys/verify-current-contract.md +4 -0
  142. package/benchmarks/production-v3/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
  143. package/benchmarks/production-v3/prompts/pagination-boundary.md +9 -0
  144. package/benchmarks/production-v3/prompts/protected-env-refusal.md +8 -0
  145. package/benchmarks/production-v3/prompts/quoted-csv.md +6 -0
  146. package/benchmarks/production-v3/prompts/reconnect-chat-event-order.md +20 -0
  147. package/benchmarks/production-v3/prompts/repository-prompt-injection.md +5 -0
  148. package/benchmarks/production-v3/prompts/resumable-checkpoint-partial-failure.md +15 -0
  149. package/benchmarks/production-v3/prompts/revoked-session-cache.md +10 -0
  150. package/benchmarks/production-v3/prompts/schema-migration.md +6 -0
  151. package/benchmarks/production-v3/prompts/stable-dedup.md +6 -0
  152. package/benchmarks/production-v3/prompts/stale-search-response.md +6 -0
  153. package/benchmarks/production-v3/prompts/tenant-cache-isolation.md +6 -0
  154. package/benchmarks/production-v3/prompts/tenant-role-authorization.md +6 -0
  155. package/benchmarks/production-v3/prompts/unicode-search.md +6 -0
  156. package/benchmarks/production-v3/prompts/workflow-switch-same-session.md +30 -0
  157. package/benchmarks/production-v3/prompts/workspace-order.md +7 -0
  158. package/benchmarks/production-v3/public-checks/abort-reconnect-supersession.js +34 -0
  159. package/benchmarks/production-v3/public-checks/expiry-boundary.js +29 -0
  160. package/benchmarks/production-v3/public-checks/revoked-session-cache.js +20 -0
  161. package/benchmarks/production-v3/spend-control.v1.json +121 -0
  162. package/benchmarks/production-v3/suite.json +1010 -0
  163. package/benchmarks/production-v3/variant.mjs +178 -0
  164. package/catalog/capabilities.json +2 -2
  165. package/docs/benchmark-codex-mcp-metadata-contract-v1.md +159 -0
  166. package/docs/benchmark-codex-mcp-metadata-contract-v2.md +182 -0
  167. package/docs/benchmark-codex-mcp-metadata-contract-v3.md +194 -0
  168. package/docs/benchmark-public-contract-addendum-v2.md +85 -0
  169. package/docs/benchmark-public-contract-addendum-v3.md +116 -0
  170. package/docs/command-reference-vietnamese.md +10 -7
  171. package/docs/context-window-policy.md +3 -3
  172. package/docs/distribution-standard.md +9 -9
  173. package/docs/languages.json +2 -2
  174. package/docs/model-options.md +20 -15
  175. package/docs/operator-manual-vietnamese.md +12 -12
  176. package/docs/piagent-codex-benchmark-recovery-plan.md +1817 -0
  177. package/docs/piagent-core-evaluation-specs-2026-09-06.json +706 -0
  178. package/docs/piagent-core-improvement-plan.md +528 -0
  179. package/docs/piagent-core-offline-implementation-2026-09-06.md +219 -0
  180. package/docs/piagent-core-plan-checkpoint-2026-09-06.json +69 -0
  181. package/docs/piagent-core-reasoning-research-2026-09-06.md +225 -0
  182. package/docs/piagent-core-research-sources-2026-09-06.json +416 -0
  183. package/docs/piagent-open-session-wait.md +19 -0
  184. package/docs/piagent-runtime-benchmark-execution-plan.md +685 -0
  185. package/docs/publishing-for-teams.md +3 -0
  186. package/docs/quality-benchmark.md +128 -8
  187. package/docs/quickstart-vietnamese.md +2 -2
  188. package/docs/release-install-policy.md +38 -11
  189. package/docs/research/harness-next-evidence-review.md +113 -0
  190. package/docs/team-onboarding.md +7 -7
  191. package/docs/third-party-neutrality.md +7 -0
  192. package/docs/usage-observability.md +1 -1
  193. package/docs-site/architecture.html +1 -1
  194. package/docs-site/benchmark.html +1 -1
  195. package/docs-site/commands.html +1 -1
  196. package/docs-site/content/en/runtime.html +1 -1
  197. package/docs-site/content/en/whats-new.html +23 -0
  198. package/docs-site/content/runtime.html +2 -2
  199. package/docs-site/content/whats-new.html +23 -0
  200. package/docs-site/context-engine.html +1 -1
  201. package/docs-site/en/architecture.html +1 -1
  202. package/docs-site/en/benchmark.html +1 -1
  203. package/docs-site/en/commands.html +1 -1
  204. package/docs-site/en/context-engine.html +1 -1
  205. package/docs-site/en/index.html +1 -1
  206. package/docs-site/en/mcp-approval.html +1 -1
  207. package/docs-site/en/mcp-auth.html +1 -1
  208. package/docs-site/en/mcp-servers.html +1 -1
  209. package/docs-site/en/mcp.html +1 -1
  210. package/docs-site/en/permissions.html +1 -1
  211. package/docs-site/en/profiles.html +1 -1
  212. package/docs-site/en/quickstart.html +1 -1
  213. package/docs-site/en/runtime.html +2 -2
  214. package/docs-site/en/scope.html +1 -1
  215. package/docs-site/en/security.html +1 -1
  216. package/docs-site/en/team.html +1 -1
  217. package/docs-site/en/whats-new.html +24 -1
  218. package/docs-site/en/workflows.html +1 -1
  219. package/docs-site/index.html +1 -1
  220. package/docs-site/mcp-approval.html +1 -1
  221. package/docs-site/mcp-auth.html +1 -1
  222. package/docs-site/mcp-servers.html +1 -1
  223. package/docs-site/mcp.html +1 -1
  224. package/docs-site/permissions.html +1 -1
  225. package/docs-site/profiles.html +1 -1
  226. package/docs-site/quickstart.html +1 -1
  227. package/docs-site/runtime.html +3 -3
  228. package/docs-site/scope.html +1 -1
  229. package/docs-site/security.html +1 -1
  230. package/docs-site/team.html +1 -1
  231. package/docs-site/whats-new.html +24 -1
  232. package/docs-site/workflows.html +1 -1
  233. package/evals/architecture-conformance-v1/lane.json +18 -0
  234. package/evals/architecture-conformance-v1/runner.mjs +77 -0
  235. package/evals/fixtures/approved-host-contracts.invalid.json +43 -0
  236. package/evals/fixtures/approved-host-contracts.valid.json +43 -0
  237. package/evals/fixtures/benchmark-attempt-outcome.invalid.json +42 -0
  238. package/evals/fixtures/benchmark-attempt-outcome.valid.json +42 -0
  239. package/evals/fixtures/benchmark-independent-verification-plan.invalid.json +7 -0
  240. package/evals/fixtures/benchmark-independent-verification-plan.valid.json +21 -0
  241. package/evals/fixtures/composite-criterion.invalid.json +10 -0
  242. package/evals/fixtures/composite-criterion.valid.json +33 -0
  243. package/evals/fixtures/contract-family-library.invalid.json +42 -0
  244. package/evals/fixtures/contract-family-library.valid.json +41 -0
  245. package/evals/fixtures/contract-selection-recipe.invalid.json +29 -0
  246. package/evals/fixtures/contract-selection-recipe.valid.json +29 -0
  247. package/evals/fixtures/host-contract-plan.invalid.json +42 -0
  248. package/evals/fixtures/host-contract-plan.valid.json +41 -0
  249. package/evals/fixtures/scoped-project-verification-receipt-v2.invalid.json +42 -0
  250. package/evals/fixtures/scoped-project-verification-receipt-v2.valid.json +42 -0
  251. package/evals/fixtures/scoped-project-verification-receipt-v3.invalid.json +57 -0
  252. package/evals/fixtures/scoped-project-verification-receipt-v3.valid.json +57 -0
  253. package/evals/fixtures/scoped-verification-receipt-v1.invalid.json +40 -0
  254. package/evals/fixtures/scoped-verification-receipt-v1.valid.json +40 -0
  255. package/evals/fs5-artifact-archive/README.md +32 -0
  256. package/evals/fs5-artifact-archive/manifest.json +148 -0
  257. package/evals/fs5-artifact-archive/sha256/1f073f6d42c093a3182685e0e096144c8b3befd87594aeea1af05ce17653860c.txt +380 -0
  258. package/evals/fs5-artifact-archive/sha256/1ff46984c5ff668647dfad94248cd9dcfb72384a8aa529279345582f90d7486a.txt +331 -0
  259. package/evals/fs5-artifact-archive/sha256/20a5e1ef1cab3234a888b876b3cec52e702a05bc5ac000b691f94c651beed9ca.txt +800 -0
  260. package/evals/fs5-artifact-archive/sha256/29bb79e96b047d79056626d747baa0b3a6ca9d4da7ad80b9668c0085e5581706.txt +116 -0
  261. package/evals/fs5-artifact-archive/sha256/2bcc0cf6c18eee0c080c30e727610b0f10a278f5862855d920ba5797f07a2f2d.txt +252 -0
  262. package/evals/fs5-artifact-archive/sha256/37ecc65febe2c5947ac9288ad958bc149e0f08c6beda137edb1c660908853832.txt +324 -0
  263. package/evals/fs5-artifact-archive/sha256/5d937632d2cfff34dbbb781dd367bb78feb64c36d571c36ca15f2cc40c576af8.txt +142 -0
  264. package/evals/fs5-artifact-archive/sha256/6057c7bf2f40f8e3db7e293f08d745133c05293b75e9f363fb4e2e53bd09a76a.txt +244 -0
  265. package/evals/fs5-artifact-archive/sha256/62ea354afb6816b148ae9bd95ffb1ee5e29580eb4a22473e1ae19dbb471ec36b.txt +930 -0
  266. package/evals/fs5-artifact-archive/sha256/8987775b742f3b3650d75cce84e6d58fcdd3dfb835d03dac4c2bfe6d9eea3a2e.txt +903 -0
  267. package/evals/fs5-artifact-archive/sha256/902e886d0920b66811f54d0d1d933d70f8fab8704813b46d578bee6af1f21eef.txt +942 -0
  268. package/evals/fs5-artifact-archive/sha256/976a9908adfd765ee7be0655616f39a44fff64824f5e8535d726082e550b02eb.txt +910 -0
  269. package/evals/fs5-artifact-archive/sha256/9c07bda5bfe7bb7b0959844ccea6790735cc9f154d8d5972e18785148cea6d9a.txt +101 -0
  270. package/evals/fs5-artifact-archive/sha256/b936a604db87a697bf69581c33d753e26d9e5e2ccce40bf9c9b2070948f49919.txt +931 -0
  271. package/evals/fs5-artifact-archive/sha256/bf91f69473f48fc3de7c7c55e7ce893ba0511074c4ec930d9f3bcb9615d8e9d5.txt +950 -0
  272. package/evals/fs5-artifact-archive/sha256/ce4ed1b4a033f2a8cb4632d1336b0867edb3454ce1380f0642c4055149e6ac59.txt +784 -0
  273. package/evals/fs5-artifact-archive/sha256/db97f444db8ba604512daf0aa26b3fe1e2a120ace2b21d4730db5b18aa0c528f.txt +950 -0
  274. package/evals/fs5-causal-arm.v1.json +9 -5
  275. package/evals/fs5-pilot-protocol.v1.json +1 -1
  276. package/evals/fs5-pilot-protocol.v4.json +4 -4
  277. package/evals/fs5-pilot-protocol.v5.json +6 -5
  278. package/evals/harness-next/development-corpus.mjs +106 -0
  279. package/evals/harness-next/resource-budget-probe.mjs +38 -0
  280. package/evals/harness-next/run-calibration.mjs +83 -0
  281. package/evals/harness-next/run-resource-probe.mjs +55 -0
  282. package/evals/harness-next/selected-development-corpus.mjs +27 -0
  283. package/evals/harness-next.v1.json +51 -0
  284. package/evals/long-horizon-v1/README.md +19 -0
  285. package/evals/long-horizon-v1/runner.mjs +116 -48
  286. package/evals/long-horizon-v1/worker.mjs +77 -30
  287. package/evals/private-holdout-v1/CURRENT_BOUNDARY.md +53 -0
  288. package/evals/private-holdout-v1/README.md +5 -2
  289. package/evals/private-holdout-v1/public-exposure.v2.json +273 -0
  290. package/package.json +9 -4
  291. package/packages/piagent-core/README.md +2 -2
  292. package/packages/piagent-core/benchmark/benchmark-all-attempt-efficiency.js +55 -0
  293. package/packages/piagent-core/benchmark/benchmark-artifact-binding.js +49 -0
  294. package/packages/piagent-core/benchmark/benchmark-bootstrap.js +265 -14
  295. package/packages/piagent-core/benchmark/benchmark-budget-governor.js +271 -0
  296. package/packages/piagent-core/benchmark/benchmark-campaign.js +592 -0
  297. package/packages/piagent-core/benchmark/benchmark-candidate.js +8 -3
  298. package/packages/piagent-core/benchmark/benchmark-checkpoint.js +67 -0
  299. package/packages/piagent-core/benchmark/benchmark-claim-restrictions.js +269 -2
  300. package/packages/piagent-core/benchmark/benchmark-cli.js +120 -3
  301. package/packages/piagent-core/benchmark/benchmark-codex-events.js +235 -0
  302. package/packages/piagent-core/benchmark/benchmark-codex-outcome.js +20 -0
  303. package/packages/piagent-core/benchmark/benchmark-codex-relative-efficiency.js +2 -1
  304. package/packages/piagent-core/benchmark/benchmark-codex-rollout.js +521 -0
  305. package/packages/piagent-core/benchmark/benchmark-codex.js +104 -8
  306. package/packages/piagent-core/benchmark/benchmark-comparison.js +284 -1
  307. package/packages/piagent-core/benchmark/benchmark-core.js +107 -107
  308. package/packages/piagent-core/benchmark/benchmark-diagnostic-source-evidence.js +40 -0
  309. package/packages/piagent-core/benchmark/benchmark-diagnostic-treatment.js +104 -0
  310. package/packages/piagent-core/benchmark/benchmark-evaluator-v3.js +226 -0
  311. package/packages/piagent-core/benchmark/benchmark-execution-guard.js +23 -1
  312. package/packages/piagent-core/benchmark/benchmark-forensics.js +63 -50
  313. package/packages/piagent-core/benchmark/benchmark-goal-assessment.js +193 -0
  314. package/packages/piagent-core/benchmark/benchmark-goal-report.js +87 -0
  315. package/packages/piagent-core/benchmark/benchmark-independent-verification-observation.js +64 -0
  316. package/packages/piagent-core/benchmark/benchmark-matrix-summary.js +141 -0
  317. package/packages/piagent-core/benchmark/benchmark-matrix.js +1 -0
  318. package/packages/piagent-core/benchmark/benchmark-normalized-cost.js +62 -0
  319. package/packages/piagent-core/benchmark/benchmark-pi-home.js +1 -0
  320. package/packages/piagent-core/benchmark/benchmark-preflight.js +69 -8
  321. package/packages/piagent-core/benchmark/benchmark-process.js +23 -9
  322. package/packages/piagent-core/benchmark/benchmark-production-completion.js +84 -0
  323. package/packages/piagent-core/benchmark/benchmark-production-stage-validation.js +209 -0
  324. package/packages/piagent-core/benchmark/benchmark-provider-free-evidence.js +162 -45
  325. package/packages/piagent-core/benchmark/benchmark-provider-free-owner.js +24 -0
  326. package/packages/piagent-core/benchmark/benchmark-provider-wire.js +378 -0
  327. package/packages/piagent-core/benchmark/benchmark-record-validation.d.ts +2 -0
  328. package/packages/piagent-core/benchmark/benchmark-record-validation.js +269 -3
  329. package/packages/piagent-core/benchmark/benchmark-release-claim-controls.js +132 -0
  330. package/packages/piagent-core/benchmark/benchmark-report.js +79 -4
  331. package/packages/piagent-core/benchmark/benchmark-resume-recovery.js +280 -10
  332. package/packages/piagent-core/benchmark/benchmark-runner-policy.js +88 -1
  333. package/packages/piagent-core/benchmark/benchmark-runtime-identity.js +50 -1
  334. package/packages/piagent-core/benchmark/benchmark-runtime.js +102 -10
  335. package/packages/piagent-core/benchmark/benchmark-safety-evidence.js +74 -0
  336. package/packages/piagent-core/benchmark/benchmark-service-tier.js +189 -0
  337. package/packages/piagent-core/benchmark/benchmark-stage-diagnostic.js +144 -128
  338. package/packages/piagent-core/benchmark/benchmark-suite-identity.js +264 -1
  339. package/packages/piagent-core/benchmark/benchmark-suite-runtime.js +4 -0
  340. package/packages/piagent-core/benchmark/benchmark-suite.js +211 -4
  341. package/packages/piagent-core/benchmark/benchmark-summary-support.js +30 -2
  342. package/packages/piagent-core/benchmark/benchmark-timing-contract.js +189 -0
  343. package/packages/piagent-core/benchmark/benchmark-timing-diagnostics.js +110 -139
  344. package/packages/piagent-core/benchmark/benchmark-transport-evidence.js +203 -0
  345. package/packages/piagent-core/benchmark/benchmark-transport-observation.js +147 -0
  346. package/packages/piagent-core/benchmark/benchmark-tree-identity.js +2 -1
  347. package/packages/piagent-core/benchmark/benchmark-usage.js +395 -33
  348. package/packages/piagent-core/benchmark/benchmark-workflow.js +136 -38
  349. package/packages/piagent-core/benchmark/fs5-pilot-protocol.js +21 -2
  350. package/packages/piagent-core/capabilities/runtime-integrity.js +3 -0
  351. package/packages/piagent-core/extensions/acceptance-api-baseline.js +24 -0
  352. package/packages/piagent-core/extensions/acceptance-assessment.js +153 -0
  353. package/packages/piagent-core/extensions/acceptance-authenticated-admission.d.ts +41 -0
  354. package/packages/piagent-core/extensions/acceptance-authenticated-admission.js +120 -0
  355. package/packages/piagent-core/extensions/acceptance-behavior-proof.js +264 -70
  356. package/packages/piagent-core/extensions/acceptance-boundary-binding.js +31 -0
  357. package/packages/piagent-core/extensions/acceptance-boundary-guidance.js +214 -0
  358. package/packages/piagent-core/extensions/acceptance-callable-scanner.js +244 -0
  359. package/packages/piagent-core/extensions/acceptance-clause-group.js +45 -0
  360. package/packages/piagent-core/extensions/acceptance-composite-contract.js +334 -0
  361. package/packages/piagent-core/extensions/acceptance-contract-conjunction.js +78 -0
  362. package/packages/piagent-core/extensions/acceptance-contract-selection.js +161 -0
  363. package/packages/piagent-core/extensions/acceptance-contract-semantics.js +211 -211
  364. package/packages/piagent-core/extensions/acceptance-declared-api.js +126 -0
  365. package/packages/piagent-core/extensions/acceptance-diagnostic-policy.ts +14 -0
  366. package/packages/piagent-core/extensions/acceptance-document-content.js +73 -0
  367. package/packages/piagent-core/extensions/acceptance-durable-execution.d.ts +59 -0
  368. package/packages/piagent-core/extensions/acceptance-durable-execution.js +139 -0
  369. package/packages/piagent-core/extensions/acceptance-error-classes.js +1 -1
  370. package/packages/piagent-core/extensions/acceptance-evidence-store.js +223 -0
  371. package/packages/piagent-core/extensions/acceptance-executable-evidence.js +490 -88
  372. package/packages/piagent-core/extensions/acceptance-execution-diagnostics.js +34 -0
  373. package/packages/piagent-core/extensions/acceptance-execution-snapshot.js +174 -0
  374. package/packages/piagent-core/extensions/acceptance-executor/.dockerignore +21 -0
  375. package/packages/piagent-core/extensions/acceptance-executor/Dockerfile +5 -0
  376. package/packages/piagent-core/extensions/acceptance-executor/README.md +103 -0
  377. package/packages/piagent-core/extensions/acceptance-executor/budget.mjs +54 -0
  378. package/packages/piagent-core/extensions/acceptance-executor/callback-intrinsics.mjs +126 -0
  379. package/packages/piagent-core/extensions/acceptance-executor/capabilities.mjs +127 -0
  380. package/packages/piagent-core/extensions/acceptance-executor/guest.mjs +285 -0
  381. package/packages/piagent-core/extensions/acceptance-executor/intrinsics.mjs +133 -0
  382. package/packages/piagent-core/extensions/acceptance-executor/invocation.mjs +39 -0
  383. package/packages/piagent-core/extensions/acceptance-executor/jobs.mjs +29 -0
  384. package/packages/piagent-core/extensions/acceptance-executor/module-graph.mjs +70 -0
  385. package/packages/piagent-core/extensions/acceptance-executor/node-profile.mjs +398 -0
  386. package/packages/piagent-core/extensions/acceptance-executor/package-lock.json +40 -0
  387. package/packages/piagent-core/extensions/acceptance-executor/package.json +10 -0
  388. package/packages/piagent-core/extensions/acceptance-executor/protocol.mjs +248 -0
  389. package/packages/piagent-core/extensions/acceptance-executor/reference-identity.mjs +61 -0
  390. package/packages/piagent-core/extensions/acceptance-executor/references.mjs +14 -0
  391. package/packages/piagent-core/extensions/acceptance-executor/structured-clone.mjs +53 -0
  392. package/packages/piagent-core/extensions/acceptance-executor/values.mjs +97 -0
  393. package/packages/piagent-core/extensions/acceptance-executor/worker.mjs +75 -0
  394. package/packages/piagent-core/extensions/acceptance-expiry-calendar-proof.js +162 -0
  395. package/packages/piagent-core/extensions/acceptance-expression-parser.js +155 -0
  396. package/packages/piagent-core/extensions/acceptance-focused-verification.js +40 -0
  397. package/packages/piagent-core/extensions/acceptance-host-configuration.js +337 -0
  398. package/packages/piagent-core/extensions/acceptance-identifier-criteria.js +25 -0
  399. package/packages/piagent-core/extensions/acceptance-independent-contract.js +209 -0
  400. package/packages/piagent-core/extensions/acceptance-independent-registry.js +106 -0
  401. package/packages/piagent-core/extensions/acceptance-input-provenance.js +40 -0
  402. package/packages/piagent-core/extensions/acceptance-integer-domains.js +322 -0
  403. package/packages/piagent-core/extensions/acceptance-invalid-input-receipt.js +20 -0
  404. package/packages/piagent-core/extensions/acceptance-invalid-partitions.js +26 -0
  405. package/packages/piagent-core/extensions/acceptance-invalid-sentinel-proof.js +477 -0
  406. package/packages/piagent-core/extensions/acceptance-isolated-executor.js +254 -0
  407. package/packages/piagent-core/extensions/acceptance-lexical-sentinels.js +130 -0
  408. package/packages/piagent-core/extensions/acceptance-literal-dataflow.js +735 -0
  409. package/packages/piagent-core/extensions/acceptance-local-binding.js +106 -0
  410. package/packages/piagent-core/extensions/acceptance-normalizer-evidence.js +719 -0
  411. package/packages/piagent-core/extensions/acceptance-obligations.js +75 -0
  412. package/packages/piagent-core/extensions/acceptance-parameter-contract.js +756 -0
  413. package/packages/piagent-core/extensions/acceptance-precedence-contract.js +572 -0
  414. package/packages/piagent-core/extensions/acceptance-proof-capability.js +26 -0
  415. package/packages/piagent-core/extensions/acceptance-receipt.js +139 -152
  416. package/packages/piagent-core/extensions/acceptance-result-contract-evidence.js +159 -0
  417. package/packages/piagent-core/extensions/acceptance-source-origin.js +214 -0
  418. package/packages/piagent-core/extensions/acceptance-state-machine-evidence.js +64 -8
  419. package/packages/piagent-core/extensions/acceptance-tagged-event-evidence.js +685 -0
  420. package/packages/piagent-core/extensions/acceptance-temporal-contract.js +756 -0
  421. package/packages/piagent-core/extensions/acceptance-temporal-dataflow-proof.js +618 -0
  422. package/packages/piagent-core/extensions/acceptance-test-binding-evidence.js +20 -2
  423. package/packages/piagent-core/extensions/acceptance-test-bindings.js +86 -0
  424. package/packages/piagent-core/extensions/acceptance-tuple-shapes.js +12 -0
  425. package/packages/piagent-core/extensions/context-engine.js +11 -6
  426. package/packages/piagent-core/extensions/criterion-context-pack.js +96 -4
  427. package/packages/piagent-core/extensions/failure-types.ts +2 -2
  428. package/packages/piagent-core/extensions/guard-types.ts +5 -1
  429. package/packages/piagent-core/extensions/piagent-guard.ts +197 -155
  430. package/packages/piagent-core/extensions/readonly-inline-inspection.ts +378 -0
  431. package/packages/piagent-core/extensions/recovery-decision-validation.ts +92 -0
  432. package/packages/piagent-core/extensions/shell-write-targets.js +15 -14
  433. package/packages/piagent-core/extensions/task-contract-view.js +4 -4
  434. package/packages/piagent-core/extensions/task-digest-migration.js +2 -2
  435. package/packages/piagent-core/extensions/task-journal.js +48 -3
  436. package/packages/piagent-core/extensions/task-runtime-audit.js +8 -2
  437. package/packages/piagent-core/extensions/task-state.js +74 -38
  438. package/packages/piagent-core/extensions/task-terminal-disposition.js +10 -0
  439. package/packages/piagent-core/extensions/trajectory-contract.ts +5 -0
  440. package/packages/piagent-core/extensions/verification-intelligence.js +60 -8
  441. package/packages/piagent-core/extensions/workflow-catalog.ts +98 -0
  442. package/packages/piagent-core/extensions/workspace-revision.js +48 -0
  443. package/packages/piagent-core/extensions/workspace-verification-snapshot.js +13 -0
  444. package/packages/piagent-core/package.json +3 -3
  445. package/packages/piagent-core/policies/base-policy.json +1 -0
  446. package/packages/piagent-core/runtime/context/adaptive-planner.ts +7 -3
  447. package/packages/piagent-core/runtime/hooks/agent-start-hook.ts +60 -59
  448. package/packages/piagent-core/runtime/hooks/agent-start-types.ts +48 -0
  449. package/packages/piagent-core/runtime/hooks/completion-hook.ts +76 -83
  450. package/packages/piagent-core/runtime/hooks/input-hook.ts +92 -7
  451. package/packages/piagent-core/runtime/hooks/protected-refusal-completion.ts +86 -0
  452. package/packages/piagent-core/runtime/hooks/session-hooks.ts +5 -2
  453. package/packages/piagent-core/runtime/hooks/session-start-hook.ts +50 -18
  454. package/packages/piagent-core/runtime/hooks/tool-result-hook.ts +53 -20
  455. package/packages/piagent-core/runtime/hooks/tool-result-metadata.ts +9 -0
  456. package/packages/piagent-core/runtime/hooks/tool-result-navigation.ts +36 -0
  457. package/packages/piagent-core/runtime/hooks/tool-result-retrieval.ts +42 -0
  458. package/packages/piagent-core/runtime/input/chat-images.ts +1 -1
  459. package/packages/piagent-core/runtime/inspection/activity-event-adapter.ts +1 -1
  460. package/packages/piagent-core/runtime/inspection/same-process-bridge-proof.ts +1 -1
  461. package/packages/piagent-core/runtime/inspection/task-handoff-history.ts +2 -2
  462. package/packages/piagent-core/runtime/inspection/tool-failure-classification.ts +49 -8
  463. package/packages/piagent-core/runtime/inspection/webui-snapshot.ts +61 -15
  464. package/packages/piagent-core/runtime/inspection/workspace-file-reader.ts +2 -132
  465. package/packages/piagent-core/runtime/model/model-route-policy.ts +33 -13
  466. package/packages/piagent-core/runtime/model/model-route-types.ts +10 -6
  467. package/packages/piagent-core/runtime/model/provider-wire-fingerprint.ts +20 -0
  468. package/packages/piagent-core/runtime/model/service-tier-runtime.ts +242 -0
  469. package/packages/piagent-core/runtime/policy/source-worktree-transaction.ts +75 -14
  470. package/packages/piagent-core/runtime/product/activity-inspector.ts +6 -3
  471. package/packages/piagent-core/runtime/product/edit-verifier-timing.ts +26 -0
  472. package/packages/piagent-core/runtime/product/efficiency-metrics.ts +12 -7
  473. package/packages/piagent-core/runtime/product/operator-projections.ts +8 -3
  474. package/packages/piagent-core/runtime/product/task-usage-hooks.ts +78 -0
  475. package/packages/piagent-core/runtime/product/task-usage.ts +104 -0
  476. package/packages/piagent-core/runtime/quality/protected-refusal-handoff.ts +35 -0
  477. package/packages/piagent-core/runtime/recovery/acceptance-recovery-guidance.ts +21 -0
  478. package/packages/piagent-core/runtime/recovery/continuation-budget.ts +11 -2
  479. package/packages/piagent-core/runtime/recovery/diagnostic-delivery.ts +61 -0
  480. package/packages/piagent-core/runtime/recovery/handoff-projection.ts +192 -57
  481. package/packages/piagent-core/runtime/recovery/handoff-verifier-binding.ts +24 -0
  482. package/packages/piagent-core/runtime/recovery/independent-verification-recovery.ts +79 -0
  483. package/packages/piagent-core/runtime/recovery/recovery-policy.ts +27 -39
  484. package/packages/piagent-core/runtime/recovery/resume-state.ts +8 -5
  485. package/packages/piagent-core/runtime/registration/activity-inspector-command.ts +2 -1
  486. package/packages/piagent-core/runtime/registration/context-commands.ts +12 -8
  487. package/packages/piagent-core/runtime/registration/operator-catalogs.ts +4 -9
  488. package/packages/piagent-core/runtime/registration/policy-tools.ts +5 -3
  489. package/packages/piagent-core/runtime/registration/session-commands.ts +9 -7
  490. package/packages/piagent-core/runtime/registration/session-wait-tool.ts +54 -0
  491. package/packages/piagent-core/runtime/registration/task-completion-tools.ts +27 -11
  492. package/packages/piagent-core/runtime/registration/task-start-conditional-mutation.ts +45 -0
  493. package/packages/piagent-core/runtime/registration/task-start-guidance.ts +5 -2
  494. package/packages/piagent-core/runtime/registration/task-start-tool.ts +23 -23
  495. package/packages/piagent-core/runtime/registration/workflow-commands.ts +64 -93
  496. package/packages/piagent-core/runtime/session/completion-signals.ts +23 -0
  497. package/packages/piagent-core/runtime/session/message-signals.ts +6 -22
  498. package/packages/piagent-core/runtime/session/retrieval-evidence-runtime.ts +188 -0
  499. package/packages/piagent-core/runtime/session/runtime-state.ts +29 -35
  500. package/packages/piagent-core/runtime/session/system-prompt.ts +3 -3
  501. package/packages/piagent-core/runtime/session/uncertain-send-continuation.ts +231 -0
  502. package/packages/piagent-core/runtime/session/usage.ts +4 -3
  503. package/packages/piagent-core/runtime/tools/apply-patch-tool.ts +6 -6
  504. package/packages/piagent-core/runtime/tools/phase-tool-runtime.ts +1 -1
  505. package/packages/piagent-core/runtime/tools/phase-tools.ts +3 -2
  506. package/packages/piagent-core/runtime/tools/session-wait.ts +42 -0
  507. package/packages/piagent-core/runtime/tools/tool-groups.ts +10 -3
  508. package/packages/piagent-core/runtime/trajectory/trajectory-runtime.ts +192 -5
  509. package/packages/piagent-core/runtime/trajectory/trajectory-types.ts +3 -2
  510. package/packages/piagent-core/runtime/verification/acceptance-api-baseline.js +488 -0
  511. package/packages/piagent-core/runtime/verification/completion-preparation.ts +22 -0
  512. package/packages/piagent-core/runtime/verification/composite-completion-finalizer.ts +105 -0
  513. package/packages/piagent-core/runtime/verification/composite-journal-anchor.ts +181 -0
  514. package/packages/piagent-core/runtime/verification/composite-runtime-binding.ts +76 -0
  515. package/packages/piagent-core/runtime/verification/composite-scoped-mediation.ts +318 -0
  516. package/packages/piagent-core/runtime/verification/composite-session-persistence.ts +175 -0
  517. package/packages/piagent-core/runtime/verification/composite-task-publication.ts +273 -0
  518. package/packages/piagent-core/runtime/verification/exact-verifier-reuse.ts +11 -11
  519. package/packages/piagent-core/runtime/verification/host-project-verification.ts +71 -0
  520. package/packages/piagent-core/runtime/verification/independent-acceptance-runtime.ts +500 -0
  521. package/packages/piagent-core/runtime/verification/runtime-assurance-facts.ts +500 -0
  522. package/packages/piagent-core/runtime/verification/runtime-contract-runner.ts +107 -0
  523. package/packages/piagent-core/runtime/verification/shell-verification-snapshots.ts +56 -0
  524. package/packages/piagent-core/runtime/workflows/change-clarification.ts +61 -0
  525. package/packages/piagent-core/runtime/workflows/input-routing.ts +21 -14
  526. package/packages/piagent-core/runtime/workflows/runtime-intake-compaction.ts +44 -7
  527. package/packages/piagent-core/runtime/workflows/task-followup-policy.ts +163 -0
  528. package/packages/piagent-core/runtime/workflows/task-intake.ts +221 -242
  529. package/packages/piagent-core/runtime/workflows/task-repair-intent.ts +67 -0
  530. package/packages/piagent-core/runtime/workflows/task-scope-resolution.ts +83 -0
  531. package/packages/piagent-core/runtime/workflows/webui-runtime-command.ts +5 -2
  532. package/packages/piagent-core/runtime/workflows/webui-workflow.ts +39 -32
  533. package/packages/piagent-core/runtime/workflows/workflow-follow-up.ts +33 -0
  534. package/packages/piagent-core/security/workspace-file-reader.ts +132 -0
  535. package/packages/piagent-webui/dist/client/assets/{MarkdownMessage-B4XehTCU.js → MarkdownMessage-DMU7Xe_O.js} +1 -1
  536. package/packages/piagent-webui/dist/client/assets/index-Cui9AAV_.js +176 -0
  537. package/packages/piagent-webui/dist/client/assets/{index-BV-_03yl.css → index-DVahUVWy.css} +1 -1
  538. package/packages/piagent-webui/dist/client/index.html +2 -2
  539. package/packages/piagent-webui/extension/dispatch-user-entry.ts +13 -0
  540. package/packages/piagent-webui/extension/piagent-webui.ts +10 -2
  541. package/packages/piagent-webui/extension/review-controller.ts +29 -6
  542. package/packages/piagent-webui/extension/same-session-bridge.ts +6 -7
  543. package/packages/piagent-webui/extension/session-stream-adapter.ts +60 -11
  544. package/packages/piagent-webui/extension/source-mutation-controller.ts +29 -3
  545. package/packages/piagent-webui/extension/source-open-controller.ts +29 -7
  546. package/packages/piagent-webui/extension/source-revert-controller.ts +26 -3
  547. package/packages/piagent-webui/gateway/gateway-events.ts +22 -5
  548. package/packages/piagent-webui/gateway/gateway-service.ts +7 -2
  549. package/packages/piagent-webui/gateway/gateway-session-stream.ts +141 -19
  550. package/packages/piagent-webui/gateway/rpc-ui-context.ts +34 -9
  551. package/packages/piagent-webui/gateway/runtime-command-controller.ts +46 -6
  552. package/packages/piagent-webui/gateway/runtime-session-controls.ts +17 -2
  553. package/packages/piagent-webui/gateway/session-catalog.ts +9 -3
  554. package/packages/piagent-webui/gateway/session-command-controller.ts +29 -9
  555. package/packages/piagent-webui/gateway/session-effective-options.ts +2 -9
  556. package/packages/piagent-webui/gateway/session-inspection-registry.ts +14 -6
  557. package/packages/piagent-webui/gateway/session-operation-settlement.ts +28 -0
  558. package/packages/piagent-webui/gateway/session-prompt-dispatch.ts +37 -0
  559. package/packages/piagent-webui/gateway/session-runtime-close.ts +36 -0
  560. package/packages/piagent-webui/gateway/session-runtime-factory.ts +183 -6
  561. package/packages/piagent-webui/gateway/session-runtime-ownership.ts +48 -0
  562. package/packages/piagent-webui/gateway/session-runtime-state.ts +24 -0
  563. package/packages/piagent-webui/gateway/session-runtime-supervisor.ts +114 -114
  564. package/packages/piagent-webui/server/core-inspection-provider.ts +73 -14
  565. package/packages/piagent-webui/server/loopback-server.ts +9 -7
  566. package/packages/piagent-webui/server/terminal-delivery-receipt.ts +144 -0
  567. package/packages/piagent-webui/server/transcript-projection.ts +65 -12
  568. package/packages/piagent-webui/shared/message-correlation.ts +25 -0
  569. package/schemas/approved-host-contracts.schema.json +973 -0
  570. package/schemas/benchmark-attempt-outcome.schema.json +303 -0
  571. package/schemas/benchmark-independent-verification-plan.schema.json +34 -0
  572. package/schemas/composite-criterion.schema.json +788 -0
  573. package/schemas/contract-family-library.schema.json +28 -0
  574. package/schemas/contract-selection-recipe.schema.json +31 -0
  575. package/schemas/failure-evidence.schema.json +2 -2
  576. package/schemas/helper-request.schema.json +16 -4
  577. package/schemas/host-contract-plan.schema.json +25 -0
  578. package/schemas/piagent-webui/gateway-protocol-v1.schema.json +16 -2
  579. package/schemas/piagent-webui/runtime-command-v1.schema.json +26 -3
  580. package/schemas/piagent-webui/runtime-event-v2.schema.json +32 -1
  581. package/schemas/piagent-webui/session-live-state-v1.schema.json +2 -0
  582. package/schemas/piagent-webui/snapshot-v1.schema.json +3 -0
  583. package/schemas/piagent-webui/source-change-v1.schema.json +12 -0
  584. package/schemas/piagent-webui/transcript-v1.schema.json +2 -1
  585. package/schemas/public-contracts/codex-mcp-metadata-v1.schema.json +206 -0
  586. package/schemas/public-contracts/codex-mcp-metadata-v2.schema.json +228 -0
  587. package/schemas/public-contracts/codex-mcp-metadata-v3.schema.json +233 -0
  588. package/schemas/public-contracts/revocation-v1.schema.json +87 -0
  589. package/schemas/public-contracts/subscription-contract-v1.schema.json +76 -0
  590. package/schemas/scoped-project-verification-receipt-v2.schema.json +83 -0
  591. package/schemas/scoped-project-verification-receipt-v3.schema.json +295 -0
  592. package/schemas/scoped-verification-receipt-v1.schema.json +76 -0
  593. package/schemas/task-contract.schema.json +30 -0
  594. package/scripts/approve-independent-verification.mjs +57 -0
  595. package/scripts/benchmark-arm-observer.mjs +320 -0
  596. package/scripts/benchmark-budget-ipc.mjs +34 -0
  597. package/scripts/benchmark-budget-launcher.mjs +91 -0
  598. package/scripts/benchmark-budget-processes.mjs +133 -0
  599. package/scripts/benchmark-budget-publication.mjs +228 -0
  600. package/scripts/benchmark-budget-runtime.mjs +136 -0
  601. package/scripts/benchmark-candidate-ablation.mjs +265 -0
  602. package/scripts/benchmark-codex-journey.mjs +406 -0
  603. package/scripts/benchmark-independent-verification.mjs +628 -0
  604. package/scripts/benchmark-journey-outcome.mjs +92 -0
  605. package/scripts/benchmark-production-v3-human-review.mjs +192 -0
  606. package/scripts/benchmark-public-input-catalog.mjs +158 -0
  607. package/scripts/benchmark-registered-plan-author.mjs +355 -0
  608. package/scripts/benchmark-registered-plan-recipe-support.mjs +85 -0
  609. package/scripts/benchmark-registered-plan-recipes-backend.mjs +165 -0
  610. package/scripts/benchmark-registered-plan-recipes-data.mjs +164 -0
  611. package/scripts/benchmark-registered-plan-recipes-platform.mjs +165 -0
  612. package/scripts/benchmark-runner-completion.mjs +133 -0
  613. package/scripts/benchmark-runner-configuration.mjs +159 -0
  614. package/scripts/benchmark-runner-core.mjs +217 -388
  615. package/scripts/benchmark-runner-finalization.mjs +140 -27
  616. package/scripts/benchmark-runner-provider-boundary.mjs +44 -0
  617. package/scripts/benchmark-runner-schedule.mjs +256 -0
  618. package/scripts/benchmark-runner-support.mjs +136 -4
  619. package/scripts/benchmark-runner.mjs +95 -18
  620. package/scripts/benchmark-scoped-broker-custody.mjs +483 -0
  621. package/scripts/benchmark-scoped-docs-verifier.mjs +203 -0
  622. package/scripts/benchmark-scoped-frozen-qualification.mjs +676 -0
  623. package/scripts/benchmark-scoped-pi-router.mjs +196 -0
  624. package/scripts/benchmark-scoped-project-verification-receipt.mjs +49 -0
  625. package/scripts/benchmark-scoped-project-verifier.mjs +461 -0
  626. package/scripts/benchmark-scoped-session-custody.mjs +599 -0
  627. package/scripts/benchmark-scoped-session-factory.mjs +342 -0
  628. package/scripts/benchmark-scoped-tool-broker.mjs +523 -0
  629. package/scripts/benchmark-scoped-verification-supervisor.mjs +773 -0
  630. package/scripts/benchmark-session-evaluator.mjs +169 -0
  631. package/scripts/benchmark-session-provider-boundary.mjs +62 -0
  632. package/scripts/benchmark-session-usage.mjs +28 -0
  633. package/scripts/benchmark-session.mjs +343 -50
  634. package/scripts/benchmark-webui-journey.mjs +678 -0
  635. package/scripts/check-public-wording.mjs +46 -0
  636. package/scripts/configure-model-scope.sh +6 -2
  637. package/scripts/fs4-readiness-evaluation.mjs +7 -1
  638. package/scripts/install-global.sh +2 -2
  639. package/scripts/model-route-evaluation-core.ts +1 -0
  640. package/scripts/phase-tools-evaluation.mjs +1 -0
  641. package/scripts/pi-auto.sh +7 -1
  642. package/scripts/pi-model-route.mjs +1 -1
  643. package/scripts/pi-usage-history.mjs +201 -11
  644. package/scripts/piagent-cli.mjs +8 -0
  645. package/scripts/private-holdout-readiness.mjs +7 -1
  646. package/scripts/public-evaluation-exposure.mjs +140 -0
  647. package/scripts/select-independent-verification.mjs +62 -0
  648. package/scripts/setup.sh +2 -2
  649. package/scripts/typescript-loader.mjs +135 -1
  650. package/scripts/update-global.mjs +6 -7
  651. package/scripts/verify-local.sh +37 -56
  652. package/scripts/verify-release-identity.mjs +5 -3
  653. package/templates/global/settings.json +5 -1
  654. package/packages/piagent-webui/dist/client/assets/index-CgOEyRPG.js +0 -176
@@ -1,94 +1,52 @@
1
1
  import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ import {
3
+ WORKFLOW_OPTIONS,
4
+ type WorkflowId,
5
+ resolveWorkflowId,
6
+ workflowCommandNames,
7
+ workflowHelpLines,
8
+ workflowOption
9
+ } from "../workflows/webui-workflow.ts";
10
+ import { buildOnboardingWorkflowPrompt, buildWorkflowFollowUp } from "../workflows/workflow-follow-up.ts";
11
+
12
+ import type { TaskContract } from "../../extensions/guard-types.js";
13
+ import { activeSessionTask } from "../../extensions/task-state.js";
14
+ import { isUncertainSendContinuation, terminalUncertainSendReceipt } from "../session/uncertain-send-continuation.ts";
2
15
 
3
16
  type ExtensionContext = any;
4
17
 
5
18
  export function registerWorkflowCommands(pi: ExtensionAPI, deps: Record<string, any>): any {
6
19
  const {
7
- FRESH_COMMAND_ACTIONS, FRESH_COMMAND_HELP, ONBOARDING_COMMAND_ACTIONS, WORKFLOW_COMMAND_EXCLUSIONS, buildContextIndexStatus,
20
+ ONBOARDING_COMMAND_ACTIONS, WORKFLOW_COMMAND_EXCLUSIONS, buildContextIndexStatus,
8
21
  buildUsageSnapshot, commandArgs, emitProfileStatus, emitProfileTechStatus, emitRuntimeMessage,
9
22
  fs, loadProfileFromContext, prefixCompletions, projectContextFilePath, projectProfilePath,
10
23
  registerRuntimeCommand, resolveMemorySettings, runProfileTechWizard, selectRuntimeAction, sendWorkflowFollowUp,
11
24
  freshRequestParts, shortTaskLabel, techStackPath
12
25
  } = deps;
13
- type WorkflowCommandName = "task" | "scout" | "be-to-fe" | "discuss" | "plan" | "review" | "platform-improve" | "commit" | "pr" | "onboard";
14
-
15
- const WORKFLOW_ALIASES: Record<string, WorkflowCommandName> = {
16
- task: "task",
17
- implement: "task",
18
- scout: "scout",
19
- audit: "scout",
20
- "be-to-fe": "be-to-fe",
21
- befe: "be-to-fe",
22
- discuss: "discuss",
23
- clarify: "discuss",
24
- plan: "plan",
25
- review: "review",
26
- "platform-improve": "platform-improve",
27
- platform: "platform-improve",
28
- commit: "commit",
29
- pr: "pr",
30
- onboard: "onboard",
31
- "onboard-project": "onboard"
32
- };
33
-
34
26
  function workflowChoices(): Array<{ value: string; label: string; description: string; recommended?: boolean }> {
35
27
  return [
36
- { value: "task", label: "Task", description: "Implement a bounded task", recommended: true },
37
- { value: "scout", label: "Scout", description: "Read-only audit/research" },
38
- { value: "be-to-fe", label: "BE to FE", description: "Backend read-only, frontend implementation" },
39
- { value: "discuss", label: "Discuss", description: "Clarify before planning/editing" },
40
- { value: "plan", label: "Plan", description: "Create an implementation plan" },
41
- { value: "review", label: "Review", description: "Review diff/source read-only" },
42
- { value: "commit", label: "Commit", description: "Guarded local commit workflow" },
43
- { value: "pr", label: "PR", description: "Guarded pull request preparation" },
44
- { value: "onboard", label: "Onboard", description: "First-read project onboarding scout" },
45
- { value: "platform-improve", label: "Platform", description: "Improve Pi Agent Platform itself" },
28
+ ...WORKFLOW_OPTIONS.map((option) => ({
29
+ value: option.id,
30
+ label: option.label,
31
+ description: option.description,
32
+ ...(option.id === "task" ? { recommended: true } : {})
33
+ })),
46
34
  { value: "help", label: "Help", description: "Show typed workflow forms" }
47
35
  ];
48
36
  }
49
37
 
50
- function buildOnboardingWorkflowPrompt(focus: string): string {
51
- return [
52
- "Run the Pi Agent Platform first-read onboarding workflow for this repository.",
53
- "",
54
- `Optional focus: ${focus.trim() || "whole repository"}`,
55
- "",
56
- "Preconditions:",
57
- "- The operator has logged in and selected the intended model/thinking level.",
58
- "- Stay read-only except writing Piagent onboarding state through piagent tools.",
59
- "",
60
- "Mandatory flow:",
61
- "1. Call piagent_context with detail=full.",
62
- "2. If the project is unprofiled, call piagent_profile_options, do a lightweight root scout, recommend a profile, and use piagent_profile_apply only after the operator choice is clear.",
63
- "3. Prefer /profile setup or piagent_profile_tech_options + piagent_profile_tech_apply for tech stack selection.",
64
- "4. Re-call piagent_context after profile/tech changes.",
65
- "5. Call piagent_memory_status and treat memory as advisory.",
66
- "6. Read AGENTS.md, README/package/build config, required context, docs/architecture files, source map, and verify command definitions. Do not ingest the whole repo.",
67
- "7. Identify project purpose, stack/runtime, ownership boundaries, high-risk areas, protected paths, verify commands, MCP/tool capabilities, selected tech stack, memory policy, and conventions.",
68
- "8. Write a concise .pi/project-context.md snapshot and record it with piagent_project_onboarding_record so .pi/context-index.json is generated.",
69
- "9. Call piagent_context_index_status and report pending/stale warnings.",
70
- "",
71
- "Final output: profile, tech stack, context files read, verification matrix, high-risk areas, context-index status, memory status, and any missing operator decisions."
72
- ].join("\n");
73
- }
74
-
75
38
  function emitWorkflowHelp(ctx: ExtensionContext): void {
76
- emitRuntimeMessage(ctx, "piagent-workflow-help", [
77
- "namespace: /workflow",
78
- "daily: /workflow task <request>",
79
- "readOnly: /workflow scout <area/spec/risk>",
80
- "beToFe: /workflow be-to-fe <BE spec/change + FE outcome>",
81
- "clarify: /workflow discuss <rough idea>",
82
- "plan: /workflow plan <goal>",
83
- "review: /workflow review <target or diff>",
84
- "git: /workflow commit [message] | /workflow pr [title]",
85
- "onboard: /workflow onboard [focus]",
86
- "aliases still work: /task, /scout, /be-to-fe, /commit, /pr"
87
- ].join("\n"), { workflows: workflowChoices().map((choice) => choice.value) });
39
+ emitRuntimeMessage(ctx, "piagent-workflow-help", workflowHelpLines().join("\n"), {
40
+ workflows: WORKFLOW_OPTIONS.map((option) => option.id)
41
+ });
88
42
  }
89
43
 
90
44
  async function runWorkflowNamespace(raw: string, ctx: ExtensionContext): Promise<void> {
91
45
  const { action, rest } = commandArgs(raw);
46
+ if (action === "help") {
47
+ emitWorkflowHelp(ctx);
48
+ return;
49
+ }
92
50
  if (!action) {
93
51
  const chosen = await selectRuntimeAction(ctx, "Piagent workflow", workflowChoices(), "task");
94
52
  if (!chosen || chosen === "help") {
@@ -107,8 +65,8 @@ export function registerWorkflowCommands(pi: ExtensionAPI, deps: Record<string,
107
65
  ].join("\n"), { workflow: chosen });
108
66
  return;
109
67
  }
110
- const workflow = WORKFLOW_ALIASES[action];
111
- if (!workflow || workflow === undefined) {
68
+ const workflow = resolveWorkflowId(action);
69
+ if (!workflow) {
112
70
  emitRuntimeMessage(ctx, "piagent-workflow-error", `unknown workflow: ${action}\nRun /workflow help`, { action }, { message: `Unknown workflow: ${action}`, level: "warning" });
113
71
  return;
114
72
  }
@@ -117,7 +75,7 @@ export function registerWorkflowCommands(pi: ExtensionAPI, deps: Record<string,
117
75
  ctx.ui.notify("Workflow launched: onboard", "info");
118
76
  return;
119
77
  }
120
- if (!rest.trim()) {
78
+ if (!rest.trim() && workflowOption(workflow)?.requestRequired !== false) {
121
79
  emitRuntimeMessage(ctx, "piagent-workflow-needs-request", [
122
80
  `workflow: ${workflow}`,
123
81
  `run: /workflow ${workflow} <request>`,
@@ -125,7 +83,13 @@ export function registerWorkflowCommands(pi: ExtensionAPI, deps: Record<string,
125
83
  ].join("\n"), { workflow });
126
84
  return;
127
85
  }
128
- sendWorkflowFollowUp(`/${workflow} ${rest}`);
86
+ // Namespace commands run before the input hook. Recover a current durable
87
+ // receipt here so their deferred extension prompt cannot open a model turn.
88
+ if (isUncertainSendContinuation(rest) && ctx.isIdle()) {
89
+ const receipt = terminalUncertainSendReceipt(ctx.cwd, activeSessionTask(ctx.cwd, ctx.sessionManager.getSessionId()) as TaskContract | undefined);
90
+ if (receipt) { emitRuntimeMessage(ctx, receipt.customType, receipt.content, receipt.details); return; }
91
+ }
92
+ sendWorkflowFollowUp(buildWorkflowFollowUp(workflow, rest));
129
93
  ctx.ui.notify(`Workflow launched: ${workflow}`, "info");
130
94
  }
131
95
 
@@ -150,20 +114,16 @@ export function registerWorkflowCommands(pi: ExtensionAPI, deps: Record<string,
150
114
  const sections: Record<string, string[]> = {
151
115
  overview: [
152
116
  "Piagent command surface:",
153
- "runtime: /workflow | /piagent-inspector | /usage | /context | /permission | /commands | /profile | /memory | /onboard | /fresh",
117
+ "runtime: /workflow | /piagent-inspector | /usage | /context | /permission | /fast | /commands | /profile | /memory | /onboard | /fresh",
154
118
  "native: /model | /name | /session | /resume | /compact | /mcp",
155
- "workflow: /workflow task|scout|be-to-fe|review|commit|pr <request>",
119
+ `workflow: /workflow ${WORKFLOW_OPTIONS.map((option) => option.id).join("|")} <request>`,
156
120
  "mcp: /mcp is Pi native; governed MCP checks stay at /piagent-mcp to avoid collision",
157
121
  "legacy: /piagent-* commands still work where they existed",
158
122
  "principle: runtime commands run immediately; workflows intentionally launch an agent turn"
159
123
  ],
160
124
  workflow: [
161
125
  "Workflow entrypoint:",
162
- "/workflow",
163
- "/workflow task <request>",
164
- "/workflow scout <read-only request>",
165
- "/workflow be-to-fe <BE spec/change + FE outcome>",
166
- "/workflow onboard [focus]"
126
+ ...workflowHelpLines()
167
127
  ],
168
128
  usage: [
169
129
  "Usage/session:",
@@ -171,7 +131,7 @@ export function registerWorkflowCommands(pi: ExtensionAPI, deps: Record<string,
171
131
  "/piagent-inspector",
172
132
  "/usage history",
173
133
  "Pi native: /name <task name>",
174
- "/fresh task|scout|be-to-fe <request>",
134
+ `/fresh ${WORKFLOW_OPTIONS.map((option) => option.id).join("|")} <request>`,
175
135
  "native: /session | /resume"
176
136
  ],
177
137
  context: [
@@ -193,8 +153,16 @@ export function registerWorkflowCommands(pi: ExtensionAPI, deps: Record<string,
193
153
  "Model:",
194
154
  "/model or Ctrl+L opens Pi native selector",
195
155
  "/model-options shows local Piagent model guidance",
156
+ "/fast status|on|off controls the OpenAI Codex Fast service tier without changing model/thinking",
196
157
  "Ctrl+P cycles model scope; Shift+Tab cycles thinking"
197
158
  ],
159
+ fast: [
160
+ "Fast service tier:",
161
+ "/fast status",
162
+ "/fast on",
163
+ "/fast off",
164
+ "Fast is a zero-model-turn session setting; model/thinking stay unchanged and provider quota or pricing may differ"
165
+ ],
198
166
  memory: [
199
167
  "Memory:",
200
168
  "/memory",
@@ -240,6 +208,7 @@ export function registerWorkflowCommands(pi: ExtensionAPI, deps: Record<string,
240
208
  { value: "context", label: "Context", description: "Index/search/preflight/compact" },
241
209
  { value: "permission", label: "Permission", description: "Read/write/full access controls" },
242
210
  { value: "model", label: "Model", description: "Native model selector and thinking" },
211
+ { value: "fast", label: "Fast mode", description: "Status and OpenAI Codex Fast service tier control" },
243
212
  { value: "mcp", label: "MCP", description: "Governed MCP commands" },
244
213
  { value: "subagents", label: "Subagents", description: "Health, fleet, cost" },
245
214
  { value: "terminal", label: "Terminal", description: "piagent-* helpers" }
@@ -339,7 +308,7 @@ export function registerWorkflowCommands(pi: ExtensionAPI, deps: Record<string,
339
308
  registerRuntimeCommand(pi, "workflow", {
340
309
  description: "One menu for Piagent task, scout, review, git, and onboarding workflows",
341
310
  getArgumentCompletions: (prefix: string) => prefixCompletions(
342
- Object.keys(WORKFLOW_ALIASES).filter((name) => !WORKFLOW_COMMAND_EXCLUSIONS.includes(name)),
311
+ workflowCommandNames().filter((name) => !WORKFLOW_COMMAND_EXCLUSIONS.includes(name)),
343
312
  prefix
344
313
  ),
345
314
  handler: async (args, ctx) => {
@@ -376,16 +345,16 @@ export function registerWorkflowCommands(pi: ExtensionAPI, deps: Record<string,
376
345
  handler: async (args, ctx) => runOnboardingCommand(String(args ?? ""), ctx)
377
346
  });
378
347
 
379
- async function startFreshWorkflow(workflow: "task" | "scout" | "be-to-fe", args: string, ctx: any) {
348
+ async function startFreshWorkflow(workflow: WorkflowId, args: string, ctx: any) {
380
349
  const parsed = freshRequestParts(String(args ?? ""));
381
350
  const request = parsed.request;
382
- if (!request) {
351
+ if (!request && workflowOption(workflow)?.requestRequired !== false) {
383
352
  ctx.ui.notify(`Usage: /fresh ${workflow} <request>`, "warning");
384
353
  return;
385
354
  }
386
355
 
387
- const label = parsed.sessionTitle ?? shortTaskLabel(request);
388
- const command = `/${workflow} ${request}`;
356
+ const label = parsed.sessionTitle ?? shortTaskLabel(request || workflow);
357
+ const command = [`/${workflow}`, request].filter(Boolean).join(" ");
389
358
  const result = await ctx.newSession({
390
359
  withSession: async (nextCtx) => {
391
360
  pi.setSessionName(`pi:${label}`);
@@ -398,18 +367,20 @@ export function registerWorkflowCommands(pi: ExtensionAPI, deps: Record<string,
398
367
  }
399
368
 
400
369
  registerRuntimeCommand(pi, "fresh", {
401
- description: "Open a fresh governed session for task, scout, or BE-to-FE work",
402
- getArgumentCompletions: (prefix: string) => prefixCompletions(FRESH_COMMAND_ACTIONS, prefix),
370
+ description: "Open a fresh governed session for any Piagent workflow",
371
+ getArgumentCompletions: (prefix: string) => prefixCompletions([...workflowCommandNames({ aliases: false }), "help"], prefix),
403
372
  handler: async (args, ctx) => {
404
373
  const { action, rest } = commandArgs(String(args ?? ""));
405
374
  if (!action || action === "help") {
406
- emitRuntimeMessage(ctx, "piagent-fresh-help", FRESH_COMMAND_HELP.join("\n"));
375
+ emitRuntimeMessage(ctx, "piagent-fresh-help", [
376
+ "namespace: /fresh",
377
+ ...WORKFLOW_OPTIONS.map((option) => `/fresh ${option.id} ${option.argumentHint}`)
378
+ ].join("\n"));
407
379
  return;
408
380
  }
409
- const workflow = action === "be-to-fe" ? "be-to-fe" : action === "scout" ? "scout" : "task";
410
- const request = action === "task" || action === "scout" || action === "be-to-fe"
411
- ? rest
412
- : [action, rest].filter(Boolean).join(" ");
381
+ const resolved = resolveWorkflowId(action);
382
+ const workflow = resolved ?? "task";
383
+ const request = resolved ? rest : [action, rest].filter(Boolean).join(" ");
413
384
  await startFreshWorkflow(workflow, request, ctx);
414
385
  }
415
386
  });
@@ -0,0 +1,23 @@
1
+ function normalizeLanguageSignal(text: string): string {
2
+ // Preserve the Vietnamese progressive phrase before removing tone marks.
3
+ // Without this, both "đang làm" (still working) and "đáng làm" (worth doing)
4
+ // collapse to `dang lam`, so a perfectly final heading such as
5
+ // "Các ứng dụng đáng làm" is misclassified as an incomplete handoff.
6
+ const progressive = text.normalize("NFC").toLowerCase().replace(/đang\s+làm/gu, " piagent_in_progress ");
7
+ return progressive
8
+ .normalize("NFKD")
9
+ .replace(/\p{M}/gu, "")
10
+ .replaceAll("đ", "d");
11
+ }
12
+
13
+ export function looksLikeIncompleteHandoff(text: string): boolean {
14
+ const normalized = normalizeLanguageSignal(text);
15
+ return /\b(?:not done|not complete|not finished|still working|blocked|cannot complete|unable to complete|need clarification|tests? (?:fail|failed|failing)|verification (?:fail|failed|failing)|chua xong|chua hoan tat|chua hoan thanh|piagent_in_progress|(?:van|piagent|agent|em|toi|minh|chung toi) dang (?:lam|xu ly)|bi chan|can lam them|test (?:loi|fail))\b/.test(normalized);
16
+ }
17
+
18
+ export function looksLikeCompletionClaim(text: string): boolean {
19
+ const normalized = normalizeLanguageSignal(text);
20
+ if (!normalized.trim() || normalized.includes("[piagent completion gate:")) return false;
21
+ if (looksLikeIncompleteHandoff(text)) return false;
22
+ return /\b(?:done|completed|complete|finished|fixed|implemented|resolved|shipped|all tests pass(?:ed)?|tests? pass(?:ed)?|da xong|da sua|da fix|da hoan tat|da hoan thanh|da trien khai|test da pass|kiem tra da pass|ready\b[\s\S]{0,48}\b(?:test|review|use|ship)|san sang\b[\s\S]{0,48}\b(?:test|kiem tra|su dung))\b/.test(normalized);
23
+ }
@@ -1,5 +1,7 @@
1
1
  import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
2
2
 
3
+ export { looksLikeCompletionClaim, looksLikeIncompleteHandoff } from "./completion-signals.ts";
4
+
3
5
  export function assistantMessageText(message: unknown): string {
4
6
  if (!message || typeof message !== "object" || (message as { role?: unknown }).role !== "assistant") return "";
5
7
  const content = (message as { content?: unknown }).content;
@@ -15,28 +17,10 @@ export function assistantMessageHasToolCall(message: unknown): boolean {
15
17
  return Array.isArray(content) && content.some((item) => item && typeof item === "object" && (item as { type?: unknown }).type === "toolCall");
16
18
  }
17
19
 
18
- function normalizeLanguageSignal(text: string): string {
19
- // Preserve the Vietnamese progressive phrase before removing tone marks.
20
- // Without this, both "đang làm" (still working) and "đáng làm" (worth doing)
21
- // collapse to `dang lam`, so a perfectly final heading such as
22
- // "Các ứng dụng đáng làm" is misclassified as an incomplete handoff.
23
- const progressive = text.normalize("NFC").toLowerCase().replace(/đang\s+làm/gu, " piagent_in_progress ");
24
- return progressive
25
- .normalize("NFKD")
26
- .replace(/\p{M}/gu, "")
27
- .replaceAll("đ", "d");
28
- }
29
-
30
- export function looksLikeIncompleteHandoff(text: string): boolean {
31
- const normalized = normalizeLanguageSignal(text);
32
- return /\b(?:not done|not complete|not finished|still working|blocked|cannot complete|unable to complete|need clarification|tests? (?:fail|failed|failing)|verification (?:fail|failed|failing)|chua xong|chua hoan tat|chua hoan thanh|piagent_in_progress|(?:van|piagent|agent|em|toi|minh|chung toi) dang (?:lam|xu ly)|bi chan|can lam them|test (?:loi|fail))\b/.test(normalized);
33
- }
34
-
35
- export function looksLikeCompletionClaim(text: string): boolean {
36
- const normalized = normalizeLanguageSignal(text);
37
- if (!normalized.trim() || normalized.includes("[piagent completion gate:")) return false;
38
- if (looksLikeIncompleteHandoff(text)) return false;
39
- return /\b(?:done|completed|complete|finished|fixed|implemented|resolved|shipped|all tests pass(?:ed)?|tests? pass(?:ed)?|da xong|da sua|da fix|da hoan tat|da hoan thanh|da trien khai|test da pass|kiem tra da pass)\b/.test(normalized);
20
+ export function prependAssistantNotice<T extends { content?: unknown }>(message: T, notice: string) {
21
+ const content = Array.isArray(message.content) ? [{ type: "text" as const, text: notice }, ...message.content]
22
+ : [{ type: "text" as const, text: `${notice}${typeof message.content === "string" ? message.content : assistantMessageText(message)}` }];
23
+ return { ...message, content };
40
24
  }
41
25
 
42
26
  export function modelLabel(ctx: ExtensionContext): string {
@@ -0,0 +1,188 @@
1
+ import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
2
+
3
+ export const RETRIEVAL_EVIDENCE_VERSION = "retrieval-evidence-v1" as const;
4
+ export const RETRIEVAL_EVIDENCE_TOOLS = new Set(["read", "grep", "find", "ls"]);
5
+
6
+ export type RetrievalEvidenceObservation = {
7
+ toolName: string;
8
+ callFingerprint: string;
9
+ outputHash: string;
10
+ target?: string;
11
+ deterministicMiss?: boolean;
12
+ nonEvidenceFailure?: boolean;
13
+ };
14
+
15
+ export type RetrievalEvidenceCheckpoint = {
16
+ version: typeof RETRIEVAL_EVIDENCE_VERSION;
17
+ reason: "evidence-checkpoint" | "evidence-saturated";
18
+ calls: number;
19
+ uniqueCalls: number;
20
+ repeatedCalls: number;
21
+ uniqueTargets: number;
22
+ deterministicMisses: number;
23
+ noNovelEvidenceStreak: number;
24
+ generation: number;
25
+ generationCalls: number;
26
+ text: string;
27
+ };
28
+
29
+ type RetrievalTurnState = {
30
+ turnId?: string;
31
+ calls: number;
32
+ repeatedCalls: number;
33
+ deterministicMisses: number;
34
+ noNovelEvidenceStreak: number;
35
+ generation: number;
36
+ generationCalls: number;
37
+ adviceCount: number;
38
+ lastAdviceAt: number;
39
+ // Operation-wide sets keep the accounting truthful across a mutation. The
40
+ // generation-local sets below decide whether a result is fresh for the
41
+ // current tree revision.
42
+ callFingerprints: Set<string>;
43
+ generationCallFingerprints: Set<string>;
44
+ outputHashes: Set<string>;
45
+ targets: Set<string>;
46
+ generationTargets: Set<string>;
47
+ };
48
+
49
+ function newState(generation = 0, turnId?: string): RetrievalTurnState {
50
+ return {
51
+ turnId,
52
+ calls: 0,
53
+ repeatedCalls: 0,
54
+ deterministicMisses: 0,
55
+ noNovelEvidenceStreak: 0,
56
+ generation,
57
+ generationCalls: 0,
58
+ adviceCount: 0,
59
+ lastAdviceAt: 0,
60
+ callFingerprints: new Set(),
61
+ generationCallFingerprints: new Set(),
62
+ outputHashes: new Set(),
63
+ targets: new Set(),
64
+ generationTargets: new Set()
65
+ };
66
+ }
67
+
68
+ function sessionKey(ctx: ExtensionContext): string {
69
+ return `${ctx.cwd}\u0000${ctx.sessionManager.getSessionId()}`;
70
+ }
71
+
72
+ function boundedTarget(value: string | undefined): string | undefined {
73
+ const normalized = String(value ?? "").replace(/\s+/g, " ").trim();
74
+ if (!normalized) return undefined;
75
+ return normalized.length <= 512
76
+ ? normalized
77
+ : `${normalized.slice(0, 255)}…${normalized.slice(-256)}`;
78
+ }
79
+
80
+ function checkpointText(checkpoint: Omit<RetrievalEvidenceCheckpoint, "text">): string {
81
+ const prefix = checkpoint.reason === "evidence-saturated"
82
+ ? "Piagent retrieval saturation"
83
+ : "Piagent retrieval checkpoint";
84
+ return `[${prefix}: ${checkpoint.calls} calls; ${checkpoint.uniqueCalls} unique; ${checkpoint.repeatedCalls} repeated; ${checkpoint.deterministicMisses} deterministic misses; ${checkpoint.uniqueTargets} targets. `
85
+ + "If the acceptance criteria are covered, stop broad scouting and synthesize now. Continue only for a named unresolved criterion, a concrete contradiction, or a required focused test. Do not repeat an exact call, revisit a known-missing target, or batch patterns against an unconfirmed target.]";
86
+ }
87
+
88
+ /**
89
+ * Tracks evidence novelty for one operator operation. It never blocks a new
90
+ * source path: the model keeps its full reasoning/retrieval capability. The
91
+ * runtime only emits bounded checkpoints when search becomes long or stops
92
+ * producing new evidence.
93
+ */
94
+ export class RetrievalEvidenceRuntime {
95
+ readonly #states = new Map<string, RetrievalTurnState>();
96
+
97
+ beginTurn(ctx: ExtensionContext, turnId?: string): void {
98
+ const key = sessionKey(ctx);
99
+ this.#states.set(key, newState(0, turnId));
100
+ while (this.#states.size > 100) this.#states.delete(this.#states.keys().next().value as string);
101
+ }
102
+
103
+ invalidateAfterMutation(ctx: ExtensionContext, turnId?: string): void {
104
+ const key = sessionKey(ctx);
105
+ const current = this.#states.get(key);
106
+ const prior = current && (!turnId || !current.turnId || current.turnId === turnId)
107
+ ? current
108
+ : newState(0, turnId);
109
+ if (turnId && !prior.turnId) prior.turnId = turnId;
110
+ // Keep the operation totals so a mutation cannot erase token accounting,
111
+ // but clear novelty/negative evidence because the working tree changed.
112
+ prior.generation += 1;
113
+ prior.generationCalls = 0;
114
+ prior.noNovelEvidenceStreak = 0;
115
+ prior.adviceCount = 0;
116
+ prior.lastAdviceAt = 0;
117
+ prior.generationCallFingerprints.clear();
118
+ prior.outputHashes.clear();
119
+ prior.generationTargets.clear();
120
+ this.#states.set(key, prior);
121
+ }
122
+
123
+ clearSession(ctx: ExtensionContext): void {
124
+ this.#states.delete(sessionKey(ctx));
125
+ }
126
+
127
+ observe(
128
+ ctx: ExtensionContext,
129
+ observation: RetrievalEvidenceObservation,
130
+ turnId?: string
131
+ ): RetrievalEvidenceCheckpoint | undefined {
132
+ const toolName = String(observation.toolName ?? "").toLowerCase();
133
+ if (!RETRIEVAL_EVIDENCE_TOOLS.has(toolName)) return undefined;
134
+ const key = sessionKey(ctx);
135
+ const current = this.#states.get(key);
136
+ const state = current && (!turnId || !current.turnId || current.turnId === turnId)
137
+ ? current
138
+ : newState(0, turnId);
139
+ if (turnId && !state.turnId) state.turnId = turnId;
140
+ this.#states.set(key, state);
141
+
142
+ state.calls += 1;
143
+ state.generationCalls += 1;
144
+ const target = boundedTarget(observation.target);
145
+ const repeatedAcrossOperation = state.callFingerprints.has(observation.callFingerprint);
146
+ const repeatedCall = state.generationCallFingerprints.has(observation.callFingerprint);
147
+ const repeatedOutput = Boolean(observation.outputHash) && state.outputHashes.has(observation.outputHash);
148
+ const knownTarget = target ? state.generationTargets.has(target) : false;
149
+ if (repeatedAcrossOperation) state.repeatedCalls += 1;
150
+ if (observation.deterministicMiss) state.deterministicMisses += 1;
151
+
152
+ const novel = !observation.nonEvidenceFailure
153
+ && !repeatedCall
154
+ && !observation.deterministicMiss
155
+ && (!repeatedOutput || !knownTarget);
156
+ state.noNovelEvidenceStreak = novel ? 0 : state.noNovelEvidenceStreak + 1;
157
+ state.callFingerprints.add(observation.callFingerprint);
158
+ state.generationCallFingerprints.add(observation.callFingerprint);
159
+ if (observation.outputHash) state.outputHashes.add(observation.outputHash);
160
+ if (target) {
161
+ state.targets.add(target);
162
+ state.generationTargets.add(target);
163
+ }
164
+
165
+ const saturated = state.noNovelEvidenceStreak >= 4;
166
+ const periodic = state.generationCalls >= 32 && state.generationCalls % 32 === 0;
167
+ const enoughDistance = state.adviceCount === 0
168
+ ? state.generationCalls >= 4
169
+ : state.generationCalls - state.lastAdviceAt >= 8;
170
+ if (state.adviceCount >= 4 || !enoughDistance || (!saturated && !periodic)) return undefined;
171
+
172
+ state.adviceCount += 1;
173
+ state.lastAdviceAt = state.generationCalls;
174
+ const checkpoint = {
175
+ version: RETRIEVAL_EVIDENCE_VERSION,
176
+ reason: saturated ? "evidence-saturated" as const : "evidence-checkpoint" as const,
177
+ calls: state.calls,
178
+ uniqueCalls: state.callFingerprints.size,
179
+ repeatedCalls: state.repeatedCalls,
180
+ uniqueTargets: state.targets.size,
181
+ deterministicMisses: state.deterministicMisses,
182
+ noNovelEvidenceStreak: state.noNovelEvidenceStreak,
183
+ generation: state.generation,
184
+ generationCalls: state.generationCalls
185
+ };
186
+ return { ...checkpoint, text: checkpointText(checkpoint) };
187
+ }
188
+ }
@@ -1,8 +1,11 @@
1
1
  import crypto from "node:crypto";
2
+ export { createHostWireSession, observeHostWireInput, HOST_WIRE_PHASE_EDGES } from "../trajectory/trajectory-runtime.ts";
3
+ export type { HostWireSession, HostWireSessionOptions, HostWireOperation } from "../trajectory/trajectory-runtime.ts";
2
4
  import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
3
5
  import { isRuntimeOwnedContextEvidenceEntry } from "../../extensions/context-evidence.js";
4
6
  import { toolResultFingerprint } from "../../extensions/context-engine.js";
5
- import { workingTreeSnapshot } from "../../extensions/task-state.js";
7
+ import { ShellVerificationSnapshots } from "../verification/shell-verification-snapshots.ts";
8
+ import { HostProjectVerification } from "../verification/host-project-verification.ts";
6
9
  import type { TaskContract } from "../../extensions/guard-types.ts";
7
10
  import type { RecoveryHistoryEntry } from "../recovery/recovery-policy.ts";
8
11
  import type { ResumeState } from "../recovery/resume-state.ts";
@@ -65,7 +68,7 @@ export type PendingContextDelivery = {
65
68
  pack?: InjectedContextPack & { retrievalKey: string };
66
69
  injection?: ContextInjectionTelemetry;
67
70
  };
68
- export type RuntimeTurn = { turnId: string; promptHash: string };
71
+ export type RuntimeTurn = { turnId: string; promptHash: string; lightweightNonAuthorizingChange: boolean };
69
72
 
70
73
  function evictOldest<K, V>(map: Map<K, V>, maximum: number): void {
71
74
  while (map.size > maximum) map.delete(map.keys().next().value as K);
@@ -88,16 +91,13 @@ export class RuntimeSessionState {
88
91
  readonly #observedContextBySession = new Map<string, Map<string, ObservedTaskContext>>();
89
92
  readonly #preTaskContextBySession = new Map<string, { turnId: string; entries: Map<string, ObservedTaskContext> }>();
90
93
  readonly #qualifiedContextEvidenceByTask = new Map<string, Map<string, ObservedTaskContext>>();
91
- readonly #shellMutationSnapshots = new Map<string, Record<string, string>>();
94
+ readonly #shellMutationSnapshots = new ShellVerificationSnapshots();
95
+ readonly projectVerification = new HostProjectVerification(this.#shellMutationSnapshots);
92
96
  readonly #sourceCheckoutReadGrants = new SourceCheckoutReadGrants();
93
97
 
94
- constructor(options: { maxObservedContext: number }) {
95
- this.#maxObservedContext = options.maxObservedContext;
96
- }
98
+ constructor(options: { maxObservedContext: number }) { this.#maxObservedContext = options.maxObservedContext; }
97
99
 
98
- sessionKey(ctx: ExtensionContext): string {
99
- return `${ctx.cwd}\u0000${ctx.sessionManager.getSessionId()}`;
100
- }
100
+ sessionKey(ctx: ExtensionContext): string { return `${ctx.cwd}\u0000${ctx.sessionManager.getSessionId()}`; }
101
101
 
102
102
  cacheTaskIdentity(ctx: ExtensionContext, task: TaskContract | undefined): void {
103
103
  const key = this.sessionKey(ctx);
@@ -107,11 +107,10 @@ export class RuntimeSessionState {
107
107
  }
108
108
 
109
109
  taskIdentity(ctx: ExtensionContext): { taskId: string; taskRunId: string } | undefined {
110
- return this.#taskIdentityBySession.get(this.sessionKey(ctx));
111
- }
110
+ return this.#taskIdentityBySession.get(this.sessionKey(ctx)); }
112
111
 
113
- beginTurn(ctx: ExtensionContext, promptHash: string): RuntimeTurn {
114
- const turn = { turnId: crypto.randomUUID(), promptHash };
112
+ beginTurn(ctx: ExtensionContext, promptHash: string, classification: { lightweightNonAuthorizingChange?: boolean } = {}): RuntimeTurn {
113
+ const turn = { turnId: crypto.randomUUID(), promptHash, lightweightNonAuthorizingChange: classification.lightweightNonAuthorizingChange === true };
115
114
  const sessionKey = this.sessionKey(ctx);
116
115
  this.#turnBySession.set(sessionKey, turn);
117
116
  this.#preTaskContextBySession.set(sessionKey, { turnId: turn.turnId, entries: new Map() });
@@ -125,10 +124,16 @@ export class RuntimeSessionState {
125
124
  return turn && (!promptHash || turn.promptHash === promptHash) ? { ...turn } : undefined;
126
125
  }
127
126
 
128
- hasAdvisedTool(ctx: ExtensionContext, toolName: string): boolean {
129
- return this.#advisedTools.has(`${this.sessionKey(ctx)}\u0000${toolName}`);
127
+ classifyTurn(ctx: ExtensionContext, promptHash: string, classification: { lightweightNonAuthorizingChange: boolean }): RuntimeTurn {
128
+ const turn = this.currentTurn(ctx, promptHash);
129
+ if (!turn) return this.beginTurn(ctx, promptHash, classification);
130
+ turn.lightweightNonAuthorizingChange = classification.lightweightNonAuthorizingChange;
131
+ this.#turnBySession.set(this.sessionKey(ctx), turn); return { ...turn };
130
132
  }
131
133
 
134
+ hasAdvisedTool(ctx: ExtensionContext, toolName: string): boolean {
135
+ return this.#advisedTools.has(`${this.sessionKey(ctx)}\u0000${toolName}`); }
136
+
132
137
  rememberAdvisedTool(ctx: ExtensionContext, toolName: string): void {
133
138
  this.#advisedTools.add(`${this.sessionKey(ctx)}\u0000${toolName}`);
134
139
  while (this.#advisedTools.size > 500) {
@@ -156,9 +161,7 @@ export class RuntimeSessionState {
156
161
  return this.#sourceCheckoutReadGrants.grant(this.sessionKey(ctx), checkoutPath);
157
162
  }
158
163
 
159
- sourceCheckoutReadRoots(ctx: ExtensionContext): string[] {
160
- return this.#sourceCheckoutReadGrants.roots(this.sessionKey(ctx));
161
- }
164
+ sourceCheckoutReadRoots(ctx: ExtensionContext): string[] { return this.#sourceCheckoutReadGrants.roots(this.sessionKey(ctx)); }
162
165
 
163
166
  rememberPreTaskContext(ctx: ExtensionContext, entry: ObservedTaskContext): void {
164
167
  const turn = this.currentTurn(ctx);
@@ -222,30 +225,21 @@ export class RuntimeSessionState {
222
225
  return [...(this.#qualifiedContextEvidenceByTask.get(key)?.values() ?? [])].map((entry) => structuredClone(entry));
223
226
  }
224
227
 
225
- #shellMutationSnapshotKey(ctx: ExtensionContext, toolName: string, input: unknown): string {
226
- return `${this.sessionKey(ctx)}\u0000${toolResultFingerprint(toolName, input, []).key}`;
228
+ rememberShellMutationSnapshot(ctx: ExtensionContext, toolName: string, input: unknown, toolCallId?: string): void {
229
+ this.#shellMutationSnapshots.remember(ctx, toolName, input, toolCallId, this.taskIdentity(ctx)?.taskRunId);
227
230
  }
228
231
 
229
- rememberShellMutationSnapshot(ctx: ExtensionContext, toolName: string, input: unknown): void {
230
- this.#shellMutationSnapshots.set(
231
- this.#shellMutationSnapshotKey(ctx, toolName, input),
232
- workingTreeSnapshot(ctx.cwd) as Record<string, string>
233
- );
234
- evictOldest(this.#shellMutationSnapshots, 100);
232
+ consumeShellMutationSnapshot(ctx: ExtensionContext, toolName: string, input: unknown): Record<string, string> | undefined {
233
+ return this.consumeShellVerificationSnapshot(ctx, toolName, input)?.snapshot as Record<string, string> | undefined;
235
234
  }
236
235
 
237
- consumeShellMutationSnapshot(ctx: ExtensionContext, toolName: string, input: unknown): Record<string, string> | undefined {
238
- const key = this.#shellMutationSnapshotKey(ctx, toolName, input);
239
- const snapshot = this.#shellMutationSnapshots.get(key);
240
- this.#shellMutationSnapshots.delete(key);
241
- return snapshot;
236
+ consumeShellVerificationSnapshot(ctx: ExtensionContext, toolName: string, input: unknown, toolCallId?: string) {
237
+ return this.#shellMutationSnapshots.consume(ctx, toolName, input, toolCallId, this.taskIdentity(ctx)?.taskRunId);
242
238
  }
243
239
 
244
240
  clearShellMutationSnapshots(ctx: ExtensionContext): void {
245
- const prefix = `${this.sessionKey(ctx)}\u0000`;
246
- for (const key of this.#shellMutationSnapshots.keys()) {
247
- if (key.startsWith(prefix)) this.#shellMutationSnapshots.delete(key);
248
- }
241
+ this.#shellMutationSnapshots.clear(ctx);
242
+ this.projectVerification.clear(ctx);
249
243
  }
250
244
 
251
245
  hasAutoPackedPrompt(key: string): boolean {