@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
@@ -0,0 +1,248 @@
1
+ import { protocolShape as shape, validateValue } from "./values.mjs";
2
+ import { MAX_SOURCE_BYTES, validateModuleGraph } from "./module-graph.mjs";
3
+ import { CASE_THREAD_CPU_MICROS } from "./budget.mjs";
4
+ import { CASE_CAPABILITY_FIELDS, OBSERVATION_CAPABILITY_FIELDS, callbackIds, validateCaseCapabilities, validateObservedCapabilities } from "./capabilities.mjs";
5
+ import { resolveArguments } from "./references.mjs";
6
+ import { expectedNodeProfile, MAX_TIMER_SCHEDULES, NODE_PROFILE_WORKER_VERSION } from "./node-profile.mjs";
7
+ import { validateInvocation } from "./invocation.mjs";
8
+ export { MAX_STRING_LENGTH, numberValue, validateValue } from "./values.mjs";
9
+
10
+ export const WORKER_VERSION = "quickjs-contract-worker-v9";
11
+ export const NODE_WORKER_VERSION = NODE_PROFILE_WORKER_VERSION;
12
+ export const MAX_REQUEST_BYTES = 512 * 1024;
13
+ export const MAX_RESPONSE_BYTES = 1024 * 1024;
14
+ const ID = /^[a-zA-Z0-9][a-zA-Z0-9:._-]{0,159}$/;
15
+ const EXPORT = /^[a-zA-Z_$][\w$]{0,127}$/;
16
+
17
+ export function parseRequest(text) {
18
+ if (typeof text !== "string" || Buffer.byteLength(text) > MAX_REQUEST_BYTES) throw new TypeError("Request size exceeded");
19
+ const request = JSON.parse(text);
20
+ const nodeProfile = request?.schemaVersion === 2;
21
+ shape(request, ["schemaVersion", "profile", "source", "exportName", "cases", "moduleGraph"],
22
+ nodeProfile ? ["schemaVersion", "profile", "source", "exportName", "cases"] : ["schemaVersion", "source", "exportName", "cases"]);
23
+ if (!nodeProfile && request.schemaVersion !== 1 || typeof request.source !== "string" || Buffer.byteLength(request.source) > MAX_SOURCE_BYTES
24
+ || typeof request.exportName !== "string" || !EXPORT.test(request.exportName)
25
+ || !Array.isArray(request.cases) || request.cases.length < 1 || request.cases.length > 256) throw new TypeError("Invalid execution request");
26
+ if (nodeProfile) {
27
+ shape(request.profile, ["id", "digest", "workerVersion"]);
28
+ const expected = expectedNodeProfile();
29
+ if (request.profile.id !== expected.id || request.profile.digest !== expected.digest || request.profile.workerVersion !== expected.workerVersion) {
30
+ throw new TypeError("Invalid Node profile identity");
31
+ }
32
+ } else if (Object.hasOwn(request, "profile")) throw new TypeError("Unexpected execution profile");
33
+ if (Object.hasOwn(request, "moduleGraph")) validateModuleGraph(request.source, request.moduleGraph, { nodeProfile });
34
+ const ids = new Map(), closedSequences = new Set();
35
+ const receivers = new Map();
36
+ let sequence;
37
+ for (const item of request.cases) {
38
+ shape(item, ["id", "args", "clock", "sequence", "exportName", "reset", "observeArgs", "invocation", ...CASE_CAPABILITY_FIELDS],
39
+ nodeProfile ? ["id", "args", "invocation"] : ["id", "args"]);
40
+ if (typeof item.id !== "string" || !ID.test(item.id) || ids.has(item.id)
41
+ || !Array.isArray(item.args) || item.args.length > 16
42
+ || (Object.hasOwn(item, "clock") && (!Number.isSafeInteger(item.clock) || Math.abs(item.clock) > 8.64e15))) {
43
+ throw new TypeError("Invalid execution case");
44
+ }
45
+ if (Object.hasOwn(item, "sequence") && (typeof item.sequence !== "string" || !ID.test(item.sequence))
46
+ || Object.hasOwn(item, "exportName") && (typeof item.exportName !== "string" || !EXPORT.test(item.exportName))
47
+ || Object.hasOwn(item, "reset") && (item.reset !== true || !item.sequence)
48
+ || Object.hasOwn(item, "observeArgs") && typeof item.observeArgs !== "boolean") throw new TypeError("Invalid sequence operation");
49
+ if (sequence !== item.sequence) {
50
+ if (sequence !== undefined) closedSequences.add(sequence);
51
+ if (closedSequences.has(item.sequence)) throw new TypeError("Non-contiguous sequence");
52
+ sequence = item.sequence; receivers.clear();
53
+ }
54
+ if (item.reset) receivers.clear();
55
+ if (nodeProfile) {
56
+ validateInvocation(item.invocation);
57
+ if (item.invocation.kind === "construct") {
58
+ if (!item.sequence || receivers.size || receivers.has(item.invocation.receiverId) || item.awaitResult || item.observeIdentity) {
59
+ throw new TypeError("Invalid receiver construction");
60
+ }
61
+ receivers.set(item.invocation.receiverId, item.sequence);
62
+ } else if (item.invocation.kind === "method") {
63
+ if (!item.sequence || receivers.get(item.invocation.receiverId) !== item.sequence) throw new TypeError("Unknown receiver");
64
+ }
65
+ if (item.invocation.kind === "construct" && item.referencePairs?.some(pair => [pair.left, pair.right].some(selector => selector.root !== "argument"))) {
66
+ throw new TypeError("Constructed receivers are not observable roots");
67
+ }
68
+ } else if (Object.hasOwn(item, "invocation")) throw new TypeError("Unexpected invocation");
69
+ const budget = nodeProfile ? { rawBytes: 0, textBytes: 0 } : undefined;
70
+ const callbacks = validateCaseCapabilities(item, { nodeProfile, budget });
71
+ item.args.forEach((value) => {
72
+ if (!["result", "error-property"].includes(value?.type)) {
73
+ validateValue(value, true, callbacks, { typedBytes: nodeProfile, budget }); return;
74
+ }
75
+ shape(value, value.type === "result" ? ["type", "value"] : ["type", "value", "key"]);
76
+ if (typeof value.value !== "string" || !item.sequence || !ids.has(value.value) || ids.get(value.value).sequence !== item.sequence) {
77
+ throw new TypeError("Result references require an earlier case in the same sequence");
78
+ }
79
+ if (value.type === "error-property" && (!ids.get(value.value).observeError || typeof value.key !== "string" || value.key.length > 128)) {
80
+ throw new TypeError("Error property references require an earlier error observation");
81
+ }
82
+ });
83
+ ids.set(item.id, item);
84
+ }
85
+ return request;
86
+ }
87
+
88
+ export function parseResponse(text, request, requestDigest) {
89
+ if (typeof text !== "string" || Buffer.byteLength(text) > MAX_RESPONSE_BYTES) throw new TypeError("Response size exceeded");
90
+ const response = JSON.parse(text);
91
+ if (request.schemaVersion === 2) return parseNodeResponse(response, request, requestDigest);
92
+ shape(response, ["schemaVersion", "workerVersion", "requestDigest", "status", "cases", "timeoutReason"],
93
+ ["schemaVersion", "workerVersion", "requestDigest", "status", "cases"]);
94
+ if (response.schemaVersion !== 1 || response.workerVersion !== WORKER_VERSION || response.requestDigest !== requestDigest
95
+ || !["completed", "timeout", "error"].includes(response.status) || !Array.isArray(response.cases)
96
+ || response.cases.length > request.cases.length
97
+ || (response.status === "completed" && response.cases.length !== request.cases.length)) throw new TypeError("Invalid worker response");
98
+ const observations = new Map();
99
+ for (const [index, item] of response.cases.entries()) {
100
+ shape(item, ["id", "outcome", "value", "errorClass", "reason", "dateArgsAfter", "clockReads", "argsAfter", "resources", ...OBSERVATION_CAPABILITY_FIELDS], ["id", "outcome"]);
101
+ if (item.id !== request.cases[index].id || !["return", "throw", "unsupported", "error"].includes(item.outcome)) throw new TypeError("Invalid case observation");
102
+ if (item.outcome === "return") {
103
+ validateValue(item.value, false);
104
+ if (Object.hasOwn(item, "errorClass") || Object.hasOwn(item, "reason")) throw new TypeError("Conflicting return observation");
105
+ } else if (item.outcome === "throw") {
106
+ if (!["TypeError", "RangeError", "SyntaxError", "ReferenceError", "EvalError", "URIError", "Error", "non-error"].includes(item.errorClass)
107
+ || Object.hasOwn(item, "value") || Object.hasOwn(item, "reason")) throw new TypeError("Invalid throw observation");
108
+ } else if (typeof item.reason !== "string" || !/^[a-z-]{1,64}$/.test(item.reason)
109
+ || Object.hasOwn(item, "value") || Object.hasOwn(item, "errorClass")) throw new TypeError("Invalid incomplete observation");
110
+ const resourceStop = item.outcome === "error" && ["guest-cpu-budget", "guest-wall-deadline"].includes(item.reason);
111
+ if (resourceStop) {
112
+ shape(item.resources, ["caseCpuMicros", "caseThreadCpuMicros", "caseWallMicros"]);
113
+ if (!Object.values(item.resources).every(value => Number.isSafeInteger(value) && value >= 0)
114
+ || (item.reason === "guest-cpu-budget" && item.resources.caseThreadCpuMicros < CASE_THREAD_CPU_MICROS)) {
115
+ throw new TypeError("Invalid resource stop observation");
116
+ }
117
+ } else if (Object.hasOwn(item, "resources")) throw new TypeError("Unexpected resource stop observation");
118
+ if (["return", "throw"].includes(item.outcome)) {
119
+ const resolved = resolveArguments(request.cases[index].args, observations);
120
+ if (resolved.some(arg => arg === undefined)) throw new TypeError("Unavailable referenced observation");
121
+ const expectedIndexes = resolved.flatMap((arg, argIndex) => arg.type === "date" ? [argIndex] : []);
122
+ if (!Array.isArray(item.dateArgsAfter) || item.dateArgsAfter.length !== expectedIndexes.length
123
+ || !Number.isSafeInteger(item.clockReads) || item.clockReads < 0) throw new TypeError("Missing side-effect observation");
124
+ item.dateArgsAfter.forEach((arg, argIndex) => {
125
+ shape(arg, ["index", "value"]);
126
+ if (arg.index !== expectedIndexes[argIndex]) throw new TypeError("Wrong observed argument");
127
+ validateValue({ type: "number", value: arg.value }, false);
128
+ });
129
+ if (request.cases[index].observeArgs) {
130
+ if (!Array.isArray(item.argsAfter) || item.argsAfter.length !== request.cases[index].args.length) throw new TypeError("Missing argument snapshots");
131
+ item.argsAfter.forEach((arg) => validateValue(arg, true, callbackIds(request.cases[index])));
132
+ } else if (Object.hasOwn(item, "argsAfter")) throw new TypeError("Unexpected argument snapshots");
133
+ } else if (Object.hasOwn(item, "dateArgsAfter") || Object.hasOwn(item, "clockReads") || Object.hasOwn(item, "argsAfter")) throw new TypeError("Unexpected side-effect observation");
134
+ validateObservedCapabilities(item, request.cases[index]);
135
+ observations.set(item.id, item);
136
+ }
137
+ const timeouts = ["guest-cpu-budget", "guest-wall-deadline"];
138
+ const errors = response.cases.filter((item) => item.outcome === "error");
139
+ if (errors.length > 1 || (errors.length && response.cases.at(-1) !== errors[0])) throw new TypeError("Nonterminal worker error");
140
+ if (response.status === "timeout") {
141
+ if (!timeouts.includes(response.timeoutReason)
142
+ || (errors.length && errors[0].reason !== response.timeoutReason)
143
+ || (response.timeoutReason === "guest-cpu-budget" && errors.length !== 1)) throw new TypeError("Invalid timeout cause");
144
+ } else if (Object.hasOwn(response, "timeoutReason") || errors.some((item) => timeouts.includes(item.reason))
145
+ || (response.status === "completed" && errors.length) || (response.status === "error" && errors.length !== 1)) {
146
+ throw new TypeError("Conflicting worker status");
147
+ }
148
+ return response;
149
+ }
150
+
151
+ const COUNTER_FIELDS = ["calls", "rawBytes", "textBytes", "decodersCreated", "timersScheduled", "denials"];
152
+ function validateServiceCounters(value) {
153
+ shape(value, COUNTER_FIELDS);
154
+ if (COUNTER_FIELDS.some(field => !Number.isSafeInteger(value[field]) || value[field] < 0)) throw new TypeError("Invalid Node service counters");
155
+ }
156
+
157
+ function validateInvocationTrace(value, item, outcome, defaultExport) {
158
+ const invocation = item.invocation;
159
+ const fields = invocation.kind === "call" ? ["kind", "exportName", "outcome"]
160
+ : invocation.kind === "construct" ? ["kind", "receiverId", "outcome"] : ["kind", "receiverId", "method", "outcome"];
161
+ shape(value, fields);
162
+ if (value.kind !== invocation.kind || value.outcome !== outcome
163
+ || invocation.kind === "call" && value.exportName !== (item.exportName ?? defaultExport)
164
+ || invocation.receiverId && value.receiverId !== invocation.receiverId
165
+ || invocation.method && value.method !== invocation.method) throw new TypeError("Invalid invocation trace");
166
+ }
167
+
168
+ function parseNodeResponse(response, request, requestDigest) {
169
+ shape(response, ["schemaVersion", "workerVersion", "profileDigest", "requestDigest", "status", "cases", "timeoutReason", "services", "quiescence", "timerTrace"],
170
+ ["schemaVersion", "workerVersion", "profileDigest", "requestDigest", "status", "cases", "services", "quiescence"]);
171
+ if (response.schemaVersion !== 2 || response.workerVersion !== NODE_WORKER_VERSION || response.profileDigest !== request.profile.digest
172
+ || response.requestDigest !== requestDigest || !["completed", "timeout", "error"].includes(response.status)
173
+ || !Array.isArray(response.cases) || response.cases.length > request.cases.length
174
+ || response.status === "completed" && response.cases.length !== request.cases.length) throw new TypeError("Invalid Node worker response");
175
+ validateServiceCounters(response.services);
176
+ shape(response.quiescence, ["pendingTimers", "liveDecoders", "receivers"]);
177
+ if (Object.values(response.quiescence).some(value => value !== 0)) throw new TypeError("Node worker did not quiesce");
178
+ if (Object.hasOwn(response, "timerTrace")) {
179
+ if (!Array.isArray(response.timerTrace) || response.timerTrace.length > MAX_TIMER_SCHEDULES * 3) throw new TypeError("Invalid timer trace");
180
+ response.timerTrace.forEach((entry, index) => {
181
+ shape(entry, ["sequence", "event", "id", "delay"], entry.event === "cancel" ? ["sequence", "event", "id"] : ["sequence", "event", "id", "delay"]);
182
+ if (entry.sequence !== index || !["schedule", "fire", "cancel"].includes(entry.event)
183
+ || !Number.isSafeInteger(entry.id) || entry.id < 1
184
+ || Object.hasOwn(entry, "delay") && (!Number.isSafeInteger(entry.delay) || entry.delay < 1 || entry.delay > 5000)) throw new TypeError("Invalid timer event");
185
+ });
186
+ }
187
+ const observations = new Map(), aggregate = Object.fromEntries(COUNTER_FIELDS.map(field => [field, 0]));
188
+ const typedOutputBudget = { rawBytes: 0 };
189
+ for (const [index, item] of response.cases.entries()) {
190
+ const requested = request.cases[index];
191
+ shape(item, ["id", "outcome", "value", "errorClass", "reason", "dateArgsAfter", "clockReads", "argsAfter", "resources", "invocationTrace", "services", ...OBSERVATION_CAPABILITY_FIELDS],
192
+ ["id", "outcome", "invocationTrace", "services"]);
193
+ if (item.id !== requested.id || !["return", "throw", "constructed", "unsupported", "error"].includes(item.outcome)) {
194
+ throw new TypeError("Invalid Node case observation");
195
+ }
196
+ validateInvocationTrace(item.invocationTrace, requested, item.outcome, request.exportName);
197
+ validateServiceCounters(item.services);
198
+ COUNTER_FIELDS.forEach(field => { aggregate[field] += item.services[field]; });
199
+ if (item.outcome === "return") {
200
+ validateValue(item.value, false, new Set(), { typedBytes: true, typedOutputBudget });
201
+ if (Object.hasOwn(item, "errorClass") || Object.hasOwn(item, "reason")) throw new TypeError("Conflicting return observation");
202
+ } else if (item.outcome === "throw") {
203
+ if (!["TypeError", "RangeError", "SyntaxError", "ReferenceError", "EvalError", "URIError", "Error", "non-error"].includes(item.errorClass)
204
+ || Object.hasOwn(item, "value") || Object.hasOwn(item, "reason")) throw new TypeError("Invalid throw observation");
205
+ } else if (item.outcome === "constructed") {
206
+ if (requested.invocation.kind !== "construct" || Object.hasOwn(item, "value") || Object.hasOwn(item, "errorClass") || Object.hasOwn(item, "reason")) {
207
+ throw new TypeError("Invalid construction observation");
208
+ }
209
+ } else if (typeof item.reason !== "string" || !/^[a-z0-9-]{1,64}$/.test(item.reason)
210
+ || Object.hasOwn(item, "value") || Object.hasOwn(item, "errorClass")) throw new TypeError("Invalid incomplete observation");
211
+ const resourceStop = item.outcome === "error" && ["guest-cpu-budget", "guest-wall-deadline"].includes(item.reason);
212
+ if (resourceStop) {
213
+ shape(item.resources, ["caseCpuMicros", "caseThreadCpuMicros", "caseWallMicros"]);
214
+ if (!Object.values(item.resources).every(value => Number.isSafeInteger(value) && value >= 0)
215
+ || item.reason === "guest-cpu-budget" && item.resources.caseThreadCpuMicros < CASE_THREAD_CPU_MICROS) throw new TypeError("Invalid resource stop observation");
216
+ } else if (Object.hasOwn(item, "resources")) throw new TypeError("Unexpected resource stop observation");
217
+ if (["return", "throw", "constructed"].includes(item.outcome)) {
218
+ const resolved = resolveArguments(requested.args, observations, { nodeProfile: true });
219
+ if (resolved.some(arg => arg === undefined)) throw new TypeError("Unavailable referenced observation");
220
+ const expectedIndexes = resolved.flatMap((arg, argIndex) => arg.type === "date" ? [argIndex] : []);
221
+ if (!Array.isArray(item.dateArgsAfter) || item.dateArgsAfter.length !== expectedIndexes.length
222
+ || !Number.isSafeInteger(item.clockReads) || item.clockReads < 0) throw new TypeError("Missing side-effect observation");
223
+ item.dateArgsAfter.forEach((arg, argIndex) => {
224
+ shape(arg, ["index", "value"]);
225
+ if (arg.index !== expectedIndexes[argIndex]) throw new TypeError("Wrong observed argument");
226
+ validateValue({ type: "number", value: arg.value }, false);
227
+ });
228
+ if (requested.observeArgs) {
229
+ if (!Array.isArray(item.argsAfter) || item.argsAfter.length !== requested.args.length) throw new TypeError("Missing argument snapshots");
230
+ item.argsAfter.forEach(arg => validateValue(arg, true, callbackIds(requested), { typedBytes: true, typedOutputBudget }));
231
+ } else if (Object.hasOwn(item, "argsAfter")) throw new TypeError("Unexpected argument snapshots");
232
+ } else if (Object.hasOwn(item, "dateArgsAfter") || Object.hasOwn(item, "clockReads") || Object.hasOwn(item, "argsAfter")) {
233
+ throw new TypeError("Unexpected side-effect observation");
234
+ }
235
+ validateObservedCapabilities(item, requested, { nodeProfile: true, typedOutputBudget });
236
+ observations.set(item.id, item);
237
+ }
238
+ if (COUNTER_FIELDS.some(field => aggregate[field] !== response.services[field])) throw new TypeError("Conflicting Node service totals");
239
+ const timeouts = ["guest-cpu-budget", "guest-wall-deadline"];
240
+ const errors = response.cases.filter(item => item.outcome === "error");
241
+ if (errors.length > 1 || errors.length && response.cases.at(-1) !== errors[0]) throw new TypeError("Nonterminal worker error");
242
+ if (response.status === "timeout") {
243
+ if (!timeouts.includes(response.timeoutReason) || errors.length && errors[0].reason !== response.timeoutReason
244
+ || response.timeoutReason === "guest-cpu-budget" && errors.length !== 1) throw new TypeError("Invalid timeout cause");
245
+ } else if (Object.hasOwn(response, "timeoutReason") || errors.some(item => timeouts.includes(item.reason))
246
+ || response.status === "completed" && errors.length || response.status === "error" && errors.length !== 1) throw new TypeError("Conflicting worker status");
247
+ return response;
248
+ }
@@ -0,0 +1,61 @@
1
+ import { protocolShape as shape } from "./values.mjs";
2
+
3
+ export function validateReferencePairs(item, { backingStore = false } = {}) {
4
+ if (!Object.hasOwn(item, "referencePairs")) return;
5
+ if (!Array.isArray(item.referencePairs) || item.referencePairs.length < 1 || item.referencePairs.length > 16) throw new TypeError("Invalid reference pairs");
6
+ const ids = new Set();
7
+ for (const pair of item.referencePairs) {
8
+ shape(pair, ["id", "left", "right"]);
9
+ if (typeof pair.id !== "string" || !/^[a-zA-Z0-9][a-zA-Z0-9:._-]{0,79}$/.test(pair.id) || ids.has(pair.id)) throw new TypeError("Invalid reference pair id");
10
+ ids.add(pair.id);
11
+ for (const selector of [pair.left, pair.right]) {
12
+ shape(selector, ["root", "index", "path", "projection"], ["root", "path"]);
13
+ if (!["argument", "return", "error"].includes(selector.root) || !Array.isArray(selector.path) || selector.path.length > 8
14
+ || selector.path.some(key => typeof key !== "string" || key.length > 128)) throw new TypeError("Invalid reference selector");
15
+ if (Object.hasOwn(selector, "projection") && (!backingStore || selector.projection !== "backing-store")) {
16
+ throw new TypeError("Invalid reference projection");
17
+ }
18
+ if (selector.root === "argument") {
19
+ if (!Number.isSafeInteger(selector.index) || selector.index < 0 || selector.index >= item.args.length) throw new TypeError("Invalid reference argument");
20
+ } else if (Object.hasOwn(selector, "index") || selector.root === "error" && !item.observeError) throw new TypeError("Unobserved reference root");
21
+ }
22
+ }
23
+ }
24
+
25
+ export function validateReferenceIdentity(values, item) {
26
+ if (!item.referencePairs || !Array.isArray(values) || values.length !== item.referencePairs.length) throw new TypeError("Incomplete reference identities");
27
+ values.forEach((value, index) => {
28
+ shape(value, ["id", "same"]);
29
+ if (value.id !== item.referencePairs[index].id || typeof value.same !== "boolean") throw new TypeError("Invalid reference identity");
30
+ });
31
+ }
32
+
33
+ // Included only in the private pre-candidate intrinsics closure. No property
34
+ // lookup can invoke candidate getters, inherited fields or proxy traps.
35
+ export const REFERENCE_INTRINSICS = `
36
+ function referenceAt(value, path) {
37
+ for (let i = 0; i < path.length; i += 1) {
38
+ if (value === null || typeof value !== 'object') return undefined;
39
+ if (apply(has, proxies, [value])) throw 'reference-path-unsupported';
40
+ const property = descriptor(value, path[i]);
41
+ if (!property) return undefined;
42
+ if (!own(property, 'value')) throw 'reference-path-unsupported';
43
+ value = property.value;
44
+ }
45
+ if (value !== null && typeof value === 'object' && apply(has, proxies, [value])) throw 'reference-path-unsupported';
46
+ return value;
47
+ }
48
+ function backingStore(value) {
49
+ try { return apply(byteBuffer, value, []); } catch {}
50
+ try { return apply(dataViewBuffer, value, []); } catch {}
51
+ try { apply(arrayBufferLength, value, []); return value; } catch { throw 'reference-path-unsupported'; }
52
+ }
53
+ function referenceIdentity(left, leftPath, leftProjection, right, rightPath, rightProjection) {
54
+ try {
55
+ let a = referenceAt(left, leftPath), b = referenceAt(right, rightPath);
56
+ if (leftProjection === 'backing-store') a = backingStore(a);
57
+ if (rightProjection === 'backing-store') b = backingStore(b);
58
+ return a !== null && typeof a === 'object' && same(a, b) ? '{"same":true}' : '{"same":false}';
59
+ } catch { return '{"reason":"reference-path-unsupported"}'; }
60
+ }
61
+ `;
@@ -0,0 +1,14 @@
1
+ import { validateValue } from "./values.mjs";
2
+
3
+ // Copy observed inert data across explicit history steps, never guest handles,
4
+ // expected answers, callbacks or host properties. Missing evidence abstains.
5
+ export function resolveArguments(args, observations, { nodeProfile = false } = {}) {
6
+ return args.map(arg => {
7
+ if (!["result", "error-property"].includes(arg.type)) return arg;
8
+ const observation = observations.get(arg.value);
9
+ const value = arg.type === "result" ? observation?.outcome === "return" ? observation.value : undefined
10
+ : observation?.outcome === "throw" ? observation.errorObservation?.properties.value.find(entry => entry.key === arg.key)?.value : undefined;
11
+ if (value === undefined) return undefined;
12
+ try { validateValue(value, true, new Set(), { typedBytes: nodeProfile }); return value; } catch { return undefined; }
13
+ });
14
+ }
@@ -0,0 +1,53 @@
1
+ import { MAX_COLLECTION_LENGTH, MAX_STRING_LENGTH, MAX_VALUE_DEPTH, MAX_VALUE_NODES, MAX_VALUE_TEXT } from "./values.mjs";
2
+
3
+ // Node-profile support for inert records, arrays, primitives and Dates only.
4
+ // The closure shares the worker's private Proxy registry and captured intrinsics.
5
+ // Unsupported data latches for the realm, even if candidate code catches it.
6
+ export const STRUCTURED_CLONE_INTRINSICS = `
7
+ const CloneMap = WeakMap, cloneGet = CloneMap.prototype.get, cloneSet = CloneMap.prototype.set;
8
+ const cloneHas = CloneMap.prototype.has, CloneError = Error;
9
+ let cloneFailure = null;
10
+ const denyClone = reason => { cloneFailure ??= reason; throw new CloneError(reason); };
11
+ function installStructuredClone() {
12
+ define(globalThis, 'structuredClone', dataDescriptor(function structuredClone(value, options) {
13
+ if (options !== undefined) return denyClone('structured-clone-options-unsupported');
14
+ const seen = new CloneMap(); let nodes = 0, text = 0;
15
+ const boundedText = value => {
16
+ text += value.length;
17
+ if (value.length > ${MAX_STRING_LENGTH} || text > ${MAX_VALUE_TEXT}) denyClone('structured-clone-limit');
18
+ };
19
+ function copy(value, depth) {
20
+ if (++nodes > ${MAX_VALUE_NODES} || depth > ${MAX_VALUE_DEPTH}) return denyClone('structured-clone-limit');
21
+ const type = typeof value;
22
+ if (value === null || type === 'undefined' || type === 'boolean' || type === 'number' || type === 'bigint') return value;
23
+ if (type === 'string') { boundedText(value); return value; }
24
+ if (type !== 'object' || apply(has, proxies, [value])) return denyClone('structured-clone-type-unsupported');
25
+ if (apply(cloneHas, seen, [value])) return apply(cloneGet, seen, [value]);
26
+ let timestamp, date = false;
27
+ try { timestamp = apply(getTime, value, []); date = true; } catch {}
28
+ if (date) { const out = new D(timestamp); apply(cloneSet, seen, [value, out]); return out; }
29
+ const array = isArray(value), proto = prototype(value);
30
+ if (!array && proto !== objectPrototype && proto !== null) return denyClone('structured-clone-type-unsupported');
31
+ const keys = ownKeys(value);
32
+ if (keys.length > ${MAX_COLLECTION_LENGTH} + (array ? 1 : 0)) return denyClone('structured-clone-limit');
33
+ const out = array ? [] : {};
34
+ if (array) {
35
+ const length = descriptor(value, 'length').value;
36
+ if (length > ${MAX_COLLECTION_LENGTH}) return denyClone('structured-clone-limit');
37
+ const lengthDescriptor = create(null); lengthDescriptor.value = length; define(out, 'length', lengthDescriptor);
38
+ }
39
+ apply(cloneSet, seen, [value, out]);
40
+ for (let i = 0; i < keys.length; i += 1) {
41
+ const key = keys[i];
42
+ if (typeof key !== 'string') continue;
43
+ const property = descriptor(value, key);
44
+ if (!property || !property.enumerable) continue;
45
+ if (!own(property, 'value')) return denyClone('structured-clone-accessor-unsupported');
46
+ boundedText(key); define(out, key, dataDescriptor(copy(property.value, depth + 1), true));
47
+ }
48
+ return out;
49
+ }
50
+ return copy(value, 0);
51
+ }, false));
52
+ }
53
+ `;
@@ -0,0 +1,97 @@
1
+ export const MAX_STRING_LENGTH = 4096;
2
+ export const MAX_VALUE_DEPTH = 8;
3
+ export const MAX_VALUE_NODES = 256;
4
+ export const MAX_COLLECTION_LENGTH = 64;
5
+ export const MAX_VALUE_TEXT = 64 * 1024;
6
+ export const MAX_TYPED_BACKING_BYTES = 4096;
7
+ export const MAX_CASE_RAW_AND_TEXT_BYTES = 64 * 1024;
8
+ export const MAX_TYPED_OUTPUT_BYTES = 64 * 1024;
9
+ const SPECIAL_NUMBERS = new Set(["NaN", "Infinity", "-Infinity", "-0"]);
10
+ const TYPED_BYTES = new Set(["uint8array", "buffer", "arraybuffer", "dataview"]);
11
+
12
+ export function protocolShape(value, keys, required = keys) {
13
+ if (!value || typeof value !== "object" || Array.isArray(value)
14
+ || Object.getPrototypeOf(value) !== Object.prototype
15
+ || Object.keys(value).some((key) => !keys.includes(key))
16
+ || required.some((key) => !Object.hasOwn(value, key))) throw new TypeError("Invalid protocol object");
17
+ }
18
+
19
+ /** Typed trees with optional approved callback IDs, never executable code or history references. */
20
+ export function validateValue(value, allowDate = true, callbackIds = new Set(), options = {}) {
21
+ let nodes = 0, text = 0, textUtf8 = 0, rawBytes = 0;
22
+ const typedBytes = options.typedBytes === true;
23
+ const shared = options.budget;
24
+ const typedOutput = options.typedOutputBudget;
25
+ function visit(item, depth) {
26
+ if (++nodes > MAX_VALUE_NODES || depth > MAX_VALUE_DEPTH) throw new TypeError("Value tree limit exceeded");
27
+ protocolShape(item, ["type", "value"], ["type"]);
28
+ if (["undefined", "null"].includes(item.type)) {
29
+ if (Object.hasOwn(item, "value")) throw new TypeError("Unexpected primitive payload");
30
+ } else if (item.type === "callback" && callbackIds.has(item.value)) {
31
+ if (typeof item.value !== "string") throw new TypeError("Invalid callback reference");
32
+ } else if (item.type === "number" || allowDate && item.type === "date") {
33
+ if (!(typeof item.value === "number" && Number.isFinite(item.value)) && !SPECIAL_NUMBERS.has(item.value)) {
34
+ throw new TypeError("Invalid numeric payload");
35
+ }
36
+ } else if (item.type === "boolean") {
37
+ if (typeof item.value !== "boolean") throw new TypeError("Invalid boolean payload");
38
+ } else if (item.type === "string") {
39
+ if (typeof item.value !== "string" || item.value.length > MAX_STRING_LENGTH) throw new TypeError("Invalid string payload");
40
+ text += item.value.length; textUtf8 += Buffer.byteLength(item.value);
41
+ } else if (typedBytes && TYPED_BYTES.has(item.type)) {
42
+ protocolShape(item, ["type", "value"]);
43
+ protocolShape(item.value, ["backingBase64", "byteOffset", "byteLength"]);
44
+ const { backingBase64, byteOffset, byteLength } = item.value;
45
+ if (typeof backingBase64 !== "string" || !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(backingBase64)
46
+ || !Number.isSafeInteger(byteOffset) || byteOffset < 0 || !Number.isSafeInteger(byteLength) || byteLength < 0) {
47
+ throw new TypeError("Invalid typed byte payload");
48
+ }
49
+ const backing = Buffer.from(backingBase64, "base64");
50
+ if (backing.toString("base64") !== backingBase64 || backing.length > MAX_TYPED_BACKING_BYTES
51
+ || byteOffset + byteLength > backing.length
52
+ || item.type === "arraybuffer" && (byteOffset !== 0 || byteLength !== backing.length)) {
53
+ throw new TypeError("Invalid typed byte range");
54
+ }
55
+ rawBytes += backing.length;
56
+ if (typedOutput) {
57
+ typedOutput.rawBytes = (typedOutput.rawBytes ?? 0) + backing.length;
58
+ if (typedOutput.rawBytes > MAX_TYPED_OUTPUT_BYTES) throw new TypeError("Aggregate typed output budget exceeded");
59
+ }
60
+ } else if (["array", "record"].includes(item.type)) {
61
+ if (!Array.isArray(item.value) || item.value.length > MAX_COLLECTION_LENGTH
62
+ || Object.keys(item.value).length !== item.value.length) throw new TypeError("Invalid collection payload");
63
+ const keys = new Set();
64
+ for (const child of item.value) {
65
+ if (item.type === "array") visit(child, depth + 1);
66
+ else {
67
+ protocolShape(child, ["key", "value"]);
68
+ if (typeof child.key !== "string" || child.key.length > MAX_STRING_LENGTH || keys.has(child.key)) throw new TypeError("Invalid record key");
69
+ keys.add(child.key); text += child.key.length; textUtf8 += Buffer.byteLength(child.key); visit(child.value, depth + 1);
70
+ }
71
+ }
72
+ } else throw new TypeError("Unsupported value type");
73
+ if (text > MAX_VALUE_TEXT) throw new TypeError("Value text limit exceeded");
74
+ }
75
+ visit(value, 0);
76
+ if (shared) {
77
+ shared.rawBytes = (shared.rawBytes ?? 0) + rawBytes;
78
+ shared.textBytes = (shared.textBytes ?? 0) + textUtf8;
79
+ if (shared.rawBytes + shared.textBytes > MAX_CASE_RAW_AND_TEXT_BYTES) throw new TypeError("Case byte and text budget exceeded");
80
+ }
81
+ return value;
82
+ }
83
+
84
+ export function numberValue(value) {
85
+ if (Number.isNaN(value)) return "NaN";
86
+ if (Object.is(value, -0)) return "-0";
87
+ if (!Number.isFinite(value)) return String(value);
88
+ return value;
89
+ }
90
+
91
+ /** Record insertion order is not an equality obligation; array order is. */
92
+ export function canonicalValue(value) {
93
+ if (value.type === "array") return { type: "array", value: value.value.map(canonicalValue) };
94
+ if (value.type === "record") return { type: "record", value: value.value.map((entry) => ({ key: entry.key, value: canonicalValue(entry.value) }))
95
+ .sort((a, b) => a.key < b.key ? -1 : a.key > b.key ? 1 : 0) };
96
+ return value;
97
+ }
@@ -0,0 +1,75 @@
1
+ import { createHash } from "node:crypto";
2
+ import { newQuickJSWASMModuleFromVariant } from "quickjs-emscripten-core";
3
+ import variant from "@jitl/quickjs-wasmfile-release-sync";
4
+ import { MAX_REQUEST_BYTES, MAX_RESPONSE_BYTES, NODE_WORKER_VERSION, WORKER_VERSION, parseRequest } from "./protocol.mjs";
5
+ import { createGuestSession } from "./guest.mjs";
6
+ import { CPU_EXHAUSTED, WALL_EXHAUSTED, REQUEST_WALL_MS } from "./budget.mjs";
7
+ import { resolveArguments } from "./references.mjs";
8
+
9
+ // This executable belongs inside the constrained container, never the agent's
10
+ // process. stdout is the trusted runner's channel; QuickJS has no stdout binding.
11
+ try {
12
+ let bytes = 0;
13
+ const chunks = [];
14
+ for await (const chunk of process.stdin) {
15
+ bytes += chunk.length;
16
+ if (bytes > MAX_REQUEST_BYTES) throw new Error("Request size exceeded");
17
+ chunks.push(chunk);
18
+ }
19
+ const text = Buffer.concat(chunks).toString("utf8");
20
+ const request = parseRequest(text);
21
+ const requestDigest = createHash("sha256").update(text).digest("hex");
22
+ const QuickJS = await newQuickJSWASMModuleFromVariant(variant);
23
+ const deadline = performance.now() + REQUEST_WALL_MS;
24
+ const cases = [];
25
+ let status = "completed";
26
+ let timeoutReason;
27
+ const observations = new Map();
28
+ const typedOutputBudget = { rawBytes: 0 };
29
+ const timerTrace = [];
30
+ let quiescence = { pendingTimers: 0, liveDecoders: 0, receivers: 0 };
31
+ let session, sequence;
32
+ const disposeSession = () => {
33
+ const summary = session?.dispose();
34
+ for (const item of summary?.timerTrace ?? []) timerTrace.push({ ...item, sequence: timerTrace.length });
35
+ if (summary?.quiescence) quiescence = summary.quiescence;
36
+ session = undefined;
37
+ };
38
+ try {
39
+ for (const item of request.cases) {
40
+ if (performance.now() >= deadline) { status = "timeout"; timeoutReason = WALL_EXHAUSTED; break; }
41
+ if (!session || !item.sequence || sequence !== item.sequence || item.reset) {
42
+ disposeSession(); session = createGuestSession(QuickJS, request, deadline, typedOutputBudget); sequence = item.sequence;
43
+ }
44
+ const args = resolveArguments(item.args, observations, { nodeProfile: request.schemaVersion === 2 });
45
+ const observation = args.some((arg) => arg === undefined)
46
+ ? request.schemaVersion === 2
47
+ ? { id: item.id, outcome: "unsupported", reason: "referenced-result-unavailable",
48
+ invocationTrace: { ...item.invocation, ...(item.invocation.kind === "call" ? { exportName: item.exportName ?? request.exportName } : {}), outcome: "unsupported" },
49
+ services: { calls: 0, rawBytes: 0, textBytes: 0, decodersCreated: 0, timersScheduled: 0, denials: 0 } }
50
+ : { id: item.id, outcome: "unsupported", reason: "referenced-result-unavailable" }
51
+ : await session.execute({ ...item, args });
52
+ cases.push(observation);
53
+ observations.set(item.id, observation);
54
+ if (observation.outcome === "error") {
55
+ timeoutReason = [CPU_EXHAUSTED, WALL_EXHAUSTED].includes(observation.reason) ? observation.reason : undefined;
56
+ status = timeoutReason ? "timeout" : "error";
57
+ break;
58
+ }
59
+ }
60
+ } finally { disposeSession(); }
61
+ if (status === "completed" && performance.now() >= deadline) { status = "timeout"; timeoutReason = WALL_EXHAUSTED; }
62
+ const output = JSON.stringify(request.schemaVersion === 1
63
+ ? { schemaVersion: 1, workerVersion: WORKER_VERSION, requestDigest, status, cases, ...(timeoutReason ? { timeoutReason } : {}) }
64
+ : { schemaVersion: 2, workerVersion: NODE_WORKER_VERSION, profileDigest: request.profile.digest, requestDigest, status, cases,
65
+ ...(timeoutReason ? { timeoutReason } : {}), services: cases.reduce((total, item) => {
66
+ for (const key of Object.keys(total)) total[key] += item.services?.[key] ?? 0; return total;
67
+ }, { calls: 0, rawBytes: 0, textBytes: 0, decodersCreated: 0, timersScheduled: 0, denials: 0 }),
68
+ quiescence, ...(timerTrace.length ? { timerTrace } : {}) });
69
+ if (Buffer.byteLength(output) > MAX_RESPONSE_BYTES) throw new Error("Response size exceeded");
70
+ process.stdout.write(output);
71
+ } catch {
72
+ // Do not echo candidate code, thrown objects, or local environment details.
73
+ process.stderr.write("isolated-contract-worker-failed\n");
74
+ process.exitCode = 1;
75
+ }