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.
- package/.pi-session-mcp-cli/client-adapters/command.js +33 -0
- package/.pi-session-mcp-cli/client-adapters/mcp-verifier.js +198 -0
- package/.pi-session-mcp-cli/client-adapters/types.js +1 -0
- package/.pi-session-mcp-cli/config.js +29 -3
- package/.pi-session-mcp-cli/container-runtime.js +18 -0
- package/.pi-session-mcp-cli/doctor.js +370 -4
- package/.pi-session-mcp-cli/execution-modes.js +83 -0
- package/.pi-session-mcp-cli/execution-profile.js +1 -0
- package/.pi-session-mcp-cli/override-lock.js +4 -4
- package/.pi-session-mcp-cli/session-tools.js +45 -0
- package/.pi-session-mcp-cli/setup-platform.js +64 -36
- package/.pi-session-mcp-cli/setup-process.js +455 -0
- package/.pi-session-mcp-cli/skill-library.js +8 -4
- package/.pi-session-mcp-cli/turn-events.js +97 -0
- package/.pi-session-mcp-cli/writer-boundary.js +321 -0
- package/.pi-session-mcp-cli/writer-fence.js +50 -0
- package/.pi-session-mcp-cli/writer-lease.js +140 -0
- package/.pi-session-mcp-cli/writer-lifecycle.js +567 -0
- package/.pi-session-mcp-cli/writer-state.js +199 -0
- package/.pi-session-mcp-cli/writer-wrapper.js +14 -0
- package/CHANGELOG.md +527 -0
- package/README.md +8 -2
- package/dist/capabilities.d.ts +9 -1
- package/dist/capabilities.js +8 -3
- package/dist/child-stdio-transport.d.ts +21 -0
- package/dist/child-stdio-transport.js +88 -0
- package/dist/client-adapters/claude-code.js +3 -2
- package/dist/client-adapters/command.d.ts +8 -0
- package/dist/client-adapters/command.js +9 -1
- package/dist/client-adapters/mcp-verifier.d.ts +7 -0
- package/dist/client-adapters/mcp-verifier.js +21 -4
- package/dist/client-adapters/types.d.ts +5 -1
- package/dist/client-adapters/writer-registration.d.ts +16 -0
- package/dist/client-adapters/writer-registration.js +156 -0
- package/dist/config.d.ts +12 -1
- package/dist/config.js +29 -3
- package/dist/container-runtime.d.ts +2 -0
- package/dist/container-runtime.js +18 -0
- package/dist/doctor.d.ts +36 -2
- package/dist/doctor.js +370 -4
- package/dist/event-spool.d.ts +70 -0
- package/dist/event-spool.js +180 -0
- package/dist/execution-modes.d.ts +60 -0
- package/dist/execution-modes.js +83 -0
- package/dist/execution-profile.d.ts +2 -0
- package/dist/execution-profile.js +1 -0
- package/dist/main.js +63 -8
- package/dist/override-lock.d.ts +2 -0
- package/dist/override-lock.js +4 -4
- package/dist/pi-adapter.d.ts +31 -1
- package/dist/pi-adapter.js +12 -0
- package/dist/process-diagnostics.d.ts +1 -1
- package/dist/process-diagnostics.js +2 -1
- package/dist/refusal-server.d.ts +6 -0
- package/dist/refusal-server.js +46 -0
- package/dist/sdk-pi-adapter.js +16 -9
- package/dist/server.d.ts +3 -2
- package/dist/server.js +27 -53
- package/dist/session-registry.d.ts +32 -2
- package/dist/session-registry.js +61 -11
- package/dist/session-tools.d.ts +14 -5
- package/dist/session-tools.js +13 -9
- package/dist/setup-cli.d.ts +14 -0
- package/dist/setup-cli.js +132 -0
- package/dist/setup-command-guardian.js +9 -3
- package/dist/setup-hooks.d.ts +158 -0
- package/dist/setup-hooks.js +657 -0
- package/dist/setup-main.d.ts +1 -1
- package/dist/setup-main.js +18 -2
- package/dist/setup-modes.d.ts +18 -0
- package/dist/setup-modes.js +131 -0
- package/dist/setup-ownership.d.ts +1 -0
- package/dist/setup-ownership.js +11 -3
- package/dist/setup-platform.d.ts +9 -1
- package/dist/setup-platform.js +64 -36
- package/dist/setup-process.d.ts +23 -1
- package/dist/setup-process.js +88 -10
- package/dist/setup-writers.d.ts +42 -0
- package/dist/setup-writers.js +510 -0
- package/dist/setup.d.ts +4 -1
- package/dist/setup.js +23 -10
- package/dist/skill-library.d.ts +2 -0
- package/dist/skill-library.js +8 -4
- package/dist/tool-schemas.d.ts +339 -0
- package/dist/tool-schemas.js +49 -0
- package/dist/turn-events.d.ts +45 -0
- package/dist/turn-events.js +97 -0
- package/dist/wake-hook.d.ts +180 -0
- package/dist/wake-hook.js +638 -0
- package/dist/wake-main.d.ts +8 -0
- package/dist/wake-main.js +111 -0
- package/dist/writer-acceptance.d.ts +10 -0
- package/dist/writer-acceptance.js +192 -0
- package/dist/writer-boundary.d.ts +52 -0
- package/dist/writer-boundary.js +321 -0
- package/dist/writer-credentials.d.ts +29 -0
- package/dist/writer-credentials.js +85 -0
- package/dist/writer-fence.d.ts +12 -0
- package/dist/writer-fence.js +50 -0
- package/dist/writer-guard.d.ts +13 -0
- package/dist/writer-guard.js +54 -0
- package/dist/writer-launch.d.ts +29 -0
- package/dist/writer-launch.js +232 -0
- package/dist/writer-lease.d.ts +28 -0
- package/dist/writer-lease.js +140 -0
- package/dist/writer-lifecycle.d.ts +96 -0
- package/dist/writer-lifecycle.js +567 -0
- package/dist/writer-relay.d.ts +33 -0
- package/dist/writer-relay.js +359 -0
- package/dist/writer-state.d.ts +111 -0
- package/dist/writer-state.js +199 -0
- package/dist/writer-wrapper.d.ts +3 -0
- package/dist/writer-wrapper.js +14 -0
- package/docs/acceptance.md +1694 -1
- package/docs/adr/0003-post-mvp-maintenance.md +2 -2
- package/docs/adr/0006-pi-extension-allowlist.md +3 -1
- package/docs/adr/0008-coding-profile-isolation.md +295 -0
- package/docs/adr/0009-execution-modes.md +131 -0
- package/docs/adr/0010-read-only-extension-tools.md +68 -0
- package/docs/adr/0011-turn-events-and-controller-wake.md +173 -0
- package/docs/adr/0012-leased-writer-pool.md +357 -0
- package/docs/architecture.md +96 -8
- package/docs/client-setup-design.md +12 -8
- package/docs/client-setup.md +84 -2
- package/docs/doctor-design.md +48 -0
- package/docs/evaluation/2026-10-17-live-screening.md +121 -0
- package/docs/evaluation/2026-10-17-node-runtime-followup.md +33 -0
- package/docs/evaluation/2026-10-17-profile-evaluation-evidence.md +155 -0
- package/docs/evaluation/2026-10-17-test-coverage.md +127 -0
- package/docs/evaluation/README.md +123 -0
- package/docs/evaluation/client-reconnect-2026-10-17/README.md +41 -0
- package/docs/evaluation/client-reconnect-2026-10-17/checks.json +38 -0
- package/docs/evaluation/client-reconnect-2026-10-17/integrity.json +30 -0
- package/docs/evaluation/client-reconnect-2026-10-17/reconnect.json +57 -0
- package/docs/evaluation/client-reconnect-2026-10-17/registration-verification.json +389 -0
- package/docs/evaluation/client-reconnect-2026-10-17/review.json +10 -0
- package/docs/evaluation/controller-ledger-hooks-2026-10-26/README.md +115 -0
- package/docs/evaluation/evidence-2026-10-17/budget.proposed.json +13 -0
- package/docs/evaluation/evidence-2026-10-17/changed-files.txt +82 -0
- package/docs/evaluation/evidence-2026-10-17/checks.json +103 -0
- package/docs/evaluation/evidence-2026-10-17/comparison.json +247 -0
- package/docs/evaluation/evidence-2026-10-17/development-collection-failure.json +15 -0
- package/docs/evaluation/evidence-2026-10-17/full-attempt-default.json +19 -0
- package/docs/evaluation/evidence-2026-10-17/full-tests.json +17 -0
- package/docs/evaluation/evidence-2026-10-17/inventory.json +239 -0
- package/docs/evaluation/evidence-2026-10-17/manifest.json +359 -0
- package/docs/evaluation/evidence-2026-10-17/offline.json +1020 -0
- package/docs/evaluation/evidence-2026-10-17/ui-reference/T3-1280.png +0 -0
- package/docs/evaluation/evidence-2026-10-17/ui-reference/T3-375.png +0 -0
- package/docs/evaluation/evidence-2026-10-17/ui-reference/result.json +141 -0
- package/docs/evaluation/extension-ablation-2026-10-20/README.md +414 -0
- package/docs/evaluation/extension-ablation-2026-10-20/setup.md +140 -0
- package/docs/evaluation/extension-ablation-repeat-2026-10-21/README.md +142 -0
- package/docs/evaluation/extension-ablation-repeat-2026-10-21/setup.md +69 -0
- package/docs/evaluation/extension-audit-2026-10-17/README.md +149 -0
- package/docs/evaluation/extension-audit-2026-10-17/checks.json +38 -0
- package/docs/evaluation/extension-audit-2026-10-17/cursor-static-evidence.json +93 -0
- package/docs/evaluation/extension-audit-2026-10-17/installed-artifact-comparison.json +85 -0
- package/docs/evaluation/extension-audit-2026-10-17/installed-packages.json +100 -0
- package/docs/evaluation/extension-audit-2026-10-17/integrity.json +108 -0
- package/docs/evaluation/extension-audit-2026-10-17/navigation-cursor-registry.json +290 -0
- package/docs/evaluation/extension-audit-2026-10-17/navigation-static-evidence.json +185 -0
- package/docs/evaluation/extension-audit-2026-10-17/openwiki-headless-bindings.json +25 -0
- package/docs/evaluation/extension-audit-2026-10-17/openwiki-headless-cleanup.json +12 -0
- package/docs/evaluation/extension-audit-2026-10-17/openwiki-headless-probe.mjs +63 -0
- package/docs/evaluation/extension-audit-2026-10-17/openwiki-headless-reproduction.json +91 -0
- package/docs/evaluation/extension-audit-2026-10-17/openwiki-headless-result.json +83 -0
- package/docs/evaluation/extension-audit-2026-10-17/permission-cache-artifact-verification.json +24 -0
- package/docs/evaluation/extension-audit-2026-10-17/permission-cache-evidence.json +133 -0
- package/docs/evaluation/extension-audit-2026-10-17/permission-cache-report.md +64 -0
- package/docs/evaluation/extension-audit-2026-10-17/publication-export.json +10 -0
- package/docs/evaluation/extension-audit-2026-10-17/resolver-gates.json +51 -0
- package/docs/evaluation/extension-audit-2026-10-17/review.json +28 -0
- package/docs/evaluation/extension-audit-2026-10-17/run-openwiki-headless-probe.mjs +29 -0
- package/docs/evaluation/extension-audit-2026-10-17/summary.json +123 -0
- package/docs/evaluation/extension-audit-2026-10-17/web-openwiki-artifacts.json +29 -0
- package/docs/evaluation/extension-audit-2026-10-17/web-openwiki-evidence.json +116 -0
- package/docs/evaluation/extension-audit-2026-10-17/web-openwiki-report.md +113 -0
- package/docs/evaluation/extension-functions-2026-10-17/README.md +33 -0
- package/docs/evaluation/extension-functions-2026-10-17/bridges/README.md +39 -0
- package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts/extension-functions-bridges-03dc1dad-9959-40df-b51c-7820991bf7e3.json +79 -0
- package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts/extension-functions-bridges-0c43651e-8c7d-4c7c-aa9b-5b5761141e3b.json +54 -0
- package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts/extension-functions-bridges-51247b13-87c1-4ec6-886b-82d922b0585a.json +89 -0
- package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts/extension-functions-bridges-5337f6bf-503f-4c45-aac0-43b142385a87.json +47 -0
- package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts/extension-functions-bridges-60285194-b1d1-4335-b616-6614941585df.json +46 -0
- package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts/extension-functions-bridges-6d2fbaa9-a720-4582-9be1-a95f4764786d.json +69 -0
- package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts/extension-functions-bridges-6fbb576c-d87d-478d-9c05-4b5ef3563598.json +125 -0
- package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts/extension-functions-bridges-730926d1-ef20-4b2d-ab74-7e542f1065e9.json +48 -0
- package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts/extension-functions-bridges-a1baa47a-5bbe-4a16-ade8-a350599eb911.json +48 -0
- package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts/extension-functions-bridges-bc1d69c7-784f-4ddb-9335-0d905330d568.json +91 -0
- package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts/extension-functions-bridges-d582757d-2859-4683-8310-ec158bf6d551.json +99 -0
- package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts/extension-functions-bridges-e6533a23-4933-4d6e-a250-b1b27f010d18.json +60 -0
- package/docs/evaluation/extension-functions-2026-10-17/bridges/attempts.json +138 -0
- package/docs/evaluation/extension-functions-2026-10-17/bridges/guard.mjs +74 -0
- package/docs/evaluation/extension-functions-2026-10-17/bridges/integrity.json +86 -0
- package/docs/evaluation/extension-functions-2026-10-17/bridges/openwiki-final.json +125 -0
- package/docs/evaluation/extension-functions-2026-10-17/bridges/run.mjs +36 -0
- package/docs/evaluation/extension-functions-2026-10-17/bridges/web-final.json +99 -0
- package/docs/evaluation/extension-functions-2026-10-17/bridges/worker.mjs +102 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/README.md +21 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/docs/evaluation/extension-functions-2026-10-17/cache/integrity.json +165 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/probe.mjs +161 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipt-archive.json +150 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/commands-headless-3feeffc5-97bf-4079-8505-8119fab7956a.json +54 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/commands-headless-42e5eace-ad87-480a-94d9-448c1dd167b8.json +49 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/commands-headless-50f39f1c-8b48-442b-8d15-1f9c8f63bd81.json +49 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/commands-headless-8482b2b0-f600-488b-9f36-905e0125177a.json +54 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/payload-codex-bypass-128ffdce-6fd5-431b-8019-32b40ba4174d.json +42 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/payload-codex-bypass-3b572182-a737-471f-b9cb-b01d5da1752a.json +42 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/payload-codex-bypass-6c225370-2f47-4a0a-80d5-87d12f6c6fdc.json +37 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/payload-codex-bypass-b48399db-cbed-43de-9071-ac27c34e3757.json +37 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/payload-openai-3a8f52b6-c8d6-4d1c-844c-782a6624a29e.json +45 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/payload-openai-6fcdbc20-b14b-4b80-a4da-bf24078da8d2.json +50 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/payload-openai-a8d6f628-40e1-437e-b192-f7232a051a44.json +50 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/payload-openai-c3c39463-a2d6-4ff8-b985-8f6d1fb1aa02.json +45 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/stats-synthetic-a23c264f-151d-4ff0-aab4-bdbb2f6560d8.json +53 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/stats-synthetic-d8178bd3-6530-4915-9cf1-056a975bfbcd.json +53 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/stats-synthetic-e3985119-e101-459e-91cd-21a0905287ba.json +48 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/stats-synthetic-e7a40382-2d27-4db5-a133-dbe346a5dc60.json +48 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/warming-disabled-unknown-223d7adc-2dbc-4017-b1ec-0c38294320e2.json +41 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/warming-disabled-unknown-347a8548-d2e0-4846-a08e-b0399f8fd3b4.json +41 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/warming-disabled-unknown-49b45e2b-e2d2-456f-b73f-e6bc938b6378.json +46 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/warming-disabled-unknown-aaf432f2-bb91-41a7-b951-2d4316389632.json +46 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/warming-disabled-zero-204ab3e8-f1fe-4894-8fb0-08299deb4c21.json +41 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/warming-disabled-zero-9388d2df-fa15-479c-a4ef-2a774c366c0f.json +46 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/warming-disabled-zero-e0bb4742-214a-4b3f-88d2-44de54394e2f.json +46 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/receipts/warming-disabled-zero-f77e1e2d-742a-490f-9955-1dfb19f59c9c.json +41 -0
- package/docs/evaluation/extension-functions-2026-10-17/cache/runner.mjs +36 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/README.md +20 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-36-10-753Z-2bb4fff5-48cc-4f6b-ae1b-5cc1a07f610b.json +54 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-36-26-537Z-5adc4fb1-0008-4ef9-a106-aa372dabf061.json +56 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-36-32-362Z-30949c31-73a3-4dae-af81-68deded51543.json +56 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-36-38-494Z-8eec81b8-5576-48cb-b2fa-c279269db058.json +56 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-36-45-546Z-991647e5-7ea4-43c4-a90d-868e4ac38d83.json +56 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-37-02-277Z-2296fb35-e5cb-4bf1-9e83-7370bcb46bfe.json +56 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-37-28-390Z-e9c3d106-b4c9-4146-ae83-a2799c907fe5.json +56 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-37-37-371Z-8545c893-a8e3-4dc6-973b-81dfd97d798b.json +56 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-38-41-612Z-c57c4778-261d-4397-8a36-df9cc23ca629.json +58 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-38-51-661Z-0eb898de-7471-4f17-a308-5ef5d86421ff.json +58 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-38-55-412Z-8169d843-a9e7-48f4-88b1-3a90e1592df1.json +58 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-39-15-274Z-a5610333-e428-4cc6-9f5a-9206748ee512.json +58 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-39-39-506Z-d4c80a7b-76b4-4d11-bf0f-552d11b131b2.json +136 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-39-53-515Z-db409f47-8ee5-4354-b7f9-a258eb7e17d0.json +136 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/evidence-2026-10-17T13-42-04-909Z-01d70cb3-6897-46ca-b8aa-1c69d5b5c7fc.json +148 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/integrity.json +205 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/probe.mjs +151 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipt-archive.json +186 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-104e378f-8f82-4ae9-bffc-7f1d52e00e74.json +15 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-182a8009-c52a-4760-9768-9cba15fceb9c.json +14 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-1f07360d-046f-4f0c-b40f-6b57a027220c.json +65 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-256cb86e-40ae-4fec-a2d2-9b7f66cc4be8.json +14 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-2667d991-3133-44c3-b883-c401b3c14cb1.json +14 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-394fc425-ed51-408f-ab09-6d26aee0d48f.json +14 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-531d3f1d-c326-4914-b768-3d32103513b9.json +14 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-5c7d0d62-8290-494f-8729-5d60bc626ad7.json +14 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-64af1d94-ea73-481f-b827-dbf6755d8591.json +66 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-65fce696-864c-4247-960e-59f6d671cbf9.json +15 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-66acde31-19c7-4d3e-9814-ddeb2cffd373.json +14 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-79d220d0-fc0b-4cad-85cc-40b9e904fb97.json +14 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-a58f0281-71bc-4757-9d6f-e281f813135e.json +65 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-c2b61e4b-fd33-4969-ab29-118957ca5fbb.json +15 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/activation-and-resources-f61b5020-2c05-40ad-9cb8-590b22790186.json +15 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-0ee0df5a-299f-451c-96e3-5abcf8bfa999.json +45 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-169e5146-09a2-4231-8017-ebd8d4b75f0a.json +14 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-19d479f2-7162-463e-90de-2d89a13e59a3.json +15 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-1bd882bb-2403-4269-8335-90f9803f57b7.json +14 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-2ab9d418-68b2-4679-bf42-f31b6945ea5a.json +15 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-3a6aa7d7-b956-4fe5-9555-a2c63408c067.json +45 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-6333425f-0b46-4ced-a272-3d48895ee853.json +15 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-6eccb170-ff45-40e2-afc5-dfc0f77c229f.json +14 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-7f330c57-9c3f-4879-a1d0-67c4c5c36050.json +14 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-8d9de272-165c-4bb8-a147-d1b306388472.json +14 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-c1ffa69f-25fa-4f45-a691-af3bc422c089.json +14 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-c24ad0c8-5e7e-4d71-9b22-3e2708ce1626.json +14 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-c5a3140e-a28e-4264-9ee6-51b1310b3123.json +14 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-cdbb3dde-2441-46ae-9111-f2a299d45807.json +46 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/receipts/bridge-disabled-d68f774c-d1f0-4620-b334-301a20edffc3.json +15 -0
- package/docs/evaluation/extension-functions-2026-10-17/cursor/runner.mjs +147 -0
- package/docs/evaluation/extension-functions-2026-10-17/integrity.json +618 -0
- package/docs/evaluation/extension-functions-2026-10-17/navigation/README.md +22 -0
- package/docs/evaluation/extension-functions-2026-10-17/navigation/SHA256SUMS.txt +8 -0
- package/docs/evaluation/extension-functions-2026-10-17/navigation/attempt.json +13 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/docs/evaluation/extension-functions-2026-10-17/navigation/child-guard.mjs +30 -0
- package/docs/evaluation/extension-functions-2026-10-17/navigation/final-result.json +42 -0
- package/docs/evaluation/extension-functions-2026-10-17/navigation/function-probe.mjs +521 -0
- package/docs/evaluation/extension-functions-2026-10-17/navigation/function-runner.mjs +201 -0
- package/docs/evaluation/extension-functions-2026-10-17/navigation/integrity.json +153 -0
- package/docs/evaluation/extension-functions-2026-10-17/navigation/receipt-archive.json +160 -0
- package/docs/evaluation/extension-functions-2026-10-17/review.json +27 -0
- package/docs/evaluation/extension-functions-2026-10-17/summary.json +102 -0
- package/docs/evaluation/extension-functions-2026-10-17/verification.json +103 -0
- package/docs/evaluation/isolation-acceptance-2026-10-18/README.md +106 -0
- package/docs/evaluation/isolation-acceptance-2026-10-18/auth-warmup.mjs +33 -0
- package/docs/evaluation/isolation-acceptance-2026-10-18/contained-agent-ro.json +433 -0
- package/docs/evaluation/isolation-acceptance-2026-10-18/contained.json +439 -0
- package/docs/evaluation/isolation-acceptance-2026-10-18/control.json +403 -0
- package/docs/evaluation/isolation-acceptance-2026-10-18/live.json +75 -0
- package/docs/evaluation/isolation-acceptance-2026-10-18/wrapper.sh +37 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/README.md +360 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/design.md +150 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/inventory.md +113 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/live/README.md +117 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/live/dry-run/dry-01-L1-A.json +202 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/live/dry-run/dry-02-L1-C.json +259 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/live/run/01-L1-A.json +169 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/live/run/02-L1-A.json +202 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/live/run/03-L1-C.json +256 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/live/run/approval.json +31 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/live/run-2/01-L1-C.json +256 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/live/run-2/02-L1-A.json +201 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/live/run-2/approval.json +16 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/live-plan.md +87 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/pre-registration.md +117 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-1/S1.json +361 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-1/S2.json +544 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-1/S3.json +470 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-1/S4.json +271 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-1/S5.json +271 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-1/S6.json +266 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-1/X6.json +29 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-1/summary.json +269 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-2/S1.json +391 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-2/S2.json +600 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-2/S3.json +519 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-2/S4.json +281 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-2/S5.json +294 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-2/S6.json +280 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-2/S8.json +280 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-2/X6.json +32 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-2/summary.json +307 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-3/S1.json +391 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-3/S2.json +600 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-3/S3.json +519 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-3/S4.json +281 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-3/S5.json +294 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-3/S6.json +280 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-3/S8.json +280 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-3/X6.json +32 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-3/summary.json +307 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-4/S1.json +409 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-4/S2.json +634 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-4/S3.json +537 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-4/S4.json +281 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-4/S5.json +294 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-4/S6.json +280 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-4/S8.json +280 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-4/X6.json +32 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-4/summary.json +307 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-5/S1.json +409 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-5/S2.json +634 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-5/S3.json +537 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-5/S4.json +281 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-5/S5.json +294 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-5/S6.json +280 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-5/S8.json +280 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-5/X6.json +32 -0
- package/docs/evaluation/ledger-event-bridge-2026-10-21/probe/attempt-5/summary.json +307 -0
- package/docs/evaluation/live-rescreen-2026-10-17/README.md +114 -0
- package/docs/evaluation/live-rescreen-2026-10-17/approval.json +18 -0
- package/docs/evaluation/live-rescreen-2026-10-17/approved-budget.json +13 -0
- package/docs/evaluation/live-rescreen-2026-10-17/approved-manifest.json +315 -0
- package/docs/evaluation/live-rescreen-2026-10-17/audit-rescreen.mjs +78 -0
- package/docs/evaluation/live-rescreen-2026-10-17/audit.json +152 -0
- package/docs/evaluation/live-rescreen-2026-10-17/backend-independent-checks.json +38 -0
- package/docs/evaluation/live-rescreen-2026-10-17/checks.json +54 -0
- package/docs/evaluation/live-rescreen-2026-10-17/execution.json +19 -0
- package/docs/evaluation/live-rescreen-2026-10-17/integrity.json +138 -0
- package/docs/evaluation/live-rescreen-2026-10-17/planning-ledger.json +26 -0
- package/docs/evaluation/live-rescreen-2026-10-17/review.json +16 -0
- package/docs/evaluation/live-rescreen-2026-10-17/runs/comparison.json +177 -0
- package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-1.claim +1 -0
- package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-1.diagnostic.json +1 -0
- package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-1.json +97 -0
- package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-2.claim +1 -0
- package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-2.json +104 -0
- package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-2.patch +11 -0
- package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-2.snapshot/contract.mjs +4 -0
- package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-2.snapshot/package.json +1 -0
- package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-3.claim +1 -0
- package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-3.json +89 -0
- package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-4.claim +1 -0
- package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-4.json +104 -0
- package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-4.patch +11 -0
- package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-4.snapshot/contract.mjs +4 -0
- package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-4.snapshot/package.json +1 -0
- package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-5.claim +1 -0
- package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-5.diagnostic.json +1 -0
- package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-5.json +117 -0
- package/docs/evaluation/live-rescreen-2026-10-17/runs/rescreen-6.json +53 -0
- package/docs/evaluation/live-rescreen-2026-10-17/runtime-observation.json +11 -0
- package/docs/evaluation/live-screening-2026-10-17/approval.json +13 -0
- package/docs/evaluation/live-screening-2026-10-17/approved-budget.json +13 -0
- package/docs/evaluation/live-screening-2026-10-17/approved-manifest.json +359 -0
- package/docs/evaluation/live-screening-2026-10-17/audit.json +143 -0
- package/docs/evaluation/live-screening-2026-10-17/integrity.json +148 -0
- package/docs/evaluation/live-screening-2026-10-17/inventory.json +239 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/comparison.json +247 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-1.claim +1 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-1.diagnostic.json +1 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-1.json +98 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-2.claim +1 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-2.json +104 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-2.patch +11 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-2.snapshot/contract.mjs +4 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-2.snapshot/package.json +1 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-3.claim +1 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-3.diagnostic.json +1 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-3.json +97 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-4.claim +1 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-4.json +104 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-4.patch +11 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-4.snapshot/contract.mjs +4 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-4.snapshot/package.json +1 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-5.claim +1 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-5.diagnostic.json +1 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-5.json +97 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-6.claim +1 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-6.json +104 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-6.patch +11 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-6.snapshot/contract.mjs +4 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-6.snapshot/package.json +1 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-7.claim +1 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-7.json +108 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-8.claim +1 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-8.diagnostic.json +1 -0
- package/docs/evaluation/live-screening-2026-10-17/runs/screen-8.json +116 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/README.md +124 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/ab-proposal.json +135 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-1/README.md +25 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-1/approved-budget.json +13 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-1/approved-decision.json +79 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-1/approved-manifest.json +271 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-1/token-live-result.json +546 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-2/README.md +22 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-2/approved-budget.json +13 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-2/approved-decision.json +80 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-2/approved-manifest.json +271 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-2/token-live-result.json +1663 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-3/README.md +23 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-3/approved-budget.json +13 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-3/approved-decision.json +71 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-3/approved-manifest.json +271 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-3/token-live-result.json +1748 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-4/README.md +25 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-4/arm-A/approved-budget.json +13 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-4/arm-A/approved-decision.json +71 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-4/arm-A/approved-manifest.json +271 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-4/arm-A/token-live-result.json +3019 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-4/arm-B/approved-budget.json +13 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-4/arm-B/approved-decision.json +71 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-4/arm-B/approved-manifest.json +271 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/probe/attempt-4/arm-B/token-live-result.json +2859 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/README.md +67 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r1-pair1-A/approved-budget.json +13 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r1-pair1-A/approved-decision.json +71 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r1-pair1-A/approved-manifest.json +271 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r1-pair1-A/token-live-result.json +3019 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r2-pair1-B/approved-budget.json +13 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r2-pair1-B/approved-decision.json +71 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r2-pair1-B/approved-manifest.json +271 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r2-pair1-B/token-live-result.json +2981 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r3-pair2-B/approved-budget.json +13 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r3-pair2-B/approved-decision.json +71 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r3-pair2-B/approved-manifest.json +271 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r3-pair2-B/token-live-result.json +2887 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r4-pair2-A/approved-budget.json +13 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r4-pair2-A/approved-decision.json +71 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r4-pair2-A/approved-manifest.json +271 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r4-pair2-A/token-live-result.json +3189 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r5-pair3-B/approved-budget.json +13 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r5-pair3-B/approved-decision.json +71 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r5-pair3-B/approved-manifest.json +271 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r5-pair3-B/token-live-result.json +2929 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r6-pair3-A/approved-budget.json +13 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r6-pair3-A/approved-decision.json +71 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r6-pair3-A/approved-manifest.json +271 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r6-pair3-A/token-live-result.json +3085 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r7-pair4-A/approved-budget.json +13 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r7-pair4-A/approved-decision.json +71 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r7-pair4-A/approved-manifest.json +271 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r7-pair4-A/token-live-result.json +3019 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r8-pair4-B/approved-budget.json +13 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r8-pair4-B/approved-decision.json +71 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r8-pair4-B/approved-manifest.json +271 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/r8-pair4-B/token-live-result.json +2925 -0
- package/docs/evaluation/m1-ab-proposal-2026-10-18/results/summary-rows.json +338 -0
- package/docs/evaluation/node24-followup-2026-10-17/README.md +55 -0
- package/docs/evaluation/node24-followup-2026-10-17/client-migration-review.json +20 -0
- package/docs/evaluation/node24-followup-2026-10-17/client-registration-migration.json +31 -0
- package/docs/evaluation/node24-followup-2026-10-17/client-registration-verification.json +389 -0
- package/docs/evaluation/node24-followup-2026-10-17/closure-checks.json +33 -0
- package/docs/evaluation/node24-followup-2026-10-17/cursor-headless-probe.mjs +259 -0
- package/docs/evaluation/node24-followup-2026-10-17/cursor-headless-report.md +39 -0
- package/docs/evaluation/node24-followup-2026-10-17/cursor-headless-result-attempt-2.json +49 -0
- package/docs/evaluation/node24-followup-2026-10-17/cursor-headless-result-attempt-3.json +76 -0
- package/docs/evaluation/node24-followup-2026-10-17/cursor-headless-result-attempt-4.json +108 -0
- package/docs/evaluation/node24-followup-2026-10-17/cursor-headless-result.json +12 -0
- package/docs/evaluation/node24-followup-2026-10-17/cursor-headless-run.mjs +96 -0
- package/docs/evaluation/node24-followup-2026-10-17/download.json +16 -0
- package/docs/evaluation/node24-followup-2026-10-17/extension-summary.json +97 -0
- package/docs/evaluation/node24-followup-2026-10-17/final-review.json +15 -0
- package/docs/evaluation/node24-followup-2026-10-17/install.json +10 -0
- package/docs/evaluation/node24-followup-2026-10-17/integrity.json +204 -0
- package/docs/evaluation/node24-followup-2026-10-17/isolated-extensions-evidence.json +39 -0
- package/docs/evaluation/node24-followup-2026-10-17/isolated-extensions-probe.mjs +277 -0
- package/docs/evaluation/node24-followup-2026-10-17/isolated-extensions-report.md +35 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/docs/evaluation/node24-followup-2026-10-17/isolated-extensions-runner.mjs +172 -0
- package/docs/evaluation/node24-followup-2026-10-17/isolated-install.json +121 -0
- package/docs/evaluation/node24-followup-2026-10-17/isolated-package-lock.json +2321 -0
- package/docs/evaluation/node24-followup-2026-10-17/isolated-package.json +12 -0
- package/docs/evaluation/node24-followup-2026-10-17/launcher-review.json +17 -0
- package/docs/evaluation/node24-followup-2026-10-17/launcher-switch.json +28 -0
- package/docs/evaluation/node24-followup-2026-10-17/mcp-launcher-test.json +24 -0
- package/docs/evaluation/node24-followup-2026-10-17/migrate-client-node.mjs +129 -0
- package/docs/evaluation/node24-followup-2026-10-17/node-runtime-report.md +127 -0
- package/docs/evaluation/node24-followup-2026-10-17/node24-checks.json +44 -0
- package/docs/evaluation/node24-followup-2026-10-17/pi-launcher-test.json +13 -0
- package/docs/evaluation/node24-followup-2026-10-17/publication-export.json +11 -0
- package/docs/evaluation/node24-followup-2026-10-17/restore-launchers.mjs +26 -0
- package/docs/evaluation/node24-followup-2026-10-17/verify-client-node.mjs +36 -0
- package/docs/evaluation/permission-gates-2026-10-17/README.md +23 -0
- package/docs/evaluation/permission-gates-2026-10-17/attempts.json +53 -0
- package/docs/evaluation/permission-gates-2026-10-17/integrity.json +46 -0
- package/docs/evaluation/permission-gates-2026-10-17/permission-gate-probe.mjs +132 -0
- package/docs/evaluation/permission-gates-2026-10-17/permission-gate-worker.mjs +209 -0
- package/docs/evaluation/permission-gates-2026-10-17/permission-gates-result-final.json +53 -0
- package/docs/evaluation/permission-gates-2026-10-17/permission-gates-result-verified.json +54 -0
- package/docs/evaluation/permission-gates-2026-10-17/permission-gates-result.json +53 -0
- package/docs/evaluation/permission-gates-2026-10-17/review.json +19 -0
- package/docs/evaluation/permission-gates-2026-10-17/superseded-initial-receipt.json +40 -0
- package/docs/evaluation/pi-lens-registration-2026-10-19/README.md +90 -0
- package/docs/evaluation/pi-lens-registration-2026-10-19/probe.mjs +126 -0
- package/docs/evaluation/pi-lens-registration-2026-10-19/result.json +1 -0
- package/docs/evaluation/plan-continuation-2026-10-17/README.md +107 -0
- package/docs/evaluation/plan-continuation-2026-10-17/budget.proposed.json +13 -0
- package/docs/evaluation/plan-continuation-2026-10-17/checks.json +1048 -0
- package/docs/evaluation/plan-continuation-2026-10-17/integrity.json +58 -0
- package/docs/evaluation/plan-continuation-2026-10-17/inventory.json +239 -0
- package/docs/evaluation/plan-continuation-2026-10-17/manifest.proposed.json +315 -0
- package/docs/evaluation/plan-continuation-2026-10-17/next-stage-ledger.json +19 -0
- package/docs/evaluation/plan-continuation-2026-10-17/prepare-rescreen.mjs +30 -0
- package/docs/evaluation/plan-continuation-2026-10-17/prior-integrity.json +25 -0
- package/docs/evaluation/plan-continuation-2026-10-17/proposal-validation.json +14 -0
- package/docs/evaluation/plan-continuation-2026-10-17/receipt-contract-update.patch +40 -0
- package/docs/evaluation/plan-continuation-2026-10-17/review.json +8 -0
- package/docs/evaluation/plan-continuation-2026-10-17/source-delta.json +14 -0
- package/docs/evaluation/profile-evaluation.md +297 -0
- package/docs/evaluation/publication-2026-10-17/README.md +88 -0
- package/docs/evaluation/publication-2026-10-17/checks.json +117 -0
- package/docs/evaluation/publication-2026-10-17/integrity.json +21 -0
- package/docs/evaluation/publication-2026-10-17/publication-scan.json +63 -0
- package/docs/evaluation/publication-2026-10-17/review.json +21 -0
- package/docs/evaluation/s5-decision-inputs-2026-10-18/README.md +16 -0
- package/docs/evaluation/s5-decision-inputs-2026-10-18/bounded-wait.md +78 -0
- package/docs/evaluation/s5-decision-inputs-2026-10-18/claude-projection/README.md +151 -0
- package/docs/evaluation/s5-decision-inputs-2026-10-18/claude-projection/attempt-1/claude-projection.json +126 -0
- package/docs/evaluation/s5-decision-inputs-2026-10-18/claude-projection/attempt-2/claude-projection.json +1895 -0
- package/docs/evaluation/s5-decision-inputs-2026-10-18/claude-projection/attempt-3/claude-projection.json +1895 -0
- package/docs/evaluation/s5-decision-inputs-2026-10-18/claude-projection/attempt-4/claude-projection.json +1797 -0
- package/docs/evaluation/s5-decision-inputs-2026-10-18/claude-projection/attempt-5/claude-projection.json +1797 -0
- package/docs/evaluation/s5-decision-inputs-2026-10-18/worker-usage.md +63 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/README.md +212 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/binding.json +20 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/config-ev-off.json +43 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/config-ev-spool.json +43 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/config-l3.json +39 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/config-pre.json +31 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e-teardown-setup-remove.json +1 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e1-clean-10s.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e1-clean.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e1-digest-ev-e1.json +8 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e1-leaks.json +131 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e1-oracle.json +74 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e1-run.json +33 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e1-setup-1-dryrun.json +1 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e1-setup-2-apply.json +1 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e1-setup-3-verify.json +1 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e2-clean-10s.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e2-clean.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e2-digest-ev-e2l.json +8 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e2-digest-ev-e2s.json +8 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e2-leaks.json +205 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e2-oracle.json +110 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e2-run.json +33 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e3b-clean-10s.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e3b-clean.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e3b-digest-ev-e3.json +8 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e3b-leaks.json +215 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e3b-oracle.json +79 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e3b-run.json +33 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e4-clean-10s.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e4-clean.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e4-digest-ev-e4a.json +8 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e4-digest-ev-e4b.json +8 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e4-late-a.json +16 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e4-late-b.json +16 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e4-leaks.json +167 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e4-oracle.json +70 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e4-run.json +37 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e5-clean-10s.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e5-clean.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e5-digest-ev-e5.json +8 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e5-leaks.json +82 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e5-oracle.json +60 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e5-run.json +33 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e5-server-env-names.txt +14 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e6b-clean-10s.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e6b-clean.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e6b-digest-ev-e1.json +8 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e6b-leaks.json +156 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e6b-run.json +37 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e6b-setup-apply.json +1 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/e6b-teardown-remove.json +1 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/final-e-clean.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/kit.sha256 +23 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l2-packed-off.json +1185 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l2-packed-spool.json +1334 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l2-wt-off.json +1185 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l2-wt-spool.json +1334 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv1-clean-10s.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv1-clean.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv1-digest-cc-analysis.json +8 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv1-leaks.json +80 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv1-oracle.json +61 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv1-run.json +33 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv2-clean-10s.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv2-clean.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv2-leaks.json +80 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv2-oracle-stage1.json +34 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv2-oracle-stage2.json +35 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv2-run.json +33 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv2-snapshot-stage1.txt +4 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv2-snapshot-stage2.txt +5 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv3-clean-10s.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv3-clean.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv3-digest-cc-abort.json +8 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv3-leaks.json +82 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv3-oracle-flow.json +61 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv3-oracle-late.json +16 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cc-inv3-run.json +33 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-controller-skill-remove.json +1 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-controller-skill-setup.json +1 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv1-clean-10s.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv1-clean.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv1-digest-cx-analysis.json +8 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv1-leaks.json +93 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv1-oracle.json +61 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv1-run.json +33 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv2-clean-10s.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv2-clean.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv2-leaks.json +93 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv2-oracle-stage1.json +34 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv2-oracle-stage2.json +35 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv2-run.json +33 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv2-snapshot-stage1.txt +4 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv2-snapshot-stage2.txt +5 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv3-clean-10s.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv3-clean.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv3-digest-cx-abort.json +8 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv3-leaks.json +95 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv3-oracle-flow.json +61 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv3-oracle-late.json +16 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/l3-cx-inv3-run.json +33 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0-clean-10s.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0-clean.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0-digest-pre-analysis.json +8 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0-digest-pre-code.json +8 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0-leaks.json +86 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0-oracle.json +39 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0-run.json +33 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0a-harness-fail-clean-10s.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0a-harness-fail-clean.json +15 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0a-harness-fail-digest-pre-analysis.json +8 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0a-harness-fail-digest-pre-code.json +8 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0a-harness-fail-leaks.json +47 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0a-harness-fail-oracle.json +39 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/p0a-harness-fail-run.json +33 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/regdigest-after-cc.json +6 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/regdigest-after-cx.json +6 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/regdigest-after-e.json +6 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/regdigest-before.json +6 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w1-control-apply.json +1 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w1-control-dryrun.json +1 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w1-provision-apply-attempt1.json +1 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w1-provision-apply-attempt2.json +1 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w1-provision-dryrun.json +1 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w1-writer-verify.json +1 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w2-leaks.json +130 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w2-oracle.txt +14 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w2-run.json +33 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w2b-oracle.txt +16 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w2c-oracle.txt +8 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w2d-oracle.txt +6 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w2r-leaks.json +130 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w2r-oracle.txt +3 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w2r-run.json +33 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w3-collect.json +1 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w3-finish.json +1 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w3r-collect.json +1 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w3r-finish.json +1 -0
- package/docs/evaluation/s7-live-acceptance-2026-10-24/evidence/w4-remove.json +1 -0
- package/docs/evaluation/subagent-probe-2026-10-26/README.md +132 -0
- package/docs/evaluation/subagent-probe-2026-10-26/results/K7.json +463 -0
- package/docs/evaluation/subagent-probe-2026-10-26/results/summary.json +50 -0
- package/docs/evaluation/test-coverage-2026-10-17.json +483 -0
- package/docs/evaluation/test-coverage-review-2026-10-17.json +22 -0
- package/docs/evaluation/test-coverage-verification-2026-10-17.json +31 -0
- package/docs/evaluation/token-footprint-2026-10-17/README.md +297 -0
- package/docs/evaluation/token-footprint-2026-10-17/baseline.json +25871 -0
- package/docs/evaluation/token-footprint-2026-10-17/calibration-2/README.md +24 -0
- package/docs/evaluation/token-footprint-2026-10-17/calibration-2/baseline.json +30346 -0
- package/docs/evaluation/token-footprint-2026-10-17/calibration-2/client-projection.json +2538 -0
- package/docs/evaluation/token-footprint-2026-10-17/calibration-2/live-approval/budget.json +13 -0
- package/docs/evaluation/token-footprint-2026-10-17/calibration-2/live-approval/decision.json +69 -0
- package/docs/evaluation/token-footprint-2026-10-17/calibration-2/live-approval/manifest.json +271 -0
- package/docs/evaluation/token-footprint-2026-10-17/calibration-2/live-package.json +785 -0
- package/docs/evaluation/token-footprint-2026-10-17/calibration-2/measurement.json +37956 -0
- package/docs/evaluation/token-footprint-2026-10-17/calibration-2/summary.json +119 -0
- package/docs/evaluation/token-footprint-2026-10-17/checks-final.json +273 -0
- package/docs/evaluation/token-footprint-2026-10-17/checks.json +190 -0
- package/docs/evaluation/token-footprint-2026-10-17/client-attempts/README.md +25 -0
- package/docs/evaluation/token-footprint-2026-10-17/client-attempts/attempt-4.json +2274 -0
- package/docs/evaluation/token-footprint-2026-10-17/client-attempts/pilot-1.json +77 -0
- package/docs/evaluation/token-footprint-2026-10-17/client-attempts/pilot-2.json +81 -0
- package/docs/evaluation/token-footprint-2026-10-17/client-attempts/pilot-3.json +121 -0
- package/docs/evaluation/token-footprint-2026-10-17/current-calibration/baseline.json +30346 -0
- package/docs/evaluation/token-footprint-2026-10-17/current-calibration/measurement.json +37956 -0
- package/docs/evaluation/token-footprint-2026-10-17/current-calibration/summary.json +119 -0
- package/docs/evaluation/token-footprint-2026-10-17/current-client-projection.json +2538 -0
- package/docs/evaluation/token-footprint-2026-10-17/follow-up.md +76 -0
- package/docs/evaluation/token-footprint-2026-10-17/integrity.json +171 -0
- package/docs/evaluation/token-footprint-2026-10-17/live-approval/README.md +36 -0
- package/docs/evaluation/token-footprint-2026-10-17/live-approval/budget.json +13 -0
- package/docs/evaluation/token-footprint-2026-10-17/live-approval/decision.json +69 -0
- package/docs/evaluation/token-footprint-2026-10-17/live-approval/manifest.json +271 -0
- package/docs/evaluation/token-footprint-2026-10-17/live-package.json +795 -0
- package/docs/evaluation/token-footprint-2026-10-17/live-proposal.json +427 -0
- package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/README.md +75 -0
- package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/attempt-1/approved-budget.json +13 -0
- package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/attempt-1/approved-decision.json +69 -0
- package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/attempt-1/approved-manifest.json +271 -0
- package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/attempt-1/token-live-result.json +837 -0
- package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/attempt-2/approved-budget.json +13 -0
- package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/attempt-2/approved-decision.json +69 -0
- package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/attempt-2/approved-manifest.json +271 -0
- package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/attempt-2/token-live-result.json +985 -0
- package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/attempt-3/approved-budget.json +13 -0
- package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/attempt-3/approved-decision.json +69 -0
- package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/attempt-3/approved-manifest.json +271 -0
- package/docs/evaluation/token-footprint-2026-10-17/m1-pilot/attempt-3/token-live-result.json +3055 -0
- package/docs/evaluation/token-footprint-2026-10-17/measurement.json +32476 -0
- package/docs/evaluation/token-footprint-2026-10-17/prior-calibration/README.md +20 -0
- package/docs/evaluation/token-footprint-2026-10-17/prior-calibration/integrity.json +40 -0
- package/docs/evaluation/token-footprint-2026-10-17/summary.json +119 -0
- package/docs/evaluation/tool-definitions-2026-10-18/README.md +204 -0
- package/docs/evaluation/tool-definitions-2026-10-18/codex-projection/after/client-projection.json +2853 -0
- package/docs/evaluation/tool-definitions-2026-10-18/codex-projection/before/client-projection.json +2853 -0
- package/docs/evaluation/tool-definitions-2026-10-18/compare-validation.mjs +64 -0
- package/docs/evaluation/tool-definitions-2026-10-18/diff-validation.mjs +13 -0
- package/docs/evaluation/tool-definitions-2026-10-18/measure-wire.mjs +31 -0
- package/docs/evaluation/worker-system-prompt-2026-10-26/README.md +95 -0
- package/docs/evaluation/worker-system-prompt-2026-10-26/probe.mjs +155 -0
- package/docs/execution-modes.md +388 -0
- package/docs/installation.md +246 -12
- package/docs/isolation-setup.md +258 -0
- package/docs/macos-setup-design.md +2 -2
- package/docs/pi-extensions-design.md +71 -16
- package/docs/releasing.md +12 -6
- package/docs/reviews/2026-10-18-adr-0008-decision-brief.md +53 -0
- package/docs/roadmap.md +320 -9
- package/docs/session-mcp.md +5 -1
- package/docs/skills.md +23 -0
- package/docs/sprints/2026-10-15-s4-decision.md +73 -4
- package/docs/sprints/2026-10-17-token-footprint.md +130 -0
- package/docs/sprints/2026-10-18-s5-maintenance-orchestration.md +202 -0
- package/docs/sprints/2026-10-21-s6-ledger-event-bridge.md +120 -0
- package/docs/sprints/2026-10-24-s7-stabilization-live-acceptance.md +173 -0
- package/docs/sprints/2026-10-24-s8-writer-migration.md +235 -0
- package/docs/sprints/2026-10-26-s10-orchestration-reliability.md +250 -0
- package/docs/sprints/2026-10-26-s11-orchestration-gaps.md +173 -0
- package/docs/threat-model.md +37 -6
- package/docs/tool-contracts.md +91 -9
- package/package.json +17 -11
- package/scripts/isolation-acceptance.mjs +709 -0
- package/scripts/isolation-probe.cjs +213 -0
- package/skills/pi-session-implementation/SKILL.md +13 -3
- package/skills/pi-session-orchestration/SKILL.md +50 -13
- package/skills/pi-session-orchestration/references/start-errors.md +12 -0
- package/skills/pi-session-review/SKILL.md +13 -5
|
@@ -0,0 +1,638 @@
|
|
|
1
|
+
import { closeSync, constants, fstatSync, lstatSync, mkdirSync, openSync, opendirSync, readSync, statSync, unlinkSync, watch, writeSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { isAbsolute, join, relative } from "node:path";
|
|
4
|
+
import { TURN_EVENT_FILE_PATTERN, TURN_EVENT_MAX_BYTES, parseTurnEvent, writerEventsDir } from "./turn-events.js";
|
|
5
|
+
import { WRITER_NAME_PATTERN } from "./writer-state.js";
|
|
6
|
+
export const DEFAULT_BUDGET_MS = 1_800_000;
|
|
7
|
+
export const SCAN_MAX_ENTRIES_PER_DIRECTORY = 4096;
|
|
8
|
+
export const SCAN_MAX_INSTANCE_DIRECTORIES = 64;
|
|
9
|
+
export const CACHE_MAX_ENTRIES = 4096;
|
|
10
|
+
export const SCAN_MAX_ENTRIES_PER_SCAN = 2048;
|
|
11
|
+
export const SCAN_MAX_BYTES_PER_SCAN = 256 * 1024;
|
|
12
|
+
export const MIN_SCAN_GAP_MS = 25;
|
|
13
|
+
/** The scan gap once any cap was hit: a flooded namespace is read at a slow, steady rate. */
|
|
14
|
+
export const CAPPED_SCAN_GAP_MS = 1000;
|
|
15
|
+
/** How long an armed namespace may show no instance directory at all before the waiter gives up. */
|
|
16
|
+
export const NO_SPOOL_GRACE_MS = 2000;
|
|
17
|
+
export const CLAIM_MAX_AGE_MS = 24 * 60 * 60 * 1000;
|
|
18
|
+
export const CLAIM_CLEANUP_MAX_ENTRIES = 4096;
|
|
19
|
+
const WAKE_TOOL_PATTERN = /^mcp__pi-session-mcp__(pi_session_prompt|pi_turn_get)$/;
|
|
20
|
+
const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
|
|
21
|
+
const INSTANCE_DIR_PATTERN = /^inst-[0-9a-f]{16}$/;
|
|
22
|
+
const MAX_CONTENT_BLOCKS = 32;
|
|
23
|
+
export const HOST_NAMESPACE = { kind: "host" };
|
|
24
|
+
const isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
25
|
+
const uuid = (value) => (typeof value === "string" && UUID_PATTERN.test(value) ? value : undefined);
|
|
26
|
+
function parseJsonObject(text) {
|
|
27
|
+
const trimmed = text.trim();
|
|
28
|
+
if (!trimmed.startsWith("{"))
|
|
29
|
+
return undefined;
|
|
30
|
+
try {
|
|
31
|
+
const value = JSON.parse(trimmed);
|
|
32
|
+
return isObject(value) ? value : undefined;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The candidate payloads of a tool response, in the shapes Claude Code delivers MCP results: an object with
|
|
40
|
+
* `structuredContent`, a plain object, a JSON string, or an array of content blocks whose text is JSON.
|
|
41
|
+
* Only these positions are read, one level each; nothing is searched recursively, so text inside a field
|
|
42
|
+
* (an assistant answer that looks like JSON) never becomes a candidate.
|
|
43
|
+
*/
|
|
44
|
+
export function payloadCandidates(response) {
|
|
45
|
+
const out = [];
|
|
46
|
+
const fromBlocks = (blocks) => {
|
|
47
|
+
for (const block of blocks.slice(0, MAX_CONTENT_BLOCKS)) {
|
|
48
|
+
if (isObject(block) && block.type === "text" && typeof block.text === "string") {
|
|
49
|
+
const parsed = parseJsonObject(block.text);
|
|
50
|
+
if (parsed)
|
|
51
|
+
out.push(parsed);
|
|
52
|
+
}
|
|
53
|
+
else if (isObject(block))
|
|
54
|
+
out.push(block);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
if (typeof response === "string") {
|
|
58
|
+
const parsed = parseJsonObject(response);
|
|
59
|
+
if (parsed)
|
|
60
|
+
out.push(parsed);
|
|
61
|
+
}
|
|
62
|
+
else if (Array.isArray(response))
|
|
63
|
+
fromBlocks(response);
|
|
64
|
+
else if (isObject(response)) {
|
|
65
|
+
if (isObject(response.structuredContent))
|
|
66
|
+
out.push(response.structuredContent);
|
|
67
|
+
out.push(response);
|
|
68
|
+
if (Array.isArray(response.content))
|
|
69
|
+
fromBlocks(response.content);
|
|
70
|
+
}
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Pure: the (session, turn) a PostToolUse hook input asks to wait for, or `undefined`. Only
|
|
75
|
+
* `pi_session_prompt` and `pi_turn_get` of this product's servers arm, only for `ok: true` and a turn that is still
|
|
76
|
+
* `running`, and only with lowercase UUID identifiers.
|
|
77
|
+
*/
|
|
78
|
+
export function parseHookInput(text) {
|
|
79
|
+
let input;
|
|
80
|
+
try {
|
|
81
|
+
input = JSON.parse(text);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
if (!isObject(input) || typeof input.tool_name !== "string")
|
|
87
|
+
return undefined;
|
|
88
|
+
const match = WAKE_TOOL_PATTERN.exec(input.tool_name);
|
|
89
|
+
if (!match)
|
|
90
|
+
return undefined;
|
|
91
|
+
const isPrompt = match[1] === "pi_session_prompt";
|
|
92
|
+
const namespace = HOST_NAMESPACE;
|
|
93
|
+
for (const payload of payloadCandidates(input.tool_response)) {
|
|
94
|
+
if (payload.ok !== true || !isObject(payload.turn) || payload.turn.state !== "running")
|
|
95
|
+
continue;
|
|
96
|
+
const turnId = uuid(payload.turn.turnId);
|
|
97
|
+
const session = isObject(payload.session) ? payload.session : undefined;
|
|
98
|
+
const fromTurn = uuid(payload.turn.sessionId), fromSession = isPrompt ? uuid(session?.id) : undefined;
|
|
99
|
+
if (fromTurn !== undefined && fromSession !== undefined && fromTurn !== fromSession)
|
|
100
|
+
continue;
|
|
101
|
+
const sessionId = fromSession ?? fromTurn;
|
|
102
|
+
if (turnId !== undefined && sessionId !== undefined)
|
|
103
|
+
return { sessionId, turnId, namespace };
|
|
104
|
+
}
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
/** `--budget-ms <n>` or `--budget-ms=<n>`: a positive safe integer, otherwise the default. */
|
|
108
|
+
export function parseBudgetArgs(argv) {
|
|
109
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
110
|
+
const arg = argv[i];
|
|
111
|
+
const raw = arg === "--budget-ms" ? argv[i + 1] : arg.startsWith("--budget-ms=") ? arg.slice("--budget-ms=".length) : undefined;
|
|
112
|
+
if (raw === undefined)
|
|
113
|
+
continue;
|
|
114
|
+
if (!/^[0-9]{1,15}$/.test(raw))
|
|
115
|
+
return DEFAULT_BUDGET_MS;
|
|
116
|
+
const value = Number(raw);
|
|
117
|
+
return Number.isSafeInteger(value) && value > 0 ? value : DEFAULT_BUDGET_MS;
|
|
118
|
+
}
|
|
119
|
+
return DEFAULT_BUDGET_MS;
|
|
120
|
+
}
|
|
121
|
+
export const formatTerminalWake = (event) => `pi-session-mcp: turn ${event.turn} of session ${event.session} is ${event.state}. Read it once with pi_turn_get.`;
|
|
122
|
+
export const formatBudgetWake = (turnId) => `pi-session-mcp: no event for turn ${turnId} within the wait budget; it may still be running. Read it once with pi_turn_get to re-arm.`;
|
|
123
|
+
export const newSpoolCache = () => ({ files: new Map(), reads: 0 });
|
|
124
|
+
const PROC_FD_DIRECTORY = "/proc/self/fd";
|
|
125
|
+
/**
|
|
126
|
+
* Event delivery is Linux-first (ADR 0011): directories are read only through their `/proc/self/fd` handles, and
|
|
127
|
+
* there is no fallback for other platforms. Pure apart from one `stat`.
|
|
128
|
+
*/
|
|
129
|
+
export function isSupportedPlatform(platform = process.platform, procFd = PROC_FD_DIRECTORY) {
|
|
130
|
+
if (platform !== "linux")
|
|
131
|
+
return false;
|
|
132
|
+
try {
|
|
133
|
+
return statSync(procFd).isDirectory();
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/** The path through which entries of `dir` are read: its handle. */
|
|
140
|
+
const base = (dir) => `${PROC_FD_DIRECTORY}/${dir.fd}`;
|
|
141
|
+
const entryPath = (dir, name) => join(base(dir), name);
|
|
142
|
+
/**
|
|
143
|
+
* Opens one directory without following a link at its last component and checks, on the handle, that it is a
|
|
144
|
+
* directory of this user. Below a parent it is opened through the parent's handle.
|
|
145
|
+
*/
|
|
146
|
+
function openDir(parent, nameOrRoot) {
|
|
147
|
+
let fd;
|
|
148
|
+
try {
|
|
149
|
+
const path = parent === undefined ? nameOrRoot : join(parent.path, nameOrRoot);
|
|
150
|
+
const target = parent === undefined ? path : entryPath(parent, nameOrRoot);
|
|
151
|
+
fd = openSync(target, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW);
|
|
152
|
+
const stat = fstatSync(fd);
|
|
153
|
+
const uid = typeof process.getuid === "function" ? process.getuid() : undefined;
|
|
154
|
+
if (!stat.isDirectory() || (uid !== undefined && stat.uid !== uid)) {
|
|
155
|
+
closeSync(fd);
|
|
156
|
+
return undefined;
|
|
157
|
+
}
|
|
158
|
+
return { fd, path };
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
if (fd !== undefined)
|
|
162
|
+
try {
|
|
163
|
+
closeSync(fd);
|
|
164
|
+
}
|
|
165
|
+
catch { /* closed */ }
|
|
166
|
+
return undefined;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/** Entry names of a directory, at most `cap`; `truncated` tells that more entries exist. */
|
|
170
|
+
function listNames(path, cap) {
|
|
171
|
+
const names = [];
|
|
172
|
+
let handle;
|
|
173
|
+
try {
|
|
174
|
+
handle = opendirSync(path);
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
return { names, truncated: false };
|
|
178
|
+
}
|
|
179
|
+
let truncated = false;
|
|
180
|
+
try {
|
|
181
|
+
while (names.length < cap) {
|
|
182
|
+
const entry = handle.readSync();
|
|
183
|
+
if (entry === null)
|
|
184
|
+
break;
|
|
185
|
+
names.push(entry.name);
|
|
186
|
+
}
|
|
187
|
+
if (names.length >= cap && handle.readSync() !== null)
|
|
188
|
+
truncated = true;
|
|
189
|
+
}
|
|
190
|
+
catch { /* partial listing */ }
|
|
191
|
+
finally {
|
|
192
|
+
try {
|
|
193
|
+
handle.closeSync();
|
|
194
|
+
}
|
|
195
|
+
catch { /* closed */ }
|
|
196
|
+
}
|
|
197
|
+
return { names, truncated };
|
|
198
|
+
}
|
|
199
|
+
/** Reads one regular file of at most `TURN_EVENT_MAX_BYTES` without following a link; `undefined` for anything else. */
|
|
200
|
+
function readEventText(path) {
|
|
201
|
+
let fd;
|
|
202
|
+
try {
|
|
203
|
+
fd = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
204
|
+
const stat = fstatSync(fd);
|
|
205
|
+
if (!stat.isFile() || stat.size > TURN_EVENT_MAX_BYTES)
|
|
206
|
+
return undefined;
|
|
207
|
+
const buffer = Buffer.alloc(TURN_EVENT_MAX_BYTES + 1);
|
|
208
|
+
let length = 0;
|
|
209
|
+
for (;;) {
|
|
210
|
+
const count = readSync(fd, buffer, length, buffer.length - length, null);
|
|
211
|
+
if (count === 0)
|
|
212
|
+
break;
|
|
213
|
+
length += count;
|
|
214
|
+
if (length > TURN_EVENT_MAX_BYTES)
|
|
215
|
+
return undefined;
|
|
216
|
+
}
|
|
217
|
+
return buffer.toString("utf8", 0, length);
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return undefined;
|
|
221
|
+
}
|
|
222
|
+
finally {
|
|
223
|
+
if (fd !== undefined)
|
|
224
|
+
try {
|
|
225
|
+
closeSync(fd);
|
|
226
|
+
}
|
|
227
|
+
catch { /* closed */ }
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/** Lists a directory within the per-directory and per-scan caps; marks the scan as capped when either bites. */
|
|
231
|
+
function listWithin(path, budget) {
|
|
232
|
+
const cap = Math.min(budget.entriesCap, budget.left);
|
|
233
|
+
if (cap <= 0) {
|
|
234
|
+
budget.capped = true;
|
|
235
|
+
return [];
|
|
236
|
+
}
|
|
237
|
+
const { names, truncated } = listNames(path, cap);
|
|
238
|
+
budget.left -= names.length;
|
|
239
|
+
if (truncated)
|
|
240
|
+
budget.capped = true;
|
|
241
|
+
return names;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* The `inst-*` children of a directory, newest first, at most `cap`; only real directories count. Entries are read
|
|
245
|
+
* (up to the per-directory cap) without spending the scan budget on names that are not `inst-*`, so a worker that
|
|
246
|
+
* floods its spool with junk names cannot hide the instance directory from the first `entriesCap` names that way.
|
|
247
|
+
* Only the `lstat` of a candidate is charged.
|
|
248
|
+
*/
|
|
249
|
+
function newestInstanceDirectories(dir, budget, cap) {
|
|
250
|
+
const found = [];
|
|
251
|
+
const { names, truncated } = listNames(base(dir), budget.entriesCap);
|
|
252
|
+
if (truncated)
|
|
253
|
+
budget.capped = true;
|
|
254
|
+
for (const name of names) {
|
|
255
|
+
if (!INSTANCE_DIR_PATTERN.test(name))
|
|
256
|
+
continue;
|
|
257
|
+
if (budget.left <= 0) {
|
|
258
|
+
budget.capped = true;
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
261
|
+
budget.left -= 1;
|
|
262
|
+
try {
|
|
263
|
+
const stat = lstatSync(entryPath(dir, name));
|
|
264
|
+
if (stat.isDirectory())
|
|
265
|
+
found.push({ name, mtimeMs: stat.mtimeMs });
|
|
266
|
+
}
|
|
267
|
+
catch { /* vanished */ }
|
|
268
|
+
}
|
|
269
|
+
found.sort((a, b) => b.mtimeMs - a.mtimeMs || (a.name < b.name ? -1 : 1));
|
|
270
|
+
if (found.length > cap)
|
|
271
|
+
budget.capped = true;
|
|
272
|
+
return { names: found.slice(0, cap).map((entry) => entry.name), count: found.length };
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* The valid events of one namespace, ordered by time then sequence: the top-level `inst-*` directories of the events
|
|
276
|
+
* root for the host, the `inst-*` directories of `writerEventsDir(home, name)` for a writer (`root` is not used then).
|
|
277
|
+
* Nothing else is listed. Every directory is opened `O_NOFOLLOW`, checked on its handle and read through it; no link is
|
|
278
|
+
* followed. An event file must also sit in the directory of its own instance. `cache` is rebuilt per scan from the files
|
|
279
|
+
* seen in it, results that are not events included, keyed by path, inode, size, mtime and ctime; it never holds more
|
|
280
|
+
* than `cacheEntries`. One scan lists and `lstat`s at most `entriesPerScan` names and reads at most `bytesPerScan`
|
|
281
|
+
* bytes over all directories. With `retain`, only events of that session and turn are kept, in the result and the cache.
|
|
282
|
+
*/
|
|
283
|
+
export function scanTurnEvents(root, namespace = HOST_NAMESPACE, cache = newSpoolCache(), limits = {}) {
|
|
284
|
+
const instanceCap = limits.instanceDirectories ?? SCAN_MAX_INSTANCE_DIRECTORIES, cacheCap = limits.cacheEntries ?? CACHE_MAX_ENTRIES;
|
|
285
|
+
const budget = {
|
|
286
|
+
left: limits.entriesPerScan ?? SCAN_MAX_ENTRIES_PER_SCAN, bytesLeft: limits.bytesPerScan ?? SCAN_MAX_BYTES_PER_SCAN, capped: false,
|
|
287
|
+
entriesCap: limits.entriesPerDirectory ?? SCAN_MAX_ENTRIES_PER_DIRECTORY,
|
|
288
|
+
};
|
|
289
|
+
const events = [], directories = [], opened = [];
|
|
290
|
+
const seen = new Map();
|
|
291
|
+
let namespaceFound = false, instanceDirectoryCount = 0;
|
|
292
|
+
const retain = limits.retain;
|
|
293
|
+
const wanted = (event) => retain === undefined || (event.kind === "turn_terminal" && event.session === retain.sessionId && event.turn === retain.turnId);
|
|
294
|
+
try {
|
|
295
|
+
if (!isSupportedPlatform())
|
|
296
|
+
return { events, directories, namespaceFound, instanceDirectoryCount, capped: false };
|
|
297
|
+
const home = limits.home ?? homedir();
|
|
298
|
+
const spool = namespace.kind === "host" ? root : (isAbsolute(home) && !home.includes("\0") ? writerEventsDir(home, namespace.name) : undefined);
|
|
299
|
+
if (spool === undefined)
|
|
300
|
+
return { events, directories, namespaceFound, instanceDirectoryCount, capped: false };
|
|
301
|
+
const space = openDir(undefined, spool);
|
|
302
|
+
if (space === undefined)
|
|
303
|
+
return { events, directories, namespaceFound, instanceDirectoryCount, capped: false };
|
|
304
|
+
opened.push(space);
|
|
305
|
+
namespaceFound = true;
|
|
306
|
+
directories.push(space.path);
|
|
307
|
+
const instances = newestInstanceDirectories(space, budget, instanceCap);
|
|
308
|
+
instanceDirectoryCount = instances.count;
|
|
309
|
+
for (const name of instances.names) {
|
|
310
|
+
const dir = openDir(space, name);
|
|
311
|
+
if (dir === undefined)
|
|
312
|
+
continue;
|
|
313
|
+
opened.push(dir);
|
|
314
|
+
directories.push(dir.path);
|
|
315
|
+
const found = [];
|
|
316
|
+
for (const file of listWithin(base(dir), budget)) {
|
|
317
|
+
if (!TURN_EVENT_FILE_PATTERN.test(file))
|
|
318
|
+
continue;
|
|
319
|
+
if (budget.left <= 0) {
|
|
320
|
+
budget.capped = true;
|
|
321
|
+
break;
|
|
322
|
+
}
|
|
323
|
+
budget.left -= 1;
|
|
324
|
+
const path = entryPath(dir, file);
|
|
325
|
+
let stat;
|
|
326
|
+
try {
|
|
327
|
+
stat = lstatSync(path);
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
continue;
|
|
331
|
+
}
|
|
332
|
+
const key = `${dir.path}/${file}\0${stat.ino}\0${stat.size}\0${stat.mtimeMs}\0${stat.ctimeMs}`;
|
|
333
|
+
let event = seen.get(key) ?? cache.files.get(key);
|
|
334
|
+
if (event === undefined) {
|
|
335
|
+
if (!stat.isFile() || stat.size > TURN_EVENT_MAX_BYTES)
|
|
336
|
+
event = null; // never opened
|
|
337
|
+
else if (stat.size > budget.bytesLeft) {
|
|
338
|
+
budget.capped = true;
|
|
339
|
+
continue;
|
|
340
|
+
} // read in a later scan; the cache keeps what was done
|
|
341
|
+
else {
|
|
342
|
+
budget.bytesLeft -= stat.size;
|
|
343
|
+
cache.reads += 1;
|
|
344
|
+
const text = readEventText(path);
|
|
345
|
+
const parsed = text === undefined ? undefined : parseTurnEvent(text);
|
|
346
|
+
event = parsed !== undefined && wanted(parsed) ? parsed : null; // an event of another turn is kept as a miss, not as data
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
if (seen.size < cacheCap)
|
|
350
|
+
seen.set(key, event);
|
|
351
|
+
else
|
|
352
|
+
budget.capped = true;
|
|
353
|
+
if (event !== null && event.instance === name)
|
|
354
|
+
found.push(event);
|
|
355
|
+
}
|
|
356
|
+
events.push(...found);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
finally {
|
|
360
|
+
for (const dir of opened)
|
|
361
|
+
try {
|
|
362
|
+
closeSync(dir.fd);
|
|
363
|
+
}
|
|
364
|
+
catch { /* closed */ }
|
|
365
|
+
cache.files = seen; // only what this scan saw: a replaced or removed file leaves the cache
|
|
366
|
+
}
|
|
367
|
+
events.sort((a, b) => Date.parse(a.at) - Date.parse(b.at) || a.seq - b.seq);
|
|
368
|
+
return { events, directories, namespaceFound, instanceDirectoryCount, capped: budget.capped };
|
|
369
|
+
}
|
|
370
|
+
// ---- claims
|
|
371
|
+
/** Creates the claims directory (0700) and checks it is a real directory of this user that no group or other bit applies to. */
|
|
372
|
+
export function prepareClaimsDir(claims) {
|
|
373
|
+
mkdirSync(claims, { recursive: true, mode: 0o700 });
|
|
374
|
+
const stat = lstatSync(claims);
|
|
375
|
+
const uid = typeof process.getuid === "function" ? process.getuid() : undefined;
|
|
376
|
+
if (!stat.isDirectory() || (uid !== undefined && stat.uid !== uid) || (stat.mode & 0o077) !== 0)
|
|
377
|
+
throw Object.assign(new Error("claims directory unsafe"), { code: "EUNSAFE" });
|
|
378
|
+
}
|
|
379
|
+
/** `host-<instance>-<seq>` or `writer-<name>-wN-<instance>-<seq>`: the namespace is part of the key, and every part is validated. */
|
|
380
|
+
export function claimKey(namespace, event) {
|
|
381
|
+
if (!INSTANCE_DIR_PATTERN.test(event.instance) || !Number.isSafeInteger(event.seq) || event.seq < 1)
|
|
382
|
+
throw Object.assign(new Error("claim key invalid"), { code: "EKEY" });
|
|
383
|
+
if (namespace.kind === "host")
|
|
384
|
+
return `host-${event.instance}-${event.seq}`;
|
|
385
|
+
if (!WRITER_NAME_PATTERN.test(namespace.name))
|
|
386
|
+
throw Object.assign(new Error("claim key invalid"), { code: "EKEY" });
|
|
387
|
+
return `writer-${namespace.name}-${event.instance}-${event.seq}`;
|
|
388
|
+
}
|
|
389
|
+
/** Exactly one waiter wins an event: exclusive create of `<claims>/<claimKey>`. Returns the claim path, or `undefined` when another waiter holds it. */
|
|
390
|
+
export function tryClaim(claims, event, namespace) {
|
|
391
|
+
const key = claimKey(namespace, event);
|
|
392
|
+
prepareClaimsDir(claims);
|
|
393
|
+
const path = join(claims, key);
|
|
394
|
+
try {
|
|
395
|
+
closeSync(openSync(path, "wx", 0o600));
|
|
396
|
+
return path;
|
|
397
|
+
}
|
|
398
|
+
catch (error) {
|
|
399
|
+
if (error.code === "EEXIST")
|
|
400
|
+
return undefined;
|
|
401
|
+
throw error;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
export function releaseClaim(path) {
|
|
405
|
+
if (path === undefined)
|
|
406
|
+
return;
|
|
407
|
+
try {
|
|
408
|
+
unlinkSync(path);
|
|
409
|
+
}
|
|
410
|
+
catch { /* already gone */ }
|
|
411
|
+
}
|
|
412
|
+
/** Best effort: removes regular claim files older than `maxAgeMs`, looking at a bounded number of entries. Returns the removed count. */
|
|
413
|
+
export function cleanupOldClaims(claims, now = Date.now(), maxAgeMs = CLAIM_MAX_AGE_MS, cap = CLAIM_CLEANUP_MAX_ENTRIES) {
|
|
414
|
+
let removed = 0;
|
|
415
|
+
for (const name of listNames(claims, cap).names) {
|
|
416
|
+
const path = join(claims, name);
|
|
417
|
+
try {
|
|
418
|
+
const stat = lstatSync(path);
|
|
419
|
+
if (!stat.isFile() || now - stat.mtimeMs <= maxAgeMs)
|
|
420
|
+
continue;
|
|
421
|
+
unlinkSync(path);
|
|
422
|
+
removed += 1;
|
|
423
|
+
}
|
|
424
|
+
catch { /* best effort */ }
|
|
425
|
+
}
|
|
426
|
+
return removed;
|
|
427
|
+
}
|
|
428
|
+
// ---- per-turn waiter lock
|
|
429
|
+
/** `wait-host-<session>-<turn>` or `wait-writer-<name>-<session>-<turn>`; every part is validated. */
|
|
430
|
+
export function waiterLockName(namespace, sessionId, turnId) {
|
|
431
|
+
if (!UUID_PATTERN.test(sessionId) || !UUID_PATTERN.test(turnId) || (namespace.kind === "writer" && !WRITER_NAME_PATTERN.test(namespace.name)))
|
|
432
|
+
throw Object.assign(new Error("lock name invalid"), { code: "EKEY" });
|
|
433
|
+
return namespace.kind === "host" ? `wait-host-${sessionId}-${turnId}` : `wait-writer-${namespace.name}-${sessionId}-${turnId}`;
|
|
434
|
+
}
|
|
435
|
+
export const WAITER_LOCK_GRACE_MS = 60_000;
|
|
436
|
+
const processAlive = (pid) => {
|
|
437
|
+
try {
|
|
438
|
+
process.kill(pid, 0);
|
|
439
|
+
return true;
|
|
440
|
+
}
|
|
441
|
+
catch (error) {
|
|
442
|
+
return error.code === "EPERM";
|
|
443
|
+
}
|
|
444
|
+
};
|
|
445
|
+
function readLockPid(path) {
|
|
446
|
+
let fd;
|
|
447
|
+
try {
|
|
448
|
+
fd = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
449
|
+
const stat = fstatSync(fd);
|
|
450
|
+
if (!stat.isFile())
|
|
451
|
+
return { pid: undefined, ageMs: Number.POSITIVE_INFINITY };
|
|
452
|
+
const buffer = Buffer.alloc(32);
|
|
453
|
+
const length = readSync(fd, buffer, 0, buffer.length, null);
|
|
454
|
+
const text = buffer.toString("utf8", 0, length).trim();
|
|
455
|
+
const pid = /^[0-9]{1,10}$/.test(text) ? Number(text) : undefined;
|
|
456
|
+
return { pid: pid !== undefined && pid > 0 ? pid : undefined, ageMs: Date.now() - stat.mtimeMs };
|
|
457
|
+
}
|
|
458
|
+
catch {
|
|
459
|
+
return undefined;
|
|
460
|
+
}
|
|
461
|
+
finally {
|
|
462
|
+
if (fd !== undefined)
|
|
463
|
+
try {
|
|
464
|
+
closeSync(fd);
|
|
465
|
+
}
|
|
466
|
+
catch { /* closed */ }
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* At most one waiter per turn: `<claims>/wait-…` is created exclusively and holds the owner's pid. A lock whose owner
|
|
471
|
+
* is alive (and younger than `maxAgeMs`, which guards against a reused pid) means another waiter already covers this
|
|
472
|
+
* turn: returns `undefined`. A stale lock (dead pid, too old, unreadable content) is replaced. Returns the lock path.
|
|
473
|
+
*/
|
|
474
|
+
export function acquireWaiterLock(claims, namespace, sessionId, turnId, options = {}) {
|
|
475
|
+
const path = join(claims, waiterLockName(namespace, sessionId, turnId));
|
|
476
|
+
const pid = options.pid ?? process.pid, isAlive = options.isAlive ?? processAlive, maxAgeMs = options.maxAgeMs ?? DEFAULT_BUDGET_MS + WAITER_LOCK_GRACE_MS;
|
|
477
|
+
for (let attempt = 0; attempt < 3; attempt += 1) {
|
|
478
|
+
try {
|
|
479
|
+
const fd = openSync(path, "wx", 0o600);
|
|
480
|
+
try {
|
|
481
|
+
writeSync(fd, String(pid));
|
|
482
|
+
}
|
|
483
|
+
finally {
|
|
484
|
+
closeSync(fd);
|
|
485
|
+
}
|
|
486
|
+
return path;
|
|
487
|
+
}
|
|
488
|
+
catch (error) {
|
|
489
|
+
if (error.code !== "EEXIST")
|
|
490
|
+
throw error;
|
|
491
|
+
}
|
|
492
|
+
const held = readLockPid(path);
|
|
493
|
+
if (held === undefined)
|
|
494
|
+
continue; // vanished meanwhile: try to create it again
|
|
495
|
+
// A lock that is still being written (no pid yet) is young; it is stale only once it has been unreadable for a while.
|
|
496
|
+
const live = held.pid !== undefined ? isAlive(held.pid) && held.ageMs <= maxAgeMs : held.ageMs < 2000;
|
|
497
|
+
if (live)
|
|
498
|
+
return undefined;
|
|
499
|
+
try {
|
|
500
|
+
unlinkSync(path);
|
|
501
|
+
}
|
|
502
|
+
catch { /* replaced by someone else: the next attempt decides */ }
|
|
503
|
+
}
|
|
504
|
+
return undefined;
|
|
505
|
+
}
|
|
506
|
+
/** Removes the lock only if it still names `pid`, so a replacement lock of another waiter is never deleted. */
|
|
507
|
+
export function releaseWaiterLock(path, pid = process.pid) {
|
|
508
|
+
if (path === undefined)
|
|
509
|
+
return;
|
|
510
|
+
const held = readLockPid(path);
|
|
511
|
+
if (held === undefined || held.pid !== pid)
|
|
512
|
+
return;
|
|
513
|
+
try {
|
|
514
|
+
unlinkSync(path);
|
|
515
|
+
}
|
|
516
|
+
catch { /* already gone */ }
|
|
517
|
+
}
|
|
518
|
+
/** Claims must never live where a container writer can write. */
|
|
519
|
+
export function isInside(parent, child) {
|
|
520
|
+
const rel = relative(parent, child);
|
|
521
|
+
return rel === "" || (!rel.startsWith("..") && !isAbsolute(rel));
|
|
522
|
+
}
|
|
523
|
+
/** The runtime directory is full: claims and locks cannot be written, but a budget wake needs neither. */
|
|
524
|
+
export function isNoSpace(error) {
|
|
525
|
+
const code = error?.code;
|
|
526
|
+
return code === "ENOSPC" || code === "EDQUOT";
|
|
527
|
+
}
|
|
528
|
+
function errorCode(error) {
|
|
529
|
+
const code = error?.code;
|
|
530
|
+
return typeof code === "string" && /^[A-Z0-9_]{1,20}$/.test(code) ? { code } : {};
|
|
531
|
+
}
|
|
532
|
+
/** Waits for the first `turn_terminal` event of one turn, claims it, and resolves with the wake or the reason to stay silent. */
|
|
533
|
+
export async function waitForTurn(options) {
|
|
534
|
+
const writerSpool = options.namespace.kind === "writer" ? writerEventsDir(options.home ?? homedir(), options.namespace.name) : undefined;
|
|
535
|
+
if (isInside(options.eventsRoot, options.claimsDir) || (writerSpool !== undefined && isInside(writerSpool, options.claimsDir)))
|
|
536
|
+
return { action: "silent", reason: "claims_unsafe" };
|
|
537
|
+
const now = options.now ?? Date.now, pollMs = options.pollMs ?? 500, parentCheckMs = options.parentCheckMs ?? 1000;
|
|
538
|
+
const deadline = now() + options.budgetMs;
|
|
539
|
+
const cache = newSpoolCache();
|
|
540
|
+
const watchers = new Map();
|
|
541
|
+
let poke;
|
|
542
|
+
const nudge = () => { poke?.(); };
|
|
543
|
+
const watchDir = (dir) => {
|
|
544
|
+
if (watchers.has(dir) || watchers.size >= (options.limits?.instanceDirectories ?? SCAN_MAX_INSTANCE_DIRECTORIES) + 3)
|
|
545
|
+
return;
|
|
546
|
+
try {
|
|
547
|
+
const watcher = watch(dir, nudge);
|
|
548
|
+
watcher.on("error", () => undefined);
|
|
549
|
+
watchers.set(dir, watcher);
|
|
550
|
+
}
|
|
551
|
+
catch { /* polling is the fallback */ }
|
|
552
|
+
};
|
|
553
|
+
let nextParentCheck = now() + parentCheckMs;
|
|
554
|
+
const graceDeadline = now() + (options.graceMs ?? NO_SPOOL_GRACE_MS);
|
|
555
|
+
let lastScan = Number.NEGATIVE_INFINITY, scanGapMs = MIN_SCAN_GAP_MS, spoolSeen = false;
|
|
556
|
+
try {
|
|
557
|
+
for (;;) {
|
|
558
|
+
if (options.signal?.aborted)
|
|
559
|
+
return { action: "silent", reason: "aborted" };
|
|
560
|
+
// A worker that churns its own directory must not make this loop spin: scans are at least a short gap apart.
|
|
561
|
+
const gap = scanGapMs - (now() - lastScan);
|
|
562
|
+
if (gap > 0)
|
|
563
|
+
await (options.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms))))(gap);
|
|
564
|
+
lastScan = now();
|
|
565
|
+
if (options.namespace.kind === "host")
|
|
566
|
+
watchDir(options.eventsRoot);
|
|
567
|
+
const { events, directories, namespaceFound, instanceDirectoryCount, capped } = scanTurnEvents(options.eventsRoot, options.namespace, cache, { ...options.limits, retain: { sessionId: options.sessionId, turnId: options.turnId }, ...(options.home === undefined ? {} : { home: options.home }) });
|
|
568
|
+
if (capped)
|
|
569
|
+
scanGapMs = CAPPED_SCAN_GAP_MS; // a flooded namespace is read slowly for the rest of the run
|
|
570
|
+
// No spool is only concluded from a complete listing: a capped one (a flooded namespace) may still hide a live instance directory.
|
|
571
|
+
if (namespaceFound && (instanceDirectoryCount > 0 || capped))
|
|
572
|
+
spoolSeen = true;
|
|
573
|
+
for (const dir of directories)
|
|
574
|
+
watchDir(dir);
|
|
575
|
+
const hit = events.find((event) => event.kind === "turn_terminal" && event.session === options.sessionId && event.turn === options.turnId);
|
|
576
|
+
// `close` ends the turn because the controller closed its session (or the server shut down): the session is gone, so
|
|
577
|
+
// a woken controller could only read unknown_session. Nothing to report, nothing to claim.
|
|
578
|
+
if (hit !== undefined && hit.via === "close")
|
|
579
|
+
return { action: "silent", reason: "closed" };
|
|
580
|
+
if (hit !== undefined) {
|
|
581
|
+
let claim;
|
|
582
|
+
let full = false;
|
|
583
|
+
try {
|
|
584
|
+
claim = tryClaim(options.claimsDir, hit, options.namespace);
|
|
585
|
+
}
|
|
586
|
+
catch (error) {
|
|
587
|
+
// A full runtime directory must not swallow the wake: keep waiting, the budget wake needs no claim.
|
|
588
|
+
if (isNoSpace(error))
|
|
589
|
+
full = true;
|
|
590
|
+
else
|
|
591
|
+
return { action: "silent", reason: "claim_error", ...errorCode(error) };
|
|
592
|
+
}
|
|
593
|
+
if (!full) {
|
|
594
|
+
if (claim === undefined)
|
|
595
|
+
return { action: "silent", reason: "lost_claim" };
|
|
596
|
+
options.onClaim?.(claim);
|
|
597
|
+
return { action: "wake", reason: "terminal", message: formatTerminalWake(hit), claimPath: claim };
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
const t = now();
|
|
601
|
+
if (t >= nextParentCheck) {
|
|
602
|
+
nextParentCheck = t + parentCheckMs;
|
|
603
|
+
if (options.isParentAlive && !options.isParentAlive())
|
|
604
|
+
return { action: "silent", reason: "parent_gone" };
|
|
605
|
+
}
|
|
606
|
+
// No server writes events here (delivery off, writer without a spool, server gone): nothing can ever arrive.
|
|
607
|
+
if (!spoolSeen && t >= graceDeadline && t < deadline)
|
|
608
|
+
return { action: "silent", reason: "no_spool" };
|
|
609
|
+
if (t >= deadline)
|
|
610
|
+
return { action: "wake", reason: "budget", message: formatBudgetWake(options.turnId) };
|
|
611
|
+
await new Promise((resolve) => {
|
|
612
|
+
const timer = setTimeout(done, Math.max(1, Math.min(pollMs, deadline - t, nextParentCheck - t)));
|
|
613
|
+
const abort = () => done();
|
|
614
|
+
options.signal?.addEventListener("abort", abort, { once: true });
|
|
615
|
+
function done() { clearTimeout(timer); options.signal?.removeEventListener("abort", abort); poke = undefined; resolve(); }
|
|
616
|
+
poke = done;
|
|
617
|
+
});
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
finally {
|
|
621
|
+
for (const watcher of watchers.values())
|
|
622
|
+
watcher.close();
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
/** The original parent must still be the parent of this process and must still exist. */
|
|
626
|
+
export function parentAliveCheck(original = process.ppid) {
|
|
627
|
+
return () => {
|
|
628
|
+
if (process.ppid !== original)
|
|
629
|
+
return false;
|
|
630
|
+
try {
|
|
631
|
+
process.kill(original, 0);
|
|
632
|
+
return true;
|
|
633
|
+
}
|
|
634
|
+
catch (error) {
|
|
635
|
+
return error.code === "EPERM";
|
|
636
|
+
}
|
|
637
|
+
};
|
|
638
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/** Test seams: the platform to judge, the `/proc/self/fd` directory to look for, and how the process ends. */
|
|
3
|
+
export interface WakeMainDependencies {
|
|
4
|
+
readonly platform?: string;
|
|
5
|
+
readonly procFd?: string;
|
|
6
|
+
readonly exit?: (code: number) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare function main(argv?: readonly string[], env?: NodeJS.ProcessEnv, dependencies?: WakeMainDependencies): Promise<void>;
|