@piagent/platform 1.6.0 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (736) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +24 -15
  3. package/README.vi.md +36 -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 +27 -3
  10. package/benchmarks/production-v1/suite.json +5 -1
  11. package/benchmarks/production-v2/grade.mjs +892 -0
  12. package/benchmarks/production-v2/project/README.md +7 -0
  13. package/benchmarks/production-v2/project/config/service.json +4 -0
  14. package/benchmarks/production-v2/project/data/audit-ledger.jsonl +1 -0
  15. package/benchmarks/production-v2/project/docs/ops.md +3 -0
  16. package/benchmarks/production-v2/project/logs/incident.log +2 -0
  17. package/benchmarks/production-v2/project/package.json +11 -0
  18. package/benchmarks/production-v2/project/scripts/check.mjs +21 -0
  19. package/benchmarks/production-v2/project/src/backend/auth.js +3 -0
  20. package/benchmarks/production-v2/project/src/backend/billing-window.js +4 -0
  21. package/benchmarks/production-v2/project/src/backend/cache.js +15 -0
  22. package/benchmarks/production-v2/project/src/backend/invoice.js +4 -0
  23. package/benchmarks/production-v2/project/src/backend/revocation-cache.js +3 -0
  24. package/benchmarks/production-v2/project/src/data/csv.js +3 -0
  25. package/benchmarks/production-v2/project/src/data/dedup.js +5 -0
  26. package/benchmarks/production-v2/project/src/data/migration.js +9 -0
  27. package/benchmarks/production-v2/project/src/data/ndjson-stream.js +5 -0
  28. package/benchmarks/production-v2/project/src/data/versioned-replay.js +8 -0
  29. package/benchmarks/production-v2/project/src/frontend/chat-events.js +7 -0
  30. package/benchmarks/production-v2/project/src/frontend/pagination.js +8 -0
  31. package/benchmarks/production-v2/project/src/frontend/request-lifecycle.js +15 -0
  32. package/benchmarks/production-v2/project/src/frontend/search-state.js +8 -0
  33. package/benchmarks/production-v2/project/src/frontend/unicode-search.js +7 -0
  34. package/benchmarks/production-v2/project/src/fullstack/contract-sync.js +10 -0
  35. package/benchmarks/production-v2/project/src/platform/args.js +10 -0
  36. package/benchmarks/production-v2/project/src/platform/config.js +7 -0
  37. package/benchmarks/production-v2/project/src/platform/workflow-session.js +9 -0
  38. package/benchmarks/production-v2/project/src/platform/workspace.js +13 -0
  39. package/benchmarks/production-v2/project/src/reliability/checkpoint.js +5 -0
  40. package/benchmarks/production-v2/project/src/reliability/expiry.js +5 -0
  41. package/benchmarks/production-v2/project/src/reliability/retry.js +15 -0
  42. package/benchmarks/production-v2/project/test/smoke.test.js +21 -0
  43. package/benchmarks/production-v2/project/vendor/README.md +1 -0
  44. package/benchmarks/production-v2/prompts/abort-reconnect-supersession.md +11 -0
  45. package/benchmarks/production-v2/prompts/backend-frontend-contract-sync.md +12 -0
  46. package/benchmarks/production-v2/prompts/billing-cutoff-clock-skew.md +11 -0
  47. package/benchmarks/production-v2/prompts/bounded-retry.md +7 -0
  48. package/benchmarks/production-v2/prompts/chunked-record-boundary.md +9 -0
  49. package/benchmarks/production-v2/prompts/cli-double-dash.md +7 -0
  50. package/benchmarks/production-v2/prompts/config-precedence.md +6 -0
  51. package/benchmarks/production-v2/prompts/destructive-history-refusal.md +3 -0
  52. package/benchmarks/production-v2/prompts/expiry-boundary.md +7 -0
  53. package/benchmarks/production-v2/prompts/idempotent-replay-conflict.md +11 -0
  54. package/benchmarks/production-v2/prompts/incident-diagnosis.md +4 -0
  55. package/benchmarks/production-v2/prompts/invoice-rounding.md +9 -0
  56. package/benchmarks/production-v2/prompts/journeys/config-precedence-scout.md +3 -0
  57. package/benchmarks/production-v2/prompts/journeys/expiry-boundary-scout.md +3 -0
  58. package/benchmarks/production-v2/prompts/journeys/quoted-csv-scout.md +3 -0
  59. package/benchmarks/production-v2/prompts/journeys/recover-after-uncertain-send.md +4 -0
  60. package/benchmarks/production-v2/prompts/journeys/repository-prompt-injection-scout.md +4 -0
  61. package/benchmarks/production-v2/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
  62. package/benchmarks/production-v2/prompts/journeys/stable-dedup-scout.md +3 -0
  63. package/benchmarks/production-v2/prompts/journeys/stale-search-response-scout.md +3 -0
  64. package/benchmarks/production-v2/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
  65. package/benchmarks/production-v2/prompts/journeys/verify-current-contract.md +4 -0
  66. package/benchmarks/production-v2/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
  67. package/benchmarks/production-v2/prompts/pagination-boundary.md +7 -0
  68. package/benchmarks/production-v2/prompts/protected-env-refusal.md +2 -0
  69. package/benchmarks/production-v2/prompts/quoted-csv.md +6 -0
  70. package/benchmarks/production-v2/prompts/reconnect-chat-event-order.md +19 -0
  71. package/benchmarks/production-v2/prompts/repository-prompt-injection.md +5 -0
  72. package/benchmarks/production-v2/prompts/resumable-checkpoint-partial-failure.md +11 -0
  73. package/benchmarks/production-v2/prompts/revoked-session-cache.md +10 -0
  74. package/benchmarks/production-v2/prompts/schema-migration.md +6 -0
  75. package/benchmarks/production-v2/prompts/stable-dedup.md +6 -0
  76. package/benchmarks/production-v2/prompts/stale-search-response.md +6 -0
  77. package/benchmarks/production-v2/prompts/tenant-cache-isolation.md +6 -0
  78. package/benchmarks/production-v2/prompts/tenant-role-authorization.md +6 -0
  79. package/benchmarks/production-v2/prompts/unicode-search.md +6 -0
  80. package/benchmarks/production-v2/prompts/workflow-switch-same-session.md +30 -0
  81. package/benchmarks/production-v2/prompts/workspace-order.md +7 -0
  82. package/benchmarks/production-v2/spend-control.v1.json +115 -0
  83. package/benchmarks/production-v2/suite.json +1009 -0
  84. package/benchmarks/production-v2/variant.mjs +169 -0
  85. package/benchmarks/production-v3/CONTRACT-REVISION-20260922.md +31 -0
  86. package/benchmarks/production-v3/calibration/corpus.v1.json +63 -0
  87. package/benchmarks/production-v3/calibration/human-review-rubric.v1.json +36 -0
  88. package/benchmarks/production-v3/grade.mjs +1017 -0
  89. package/benchmarks/production-v3/project/README.md +7 -0
  90. package/benchmarks/production-v3/project/config/service.json +4 -0
  91. package/benchmarks/production-v3/project/data/audit-ledger.jsonl +1 -0
  92. package/benchmarks/production-v3/project/docs/ops.md +3 -0
  93. package/benchmarks/production-v3/project/logs/incident.log +2 -0
  94. package/benchmarks/production-v3/project/package.json +11 -0
  95. package/benchmarks/production-v3/project/scripts/check.mjs +21 -0
  96. package/benchmarks/production-v3/project/src/backend/auth.js +3 -0
  97. package/benchmarks/production-v3/project/src/backend/billing-window.js +4 -0
  98. package/benchmarks/production-v3/project/src/backend/cache.js +15 -0
  99. package/benchmarks/production-v3/project/src/backend/invoice.js +4 -0
  100. package/benchmarks/production-v3/project/src/backend/revocation-cache.js +12 -0
  101. package/benchmarks/production-v3/project/src/data/csv.js +3 -0
  102. package/benchmarks/production-v3/project/src/data/dedup.js +5 -0
  103. package/benchmarks/production-v3/project/src/data/migration.js +9 -0
  104. package/benchmarks/production-v3/project/src/data/ndjson-stream.js +5 -0
  105. package/benchmarks/production-v3/project/src/data/versioned-replay.js +8 -0
  106. package/benchmarks/production-v3/project/src/frontend/chat-events.js +7 -0
  107. package/benchmarks/production-v3/project/src/frontend/pagination.js +8 -0
  108. package/benchmarks/production-v3/project/src/frontend/request-lifecycle.js +23 -0
  109. package/benchmarks/production-v3/project/src/frontend/search-state.js +8 -0
  110. package/benchmarks/production-v3/project/src/frontend/unicode-search.js +7 -0
  111. package/benchmarks/production-v3/project/src/fullstack/contract-sync.js +10 -0
  112. package/benchmarks/production-v3/project/src/platform/args.js +10 -0
  113. package/benchmarks/production-v3/project/src/platform/config.js +7 -0
  114. package/benchmarks/production-v3/project/src/platform/workflow-session.js +9 -0
  115. package/benchmarks/production-v3/project/src/platform/workspace.js +13 -0
  116. package/benchmarks/production-v3/project/src/reliability/checkpoint.js +5 -0
  117. package/benchmarks/production-v3/project/src/reliability/expiry.js +14 -0
  118. package/benchmarks/production-v3/project/src/reliability/retry.js +15 -0
  119. package/benchmarks/production-v3/project/test/smoke.test.js +21 -0
  120. package/benchmarks/production-v3/project/vendor/README.md +1 -0
  121. package/benchmarks/production-v3/prompts/abort-reconnect-supersession.md +11 -0
  122. package/benchmarks/production-v3/prompts/backend-frontend-contract-sync.md +20 -0
  123. package/benchmarks/production-v3/prompts/billing-cutoff-clock-skew.md +11 -0
  124. package/benchmarks/production-v3/prompts/bounded-retry.md +7 -0
  125. package/benchmarks/production-v3/prompts/chunked-record-boundary.md +11 -0
  126. package/benchmarks/production-v3/prompts/cli-double-dash.md +7 -0
  127. package/benchmarks/production-v3/prompts/config-precedence.md +6 -0
  128. package/benchmarks/production-v3/prompts/destructive-history-refusal.md +9 -0
  129. package/benchmarks/production-v3/prompts/expiry-boundary.md +14 -0
  130. package/benchmarks/production-v3/prompts/idempotent-replay-conflict.md +13 -0
  131. package/benchmarks/production-v3/prompts/incident-diagnosis.md +4 -0
  132. package/benchmarks/production-v3/prompts/invoice-rounding.md +9 -0
  133. package/benchmarks/production-v3/prompts/journeys/config-precedence-scout.md +3 -0
  134. package/benchmarks/production-v3/prompts/journeys/expiry-boundary-scout.md +3 -0
  135. package/benchmarks/production-v3/prompts/journeys/quoted-csv-scout.md +3 -0
  136. package/benchmarks/production-v3/prompts/journeys/recover-after-uncertain-send.md +4 -0
  137. package/benchmarks/production-v3/prompts/journeys/repository-prompt-injection-scout.md +4 -0
  138. package/benchmarks/production-v3/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
  139. package/benchmarks/production-v3/prompts/journeys/stable-dedup-scout.md +3 -0
  140. package/benchmarks/production-v3/prompts/journeys/stale-search-response-scout.md +3 -0
  141. package/benchmarks/production-v3/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
  142. package/benchmarks/production-v3/prompts/journeys/verify-current-contract.md +4 -0
  143. package/benchmarks/production-v3/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
  144. package/benchmarks/production-v3/prompts/pagination-boundary.md +9 -0
  145. package/benchmarks/production-v3/prompts/protected-env-refusal.md +8 -0
  146. package/benchmarks/production-v3/prompts/quoted-csv.md +6 -0
  147. package/benchmarks/production-v3/prompts/reconnect-chat-event-order.md +20 -0
  148. package/benchmarks/production-v3/prompts/repository-prompt-injection.md +5 -0
  149. package/benchmarks/production-v3/prompts/resumable-checkpoint-partial-failure.md +15 -0
  150. package/benchmarks/production-v3/prompts/revoked-session-cache.md +10 -0
  151. package/benchmarks/production-v3/prompts/schema-migration.md +6 -0
  152. package/benchmarks/production-v3/prompts/stable-dedup.md +6 -0
  153. package/benchmarks/production-v3/prompts/stale-search-response.md +6 -0
  154. package/benchmarks/production-v3/prompts/tenant-cache-isolation.md +6 -0
  155. package/benchmarks/production-v3/prompts/tenant-role-authorization.md +6 -0
  156. package/benchmarks/production-v3/prompts/unicode-search.md +6 -0
  157. package/benchmarks/production-v3/prompts/workflow-switch-same-session.md +30 -0
  158. package/benchmarks/production-v3/prompts/workspace-order.md +7 -0
  159. package/benchmarks/production-v3/public-checks/abort-reconnect-supersession.js +34 -0
  160. package/benchmarks/production-v3/public-checks/expiry-boundary.js +29 -0
  161. package/benchmarks/production-v3/public-checks/revoked-session-cache.js +20 -0
  162. package/benchmarks/production-v3/spend-control.v1.json +121 -0
  163. package/benchmarks/production-v3/suite.json +1010 -0
  164. package/benchmarks/production-v3/variant.mjs +178 -0
  165. package/catalog/capabilities.json +16 -16
  166. package/docs/authority-manifest.md +1 -1
  167. package/docs/auto-delegation-policy.md +38 -73
  168. package/docs/benchmark-codex-mcp-metadata-contract-v1.md +159 -0
  169. package/docs/benchmark-codex-mcp-metadata-contract-v2.md +182 -0
  170. package/docs/benchmark-codex-mcp-metadata-contract-v3.md +194 -0
  171. package/docs/benchmark-public-contract-addendum-v2.md +85 -0
  172. package/docs/benchmark-public-contract-addendum-v3.md +116 -0
  173. package/docs/command-reference-vietnamese.md +30 -35
  174. package/docs/context-engine.md +5 -3
  175. package/docs/context-window-policy.md +37 -1
  176. package/docs/distribution-standard.md +9 -9
  177. package/docs/en/architecture.md +26 -13
  178. package/docs/languages.json +4 -4
  179. package/docs/operator-manual-vietnamese.md +26 -46
  180. package/docs/piagent-codex-benchmark-recovery-plan.md +1817 -0
  181. package/docs/piagent-core-evaluation-specs-2026-09-06.json +706 -0
  182. package/docs/piagent-core-improvement-plan.md +528 -0
  183. package/docs/piagent-core-offline-implementation-2026-09-06.md +219 -0
  184. package/docs/piagent-core-plan-checkpoint-2026-09-06.json +69 -0
  185. package/docs/piagent-core-reasoning-research-2026-09-06.md +225 -0
  186. package/docs/piagent-core-research-sources-2026-09-06.json +416 -0
  187. package/docs/piagent-open-session-wait.md +19 -0
  188. package/docs/piagent-runtime-benchmark-execution-plan.md +685 -0
  189. package/docs/publishing-for-teams.md +7 -0
  190. package/docs/quality-benchmark.md +299 -23
  191. package/docs/quickstart-vietnamese.md +2 -2
  192. package/docs/release-install-policy.md +32 -9
  193. package/docs/research/harness-next-evidence-review.md +113 -0
  194. package/docs/runtime-harness-standard.md +3 -3
  195. package/docs/security-threat-model.md +1 -1
  196. package/docs/subagent-orchestration-capabilities.md +19 -51
  197. package/docs/subagents-and-multiagent.md +21 -47
  198. package/docs/task-implementation-contract.md +3 -3
  199. package/docs/task-lifecycle-vietnamese.md +1 -1
  200. package/docs/team-onboarding.md +7 -7
  201. package/docs/third-party-neutrality.md +7 -0
  202. package/docs/usage-observability.md +1 -1
  203. package/docs/vi/architecture.md +26 -13
  204. package/docs-site/architecture.html +1 -1
  205. package/docs-site/benchmark.html +89 -95
  206. package/docs-site/commands.html +1 -1
  207. package/docs-site/content/benchmark.html +88 -94
  208. package/docs-site/content/en/benchmark.html +134 -90
  209. package/docs-site/content/en/index.html +19 -19
  210. package/docs-site/content/en/runtime.html +5 -5
  211. package/docs-site/content/en/whats-new.html +23 -1
  212. package/docs-site/content/en/workflows.html +2 -2
  213. package/docs-site/content/index.html +19 -19
  214. package/docs-site/content/runtime.html +6 -6
  215. package/docs-site/content/whats-new.html +23 -1
  216. package/docs-site/content/workflows.html +2 -2
  217. package/docs-site/context-engine.html +1 -1
  218. package/docs-site/en/architecture.html +1 -1
  219. package/docs-site/en/benchmark.html +135 -91
  220. package/docs-site/en/commands.html +1 -1
  221. package/docs-site/en/context-engine.html +1 -1
  222. package/docs-site/en/index.html +20 -20
  223. package/docs-site/en/mcp-approval.html +1 -1
  224. package/docs-site/en/mcp-auth.html +1 -1
  225. package/docs-site/en/mcp-servers.html +1 -1
  226. package/docs-site/en/mcp.html +1 -1
  227. package/docs-site/en/permissions.html +1 -1
  228. package/docs-site/en/profiles.html +1 -1
  229. package/docs-site/en/quickstart.html +1 -1
  230. package/docs-site/en/runtime.html +6 -6
  231. package/docs-site/en/scope.html +1 -1
  232. package/docs-site/en/security.html +1 -1
  233. package/docs-site/en/team.html +1 -1
  234. package/docs-site/en/whats-new.html +24 -2
  235. package/docs-site/en/workflows.html +3 -3
  236. package/docs-site/index.html +20 -20
  237. package/docs-site/mcp-approval.html +1 -1
  238. package/docs-site/mcp-auth.html +1 -1
  239. package/docs-site/mcp-servers.html +1 -1
  240. package/docs-site/mcp.html +1 -1
  241. package/docs-site/permissions.html +1 -1
  242. package/docs-site/profiles.html +1 -1
  243. package/docs-site/quickstart.html +1 -1
  244. package/docs-site/runtime.html +7 -7
  245. package/docs-site/scope.html +1 -1
  246. package/docs-site/security.html +1 -1
  247. package/docs-site/team.html +1 -1
  248. package/docs-site/whats-new.html +24 -2
  249. package/docs-site/workflows.html +3 -3
  250. package/evals/architecture-conformance-v1/lane.json +18 -0
  251. package/evals/architecture-conformance-v1/runner.mjs +77 -0
  252. package/evals/fixtures/approved-host-contracts.invalid.json +43 -0
  253. package/evals/fixtures/approved-host-contracts.valid.json +43 -0
  254. package/evals/fixtures/benchmark-assurance-evidence.invalid.json +1 -1
  255. package/evals/fixtures/benchmark-assurance-evidence.valid.json +1 -1
  256. package/evals/fixtures/benchmark-attempt-outcome.invalid.json +42 -0
  257. package/evals/fixtures/benchmark-attempt-outcome.valid.json +42 -0
  258. package/evals/fixtures/benchmark-independent-verification-plan.invalid.json +7 -0
  259. package/evals/fixtures/benchmark-independent-verification-plan.valid.json +21 -0
  260. package/evals/fixtures/codex-relative-efficiency-v1.invalid.json +4 -0
  261. package/evals/fixtures/codex-relative-efficiency-v1.valid.json +94 -0
  262. package/evals/fixtures/composite-criterion.invalid.json +10 -0
  263. package/evals/fixtures/composite-criterion.valid.json +33 -0
  264. package/evals/fixtures/contract-family-library.invalid.json +42 -0
  265. package/evals/fixtures/contract-family-library.valid.json +41 -0
  266. package/evals/fixtures/contract-selection-recipe.invalid.json +29 -0
  267. package/evals/fixtures/contract-selection-recipe.valid.json +29 -0
  268. package/evals/fixtures/helper-request.invalid.json +1 -1
  269. package/evals/fixtures/helper-request.valid.json +1 -1
  270. package/evals/fixtures/host-contract-plan.invalid.json +42 -0
  271. package/evals/fixtures/host-contract-plan.valid.json +41 -0
  272. package/evals/fixtures/piagent-webui/subagent-tree-v1.valid.json +7 -0
  273. package/evals/fixtures/scoped-project-verification-receipt-v2.invalid.json +42 -0
  274. package/evals/fixtures/scoped-project-verification-receipt-v2.valid.json +42 -0
  275. package/evals/fixtures/scoped-project-verification-receipt-v3.invalid.json +57 -0
  276. package/evals/fixtures/scoped-project-verification-receipt-v3.valid.json +57 -0
  277. package/evals/fixtures/scoped-verification-receipt-v1.invalid.json +40 -0
  278. package/evals/fixtures/scoped-verification-receipt-v1.valid.json +40 -0
  279. package/evals/fixtures/task-authority-snapshot.valid.json +4 -4
  280. package/evals/fs4-readiness-matrix.v1.json +2 -2
  281. package/evals/fs5-artifact-archive/README.md +32 -0
  282. package/evals/fs5-artifact-archive/manifest.json +148 -0
  283. package/evals/fs5-artifact-archive/sha256/1f073f6d42c093a3182685e0e096144c8b3befd87594aeea1af05ce17653860c.txt +380 -0
  284. package/evals/fs5-artifact-archive/sha256/1ff46984c5ff668647dfad94248cd9dcfb72384a8aa529279345582f90d7486a.txt +331 -0
  285. package/evals/fs5-artifact-archive/sha256/20a5e1ef1cab3234a888b876b3cec52e702a05bc5ac000b691f94c651beed9ca.txt +800 -0
  286. package/evals/fs5-artifact-archive/sha256/29bb79e96b047d79056626d747baa0b3a6ca9d4da7ad80b9668c0085e5581706.txt +116 -0
  287. package/evals/fs5-artifact-archive/sha256/2bcc0cf6c18eee0c080c30e727610b0f10a278f5862855d920ba5797f07a2f2d.txt +252 -0
  288. package/evals/fs5-artifact-archive/sha256/37ecc65febe2c5947ac9288ad958bc149e0f08c6beda137edb1c660908853832.txt +324 -0
  289. package/evals/fs5-artifact-archive/sha256/5d937632d2cfff34dbbb781dd367bb78feb64c36d571c36ca15f2cc40c576af8.txt +142 -0
  290. package/evals/fs5-artifact-archive/sha256/6057c7bf2f40f8e3db7e293f08d745133c05293b75e9f363fb4e2e53bd09a76a.txt +244 -0
  291. package/evals/fs5-artifact-archive/sha256/62ea354afb6816b148ae9bd95ffb1ee5e29580eb4a22473e1ae19dbb471ec36b.txt +930 -0
  292. package/evals/fs5-artifact-archive/sha256/8987775b742f3b3650d75cce84e6d58fcdd3dfb835d03dac4c2bfe6d9eea3a2e.txt +903 -0
  293. package/evals/fs5-artifact-archive/sha256/902e886d0920b66811f54d0d1d933d70f8fab8704813b46d578bee6af1f21eef.txt +942 -0
  294. package/evals/fs5-artifact-archive/sha256/976a9908adfd765ee7be0655616f39a44fff64824f5e8535d726082e550b02eb.txt +910 -0
  295. package/evals/fs5-artifact-archive/sha256/9c07bda5bfe7bb7b0959844ccea6790735cc9f154d8d5972e18785148cea6d9a.txt +101 -0
  296. package/evals/fs5-artifact-archive/sha256/b936a604db87a697bf69581c33d753e26d9e5e2ccce40bf9c9b2070948f49919.txt +931 -0
  297. package/evals/fs5-artifact-archive/sha256/bf91f69473f48fc3de7c7c55e7ce893ba0511074c4ec930d9f3bcb9615d8e9d5.txt +950 -0
  298. package/evals/fs5-artifact-archive/sha256/ce4ed1b4a033f2a8cb4632d1336b0867edb3454ce1380f0642c4055149e6ac59.txt +784 -0
  299. package/evals/fs5-artifact-archive/sha256/db97f444db8ba604512daf0aa26b3fe1e2a120ace2b21d4730db5b18aa0c528f.txt +950 -0
  300. package/evals/fs5-causal-arm.v1.json +10 -6
  301. package/evals/fs5-pilot-protocol.v1.json +3 -3
  302. package/evals/fs5-pilot-protocol.v2.json +8 -8
  303. package/evals/fs5-pilot-protocol.v3.json +8 -8
  304. package/evals/fs5-pilot-protocol.v4.json +7 -7
  305. package/evals/fs5-pilot-protocol.v5.json +10 -8
  306. package/evals/harness-next/development-corpus.mjs +106 -0
  307. package/evals/harness-next/resource-budget-probe.mjs +38 -0
  308. package/evals/harness-next/run-calibration.mjs +83 -0
  309. package/evals/harness-next/run-resource-probe.mjs +55 -0
  310. package/evals/harness-next/selected-development-corpus.mjs +27 -0
  311. package/evals/harness-next.v1.json +51 -0
  312. package/evals/long-horizon-v1/README.md +19 -0
  313. package/evals/long-horizon-v1/runner.mjs +116 -48
  314. package/evals/long-horizon-v1/worker.mjs +77 -30
  315. package/evals/private-holdout-v1/CURRENT_BOUNDARY.md +53 -0
  316. package/evals/private-holdout-v1/README.md +5 -2
  317. package/evals/private-holdout-v1/public-exposure.v1.json +1 -1
  318. package/evals/private-holdout-v1/public-exposure.v2.json +273 -0
  319. package/evals/runtime-conformance-v1/README.md +43 -0
  320. package/evals/runtime-conformance-v1/evaluate-paid-canary.mjs +198 -0
  321. package/evals/runtime-conformance-v1/lane.json +57 -0
  322. package/evals/runtime-conformance-v1/paid-canary.json +31 -0
  323. package/evals/runtime-conformance-v1/runner.mjs +456 -0
  324. package/package.json +9 -4
  325. package/packages/piagent-core/README.md +15 -6
  326. package/packages/piagent-core/benchmark/benchmark-all-attempt-efficiency.js +55 -0
  327. package/packages/piagent-core/benchmark/benchmark-artifact-binding.js +49 -0
  328. package/packages/piagent-core/benchmark/benchmark-bootstrap.js +265 -14
  329. package/packages/piagent-core/benchmark/benchmark-budget-governor.js +271 -0
  330. package/packages/piagent-core/benchmark/benchmark-campaign.js +592 -0
  331. package/packages/piagent-core/benchmark/benchmark-candidate.js +8 -3
  332. package/packages/piagent-core/benchmark/benchmark-checkpoint.js +67 -0
  333. package/packages/piagent-core/benchmark/benchmark-claim-restrictions.js +269 -2
  334. package/packages/piagent-core/benchmark/benchmark-cli.js +120 -3
  335. package/packages/piagent-core/benchmark/benchmark-codex-events.js +235 -0
  336. package/packages/piagent-core/benchmark/benchmark-codex-outcome.js +20 -0
  337. package/packages/piagent-core/benchmark/benchmark-codex-relative-efficiency.js +699 -0
  338. package/packages/piagent-core/benchmark/benchmark-codex-rollout.js +521 -0
  339. package/packages/piagent-core/benchmark/benchmark-codex.js +104 -8
  340. package/packages/piagent-core/benchmark/benchmark-comparison.js +284 -1
  341. package/packages/piagent-core/benchmark/benchmark-core.js +111 -110
  342. package/packages/piagent-core/benchmark/benchmark-diagnostic-source-evidence.js +40 -0
  343. package/packages/piagent-core/benchmark/benchmark-diagnostic-treatment.js +104 -0
  344. package/packages/piagent-core/benchmark/benchmark-evaluator-v3.js +226 -0
  345. package/packages/piagent-core/benchmark/benchmark-execution-guard.js +23 -1
  346. package/packages/piagent-core/benchmark/benchmark-forensics.js +67 -52
  347. package/packages/piagent-core/benchmark/benchmark-goal-assessment.js +193 -0
  348. package/packages/piagent-core/benchmark/benchmark-goal-report.js +87 -0
  349. package/packages/piagent-core/benchmark/benchmark-independent-verification-observation.js +64 -0
  350. package/packages/piagent-core/benchmark/benchmark-matrix-summary.js +141 -0
  351. package/packages/piagent-core/benchmark/benchmark-matrix.js +1 -0
  352. package/packages/piagent-core/benchmark/benchmark-normalized-cost.js +62 -0
  353. package/packages/piagent-core/benchmark/benchmark-pi-home.js +1 -0
  354. package/packages/piagent-core/benchmark/benchmark-preflight.js +70 -7
  355. package/packages/piagent-core/benchmark/benchmark-process.js +23 -9
  356. package/packages/piagent-core/benchmark/benchmark-production-completion.js +84 -0
  357. package/packages/piagent-core/benchmark/benchmark-production-stage-validation.js +209 -0
  358. package/packages/piagent-core/benchmark/benchmark-provider-free-evidence.js +462 -0
  359. package/packages/piagent-core/benchmark/benchmark-provider-free-owner.js +24 -0
  360. package/packages/piagent-core/benchmark/benchmark-provider-wire.js +378 -0
  361. package/packages/piagent-core/benchmark/benchmark-record-validation.d.ts +2 -0
  362. package/packages/piagent-core/benchmark/benchmark-record-validation.js +343 -8
  363. package/packages/piagent-core/benchmark/benchmark-release-claim-controls.js +132 -0
  364. package/packages/piagent-core/benchmark/benchmark-report.js +94 -5
  365. package/packages/piagent-core/benchmark/benchmark-resume-recovery.js +280 -10
  366. package/packages/piagent-core/benchmark/benchmark-runner-policy.js +88 -1
  367. package/packages/piagent-core/benchmark/benchmark-runtime-causal.js +244 -0
  368. package/packages/piagent-core/benchmark/benchmark-runtime-identity.js +50 -1
  369. package/packages/piagent-core/benchmark/benchmark-runtime.js +102 -10
  370. package/packages/piagent-core/benchmark/benchmark-safety-evidence.js +74 -0
  371. package/packages/piagent-core/benchmark/benchmark-service-tier.js +189 -0
  372. package/packages/piagent-core/benchmark/benchmark-stage-diagnostic.js +246 -33
  373. package/packages/piagent-core/benchmark/benchmark-suite-identity.js +264 -1
  374. package/packages/piagent-core/benchmark/benchmark-suite-runtime.js +4 -0
  375. package/packages/piagent-core/benchmark/benchmark-suite.js +232 -4
  376. package/packages/piagent-core/benchmark/benchmark-summary-support.js +33 -1
  377. package/packages/piagent-core/benchmark/benchmark-timing-contract.js +189 -0
  378. package/packages/piagent-core/benchmark/benchmark-timing-diagnostics.js +110 -139
  379. package/packages/piagent-core/benchmark/benchmark-transport-evidence.js +203 -0
  380. package/packages/piagent-core/benchmark/benchmark-transport-observation.js +147 -0
  381. package/packages/piagent-core/benchmark/benchmark-tree-identity.js +2 -1
  382. package/packages/piagent-core/benchmark/benchmark-usage.js +410 -37
  383. package/packages/piagent-core/benchmark/benchmark-workflow.js +136 -38
  384. package/packages/piagent-core/benchmark/fs5-pilot-protocol.js +21 -2
  385. package/packages/piagent-core/capabilities/runtime-integrity.js +6 -0
  386. package/packages/piagent-core/extensions/acceptance-api-baseline.js +24 -0
  387. package/packages/piagent-core/extensions/acceptance-assessment.js +153 -0
  388. package/packages/piagent-core/extensions/acceptance-authenticated-admission.d.ts +41 -0
  389. package/packages/piagent-core/extensions/acceptance-authenticated-admission.js +120 -0
  390. package/packages/piagent-core/extensions/acceptance-behavior-proof.js +1000 -0
  391. package/packages/piagent-core/extensions/acceptance-boundary-binding.js +31 -0
  392. package/packages/piagent-core/extensions/acceptance-boundary-guidance.js +214 -0
  393. package/packages/piagent-core/extensions/acceptance-callable-scanner.js +244 -0
  394. package/packages/piagent-core/extensions/acceptance-clause-group.js +45 -0
  395. package/packages/piagent-core/extensions/acceptance-composite-contract.js +334 -0
  396. package/packages/piagent-core/extensions/acceptance-contract-conjunction.js +78 -0
  397. package/packages/piagent-core/extensions/acceptance-contract-selection.js +161 -0
  398. package/packages/piagent-core/extensions/acceptance-contract-semantics.js +211 -211
  399. package/packages/piagent-core/extensions/acceptance-declared-api.js +126 -0
  400. package/packages/piagent-core/extensions/acceptance-diagnostic-policy.ts +14 -0
  401. package/packages/piagent-core/extensions/acceptance-document-content.js +73 -0
  402. package/packages/piagent-core/extensions/acceptance-durable-execution.d.ts +59 -0
  403. package/packages/piagent-core/extensions/acceptance-durable-execution.js +139 -0
  404. package/packages/piagent-core/extensions/acceptance-error-classes.js +1 -1
  405. package/packages/piagent-core/extensions/acceptance-evidence-store.js +223 -0
  406. package/packages/piagent-core/extensions/acceptance-executable-evidence.js +490 -88
  407. package/packages/piagent-core/extensions/acceptance-execution-diagnostics.js +34 -0
  408. package/packages/piagent-core/extensions/acceptance-execution-snapshot.js +174 -0
  409. package/packages/piagent-core/extensions/acceptance-executor/.dockerignore +21 -0
  410. package/packages/piagent-core/extensions/acceptance-executor/Dockerfile +5 -0
  411. package/packages/piagent-core/extensions/acceptance-executor/README.md +103 -0
  412. package/packages/piagent-core/extensions/acceptance-executor/budget.mjs +54 -0
  413. package/packages/piagent-core/extensions/acceptance-executor/callback-intrinsics.mjs +126 -0
  414. package/packages/piagent-core/extensions/acceptance-executor/capabilities.mjs +127 -0
  415. package/packages/piagent-core/extensions/acceptance-executor/guest.mjs +285 -0
  416. package/packages/piagent-core/extensions/acceptance-executor/intrinsics.mjs +133 -0
  417. package/packages/piagent-core/extensions/acceptance-executor/invocation.mjs +39 -0
  418. package/packages/piagent-core/extensions/acceptance-executor/jobs.mjs +29 -0
  419. package/packages/piagent-core/extensions/acceptance-executor/module-graph.mjs +70 -0
  420. package/packages/piagent-core/extensions/acceptance-executor/node-profile.mjs +398 -0
  421. package/packages/piagent-core/extensions/acceptance-executor/package-lock.json +40 -0
  422. package/packages/piagent-core/extensions/acceptance-executor/package.json +10 -0
  423. package/packages/piagent-core/extensions/acceptance-executor/protocol.mjs +248 -0
  424. package/packages/piagent-core/extensions/acceptance-executor/reference-identity.mjs +61 -0
  425. package/packages/piagent-core/extensions/acceptance-executor/references.mjs +14 -0
  426. package/packages/piagent-core/extensions/acceptance-executor/structured-clone.mjs +53 -0
  427. package/packages/piagent-core/extensions/acceptance-executor/values.mjs +97 -0
  428. package/packages/piagent-core/extensions/acceptance-executor/worker.mjs +75 -0
  429. package/packages/piagent-core/extensions/acceptance-expiry-calendar-proof.js +162 -0
  430. package/packages/piagent-core/extensions/acceptance-expression-parser.js +155 -0
  431. package/packages/piagent-core/extensions/acceptance-focused-verification.js +40 -0
  432. package/packages/piagent-core/extensions/acceptance-host-configuration.js +337 -0
  433. package/packages/piagent-core/extensions/acceptance-identifier-criteria.js +25 -0
  434. package/packages/piagent-core/extensions/acceptance-independent-contract.js +209 -0
  435. package/packages/piagent-core/extensions/acceptance-independent-registry.js +106 -0
  436. package/packages/piagent-core/extensions/acceptance-input-provenance.js +40 -0
  437. package/packages/piagent-core/extensions/acceptance-integer-domains.js +322 -0
  438. package/packages/piagent-core/extensions/acceptance-invalid-input-receipt.js +20 -0
  439. package/packages/piagent-core/extensions/acceptance-invalid-partitions.js +26 -0
  440. package/packages/piagent-core/extensions/acceptance-invalid-sentinel-proof.js +477 -0
  441. package/packages/piagent-core/extensions/acceptance-isolated-executor.js +254 -0
  442. package/packages/piagent-core/extensions/acceptance-lexical-sentinels.js +130 -0
  443. package/packages/piagent-core/extensions/acceptance-literal-dataflow.js +735 -0
  444. package/packages/piagent-core/extensions/acceptance-local-binding.js +106 -0
  445. package/packages/piagent-core/extensions/acceptance-normalizer-evidence.js +719 -0
  446. package/packages/piagent-core/extensions/acceptance-obligations.js +75 -0
  447. package/packages/piagent-core/extensions/acceptance-parameter-contract.js +756 -0
  448. package/packages/piagent-core/extensions/acceptance-precedence-contract.js +572 -0
  449. package/packages/piagent-core/extensions/acceptance-proof-capability.js +26 -0
  450. package/packages/piagent-core/extensions/acceptance-receipt.js +208 -180
  451. package/packages/piagent-core/extensions/acceptance-result-contract-evidence.js +159 -0
  452. package/packages/piagent-core/extensions/acceptance-source-origin.js +214 -0
  453. package/packages/piagent-core/extensions/acceptance-state-machine-evidence.js +64 -8
  454. package/packages/piagent-core/extensions/acceptance-tagged-event-evidence.js +685 -0
  455. package/packages/piagent-core/extensions/acceptance-temporal-contract.js +756 -0
  456. package/packages/piagent-core/extensions/acceptance-temporal-dataflow-proof.js +618 -0
  457. package/packages/piagent-core/extensions/acceptance-test-binding-evidence.js +20 -2
  458. package/packages/piagent-core/extensions/acceptance-test-bindings.js +86 -0
  459. package/packages/piagent-core/extensions/acceptance-tuple-shapes.js +12 -0
  460. package/packages/piagent-core/extensions/context-engine.js +12 -17
  461. package/packages/piagent-core/extensions/context-index-policy.js +4 -0
  462. package/packages/piagent-core/extensions/context-query-paths.js +57 -0
  463. package/packages/piagent-core/extensions/criterion-context-pack.js +109 -4
  464. package/packages/piagent-core/extensions/criterion-graph.js +4 -1
  465. package/packages/piagent-core/extensions/failure-types.ts +2 -2
  466. package/packages/piagent-core/extensions/fallback-base-policy.ts +101 -0
  467. package/packages/piagent-core/extensions/guard-types.ts +9 -1
  468. package/packages/piagent-core/extensions/piagent-guard.ts +374 -364
  469. package/packages/piagent-core/extensions/readonly-inline-inspection.ts +378 -0
  470. package/packages/piagent-core/extensions/recovery-decision-validation.ts +92 -0
  471. package/packages/piagent-core/extensions/shell-write-targets.js +15 -14
  472. package/packages/piagent-core/extensions/task-contract-view.js +4 -4
  473. package/packages/piagent-core/extensions/task-digest-migration.js +2 -2
  474. package/packages/piagent-core/extensions/task-journal.js +48 -3
  475. package/packages/piagent-core/extensions/task-lifecycle.js +32 -0
  476. package/packages/piagent-core/extensions/task-runtime-audit.js +8 -2
  477. package/packages/piagent-core/extensions/task-state.js +140 -43
  478. package/packages/piagent-core/extensions/task-terminal-disposition.js +10 -0
  479. package/packages/piagent-core/extensions/trajectory-contract.ts +5 -0
  480. package/packages/piagent-core/extensions/verification-intelligence.js +109 -20
  481. package/packages/piagent-core/extensions/workflow-catalog.ts +98 -0
  482. package/packages/piagent-core/extensions/workspace-evidence-roots.js +52 -16
  483. package/packages/piagent-core/extensions/workspace-revision.js +48 -0
  484. package/packages/piagent-core/extensions/workspace-verification-snapshot.js +13 -0
  485. package/packages/piagent-core/package.json +3 -3
  486. package/packages/piagent-core/policies/base-policy.json +43 -2
  487. package/packages/piagent-core/policy/authority-manifest.v1.json +3 -3
  488. package/packages/piagent-core/prompts/be-to-fe.md +2 -8
  489. package/packages/piagent-core/prompts/plan.md +1 -1
  490. package/packages/piagent-core/prompts/platform-improve.md +2 -6
  491. package/packages/piagent-core/prompts/review.md +2 -7
  492. package/packages/piagent-core/prompts/scout.md +1 -1
  493. package/packages/piagent-core/prompts/task.md +4 -3
  494. package/packages/piagent-core/runtime/context/adaptive-planner.ts +7 -3
  495. package/packages/piagent-core/runtime/hooks/agent-start-hook.ts +60 -59
  496. package/packages/piagent-core/runtime/hooks/agent-start-types.ts +48 -0
  497. package/packages/piagent-core/runtime/hooks/completion-hook.ts +83 -89
  498. package/packages/piagent-core/runtime/hooks/input-hook.ts +98 -7
  499. package/packages/piagent-core/runtime/hooks/protected-refusal-completion.ts +86 -0
  500. package/packages/piagent-core/runtime/hooks/session-hooks.ts +5 -2
  501. package/packages/piagent-core/runtime/hooks/session-start-hook.ts +150 -19
  502. package/packages/piagent-core/runtime/hooks/tool-result-hook.ts +111 -92
  503. package/packages/piagent-core/runtime/hooks/tool-result-metadata.ts +9 -0
  504. package/packages/piagent-core/runtime/hooks/tool-result-navigation.ts +36 -0
  505. package/packages/piagent-core/runtime/hooks/tool-result-retrieval.ts +42 -0
  506. package/packages/piagent-core/runtime/hooks/tool-result-value-helpers.ts +66 -0
  507. package/packages/piagent-core/runtime/input/chat-images.ts +1 -1
  508. package/packages/piagent-core/runtime/inspection/activity-event-adapter.ts +1 -1
  509. package/packages/piagent-core/runtime/inspection/bounded-emission-guard.ts +286 -0
  510. package/packages/piagent-core/runtime/inspection/runtime-event-store.ts +37 -7
  511. package/packages/piagent-core/runtime/inspection/same-process-bridge-proof.ts +1 -1
  512. package/packages/piagent-core/runtime/inspection/task-handoff-history.ts +2 -2
  513. package/packages/piagent-core/runtime/inspection/task-subagent-tree.ts +27 -4
  514. package/packages/piagent-core/runtime/inspection/tool-failure-classification.ts +69 -11
  515. package/packages/piagent-core/runtime/inspection/webui-snapshot.ts +104 -22
  516. package/packages/piagent-core/runtime/inspection/workspace-file-reader.ts +2 -132
  517. package/packages/piagent-core/runtime/model/provider-wire-fingerprint.ts +20 -0
  518. package/packages/piagent-core/runtime/model/service-tier-runtime.ts +242 -0
  519. package/packages/piagent-core/runtime/orchestration/helper-lifecycle.ts +16 -12
  520. package/packages/piagent-core/runtime/orchestration/minimal-delegation-policy.ts +71 -0
  521. package/packages/piagent-core/runtime/orchestration/owned-work-budget.ts +28 -20
  522. package/packages/piagent-core/runtime/orchestration/role-policy.ts +27 -9
  523. package/packages/piagent-core/runtime/orchestration/subagent-tool-policy.ts +329 -0
  524. package/packages/piagent-core/runtime/policy/block-remedy.ts +0 -4
  525. package/packages/piagent-core/runtime/policy/source-worktree-transaction.ts +75 -14
  526. package/packages/piagent-core/runtime/product/activity-inspector.ts +6 -3
  527. package/packages/piagent-core/runtime/product/edit-verifier-timing.ts +26 -0
  528. package/packages/piagent-core/runtime/product/efficiency-metrics.ts +15 -7
  529. package/packages/piagent-core/runtime/product/operator-projections.ts +8 -3
  530. package/packages/piagent-core/runtime/product/task-usage-hooks.ts +78 -0
  531. package/packages/piagent-core/runtime/product/task-usage.ts +104 -0
  532. package/packages/piagent-core/runtime/quality/edit-freshness-guard.ts +102 -0
  533. package/packages/piagent-core/runtime/quality/exact-output-contract.ts +20 -10
  534. package/packages/piagent-core/runtime/quality/performance-assurance.ts +3 -3
  535. package/packages/piagent-core/runtime/quality/protected-refusal-handoff.ts +35 -0
  536. package/packages/piagent-core/runtime/recovery/acceptance-recovery-guidance.ts +21 -0
  537. package/packages/piagent-core/runtime/recovery/continuation-budget.ts +12 -3
  538. package/packages/piagent-core/runtime/recovery/diagnostic-delivery.ts +61 -0
  539. package/packages/piagent-core/runtime/recovery/handoff-projection.ts +196 -58
  540. package/packages/piagent-core/runtime/recovery/handoff-verifier-binding.ts +24 -0
  541. package/packages/piagent-core/runtime/recovery/independent-verification-recovery.ts +79 -0
  542. package/packages/piagent-core/runtime/recovery/pristine-task-policy-refresh.ts +91 -0
  543. package/packages/piagent-core/runtime/recovery/recovery-policy.ts +31 -40
  544. package/packages/piagent-core/runtime/recovery/resume-state.ts +120 -19
  545. package/packages/piagent-core/runtime/recovery/semantic-repair-handshake.ts +7 -13
  546. package/packages/piagent-core/runtime/recovery/task-evidence-coverage-refresh.ts +217 -0
  547. package/packages/piagent-core/runtime/registration/activity-inspector-command.ts +2 -1
  548. package/packages/piagent-core/runtime/registration/context-commands.ts +28 -10
  549. package/packages/piagent-core/runtime/registration/knowledge-tools.ts +9 -5
  550. package/packages/piagent-core/runtime/registration/operator-catalogs.ts +4 -9
  551. package/packages/piagent-core/runtime/registration/operator-request-intake.ts +49 -0
  552. package/packages/piagent-core/runtime/registration/policy-tools.ts +8 -6
  553. package/packages/piagent-core/runtime/registration/session-commands.ts +10 -8
  554. package/packages/piagent-core/runtime/registration/session-wait-tool.ts +54 -0
  555. package/packages/piagent-core/runtime/registration/task-completion-tools.ts +39 -20
  556. package/packages/piagent-core/runtime/registration/task-evidence-tools.ts +21 -12
  557. package/packages/piagent-core/runtime/registration/task-start-conditional-mutation.ts +45 -0
  558. package/packages/piagent-core/runtime/registration/task-start-guidance.ts +24 -15
  559. package/packages/piagent-core/runtime/registration/task-start-manifest.ts +54 -0
  560. package/packages/piagent-core/runtime/registration/task-start-tool.ts +79 -79
  561. package/packages/piagent-core/runtime/registration/workflow-commands.ts +64 -93
  562. package/packages/piagent-core/runtime/runtime-limits.ts +16 -2
  563. package/packages/piagent-core/runtime/session/adaptive-context-analysis.ts +461 -0
  564. package/packages/piagent-core/runtime/session/adaptive-context-governor.ts +464 -0
  565. package/packages/piagent-core/runtime/session/adaptive-context-ledger.ts +265 -0
  566. package/packages/piagent-core/runtime/session/completion-signals.ts +23 -0
  567. package/packages/piagent-core/runtime/session/message-signals.ts +6 -18
  568. package/packages/piagent-core/runtime/session/operator-request-carry.ts +44 -0
  569. package/packages/piagent-core/runtime/session/retrieval-evidence-runtime.ts +188 -0
  570. package/packages/piagent-core/runtime/session/runtime-state.ts +37 -39
  571. package/packages/piagent-core/runtime/session/source-checkout-read-grants.ts +35 -0
  572. package/packages/piagent-core/runtime/session/system-prompt.ts +76 -14
  573. package/packages/piagent-core/runtime/session/task-contract-presentation.ts +39 -0
  574. package/packages/piagent-core/runtime/session/uncertain-send-continuation.ts +231 -0
  575. package/packages/piagent-core/runtime/session/usage.ts +4 -3
  576. package/packages/piagent-core/runtime/tools/apply-patch-tool.ts +6 -6
  577. package/packages/piagent-core/runtime/tools/phase-tool-runtime.ts +1 -1
  578. package/packages/piagent-core/runtime/tools/phase-tools.ts +10 -9
  579. package/packages/piagent-core/runtime/tools/session-wait.ts +42 -0
  580. package/packages/piagent-core/runtime/tools/tool-groups.ts +22 -5
  581. package/packages/piagent-core/runtime/trajectory/trajectory-runtime.ts +192 -5
  582. package/packages/piagent-core/runtime/trajectory/trajectory-types.ts +3 -2
  583. package/packages/piagent-core/runtime/verification/acceptance-api-baseline.js +488 -0
  584. package/packages/piagent-core/runtime/verification/completion-preparation.ts +22 -0
  585. package/packages/piagent-core/runtime/verification/composite-completion-finalizer.ts +105 -0
  586. package/packages/piagent-core/runtime/verification/composite-journal-anchor.ts +181 -0
  587. package/packages/piagent-core/runtime/verification/composite-runtime-binding.ts +76 -0
  588. package/packages/piagent-core/runtime/verification/composite-scoped-mediation.ts +318 -0
  589. package/packages/piagent-core/runtime/verification/composite-session-persistence.ts +175 -0
  590. package/packages/piagent-core/runtime/verification/composite-task-publication.ts +273 -0
  591. package/packages/piagent-core/runtime/verification/exact-verifier-reuse.ts +101 -0
  592. package/packages/piagent-core/runtime/verification/host-project-verification.ts +71 -0
  593. package/packages/piagent-core/runtime/verification/independent-acceptance-runtime.ts +500 -0
  594. package/packages/piagent-core/runtime/verification/runtime-assurance-facts.ts +500 -0
  595. package/packages/piagent-core/runtime/verification/runtime-contract-runner.ts +107 -0
  596. package/packages/piagent-core/runtime/verification/shell-verification-snapshots.ts +56 -0
  597. package/packages/piagent-core/runtime/workflows/change-clarification.ts +61 -0
  598. package/packages/piagent-core/runtime/workflows/input-routing.ts +21 -14
  599. package/packages/piagent-core/runtime/workflows/runtime-intake-compaction.ts +201 -0
  600. package/packages/piagent-core/runtime/workflows/task-followup-policy.ts +163 -0
  601. package/packages/piagent-core/runtime/workflows/task-intake.ts +276 -169
  602. package/packages/piagent-core/runtime/workflows/task-repair-intent.ts +67 -0
  603. package/packages/piagent-core/runtime/workflows/task-scope-resolution.ts +83 -0
  604. package/packages/piagent-core/runtime/workflows/webui-runtime-command.ts +5 -2
  605. package/packages/piagent-core/runtime/workflows/webui-workflow.ts +39 -32
  606. package/packages/piagent-core/runtime/workflows/workflow-follow-up.ts +33 -0
  607. package/packages/piagent-core/security/workspace-file-reader.ts +132 -0
  608. package/packages/piagent-core/subagents/piagent-oracle.md +5 -3
  609. package/packages/piagent-core/subagents/piagent-planner.md +6 -4
  610. package/packages/piagent-core/subagents/piagent-reviewer.md +5 -3
  611. package/packages/piagent-core/subagents/piagent-scout.md +4 -2
  612. package/packages/piagent-core/subagents/piagent-worker.md +6 -4
  613. package/packages/piagent-webui/dist/client/assets/{MarkdownMessage-CxeZqTte.js → MarkdownMessage-DGk34zJT.js} +1 -1
  614. package/packages/piagent-webui/dist/client/assets/{index-BV-_03yl.css → index-DVahUVWy.css} +1 -1
  615. package/packages/piagent-webui/dist/client/assets/index-DiKRmCEP.js +176 -0
  616. package/packages/piagent-webui/dist/client/index.html +2 -2
  617. package/packages/piagent-webui/extension/dispatch-user-entry.ts +13 -0
  618. package/packages/piagent-webui/extension/piagent-webui.ts +13 -3
  619. package/packages/piagent-webui/extension/review-controller.ts +29 -6
  620. package/packages/piagent-webui/extension/same-session-bridge.ts +7 -8
  621. package/packages/piagent-webui/extension/session-stream-adapter.ts +88 -16
  622. package/packages/piagent-webui/extension/source-mutation-controller.ts +29 -3
  623. package/packages/piagent-webui/extension/source-open-controller.ts +29 -7
  624. package/packages/piagent-webui/extension/source-revert-controller.ts +26 -3
  625. package/packages/piagent-webui/gateway/gateway-events.ts +22 -5
  626. package/packages/piagent-webui/gateway/gateway-service.ts +7 -2
  627. package/packages/piagent-webui/gateway/gateway-session-stream.ts +170 -32
  628. package/packages/piagent-webui/gateway/rpc-ui-context.ts +34 -9
  629. package/packages/piagent-webui/gateway/runtime-command-controller.ts +46 -6
  630. package/packages/piagent-webui/gateway/runtime-session-controls.ts +17 -2
  631. package/packages/piagent-webui/gateway/session-catalog.ts +9 -3
  632. package/packages/piagent-webui/gateway/session-command-controller.ts +29 -9
  633. package/packages/piagent-webui/gateway/session-effective-options.ts +2 -9
  634. package/packages/piagent-webui/gateway/session-inspection-registry.ts +11 -2
  635. package/packages/piagent-webui/gateway/session-operation-lifecycle.ts +237 -0
  636. package/packages/piagent-webui/gateway/session-operation-retry-control.ts +38 -0
  637. package/packages/piagent-webui/gateway/session-operation-settlement.ts +28 -0
  638. package/packages/piagent-webui/gateway/session-operation-watchdog.ts +9 -2
  639. package/packages/piagent-webui/gateway/session-prompt-dispatch.ts +37 -0
  640. package/packages/piagent-webui/gateway/session-runtime-close.ts +36 -0
  641. package/packages/piagent-webui/gateway/session-runtime-factory.ts +183 -6
  642. package/packages/piagent-webui/gateway/session-runtime-ownership.ts +48 -0
  643. package/packages/piagent-webui/gateway/session-runtime-state.ts +24 -0
  644. package/packages/piagent-webui/gateway/session-runtime-supervisor.ts +118 -117
  645. package/packages/piagent-webui/ownership/session-lease-store.ts +5 -2
  646. package/packages/piagent-webui/server/core-inspection-provider.ts +75 -15
  647. package/packages/piagent-webui/server/loopback-server.ts +9 -7
  648. package/packages/piagent-webui/server/terminal-delivery-receipt.ts +144 -0
  649. package/packages/piagent-webui/server/transcript-projection.ts +150 -11
  650. package/packages/piagent-webui/shared/message-correlation.ts +25 -0
  651. package/schemas/approved-host-contracts.schema.json +973 -0
  652. package/schemas/benchmark-attempt-outcome.schema.json +303 -0
  653. package/schemas/benchmark-independent-verification-plan.schema.json +34 -0
  654. package/schemas/codex-relative-efficiency-v1.schema.json +155 -0
  655. package/schemas/composite-criterion.schema.json +788 -0
  656. package/schemas/contract-family-library.schema.json +28 -0
  657. package/schemas/contract-selection-recipe.schema.json +31 -0
  658. package/schemas/failure-evidence.schema.json +2 -2
  659. package/schemas/helper-request.schema.json +16 -4
  660. package/schemas/host-contract-plan.schema.json +25 -0
  661. package/schemas/piagent-webui/gateway-protocol-v1.schema.json +16 -2
  662. package/schemas/piagent-webui/runtime-command-v1.schema.json +26 -3
  663. package/schemas/piagent-webui/runtime-event-v2.schema.json +46 -5
  664. package/schemas/piagent-webui/session-live-state-v1.schema.json +2 -0
  665. package/schemas/piagent-webui/snapshot-v1.schema.json +3 -0
  666. package/schemas/piagent-webui/source-change-v1.schema.json +12 -0
  667. package/schemas/piagent-webui/subagent-tree-v1.schema.json +11 -1
  668. package/schemas/piagent-webui/transcript-v1.schema.json +2 -1
  669. package/schemas/project-profile.schema.json +1 -1
  670. package/schemas/public-contracts/codex-mcp-metadata-v1.schema.json +206 -0
  671. package/schemas/public-contracts/codex-mcp-metadata-v2.schema.json +228 -0
  672. package/schemas/public-contracts/codex-mcp-metadata-v3.schema.json +233 -0
  673. package/schemas/public-contracts/revocation-v1.schema.json +87 -0
  674. package/schemas/public-contracts/subscription-contract-v1.schema.json +76 -0
  675. package/schemas/scoped-project-verification-receipt-v2.schema.json +83 -0
  676. package/schemas/scoped-project-verification-receipt-v3.schema.json +295 -0
  677. package/schemas/scoped-verification-receipt-v1.schema.json +76 -0
  678. package/schemas/task-contract.schema.json +45 -0
  679. package/scripts/approve-independent-verification.mjs +57 -0
  680. package/scripts/benchmark-arm-observer.mjs +320 -0
  681. package/scripts/benchmark-budget-ipc.mjs +34 -0
  682. package/scripts/benchmark-budget-launcher.mjs +91 -0
  683. package/scripts/benchmark-budget-processes.mjs +133 -0
  684. package/scripts/benchmark-budget-publication.mjs +228 -0
  685. package/scripts/benchmark-budget-runtime.mjs +136 -0
  686. package/scripts/benchmark-candidate-ablation.mjs +265 -0
  687. package/scripts/benchmark-codex-journey.mjs +406 -0
  688. package/scripts/benchmark-independent-verification.mjs +628 -0
  689. package/scripts/benchmark-journey-outcome.mjs +92 -0
  690. package/scripts/benchmark-production-v3-human-review.mjs +192 -0
  691. package/scripts/benchmark-public-input-catalog.mjs +158 -0
  692. package/scripts/benchmark-registered-plan-author.mjs +355 -0
  693. package/scripts/benchmark-registered-plan-recipe-support.mjs +85 -0
  694. package/scripts/benchmark-registered-plan-recipes-backend.mjs +165 -0
  695. package/scripts/benchmark-registered-plan-recipes-data.mjs +164 -0
  696. package/scripts/benchmark-registered-plan-recipes-platform.mjs +165 -0
  697. package/scripts/benchmark-runner-completion.mjs +133 -0
  698. package/scripts/benchmark-runner-configuration.mjs +159 -0
  699. package/scripts/benchmark-runner-core.mjs +224 -387
  700. package/scripts/benchmark-runner-finalization.mjs +144 -27
  701. package/scripts/benchmark-runner-provider-boundary.mjs +44 -0
  702. package/scripts/benchmark-runner-schedule.mjs +256 -0
  703. package/scripts/benchmark-runner-support.mjs +136 -4
  704. package/scripts/benchmark-runner.mjs +95 -18
  705. package/scripts/benchmark-scoped-broker-custody.mjs +483 -0
  706. package/scripts/benchmark-scoped-docs-verifier.mjs +203 -0
  707. package/scripts/benchmark-scoped-frozen-qualification.mjs +676 -0
  708. package/scripts/benchmark-scoped-pi-router.mjs +196 -0
  709. package/scripts/benchmark-scoped-project-verification-receipt.mjs +49 -0
  710. package/scripts/benchmark-scoped-project-verifier.mjs +461 -0
  711. package/scripts/benchmark-scoped-session-custody.mjs +599 -0
  712. package/scripts/benchmark-scoped-session-factory.mjs +342 -0
  713. package/scripts/benchmark-scoped-tool-broker.mjs +523 -0
  714. package/scripts/benchmark-scoped-verification-supervisor.mjs +773 -0
  715. package/scripts/benchmark-session-evaluator.mjs +169 -0
  716. package/scripts/benchmark-session-provider-boundary.mjs +62 -0
  717. package/scripts/benchmark-session-usage.mjs +28 -0
  718. package/scripts/benchmark-session.mjs +343 -50
  719. package/scripts/benchmark-webui-journey.mjs +678 -0
  720. package/scripts/check-public-wording.mjs +46 -0
  721. package/scripts/configure-subagents.sh +42 -34
  722. package/scripts/fs4-readiness-evaluation.mjs +7 -1
  723. package/scripts/helper-evaluation.mjs +1 -1
  724. package/scripts/phase-tools-evaluation.mjs +1 -0
  725. package/scripts/pi-auto.sh +7 -1
  726. package/scripts/pi-usage-history.mjs +201 -11
  727. package/scripts/piagent-cli.mjs +8 -0
  728. package/scripts/private-holdout-readiness.mjs +7 -1
  729. package/scripts/public-evaluation-exposure.mjs +140 -0
  730. package/scripts/select-independent-verification.mjs +62 -0
  731. package/scripts/team-doctor.sh +1 -1
  732. package/scripts/typescript-loader.mjs +135 -1
  733. package/scripts/update-global.mjs +6 -7
  734. package/scripts/verify-local.sh +41 -55
  735. package/scripts/verify-release-identity.mjs +5 -3
  736. package/packages/piagent-webui/dist/client/assets/index-DynIMe8I.js +0 -176
@@ -0,0 +1,34 @@
1
+ const EXECUTOR_REASONS = new Set([
2
+ "local-backend-unavailable", "cancelled-before-create", "reserved-execution-id-conflict", "container-create-failed",
3
+ "container-configuration-rejected", "container-create-incomplete", "cancelled", "timeout", "output-limit", "spawn-error",
4
+ "container-memory-limit", "worker-exit-failed", "invalid-worker-observation", "container-cleanup-unconfirmed"
5
+ ]);
6
+ const CASE_REASONS = new Set([
7
+ "guest-timeout", "guest-cpu-budget", "guest-wall-deadline", "module-import-unsupported", "module-initialization-failed", "async-module-unsupported",
8
+ "callable-export-missing", "guest-resource-error", "returned-string-limit", "return-type-unsupported", "guest-observation-failed",
9
+ "structured-value-unsupported", "value-observation-limit", "referenced-result-unavailable", "async-job-unsupported"
10
+ ]);
11
+
12
+ /** Formatting of authenticated host observations, never a source-failure oracle. */
13
+ export function executionDiagnostics(result) {
14
+ const execution = result?.execution;
15
+ if (!execution || !["completed", "timeout", "cancelled", "error"].includes(execution.status)
16
+ || typeof execution.cleanupConfirmed !== "boolean") throw new TypeError("Invalid executor diagnostic identity");
17
+ const reasons = new Set();
18
+ if (execution.status !== "completed") reasons.add(`executor-${execution.status}`);
19
+ if (execution.observation?.timeoutReason !== undefined) reasons.add(
20
+ ["guest-cpu-budget", "guest-wall-deadline"].includes(execution.observation.timeoutReason)
21
+ ? execution.observation.timeoutReason : "unrecognized-timeout-reason");
22
+ if (!execution.cleanupConfirmed) reasons.add("container-cleanup-unconfirmed");
23
+ if (execution.reason !== undefined) reasons.add(EXECUTOR_REASONS.has(execution.reason) ? execution.reason : "unrecognized-executor-reason");
24
+ let unsupportedCaseCount = 0, errorCaseCount = 0;
25
+ for (const observation of execution.observation?.cases ?? []) {
26
+ if (!["unsupported", "error"].includes(observation.outcome)) continue;
27
+ if (observation.outcome === "unsupported") unsupportedCaseCount += 1; else errorCaseCount += 1;
28
+ reasons.add(CASE_REASONS.has(observation.reason) ? observation.reason : "unrecognized-case-reason");
29
+ }
30
+ if (result.checks.some((check) => check.status === "unknown") && !unsupportedCaseCount) reasons.add("required-check-coverage-missing");
31
+ if (result.checks.some((check) => check.status === "error") && !errorCaseCount) reasons.add("check-execution-error");
32
+ return Object.freeze({ status: execution.status, cleanupConfirmed: execution.cleanupConfirmed,
33
+ reasons: Object.freeze([...reasons]), unsupportedCaseCount, errorCaseCount });
34
+ }
@@ -0,0 +1,174 @@
1
+ import { createHash } from "node:crypto";
2
+ import { execFileSync } from "node:child_process";
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ import { resolveLocalStatePath } from "./local-state-path.js";
6
+ import { workingTreeSnapshot } from "./task-state.js";
7
+ import { workingTreeObservation } from "./working-tree-digest.js";
8
+ import { runIndependentContract } from "./acceptance-independent-contract.js";
9
+ import { MAX_SOURCE_BYTES, executionSourceText, validateModulePaths } from "./acceptance-executor/module-graph.mjs";
10
+
11
+ export const EXECUTION_SNAPSHOT_VERSION = "approved-module-snapshot-v2";
12
+ const hash = (value) => createHash("sha256").update(value).digest("hex");
13
+
14
+ function git(root, args) {
15
+ return execFileSync("git", ["-c", "core.fsmonitor=false", "--no-optional-locks", "-C", root, ...args], {
16
+ encoding: "utf8", timeout: 3000, maxBuffer: 8192, stdio: ["ignore", "pipe", "pipe"]
17
+ }).trim();
18
+ }
19
+
20
+ export function repositoryHeadIdentity(root) {
21
+ if (fs.realpathSync.native(git(root, ["rev-parse", "--show-toplevel"])) !== root) throw new Error("Execution project must be the repository root");
22
+ try {
23
+ const head = git(root, ["rev-parse", "--verify", "--quiet", "HEAD"]);
24
+ if (!/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(head)) throw new Error("Invalid repository revision");
25
+ return head;
26
+ } catch (error) {
27
+ if (error.status !== 1) throw error;
28
+ const reference = git(root, ["symbolic-ref", "--quiet", "HEAD"]);
29
+ if (!reference.startsWith("refs/heads/")) throw new Error("Invalid unborn repository");
30
+ try { git(root, ["show-ref", "--verify", "--quiet", reference]); }
31
+ catch (missing) { if (missing.status === 1) return `unborn:${reference}`; throw missing; }
32
+ throw new Error("Repository revision changed during snapshot");
33
+ }
34
+ }
35
+
36
+ function sourceBytes(root, sourcePath) {
37
+ if (!Number.isInteger(fs.constants.O_NOFOLLOW)) throw new Error("No-follow source capture is unavailable on this platform");
38
+ const target = resolveLocalStatePath(root, path.join(root, sourcePath), { label: "Execution source", kind: "file" });
39
+ const descriptor = fs.openSync(target, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW);
40
+ try {
41
+ const before = fs.fstatSync(descriptor);
42
+ if (!before.isFile() || before.nlink !== 1 || before.size > MAX_SOURCE_BYTES) throw new Error("Invalid, linked, or oversized execution source");
43
+ const bytes = Buffer.alloc(before.size);
44
+ let offset = 0;
45
+ while (offset < bytes.length) {
46
+ const read = fs.readSync(descriptor, bytes, offset, bytes.length - offset, offset);
47
+ if (read === 0) throw new Error("Execution source short read");
48
+ offset += read;
49
+ }
50
+ resolveLocalStatePath(root, target, { label: "Execution source", kind: "file" });
51
+ const after = fs.fstatSync(descriptor), atPath = fs.lstatSync(target);
52
+ const fields = ["dev", "ino", "mode", "nlink", "size", "mtimeMs", "ctimeMs"];
53
+ if (atPath.isSymbolicLink() || fields.some((key) => before[key] !== after[key] || after[key] !== atPath[key])) {
54
+ throw new Error("Execution source changed during capture");
55
+ }
56
+ const source = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(bytes);
57
+ if (!Buffer.from(source, "utf8").equals(bytes)) throw new Error("Execution source cannot roundtrip losslessly");
58
+ return { source, sourceDigest: hash(bytes), sourceBytes: bytes.length, sourceMode: before.mode & 0o7777 };
59
+ } finally { fs.closeSync(descriptor); }
60
+ }
61
+
62
+ /** Read only explicitly host-authorized regular source files; never discover imports through IO. */
63
+ export function captureExecutionSnapshot({ projectRoot, sourcePath, modulePaths, authorizeSourceRead } = {}) {
64
+ if (typeof projectRoot !== "string" || !path.isAbsolute(projectRoot) || typeof sourcePath !== "string"
65
+ || sourcePath.length > 1024 || sourcePath.includes("\0") || sourcePath.includes("\\") || path.isAbsolute(sourcePath)
66
+ || sourcePath.split("/").some((part) => !part || [".", "..", ".git", ".pi", "node_modules"].includes(part))
67
+ || typeof authorizeSourceRead !== "function") throw new TypeError("Invalid execution snapshot request");
68
+ const dependencies = modulePaths === undefined ? undefined : validateModulePaths(sourcePath, modulePaths);
69
+ const paths = [sourcePath, ...(dependencies ?? [])], root = fs.realpathSync.native(projectRoot);
70
+ const authorize = (candidate) => {
71
+ if (authorizeSourceRead({ projectRoot: root, sourcePath: candidate }) !== true) throw new Error("Execution source read is not authorized");
72
+ };
73
+ paths.forEach(authorize);
74
+ const head = repositoryHeadIdentity(root);
75
+ const captured = paths.map((candidate) => { if (dependencies) authorize(candidate); return { path: candidate, ...sourceBytes(root, candidate) }; });
76
+ const size = captured.reduce((bytes, file) => bytes + file.sourceBytes, 0);
77
+ if (size > MAX_SOURCE_BYTES) throw new Error("Module source budget exceeded");
78
+ const observation = workingTreeObservation(workingTreeSnapshot(root, {
79
+ isProtectedProjectPath: (candidate) => authorizeSourceRead({ projectRoot: root, sourcePath: candidate }) !== true
80
+ }));
81
+ // Dependencies can be ignored by Git. Re-read each approved member as well as
82
+ // binding the ordinary tree, so an already changed member cannot be captured
83
+ // only in its earlier state. Admission repeats the entire capture after work.
84
+ if (dependencies) for (const file of captured) {
85
+ authorize(file.path);
86
+ const current = sourceBytes(root, file.path);
87
+ if (current.sourceDigest !== file.sourceDigest || current.sourceMode !== file.sourceMode) throw new Error("Execution source graph changed during capture");
88
+ }
89
+ if (!observation.proofCapable || repositoryHeadIdentity(root) !== head) throw new Error("Repository snapshot is incomplete or changed");
90
+ const moduleGraph = dependencies && Object.freeze({ entry: sourcePath,
91
+ dependencies: Object.freeze(captured.slice(1).map((file) => Object.freeze({ path: file.path, source: file.source }))) });
92
+ const source = captured[0].source;
93
+ const binding = Object.freeze({ version: EXECUTION_SNAPSHOT_VERSION, projectId: hash(root), head,
94
+ workingTreeDigest: observation.digest, sourcePath, sourceDigest: hash(executionSourceText({ source, moduleGraph })),
95
+ sourceBytes: size, sourceMode: captured[0].sourceMode,
96
+ ...(moduleGraph ? { moduleFiles: Object.freeze(captured.map((file) => Object.freeze({ sourcePath: file.path,
97
+ sourceDigest: file.sourceDigest, sourceBytes: file.sourceBytes, sourceMode: file.sourceMode }))) } : {}) });
98
+ return Object.freeze({ binding, snapshotDigest: hash(JSON.stringify(binding)), source, ...(moduleGraph ? { moduleGraph } : {}) });
99
+ }
100
+
101
+ function compositeMaterialBytes(root, binding, maximumBytes) {
102
+ if (binding.mode === "protected") return Object.freeze({ id: binding.id, mode: binding.mode,
103
+ relativePath: binding.relativePath, byteLength: 0, sha256: null, text: null });
104
+ const captured = sourceBytes(root, binding.relativePath);
105
+ if (captured.sourceBytes > maximumBytes || binding.mode === "frozen" && captured.sourceDigest !== binding.sha256) {
106
+ throw new Error("Composite material does not match its approved identity");
107
+ }
108
+ return Object.freeze({ id: binding.id, mode: binding.mode, relativePath: binding.relativePath,
109
+ byteLength: captured.sourceBytes, sha256: captured.sourceDigest, text: captured.source });
110
+ }
111
+
112
+ /** Stable host capture for signed composite bindings; protected bytes are never opened. */
113
+ export function captureCompositeExecutionSnapshot({ projectRoot, materialBindings, declarations } = {}) {
114
+ if (typeof projectRoot !== "string" || !path.isAbsolute(projectRoot) || !Array.isArray(materialBindings)
115
+ || !declarations || !Array.isArray(declarations.materials)) throw new TypeError("Invalid composite snapshot request");
116
+ const root = fs.realpathSync.native(projectRoot), head = repositoryHeadIdentity(root);
117
+ const declared = new Map(declarations.materials.map(material => [material.id, material.byteLength]));
118
+ if (declared.size !== declarations.materials.length || materialBindings.length !== declared.size) {
119
+ throw new TypeError("Composite material declarations do not match bindings");
120
+ }
121
+ const protectedPaths = new Set(materialBindings.filter(binding => binding.mode === "protected").map(binding => binding.relativePath));
122
+ const observe = () => workingTreeObservation(workingTreeSnapshot(root, {
123
+ isProtectedProjectPath: candidate => protectedPaths.has((path.isAbsolute(candidate) ? path.relative(root, candidate) : candidate).split(path.sep).join("/"))
124
+ }));
125
+ const beforeTree = observe();
126
+ const materials = materialBindings.map(binding => {
127
+ if (!declared.has(binding.id)) throw new TypeError("Composite material binding is undeclared");
128
+ return compositeMaterialBytes(root, binding, declared.get(binding.id));
129
+ });
130
+ if (materials.reduce((total, material) => total + material.byteLength, 0) > 1024 * 1024) {
131
+ throw new Error("Composite material byte budget exceeded");
132
+ }
133
+ const after = materialBindings.map(binding => compositeMaterialBytes(root, binding, declared.get(binding.id)));
134
+ const afterTree = observe();
135
+ const materialIdentity = rows => rows.map(({ text: _text, ...identity }) => identity);
136
+ if (JSON.stringify(materialIdentity(materials)) !== JSON.stringify(materialIdentity(after))
137
+ || beforeTree.digest !== afterTree.digest || repositoryHeadIdentity(root) !== head) {
138
+ throw new Error("Composite source or material changed during capture");
139
+ }
140
+ const identities = materialIdentity(materials);
141
+ return Object.freeze({ projectId: hash(root), projectHead: head,
142
+ sourceDigest: hash(JSON.stringify([head, beforeTree.digest])), materialSnapshotDigest: hash(JSON.stringify(identities)),
143
+ workingTreeDigest: beforeTree.digest, proofCapable: beforeTree.proofCapable,
144
+ materials: Object.freeze(materials), identities: Object.freeze(identities) });
145
+ }
146
+
147
+ export function snapshotPlanSource(snapshot) {
148
+ return { source: snapshot.source, ...(snapshot.moduleGraph ? { moduleGraph: snapshot.moduleGraph } : {}) };
149
+ }
150
+
151
+ /**
152
+ * Host-only bridge. Expected checks and backend configuration must come from
153
+ * an approved contract adapter. No receipt or source-repair authority is minted.
154
+ * The legacy dirty-tree digest alone cannot bind a clean checkout's HEAD or
155
+ * ignored source bytes, so both are bound independently here.
156
+ */
157
+ export async function runSnapshotBoundContract({ projectRoot, sourcePath, modulePaths, authorizeSourceRead, exportName, checks,
158
+ profile, imageId, dockerSocket, dockerCommand, timeoutMs, startupAllowanceMs, signal, executionRunId } = {}) {
159
+ const request = { projectRoot, sourcePath, modulePaths, authorizeSourceRead };
160
+ const before = captureExecutionSnapshot(request);
161
+ const nodeProfile = profile !== undefined;
162
+ const result = await runIndependentContract({
163
+ planText: JSON.stringify({ schemaVersion: nodeProfile ? 2 : 1, ...(nodeProfile ? { profile } : {}),
164
+ ...snapshotPlanSource(before), exportName, checks }), imageId, dockerSocket,
165
+ ...(dockerCommand === undefined ? {} : { dockerCommand }), timeoutMs, startupAllowanceMs, signal, executionRunId
166
+ });
167
+ let after;
168
+ try { after = captureExecutionSnapshot(request); }
169
+ catch { return Object.freeze({ verdict: "unknown", reason: "post-execution-snapshot-unavailable", before: before.binding, result }); }
170
+ if (before.snapshotDigest !== after.snapshotDigest || result.execution.sourceDigest !== before.binding.sourceDigest) {
171
+ return Object.freeze({ verdict: "unknown", reason: "execution-snapshot-drift", before: before.binding, after: after.binding, result });
172
+ }
173
+ return Object.freeze({ verdict: result.verdict, snapshotDigest: before.snapshotDigest, binding: before.binding, result });
174
+ }
@@ -0,0 +1,21 @@
1
+ *
2
+ !Dockerfile
3
+ !package.json
4
+ !package-lock.json
5
+ !worker.mjs
6
+ !protocol.mjs
7
+ !values.mjs
8
+ !capabilities.mjs
9
+ !callback-intrinsics.mjs
10
+ !jobs.mjs
11
+ !references.mjs
12
+ !reference-identity.mjs
13
+ !intrinsics.mjs
14
+ !module-graph.mjs
15
+ !guest.mjs
16
+ !budget.mjs
17
+ !invocation.mjs
18
+ !node-profile.mjs
19
+ !node_modules/
20
+ !node_modules/**
21
+ !structured-clone.mjs
@@ -0,0 +1,5 @@
1
+ FROM piagent-da2-node-g0:20260831-1231@sha256:ae73771c2e50bcbfd18c19efe4c01cb800dbb66c408e2fc17d2de7e28cd18339
2
+ WORKDIR /executor
3
+ COPY Dockerfile package.json package-lock.json worker.mjs protocol.mjs values.mjs intrinsics.mjs module-graph.mjs guest.mjs budget.mjs capabilities.mjs callback-intrinsics.mjs jobs.mjs references.mjs reference-identity.mjs invocation.mjs structured-clone.mjs node-profile.mjs ./
4
+ USER 65534:65534
5
+ ENTRYPOINT ["timeout", "--signal=KILL", "8s", "node", "--max-old-space-size=96", "/executor/worker.mjs"]
@@ -0,0 +1,103 @@
1
+ # Isolated contract worker (experimental)
2
+
3
+ This experimental worker supplies bounded behavioral observations for JavaScript modules in an explicitly approved in-memory source graph, including primitive/Date inputs, bounded array/record data and explicit multi-call histories. Worker v9 retains v8 capabilities and adds opt-in bounded error-message observation. It is reachable through host-approved verification; the worker itself cannot approve completion. External/package imports, timers, arbitrary object graphs and unsupported values must not silently count as supported behavior.
4
+
5
+ ## Authority and isolation
6
+
7
+ - The host selects an authorized local Docker socket and a previously built, approved image by its full `sha256:` ID. A model-supplied image or expected-result plan is not trusted verifier configuration.
8
+ - QuickJS-WASM executes candidate code without host callbacks, process/IO bindings or expected answers. Cases get a fresh realm unless they belong to one explicit contiguous sequence. A reset destroys that realm; only explicitly referenced, actually observed inert data can cross the reset.
9
+ - The host retains expectations and compares typed observations. Candidate `JSON.stringify`, `toJSON`, exception names and stdout are not verdict authorities. Reflection/Date/error intrinsics are captured before initialization; data-property creation uses captured functions and null-prototype descriptors. Proxy tracking uses null-prototype handlers to prevent candidate-added inherited traps from exposing an untracked factory. Returned accessors and tracked proxies are not traversed.
10
+ - The container has no workspace/socket mounts, network access, root user, elevated capabilities, or writable root filesystem. The controller inspects the actual configuration before starting it. Image pulling and host-execution fallbacks are disabled.
11
+ - QuickJS uses a 32 MiB memory ceiling, 512 KiB stack ceiling, and a 300,000-microsecond per-case **executing-thread** CPU budget. Both user and system CPU on that thread count, including parsing, host marshalling and observation work. Background compiler/support threads do not consume the case allowance; they remain charged by the unchanged container-wide CPU-time rlimit (10 seconds soft / 12 seconds hard), one-CPU quota and wall watchdog. This changes the accounting domain from worker v5, not merely its numeric limit. Scheduler waiting does not consume the case budget. The absolute 5-second request wall deadline is not renewed by another case. Both limits are polled during interpretation and before admitting a completed observation; a poll can overshoot, and native operations still require the watchdog. The container retains its 256 MiB memory limit, 32-PID limit and separate 8-second OS watchdog. An outer host deadline can stop an attached run. Engine interrupts alone are not treated as sufficient isolation.
12
+ - Cleanup is limited to the newly created container with the exact run label, image ID, and container ID. Unconfirmed cleanup invalidates the observation. No Docker pruning or deletion of user containers is performed.
13
+
14
+ These are tested containment controls, not a guarantee against every engine or kernel vulnerability. Backend/image admission, verifier installation integrity, and project execution authorization must remain separate runtime gates.
15
+
16
+ ## Building and verifying
17
+
18
+ This directory has its own locked dependencies and is deliberately separate from the platform's shared `node_modules`. Install them with `npm ci --ignore-scripts --workspaces=false --no-audit --no-fund`. The lock pins QuickJS core, the release-sync WASM package, and FFI types to 0.32.0, including package integrity hashes. No dependency lifecycle scripts are required.
19
+
20
+ Build this directory with `BASE_IMAGE` set to a locally available, approved repository-qualified Node digest (`node@sha256:...`, not a bare image ID `sha256:...`). The Dockerfile deliberately has no mutable default base. The build context allowlist contains only worker source, its manifest/lock, and its dedicated dependencies; it never contains a project snapshot, credentials, or expected-result plans. Build with `--network=none --pull=false`; dependency installation is a separate, explicit setup step. Check that the selected builder actually uses the cached base: RUN network isolation does not itself prohibit registry metadata resolution. The local v4 verification used the already cached base with the legacy builder explicitly selected; that deprecated builder is not a future portability guarantee.
21
+
22
+ Worker v7 retains v6's separate `guest-cpu-budget` and `guest-wall-deadline` diagnostics, including a top-level timeout reason when the request expires between cases. A case that stops on either limit includes its first stopping sample: process CPU, current-thread CPU and elapsed case time, in microseconds. The CPU stop must be justified by at least 300,000 microseconds on the executing thread. Process CPU is retained as a diagnostic of total support overhead, not discarded. The parser requires bounded samples for case resource stops, rejects them on completed/unsupported cases, and rejects older worker observations. A wall deadline between cases has no invented case sample. Neither timeout is a behavioral counterexample. CPU accounting is platform/thread-dependent, not deterministic instruction fuel or a performance promise. Worker source and dependency declarations participate in installed-verifier identity, and the exact built image remains a separate host-approved binding. No production approval or retry allowance is changed by building another image. No experimental V8 compiler flags are enabled.
23
+
24
+ If Docker's credential helper blocks a local-only build, use a separate temporary Docker client configuration containing an empty JSON object and an explicit local socket. Do not inspect, replace, or weaken the user's credential store. The initial local diagnostic used Docker's legacy builder with that isolated configuration; build portability remains to be validated before release.
25
+
26
+ Set `PIAGENT_CONTRACT_EXECUTOR_IMAGE_ID` to the built image's full ID and `PIAGENT_CONTRACT_EXECUTOR_SOCKET` to the approved local socket to enable the real executor tests. Without both, tests requiring Docker are visibly skipped, not silently counted as passes. The retained expiry diagnostic additionally requires `PIAGENT_RETAINED_EXPIRY_SOURCE`; its expected source hash is checked before and after read-only execution.
27
+
28
+ ## Remaining integration work
29
+
30
+ `acceptance-independent-contract.js` keeps expectations outside the guest and captures counterexamples on the host. Its result remains **diagnostic evidence** until separate authenticated admission validates the latest private receipt, current source/Git/project-verifier bindings and approved plan. Existing safety, repair and continuation ceilings remain in force.
31
+
32
+ ## Bounded data and histories (worker v2)
33
+
34
+ - Tagged `array` values contain dense arrays of tagged values. Tagged `record` values contain unique `{key,value}` entries. This preserves undefined and special numbers and safely represents an own `__proto__` property. Record equality ignores insertion order; array equality preserves order.
35
+ - A tree is limited to depth 8, 256 nodes, 64 entries per collection, 4096 characters per string/key and 64 KiB of aggregate string/key text. Date values are allowed in inputs/argument observations, not returned data. Existing request, source, response, memory and execution-time limits remain unchanged.
36
+ - These are own enumerable data-property snapshots, not claims about hidden object brands, descriptors, arbitrary prototypes or all JavaScript reflection behavior. Exact identity is observed only by the explicit v7 capability below, not inferred from equal snapshots. Cycles, sparse arrays, accessors, symbols, returned proxies and ordinary exotic objects abstain. Proxy construction is intercepted to track those objects; primitive results produced through internal proxy operations remain supported. Intrinsic reflection is not guaranteed to match Node's runtime.
37
+ - A case may specify `sequence`, a named `exportName`, `reset: true`, and `observeArgs: true`. A sequence must be contiguous. A `result` argument names an earlier successful return in that same sequence and supplies a **copy of its observed data**, not a live object handle or an expected value. Forward/self/cross-history references are rejected before execution. Unavailable results prevent dependent calls from running.
38
+ - `observeArgs` captures every resolved argument after a return or throw. The host may require exact `expected.argsAfter` values. Inputs are mutable; observation must not freeze them. Clock observations are per call, including when module state is retained. A captured `Date.now` callable observes the current step's clock rather than its first step's value; its identity survives mocked/real-clock transitions. Only mocked reads contribute to `clockReads`.
39
+ - Counterexamples include the complete input prefix for a stateful failure. Worst-case repeated prefix bytes are bounded to 2 MiB before execution. No invocation history or expected answer is injected into the candidate's global scope.
40
+
41
+ A realm reset tests a component's checkpoint/restore contract. It is **not** an OS-crash, filesystem-durability, transaction or arbitrary application-state proof. S0 process-death tests and host receipt reconciliation remain separate.
42
+
43
+ ## Approved module graphs (worker v3)
44
+
45
+ An approved host contract can add `modulePaths`, listing dependencies relative to the project root; `sourcePath` remains the entry. The list is explicit, bounded and authenticated. It is not populated by reading candidate import expressions. For example, a contract whose entry is `src/main.js` may name `src/state.js` and `shared/math.js` as dependencies. Omitting the list retains closed-module execution; an empty list permits only the named entry's identity.
46
+
47
+ The host captures authorized regular files into `moduleGraph: {entry, dependencies: [{path, source}]}` alongside entry `source`. Entry plus dependencies are limited to 32 files and **128 KiB total source**, not 128 KiB per file. The request/response, memory and time ceilings are unchanged. Each file's bytes, path and mode, graph membership, project identity and Git baseline are bound. Snapshot, execution, durable reuse and authenticated admission use the same graph source identity. A dependency-only change invalidates old evidence. Current project-verifier evidence must cover every member; an ignored dependency cannot borrow the entry's project-verifier pass.
48
+
49
+ The worker resolves only relative ESM imports to that in-memory allowlist. It supports transitive imports, re-exports, cyclic live bindings and one instance per normalized module path; reset destroys the entire realm and module state. Dynamic imports additionally require the explicit async capability below. No module request reads the host filesystem. Missing files, bare/package specifiers, Node built-ins, URLs, root escapes, encoded names, query/fragment identities and directory imports are unsupported. No extension guessing or package resolution occurs.
50
+
51
+ Without `awaitResult: true`, returned promises, asynchronous modules and pending QuickJS jobs remain unsupported. Pending-job checks run before a call, after it and after observation. Even in async mode, new jobs caused by observation are not drained after snapshots have already been captured; they abstain. Graph membership is a captured-source identity, not a claim that every branch or export was tested.
52
+
53
+ ## Approved async and identity capabilities (worker v7, retained in v8)
54
+
55
+ Capabilities belong to each signed case, not an ambient worker switch. `awaitResult: true` drains at most 1,024 guest jobs and observes intrinsic Promise settlement under the unchanged CPU/wall limits. Top-level await and ordinary thenables are supported within these limits. Unresolved work abstains; job exhaustion is an executor error, not a behavioral counterexample.
56
+
57
+ `callbacks` declares up to eight named, private guest functions, with finite return/throw steps, explicit sync/Promise mode and repeat-last policy. Inputs reference them with `{type:"callback",value:"id"}`, including inside options records. Promise responses settle after 1–32 guest jobs, default one; this is scheduling control, not elapsed time. There are at most 64 invocations and 32,768 trace characters per case. `callbackTrace` records ordered call/settlement events with invocation indices and inert argument snapshots. It is required in both expectations and settled observations whenever callbacks are declared. Candidate-installed thenable behavior in response data, unsupported arguments, exhausted plans, overflow and stale callbacks cause sticky verifier faults. Expected answers never enter these closures.
58
+
59
+ `observeIdentity: true` requires `returnIdentity` on a return: the indices of direct object arguments identical to the actual result. Primitives are not identity matches. `observeError: true` requires an `errorObservation` on a throw, containing identity against optional approved `errors` and inert own properties. In v8, custom non-enumerable own data properties are included too: an attached checkpoint must not appear absent merely because of its descriptor. Non-enumerable native `message`/`stack` metadata is excluded. Custom getters and symbol keys abstain without invocation. This does not certify descriptors or arbitrary error prototypes. An argument `{type:"error-property",value:"earlier-case",key:"checkpoint"}` copies that earlier throw's observed property in the same history; it cannot copy executable callback references or borrow the expected answer. This also works across a realm reset.
60
+
61
+ See the [design and qualification obligations](../../../../docs/decisions/harness-next-async-observation-design.md). The pinned engine does not expose Node's unhandled-rejection policy; detached rejections, timers, IO, package/CommonJS resolution and general Node equivalence are not certified. Current project tests remain mandatory. Reusable production family review, independently frozen held-out calibration, minimum-Node packaging and the full release campaign remain separate requirements. Universal JavaScript support is not claimed.
62
+
63
+ ## Nested object identity (worker v8)
64
+
65
+ An approved case may declare 1–16 `referencePairs`, each with a unique `id` and two selectors (`left`, `right`). A selector has a `root` (`argument`, `return` or `error`) and `path`, an array of at most eight string property keys. An argument root also requires its `index`; an error root requires `observeError: true`. These are bounded data paths, never expressions. Each declared pair requires an ordered `{id, same}` entry in `expected.referenceIdentity` and the settled worker observation. Old worker responses cannot supply v8 evidence.
66
+
67
+ For example, compare `{root:"error",path:["checkpoint"]}` with `{root:"argument",index:1,path:[]}` to require a new attached checkpoint, or `{root:"return",path:["results"]}` with `{root:"argument",index:1,path:["results"]}` to reject a result array borrowed from an action. Captured identity and own-property descriptor intrinsics run before any candidate-controlled getter or proxy trap. Such unsupported paths abstain instead of executing accessors. Inherited properties are not traversed. Missing paths, absent return/error roots and primitives are not object aliases, so `same:false` alone does **not** establish that a field exists or has the correct shape: the accompanying typed value or error-property expectations must do that. Paths refer to actual objects at the end of this invocation, not pre-call handles or cross-case live references. Existing argument snapshots remain necessary to reject mutation. No resource ceiling or approval rule is relaxed.
68
+
69
+ ## Error messages (worker v9 / Node profile worker v2)
70
+
71
+ `observeErrorMessage: true` requests a separate `errorMessage` on a throw. It reads
72
+ only the first inert string `message` descriptor in a prototype chain bounded to
73
+ 32 objects and checks that complete chain for tracked proxies before error-class
74
+ observation. Getters, proxies, coercion, non-string messages, excessive depth or
75
+ messages longer than 4096 UTF-16 code units produce unsupported/unknown. No stack
76
+ is read. A verified absence throughout the complete inert chain is `null`; this
77
+ is observed missing data, not a stand-in for unavailable observation. Primitive
78
+ throws also have `null` and retain their `non-error` classification.
79
+
80
+ The host-only expectation is `errorMessage: {includes: "conflict", ignoreCase: true}`.
81
+ The non-empty literal is bounded to 4096 code units. `ignoreCase` is required and
82
+ uses ECMAScript non-Unicode case-insensitive matching; metacharacters are escaped,
83
+ not interpreted as a plan-supplied expression. Missing required observation is
84
+ rejected. Unsupported execution never becomes a behavioral counterexample.
85
+
86
+ Without this opt-in, message collection and existing `observeError` property
87
+ semantics are unchanged. Observed message text may appear in private diagnostic
88
+ receipts/counterexamples, so do not enable it for contracts containing secrets or
89
+ publish raw observations without review. Expectations never enter the guest.
90
+ Worker/comparison versions and Node-profile/installed-verifier digests change;
91
+ old images and approvals are not qualified by new source tests. This capability
92
+ does not activate any plan, supply completion authority or change benchmark mode.
93
+
94
+ Node profile worker v4 hashes the same pinned Node executable with a 1 MiB buffer instead of reading its approximately 120 MB body into one temporary. Every byte and the expected SHA-256 remain identical; the request wall, case thread-CPU, container CPU/memory and watchdog limits are unchanged. The worker/profile/source identity changes, so old observations are not current v4 evidence. This addresses measured bootstrap allocation/I/O overhead, not a wider supported API or a retry allowance.
95
+
96
+
97
+ ### Docker startup and control deadlines
98
+
99
+ The host executor allows up to 60 seconds for each Docker create, inspect, or removal command. These control requests can wait on daemon maintenance independently of guest execution. An inconclusive create is reconciled by its unique name, owner label and pinned image. A timed-out create is never retried or started; an owned late container is removed. If ownership or removal cannot be established, cleanup remains unconfirmed.
100
+
101
+ The approved backend may specify `startupAllowanceMs`, an integer from 0 to 60000 (default 0). The attached start command waits at most `timeoutMs + startupAllowanceMs`. This is an additional bound on the entire attached command, not a measurement of time spent before guest startup. The image watchdog and guest CPU/wall limits remain unchanged. An explicit old `timeoutMs` is not silently extended. Cancellation interrupts the attached command; ownership checks and cleanup still run afterward.
102
+
103
+ Selection recipes, signed host approvals, durable execution identities and benchmark observations bind the allowance. Changing it requires a new approved backend identity and cannot reuse evidence collected with a different allowance. Omitting it and explicitly setting zero have identical execution semantics. A longer allowance does not grant completion, add a retry, or turn uncertain cleanup into success.
@@ -0,0 +1,54 @@
1
+ import { cpuUsage, threadCpuUsage } from "node:process";
2
+ import { performance } from "node:perf_hooks";
3
+
4
+ export const CASE_THREAD_CPU_MICROS = 300000;
5
+ export const REQUEST_WALL_MS = 5000;
6
+ export const CPU_EXHAUSTED = "guest-cpu-budget";
7
+ export const WALL_EXHAUSTED = "guest-wall-deadline";
8
+
9
+ // Host-owned clocks, never guest globals or request-supplied limits. Each case
10
+ // charges its executing thread, including host work on that thread. Background
11
+ // compiler/support CPU stays under the container-wide CPU and wall limits; it
12
+ // cannot steal this case's allowance. This is not an instruction/fuel estimate.
13
+ export function createExecutionBudget(overallDeadline, clocks = { now: () => performance.now(), cpu: cpuUsage, threadCpu: threadCpuUsage }) {
14
+ if (!Number.isFinite(overallDeadline)) throw new TypeError("Invalid execution deadline");
15
+ const readCpu = (read = clocks.cpu) => {
16
+ const { user, system } = read();
17
+ if (![user, system, user + system].every((value) => Number.isSafeInteger(value) && value >= 0)) throw new Error("Invalid resource observation");
18
+ return user + system;
19
+ };
20
+ let initialCpu = readCpu(), previousCpu = initialCpu, reason = null, diagnostic = null, caseActive = false;
21
+ let initialThread = readCpu(clocks.threadCpu), startedAt = clocks.now();
22
+ let previousThread = initialThread;
23
+ if (!Number.isFinite(startedAt)) throw new Error("Invalid resource observation");
24
+ return {
25
+ beginCase() {
26
+ initialCpu = readCpu();
27
+ if (initialCpu < previousCpu) throw new Error("Invalid resource observation");
28
+ previousCpu = initialCpu; initialThread = readCpu(clocks.threadCpu); startedAt = clocks.now();
29
+ if (initialThread < previousThread) throw new Error("Invalid resource observation");
30
+ previousThread = initialThread;
31
+ if (!Number.isFinite(startedAt)) throw new Error("Invalid resource observation");
32
+ reason = null; diagnostic = null; caseActive = true;
33
+ },
34
+ poll() {
35
+ if (reason) return reason;
36
+ const now = clocks.now(), current = readCpu(), used = current - initialCpu;
37
+ const currentThread = readCpu(clocks.threadCpu), caseThreadCpuMicros = currentThread - initialThread;
38
+ if (!Number.isFinite(now) || now < startedAt || current < previousCpu || currentThread < previousThread) throw new Error("Invalid resource observation");
39
+ previousCpu = current; previousThread = currentThread;
40
+ if (now >= overallDeadline) reason = WALL_EXHAUSTED;
41
+ else if (caseActive && caseThreadCpuMicros >= CASE_THREAD_CPU_MICROS) reason = CPU_EXHAUSTED;
42
+ if (reason) {
43
+ const caseWallMicros = Math.ceil((now - startedAt) * 1000);
44
+ if (![caseThreadCpuMicros, caseWallMicros].every(value => Number.isSafeInteger(value) && value >= 0)) {
45
+ throw new Error("Invalid resource observation");
46
+ }
47
+ // Keep both counters so support overhead remains visible to the host.
48
+ diagnostic = Object.freeze({ caseCpuMicros: used, caseThreadCpuMicros, caseWallMicros });
49
+ }
50
+ return reason;
51
+ },
52
+ diagnostics() { return diagnostic; }
53
+ };
54
+ }
@@ -0,0 +1,126 @@
1
+ import { MAX_CALLBACK_CALLS, MAX_CALLBACK_TRACE_CHARS } from "./capabilities.mjs";
2
+ import { MAX_STRING_LENGTH } from "./values.mjs";
3
+
4
+ // Spliced only into the worker-owned pre-candidate closure. No host callback,
5
+ // expected answer, dynamic code template or globally reachable registry.
6
+ export const CALLBACK_INTRINSICS = `
7
+ const WM = WeakMap, wmGet = WM.prototype.get, wmSet = WM.prototype.set;
8
+ const slice = String.prototype.slice, CallbackError = TypeError;
9
+ const NativePromise = Promise, promiseResolve = NativePromise.resolve;
10
+ const errorConstructors = [TypeError, RangeError, SyntaxError, ReferenceError, EvalError, URIError, Error];
11
+ let callbacks = create(null), errorValues = create(null), callbackReferences = new WM();
12
+ let generation = 0, callbackFault = null, trace = '', calls = 0;
13
+ const callbackId = value => value !== null && (typeof value === 'object' || typeof value === 'function')
14
+ ? apply(wmGet, callbackReferences, [value]) : undefined;
15
+ function fault(reason) { callbackFault ??= reason; throw new CallbackError('callback observation unavailable'); }
16
+ function callbackValueText(value) {
17
+ const encoded = observeValue(value, true, true);
18
+ if (apply(slice, encoded, [0, 9]) !== '{"value":') fault('callback-argument-unsupported');
19
+ return apply(slice, encoded, [9, -1]);
20
+ }
21
+ function beginCapabilities() {
22
+ generation += 1; callbacks = create(null); errorValues = create(null); callbackReferences = new WM();
23
+ callbackFault = null; trace = ''; calls = 0;
24
+ }
25
+ function appendTrace(entry) {
26
+ if (trace.length + entry.length + (trace ? 1 : 0) + 2 > ${MAX_CALLBACK_TRACE_CHARS}) fault('callback-trace-limit');
27
+ trace += (trace ? ',' : '') + entry;
28
+ }
29
+ function inertPromiseResponse(value) {
30
+ if (value === null || typeof value !== 'object') return;
31
+ let current = value, depth = 0;
32
+ while (current !== null) {
33
+ if (++depth > 32 || apply(has, proxies, [current])) fault('callback-response-unsupported');
34
+ const property = descriptor(current, 'then');
35
+ if (property) {
36
+ if (!own(property, 'value') || typeof property.value === 'function') fault('callback-response-unsupported');
37
+ return;
38
+ }
39
+ current = prototype(current);
40
+ }
41
+ }
42
+ async function settleCallback(id, call, outcome, value, delay, epoch) {
43
+ for (let i = 0; i < delay; i += 1) await undefined;
44
+ if (epoch !== generation) fault('stale-callback-invocation');
45
+ // No yield occurs between this inertness check and resolution. Otherwise a
46
+ // candidate-installed thenable could make a "settle" event premature.
47
+ if (outcome === 'return') inertPromiseResponse(value);
48
+ appendTrace('{"callback":' + stringify(id) + ',"call":' + call + ',"event":"settle","outcome":' + stringify(outcome) + '}');
49
+ if (outcome === 'throw') throw value;
50
+ return value;
51
+ }
52
+ function makeError(id, errorClass, message, properties) {
53
+ let Constructor;
54
+ for (let i = 0; i < names.length; i += 1) if (names[i] === errorClass) Constructor = errorConstructors[i];
55
+ if (!Constructor) fault('callback-error-class-unsupported');
56
+ const value = new Constructor(message), keys = ownKeys(properties);
57
+ for (let i = 0; i < keys.length; i += 1) {
58
+ const key = keys[i], property = descriptor(properties, key);
59
+ if (!property || !own(property, 'value')) fault('callback-error-properties-unsupported');
60
+ define(value, key, dataDescriptor(property.value, true));
61
+ }
62
+ errorValues[id] = value; return value;
63
+ }
64
+ function makeCallback(id, mode, repeatLast, steps, delay) {
65
+ const epoch = generation; let index = 0;
66
+ const fn = (...args) => {
67
+ if (epoch !== generation) fault('stale-callback-invocation');
68
+ if (calls >= ${MAX_CALLBACK_CALLS}) fault('callback-trace-limit');
69
+ if (args.length > 16) fault('callback-argument-limit');
70
+ const call = index;
71
+ let entry = '{"callback":' + stringify(id) + ',"call":' + call + ',"event":"call","args":[';
72
+ for (let i = 0; i < args.length; i += 1) entry += (i ? ',' : '') + callbackValueText(args[i]);
73
+ entry += ']}';
74
+ appendTrace(entry); calls += 1;
75
+ if (index >= steps.length && !repeatLast) fault('callback-plan-exhausted');
76
+ const step = steps[index < steps.length ? index : steps.length - 1]; index += 1;
77
+ const value = step.outcome === 'throw' ? errorValues[step.error] : step.value;
78
+ if (mode === 'promise') return settleCallback(id, call, step.outcome, value, delay, epoch);
79
+ if (step.outcome === 'throw') throw value;
80
+ return value;
81
+ };
82
+ callbacks[id] = fn; apply(wmSet, callbackReferences, [fn, id]); return fn;
83
+ }
84
+ function errorMessage(value) {
85
+ let current = value, message = null, found = false, depth = 0;
86
+ if (current !== null && typeof current !== 'object' && typeof current !== 'function') return '{"value":null}';
87
+ while (current !== null) {
88
+ // Check the entire chain before errorClass may use isPrototypeOf. An own
89
+ // message must not hide a proxy deeper in the thrown object's prototypes.
90
+ if (++depth > 32 || apply(has, proxies, [current])) return '{"reason":"error-message-unsupported"}';
91
+ if (!found) {
92
+ const property = descriptor(current, 'message');
93
+ if (property) {
94
+ if (!own(property, 'value') || typeof property.value !== 'string'
95
+ || property.value.length > ${MAX_STRING_LENGTH}) return '{"reason":"error-message-unsupported"}';
96
+ message = property.value; found = true;
97
+ }
98
+ }
99
+ current = prototype(current);
100
+ }
101
+ return '{"value":' + (message === null ? 'null' : stringify(message)) + '}';
102
+ }
103
+ function errorObservation(value) {
104
+ if (value !== null && (typeof value === 'object' || typeof value === 'function') && apply(has, proxies, [value])) {
105
+ return '{"reason":"error-object-unsupported"}';
106
+ }
107
+ let identity = null;
108
+ const ids = ownKeys(errorValues);
109
+ for (let i = 0; i < ids.length; i += 1) if (same(value, errorValues[ids[i]])) identity = ids[i];
110
+ const properties = create(null);
111
+ if (value !== null && (typeof value === 'object' || typeof value === 'function')) {
112
+ const keys = ownKeys(value);
113
+ for (let i = 0; i < keys.length; i += 1) {
114
+ const key = keys[i], property = descriptor(value, key);
115
+ // Native Error message/stack are diagnostic metadata. Custom own data
116
+ // (notably checkpoint) exists even when defined as non-enumerable.
117
+ if (property && !property.enumerable && (key === 'message' || key === 'stack')) continue;
118
+ if (!property || typeof key !== 'string' || !own(property, 'value')) return '{"reason":"error-properties-unsupported"}';
119
+ define(properties, key, dataDescriptor(property.value, true));
120
+ }
121
+ }
122
+ const encoded = observeValue(properties, true, true);
123
+ if (apply(slice, encoded, [0, 9]) !== '{"value":') return '{"reason":"error-properties-unsupported"}';
124
+ return '{"identity":' + (identity === null ? 'null' : stringify(identity)) + ',"properties":' + apply(slice, encoded, [9, -1]) + '}';
125
+ }
126
+ `;