pi-session-mcp 0.8.3 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (843) hide show
  1. package/.pi-session-mcp-cli/client-adapters/command.js +33 -0
  2. package/.pi-session-mcp-cli/client-adapters/mcp-verifier.js +198 -0
  3. package/.pi-session-mcp-cli/client-adapters/types.js +1 -0
  4. package/.pi-session-mcp-cli/config.js +29 -3
  5. package/.pi-session-mcp-cli/container-runtime.js +18 -0
  6. package/.pi-session-mcp-cli/doctor.js +370 -4
  7. package/.pi-session-mcp-cli/execution-modes.js +83 -0
  8. package/.pi-session-mcp-cli/execution-profile.js +1 -0
  9. package/.pi-session-mcp-cli/override-lock.js +4 -4
  10. package/.pi-session-mcp-cli/session-tools.js +45 -0
  11. package/.pi-session-mcp-cli/setup-platform.js +64 -36
  12. package/.pi-session-mcp-cli/setup-process.js +455 -0
  13. package/.pi-session-mcp-cli/skill-library.js +8 -4
  14. package/.pi-session-mcp-cli/turn-events.js +97 -0
  15. package/.pi-session-mcp-cli/writer-boundary.js +321 -0
  16. package/.pi-session-mcp-cli/writer-fence.js +50 -0
  17. package/.pi-session-mcp-cli/writer-lease.js +140 -0
  18. package/.pi-session-mcp-cli/writer-lifecycle.js +567 -0
  19. package/.pi-session-mcp-cli/writer-state.js +199 -0
  20. package/.pi-session-mcp-cli/writer-wrapper.js +14 -0
  21. package/CHANGELOG.md +527 -0
  22. package/README.md +8 -2
  23. package/dist/capabilities.d.ts +9 -1
  24. package/dist/capabilities.js +8 -3
  25. package/dist/child-stdio-transport.d.ts +21 -0
  26. package/dist/child-stdio-transport.js +88 -0
  27. package/dist/client-adapters/claude-code.js +3 -2
  28. package/dist/client-adapters/command.d.ts +8 -0
  29. package/dist/client-adapters/command.js +9 -1
  30. package/dist/client-adapters/mcp-verifier.d.ts +7 -0
  31. package/dist/client-adapters/mcp-verifier.js +21 -4
  32. package/dist/client-adapters/types.d.ts +5 -1
  33. package/dist/client-adapters/writer-registration.d.ts +16 -0
  34. package/dist/client-adapters/writer-registration.js +156 -0
  35. package/dist/config.d.ts +12 -1
  36. package/dist/config.js +29 -3
  37. package/dist/container-runtime.d.ts +2 -0
  38. package/dist/container-runtime.js +18 -0
  39. package/dist/doctor.d.ts +36 -2
  40. package/dist/doctor.js +370 -4
  41. package/dist/event-spool.d.ts +70 -0
  42. package/dist/event-spool.js +180 -0
  43. package/dist/execution-modes.d.ts +60 -0
  44. package/dist/execution-modes.js +83 -0
  45. package/dist/execution-profile.d.ts +2 -0
  46. package/dist/execution-profile.js +1 -0
  47. package/dist/main.js +63 -8
  48. package/dist/override-lock.d.ts +2 -0
  49. package/dist/override-lock.js +4 -4
  50. package/dist/pi-adapter.d.ts +31 -1
  51. package/dist/pi-adapter.js +12 -0
  52. package/dist/process-diagnostics.d.ts +1 -1
  53. package/dist/process-diagnostics.js +2 -1
  54. package/dist/refusal-server.d.ts +6 -0
  55. package/dist/refusal-server.js +46 -0
  56. package/dist/sdk-pi-adapter.js +16 -9
  57. package/dist/server.d.ts +3 -2
  58. package/dist/server.js +27 -53
  59. package/dist/session-registry.d.ts +32 -2
  60. package/dist/session-registry.js +61 -11
  61. package/dist/session-tools.d.ts +14 -5
  62. package/dist/session-tools.js +13 -9
  63. package/dist/setup-cli.d.ts +14 -0
  64. package/dist/setup-cli.js +132 -0
  65. package/dist/setup-command-guardian.js +9 -3
  66. package/dist/setup-hooks.d.ts +158 -0
  67. package/dist/setup-hooks.js +657 -0
  68. package/dist/setup-main.d.ts +1 -1
  69. package/dist/setup-main.js +18 -2
  70. package/dist/setup-modes.d.ts +18 -0
  71. package/dist/setup-modes.js +131 -0
  72. package/dist/setup-ownership.d.ts +1 -0
  73. package/dist/setup-ownership.js +11 -3
  74. package/dist/setup-platform.d.ts +9 -1
  75. package/dist/setup-platform.js +64 -36
  76. package/dist/setup-process.d.ts +23 -1
  77. package/dist/setup-process.js +88 -10
  78. package/dist/setup-writers.d.ts +42 -0
  79. package/dist/setup-writers.js +510 -0
  80. package/dist/setup.d.ts +4 -1
  81. package/dist/setup.js +23 -10
  82. package/dist/skill-library.d.ts +2 -0
  83. package/dist/skill-library.js +8 -4
  84. package/dist/tool-schemas.d.ts +339 -0
  85. package/dist/tool-schemas.js +49 -0
  86. package/dist/turn-events.d.ts +45 -0
  87. package/dist/turn-events.js +97 -0
  88. package/dist/wake-hook.d.ts +180 -0
  89. package/dist/wake-hook.js +638 -0
  90. package/dist/wake-main.d.ts +8 -0
  91. package/dist/wake-main.js +111 -0
  92. package/dist/writer-acceptance.d.ts +10 -0
  93. package/dist/writer-acceptance.js +192 -0
  94. package/dist/writer-boundary.d.ts +52 -0
  95. package/dist/writer-boundary.js +321 -0
  96. package/dist/writer-credentials.d.ts +29 -0
  97. package/dist/writer-credentials.js +85 -0
  98. package/dist/writer-fence.d.ts +12 -0
  99. package/dist/writer-fence.js +50 -0
  100. package/dist/writer-guard.d.ts +13 -0
  101. package/dist/writer-guard.js +54 -0
  102. package/dist/writer-launch.d.ts +29 -0
  103. package/dist/writer-launch.js +232 -0
  104. package/dist/writer-lease.d.ts +28 -0
  105. package/dist/writer-lease.js +140 -0
  106. package/dist/writer-lifecycle.d.ts +96 -0
  107. package/dist/writer-lifecycle.js +567 -0
  108. package/dist/writer-relay.d.ts +33 -0
  109. package/dist/writer-relay.js +359 -0
  110. package/dist/writer-state.d.ts +111 -0
  111. package/dist/writer-state.js +199 -0
  112. package/dist/writer-wrapper.d.ts +3 -0
  113. package/dist/writer-wrapper.js +14 -0
  114. package/docs/acceptance.md +1694 -1
  115. package/docs/adr/0003-post-mvp-maintenance.md +2 -2
  116. package/docs/adr/0006-pi-extension-allowlist.md +3 -1
  117. package/docs/adr/0008-coding-profile-isolation.md +295 -0
  118. package/docs/adr/0009-execution-modes.md +131 -0
  119. package/docs/adr/0010-read-only-extension-tools.md +68 -0
  120. package/docs/adr/0011-turn-events-and-controller-wake.md +173 -0
  121. package/docs/adr/0012-leased-writer-pool.md +357 -0
  122. package/docs/architecture.md +96 -8
  123. package/docs/client-setup-design.md +12 -8
  124. package/docs/client-setup.md +84 -2
  125. package/docs/doctor-design.md +48 -0
  126. package/docs/evaluation/2026-10-17-live-screening.md +121 -0
  127. package/docs/evaluation/2026-10-17-node-runtime-followup.md +33 -0
  128. package/docs/evaluation/2026-10-17-profile-evaluation-evidence.md +155 -0
  129. package/docs/evaluation/2026-10-17-test-coverage.md +127 -0
  130. package/docs/evaluation/README.md +123 -0
  131. package/docs/evaluation/client-reconnect-2026-10-17/README.md +41 -0
  132. package/docs/evaluation/client-reconnect-2026-10-17/checks.json +38 -0
  133. package/docs/evaluation/client-reconnect-2026-10-17/integrity.json +30 -0
  134. package/docs/evaluation/client-reconnect-2026-10-17/reconnect.json +57 -0
  135. package/docs/evaluation/client-reconnect-2026-10-17/registration-verification.json +389 -0
  136. package/docs/evaluation/client-reconnect-2026-10-17/review.json +10 -0
  137. package/docs/evaluation/controller-ledger-hooks-2026-10-26/README.md +115 -0
  138. package/docs/evaluation/evidence-2026-10-17/budget.proposed.json +13 -0
  139. package/docs/evaluation/evidence-2026-10-17/changed-files.txt +82 -0
  140. package/docs/evaluation/evidence-2026-10-17/checks.json +103 -0
  141. package/docs/evaluation/evidence-2026-10-17/comparison.json +247 -0
  142. package/docs/evaluation/evidence-2026-10-17/development-collection-failure.json +15 -0
  143. package/docs/evaluation/evidence-2026-10-17/full-attempt-default.json +19 -0
  144. package/docs/evaluation/evidence-2026-10-17/full-tests.json +17 -0
  145. package/docs/evaluation/evidence-2026-10-17/inventory.json +239 -0
  146. package/docs/evaluation/evidence-2026-10-17/manifest.json +359 -0
  147. package/docs/evaluation/evidence-2026-10-17/offline.json +1020 -0
  148. package/docs/evaluation/evidence-2026-10-17/ui-reference/T3-1280.png +0 -0
  149. package/docs/evaluation/evidence-2026-10-17/ui-reference/T3-375.png +0 -0
  150. package/docs/evaluation/evidence-2026-10-17/ui-reference/result.json +141 -0
  151. package/docs/evaluation/extension-ablation-2026-10-20/README.md +414 -0
  152. package/docs/evaluation/extension-ablation-2026-10-20/setup.md +140 -0
  153. package/docs/evaluation/extension-ablation-repeat-2026-10-21/README.md +142 -0
  154. package/docs/evaluation/extension-ablation-repeat-2026-10-21/setup.md +69 -0
  155. package/docs/evaluation/extension-audit-2026-10-17/README.md +149 -0
  156. package/docs/evaluation/extension-audit-2026-10-17/checks.json +38 -0
  157. package/docs/evaluation/extension-audit-2026-10-17/cursor-static-evidence.json +93 -0
  158. package/docs/evaluation/extension-audit-2026-10-17/installed-artifact-comparison.json +85 -0
  159. package/docs/evaluation/extension-audit-2026-10-17/installed-packages.json +100 -0
  160. package/docs/evaluation/extension-audit-2026-10-17/integrity.json +108 -0
  161. package/docs/evaluation/extension-audit-2026-10-17/navigation-cursor-registry.json +290 -0
  162. package/docs/evaluation/extension-audit-2026-10-17/navigation-static-evidence.json +185 -0
  163. package/docs/evaluation/extension-audit-2026-10-17/openwiki-headless-bindings.json +25 -0
  164. package/docs/evaluation/extension-audit-2026-10-17/openwiki-headless-cleanup.json +12 -0
  165. package/docs/evaluation/extension-audit-2026-10-17/openwiki-headless-probe.mjs +63 -0
  166. package/docs/evaluation/extension-audit-2026-10-17/openwiki-headless-reproduction.json +91 -0
  167. package/docs/evaluation/extension-audit-2026-10-17/openwiki-headless-result.json +83 -0
  168. package/docs/evaluation/extension-audit-2026-10-17/permission-cache-artifact-verification.json +24 -0
  169. package/docs/evaluation/extension-audit-2026-10-17/permission-cache-evidence.json +133 -0
  170. package/docs/evaluation/extension-audit-2026-10-17/permission-cache-report.md +64 -0
  171. package/docs/evaluation/extension-audit-2026-10-17/publication-export.json +10 -0
  172. package/docs/evaluation/extension-audit-2026-10-17/resolver-gates.json +51 -0
  173. package/docs/evaluation/extension-audit-2026-10-17/review.json +28 -0
  174. package/docs/evaluation/extension-audit-2026-10-17/run-openwiki-headless-probe.mjs +29 -0
  175. package/docs/evaluation/extension-audit-2026-10-17/summary.json +123 -0
  176. package/docs/evaluation/extension-audit-2026-10-17/web-openwiki-artifacts.json +29 -0
  177. package/docs/evaluation/extension-audit-2026-10-17/web-openwiki-evidence.json +116 -0
  178. package/docs/evaluation/extension-audit-2026-10-17/web-openwiki-report.md +113 -0
  179. package/docs/evaluation/extension-functions-2026-10-17/README.md +33 -0
  180. package/docs/evaluation/extension-functions-2026-10-17/bridges/README.md +39 -0
  181. package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts/extension-functions-bridges-03dc1dad-9959-40df-b51c-7820991bf7e3.json +79 -0
  182. package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts/extension-functions-bridges-0c43651e-8c7d-4c7c-aa9b-5b5761141e3b.json +54 -0
  183. package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts/extension-functions-bridges-51247b13-87c1-4ec6-886b-82d922b0585a.json +89 -0
  184. package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts/extension-functions-bridges-5337f6bf-503f-4c45-aac0-43b142385a87.json +47 -0
  185. package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts/extension-functions-bridges-60285194-b1d1-4335-b616-6614941585df.json +46 -0
  186. package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts/extension-functions-bridges-6d2fbaa9-a720-4582-9be1-a95f4764786d.json +69 -0
  187. package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts/extension-functions-bridges-6fbb576c-d87d-478d-9c05-4b5ef3563598.json +125 -0
  188. package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts/extension-functions-bridges-730926d1-ef20-4b2d-ab74-7e542f1065e9.json +48 -0
  189. package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts/extension-functions-bridges-a1baa47a-5bbe-4a16-ade8-a350599eb911.json +48 -0
  190. package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts/extension-functions-bridges-bc1d69c7-784f-4ddb-9335-0d905330d568.json +91 -0
  191. package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts/extension-functions-bridges-d582757d-2859-4683-8310-ec158bf6d551.json +99 -0
  192. package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts/extension-functions-bridges-e6533a23-4933-4d6e-a250-b1b27f010d18.json +60 -0
  193. package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts.json +138 -0
  194. package/docs/evaluation/extension-functions-2026-10-17/bridges/guard.mjs +74 -0
  195. package/docs/evaluation/extension-functions-2026-10-17/bridges/integrity.json +86 -0
  196. package/docs/evaluation/extension-functions-2026-10-17/bridges/openwiki-final.json +125 -0
  197. package/docs/evaluation/extension-functions-2026-10-17/bridges/run.mjs +36 -0
  198. package/docs/evaluation/extension-functions-2026-10-17/bridges/web-final.json +99 -0
  199. package/docs/evaluation/extension-functions-2026-10-17/bridges/worker.mjs +102 -0
  200. package/docs/evaluation/extension-functions-2026-10-17/cache/README.md +21 -0
  201. package/docs/evaluation/extension-functions-2026-10-17/cache/cache-function-evidence-2026-10-17T13-30-31-440Z-b1a47f88-8d86-4238-9ef8-af890d9ba74b.json +129 -0
  202. package/docs/evaluation/extension-functions-2026-10-17/cache/cache-function-evidence-2026-10-17T13-31-04-505Z-a3736add-73b8-4d77-8ea6-084ce8aa4599.json +129 -0
  203. package/docs/evaluation/extension-functions-2026-10-17/cache/cache-function-evidence-2026-10-17T13-31-15-654Z-b0197bff-8363-4d46-b84b-46d9ed67fc39.json +248 -0
  204. package/docs/evaluation/extension-functions-2026-10-17/cache/cache-function-evidence-2026-10-17T13-31-39-137Z-e373f24d-8a8c-46b0-86aa-9f687cfadb9b.json +278 -0
  205. package/docs/evaluation/extension-functions-2026-10-17/cache/cache-function-evidence-2026-10-17T13-32-05-324Z-f63095f1-755e-43fc-9d28-3cd1a9ff4f4d.json +251 -0
  206. package/docs/evaluation/extension-functions-2026-10-17/cache/cache-function-evidence-2026-10-17T13-32-25-191Z-fc9a83af-ceae-40d7-a737-8ef861ba7946.json +282 -0
  207. package/docs/evaluation/extension-functions-2026-10-17/cache/cache-function-evidence-2026-10-17T13-33-14-993Z-5e7eae34-09f0-4c80-9210-b8cc4d1acb5f.json +282 -0
  208. package/docs/evaluation/extension-functions-2026-10-17/cache/cache-function-evidence-2026-10-17T13-38-39-010Z-57cf6a26-f091-45de-8849-b616b303a46c.json +283 -0
  209. package/docs/evaluation/extension-functions-2026-10-17/cache/cache-function-evidence-2026-10-17T13-40-32-118Z-54528e43-ac07-4f9c-8f12-10c041130983.json +283 -0
  210. package/docs/evaluation/extension-functions-2026-10-17/cache/cache-function-evidence-2026-10-17T13-41-49-525Z-48195b6e-f20d-49a5-bd53-a732a0af10c1.json +324 -0
  211. package/docs/evaluation/extension-functions-2026-10-17/cache/cache-function-evidence-2026-10-17T13-42-18-175Z-215330e7-06a6-4666-af9c-2ecb214d8d71.json +324 -0
  212. package/docs/evaluation/extension-functions-2026-10-17/cache/integrity.json +165 -0
  213. package/docs/evaluation/extension-functions-2026-10-17/cache/probe.mjs +161 -0
  214. package/docs/evaluation/extension-functions-2026-10-17/cache/receipt-archive.json +150 -0
  215. package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/commands-headless-3feeffc5-97bf-4079-8505-8119fab7956a.json +54 -0
  216. package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/commands-headless-42e5eace-ad87-480a-94d9-448c1dd167b8.json +49 -0
  217. package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/commands-headless-50f39f1c-8b48-442b-8d15-1f9c8f63bd81.json +49 -0
  218. package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/commands-headless-8482b2b0-f600-488b-9f36-905e0125177a.json +54 -0
  219. package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/payload-codex-bypass-128ffdce-6fd5-431b-8019-32b40ba4174d.json +42 -0
  220. package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/payload-codex-bypass-3b572182-a737-471f-b9cb-b01d5da1752a.json +42 -0
  221. package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/payload-codex-bypass-6c225370-2f47-4a0a-80d5-87d12f6c6fdc.json +37 -0
  222. package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/payload-codex-bypass-b48399db-cbed-43de-9071-ac27c34e3757.json +37 -0
  223. package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/payload-openai-3a8f52b6-c8d6-4d1c-844c-782a6624a29e.json +45 -0
  224. package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/payload-openai-6fcdbc20-b14b-4b80-a4da-bf24078da8d2.json +50 -0
  225. package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/payload-openai-a8d6f628-40e1-437e-b192-f7232a051a44.json +50 -0
  226. package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/payload-openai-c3c39463-a2d6-4ff8-b985-8f6d1fb1aa02.json +45 -0
  227. package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/stats-synthetic-a23c264f-151d-4ff0-aab4-bdbb2f6560d8.json +53 -0
  228. package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/stats-synthetic-d8178bd3-6530-4915-9cf1-056a975bfbcd.json +53 -0
  229. package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/stats-synthetic-e3985119-e101-459e-91cd-21a0905287ba.json +48 -0
  230. package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/stats-synthetic-e7a40382-2d27-4db5-a133-dbe346a5dc60.json +48 -0
  231. package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/warming-disabled-unknown-223d7adc-2dbc-4017-b1ec-0c38294320e2.json +41 -0
  232. package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/warming-disabled-unknown-347a8548-d2e0-4846-a08e-b0399f8fd3b4.json +41 -0
  233. package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/warming-disabled-unknown-49b45e2b-e2d2-456f-b73f-e6bc938b6378.json +46 -0
  234. package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/warming-disabled-unknown-aaf432f2-bb91-41a7-b951-2d4316389632.json +46 -0
  235. package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/warming-disabled-zero-204ab3e8-f1fe-4894-8fb0-08299deb4c21.json +41 -0
  236. package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/warming-disabled-zero-9388d2df-fa15-479c-a4ef-2a774c366c0f.json +46 -0
  237. package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/warming-disabled-zero-e0bb4742-214a-4b3f-88d2-44de54394e2f.json +46 -0
  238. package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/warming-disabled-zero-f77e1e2d-742a-490f-9955-1dfb19f59c9c.json +41 -0
  239. package/docs/evaluation/extension-functions-2026-10-17/cache/runner.mjs +36 -0
  240. package/docs/evaluation/extension-functions-2026-10-17/cursor/README.md +20 -0
  241. package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-36-10-753Z-2bb4fff5-48cc-4f6b-ae1b-5cc1a07f610b.json +54 -0
  242. package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-36-26-537Z-5adc4fb1-0008-4ef9-a106-aa372dabf061.json +56 -0
  243. package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-36-32-362Z-30949c31-73a3-4dae-af81-68deded51543.json +56 -0
  244. package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-36-38-494Z-8eec81b8-5576-48cb-b2fa-c279269db058.json +56 -0
  245. package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-36-45-546Z-991647e5-7ea4-43c4-a90d-868e4ac38d83.json +56 -0
  246. package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-37-02-277Z-2296fb35-e5cb-4bf1-9e83-7370bcb46bfe.json +56 -0
  247. package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-37-28-390Z-e9c3d106-b4c9-4146-ae83-a2799c907fe5.json +56 -0
  248. package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-37-37-371Z-8545c893-a8e3-4dc6-973b-81dfd97d798b.json +56 -0
  249. package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-38-41-612Z-c57c4778-261d-4397-8a36-df9cc23ca629.json +58 -0
  250. package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-38-51-661Z-0eb898de-7471-4f17-a308-5ef5d86421ff.json +58 -0
  251. package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-38-55-412Z-8169d843-a9e7-48f4-88b1-3a90e1592df1.json +58 -0
  252. package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-39-15-274Z-a5610333-e428-4cc6-9f5a-9206748ee512.json +58 -0
  253. package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-39-39-506Z-d4c80a7b-76b4-4d11-bf0f-552d11b131b2.json +136 -0
  254. package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-39-53-515Z-db409f47-8ee5-4354-b7f9-a258eb7e17d0.json +136 -0
  255. package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-42-04-909Z-01d70cb3-6897-46ca-b8aa-1c69d5b5c7fc.json +148 -0
  256. package/docs/evaluation/extension-functions-2026-10-17/cursor/integrity.json +205 -0
  257. package/docs/evaluation/extension-functions-2026-10-17/cursor/probe.mjs +151 -0
  258. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipt-archive.json +186 -0
  259. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-104e378f-8f82-4ae9-bffc-7f1d52e00e74.json +15 -0
  260. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-182a8009-c52a-4760-9768-9cba15fceb9c.json +14 -0
  261. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-1f07360d-046f-4f0c-b40f-6b57a027220c.json +65 -0
  262. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-256cb86e-40ae-4fec-a2d2-9b7f66cc4be8.json +14 -0
  263. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-2667d991-3133-44c3-b883-c401b3c14cb1.json +14 -0
  264. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-394fc425-ed51-408f-ab09-6d26aee0d48f.json +14 -0
  265. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-531d3f1d-c326-4914-b768-3d32103513b9.json +14 -0
  266. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-5c7d0d62-8290-494f-8729-5d60bc626ad7.json +14 -0
  267. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-64af1d94-ea73-481f-b827-dbf6755d8591.json +66 -0
  268. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-65fce696-864c-4247-960e-59f6d671cbf9.json +15 -0
  269. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-66acde31-19c7-4d3e-9814-ddeb2cffd373.json +14 -0
  270. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-79d220d0-fc0b-4cad-85cc-40b9e904fb97.json +14 -0
  271. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-a58f0281-71bc-4757-9d6f-e281f813135e.json +65 -0
  272. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-c2b61e4b-fd33-4969-ab29-118957ca5fbb.json +15 -0
  273. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-f61b5020-2c05-40ad-9cb8-590b22790186.json +15 -0
  274. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-0ee0df5a-299f-451c-96e3-5abcf8bfa999.json +45 -0
  275. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-169e5146-09a2-4231-8017-ebd8d4b75f0a.json +14 -0
  276. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-19d479f2-7162-463e-90de-2d89a13e59a3.json +15 -0
  277. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-1bd882bb-2403-4269-8335-90f9803f57b7.json +14 -0
  278. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-2ab9d418-68b2-4679-bf42-f31b6945ea5a.json +15 -0
  279. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-3a6aa7d7-b956-4fe5-9555-a2c63408c067.json +45 -0
  280. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-6333425f-0b46-4ced-a272-3d48895ee853.json +15 -0
  281. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-6eccb170-ff45-40e2-afc5-dfc0f77c229f.json +14 -0
  282. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-7f330c57-9c3f-4879-a1d0-67c4c5c36050.json +14 -0
  283. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-8d9de272-165c-4bb8-a147-d1b306388472.json +14 -0
  284. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-c1ffa69f-25fa-4f45-a691-af3bc422c089.json +14 -0
  285. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-c24ad0c8-5e7e-4d71-9b22-3e2708ce1626.json +14 -0
  286. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-c5a3140e-a28e-4264-9ee6-51b1310b3123.json +14 -0
  287. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-cdbb3dde-2441-46ae-9111-f2a299d45807.json +46 -0
  288. package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-d68f774c-d1f0-4620-b334-301a20edffc3.json +15 -0
  289. package/docs/evaluation/extension-functions-2026-10-17/cursor/runner.mjs +147 -0
  290. package/docs/evaluation/extension-functions-2026-10-17/integrity.json +618 -0
  291. package/docs/evaluation/extension-functions-2026-10-17/navigation/README.md +22 -0
  292. package/docs/evaluation/extension-functions-2026-10-17/navigation/SHA256SUMS.txt +8 -0
  293. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempt.json +13 -0
  294. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-30-37-626Z-7ba0ce60-b805-4bf1-813f-80f0673c519d.json +50 -0
  295. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-31-06-997Z-0df6e689-b7f6-4daf-a730-724638c7e9bb.json +52 -0
  296. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-31-22-489Z-dfa50911-d117-400d-9ea3-76b224693c10.json +59 -0
  297. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-31-39-899Z-6792c0ef-c795-4136-98e2-b9a9b00489bd.json +59 -0
  298. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-31-58-555Z-e23d44fb-d2cb-42b6-b76b-f2ac53645401.json +59 -0
  299. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-32-18-734Z-3708117d-bca6-44a6-9f61-4339a67535ae.json +60 -0
  300. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-32-34-897Z-abbfb675-7120-46fc-8638-2dde943a3c51.json +114 -0
  301. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-33-30-753Z-f1965485-aa41-4a9a-b62e-267fc9d7686c.json +72 -0
  302. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-33-46-589Z-e3b46364-e0dd-4a95-91ce-c11f5192d83f.json +72 -0
  303. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-33-57-569Z-d296148e-2f64-4921-bad7-391d0f3cc61d.json +74 -0
  304. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-34-30-540Z-51791e8c-b2a7-4f93-bff6-9b0467aeba51.json +109 -0
  305. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-34-57-906Z-2c3e469c-6d89-4707-8bc6-e62dcfacdc7c.json +114 -0
  306. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-35-16-679Z-035260fc-f3d1-4c1c-9619-81f2aa2ced55.json +115 -0
  307. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-36-05-641Z-24ceb58d-441b-4ffe-9853-ef4d15eb8c81.json +73 -0
  308. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-37-00-445Z-1ca606b7-306f-41e9-8745-b53879c620bb.json +72 -0
  309. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-37-23-659Z-c958d5fc-5c17-46b9-abc0-87913f14fd4b.json +73 -0
  310. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-38-49-639Z-9e74ee3c-7cea-4d9e-832f-0b5068d161ec.json +112 -0
  311. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-39-53-463Z-5d834e9f-e247-4887-8200-dee41070567f.json +32 -0
  312. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-40-16-811Z-0be9d64c-a0d7-405c-b81a-12f8c6cfebac.json +33 -0
  313. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-40-36-020Z-412777d5-f352-4fa0-9a07-f017b5f04cbb.json +124 -0
  314. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-42-03-506Z-a0cca711-1300-4431-bfff-5814a409d0af.json +120 -0
  315. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-42-28-426Z-fb70da7e-4888-469a-b5cd-b74da52afa9f.json +112 -0
  316. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-42-41-596Z-c8e99863-70e2-40f1-a516-e9f41156ef44.json +71 -0
  317. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-44-06-279Z-39516e45-daf6-409b-b216-64179608cc2e.json +97 -0
  318. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-45-34-538Z-87ddef90-2fda-4211-a513-0516dec235f4.json +112 -0
  319. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-45-48-020Z-06f478f2-43c4-48a7-ac02-7e53d4df8aaf.json +112 -0
  320. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-46-00-807Z-a98cc49d-6cf6-4109-aa95-f2d36e8d35c3.json +97 -0
  321. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-46-34-183Z-77f75abc-9ec3-41b2-896f-b6f4a180dca8.json +160 -0
  322. package/docs/evaluation/extension-functions-2026-10-17/navigation/attempts/isolated-extensions-results-2026-10-17T13-46-56-605Z-f46134c2-8523-4892-ab76-e88195d79ed2.json +163 -0
  323. package/docs/evaluation/extension-functions-2026-10-17/navigation/child-guard.mjs +30 -0
  324. package/docs/evaluation/extension-functions-2026-10-17/navigation/final-result.json +42 -0
  325. package/docs/evaluation/extension-functions-2026-10-17/navigation/function-probe.mjs +521 -0
  326. package/docs/evaluation/extension-functions-2026-10-17/navigation/function-runner.mjs +201 -0
  327. package/docs/evaluation/extension-functions-2026-10-17/navigation/integrity.json +153 -0
  328. package/docs/evaluation/extension-functions-2026-10-17/navigation/receipt-archive.json +160 -0
  329. package/docs/evaluation/extension-functions-2026-10-17/review.json +27 -0
  330. package/docs/evaluation/extension-functions-2026-10-17/summary.json +102 -0
  331. package/docs/evaluation/extension-functions-2026-10-17/verification.json +103 -0
  332. package/docs/evaluation/isolation-acceptance-2026-10-18/README.md +106 -0
  333. package/docs/evaluation/isolation-acceptance-2026-10-18/auth-warmup.mjs +33 -0
  334. package/docs/evaluation/isolation-acceptance-2026-10-18/contained-agent-ro.json +433 -0
  335. package/docs/evaluation/isolation-acceptance-2026-10-18/contained.json +439 -0
  336. package/docs/evaluation/isolation-acceptance-2026-10-18/control.json +403 -0
  337. package/docs/evaluation/isolation-acceptance-2026-10-18/live.json +75 -0
  338. package/docs/evaluation/isolation-acceptance-2026-10-18/wrapper.sh +37 -0
  339. package/docs/evaluation/ledger-event-bridge-2026-10-21/README.md +360 -0
  340. package/docs/evaluation/ledger-event-bridge-2026-10-21/design.md +150 -0
  341. package/docs/evaluation/ledger-event-bridge-2026-10-21/inventory.md +113 -0
  342. package/docs/evaluation/ledger-event-bridge-2026-10-21/live/README.md +117 -0
  343. package/docs/evaluation/ledger-event-bridge-2026-10-21/live/dry-run/dry-01-L1-A.json +202 -0
  344. package/docs/evaluation/ledger-event-bridge-2026-10-21/live/dry-run/dry-02-L1-C.json +259 -0
  345. package/docs/evaluation/ledger-event-bridge-2026-10-21/live/run/01-L1-A.json +169 -0
  346. package/docs/evaluation/ledger-event-bridge-2026-10-21/live/run/02-L1-A.json +202 -0
  347. package/docs/evaluation/ledger-event-bridge-2026-10-21/live/run/03-L1-C.json +256 -0
  348. package/docs/evaluation/ledger-event-bridge-2026-10-21/live/run/approval.json +31 -0
  349. package/docs/evaluation/ledger-event-bridge-2026-10-21/live/run-2/01-L1-C.json +256 -0
  350. package/docs/evaluation/ledger-event-bridge-2026-10-21/live/run-2/02-L1-A.json +201 -0
  351. package/docs/evaluation/ledger-event-bridge-2026-10-21/live/run-2/approval.json +16 -0
  352. package/docs/evaluation/ledger-event-bridge-2026-10-21/live-plan.md +87 -0
  353. package/docs/evaluation/ledger-event-bridge-2026-10-21/pre-registration.md +117 -0
  354. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-1/S1.json +361 -0
  355. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-1/S2.json +544 -0
  356. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-1/S3.json +470 -0
  357. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-1/S4.json +271 -0
  358. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-1/S5.json +271 -0
  359. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-1/S6.json +266 -0
  360. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-1/X6.json +29 -0
  361. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-1/summary.json +269 -0
  362. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-2/S1.json +391 -0
  363. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-2/S2.json +600 -0
  364. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-2/S3.json +519 -0
  365. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-2/S4.json +281 -0
  366. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-2/S5.json +294 -0
  367. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-2/S6.json +280 -0
  368. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-2/S8.json +280 -0
  369. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-2/X6.json +32 -0
  370. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-2/summary.json +307 -0
  371. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-3/S1.json +391 -0
  372. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-3/S2.json +600 -0
  373. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-3/S3.json +519 -0
  374. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-3/S4.json +281 -0
  375. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-3/S5.json +294 -0
  376. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-3/S6.json +280 -0
  377. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-3/S8.json +280 -0
  378. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-3/X6.json +32 -0
  379. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-3/summary.json +307 -0
  380. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-4/S1.json +409 -0
  381. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-4/S2.json +634 -0
  382. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-4/S3.json +537 -0
  383. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-4/S4.json +281 -0
  384. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-4/S5.json +294 -0
  385. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-4/S6.json +280 -0
  386. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-4/S8.json +280 -0
  387. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-4/X6.json +32 -0
  388. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-4/summary.json +307 -0
  389. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-5/S1.json +409 -0
  390. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-5/S2.json +634 -0
  391. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-5/S3.json +537 -0
  392. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-5/S4.json +281 -0
  393. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-5/S5.json +294 -0
  394. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-5/S6.json +280 -0
  395. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-5/S8.json +280 -0
  396. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-5/X6.json +32 -0
  397. package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-5/summary.json +307 -0
  398. package/docs/evaluation/live-rescreen-2026-10-17/README.md +114 -0
  399. package/docs/evaluation/live-rescreen-2026-10-17/approval.json +18 -0
  400. package/docs/evaluation/live-rescreen-2026-10-17/approved-budget.json +13 -0
  401. package/docs/evaluation/live-rescreen-2026-10-17/approved-manifest.json +315 -0
  402. package/docs/evaluation/live-rescreen-2026-10-17/audit-rescreen.mjs +78 -0
  403. package/docs/evaluation/live-rescreen-2026-10-17/audit.json +152 -0
  404. package/docs/evaluation/live-rescreen-2026-10-17/backend-independent-checks.json +38 -0
  405. package/docs/evaluation/live-rescreen-2026-10-17/checks.json +54 -0
  406. package/docs/evaluation/live-rescreen-2026-10-17/execution.json +19 -0
  407. package/docs/evaluation/live-rescreen-2026-10-17/integrity.json +138 -0
  408. package/docs/evaluation/live-rescreen-2026-10-17/planning-ledger.json +26 -0
  409. package/docs/evaluation/live-rescreen-2026-10-17/review.json +16 -0
  410. package/docs/evaluation/live-rescreen-2026-10-17/runs/comparison.json +177 -0
  411. package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-1.claim +1 -0
  412. package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-1.diagnostic.json +1 -0
  413. package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-1.json +97 -0
  414. package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-2.claim +1 -0
  415. package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-2.json +104 -0
  416. package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-2.patch +11 -0
  417. package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-2.snapshot/contract.mjs +4 -0
  418. package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-2.snapshot/package.json +1 -0
  419. package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-3.claim +1 -0
  420. package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-3.json +89 -0
  421. package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-4.claim +1 -0
  422. package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-4.json +104 -0
  423. package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-4.patch +11 -0
  424. package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-4.snapshot/contract.mjs +4 -0
  425. package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-4.snapshot/package.json +1 -0
  426. package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-5.claim +1 -0
  427. package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-5.diagnostic.json +1 -0
  428. package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-5.json +117 -0
  429. package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-6.json +53 -0
  430. package/docs/evaluation/live-rescreen-2026-10-17/runtime-observation.json +11 -0
  431. package/docs/evaluation/live-screening-2026-10-17/approval.json +13 -0
  432. package/docs/evaluation/live-screening-2026-10-17/approved-budget.json +13 -0
  433. package/docs/evaluation/live-screening-2026-10-17/approved-manifest.json +359 -0
  434. package/docs/evaluation/live-screening-2026-10-17/audit.json +143 -0
  435. package/docs/evaluation/live-screening-2026-10-17/integrity.json +148 -0
  436. package/docs/evaluation/live-screening-2026-10-17/inventory.json +239 -0
  437. package/docs/evaluation/live-screening-2026-10-17/runs/comparison.json +247 -0
  438. package/docs/evaluation/live-screening-2026-10-17/runs/screen-1.claim +1 -0
  439. package/docs/evaluation/live-screening-2026-10-17/runs/screen-1.diagnostic.json +1 -0
  440. package/docs/evaluation/live-screening-2026-10-17/runs/screen-1.json +98 -0
  441. package/docs/evaluation/live-screening-2026-10-17/runs/screen-2.claim +1 -0
  442. package/docs/evaluation/live-screening-2026-10-17/runs/screen-2.json +104 -0
  443. package/docs/evaluation/live-screening-2026-10-17/runs/screen-2.patch +11 -0
  444. package/docs/evaluation/live-screening-2026-10-17/runs/screen-2.snapshot/contract.mjs +4 -0
  445. package/docs/evaluation/live-screening-2026-10-17/runs/screen-2.snapshot/package.json +1 -0
  446. package/docs/evaluation/live-screening-2026-10-17/runs/screen-3.claim +1 -0
  447. package/docs/evaluation/live-screening-2026-10-17/runs/screen-3.diagnostic.json +1 -0
  448. package/docs/evaluation/live-screening-2026-10-17/runs/screen-3.json +97 -0
  449. package/docs/evaluation/live-screening-2026-10-17/runs/screen-4.claim +1 -0
  450. package/docs/evaluation/live-screening-2026-10-17/runs/screen-4.json +104 -0
  451. package/docs/evaluation/live-screening-2026-10-17/runs/screen-4.patch +11 -0
  452. package/docs/evaluation/live-screening-2026-10-17/runs/screen-4.snapshot/contract.mjs +4 -0
  453. package/docs/evaluation/live-screening-2026-10-17/runs/screen-4.snapshot/package.json +1 -0
  454. package/docs/evaluation/live-screening-2026-10-17/runs/screen-5.claim +1 -0
  455. package/docs/evaluation/live-screening-2026-10-17/runs/screen-5.diagnostic.json +1 -0
  456. package/docs/evaluation/live-screening-2026-10-17/runs/screen-5.json +97 -0
  457. package/docs/evaluation/live-screening-2026-10-17/runs/screen-6.claim +1 -0
  458. package/docs/evaluation/live-screening-2026-10-17/runs/screen-6.json +104 -0
  459. package/docs/evaluation/live-screening-2026-10-17/runs/screen-6.patch +11 -0
  460. package/docs/evaluation/live-screening-2026-10-17/runs/screen-6.snapshot/contract.mjs +4 -0
  461. package/docs/evaluation/live-screening-2026-10-17/runs/screen-6.snapshot/package.json +1 -0
  462. package/docs/evaluation/live-screening-2026-10-17/runs/screen-7.claim +1 -0
  463. package/docs/evaluation/live-screening-2026-10-17/runs/screen-7.json +108 -0
  464. package/docs/evaluation/live-screening-2026-10-17/runs/screen-8.claim +1 -0
  465. package/docs/evaluation/live-screening-2026-10-17/runs/screen-8.diagnostic.json +1 -0
  466. package/docs/evaluation/live-screening-2026-10-17/runs/screen-8.json +116 -0
  467. package/docs/evaluation/m1-ab-proposal-2026-10-18/README.md +124 -0
  468. package/docs/evaluation/m1-ab-proposal-2026-10-18/ab-proposal.json +135 -0
  469. package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-1/README.md +25 -0
  470. package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-1/approved-budget.json +13 -0
  471. package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-1/approved-decision.json +79 -0
  472. package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-1/approved-manifest.json +271 -0
  473. package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-1/token-live-result.json +546 -0
  474. package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-2/README.md +22 -0
  475. package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-2/approved-budget.json +13 -0
  476. package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-2/approved-decision.json +80 -0
  477. package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-2/approved-manifest.json +271 -0
  478. package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-2/token-live-result.json +1663 -0
  479. package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-3/README.md +23 -0
  480. package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-3/approved-budget.json +13 -0
  481. package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-3/approved-decision.json +71 -0
  482. package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-3/approved-manifest.json +271 -0
  483. package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-3/token-live-result.json +1748 -0
  484. package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-4/README.md +25 -0
  485. package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-4/arm-A/approved-budget.json +13 -0
  486. package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-4/arm-A/approved-decision.json +71 -0
  487. package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-4/arm-A/approved-manifest.json +271 -0
  488. package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-4/arm-A/token-live-result.json +3019 -0
  489. package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-4/arm-B/approved-budget.json +13 -0
  490. package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-4/arm-B/approved-decision.json +71 -0
  491. package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-4/arm-B/approved-manifest.json +271 -0
  492. package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-4/arm-B/token-live-result.json +2859 -0
  493. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/README.md +67 -0
  494. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r1-pair1-A/approved-budget.json +13 -0
  495. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r1-pair1-A/approved-decision.json +71 -0
  496. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r1-pair1-A/approved-manifest.json +271 -0
  497. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r1-pair1-A/token-live-result.json +3019 -0
  498. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r2-pair1-B/approved-budget.json +13 -0
  499. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r2-pair1-B/approved-decision.json +71 -0
  500. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r2-pair1-B/approved-manifest.json +271 -0
  501. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r2-pair1-B/token-live-result.json +2981 -0
  502. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r3-pair2-B/approved-budget.json +13 -0
  503. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r3-pair2-B/approved-decision.json +71 -0
  504. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r3-pair2-B/approved-manifest.json +271 -0
  505. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r3-pair2-B/token-live-result.json +2887 -0
  506. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r4-pair2-A/approved-budget.json +13 -0
  507. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r4-pair2-A/approved-decision.json +71 -0
  508. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r4-pair2-A/approved-manifest.json +271 -0
  509. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r4-pair2-A/token-live-result.json +3189 -0
  510. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r5-pair3-B/approved-budget.json +13 -0
  511. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r5-pair3-B/approved-decision.json +71 -0
  512. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r5-pair3-B/approved-manifest.json +271 -0
  513. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r5-pair3-B/token-live-result.json +2929 -0
  514. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r6-pair3-A/approved-budget.json +13 -0
  515. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r6-pair3-A/approved-decision.json +71 -0
  516. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r6-pair3-A/approved-manifest.json +271 -0
  517. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r6-pair3-A/token-live-result.json +3085 -0
  518. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r7-pair4-A/approved-budget.json +13 -0
  519. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r7-pair4-A/approved-decision.json +71 -0
  520. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r7-pair4-A/approved-manifest.json +271 -0
  521. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r7-pair4-A/token-live-result.json +3019 -0
  522. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r8-pair4-B/approved-budget.json +13 -0
  523. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r8-pair4-B/approved-decision.json +71 -0
  524. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r8-pair4-B/approved-manifest.json +271 -0
  525. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r8-pair4-B/token-live-result.json +2925 -0
  526. package/docs/evaluation/m1-ab-proposal-2026-10-18/results/summary-rows.json +338 -0
  527. package/docs/evaluation/node24-followup-2026-10-17/README.md +55 -0
  528. package/docs/evaluation/node24-followup-2026-10-17/client-migration-review.json +20 -0
  529. package/docs/evaluation/node24-followup-2026-10-17/client-registration-migration.json +31 -0
  530. package/docs/evaluation/node24-followup-2026-10-17/client-registration-verification.json +389 -0
  531. package/docs/evaluation/node24-followup-2026-10-17/closure-checks.json +33 -0
  532. package/docs/evaluation/node24-followup-2026-10-17/cursor-headless-probe.mjs +259 -0
  533. package/docs/evaluation/node24-followup-2026-10-17/cursor-headless-report.md +39 -0
  534. package/docs/evaluation/node24-followup-2026-10-17/cursor-headless-result-attempt-2.json +49 -0
  535. package/docs/evaluation/node24-followup-2026-10-17/cursor-headless-result-attempt-3.json +76 -0
  536. package/docs/evaluation/node24-followup-2026-10-17/cursor-headless-result-attempt-4.json +108 -0
  537. package/docs/evaluation/node24-followup-2026-10-17/cursor-headless-result.json +12 -0
  538. package/docs/evaluation/node24-followup-2026-10-17/cursor-headless-run.mjs +96 -0
  539. package/docs/evaluation/node24-followup-2026-10-17/download.json +16 -0
  540. package/docs/evaluation/node24-followup-2026-10-17/extension-summary.json +97 -0
  541. package/docs/evaluation/node24-followup-2026-10-17/final-review.json +15 -0
  542. package/docs/evaluation/node24-followup-2026-10-17/install.json +10 -0
  543. package/docs/evaluation/node24-followup-2026-10-17/integrity.json +204 -0
  544. package/docs/evaluation/node24-followup-2026-10-17/isolated-extensions-evidence.json +39 -0
  545. package/docs/evaluation/node24-followup-2026-10-17/isolated-extensions-probe.mjs +277 -0
  546. package/docs/evaluation/node24-followup-2026-10-17/isolated-extensions-report.md +35 -0
  547. package/docs/evaluation/node24-followup-2026-10-17/isolated-extensions-results-2026-10-17T09-19-48-378Z-b378dc9f-9ab8-4349-8892-78af8184f78f.json +151 -0
  548. package/docs/evaluation/node24-followup-2026-10-17/isolated-extensions-results-2026-10-17T09-20-22-821Z-85cfcba4-c05e-4c5a-9658-d8d70f5c8d1a.json +223 -0
  549. package/docs/evaluation/node24-followup-2026-10-17/isolated-extensions-results-2026-10-17T09-20-54-825Z-fd5d8373-6e29-4197-84bd-2e65251b4db8.json +207 -0
  550. package/docs/evaluation/node24-followup-2026-10-17/isolated-extensions-results-2026-10-17T09-21-44-636Z-488698ad-f8bf-4d7e-b85a-615275c32e5d.json +82 -0
  551. package/docs/evaluation/node24-followup-2026-10-17/isolated-extensions-results-2026-10-17T09-22-05-375Z-16f5d77c-32a2-4d0a-905a-e080b392316f.json +94 -0
  552. package/docs/evaluation/node24-followup-2026-10-17/isolated-extensions-results-2026-10-17T09-22-07-471Z-fcbe7c98-fed3-4120-a860-b2e3f9572836.json +63 -0
  553. package/docs/evaluation/node24-followup-2026-10-17/isolated-extensions-results-2026-10-17T09-22-17-638Z-45ec386d-3429-4a7c-a10e-8673c03861f0.json +63 -0
  554. package/docs/evaluation/node24-followup-2026-10-17/isolated-extensions-results-2026-10-17T09-22-22-485Z-1b08e134-667c-4416-8372-cb233939c48b.json +125 -0
  555. package/docs/evaluation/node24-followup-2026-10-17/isolated-extensions-results-2026-10-17T09-22-25-490Z-223fd05e-52f9-4996-88d7-3ec43a6ecdd9.json +125 -0
  556. package/docs/evaluation/node24-followup-2026-10-17/isolated-extensions-results-2026-10-17T09-23-42-291Z-f4af1e12-844e-4b2d-a090-9068e7626dd5.json +82 -0
  557. package/docs/evaluation/node24-followup-2026-10-17/isolated-extensions-results-2026-10-17T09-24-36-866Z-30770d13-c7ae-4309-921b-5c1b43050adb.json +52 -0
  558. package/docs/evaluation/node24-followup-2026-10-17/isolated-extensions-results-2026-10-17T09-25-05-378Z-2a5dffc1-3f3a-433a-823f-6e77964dcaee.json +53 -0
  559. package/docs/evaluation/node24-followup-2026-10-17/isolated-extensions-results-2026-10-17T09-25-15-842Z-798946f5-b9a5-4810-8a0c-35be6f40abb3.json +83 -0
  560. package/docs/evaluation/node24-followup-2026-10-17/isolated-extensions-results-2026-10-17T09-25-19-099Z-89bd000d-bb51-4e3a-b713-51ff1ff4e38b.json +87 -0
  561. package/docs/evaluation/node24-followup-2026-10-17/isolated-extensions-runner.mjs +172 -0
  562. package/docs/evaluation/node24-followup-2026-10-17/isolated-install.json +121 -0
  563. package/docs/evaluation/node24-followup-2026-10-17/isolated-package-lock.json +2321 -0
  564. package/docs/evaluation/node24-followup-2026-10-17/isolated-package.json +12 -0
  565. package/docs/evaluation/node24-followup-2026-10-17/launcher-review.json +17 -0
  566. package/docs/evaluation/node24-followup-2026-10-17/launcher-switch.json +28 -0
  567. package/docs/evaluation/node24-followup-2026-10-17/mcp-launcher-test.json +24 -0
  568. package/docs/evaluation/node24-followup-2026-10-17/migrate-client-node.mjs +129 -0
  569. package/docs/evaluation/node24-followup-2026-10-17/node-runtime-report.md +127 -0
  570. package/docs/evaluation/node24-followup-2026-10-17/node24-checks.json +44 -0
  571. package/docs/evaluation/node24-followup-2026-10-17/pi-launcher-test.json +13 -0
  572. package/docs/evaluation/node24-followup-2026-10-17/publication-export.json +11 -0
  573. package/docs/evaluation/node24-followup-2026-10-17/restore-launchers.mjs +26 -0
  574. package/docs/evaluation/node24-followup-2026-10-17/verify-client-node.mjs +36 -0
  575. package/docs/evaluation/permission-gates-2026-10-17/README.md +23 -0
  576. package/docs/evaluation/permission-gates-2026-10-17/attempts.json +53 -0
  577. package/docs/evaluation/permission-gates-2026-10-17/integrity.json +46 -0
  578. package/docs/evaluation/permission-gates-2026-10-17/permission-gate-probe.mjs +132 -0
  579. package/docs/evaluation/permission-gates-2026-10-17/permission-gate-worker.mjs +209 -0
  580. package/docs/evaluation/permission-gates-2026-10-17/permission-gates-result-final.json +53 -0
  581. package/docs/evaluation/permission-gates-2026-10-17/permission-gates-result-verified.json +54 -0
  582. package/docs/evaluation/permission-gates-2026-10-17/permission-gates-result.json +53 -0
  583. package/docs/evaluation/permission-gates-2026-10-17/review.json +19 -0
  584. package/docs/evaluation/permission-gates-2026-10-17/superseded-initial-receipt.json +40 -0
  585. package/docs/evaluation/pi-lens-registration-2026-10-19/README.md +90 -0
  586. package/docs/evaluation/pi-lens-registration-2026-10-19/probe.mjs +126 -0
  587. package/docs/evaluation/pi-lens-registration-2026-10-19/result.json +1 -0
  588. package/docs/evaluation/plan-continuation-2026-10-17/README.md +107 -0
  589. package/docs/evaluation/plan-continuation-2026-10-17/budget.proposed.json +13 -0
  590. package/docs/evaluation/plan-continuation-2026-10-17/checks.json +1048 -0
  591. package/docs/evaluation/plan-continuation-2026-10-17/integrity.json +58 -0
  592. package/docs/evaluation/plan-continuation-2026-10-17/inventory.json +239 -0
  593. package/docs/evaluation/plan-continuation-2026-10-17/manifest.proposed.json +315 -0
  594. package/docs/evaluation/plan-continuation-2026-10-17/next-stage-ledger.json +19 -0
  595. package/docs/evaluation/plan-continuation-2026-10-17/prepare-rescreen.mjs +30 -0
  596. package/docs/evaluation/plan-continuation-2026-10-17/prior-integrity.json +25 -0
  597. package/docs/evaluation/plan-continuation-2026-10-17/proposal-validation.json +14 -0
  598. package/docs/evaluation/plan-continuation-2026-10-17/receipt-contract-update.patch +40 -0
  599. package/docs/evaluation/plan-continuation-2026-10-17/review.json +8 -0
  600. package/docs/evaluation/plan-continuation-2026-10-17/source-delta.json +14 -0
  601. package/docs/evaluation/profile-evaluation.md +297 -0
  602. package/docs/evaluation/publication-2026-10-17/README.md +88 -0
  603. package/docs/evaluation/publication-2026-10-17/checks.json +117 -0
  604. package/docs/evaluation/publication-2026-10-17/integrity.json +21 -0
  605. package/docs/evaluation/publication-2026-10-17/publication-scan.json +63 -0
  606. package/docs/evaluation/publication-2026-10-17/review.json +21 -0
  607. package/docs/evaluation/s5-decision-inputs-2026-10-18/README.md +16 -0
  608. package/docs/evaluation/s5-decision-inputs-2026-10-18/bounded-wait.md +78 -0
  609. package/docs/evaluation/s5-decision-inputs-2026-10-18/claude-projection/README.md +151 -0
  610. package/docs/evaluation/s5-decision-inputs-2026-10-18/claude-projection/attempt-1/claude-projection.json +126 -0
  611. package/docs/evaluation/s5-decision-inputs-2026-10-18/claude-projection/attempt-2/claude-projection.json +1895 -0
  612. package/docs/evaluation/s5-decision-inputs-2026-10-18/claude-projection/attempt-3/claude-projection.json +1895 -0
  613. package/docs/evaluation/s5-decision-inputs-2026-10-18/claude-projection/attempt-4/claude-projection.json +1797 -0
  614. package/docs/evaluation/s5-decision-inputs-2026-10-18/claude-projection/attempt-5/claude-projection.json +1797 -0
  615. package/docs/evaluation/s5-decision-inputs-2026-10-18/worker-usage.md +63 -0
  616. package/docs/evaluation/s7-live-acceptance-2026-10-24/README.md +212 -0
  617. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/binding.json +20 -0
  618. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/config-ev-off.json +43 -0
  619. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/config-ev-spool.json +43 -0
  620. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/config-l3.json +39 -0
  621. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/config-pre.json +31 -0
  622. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e-teardown-setup-remove.json +1 -0
  623. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e1-clean-10s.json +15 -0
  624. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e1-clean.json +15 -0
  625. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e1-digest-ev-e1.json +8 -0
  626. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e1-leaks.json +131 -0
  627. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e1-oracle.json +74 -0
  628. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e1-run.json +33 -0
  629. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e1-setup-1-dryrun.json +1 -0
  630. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e1-setup-2-apply.json +1 -0
  631. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e1-setup-3-verify.json +1 -0
  632. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e2-clean-10s.json +15 -0
  633. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e2-clean.json +15 -0
  634. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e2-digest-ev-e2l.json +8 -0
  635. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e2-digest-ev-e2s.json +8 -0
  636. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e2-leaks.json +205 -0
  637. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e2-oracle.json +110 -0
  638. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e2-run.json +33 -0
  639. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e3b-clean-10s.json +15 -0
  640. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e3b-clean.json +15 -0
  641. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e3b-digest-ev-e3.json +8 -0
  642. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e3b-leaks.json +215 -0
  643. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e3b-oracle.json +79 -0
  644. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e3b-run.json +33 -0
  645. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e4-clean-10s.json +15 -0
  646. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e4-clean.json +15 -0
  647. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e4-digest-ev-e4a.json +8 -0
  648. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e4-digest-ev-e4b.json +8 -0
  649. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e4-late-a.json +16 -0
  650. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e4-late-b.json +16 -0
  651. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e4-leaks.json +167 -0
  652. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e4-oracle.json +70 -0
  653. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e4-run.json +37 -0
  654. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e5-clean-10s.json +15 -0
  655. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e5-clean.json +15 -0
  656. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e5-digest-ev-e5.json +8 -0
  657. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e5-leaks.json +82 -0
  658. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e5-oracle.json +60 -0
  659. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e5-run.json +33 -0
  660. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e5-server-env-names.txt +14 -0
  661. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e6b-clean-10s.json +15 -0
  662. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e6b-clean.json +15 -0
  663. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e6b-digest-ev-e1.json +8 -0
  664. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e6b-leaks.json +156 -0
  665. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e6b-run.json +37 -0
  666. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e6b-setup-apply.json +1 -0
  667. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e6b-teardown-remove.json +1 -0
  668. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/final-e-clean.json +15 -0
  669. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/kit.sha256 +23 -0
  670. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l2-packed-off.json +1185 -0
  671. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l2-packed-spool.json +1334 -0
  672. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l2-wt-off.json +1185 -0
  673. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l2-wt-spool.json +1334 -0
  674. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv1-clean-10s.json +15 -0
  675. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv1-clean.json +15 -0
  676. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv1-digest-cc-analysis.json +8 -0
  677. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv1-leaks.json +80 -0
  678. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv1-oracle.json +61 -0
  679. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv1-run.json +33 -0
  680. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv2-clean-10s.json +15 -0
  681. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv2-clean.json +15 -0
  682. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv2-leaks.json +80 -0
  683. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv2-oracle-stage1.json +34 -0
  684. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv2-oracle-stage2.json +35 -0
  685. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv2-run.json +33 -0
  686. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv2-snapshot-stage1.txt +4 -0
  687. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv2-snapshot-stage2.txt +5 -0
  688. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv3-clean-10s.json +15 -0
  689. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv3-clean.json +15 -0
  690. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv3-digest-cc-abort.json +8 -0
  691. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv3-leaks.json +82 -0
  692. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv3-oracle-flow.json +61 -0
  693. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv3-oracle-late.json +16 -0
  694. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv3-run.json +33 -0
  695. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-controller-skill-remove.json +1 -0
  696. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-controller-skill-setup.json +1 -0
  697. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv1-clean-10s.json +15 -0
  698. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv1-clean.json +15 -0
  699. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv1-digest-cx-analysis.json +8 -0
  700. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv1-leaks.json +93 -0
  701. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv1-oracle.json +61 -0
  702. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv1-run.json +33 -0
  703. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv2-clean-10s.json +15 -0
  704. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv2-clean.json +15 -0
  705. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv2-leaks.json +93 -0
  706. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv2-oracle-stage1.json +34 -0
  707. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv2-oracle-stage2.json +35 -0
  708. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv2-run.json +33 -0
  709. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv2-snapshot-stage1.txt +4 -0
  710. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv2-snapshot-stage2.txt +5 -0
  711. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv3-clean-10s.json +15 -0
  712. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv3-clean.json +15 -0
  713. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv3-digest-cx-abort.json +8 -0
  714. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv3-leaks.json +95 -0
  715. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv3-oracle-flow.json +61 -0
  716. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv3-oracle-late.json +16 -0
  717. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv3-run.json +33 -0
  718. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0-clean-10s.json +15 -0
  719. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0-clean.json +15 -0
  720. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0-digest-pre-analysis.json +8 -0
  721. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0-digest-pre-code.json +8 -0
  722. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0-leaks.json +86 -0
  723. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0-oracle.json +39 -0
  724. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0-run.json +33 -0
  725. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0a-harness-fail-clean-10s.json +15 -0
  726. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0a-harness-fail-clean.json +15 -0
  727. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0a-harness-fail-digest-pre-analysis.json +8 -0
  728. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0a-harness-fail-digest-pre-code.json +8 -0
  729. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0a-harness-fail-leaks.json +47 -0
  730. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0a-harness-fail-oracle.json +39 -0
  731. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0a-harness-fail-run.json +33 -0
  732. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/regdigest-after-cc.json +6 -0
  733. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/regdigest-after-cx.json +6 -0
  734. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/regdigest-after-e.json +6 -0
  735. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/regdigest-before.json +6 -0
  736. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w1-control-apply.json +1 -0
  737. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w1-control-dryrun.json +1 -0
  738. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w1-provision-apply-attempt1.json +1 -0
  739. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w1-provision-apply-attempt2.json +1 -0
  740. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w1-provision-dryrun.json +1 -0
  741. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w1-writer-verify.json +1 -0
  742. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w2-leaks.json +130 -0
  743. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w2-oracle.txt +14 -0
  744. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w2-run.json +33 -0
  745. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w2b-oracle.txt +16 -0
  746. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w2c-oracle.txt +8 -0
  747. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w2d-oracle.txt +6 -0
  748. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w2r-leaks.json +130 -0
  749. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w2r-oracle.txt +3 -0
  750. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w2r-run.json +33 -0
  751. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w3-collect.json +1 -0
  752. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w3-finish.json +1 -0
  753. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w3r-collect.json +1 -0
  754. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w3r-finish.json +1 -0
  755. package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w4-remove.json +1 -0
  756. package/docs/evaluation/subagent-probe-2026-10-26/README.md +132 -0
  757. package/docs/evaluation/subagent-probe-2026-10-26/results/K7.json +463 -0
  758. package/docs/evaluation/subagent-probe-2026-10-26/results/summary.json +50 -0
  759. package/docs/evaluation/test-coverage-2026-10-17.json +483 -0
  760. package/docs/evaluation/test-coverage-review-2026-10-17.json +22 -0
  761. package/docs/evaluation/test-coverage-verification-2026-10-17.json +31 -0
  762. package/docs/evaluation/token-footprint-2026-10-17/README.md +297 -0
  763. package/docs/evaluation/token-footprint-2026-10-17/baseline.json +25871 -0
  764. package/docs/evaluation/token-footprint-2026-10-17/calibration-2/README.md +24 -0
  765. package/docs/evaluation/token-footprint-2026-10-17/calibration-2/baseline.json +30346 -0
  766. package/docs/evaluation/token-footprint-2026-10-17/calibration-2/client-projection.json +2538 -0
  767. package/docs/evaluation/token-footprint-2026-10-17/calibration-2/live-approval/budget.json +13 -0
  768. package/docs/evaluation/token-footprint-2026-10-17/calibration-2/live-approval/decision.json +69 -0
  769. package/docs/evaluation/token-footprint-2026-10-17/calibration-2/live-approval/manifest.json +271 -0
  770. package/docs/evaluation/token-footprint-2026-10-17/calibration-2/live-package.json +785 -0
  771. package/docs/evaluation/token-footprint-2026-10-17/calibration-2/measurement.json +37956 -0
  772. package/docs/evaluation/token-footprint-2026-10-17/calibration-2/summary.json +119 -0
  773. package/docs/evaluation/token-footprint-2026-10-17/checks-final.json +273 -0
  774. package/docs/evaluation/token-footprint-2026-10-17/checks.json +190 -0
  775. package/docs/evaluation/token-footprint-2026-10-17/client-attempts/README.md +25 -0
  776. package/docs/evaluation/token-footprint-2026-10-17/client-attempts/attempt-4.json +2274 -0
  777. package/docs/evaluation/token-footprint-2026-10-17/client-attempts/pilot-1.json +77 -0
  778. package/docs/evaluation/token-footprint-2026-10-17/client-attempts/pilot-2.json +81 -0
  779. package/docs/evaluation/token-footprint-2026-10-17/client-attempts/pilot-3.json +121 -0
  780. package/docs/evaluation/token-footprint-2026-10-17/current-calibration/baseline.json +30346 -0
  781. package/docs/evaluation/token-footprint-2026-10-17/current-calibration/measurement.json +37956 -0
  782. package/docs/evaluation/token-footprint-2026-10-17/current-calibration/summary.json +119 -0
  783. package/docs/evaluation/token-footprint-2026-10-17/current-client-projection.json +2538 -0
  784. package/docs/evaluation/token-footprint-2026-10-17/follow-up.md +76 -0
  785. package/docs/evaluation/token-footprint-2026-10-17/integrity.json +171 -0
  786. package/docs/evaluation/token-footprint-2026-10-17/live-approval/README.md +36 -0
  787. package/docs/evaluation/token-footprint-2026-10-17/live-approval/budget.json +13 -0
  788. package/docs/evaluation/token-footprint-2026-10-17/live-approval/decision.json +69 -0
  789. package/docs/evaluation/token-footprint-2026-10-17/live-approval/manifest.json +271 -0
  790. package/docs/evaluation/token-footprint-2026-10-17/live-package.json +795 -0
  791. package/docs/evaluation/token-footprint-2026-10-17/live-proposal.json +427 -0
  792. package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/README.md +75 -0
  793. package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/attempt-1/approved-budget.json +13 -0
  794. package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/attempt-1/approved-decision.json +69 -0
  795. package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/attempt-1/approved-manifest.json +271 -0
  796. package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/attempt-1/token-live-result.json +837 -0
  797. package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/attempt-2/approved-budget.json +13 -0
  798. package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/attempt-2/approved-decision.json +69 -0
  799. package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/attempt-2/approved-manifest.json +271 -0
  800. package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/attempt-2/token-live-result.json +985 -0
  801. package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/attempt-3/approved-budget.json +13 -0
  802. package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/attempt-3/approved-decision.json +69 -0
  803. package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/attempt-3/approved-manifest.json +271 -0
  804. package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/attempt-3/token-live-result.json +3055 -0
  805. package/docs/evaluation/token-footprint-2026-10-17/measurement.json +32476 -0
  806. package/docs/evaluation/token-footprint-2026-10-17/prior-calibration/README.md +20 -0
  807. package/docs/evaluation/token-footprint-2026-10-17/prior-calibration/integrity.json +40 -0
  808. package/docs/evaluation/token-footprint-2026-10-17/summary.json +119 -0
  809. package/docs/evaluation/tool-definitions-2026-10-18/README.md +204 -0
  810. package/docs/evaluation/tool-definitions-2026-10-18/codex-projection/after/client-projection.json +2853 -0
  811. package/docs/evaluation/tool-definitions-2026-10-18/codex-projection/before/client-projection.json +2853 -0
  812. package/docs/evaluation/tool-definitions-2026-10-18/compare-validation.mjs +64 -0
  813. package/docs/evaluation/tool-definitions-2026-10-18/diff-validation.mjs +13 -0
  814. package/docs/evaluation/tool-definitions-2026-10-18/measure-wire.mjs +31 -0
  815. package/docs/evaluation/worker-system-prompt-2026-10-26/README.md +95 -0
  816. package/docs/evaluation/worker-system-prompt-2026-10-26/probe.mjs +155 -0
  817. package/docs/execution-modes.md +388 -0
  818. package/docs/installation.md +246 -12
  819. package/docs/isolation-setup.md +258 -0
  820. package/docs/macos-setup-design.md +2 -2
  821. package/docs/pi-extensions-design.md +71 -16
  822. package/docs/releasing.md +12 -6
  823. package/docs/reviews/2026-10-18-adr-0008-decision-brief.md +53 -0
  824. package/docs/roadmap.md +320 -9
  825. package/docs/session-mcp.md +5 -1
  826. package/docs/skills.md +23 -0
  827. package/docs/sprints/2026-10-15-s4-decision.md +73 -4
  828. package/docs/sprints/2026-10-17-token-footprint.md +130 -0
  829. package/docs/sprints/2026-10-18-s5-maintenance-orchestration.md +202 -0
  830. package/docs/sprints/2026-10-21-s6-ledger-event-bridge.md +120 -0
  831. package/docs/sprints/2026-10-24-s7-stabilization-live-acceptance.md +173 -0
  832. package/docs/sprints/2026-10-24-s8-writer-migration.md +235 -0
  833. package/docs/sprints/2026-10-26-s10-orchestration-reliability.md +250 -0
  834. package/docs/sprints/2026-10-26-s11-orchestration-gaps.md +173 -0
  835. package/docs/threat-model.md +37 -6
  836. package/docs/tool-contracts.md +91 -9
  837. package/package.json +17 -11
  838. package/scripts/isolation-acceptance.mjs +709 -0
  839. package/scripts/isolation-probe.cjs +213 -0
  840. package/skills/pi-session-implementation/SKILL.md +13 -3
  841. package/skills/pi-session-orchestration/SKILL.md +50 -13
  842. package/skills/pi-session-orchestration/references/start-errors.md +12 -0
  843. package/skills/pi-session-review/SKILL.md +13 -5
@@ -0,0 +1,359 @@
1
+ import { constants } from "node:fs";
2
+ import { open } from "node:fs/promises";
3
+ import { Client } from "@modelcontextprotocol/client";
4
+ import { z } from "zod";
5
+ import { ChildStdioTransport } from "./child-stdio-transport.js";
6
+ import { PiSessionCreationError, WriterUnavailableError } from "./pi-adapter.js";
7
+ import { RegistryError } from "./session-registry.js";
8
+ import { capabilitiesSchema, errorSchema, promptSuccessSchema, successSchema, turnSuccessSchema } from "./tool-schemas.js";
9
+ import { writerPaths } from "./writer-state.js";
10
+ export const RELAY_START_BUDGET_MS = 60_000;
11
+ export const RELAY_POLL_INTERVAL_MS = 1_000;
12
+ export const RELAY_CALL_TIMEOUT_MS = 10_000;
13
+ export const RELAY_PREFLIGHT_DEADLINE_MS = 15_000;
14
+ export const RELAY_ABORT_DEADLINE_MS = 15_000;
15
+ export const RELAY_CLEANUP_DEADLINE_MS = 10_000;
16
+ // The inner text cap is 64 KiB; JSON escaping can grow it up to sixfold.
17
+ export const RELAY_MAX_RESPONSE_BYTES = 524_288;
18
+ // Read the launch discriminator locally until all writer-state producers have migrated.
19
+ // Unknown fields are deliberately tolerated; no clone inspection is an admission check.
20
+ const relayStateSchema = z.object({
21
+ alias: z.string(), index: z.number().int(), phase: z.enum(["ready", "not_ready", "provisioning"]),
22
+ launch: z.enum(["legacy", "relay"]).default("legacy"),
23
+ acceptance: z.object({ verdict: z.literal("pass"), fingerprint: z.string(), at: z.string(), network: z.enum(["limited", "not_limited"]) }).optional(),
24
+ base: z.object({ ref: z.string(), commit: z.string().regex(/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/) }),
25
+ });
26
+ async function readState(home, name) {
27
+ try {
28
+ const file = await open(writerPaths(home, name).state, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
29
+ try {
30
+ const stat = await file.stat();
31
+ if (!stat.isFile() || stat.size > RELAY_MAX_RESPONSE_BYTES)
32
+ return undefined;
33
+ const state = relayStateSchema.parse(JSON.parse(await file.readFile("utf8")));
34
+ return `${state.alias}-w${state.index}` === name ? state : undefined;
35
+ }
36
+ finally {
37
+ await file.close();
38
+ }
39
+ }
40
+ catch {
41
+ return undefined;
42
+ }
43
+ }
44
+ /** Bounds even injected transports which ignore AbortSignal. The losing operation stays observed. */
45
+ async function bounded(operation, ms, signal) {
46
+ const controller = new AbortController();
47
+ let timer;
48
+ let cancel;
49
+ try {
50
+ return await Promise.race([
51
+ new Promise((_, reject) => {
52
+ cancel = () => { controller.abort(); reject(new Error("Relay operation cancelled")); };
53
+ signal?.addEventListener("abort", cancel, { once: true });
54
+ timer = setTimeout(cancel, Math.max(0, ms));
55
+ if (signal?.aborted || ms <= 0)
56
+ cancel();
57
+ }),
58
+ Promise.resolve().then(() => { controller.signal.throwIfAborted(); return operation(controller.signal); }),
59
+ ]);
60
+ }
61
+ finally {
62
+ clearTimeout(timer);
63
+ if (cancel)
64
+ signal?.removeEventListener("abort", cancel);
65
+ }
66
+ }
67
+ const creationCodes = new Set([
68
+ "unknown_provider", "unknown_model", "local_authentication_missing", "local_authentication_unavailable",
69
+ "model_unavailable", "thinking_level_unavailable", "execution_selection_mismatch", "external_mcp_unavailable",
70
+ "external_mcp_no_tools", "external_mcp_grant_tool_missing", "external_mcp_activation_mismatch",
71
+ "extension_not_installed", "extension_version_mismatch", "extension_load_failed", "extension_tool_conflict",
72
+ "extension_tool_missing", "skill_load_failed", "pi_session_creation_failed",
73
+ ]);
74
+ class InnerError extends Error {
75
+ code;
76
+ constructor(code) {
77
+ super("Writer refused the operation");
78
+ this.code = code;
79
+ }
80
+ }
81
+ class Connection {
82
+ transport;
83
+ client = new Client({ name: "pi-session-mcp-relay", version: "1" }, { capabilities: {} });
84
+ lost = false;
85
+ onLost;
86
+ tools = [];
87
+ constructor(transport) {
88
+ this.transport = transport;
89
+ const lost = () => { this.lost = true; this.onLost?.(); };
90
+ this.client.onclose = lost;
91
+ this.client.onerror = lost;
92
+ }
93
+ async connect(ms, signal) {
94
+ await bounded(s => this.client.connect(this.transport, { signal: s, timeout: ms }), ms, signal);
95
+ }
96
+ async discover(ms, signal) {
97
+ const result = await bounded(s => this.client.listTools({}, { signal: s, timeout: ms }), ms, signal);
98
+ this.tools = result.tools;
99
+ }
100
+ async call(name, args, schema, ms = RELAY_CALL_TIMEOUT_MS, signal) {
101
+ const toolDefinition = this.tools.find(tool => tool.name === name);
102
+ if (!toolDefinition)
103
+ throw new Error("Writer tool missing");
104
+ const result = await bounded(s => this.client.callTool({ name, arguments: args }, { signal: s, timeout: ms, maxTotalTimeout: ms, resetTimeoutOnProgress: false, toolDefinition }), ms, signal);
105
+ try {
106
+ const raw = result.structuredContent;
107
+ const encoded = JSON.stringify(raw);
108
+ if (encoded === undefined || Buffer.byteLength(encoded) > RELAY_MAX_RESPONSE_BYTES)
109
+ throw new Error();
110
+ const refusal = errorSchema.safeParse(raw);
111
+ if (refusal.success)
112
+ throw new InnerError(refusal.data.error.code);
113
+ return schema.parse(raw);
114
+ }
115
+ catch (error) {
116
+ if (error instanceof InnerError)
117
+ throw error;
118
+ this.lost = true;
119
+ this.onLost?.();
120
+ throw new Error("Invalid writer response");
121
+ }
122
+ }
123
+ async cleanup(sessionId, ms = RELAY_CLEANUP_DEADLINE_MS) {
124
+ // One deadline covers the RPC AND transport close, not two consecutive deadlines.
125
+ const end = Date.now() + ms;
126
+ try {
127
+ if (sessionId && !this.lost)
128
+ await this.call("pi_session_close", { sessionId }, successSchema, Math.max(0, end - Date.now()));
129
+ }
130
+ catch { /* EOF still requests launcher cleanup. */ }
131
+ finally {
132
+ try {
133
+ const closing = this.transport.close();
134
+ void closing.catch(() => undefined);
135
+ await bounded(() => closing, Math.max(0, end - Date.now()));
136
+ }
137
+ catch { /* bounded shutdown */ }
138
+ }
139
+ }
140
+ }
141
+ class RelayHandle {
142
+ connection;
143
+ placement;
144
+ pollIntervalMs;
145
+ sdkSessionId;
146
+ appliedSelection;
147
+ deadlines = { preflightMs: RELAY_PREFLIGHT_DEADLINE_MS, abortMs: RELAY_ABORT_DEADLINE_MS, cleanupMs: RELAY_CLEANUP_DEADLINE_MS };
148
+ active;
149
+ disposed = false;
150
+ disposal;
151
+ constructor(connection, session, placement, pollIntervalMs) {
152
+ this.connection = connection;
153
+ this.placement = placement;
154
+ this.pollIntervalMs = pollIntervalMs;
155
+ this.sdkSessionId = session.id;
156
+ this.appliedSelection = { provider: session.provider, model: session.model, thinkingLevel: session.thinkingLevel };
157
+ connection.onLost = () => this.settle({ status: "failed" });
158
+ }
159
+ isLost() { return this.connection.lost; }
160
+ settle(outcome) { const active = this.active; this.active = undefined; active?.settle(outcome); }
161
+ lose() { this.connection.lost = true; this.settle({ status: "failed" }); }
162
+ observe(turn) {
163
+ const active = this.active;
164
+ if (!active || turn.turnId !== active.turnId || turn.sessionId !== this.sdkSessionId) {
165
+ this.lose();
166
+ return;
167
+ }
168
+ if (active.updatedAt !== undefined && active.updatedAt !== turn.updatedAt)
169
+ active.activity?.();
170
+ active.updatedAt = turn.updatedAt;
171
+ if (turn.state === "completed")
172
+ this.settle({ status: "completed", assistantText: turn.assistantText, truncated: turn.truncated });
173
+ else if (turn.state === "aborted" || turn.state === "failed")
174
+ this.settle({ status: turn.state });
175
+ }
176
+ async prompt(text, preflight, onActivity) {
177
+ if (this.isLost() || this.disposed)
178
+ throw new RegistryError("writer_session_lost");
179
+ if (this.active)
180
+ throw new Error("Relay turn already running");
181
+ let settle;
182
+ const outcome = new Promise(resolve => { settle = resolve; });
183
+ const active = { settle, activity: onActivity };
184
+ this.active = active;
185
+ try {
186
+ const result = await this.connection.call("pi_session_prompt", { sessionId: this.sdkSessionId, prompt: text }, promptSuccessSchema);
187
+ if (result.turn.state !== "running" || result.session.id !== this.sdkSessionId) {
188
+ this.lose();
189
+ preflight(false);
190
+ }
191
+ else if (this.active === active) {
192
+ active.turnId = result.turn.turnId;
193
+ active.updatedAt = result.turn.updatedAt;
194
+ preflight(true);
195
+ void this.poll(active);
196
+ }
197
+ else
198
+ preflight(false);
199
+ }
200
+ catch (error) {
201
+ preflight(false);
202
+ if (!(error instanceof InnerError) && !this.isLost()) {
203
+ // Acceptance is uncertain: ask the inner registry to settle before returning failure.
204
+ try {
205
+ await this.abort();
206
+ }
207
+ catch {
208
+ this.lose();
209
+ }
210
+ }
211
+ this.settle({ status: "failed" });
212
+ }
213
+ return outcome;
214
+ }
215
+ async poll(active) {
216
+ while (this.active === active && !this.isLost() && !this.disposed) {
217
+ await new Promise(resolve => setTimeout(resolve, this.pollIntervalMs));
218
+ if (this.active !== active || this.isLost() || this.disposed)
219
+ return;
220
+ try {
221
+ const { turn } = await this.connection.call("pi_turn_get", { sessionId: this.sdkSessionId, turnId: active.turnId }, turnSuccessSchema);
222
+ // An abort may have settled this turn and a new prompt may already be running.
223
+ if (this.active === active)
224
+ this.observe(turn);
225
+ }
226
+ catch {
227
+ this.lose();
228
+ }
229
+ }
230
+ }
231
+ async abort() {
232
+ if (this.isLost())
233
+ throw new Error("Writer session lost");
234
+ const active = this.active;
235
+ try {
236
+ await bounded(async (signal) => {
237
+ const result = await this.connection.call("pi_session_abort", { sessionId: this.sdkSessionId }, successSchema, RELAY_CALL_TIMEOUT_MS, signal);
238
+ if (result.session.id !== this.sdkSessionId)
239
+ throw new Error("Writer session mismatch");
240
+ if (!active || this.active !== active)
241
+ return;
242
+ // A lost prompt response has no turn ID. It cannot be safely resumed.
243
+ if (!active.turnId)
244
+ throw new Error("Writer turn unknown");
245
+ const { turn } = await this.connection.call("pi_turn_get", { sessionId: this.sdkSessionId, turnId: active.turnId }, turnSuccessSchema, RELAY_CALL_TIMEOUT_MS, signal);
246
+ if (turn.state === "running")
247
+ throw new Error("Writer abort incomplete");
248
+ if (this.active === active)
249
+ this.observe(turn);
250
+ }, RELAY_ABORT_DEADLINE_MS);
251
+ }
252
+ catch {
253
+ this.lose();
254
+ throw new Error("Writer abort failed");
255
+ }
256
+ }
257
+ dispose() {
258
+ if (!this.disposal) {
259
+ this.disposed = true;
260
+ this.settle({ status: "failed" });
261
+ this.disposal = this.connection.cleanup(this.sdkSessionId);
262
+ }
263
+ return this.disposal;
264
+ }
265
+ }
266
+ export class WriterRelayAdapter {
267
+ options;
268
+ constructor(options) {
269
+ this.options = options;
270
+ }
271
+ async create(input) {
272
+ if (process.platform !== "linux")
273
+ throw new WriterUnavailableError("none_ready");
274
+ const now = this.options.now ?? Date.now, end = now() + RELAY_START_BUDGET_MS;
275
+ const left = () => Math.max(0, end - now());
276
+ const remaining = () => Math.min(RELAY_CALL_TIMEOUT_MS, left());
277
+ const settings = this.options.workspaceModes.get(input.workspace)?.container;
278
+ const ready = [];
279
+ for (let i = 1; i <= (settings?.writers ?? 0); i++) {
280
+ const name = `${input.workspace}-w${i}`, state = await readState(this.options.home, name);
281
+ if (state?.phase === "ready" && state.launch === "relay" && state.acceptance)
282
+ ready.push({ name, state });
283
+ }
284
+ if (!ready.length)
285
+ throw new WriterUnavailableError("none_ready");
286
+ const base = input.base ?? settings?.base;
287
+ const candidates = base === undefined ? [] : ready.filter(({ state }) => state.base.ref === `refs/heads/${base}`);
288
+ if (!candidates.length)
289
+ throw new WriterUnavailableError("none_at_base");
290
+ const counts = { busy: 0, notAtBaseline: 0, settingsChanged: 0 };
291
+ const env = { HOME: this.options.home };
292
+ for (const key of ["PATH", "XDG_RUNTIME_DIR"])
293
+ if (process.env[key] !== undefined)
294
+ env[key] = process.env[key];
295
+ const factory = this.options.spawn ?? { spawn: (wrapper, environment) => new ChildStdioTransport(wrapper, environment) };
296
+ for (const candidate of candidates) {
297
+ input.signal?.throwIfAborted();
298
+ if (left() <= 0)
299
+ break;
300
+ let connection, sessionId, admitted = false;
301
+ try {
302
+ connection = new Connection(factory.spawn(writerPaths(this.options.home, candidate.name).wrapper, env));
303
+ // The handshake waits for credential warm-up and the container start: it may use the whole budget.
304
+ await connection.connect(left(), input.signal);
305
+ await connection.discover(remaining(), input.signal);
306
+ const capabilities = await connection.call("pi_capabilities_get", {}, capabilitiesSchema, remaining(), input.signal);
307
+ const inner = capabilities.executionProfiles.find(profile => profile.alias === input.executionProfile.alias);
308
+ const host = this.options.executionProfiles.get(input.executionProfile.alias);
309
+ if (!host || !inner || ["permissionProfile", "provider", "model", "thinkingLevel"].some(key => inner[key] !== host[key])) {
310
+ counts.settingsChanged++;
311
+ continue;
312
+ }
313
+ const result = await connection.call("pi_session_start", { workspace: input.workspace, executionProfile: input.executionProfile.alias }, successSchema, remaining(), input.signal);
314
+ sessionId = result.session.id;
315
+ if (remaining() <= 0 || connection.lost)
316
+ continue;
317
+ const state = await readState(this.options.home, candidate.name);
318
+ if (!state || state.base.ref !== candidate.state.base.ref || state.base.commit !== candidate.state.base.commit)
319
+ continue;
320
+ input.signal?.throwIfAborted();
321
+ admitted = true;
322
+ return new RelayHandle(connection, result.session, { writer: candidate.name, base: state.base }, this.options.pollIntervalMs ?? RELAY_POLL_INTERVAL_MS);
323
+ }
324
+ catch (error) {
325
+ if (input.signal?.aborted)
326
+ throw input.signal.reason;
327
+ if (error instanceof InnerError) {
328
+ if (error.code === "writer_busy")
329
+ counts.busy++;
330
+ else if (error.code === "writer_uncollected")
331
+ counts.notAtBaseline++;
332
+ else if (!["writer_fenced", "writer_not_ready", "container_runtime_unavailable"].includes(error.code)) {
333
+ const code = error.code;
334
+ throw new PiSessionCreationError(creationCodes.has(code) ? code : "pi_session_creation_failed");
335
+ }
336
+ }
337
+ }
338
+ finally {
339
+ // Own bound, not the start budget: a started inner session is always closed explicitly.
340
+ if (!admitted && connection)
341
+ await connection.cleanup(sessionId);
342
+ }
343
+ }
344
+ throw new WriterUnavailableError("none_admitted", counts);
345
+ }
346
+ }
347
+ export class RoutingPiSessionAdapter {
348
+ host;
349
+ relay;
350
+ workspaceModes;
351
+ constructor(host, relay, workspaceModes) {
352
+ this.host = host;
353
+ this.relay = relay;
354
+ this.workspaceModes = workspaceModes;
355
+ }
356
+ create(input) {
357
+ return (input.executionProfile.permissionProfile === "coding" && this.workspaceModes.get(input.workspace)?.mode === "container" ? this.relay : this.host).create(input);
358
+ }
359
+ }
@@ -0,0 +1,111 @@
1
+ import { z } from "zod";
2
+ export declare const WRITER_NAME_PATTERN: RegExp;
3
+ export declare class WriterStateError extends Error {
4
+ readonly code: "writer_state_invalid" | "writer_state_unreadable";
5
+ constructor(code: "writer_state_invalid" | "writer_state_unreadable");
6
+ }
7
+ export declare const writerStateSchema: z.ZodObject<{
8
+ schemaVersion: z.ZodLiteral<1>;
9
+ alias: z.ZodString;
10
+ index: z.ZodNumber;
11
+ phase: z.ZodEnum<{
12
+ not_ready: "not_ready";
13
+ provisioning: "provisioning";
14
+ ready: "ready";
15
+ }>;
16
+ lifecycle: z.ZodEnum<{
17
+ ephemeral: "ephemeral";
18
+ persistent: "persistent";
19
+ }>;
20
+ launch: z.ZodDefault<z.ZodEnum<{
21
+ legacy: "legacy";
22
+ relay: "relay";
23
+ }>>;
24
+ profiles: z.ZodReadonly<z.ZodArray<z.ZodString>>;
25
+ providers: z.ZodReadonly<z.ZodArray<z.ZodObject<{
26
+ provider: z.ZodString;
27
+ model: z.ZodString;
28
+ }, z.core.$strict>>>;
29
+ network: z.ZodEnum<{
30
+ none: "none";
31
+ pasta: "pasta";
32
+ }>;
33
+ cache: z.ZodEnum<{
34
+ go: "go";
35
+ none: "none";
36
+ uv: "uv";
37
+ }>;
38
+ tags: z.ZodDefault<z.ZodEnum<{
39
+ none: "none";
40
+ reachable: "reachable";
41
+ }>>;
42
+ imageId: z.ZodString;
43
+ base: z.ZodObject<{
44
+ ref: z.ZodString;
45
+ commit: z.ZodString;
46
+ }, z.core.$strict>;
47
+ acceptance: z.ZodOptional<z.ZodObject<{
48
+ fingerprint: z.ZodString;
49
+ verdict: z.ZodLiteral<"pass">;
50
+ network: z.ZodEnum<{
51
+ limited: "limited";
52
+ not_limited: "not_limited";
53
+ }>;
54
+ at: z.ZodString;
55
+ }, z.core.$strict>>;
56
+ collected: z.ZodOptional<z.ZodObject<{
57
+ digest: z.ZodString;
58
+ at: z.ZodString;
59
+ }, z.core.$strict>>;
60
+ }, z.core.$strict>;
61
+ export type WriterState = Omit<z.infer<typeof writerStateSchema>, "launch"> & {
62
+ launch?: "legacy" | "relay";
63
+ };
64
+ export declare function writerName(alias: string, index: number): string;
65
+ export declare function writerRegistrationName(name: string): string;
66
+ export declare function writersRoot(home: string): string;
67
+ export declare function writerPaths(home: string, name: string): {
68
+ root: string;
69
+ clone: string;
70
+ agent: string;
71
+ bundles: string;
72
+ config: string;
73
+ events: string;
74
+ go: string;
75
+ uv: string;
76
+ wrapper: string;
77
+ state: string;
78
+ acceptanceFailure: string;
79
+ };
80
+ export declare function readWriterState(home: string, name: string): Promise<WriterState | undefined>;
81
+ export declare function writeWriterState(home: string, name: string, state: WriterState): Promise<void>;
82
+ /**
83
+ * Whether the writer's own server configuration (the one mounted at /pi/config) enables event delivery.
84
+ * Anything unreadable or unexpected counts as disabled, so a doubtful configuration never adds the spool mount.
85
+ */
86
+ export declare function writerEventDeliveryEnabled(configDirectory: string): Promise<boolean>;
87
+ /**
88
+ * The writer's own configuration sits next to its wrapper (`<root>/config`), so acceptance, launch
89
+ * and Doctor all read event delivery from the same place. Delivery is part of the fingerprint only
90
+ * when it is enabled: an accepted writer without delivery keeps its fingerprint, and enabling
91
+ * delivery (a new spool mount in the boundary) needs a new acceptance.
92
+ */
93
+ export declare function currentAcceptanceFingerprint(wrapper: string, state: WriterState, podmanVersion: string): Promise<string>;
94
+ /**
95
+ * Doctor's `writer_not_ready` predicate, shared with setup: a ready phase alone survives a package
96
+ * upgrade or another changed binding, so setup accepts such a writer again (#130).
97
+ */
98
+ export declare function writerAcceptanceCurrent(wrapper: string, state: WriterState, runtime: {
99
+ podmanVersion?: string;
100
+ imageExists: (id: string) => Promise<boolean>;
101
+ }): Promise<boolean>;
102
+ export declare function acceptanceFingerprint(input: {
103
+ wrapperDigest: string;
104
+ packageVersion: string;
105
+ imageId: string;
106
+ podmanVersion: string;
107
+ network: string;
108
+ cache: string;
109
+ /** Present only for an enabled delivery; an absent value must not change the canonical text of earlier fingerprints. */
110
+ eventDelivery?: boolean;
111
+ }): string;
@@ -0,0 +1,199 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { wrapperDigest } from "./writer-wrapper.js";
3
+ import { constants } from "node:fs";
4
+ import { lstat, mkdir, open, readFile, rename, unlink } from "node:fs/promises";
5
+ import { dirname, join } from "node:path";
6
+ import { z } from "zod";
7
+ import { PACKAGE_VERSION } from "./package-metadata.js";
8
+ import { ALIAS_PATTERN } from "./execution-profile.js";
9
+ export const WRITER_NAME_PATTERN = /^[a-z][a-z0-9_-]{0,63}-w([1-9]|1[0-6])$/;
10
+ export class WriterStateError extends Error {
11
+ code;
12
+ constructor(code) {
13
+ super(code);
14
+ this.code = code;
15
+ this.name = "WriterStateError";
16
+ }
17
+ }
18
+ const aliasSchema = z.string().regex(ALIAS_PATTERN);
19
+ const indexSchema = z.number().int().min(1).max(16);
20
+ const hex64 = z.string().regex(/^[0-9a-f]{64}$/);
21
+ export const writerStateSchema = z.object({
22
+ schemaVersion: z.literal(1),
23
+ alias: aliasSchema,
24
+ index: indexSchema,
25
+ phase: z.enum(["provisioning", "ready", "not_ready"]),
26
+ lifecycle: z.enum(["persistent", "ephemeral"]),
27
+ launch: z.enum(["legacy", "relay"]).default("legacy"),
28
+ profiles: z.array(aliasSchema).min(1).readonly(),
29
+ providers: z.array(z.object({
30
+ provider: z.string().regex(/^[a-z][a-z0-9_-]{0,63}$/),
31
+ model: z.string().min(1).max(200),
32
+ }).strict()).refine((providers) => new Set(providers.map(({ provider }) => provider)).size === providers.length).readonly(),
33
+ network: z.enum(["pasta", "none"]),
34
+ cache: z.enum(["none", "go", "uv"]),
35
+ tags: z.enum(["none", "reachable"]).default("none"),
36
+ imageId: hex64,
37
+ base: z.object({ ref: z.string(), commit: z.string().regex(/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/) }).strict(),
38
+ acceptance: z.object({
39
+ fingerprint: z.string(), verdict: z.literal("pass"), network: z.enum(["limited", "not_limited"]), at: z.string(),
40
+ }).strict().optional(),
41
+ collected: z.object({ digest: z.string(), at: z.string() }).strict().optional(),
42
+ }).strict();
43
+ export function writerName(alias, index) {
44
+ if (!aliasSchema.safeParse(alias).success || !indexSchema.safeParse(index).success) {
45
+ throw new WriterStateError("writer_state_invalid");
46
+ }
47
+ return `${alias}-w${index}`;
48
+ }
49
+ function validateName(name) {
50
+ if (!WRITER_NAME_PATTERN.test(name))
51
+ throw new WriterStateError("writer_state_invalid");
52
+ }
53
+ export function writerRegistrationName(name) {
54
+ validateName(name);
55
+ return `pi-coding-${name}`;
56
+ }
57
+ export function writersRoot(home) {
58
+ return join(home, ".local", "state", "pi-session-mcp", "writers");
59
+ }
60
+ export function writerPaths(home, name) {
61
+ validateName(name);
62
+ const root = join(writersRoot(home), name);
63
+ return {
64
+ root, clone: join(root, "clone"), agent: join(root, "agent"), bundles: join(root, "bundles"),
65
+ config: join(root, "config"), events: join(root, "events"), go: join(root, "go"), uv: join(root, "uv"), wrapper: join(root, "wrapper.sh"), state: join(root, "state.json"),
66
+ acceptanceFailure: join(root, "acceptance-failure.json"),
67
+ };
68
+ }
69
+ function validateState(raw, name) {
70
+ const parsed = writerStateSchema.safeParse(raw);
71
+ if (!parsed.success || writerName(parsed.data.alias, parsed.data.index) !== name) {
72
+ throw new WriterStateError("writer_state_invalid");
73
+ }
74
+ return parsed.data;
75
+ }
76
+ export async function readWriterState(home, name) {
77
+ const path = writerPaths(home, name).state;
78
+ let stat;
79
+ try {
80
+ stat = await lstat(path);
81
+ }
82
+ catch (error) {
83
+ if (error instanceof Error && "code" in error && error.code === "ENOENT")
84
+ return undefined;
85
+ throw new WriterStateError("writer_state_unreadable");
86
+ }
87
+ if (!stat.isFile())
88
+ throw new WriterStateError("writer_state_invalid");
89
+ try {
90
+ // Recheck the opened file and do not follow a symlink swapped in after lstat.
91
+ const handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
92
+ try {
93
+ if (!(await handle.stat()).isFile())
94
+ throw new WriterStateError("writer_state_invalid");
95
+ return validateState(JSON.parse(await handle.readFile("utf8")), name);
96
+ }
97
+ finally {
98
+ await handle.close();
99
+ }
100
+ }
101
+ catch (error) {
102
+ if (error instanceof WriterStateError)
103
+ throw error;
104
+ if (error instanceof SyntaxError)
105
+ throw new WriterStateError("writer_state_invalid");
106
+ if (error instanceof Error && "code" in error) {
107
+ if (error.code === "ENOENT")
108
+ return undefined;
109
+ if (error.code === "ELOOP")
110
+ throw new WriterStateError("writer_state_invalid");
111
+ }
112
+ throw new WriterStateError("writer_state_unreadable");
113
+ }
114
+ }
115
+ export async function writeWriterState(home, name, state) {
116
+ const paths = writerPaths(home, name);
117
+ const validated = validateState(state, name);
118
+ await mkdir(paths.root, { recursive: true, mode: 0o700 });
119
+ const temporary = join(paths.root, `.state-${randomUUID()}.tmp`);
120
+ let created = false;
121
+ try {
122
+ const handle = await open(temporary, "wx", 0o600);
123
+ created = true;
124
+ try {
125
+ await handle.writeFile(`${JSON.stringify(validated, null, 2)}\n`);
126
+ await handle.sync();
127
+ }
128
+ finally {
129
+ await handle.close();
130
+ }
131
+ await rename(temporary, paths.state);
132
+ const directory = await open(paths.root, "r");
133
+ try {
134
+ await directory.sync();
135
+ }
136
+ finally {
137
+ await directory.close();
138
+ }
139
+ }
140
+ finally {
141
+ if (created)
142
+ await unlink(temporary).catch((error) => {
143
+ if (!(error instanceof Error && "code" in error && error.code === "ENOENT"))
144
+ throw error;
145
+ });
146
+ }
147
+ }
148
+ /**
149
+ * Whether the writer's own server configuration (the one mounted at /pi/config) enables event delivery.
150
+ * Anything unreadable or unexpected counts as disabled, so a doubtful configuration never adds the spool mount.
151
+ */
152
+ export async function writerEventDeliveryEnabled(configDirectory) {
153
+ try {
154
+ const handle = await open(join(configDirectory, "pi-session-mcp.json"), constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
155
+ try {
156
+ if (!(await handle.stat()).isFile())
157
+ return false;
158
+ const config = JSON.parse(await handle.readFile("utf8"));
159
+ if (config === null || typeof config !== "object" || Array.isArray(config))
160
+ return false;
161
+ const events = config.events;
162
+ return events !== null && typeof events === "object" && !Array.isArray(events)
163
+ && Object.keys(events).length === 1 && events.delivery === "spool";
164
+ }
165
+ finally {
166
+ await handle.close();
167
+ }
168
+ }
169
+ catch {
170
+ return false;
171
+ }
172
+ }
173
+ /**
174
+ * The writer's own configuration sits next to its wrapper (`<root>/config`), so acceptance, launch
175
+ * and Doctor all read event delivery from the same place. Delivery is part of the fingerprint only
176
+ * when it is enabled: an accepted writer without delivery keeps its fingerprint, and enabling
177
+ * delivery (a new spool mount in the boundary) needs a new acceptance.
178
+ */
179
+ export async function currentAcceptanceFingerprint(wrapper, state, podmanVersion) {
180
+ const eventDelivery = await writerEventDeliveryEnabled(join(dirname(wrapper), "config"));
181
+ return acceptanceFingerprint({ wrapperDigest: wrapperDigest(await readFile(wrapper, "utf8")), packageVersion: PACKAGE_VERSION,
182
+ imageId: state.imageId, podmanVersion, network: state.network, cache: state.cache, ...(eventDelivery ? { eventDelivery } : {}) });
183
+ }
184
+ /**
185
+ * Doctor's `writer_not_ready` predicate, shared with setup: a ready phase alone survives a package
186
+ * upgrade or another changed binding, so setup accepts such a writer again (#130).
187
+ */
188
+ export async function writerAcceptanceCurrent(wrapper, state, runtime) {
189
+ return state.phase === "ready" && !!state.acceptance && !!runtime.podmanVersion
190
+ && state.acceptance.fingerprint === await currentAcceptanceFingerprint(wrapper, state, runtime.podmanVersion)
191
+ && await runtime.imageExists(state.imageId);
192
+ }
193
+ export function acceptanceFingerprint(input) {
194
+ const canonical = JSON.stringify({
195
+ cache: input.cache, ...(input.eventDelivery ? { eventDelivery: true } : {}), imageId: input.imageId, network: input.network,
196
+ packageVersion: input.packageVersion, podmanVersion: input.podmanVersion, wrapperDigest: input.wrapperDigest,
197
+ });
198
+ return `sha256:${createHash("sha256").update(canonical).digest("hex")}`;
199
+ }
@@ -0,0 +1,3 @@
1
+ /** Pure wrapper rendering and hashing; safe to import from operator CLIs. */
2
+ export declare function renderWrapper(nodePath: string, releaseRoot: string, name: string): string;
3
+ export declare function wrapperDigest(text: string): string;