deadbyte-mcp 0.15.58 → 0.15.60
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/MANIFEST.SHA256 +26 -23
- package/PROVENANCE.json +8 -8
- package/README.txt +18 -18
- package/RELEASE.json +7 -7
- package/SBOM.cdx.json +2 -2
- package/TEST-MATRIX.json +1 -1
- package/bridge/package.json +1 -1
- package/package.json +1 -1
- package/scripts/bootstrap-uac-migration-r153.ps1 +15 -5
- package/scripts/deploy-r48.mjs +9 -1
- package/scripts/issue-uac-migration-r153.mjs +1 -1
- package/scripts/r153-prepublish-identity.mjs +3 -3
- package/scripts/request-uac-migration-r153.ps1 +12 -8
- package/src/activation-lock-r65.mjs +37 -1
- package/src/clean-activation-recovery-r153.mjs +1 -1
- package/src/deadbyte-cli.mjs +14 -7
- package/src/uac-approval-contract-r153.mjs +1 -1
- package/src/version.mjs +1 -1
- package/test/r130-release-security-contract.test.mjs +6 -6
- package/test/r132-release-identity.test.mjs +6 -6
- package/test/r153-clean-activation-recovery.test.mjs +2 -2
- package/test/r153-r60-host-repin-e2e-contract.test.mjs +30 -0
- package/test/r153-r65-signed-precondition-recovery.test.mjs +58 -0
- package/test/r153-staging-leaf-acl.test.mjs +47 -0
- package/test/r153-uac-approval-contract.test.mjs +2 -2
- package/test/r153-uac-launch-parameter-contract.test.mjs +3 -2
- package/test/r59-tool-surface-compat.test.mjs +1 -1
package/MANIFEST.SHA256
CHANGED
|
@@ -30,7 +30,7 @@ c814771dddac8bfb184250b868ddb6ab9f5e0e43613c04c3ed8abe09324ec4db bin/deadbyte-n
|
|
|
30
30
|
daf9cfb371bee88cafbf5597eaa507fec504dbe0b0ddd40d0c3c2e02817f49e4 bin/deadbyte-process-host.exe
|
|
31
31
|
b55d2c4490dfb875d40f29a69df2addc5d579991cb7d094674c04d369dfcfac3 bin/deadbyte-tunnel-host.exe
|
|
32
32
|
f0ce7acb1e41325cef8b6789f95bd78b6a6107423773eace57a12b49faa55095 bin/WORKER-REGISTRY.txt
|
|
33
|
-
|
|
33
|
+
f5ccdaca2662a03dbf2aca4e00e3ba3ee6866f3db93371936115f85d6ad5c754 bridge/package.json
|
|
34
34
|
f99413d82f84c808f52d5b8696c190a9142dd08f517f5ec3e442f0769402d189 bridge/src/bridge-health-r59.mjs
|
|
35
35
|
fa0dcc4cde9c03e978c9f9dd24b62afa83f49bdada1f42ead544a9a17edd332f bridge/src/bridge.mjs
|
|
36
36
|
471f41c84c5b339cd81a708a4f36d4470e614946817ad2f9fca295dde2c83fb6 bridge/src/canonical-json-r60.mjs
|
|
@@ -1393,8 +1393,8 @@ db605a698f917c4006462596e6526fe6a9c6eff9b8409e8472fe545d4b70027c node_modules/z
|
|
|
1393
1393
|
f67a25ded944912bd4621b68df17c7c70a52aae117278c076c0aabbc32a3abba node_modules/zod/v4/mini/schemas.d.ts
|
|
1394
1394
|
51b3a7869df2d3a1bd98acb9d5b6a61bbccc7653d7a3d8fca7f0e0db7e84e284 node_modules/zod/v4/mini/schemas.js
|
|
1395
1395
|
3e3125b5a537a24c3632c1c5c09640ce7bcb3935901b127ad8ae3c37a27f133f node_modules/zod/v4/package.json
|
|
1396
|
-
|
|
1397
|
-
|
|
1396
|
+
7ce943961080ef5036c7bacd0561ee6bfd5e4d1e7f31aef68cd8fb631e0c4fac package.json
|
|
1397
|
+
57d2619e30cc63924ad3b433d4760e16323de898fdcccbbb336009ce0c1482c9 PROVENANCE.json
|
|
1398
1398
|
27ca0f3c9ee3a1b6374a9c8dd98008decdd0c7659c7a569c70ad7b9734c74655 R34-BASELINE.json
|
|
1399
1399
|
0b7ec5ee347ddfa6cca59740fc7a8fe3fc5d51406265bb12189e82fa106319d2 R41-PARENT.json
|
|
1400
1400
|
bd2a789b0aab5663f0d208af2ca8e4ec98179bc8c7b57e70a962d4e06a3dcfc4 R42-PARENT.json
|
|
@@ -1403,9 +1403,9 @@ f932ef78b7a72b1bb0d7aedb5fe42fbb9951c2492eb528b72442f46ddff81a6c R44-DONORS.jso
|
|
|
1403
1403
|
731b4c559fc0d25dea701e4474f02400b27e8e3f4cac9f230d5214497d4490a9 R44-PARENT.json
|
|
1404
1404
|
d33ec5d167dd44800ba4e68372b08db43deb8d01df2ef71dd435ff004ac66c8b R45-PARENT.json
|
|
1405
1405
|
3dc607603fea511e2f428e9546a875ab7e38b6a0bbd5e803e4510de082f30804 R49-PARENT.json
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1406
|
+
218348214070c7c04f7b462b4e71824248c75ee09602a97026c550552eb36341 README.txt
|
|
1407
|
+
27668a6a9e578af5d64232bd6e599f89d18fabbe1290c7125d75b11b71651bbd RELEASE.json
|
|
1408
|
+
0df08a9ad4f7c294379f91c50e4dc788cd6208e13cd5484bf4d527dd162e5a27 SBOM.cdx.json
|
|
1409
1409
|
7c86062c4f69db3179a129d65945ccfab1b1c1c5bcc29b91383eac097d50f2aa scripts/activate-skill-creator-1.1.1.mjs
|
|
1410
1410
|
bd138fe5a64088e8e1a7a5bf6104c5b17317bdc8cf3ad8191ea00ed82ace7d9b scripts/agent-eval-r42.mjs
|
|
1411
1411
|
8d90256a6863f3bbbff02e95cb12389fc6f9e8dbcb77bf1c20c902de371425e8 scripts/archive-source-zips.mjs
|
|
@@ -1413,7 +1413,7 @@ bd138fe5a64088e8e1a7a5bf6104c5b17317bdc8cf3ad8191ea00ed82ace7d9b scripts/agent-
|
|
|
1413
1413
|
34f9318b6f4afb29948fdc5ab973edca4dfc4fbd63c9a5105478b5e95812dabf scripts/autonomous-build.ps1
|
|
1414
1414
|
075acd7616740135973497d676dcd0431f0437bdba87e4eedba4751cb148ff02 scripts/autonomous-tests.ps1
|
|
1415
1415
|
f43c5e5064fb5863ce51aca156434d8b7c493ee954b8846f41625cd7130936d8 scripts/benchmark-l0-r71.mjs
|
|
1416
|
-
|
|
1416
|
+
8d2ca9595df68fc2947c5f501e1c55da7853d9f97a1f37732b011cf807f0b45f scripts/bootstrap-uac-migration-r153.ps1
|
|
1417
1417
|
5d8ce87ffbe55f4737ba1ee2fa6772a8157bfa92afec9101909c0f9bead27fcb scripts/bridge-benchmark-r58.mjs
|
|
1418
1418
|
7c3f2a157f64aef9e605b5fe84d75fbdd88312f09d0ad89effb33de82aa39ab8 scripts/build-advanced-pcb-skill.mjs
|
|
1419
1419
|
70bccc3572de7e26ac91154b9d87185feab0c2dbfc4cbd40f89660e5769f53b0 scripts/build-combined-skill.mjs
|
|
@@ -1447,7 +1447,7 @@ a64b6779eff80d68d90d238dee7f2feda5ada3c5c59bcaeae2ab7812bd28404e scripts/deferr
|
|
|
1447
1447
|
5af5953d67a5c494980feeb36bfc6df7d1cc8a6246f259c31cd3c64885d7e60a scripts/deferred-slot-operation-r46.mjs
|
|
1448
1448
|
34116370895aeff9a424475558f4aca3b05460146455d9bb0bafcacd1a270910 scripts/deferred-slot-operation.mjs
|
|
1449
1449
|
1cee04ab67a1e9a06f42cb5fde7073298ca501a059c961d11659a578aaef5e90 scripts/deploy-r47.mjs
|
|
1450
|
-
|
|
1450
|
+
1be4983bf63172064a1ef5ba0cbcc727f68f17fe1b0de1c248cd79aac89a53aa scripts/deploy-r48.mjs
|
|
1451
1451
|
2cc7a37231f8836a48c3bf4024887f38c10bfc89296ac483e4b98b3f18281933 scripts/derive-r45-parent.mjs
|
|
1452
1452
|
67221c5619019a9d19611432d4361c99c365f14e89483e4c8f78451839960176 scripts/derive-r45-release.mjs
|
|
1453
1453
|
87c6acc0df96a6e8bb6692bc7b12e8b386196a80cba554d9b214ff8bb12147fe scripts/derive-r45-tests.mjs
|
|
@@ -1530,7 +1530,7 @@ a9d10a04324cceafafa7edc1501e8e1f8a1ae4a094d0985c8309472512529d30 scripts/gate-w
|
|
|
1530
1530
|
1a771b5b8a62d57f26762d53472ed68a3e733674b1c91e08becf0dc2e4325039 scripts/inspect-active-release-r45.mjs
|
|
1531
1531
|
de6142bd5693cf4edb8725c9c43fc77e9bdc12f5b398a757006d778d3ee3f8ed scripts/inspect-r46-active.mjs
|
|
1532
1532
|
06425d2a4004cb0ad66383c10c30aaa91bb020be2926bc76f9681a8f0827ddfc scripts/inventory-reference-dist.mjs
|
|
1533
|
-
|
|
1533
|
+
d952ca5bb1d315f37c2d15625756c366b100e8c015f11fedfd22919fadefbea1 scripts/issue-uac-migration-r153.mjs
|
|
1534
1534
|
7ea8cf6bf094a1612603bc716228a3753e5f06fca8a0684d2da15a04d0710c64 scripts/list-source-zips.mjs
|
|
1535
1535
|
4326526cbff265bb8ec2d38af1825b0bac227e3506437fff6e13f9cdb20dab33 scripts/npm-artifact-identity-r61.mjs
|
|
1536
1536
|
2598a67b08caaef2ff75fc52eca1e268c83b79c50048202e318904952379aa4a scripts/npm-prepublish-contract-r74.mjs
|
|
@@ -1561,7 +1561,7 @@ f682cb041e9dec3e4e99c87e9650e35c9f10d51cba458ec7040bbedc8b22f987 scripts/perfor
|
|
|
1561
1561
|
6767992de09ed6f95f74a14b743bb5e5660fa63cbd2d5a6cdc2a14be3531c8cc scripts/promote-local-d-generation.ps1
|
|
1562
1562
|
c4e081f95bc82e45a06993c34d47f10083640e794e2e3ccc26933fcf597b0c50 scripts/public-baseline-r58.mjs
|
|
1563
1563
|
615c670581ee3e8a30095c0af63c24edbec01db74c7370069e1a486c53989968 scripts/public-surface-r58.mjs
|
|
1564
|
-
|
|
1564
|
+
3af9ef85417e0b55e00df060e345dde2b609b744b065549216c5ffa87130befa scripts/r153-prepublish-identity.mjs
|
|
1565
1565
|
e19a1d591ccd07af2e87d930ce23b0cc9b814bc2a395408045543847154097d7 scripts/r40-compact-ledger-probe.mjs
|
|
1566
1566
|
68b9a60aca3f3e3e9ec239710f8368594ef3c8a98fff0816d2e9a7950df48287 scripts/r47-core-failures.mjs
|
|
1567
1567
|
75f821cc44f8c31f67de0b28b64021d9fb160984a597e704b29c33f9f3a41dde scripts/r47-syntax-check.mjs
|
|
@@ -1622,7 +1622,7 @@ d42efb6dd8e6abc79c66e768f8c0feb10fa3341bcce0888750461f56612f0fd3 scripts/releas
|
|
|
1622
1622
|
1b83f49d9798188533c8cfca0030a98af34560fe181b3e593db790319e1b7bc5 scripts/release-parity.mjs
|
|
1623
1623
|
21ddee002ddfc1d7c34bf92a4cc02abac38630c4814366216efda66217db6baa scripts/remove-source-archives-r47.mjs
|
|
1624
1624
|
817c2f5ce7f2c935a268e16f4a2d8b8611ddf89df8776682082baafb63a84921 scripts/repair-builder-template.mjs
|
|
1625
|
-
|
|
1625
|
+
bb06a46f53222181618569633c177e62274bcb11b440fcfea63826b0bb22edd4 scripts/request-uac-migration-r153.ps1
|
|
1626
1626
|
fb6e47bf46f86887bcbde703b2618ead594ba430a6faf298be6b34432a87e030 scripts/run-r46-full-regression-background.mjs
|
|
1627
1627
|
46751fc8c4f25329c235e1946c662f33c23c46428d4075a2f7c9543c801c5cfd scripts/run-r46-windows-gate-background.mjs
|
|
1628
1628
|
cabfa63d5edb83f32b3e6e5ce22e76223644d81a3361d52a28de2dbc07e59a54 scripts/run-r46-windows-gate-background.ps1
|
|
@@ -1675,7 +1675,7 @@ c32cb9054a1b9641ae071c00622c0054272bdb0b519ea22c4ff926a1600a2b46 scripts/worklo
|
|
|
1675
1675
|
1ee9251c743d817245e858229e1e1db4f7bebb7e5411d370d33c4777528e53e0 scripts/workload-substrate-r47-regression.mjs
|
|
1676
1676
|
546947775fac8075f48c689ea0f7bed5ea14424efd12587daead4a7df6e796df src/activation-authority-proof-r75.mjs
|
|
1677
1677
|
0fca861bfb959b6d84c4767b2f60a4e0ec2403291a6050ee7598f75d2c4c18e0 src/activation-continuity-engine-r65.mjs
|
|
1678
|
-
|
|
1678
|
+
64ff84efd679a4f2a7e7aefcca70c3199ad47ff069e18ea9c08a4305ddee2d50 src/activation-lock-r65.mjs
|
|
1679
1679
|
fc05a48ac13961c2f1dee444946531ff80100a00750fb9f8e456a6d69f6e1310 src/activation-preflight-r65.mjs
|
|
1680
1680
|
9dc1154b3857446d0412002e1f0b0031c23d1768350dc9395749a7f82be337e5 src/agent-backend-r44.mjs
|
|
1681
1681
|
4e8e442497a15bce43b7d02ade497403d80b86e307473d26c172a0fba3a6d4ea src/agent-eval-r42.mjs
|
|
@@ -1713,7 +1713,7 @@ da5181cec30034ddf089baa5358becb5651da238a2e7cf0888007a4c60b4ea6b src/capability
|
|
|
1713
1713
|
8348e01ec8dcd3171dab02399a2aa48cf09db2d283da25bfdde721a5c3f44b03 src/capability-ledger.mjs
|
|
1714
1714
|
dd84aab65c73906037390b07f1d9e3e118511b21145e8ba914f98d6f2a153baf src/capability-resolver.mjs
|
|
1715
1715
|
b3a669da30bf2d99cd5a912bdacb234b66c90215183a2aeeb3c01c91f1a55c64 src/capability-snapshot.mjs
|
|
1716
|
-
|
|
1716
|
+
3e2818046625828107e2fcb6723eaf9f227648f781293b1abac475cf03ee7565 src/clean-activation-recovery-r153.mjs
|
|
1717
1717
|
94e5aeff2453cdc0239aee4d547dbbefee183c71933cb84e5e8a418fa99bc1e8 src/codex-app-server-r44.mjs
|
|
1718
1718
|
c4e07aa6818cd989c43ce8d027dc7d467e05c8e2fe96b5548eea291285d3bbb1 src/coding-mcp-tools.mjs
|
|
1719
1719
|
059b4bef2ae6a6c2d7a706c463bea6e49d364faeb619372a429ba36c53004ab7 src/coding-output-contracts.mjs
|
|
@@ -1748,7 +1748,7 @@ dcd4c9784e88e253e91ddad3c24b38cb0b36906ed737f6d7bee7712360f66f7a src/containmen
|
|
|
1748
1748
|
fe1761b98738e1aea1d25ddf3a0ba56ccad95a43d45104a89b8665197c7c9e18 src/containment-result.mjs
|
|
1749
1749
|
705a89cb12fedb993d55dfed32a5870d33e10db26422c944d1e52223566c096c src/containment-smoke.mjs
|
|
1750
1750
|
63a1d4d6a53f9eb7e02197b4e42158b867da8c042c2e61848d8a36cd398b8bd8 src/context-provenance.mjs
|
|
1751
|
-
|
|
1751
|
+
d766b4643e1e6e7f03f51c9033b99248612ede1a995cd826923febd556563954 src/deadbyte-cli.mjs
|
|
1752
1752
|
9e9766d64dcc9e2c8d23c2c0a5e9dcb87b7213e8de668f79f593ad48daf15acd src/deadline-cancellation.mjs
|
|
1753
1753
|
fe7a8f8611c33552b3da466a9b866ce79a737bfd5b9a78a953269b30cce16274 src/desktop-contract.mjs
|
|
1754
1754
|
f97352e510c659910c2d4a874d15be028e1291d685c6c1a7be53bdf1a335c2d8 src/desktop-input-r40.mjs
|
|
@@ -1890,16 +1890,16 @@ bac271c6f5218752ac5ff4decf5249e3893ddb35c63c092ce17238c27fc4d35b src/trust-init
|
|
|
1890
1890
|
4d934281a72922fabde7d6e988655a6d095eb3a89abf12e9b99fecc3046e3d62 src/trust.mjs
|
|
1891
1891
|
c99c2402fb0df4f68634fa906eb198c551c55dad9f0921a7b8ed6e33d503884e src/tunnel-stdio-compat-smoke.mjs
|
|
1892
1892
|
aa765e9a28c69ff58a5b5a0d29b49ea181af4db9076633b102dbca25861e708e src/tunnel-stdio-compat.mjs
|
|
1893
|
-
|
|
1893
|
+
e241728ead29da4336c66011464c1204874741c92667a1bc2cd92d0b29cc04e2 src/uac-approval-contract-r153.mjs
|
|
1894
1894
|
642cb67d1854850e336ee73fbd71b329056bdcbdab35cea19c1a995a155ff5d9 src/verifier-cli.mjs
|
|
1895
1895
|
8f818a4852ce3be3a380cd4736c3073a7a3e0e45cd7c7ca90588a6b843d3d022 src/verifier.mjs
|
|
1896
|
-
|
|
1896
|
+
b2a6b4f53b8c7b729995a2cd87c616492c9dac01d7b6de2e2c8f0b0c487ff63a src/version.mjs
|
|
1897
1897
|
acf5f5a57779bc0529f9db3d821f0ef1b53d22063aa237041348c1ca444ea677 src/windows-powershell-environment.mjs
|
|
1898
1898
|
7e09c57a97289360aabfaf3d531208e54872efbfb3182f3c18203d2cb88c46b5 src/worker-registry.mjs
|
|
1899
1899
|
76361d5ae9a710273cf64a7525082197b692236bf23689875e5fd1ef4aa96d2b src/worker-scheduler.mjs
|
|
1900
1900
|
4da1b32f5198bb089bc68b7eb6de21ea296678b5020018a73742bf0df57d62fa src/workload-substrate.mjs
|
|
1901
1901
|
1bd637e7634ca0259791c5108fcf324554f70b1db49e5eac3505287c04bbc3be STABILIZATION-PROGRESS.md
|
|
1902
|
-
|
|
1902
|
+
908286ccfafec104fe2b1cf50253c579fedc3acf0275d4ebd5ed2f706b001a20 TEST-MATRIX.json
|
|
1903
1903
|
e4f1fb97545f23772ddff28ad3f9954a4714f9854062fca62e0e12c1cb2ec4ae test/agent-backend-r44.test.mjs
|
|
1904
1904
|
2a78c818058b25efdc143a3a97c832da231ccd6ff9d90c7796d681a0251b85c4 test/agent-crash-child.mjs
|
|
1905
1905
|
d9461ab7c118ee75d37a2d6f5e637d7e43505af6a9ad8c7ddafffc8ace185a5b test/agent-crash-worker.mjs
|
|
@@ -2153,9 +2153,9 @@ ce163ee9f288e30a213636e2267b8630016ef8a170f12286e8cdd44219bdab32 test/r124-live
|
|
|
2153
2153
|
17475b51e416ae678f959f8975fab8497eb7c57d13e36cac8656c0e1f7424c0c test/r126-restore-policy-envelope.test.mjs
|
|
2154
2154
|
1721d4bd3bb58c10ad9d86b69ad1d993ec5a1e6315c95b28fa50ab67d4ca302a test/r127-restore-append-policy-boundary.test.mjs
|
|
2155
2155
|
b3d3dda398c94d18e2e156bde65d1338000233407b435134ba0c16175d96620b test/r129-sdk-security-baseline.test.mjs
|
|
2156
|
-
|
|
2156
|
+
593ea4cc04fa6f09188774cedc39978a8279f1201c3222184eb1433ebcc258b0 test/r130-release-security-contract.test.mjs
|
|
2157
2157
|
bb7963baf412ec0f5aca183f6dd98eda9026fe763017f9af595581b521ae6cb7 test/r131-installed-manifest-boundary.test.mjs
|
|
2158
|
-
|
|
2158
|
+
f3571a18beeeecb4073e3169acd7ffb5a7dda169406170ad40ba4867572621c4 test/r132-release-identity.test.mjs
|
|
2159
2159
|
acd236a4d8ba035007bde4166a521b8d4e6044f58c52c0bae9cb42fa75338533 test/r135-autonomous-scope.test.mjs
|
|
2160
2160
|
3fcf657aae1f8466abc5ab82bb5a619966ea9b8a33d4a95a5a5246df5bf3afa1 test/r136-scoped-command-rights.test.mjs
|
|
2161
2161
|
e0c466f25b35eb894166df792b71b23924610d32363756c75ff437dfdaa12a4c test/r136-scoped-observer.test.mjs
|
|
@@ -2178,12 +2178,15 @@ ef0665adaab2a2b2d6ca8611a6335ded96b8e65a9661840acd139d3c86710e62 test/r144-cont
|
|
|
2178
2178
|
b92f914455cac010b1468cd37a31651e7d423571d0edfeb29829d2281073e1e3 test/r146-legacy-offline-policy-proof.test.mjs
|
|
2179
2179
|
32f40b649033172384267bbe8f6009dededcba81afff1e3ca51331407197fe3b test/r146-livelog-backpressure.test.mjs
|
|
2180
2180
|
77b3bfcd6fa04e21c7a04206181f7b4cbd5321f799a145859d8e84d0b984d174 test/r147-remote-request-hash.test.mjs
|
|
2181
|
-
|
|
2181
|
+
48157c509b03fe5661a67a5c68d931c455a71494fb1d52ef0070effb764873f3 test/r153-clean-activation-recovery.test.mjs
|
|
2182
2182
|
b1c9d788a607e579d18a1be36e0837dcc34b343bb53d55f9fb51c202af13bacd test/r153-prepublish-identity.test.mjs
|
|
2183
|
+
377b03dbb1d82ed0ddeee261a060b8173d5591dfc20a60d9ea991390a03039b4 test/r153-r60-host-repin-e2e-contract.test.mjs
|
|
2184
|
+
658a839860ca6bfc7a26cf8f793c58f6cdeb2a8d425744ee7872f2eca3ff4ef6 test/r153-r65-signed-precondition-recovery.test.mjs
|
|
2183
2185
|
ce37fc59761ceddf43fd3844b34d57f64f1c8d191ca1d6cba13b643a5e2c02ce test/r153-restricted-reused-pid.test.mjs
|
|
2184
|
-
|
|
2186
|
+
3c8d2110e869d4a6f125c9a4978c049f54424893f2317312448813ba0f19860f test/r153-staging-leaf-acl.test.mjs
|
|
2187
|
+
b3e9fb4452b3a96ddc5af1a7873eb487bd273e042aa7eb91bbd03f8f7d8f46a9 test/r153-uac-approval-contract.test.mjs
|
|
2185
2188
|
3d6a76df732eaa52b7409aa26c933f9e4d8316b64ded5cfad4202fea51b74fcd test/r153-uac-installed-manifest-contract.test.mjs
|
|
2186
|
-
|
|
2189
|
+
7d4ac1735e2c8760a4fe424aec6ceef8def6680c882c2cde32a59bedccb5edff test/r153-uac-launch-parameter-contract.test.mjs
|
|
2187
2190
|
3c5c3724bce89aa1fa59fe97cc346c40a5674bb5cd6dc3e2f31b86f2d62e75e4 test/r33-closeout-regression.test.mjs
|
|
2188
2191
|
5e3700ee610442dfd7b7ae5e380263f231438be0e32790597142c41362a53c9a test/r33-finalization.test.mjs
|
|
2189
2192
|
7e419d3c1caf79bfc7407207f50e5645298f9b19d91a7d6f595af185b92cd55e test/r36-finalization.test.mjs
|
|
@@ -2249,7 +2252,7 @@ ca8e23abc89f3eadeceb4b6fdad2cb4db5a7933029ece8e8beae2c6a158876b7 test/r58-owner
|
|
|
2249
2252
|
8fc5ed1d3088facf45f9578d9ff8514c3a633f7f342d15eec316e129e7a916c0 test/r58-stale-owner.test.mjs
|
|
2250
2253
|
84be7ee7d167eb06c9f9fc178930daaa81e53a91de40bad6d7df2060bd3dd165 test/r58-windows-gate.test.mjs
|
|
2251
2254
|
76db2a4009d76b86e1da57b91a96b0d6bfeb4063bec3301ede736e2fd5832f39 test/r59-release-contract.test.mjs
|
|
2252
|
-
|
|
2255
|
+
65c50d4be2fa29851a2f908da569bdd3c4f8e1b970bddfdc7fda15a153edde13 test/r59-tool-surface-compat.test.mjs
|
|
2253
2256
|
3befd5d4dc4d8ca9e1f6cbeb9c430671e676c5696d6ee5931c2cbe3244c558a4 test/r60-authority-coherence.test.mjs
|
|
2254
2257
|
60577e231c7d164f57a3960c574d3e369ca140d9dbc477b2444fa62dbf224e51 test/r60-authority-enforcement.test.mjs
|
|
2255
2258
|
a1fa0b1e529da05f3659a33be6d36dab02f93808638cf0f458d057e9c6d1e35b test/r60-bridge-dispatch.test.mjs
|
package/PROVENANCE.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": "deadbyte.provenance.v1",
|
|
3
|
-
"version": "0.15.
|
|
4
|
-
"source_model": "published 0.15.
|
|
3
|
+
"version": "0.15.60",
|
|
4
|
+
"source_model": "published 0.15.59 tarball -> isolated R153 clean activation recovery successor",
|
|
5
5
|
"signing": "ed25519",
|
|
6
|
-
"parent_tarball_sha256": "
|
|
6
|
+
"parent_tarball_sha256": "0c20152b8ee553f06f05dfe017f4bd823d30cd50710722e9e0874f0bd6c66c75",
|
|
7
7
|
"parent_activation_status": "PRODUCTION_ACTIVE",
|
|
8
8
|
"parent_rollback_receipt_sha256": null,
|
|
9
9
|
"runtime_predecessor": {
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
"manifest_sha256": "34aa8d1241cfb8bf0b5ba303bf3c06e0e9e1bf01f64457bca659d6dd4d634fdc",
|
|
12
12
|
"generation_manifest_sha256": "ff2b73410062688651abd7bc2dd7b2b8c87810a28e3808bfe1f4352a25b0e6e4"
|
|
13
13
|
},
|
|
14
|
-
"source_predecessor_manifest_file_sha256": "
|
|
15
|
-
"reproducibility": "R153 isolated successor of published 0.15.
|
|
14
|
+
"source_predecessor_manifest_file_sha256": "f727be4a63220f4215f18282a1fd89963924a64adcd07747ca3c12d8fb166d86",
|
|
15
|
+
"reproducibility": "R153 isolated successor of published 0.15.59 tarball SHA-256 0c20152b8ee553f06f05dfe017f4bd823d30cd50710722e9e0874f0bd6c66c75; production runtime 0.15.45 remains immutable until exact candidate gates pass; legacy migration is one-time Windows UAC, marker-bound, and may only narrow policy while retaining all authority disarmed",
|
|
16
16
|
"public_surface_evidence": {
|
|
17
17
|
"status": "PASS",
|
|
18
18
|
"baseline_release": "v0.15.35-1b5715b276facbc0",
|
|
@@ -80,8 +80,8 @@
|
|
|
80
80
|
"parent_release_id": "v0.15.45-34aa8d1241cfb8bf",
|
|
81
81
|
"parent_manifest_sha256": "34aa8d1241cfb8bf0b5ba303bf3c06e0e9e1bf01f64457bca659d6dd4d634fdc",
|
|
82
82
|
"parent_generation_manifest_sha256": "ff2b73410062688651abd7bc2dd7b2b8c87810a28e3808bfe1f4352a25b0e6e4",
|
|
83
|
-
"source_predecessor_version": "0.15.
|
|
84
|
-
"source_predecessor_tarball_sha256": "
|
|
83
|
+
"source_predecessor_version": "0.15.59",
|
|
84
|
+
"source_predecessor_tarball_sha256": "0c20152b8ee553f06f05dfe017f4bd823d30cd50710722e9e0874f0bd6c66c75",
|
|
85
85
|
"operator_override": {
|
|
86
86
|
"four_hour_soak": "WAIVED_BY_OPERATOR",
|
|
87
87
|
"clean_machine": "WAIVED_BY_OPERATOR",
|
|
@@ -125,7 +125,7 @@
|
|
|
125
125
|
"package_registry_activation_rollback_restore": "PENDING",
|
|
126
126
|
"stable_final_claim": false
|
|
127
127
|
},
|
|
128
|
-
"parent_registry_tarball_sha1": "
|
|
128
|
+
"parent_registry_tarball_sha1": "04cc1a1e80bcb7062ac39eee6b7bab70edd5d8c3",
|
|
129
129
|
"r62": {
|
|
130
130
|
"transaction_inventory_default_max_entries": 1024,
|
|
131
131
|
"parent_state_records_observed": 341,
|
package/README.txt
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
DEADBYTE MCP V0.15.
|
|
1
|
+
DEADBYTE MCP V0.15.60 / R153 CLEAN ACTIVATION RECOVERY
|
|
2
2
|
=========================
|
|
3
3
|
|
|
4
4
|
AUTHENTICATED MACHINE TRUTH + DURABLE AGENT + CODING + AUTONOMOUS PRODUCTION ENGINE
|
|
@@ -16,12 +16,12 @@ check `--version` before issuing a stateful command. The compatibility CMD
|
|
|
16
16
|
fails with an explanation when npm is detected rather than forwarding the
|
|
17
17
|
wrong command to the controller.
|
|
18
18
|
|
|
19
|
-
npx -y deadbyte-mcp@0.15.
|
|
20
|
-
npx -y deadbyte-mcp@0.15.
|
|
21
|
-
npx -y deadbyte-mcp@0.15.
|
|
22
|
-
npx -y deadbyte-mcp@0.15.
|
|
23
|
-
npx -y deadbyte-mcp@0.15.
|
|
24
|
-
npx -y deadbyte-mcp@0.15.
|
|
19
|
+
npx -y deadbyte-mcp@0.15.60 mcp
|
|
20
|
+
npx -y deadbyte-mcp@0.15.60 remote
|
|
21
|
+
npx -y deadbyte-mcp@0.15.60 remote status
|
|
22
|
+
npx -y deadbyte-mcp@0.15.60 remote restart
|
|
23
|
+
npx -y deadbyte-mcp@0.15.60 audit status
|
|
24
|
+
npx -y deadbyte-mcp@0.15.60 audit verify
|
|
25
25
|
|
|
26
26
|
MAJOR MCP CLIENT STDIO CONFIGS
|
|
27
27
|
-------------------------------
|
|
@@ -32,7 +32,7 @@ CLAUDE DESKTOP
|
|
|
32
32
|
"mcpServers": {
|
|
33
33
|
"deadbyte": {
|
|
34
34
|
"command": "npx",
|
|
35
|
-
"args": ["-y", "deadbyte-mcp@0.15.
|
|
35
|
+
"args": ["-y", "deadbyte-mcp@0.15.60", "mcp"]
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -44,7 +44,7 @@ Save as .cursor/mcp.json:
|
|
|
44
44
|
"mcpServers": {
|
|
45
45
|
"deadbyte": {
|
|
46
46
|
"command": "npx",
|
|
47
|
-
"args": ["-y", "deadbyte-mcp@0.15.
|
|
47
|
+
"args": ["-y", "deadbyte-mcp@0.15.60", "mcp"]
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
}
|
|
@@ -57,7 +57,7 @@ Save as .vscode/mcp.json:
|
|
|
57
57
|
"deadbyte": {
|
|
58
58
|
"type": "stdio",
|
|
59
59
|
"command": "npx",
|
|
60
|
-
"args": ["-y", "deadbyte-mcp@0.15.
|
|
60
|
+
"args": ["-y", "deadbyte-mcp@0.15.60", "mcp"]
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
}
|
|
@@ -67,7 +67,7 @@ Add to the Codex MCP configuration:
|
|
|
67
67
|
|
|
68
68
|
[mcp_servers.deadbyte]
|
|
69
69
|
command = "npx"
|
|
70
|
-
args = ["-y", "deadbyte-mcp@0.15.
|
|
70
|
+
args = ["-y", "deadbyte-mcp@0.15.60", "mcp"]
|
|
71
71
|
|
|
72
72
|
The `mcp` command is the quiet stdio server entry for local MCP clients; stdout is reserved for MCP.
|
|
73
73
|
The remote CLI invokes the stable active-release PowerShell launcher directly with shell=false.
|
|
@@ -356,7 +356,7 @@ CONTROLLER
|
|
|
356
356
|
----------
|
|
357
357
|
Primary operator entry point:
|
|
358
358
|
|
|
359
|
-
npx -y deadbyte-mcp@0.15.
|
|
359
|
+
npx -y deadbyte-mcp@0.15.60 remote
|
|
360
360
|
|
|
361
361
|
The legacy CMD entry remains compatibility-only for R33 rollback safety.
|
|
362
362
|
|
|
@@ -417,7 +417,7 @@ MCP CLIENT CONFIGURATION
|
|
|
417
417
|
------------------------
|
|
418
418
|
The local stdio entry point is quiet and suitable for MCP hosts:
|
|
419
419
|
|
|
420
|
-
npx -y deadbyte-mcp@0.15.
|
|
420
|
+
npx -y deadbyte-mcp@0.15.60 mcp
|
|
421
421
|
|
|
422
422
|
CLAUDE DESKTOP
|
|
423
423
|
Use the standard local-server entry in claude_desktop_config.json:
|
|
@@ -426,7 +426,7 @@ Use the standard local-server entry in claude_desktop_config.json:
|
|
|
426
426
|
"mcpServers": {
|
|
427
427
|
"deadbyte": {
|
|
428
428
|
"command": "npx",
|
|
429
|
-
"args": ["-y", "deadbyte-mcp@0.15.
|
|
429
|
+
"args": ["-y", "deadbyte-mcp@0.15.60", "mcp"]
|
|
430
430
|
}
|
|
431
431
|
}
|
|
432
432
|
}
|
|
@@ -439,7 +439,7 @@ Create .cursor/mcp.json:
|
|
|
439
439
|
"deadbyte": {
|
|
440
440
|
"type": "stdio",
|
|
441
441
|
"command": "npx",
|
|
442
|
-
"args": ["-y", "deadbyte-mcp@0.15.
|
|
442
|
+
"args": ["-y", "deadbyte-mcp@0.15.60", "mcp"]
|
|
443
443
|
}
|
|
444
444
|
}
|
|
445
445
|
}
|
|
@@ -452,7 +452,7 @@ Create .vscode/mcp.json:
|
|
|
452
452
|
"deadbyte": {
|
|
453
453
|
"type": "stdio",
|
|
454
454
|
"command": "npx",
|
|
455
|
-
"args": ["-y", "deadbyte-mcp@0.15.
|
|
455
|
+
"args": ["-y", "deadbyte-mcp@0.15.60", "mcp"]
|
|
456
456
|
}
|
|
457
457
|
}
|
|
458
458
|
}
|
|
@@ -462,9 +462,9 @@ Add this to ~/.codex/config.toml:
|
|
|
462
462
|
|
|
463
463
|
[mcp_servers.deadbyte]
|
|
464
464
|
command = "npx"
|
|
465
|
-
args = ["-y", "deadbyte-mcp@0.15.
|
|
465
|
+
args = ["-y", "deadbyte-mcp@0.15.60", "mcp"]
|
|
466
466
|
|
|
467
|
-
The remote device path remains `npx -y deadbyte-mcp@0.15.
|
|
467
|
+
The remote device path remains `npx -y deadbyte-mcp@0.15.60 remote`. Remote public MCP uses the
|
|
468
468
|
verified HTTPS named-tunnel URL selected by the active generation; do not commit a private device
|
|
469
469
|
URL or tunnel token into a repository.
|
|
470
470
|
|
package/RELEASE.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": "deadbyte.release.v1",
|
|
3
3
|
"name": "deadbyte-mcp",
|
|
4
|
-
"version": "0.15.
|
|
4
|
+
"version": "0.15.60",
|
|
5
5
|
"train": "R153",
|
|
6
6
|
"label": "R153 CLEAN ACTIVATION RECOVERY",
|
|
7
7
|
"protocol_revision": "2026-07-28",
|
|
@@ -19,10 +19,10 @@
|
|
|
19
19
|
"generation_manifest_sha256": "ff2b73410062688651abd7bc2dd7b2b8c87810a28e3808bfe1f4352a25b0e6e4"
|
|
20
20
|
},
|
|
21
21
|
"source_predecessor": {
|
|
22
|
-
"version": "0.15.
|
|
23
|
-
"source_path": "C:\\Users\\DEADBYTE\\.deadbyte-mcp\\evidence\\npm-publication\\0.15.
|
|
22
|
+
"version": "0.15.59",
|
|
23
|
+
"source_path": "C:\\Users\\DEADBYTE\\.deadbyte-mcp\\evidence\\npm-publication\\0.15.59\\deadbyte-mcp-0.15.59.tgz",
|
|
24
24
|
"release_status": "REGISTRY_PUBLISHED",
|
|
25
|
-
"tarball_sha256": "
|
|
25
|
+
"tarball_sha256": "0c20152b8ee553f06f05dfe017f4bd823d30cd50710722e9e0874f0bd6c66c75"
|
|
26
26
|
},
|
|
27
27
|
"consolidation": {
|
|
28
28
|
"frontend_status_vocabulary": true,
|
|
@@ -417,9 +417,9 @@
|
|
|
417
417
|
"stable_final_claim": false
|
|
418
418
|
},
|
|
419
419
|
"r153": {
|
|
420
|
-
"release_candidate_version": "0.15.
|
|
421
|
-
"source_predecessor_version": "0.15.
|
|
422
|
-
"source_predecessor_tarball_sha256": "
|
|
420
|
+
"release_candidate_version": "0.15.60",
|
|
421
|
+
"source_predecessor_version": "0.15.59",
|
|
422
|
+
"source_predecessor_tarball_sha256": "0c20152b8ee553f06f05dfe017f4bd823d30cd50710722e9e0874f0bd6c66c75",
|
|
423
423
|
"production_predecessor_version": "0.15.45",
|
|
424
424
|
"startup_order": "LOCK_MARKER_RECONCILE_ACTIVATE_CLAIM_START",
|
|
425
425
|
"stale_marker_reconciliation": "PASS_FOCUSED_CONTENT_CAS",
|
package/SBOM.cdx.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"bomFormat": "CycloneDX",
|
|
3
3
|
"specVersion": "1.6",
|
|
4
|
-
"serialNumber": "urn:cdx:deadbyte-mcp:r153:0.15.
|
|
4
|
+
"serialNumber": "urn:cdx:deadbyte-mcp:r153:0.15.60",
|
|
5
5
|
"version": 1,
|
|
6
6
|
"metadata": {
|
|
7
7
|
"component": {
|
|
8
8
|
"type": "application",
|
|
9
9
|
"name": "deadbyte-mcp",
|
|
10
|
-
"version": "0.15.
|
|
10
|
+
"version": "0.15.60"
|
|
11
11
|
}
|
|
12
12
|
},
|
|
13
13
|
"components": [
|
package/TEST-MATRIX.json
CHANGED
package/bridge/package.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "deadbyte-mcp",
|
|
3
|
-
"version": "0.15.
|
|
3
|
+
"version": "0.15.60",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Authenticated MCP agentic runtime with signed skills, persistent model backends, identity-bound remote devices, durable job supervision, immutable release slots, and separately revocable machine authority.",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
param(
|
|
2
|
-
[Parameter(Mandatory=$true)][ValidateSet('0.15.
|
|
2
|
+
[Parameter(Mandatory=$true)][ValidateSet('0.15.60')][string]$ExpectedVersion,
|
|
3
3
|
[Parameter(Mandatory=$true)][string]$StateRoot,
|
|
4
4
|
[Parameter(Mandatory=$true)][string]$TarballPath,
|
|
5
5
|
[Parameter(Mandatory=$true)][ValidatePattern('^[0-9a-f]{64}$')][string]$ExpectedTarballSha256,
|
|
@@ -9,6 +9,7 @@ param(
|
|
|
9
9
|
[Parameter(Mandatory=$true)][string]$StderrPath,
|
|
10
10
|
[Parameter(Mandatory=$true)][string]$MarkerReceiptPath,
|
|
11
11
|
[Parameter(Mandatory=$true)][ValidatePattern('^[0-9a-f]{64}$')][string]$MarkerReceiptSha256,
|
|
12
|
+
[ValidatePattern('^powershell_script=[0-9a-f]{64}$')][string]$HostCommandPin,
|
|
12
13
|
[switch]$Bootstrap
|
|
13
14
|
)
|
|
14
15
|
$ErrorActionPreference = 'Stop'
|
|
@@ -65,6 +66,7 @@ if (-not $Bootstrap) {
|
|
|
65
66
|
'-ExpectedManifestSha256',$ExpectedManifestSha256,'-ExpectedBootstrapSha256',$ExpectedBootstrapSha256,
|
|
66
67
|
'-StdoutPath',(Quote $StdoutPath),'-StderrPath',(Quote $StderrPath),
|
|
67
68
|
'-MarkerReceiptPath',(Quote $MarkerReceiptPath),'-MarkerReceiptSha256',$MarkerReceiptSha256)
|
|
69
|
+
if ($HostCommandPin) { $arguments += @('-HostCommandPin',$HostCommandPin) }
|
|
68
70
|
$child = Start-Process -FilePath $powershell -ArgumentList $arguments -Verb RunAs -Wait -PassThru -WindowStyle Hidden
|
|
69
71
|
if (Test-Path -LiteralPath $StdoutPath) { [Console]::Out.Write([IO.File]::ReadAllText($StdoutPath)) }
|
|
70
72
|
if (Test-Path -LiteralPath $StderrPath) { [Console]::Error.Write([IO.File]::ReadAllText($StderrPath)) }
|
|
@@ -99,7 +101,7 @@ if ($LASTEXITCODE -ne 0) { throw 'R153 protected staging initial ACL normalizati
|
|
|
99
101
|
& $icacls $prefix '/setowner' '*S-1-5-32-544' '/T' '/C' | Out-Null
|
|
100
102
|
if ($LASTEXITCODE -ne 0) { throw 'R153 protected staging initial owner normalization failed' }
|
|
101
103
|
|
|
102
|
-
$metadataUri = 'https://registry.npmjs.org/deadbyte-mcp/0.15.
|
|
104
|
+
$metadataUri = 'https://registry.npmjs.org/deadbyte-mcp/0.15.60'
|
|
103
105
|
$tagsUri = 'https://registry.npmjs.org/-/package/deadbyte-mcp/dist-tags'
|
|
104
106
|
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
|
105
107
|
$metadata = Invoke-RestMethod -UseBasicParsing -Uri $metadataUri -Method Get -TimeoutSec 30
|
|
@@ -184,6 +186,12 @@ if ($actual.Count -ne $expected.Count) { throw 'R153 staged package file-count m
|
|
|
184
186
|
if ($LASTEXITCODE -ne 0) { throw 'R153 protected staging final ACL normalization failed' }
|
|
185
187
|
& $icacls $prefix '/setowner' '*S-1-5-32-544' '/T' '/C' | Out-Null
|
|
186
188
|
if ($LASTEXITCODE -ne 0) { throw 'R153 protected staging final owner normalization failed' }
|
|
189
|
+
# /inheritance:r with /T strips inherited Allow ACEs from leaf files.
|
|
190
|
+
# The directory OI/CI grant above does not become a direct leaf ACE on Windows.
|
|
191
|
+
# Restore direct access for Administrators and SYSTEM on every existing member;
|
|
192
|
+
# never grant Users/Everyone, and independently re-hash all package files below.
|
|
193
|
+
& $icacls $prefix '/grant' '*S-1-5-32-544:(F)' '*S-1-5-18:(F)' '/T' '/C' | Out-Null
|
|
194
|
+
if ($LASTEXITCODE -ne 0) { throw 'R153 protected staging leaf ACL restoration failed' }
|
|
187
195
|
|
|
188
196
|
# Re-read every manifest-bound byte after ACL normalization. The first
|
|
189
197
|
# candidate JavaScript below cannot run against bytes changed in the ACL gap.
|
|
@@ -217,9 +225,11 @@ $preflight = ($preflightOutput -join "`n") | ConvertFrom-Json
|
|
|
217
225
|
if ($preflight.state -ne 'AUTHORITY_UNVERIFIED' -or $preflight.subject_sha256 -notmatch '^[0-9a-f]{64}$') {
|
|
218
226
|
throw "R153 protected migration not applicable: $($preflight.state)"
|
|
219
227
|
}
|
|
220
|
-
|
|
221
|
-
-StdoutPath
|
|
222
|
-
-MarkerReceiptSha256
|
|
228
|
+
$helperArgs = @('-Elevated','-NodePath',$node,'-DeployScript',$deploy,'-StateRoot',$StateRoot,
|
|
229
|
+
'-StdoutPath',$StdoutPath,'-StderrPath',$StderrPath,'-MarkerReceiptPath',$MarkerReceiptPath,
|
|
230
|
+
'-MarkerReceiptSha256',$MarkerReceiptSha256,'-PreflightSubjectSha256',$preflight.subject_sha256)
|
|
231
|
+
if ($HostCommandPin) { $helperArgs += @('-HostCommandPin',$HostCommandPin) }
|
|
232
|
+
& $helper @helperArgs
|
|
223
233
|
$helperExit = $LASTEXITCODE
|
|
224
234
|
try { Remove-Item -LiteralPath $prefix -Recurse -Force -ErrorAction Stop }
|
|
225
235
|
catch { [Console]::Error.WriteLine('R153_STAGE_CLEANUP_WARNING: protected stage retained for operator reconciliation') }
|
package/scripts/deploy-r48.mjs
CHANGED
|
@@ -24,11 +24,17 @@ const sleep=ms=>new Promise(resolve=>setTimeout(resolve,ms));
|
|
|
24
24
|
function parseDeployArgs(argv){
|
|
25
25
|
const out={preflight:false,approvalPath:null,approvalSha256:null,uacLegacyMigration:false,
|
|
26
26
|
markerReceiptPath:null,markerReceiptSha256:null,migrationNonce:null,migrationIssuedAt:null,
|
|
27
|
-
migrationExpiresAt:null,uacApprovalPath:null,uacApprovalSha256:null};
|
|
27
|
+
migrationExpiresAt:null,uacApprovalPath:null,uacApprovalSha256:null,hostCommandPin:null};
|
|
28
28
|
for(let index=0;index<argv.length;index++){
|
|
29
29
|
const arg=argv[index];
|
|
30
30
|
if(arg==='--preflight'){if(out.preflight)throw new Error('duplicate --preflight');out.preflight=true;continue;}
|
|
31
31
|
if(arg==='--uac-legacy-migration'){if(out.uacLegacyMigration)throw new Error('duplicate --uac-legacy-migration');out.uacLegacyMigration=true;continue;}
|
|
32
|
+
if(arg==='--host-command-pin'){
|
|
33
|
+
if(out.hostCommandPin!==null)throw new Error('duplicate --host-command-pin');
|
|
34
|
+
const value=String(argv[++index]??'');
|
|
35
|
+
if(!/^powershell_script=[0-9a-f]{64}$/.test(value))throw new Error('--host-command-pin requires powershell_script=lowercase_sha256');
|
|
36
|
+
out.hostCommandPin=value;continue;
|
|
37
|
+
}
|
|
32
38
|
if(arg==='--marker-reconciliation-receipt'){
|
|
33
39
|
if(out.markerReceiptPath)throw new Error('duplicate --marker-reconciliation-receipt');
|
|
34
40
|
const value=argv[++index];if(!value)throw new Error('--marker-reconciliation-receipt requires a path');
|
|
@@ -70,6 +76,7 @@ function parseDeployArgs(argv){
|
|
|
70
76
|
const uacFields=[out.migrationNonce,out.migrationIssuedAt,out.migrationExpiresAt,out.uacApprovalPath,out.uacApprovalSha256];
|
|
71
77
|
if(out.uacLegacyMigration&&uacFields.some(value=>!value))throw new Error('UAC migration requires nonce, lifetime, and approval receipt');
|
|
72
78
|
if(!out.uacLegacyMigration&&uacFields.some(value=>value))throw new Error('UAC migration arguments require --uac-legacy-migration');
|
|
79
|
+
if(out.hostCommandPin!==null&&(!out.uacLegacyMigration||out.preflight))throw new Error('explicit host repin requires the elevated UAC migration');
|
|
73
80
|
return out;
|
|
74
81
|
}
|
|
75
82
|
const deployArgs=parseDeployArgs(process.argv.slice(2));
|
|
@@ -313,6 +320,7 @@ const args=[
|
|
|
313
320
|
'--bridge-root',bridgeRoot,'--bridge-script-sha256',await sha(bridgeScript),
|
|
314
321
|
'--enable-machine-fs','--enable-observation','--enable-desktop','--enable-autonomous-supervisor','--recover-offline-predecessor'
|
|
315
322
|
];
|
|
323
|
+
if(deployArgs.hostCommandPin!==null)args.push('--host-command-pin',deployArgs.hostCommandPin);
|
|
316
324
|
let result=null,verification=null,activationOutcomePath=null;
|
|
317
325
|
let continuityEngine=null,continuityUpdateId=null;
|
|
318
326
|
|
|
@@ -45,7 +45,7 @@ async function main(){
|
|
|
45
45
|
if(trust.trusted!==true)fail('candidate not R89 protected');
|
|
46
46
|
const pkg=JSON.parse((await read(path.join(root,'package.json'))).toString('utf8'));
|
|
47
47
|
const rel=JSON.parse((await read(path.join(root,'RELEASE.json'))).toString('utf8'));
|
|
48
|
-
if(pkg.version!=='0.15.
|
|
48
|
+
if(pkg.version!=='0.15.60'||rel.version!==pkg.version)fail('candidate release identity mismatch');
|
|
49
49
|
const pointer=parseActivePointer((await read(path.join(state,'active-release.json'))).toString('utf8'));
|
|
50
50
|
if(pointer.version!=='0.15.45'||rel.parent?.release_id!==pointer.release_id||
|
|
51
51
|
rel.parent?.manifest_sha256!==pointer.manifest_sha256||
|
|
@@ -6,9 +6,9 @@ import {fileURLToPath} from 'node:url';
|
|
|
6
6
|
const defaultRoot=path.resolve(path.dirname(fileURLToPath(import.meta.url)),'..');
|
|
7
7
|
const hex64=/^[0-9a-f]{64}$/;
|
|
8
8
|
const EXPECTED=Object.freeze({
|
|
9
|
-
candidateVersion:'0.15.
|
|
10
|
-
sourceVersion:'0.15.
|
|
11
|
-
sourceSha256:'
|
|
9
|
+
candidateVersion:'0.15.60', train:'R153',
|
|
10
|
+
sourceVersion:'0.15.59',
|
|
11
|
+
sourceSha256:'0c20152b8ee553f06f05dfe017f4bd823d30cd50710722e9e0874f0bd6c66c75',
|
|
12
12
|
runtimeVersion:'0.15.45',
|
|
13
13
|
runtimeReleaseId:'v0.15.45-34aa8d1241cfb8bf',
|
|
14
14
|
runtimeManifest:'34aa8d1241cfb8bf0b5ba303bf3c06e0e9e1bf01f64457bca659d6dd4d634fdc',
|
|
@@ -7,6 +7,7 @@ param(
|
|
|
7
7
|
[Parameter(Mandatory=$true)][string]$MarkerReceiptPath,
|
|
8
8
|
[Parameter(Mandatory=$true)][ValidatePattern('^[0-9a-f]{64}$')][string]$MarkerReceiptSha256,
|
|
9
9
|
[ValidatePattern('^[0-9a-f]{64}$')][string]$PreflightSubjectSha256,
|
|
10
|
+
[ValidatePattern('^powershell_script=[0-9a-f]{64}$')][string]$HostCommandPin,
|
|
10
11
|
[switch]$Elevated
|
|
11
12
|
)
|
|
12
13
|
$ErrorActionPreference = 'Stop'
|
|
@@ -99,6 +100,7 @@ if (-not $Elevated) {
|
|
|
99
100
|
# -Verb RunAs is the UseShellExecute parameter set. PowerShell 5.1 rejects
|
|
100
101
|
# -RedirectStandardOutput/-RedirectStandardError in that same Start-Process.
|
|
101
102
|
# The elevated child writes bounded, no-clobber evidence instead.
|
|
103
|
+
if ($HostCommandPin) { $arguments += @('-HostCommandPin',$HostCommandPin) }
|
|
102
104
|
$child = Start-Process -FilePath $powershell -ArgumentList $arguments -Verb RunAs -Wait -PassThru -WindowStyle Hidden
|
|
103
105
|
if (Test-Path -LiteralPath $StdoutPath) { [Console]::Out.Write([IO.File]::ReadAllText($StdoutPath)) }
|
|
104
106
|
if (Test-Path -LiteralPath $StderrPath) { [Console]::Error.Write([IO.File]::ReadAllText($StderrPath)) }
|
|
@@ -135,14 +137,16 @@ try {
|
|
|
135
137
|
$priorErrorAction = $ErrorActionPreference
|
|
136
138
|
$ErrorActionPreference = 'Continue'
|
|
137
139
|
try {
|
|
138
|
-
$
|
|
139
|
-
'--marker-reconciliation-receipt'
|
|
140
|
-
'--marker-reconciliation-receipt-sha256'
|
|
141
|
-
'--migration-nonce'
|
|
142
|
-
'--migration-issued-at'
|
|
143
|
-
'--migration-expires-at'
|
|
144
|
-
'--uac-approval-receipt'
|
|
145
|
-
'--uac-approval-receipt-sha256'
|
|
140
|
+
$deployArgs = @('--uac-legacy-migration',
|
|
141
|
+
'--marker-reconciliation-receipt',$MarkerReceiptPath,
|
|
142
|
+
'--marker-reconciliation-receipt-sha256',$MarkerReceiptSha256,
|
|
143
|
+
'--migration-nonce',$issued.nonce,
|
|
144
|
+
'--migration-issued-at',$issued.issued_at_utc,
|
|
145
|
+
'--migration-expires-at',$issued.expires_at_utc,
|
|
146
|
+
'--uac-approval-receipt',$issued.receipt_path,
|
|
147
|
+
'--uac-approval-receipt-sha256',$issued.receipt_sha256)
|
|
148
|
+
if ($HostCommandPin) { $deployArgs += @('--host-command-pin',$HostCommandPin) }
|
|
149
|
+
$deployOutput = @(& $NodePath $DeployScript @deployArgs 2>&1)
|
|
146
150
|
$deployExit = $LASTEXITCODE
|
|
147
151
|
} finally { $ErrorActionPreference = $priorErrorAction }
|
|
148
152
|
$deployText = (@($deployOutput) | ForEach-Object { [string]$_ }) -join "`n"
|
|
@@ -85,6 +85,41 @@ async function isSafeTerminalActivation(outcome,lock,stateRoot){
|
|
|
85
85
|
return true;
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
+
async function isSafeSignedPreconditionReject(outcome,lock,stateRoot){
|
|
89
|
+
if(!outcomeMatchesLock(outcome,lock)||outcome?.outcome?.state!=='ACTIVATION_OUTCOME_UNKNOWN'||
|
|
90
|
+
outcome.update_id!==null||outcome.state_path!==null||outcome.continuity_update_id!==null||
|
|
91
|
+
typeof outcome.candidate_version!=='string'||!HEX64.test(String(outcome.candidate_manifest_sha256??''))||
|
|
92
|
+
typeof outcome.predecessor_release_id!=='string')return false;
|
|
93
|
+
const lockTime=Date.parse(lock.created_at_utc),observedTime=Date.parse(outcome.observed_at_utc);
|
|
94
|
+
if(!Number.isFinite(observedTime)||observedTime<lockTime||observedTime-lockTime>120000)return false;
|
|
95
|
+
const updatesDir=path.join(path.resolve(stateRoot),'evidence','updates');
|
|
96
|
+
let current,publicKey,files;
|
|
97
|
+
try{
|
|
98
|
+
current=JSON.parse(await readFile(path.join(stateRoot,'active-release.json'),'utf8'));
|
|
99
|
+
publicKey=createPublicKey(await readFile(path.join(stateRoot,'trust','ed25519-public.pem')));
|
|
100
|
+
files=await readdir(updatesDir,{withFileTypes:true});
|
|
101
|
+
}catch{return false;}
|
|
102
|
+
if(publicKey.asymmetricKeyType!=='ed25519'||current?.release_id!==outcome.predecessor_release_id)return false;
|
|
103
|
+
const prefix='r27-'+outcome.candidate_manifest_sha256.slice(0,16)+'-';
|
|
104
|
+
const candidates=files.filter(f=>f.name.startsWith(prefix)&&/^r27-[a-f0-9]{16}-[a-z0-9-]+$/.test(f.name));
|
|
105
|
+
if(candidates.length!==1||!candidates[0].isDirectory()||candidates[0].isSymbolicLink())return false;
|
|
106
|
+
let signed;
|
|
107
|
+
try{signed=JSON.parse(await readFile(path.join(updatesDir,candidates[0].name,'failure-receipt.json'),'utf8'));}
|
|
108
|
+
catch{return false;}
|
|
109
|
+
if(!verifySlotUpdateEnvelope(signed,publicKey))return false;
|
|
110
|
+
const body=signed.body,failedTime=Date.parse(body?.failed_at_utc??'');
|
|
111
|
+
if(body?.schema!=='deadbyte.r27-slot-update-failure.v1'||
|
|
112
|
+
body.update_id!==candidates[0].name||body.release_version!==outcome.candidate_version||
|
|
113
|
+
body.candidate_manifest_sha256!==outcome.candidate_manifest_sha256||
|
|
114
|
+
body.result!=='PRECONDITION_REJECTED'||body.phase!=='initial'||
|
|
115
|
+
body.attempted_pointer!==null||body.rollback?.attempted!==false||
|
|
116
|
+
!Array.isArray(body.rollback?.errors)||body.rollback.errors.length!==0||
|
|
117
|
+
!/^host command 'powershell_script' executable pin drift detected;/.test(String(body.error?.message??''))||
|
|
118
|
+
!Number.isFinite(failedTime)||failedTime<lockTime||failedTime>observedTime||
|
|
119
|
+
!samePointerIdentity(body.prior_pointer,current))return false;
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
|
|
88
123
|
async function findTerminalOutcome(updatesDir,lock,stateRoot){
|
|
89
124
|
const names=(await readdir(updatesDir)).filter(name=>/^r65-activation-outcome-.*\.json$/.test(name)).sort();
|
|
90
125
|
if(names.length>MAX_OUTCOME_SCAN)throw new Error('activation outcome inventory exceeds safe scan budget');
|
|
@@ -95,7 +130,8 @@ async function findTerminalOutcome(updatesDir,lock,stateRoot){
|
|
|
95
130
|
catch{continue;}
|
|
96
131
|
if(value?.claim_operation_id!==lock.operation_id)continue;
|
|
97
132
|
if(value?.preflight_subject_sha256!==lock.subject_sha256){foreign=true;continue;}
|
|
98
|
-
if(isSafePreMutationReject(value,lock)||await isSafeTerminalActivation(value,lock,stateRoot)
|
|
133
|
+
if(isSafePreMutationReject(value,lock)||await isSafeTerminalActivation(value,lock,stateRoot)||
|
|
134
|
+
await isSafeSignedPreconditionReject(value,lock,stateRoot))matched=true;
|
|
99
135
|
else unknown=true;
|
|
100
136
|
}
|
|
101
137
|
return {matched,foreign,unknown};
|
|
@@ -32,7 +32,7 @@ export function classifyLegacyMigration(input){
|
|
|
32
32
|
if(!input.pointer||input.pointer.version!=='0.15.45'||
|
|
33
33
|
!HEX64.test(String(input.pointer.manifest_sha256??''))||!HEX64.test(String(input.pointer.generation_manifest_sha256??'')))
|
|
34
34
|
return reject('predecessor identity invalid',subject);
|
|
35
|
-
if(!input.candidate||input.candidate.version!=='0.15.
|
|
35
|
+
if(!input.candidate||input.candidate.version!=='0.15.60'||
|
|
36
36
|
!HEX64.test(String(input.candidate.manifest_sha256??''))||!HEX64.test(String(input.candidate.tarball_sha256??'')))
|
|
37
37
|
return reject('candidate identity invalid',subject);
|
|
38
38
|
if(PLANES.some(plane=>!HEX64.test(String(input.policySha256?.[plane]??''))))
|
package/src/deadbyte-cli.mjs
CHANGED
|
@@ -114,7 +114,7 @@ async function reportVersionCoherence(root,{displayMode='ascii'}={}){
|
|
|
114
114
|
writeRemote(process.stderr,`${remoteTag('warn',displayMode)} VERSION SKEW: CLI package ${DEADBYTE_VERSION}; active runtime ${active.version} (${active.release_id})\n`,displayMode);
|
|
115
115
|
return active;
|
|
116
116
|
}
|
|
117
|
-
async function synchronizeForegroundRuntime(ctx,{displayMode='unicode',migrationContext=null}={}){
|
|
117
|
+
async function synchronizeForegroundRuntime(ctx,{displayMode='unicode',migrationContext=null,hostCommandPin=null}={}){
|
|
118
118
|
const packageManifestSha256=createHash('sha256').update(await readFile(path.join(CURRENT_PACKAGE_ROOT,'MANIFEST.SHA256'))).digest('hex');
|
|
119
119
|
return ensureRuntimeCoherence({
|
|
120
120
|
cliVersion:DEADBYTE_VERSION,
|
|
@@ -181,7 +181,8 @@ async function synchronizeForegroundRuntime(ctx,{displayMode='unicode',migration
|
|
|
181
181
|
'-ExpectedTarballSha256',artifactSha256,'-ExpectedManifestSha256',packagedManifestSha256,
|
|
182
182
|
'-ExpectedBootstrapSha256',bootstrapMatch[1],
|
|
183
183
|
'-StdoutPath',stdoutPath,'-StderrPath',stderrPath,
|
|
184
|
-
'-MarkerReceiptPath',migrationContext.receipt_path,'-MarkerReceiptSha256',migrationContext.receipt_sha256
|
|
184
|
+
'-MarkerReceiptPath',migrationContext.receipt_path,'-MarkerReceiptSha256',migrationContext.receipt_sha256,
|
|
185
|
+
...(hostCommandPin?['-HostCommandPin',hostCommandPin]:[])],{
|
|
185
186
|
cwd:CURRENT_PACKAGE_ROOT,env:windowsPowerShellEnvironment(process.env),encoding:'utf8',windowsHide:true,shell:false,
|
|
186
187
|
timeout:REMOTE_UPDATE_TIMEOUT_MS,maxBuffer:16*1024*1024
|
|
187
188
|
});
|
|
@@ -743,7 +744,7 @@ async function releaseRemoteSession(ctx,marker,{displayMode='unicode'}={}){
|
|
|
743
744
|
if(deletePinnedRemoteMarker(remoteSessionMarker(ctx.root),snapshot.sha256)!=='REMOVED')
|
|
744
745
|
throw new Error('remote session ownership marker replaced before native deletion; marker retained');
|
|
745
746
|
}
|
|
746
|
-
async function runRemoteSession({resumeCursor=null,verbose=false,trace=false,filterExpression='',mode='default'}={}){
|
|
747
|
+
async function runRemoteSession({resumeCursor=null,verbose=false,trace=false,filterExpression='',mode='default',hostCommandPin=null}={}){
|
|
747
748
|
const display=prepareRemoteConsole();
|
|
748
749
|
const displayMode=display.mode;
|
|
749
750
|
const ctx=await remoteContext();
|
|
@@ -755,7 +756,7 @@ async function runRemoteSession({resumeCursor=null,verbose=false,trace=false,fil
|
|
|
755
756
|
startupLock.assertHeld();
|
|
756
757
|
const migrationContext=await recoverRemoteSession(ctx,{displayMode});
|
|
757
758
|
startupLock.assertHeld();
|
|
758
|
-
await synchronizeForegroundRuntime(ctx,{displayMode,migrationContext});
|
|
759
|
+
await synchronizeForegroundRuntime(ctx,{displayMode,migrationContext,hostCommandPin});
|
|
759
760
|
startupLock.assertHeld();
|
|
760
761
|
marker=await claimRemoteSession(ctx);
|
|
761
762
|
startupLock.assertHeld();
|
|
@@ -868,12 +869,18 @@ async function runRemoteSession({resumeCursor=null,verbose=false,trace=false,fil
|
|
|
868
869
|
}
|
|
869
870
|
}
|
|
870
871
|
async function runRemote(args){
|
|
871
|
-
let verbose=false,trace=false,filterExpression='',resumeCursor=null,mode='default';
|
|
872
|
+
let verbose=false,trace=false,filterExpression='',resumeCursor=null,mode='default',hostCommandPin=null;
|
|
872
873
|
const positional=[];
|
|
873
874
|
for(let index=0;index<args.length;index++){
|
|
874
875
|
const arg=args[index];
|
|
875
876
|
if(arg==='--verbose'||arg==='-v'){verbose=true;continue;}
|
|
876
877
|
if(arg==='--trace'){trace=true;continue;}
|
|
878
|
+
if(arg==='--host-command-pin'){
|
|
879
|
+
if(hostCommandPin!==null)throw new Error('remote --host-command-pin may be specified once');
|
|
880
|
+
const value=String(args[++index]??'');
|
|
881
|
+
if(!/^powershell_script=[0-9a-f]{64}$/.test(value))throw new Error('remote --host-command-pin requires powershell_script=lowercase_sha256');
|
|
882
|
+
hostCommandPin=value;continue;
|
|
883
|
+
}
|
|
877
884
|
if(['--operator','--desktop','--host','--full'].includes(arg)){
|
|
878
885
|
if(mode!=='default') throw new Error('remote authority modes are mutually exclusive');
|
|
879
886
|
mode=arg.slice(2);continue;
|
|
@@ -890,8 +897,8 @@ async function runRemote(args){
|
|
|
890
897
|
}
|
|
891
898
|
positional.push(arg);
|
|
892
899
|
}
|
|
893
|
-
const presentation=verbose||trace||Boolean(filterExpression)||resumeCursor!==null||mode!=='default';
|
|
894
|
-
if(positional.length===0){await runRemoteSession({resumeCursor,verbose,trace,filterExpression,mode});return;}
|
|
900
|
+
const presentation=verbose||trace||Boolean(filterExpression)||resumeCursor!==null||mode!=='default'||hostCommandPin!==null;
|
|
901
|
+
if(positional.length===0){await runRemoteSession({resumeCursor,verbose,trace,filterExpression,mode,hostCommandPin});return;}
|
|
895
902
|
if(presentation) throw new Error('remote presentation flags are valid only for foreground session');
|
|
896
903
|
if(positional.length>1) throw new Error('remote accepts one controller command');
|
|
897
904
|
const command=positional[0];if(!REMOTE_COMMANDS.has(command)) throw new Error(`unsupported remote command '${command}'`);
|
|
@@ -58,7 +58,7 @@ export function uacReceiptSubject(input){
|
|
|
58
58
|
const candidate=windowsAbsolute(input.candidateRoot,'candidate root');
|
|
59
59
|
if(!candidate.startsWith('c:\\program files\\')||candidate==='c:\\program files\\')
|
|
60
60
|
throw new Error('UAC migration requires a protected candidate installation');
|
|
61
|
-
if(input.candidateVersion!=='0.15.
|
|
61
|
+
if(input.candidateVersion!=='0.15.60')throw new Error('UAC migration candidate identity unsupported');
|
|
62
62
|
const hashes=['candidateManifestSha256','tarballSha256','markerReceiptSha256','predecessorPointerSha256',
|
|
63
63
|
'preflightSubjectSha256','nodeSha256','deployScriptSha256','nonce'];
|
|
64
64
|
for(const key of hashes)if(!HEX64.test(String(input[key]??'')))throw new Error('UAC approval hash/nonce invalid: '+key);
|
package/src/version.mjs
CHANGED
|
@@ -13,15 +13,15 @@ test('R130 security patch has a new immutable package identity and truthful sour
|
|
|
13
13
|
read('SBOM.cdx.json'),read('package-lock.json'),read('TEST-MATRIX.json')]);
|
|
14
14
|
assert.equal(pkg.name,'deadbyte-mcp');
|
|
15
15
|
for(const actual of [pkg.version,release.version,provenance.version,matrix.version,bom.metadata.component.version,lock.version,lock.packages[''].version,DEADBYTE_VERSION])
|
|
16
|
-
assert.equal(actual,'0.15.
|
|
16
|
+
assert.equal(actual,'0.15.60');
|
|
17
17
|
assert.equal(release.train,'R153');
|
|
18
18
|
assert.equal(matrix.train,'R153');
|
|
19
|
-
assert.equal(release.source_predecessor.version,'0.15.
|
|
20
|
-
assert.match(release.source_predecessor.source_path,/0\.15\.
|
|
19
|
+
assert.equal(release.source_predecessor.version,'0.15.59');
|
|
20
|
+
assert.match(release.source_predecessor.source_path,/0\.15\.59/);
|
|
21
21
|
assert.equal(release.runtime_predecessor.version,'0.15.45');
|
|
22
|
-
assert.equal(provenance.source_predecessor_tarball_sha256,'
|
|
23
|
-
assert.equal(provenance.source_predecessor_version,'0.15.
|
|
24
|
-
assert.equal(provenance.source_predecessor_manifest_file_sha256,'
|
|
22
|
+
assert.equal(provenance.source_predecessor_tarball_sha256,'0c20152b8ee553f06f05dfe017f4bd823d30cd50710722e9e0874f0bd6c66c75');
|
|
23
|
+
assert.equal(provenance.source_predecessor_version,'0.15.59');
|
|
24
|
+
assert.equal(provenance.source_predecessor_manifest_file_sha256,'f727be4a63220f4215f18282a1fd89963924a64adcd07747ca3c12d8fb166d86');
|
|
25
25
|
assert.equal(pkg.dependencies['@modelcontextprotocol/client'],'2.3.1');
|
|
26
26
|
assert.equal(pkg.dependencies['@modelcontextprotocol/server'],'2.3.1');
|
|
27
27
|
for(const dep of ['@modelcontextprotocol/client','@modelcontextprotocol/server'])
|
|
@@ -17,12 +17,12 @@ test('R144 package identities, R132 historic evidence and published predecessor
|
|
|
17
17
|
}
|
|
18
18
|
assert.equal(release.train,'R153');
|
|
19
19
|
assert.equal(matrix.train,'R153');
|
|
20
|
-
assert.equal(release.source_predecessor.version,'0.15.
|
|
21
|
-
assert.match(release.source_predecessor.source_path,/0\.15\.
|
|
22
|
-
assert.equal(prov.source_predecessor_version,'0.15.
|
|
23
|
-
assert.equal(prov.source_predecessor_manifest_file_sha256,'
|
|
24
|
-
assert.equal(prov.parent_tarball_sha256,'
|
|
25
|
-
assert.equal(prov.parent_registry_tarball_sha1,'
|
|
20
|
+
assert.equal(release.source_predecessor.version,'0.15.59');
|
|
21
|
+
assert.match(release.source_predecessor.source_path,/0\.15\.59/);
|
|
22
|
+
assert.equal(prov.source_predecessor_version,'0.15.59');
|
|
23
|
+
assert.equal(prov.source_predecessor_manifest_file_sha256,'f727be4a63220f4215f18282a1fd89963924a64adcd07747ca3c12d8fb166d86');
|
|
24
|
+
assert.equal(prov.parent_tarball_sha256,'0c20152b8ee553f06f05dfe017f4bd823d30cd50710722e9e0874f0bd6c66c75');
|
|
25
|
+
assert.equal(prov.parent_registry_tarball_sha1,'04cc1a1e80bcb7062ac39eee6b7bab70edd5d8c3');
|
|
26
26
|
assert.equal(release.runtime_predecessor.version,'0.15.45');
|
|
27
27
|
assert.equal(prov.runtime_predecessor.release_id,release.runtime_predecessor.release_id);
|
|
28
28
|
assert.equal(prov.runtime_predecessor.manifest_sha256,release.runtime_predecessor.manifest_sha256);
|
|
@@ -22,7 +22,7 @@ const planes=['process','coding','autonomous','desktop','host'];
|
|
|
22
22
|
const base=()=>({
|
|
23
23
|
stateRoot:'C:\\Users\\owner\\.deadbyte-mcp',
|
|
24
24
|
pointer:{release_id:'v0.15.45-parent',version:'0.15.45',manifest_sha256:'1'.repeat(64),generation_manifest_sha256:'2'.repeat(64)},
|
|
25
|
-
candidate:{version:'0.15.
|
|
25
|
+
candidate:{version:'0.15.60',manifest_sha256:'3'.repeat(64),tarball_sha256:'4'.repeat(64)},
|
|
26
26
|
observation:{state:'OFFLINE',local_ready:false,bridge:{alive:false},core:{alive:false},cloud:{alive:false},supervisor:{running:false},
|
|
27
27
|
authority:Object.fromEntries(planes.map(plane=>[plane,{configured:true,armed:false,reason:plane==='autonomous'?'unverified':'disarmed'}]))},
|
|
28
28
|
policySha256:Object.fromEntries(planes.map((plane,index)=>[plane,String(index+5).repeat(64)])),
|
|
@@ -55,7 +55,7 @@ test('R153 RED: UAC subject binds candidate, predecessor, policy, marker, state
|
|
|
55
55
|
issuedAt:'2026-10-23T16:00:00.000Z',expiresAt:'2026-10-23T16:10:00.000Z'});
|
|
56
56
|
assert.equal(subject.action,'narrow_legacy_policy_and_activate');
|
|
57
57
|
assert.equal(subject.marker_sha256,HEX);
|
|
58
|
-
assert.equal(subject.candidate.version,'0.15.
|
|
58
|
+
assert.equal(subject.candidate.version,'0.15.60');
|
|
59
59
|
assert.equal(subject.nonce,'b'.repeat(64));
|
|
60
60
|
assert.deepEqual(subject.allowed_authority_after,Object.fromEntries(planes.map(plane=>[plane,false])));
|
|
61
61
|
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import {readFile} from 'node:fs/promises';
|
|
4
|
+
import {spawnSync} from 'node:child_process';
|
|
5
|
+
import {fileURLToPath} from 'node:url';
|
|
6
|
+
const root=new URL('../',import.meta.url);
|
|
7
|
+
const source=async path=>readFile(new URL(path,root),'utf8');
|
|
8
|
+
|
|
9
|
+
test('R60 explicit host-command pin is owner supplied and forwarded end to end',async()=>{
|
|
10
|
+
const [cli,bootstrap,helper,deploy]=await Promise.all([
|
|
11
|
+
source('src/deadbyte-cli.mjs'),source('scripts/bootstrap-uac-migration-r153.ps1'),
|
|
12
|
+
source('scripts/request-uac-migration-r153.ps1'),source('scripts/deploy-r48.mjs')]);
|
|
13
|
+
assert.match(cli,/arg===['"]--host-command-pin['"]/, 'remote CLI must parse a bounded owner-supplied pin');
|
|
14
|
+
assert.match(cli,/hostCommandPin/, 'remote must preserve the parsed pin');
|
|
15
|
+
assert.match(bootstrap,/HostCommandPin/, 'protected UAC bootstrap must receive the owner pin');
|
|
16
|
+
assert.match(helper,/HostCommandPin/, 'protected helper must carry the pin without shell injection');
|
|
17
|
+
assert.match(deploy,/hostCommandPin/, 'deploy must pass pin to R27 before activation');
|
|
18
|
+
assert.match(deploy,/explicit host repin requires the elevated UAC migration/);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
test('R60 malformed, unrelated, and duplicate pins fail before remote context or activation',()=>{
|
|
22
|
+
const cli=fileURLToPath(new URL('../src/deadbyte-cli.mjs',import.meta.url));
|
|
23
|
+
const cases=[['powershell_script=notahash'],['other_command='+'a'.repeat(64)],
|
|
24
|
+
['powershell_script='+'a'.repeat(64),'--host-command-pin','powershell_script='+'b'.repeat(64)]];
|
|
25
|
+
for(const args of cases){
|
|
26
|
+
const p=spawnSync(process.execPath,[cli,'remote','--host-command-pin',...args],{encoding:'utf8',timeout:8000});
|
|
27
|
+
assert.equal(p.status,1,JSON.stringify(args));
|
|
28
|
+
assert.match(p.stderr,/remote --host-command-pin/);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import {createHash,generateKeyPairSync,sign as signBytes} from 'node:crypto';
|
|
4
|
+
import {mkdtemp,mkdir,writeFile,rm} from 'node:fs/promises';
|
|
5
|
+
import os from 'node:os';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import {canonicalJson} from '../src/canonical-json.mjs';
|
|
8
|
+
import {createActivationClaimManager} from '../src/activation-lock-r65.mjs';
|
|
9
|
+
|
|
10
|
+
const sha=buffer=>createHash('sha256').update(buffer).digest('hex');
|
|
11
|
+
const domain=Buffer.from('DEADBYTE-R27-SLOT-UPDATE-V1\0','utf8');
|
|
12
|
+
const now=()=>new Date().toISOString();
|
|
13
|
+
function seal(body,key,pub){
|
|
14
|
+
const payload=Buffer.from(canonicalJson(body));
|
|
15
|
+
const signature=signBytes(null,Buffer.concat([domain,payload]),key).toString('base64');
|
|
16
|
+
const e={body,body_sha256:sha(payload),attestation:{algorithm:'ed25519',domain:'DEADBYTE-R27-SLOT-UPDATE-V1',
|
|
17
|
+
key_id:sha(pub.export({type:'spki',format:'der'})),signature_base64:signature}};
|
|
18
|
+
return {...e,receipt_sha256:sha(Buffer.from(canonicalJson(e)))};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
test('signed R27 initial precondition reject safely reconciles R65 unknown claim',async()=>{
|
|
22
|
+
const root=await mkdtemp(path.join(os.tmpdir(),'deadbyte-r153-precondition-'));
|
|
23
|
+
try{
|
|
24
|
+
const updates=path.join(root,'evidence','updates');
|
|
25
|
+
await mkdir(updates,{recursive:true});await mkdir(path.join(root,'trust'),{recursive:true});
|
|
26
|
+
const {privateKey,publicKey}=generateKeyPairSync('ed25519');
|
|
27
|
+
await writeFile(path.join(root,'trust','ed25519-public.pem'),publicKey.export({type:'spki',format:'pem'}));
|
|
28
|
+
const manager=createActivationClaimManager({stateRoot:root}),claim=await manager.claim('a'.repeat(64));
|
|
29
|
+
const pointer={schema:'deadbyte.active-release.v1',release_id:'predecessor-r153',version:'0.15.45',
|
|
30
|
+
manifest_sha256:'b'.repeat(64),generation_manifest_sha256:'c'.repeat(64)};
|
|
31
|
+
await writeFile(path.join(root,'active-release.json'),JSON.stringify(pointer));
|
|
32
|
+
const dir=path.join(updates,'r27-'+'d'.repeat(16)+'-synthetic');
|
|
33
|
+
await mkdir(dir);
|
|
34
|
+
const failure=seal({schema:'deadbyte.r27-slot-update-failure.v1',update_id:path.basename(dir),
|
|
35
|
+
release_version:'0.15.60',candidate_manifest_sha256:'d'.repeat(64),failed_at_utc:now(),
|
|
36
|
+
result:'PRECONDITION_REJECTED',phase:'initial',error:{name:'Error',message:"host command 'powershell_script' executable pin drift detected; explicit approval required"},
|
|
37
|
+
prior_pointer:pointer,attempted_pointer:null,rollback:{attempted:false,errors:[]}},privateKey,publicKey);
|
|
38
|
+
await writeFile(path.join(dir,'failure-receipt.json'),JSON.stringify(failure));
|
|
39
|
+
await writeFile(path.join(updates,'r65-activation-outcome-test.json'),JSON.stringify({
|
|
40
|
+
schema:'deadbyte.r65-activation-outcome.v1',claim_operation_id:claim.operation_id,
|
|
41
|
+
preflight_subject_sha256:claim.subject_sha256,candidate_version:'0.15.60',
|
|
42
|
+
candidate_manifest_sha256:'d'.repeat(64),predecessor_release_id:pointer.release_id,
|
|
43
|
+
outcome:{state:'ACTIVATION_OUTCOME_UNKNOWN'},update_id:null,continuity_update_id:null,state_path:null,observed_at_utc:now()
|
|
44
|
+
}));
|
|
45
|
+
// A tampered signed envelope must not authorize reclaim.
|
|
46
|
+
const failurePath=path.join(dir,'failure-receipt.json');
|
|
47
|
+
await writeFile(failurePath,JSON.stringify({...failure,body:{...failure.body,phase:'committing'}}));
|
|
48
|
+
await assert.rejects(()=>manager.claim('e'.repeat(64)),/unresolved|in progress/);
|
|
49
|
+
await writeFile(failurePath,JSON.stringify(failure));
|
|
50
|
+
// Even a valid signature cannot authorize reclaim if the live pointer changed.
|
|
51
|
+
await writeFile(path.join(root,'active-release.json'),JSON.stringify({...pointer,release_id:'foreign-runtime'}));
|
|
52
|
+
await assert.rejects(()=>manager.claim('e'.repeat(64)),/unresolved|in progress/);
|
|
53
|
+
await writeFile(path.join(root,'active-release.json'),JSON.stringify(pointer));
|
|
54
|
+
const next=await manager.claim('e'.repeat(64));
|
|
55
|
+
assert.notEqual(next.operation_id,claim.operation_id);
|
|
56
|
+
await next.release();
|
|
57
|
+
}finally{await rm(root,{recursive:true,force:true})}
|
|
58
|
+
});
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import {readFileSync} from 'node:fs';
|
|
4
|
+
import {fileURLToPath} from 'node:url';
|
|
5
|
+
import {spawnSync} from 'node:child_process';
|
|
6
|
+
|
|
7
|
+
const bootstrap=readFileSync(fileURLToPath(new URL('../scripts/bootstrap-uac-migration-r153.ps1',import.meta.url)),'utf8');
|
|
8
|
+
|
|
9
|
+
test('R153 ACL hotfix grants direct leaf read only to Administrators and SYSTEM before rehash',()=>{
|
|
10
|
+
const start=bootstrap.indexOf("R153 protected staging final ACL normalization failed");
|
|
11
|
+
const repair=bootstrap.indexOf("'*S-1-5-32-544:(F)' '*S-1-5-18:(F)' '/T' '/C'");
|
|
12
|
+
const rehash=bootstrap.indexOf('R153 staged package post-ACL verification failed');
|
|
13
|
+
assert.ok(start>=0&&repair>start&&rehash>repair,'ACL repair must follow recursive inheritance stripping and precede independent rehash');
|
|
14
|
+
assert.match(bootstrap,/R153 protected staging leaf ACL restoration failed/);
|
|
15
|
+
assert.doesNotMatch(bootstrap.slice(start,rehash),/S-1-5-32-545:\(F\)|Everyone:\(F\)/);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
test('R153 Windows ACL reproduction rejects stripped leaf ACE and restores direct read', {skip:process.platform!=='win32'},()=>{
|
|
19
|
+
const ps=String.raw`$ErrorActionPreference = 'Stop'
|
|
20
|
+
$root = Join-Path $env:TEMP ('r153-native-acl-test-' + [guid]::NewGuid().ToString('N'))
|
|
21
|
+
$sid = [Security.Principal.WindowsIdentity]::GetCurrent().User.Value
|
|
22
|
+
$leaf = Join-Path $root 'child\file.txt'
|
|
23
|
+
try {
|
|
24
|
+
New-Item -ItemType Directory -Path (Split-Path -Parent $leaf) -Force | Out-Null
|
|
25
|
+
[IO.File]::WriteAllText($leaf,'read-only regression fixture')
|
|
26
|
+
& icacls.exe $root '/inheritance:r' '/grant:r' ('*'+$sid+':(OI)(CI)(F)') '/T' '/C' | Out-Null
|
|
27
|
+
if($LASTEXITCODE -ne 0){throw 'REPRO_SETUP_FAILED'}
|
|
28
|
+
$blocked = Get-FileHash -LiteralPath $leaf -Algorithm SHA256 -ErrorAction SilentlyContinue
|
|
29
|
+
if($null -ne $blocked){throw 'REPRO_DID_NOT_STRIP_LEAF_ACE'}
|
|
30
|
+
& icacls.exe $root '/grant' ('*'+$sid+':(F)') '/T' '/C' | Out-Null
|
|
31
|
+
if($LASTEXITCODE -ne 0){throw 'LEAF_REPAIR_FAILED'}
|
|
32
|
+
$restored = Get-FileHash -LiteralPath $leaf -Algorithm SHA256
|
|
33
|
+
if($null -eq $restored -or $restored.Hash.Length -ne 64){throw 'LEAF_NOT_READABLE_AFTER_REPAIR'}
|
|
34
|
+
$acl = Get-Acl -LiteralPath $leaf
|
|
35
|
+
$allow=@($acl.Access | Where-Object {$_.AccessControlType -eq 'Allow'})
|
|
36
|
+
if($allow.Count -ne 1){throw 'LEAF_HAS_UNEXPECTED_ALLOW_ACE_COUNT'}
|
|
37
|
+
if($allow[0].IdentityReference.Translate([Security.Principal.SecurityIdentifier]).Value -ne $sid){throw 'LEAF_HAS_UNEXPECTED_TRUSTEE'}
|
|
38
|
+
Write-Output 'R153_WIN32_LEAF_ACL_REPAIR_PASS'
|
|
39
|
+
} finally {
|
|
40
|
+
if(Test-Path -LiteralPath $root){Remove-Item -LiteralPath $root -Force -Recurse}
|
|
41
|
+
}`;
|
|
42
|
+
const encoded=Buffer.from(ps,'utf16le').toString('base64');
|
|
43
|
+
const result=spawnSync('powershell.exe',['-NoLogo','-NoProfile','-NonInteractive','-EncodedCommand',encoded],
|
|
44
|
+
{encoding:'utf8',timeout:30000,maxBuffer:256*1024});
|
|
45
|
+
assert.equal(result.status,0,result.stderr||result.stdout||String(result.error));
|
|
46
|
+
assert.match(result.stdout,/R153_WIN32_LEAF_ACL_REPAIR_PASS/);
|
|
47
|
+
});
|
|
@@ -4,7 +4,7 @@ import {createUacApproval,verifyUacApproval,validateApprovalWindow,requireTruste
|
|
|
4
4
|
import {readFileSync} from 'node:fs';
|
|
5
5
|
import {fileURLToPath} from 'node:url';
|
|
6
6
|
const h=(n)=>n.repeat(64);
|
|
7
|
-
const base=()=>({stateRoot:'C:\\Users\\DEADBYTE\\.deadbyte-mcp',candidateRoot:'C:\\Program Files\\DEADBYTE-R153-TEST',candidateVersion:'0.15.
|
|
7
|
+
const base=()=>({stateRoot:'C:\\Users\\DEADBYTE\\.deadbyte-mcp',candidateRoot:'C:\\Program Files\\DEADBYTE-R153-TEST',candidateVersion:'0.15.60',candidateManifestSha256:h('a'),tarballSha256:h('b'),markerReceiptSha256:h('c'),predecessorPointerSha256:h('d'),predecessorPolicySha256:{process:h('1'),coding:h('2'),autonomous:h('3'),desktop:h('4'),host:h('5')},preflightSubjectSha256:h('e'),nodeSha256:h('f'),deployScriptSha256:h('0'),nonce:h('6'),issuedAt:'2026-10-24T00:00:00.000Z',expiresAt:'2026-10-24T00:05:00.000Z'});
|
|
8
8
|
test('R153 UAC receipt carries exact no-grants narrow migration subject',()=>{
|
|
9
9
|
const x=base(),receipt=createUacApproval(x);
|
|
10
10
|
assert.equal(receipt.schema,'deadbyte.r153-uac-approval.v1');
|
|
@@ -31,7 +31,7 @@ test('R153 UAC receipt fails closed on expiration, malformed, replay-like tamper
|
|
|
31
31
|
assert.throws(()=>createUacApproval({...x,issuedAt:'not-a-date'}));
|
|
32
32
|
assert.throws(()=>createUacApproval({...x,nonce:'x'}));
|
|
33
33
|
});
|
|
34
|
-
test('R153 UAC scope only accepts protected root and exact v0.15.
|
|
34
|
+
test('R153 UAC scope only accepts protected root and exact v0.15.60',()=>{
|
|
35
35
|
assert.throws(()=>createUacApproval({...base(),candidateRoot:'C:\\Users\\DEADBYTE\\npm-cache'}),/protected/i);
|
|
36
36
|
assert.throws(()=>createUacApproval({...base(),candidateVersion:'0.15.55'}),/candidate/i);
|
|
37
37
|
assert.throws(()=>validateApprovalWindow('2026-10-24T00:00:00.000Z','2026-10-24T00:00:00.000Z','2026-10-24T00:00:00.000Z'));
|
|
@@ -45,7 +45,7 @@ test('R153 RED: mutable npx entrypoint stages exact registry package before priv
|
|
|
45
45
|
assert.doesNotMatch(script,/npm-cli\.js|npm install/i);
|
|
46
46
|
assert.match(script,/Get-FileHash -LiteralPath \$file -Algorithm SHA256/);
|
|
47
47
|
assert.match(script,/NODE_OPTIONS/);
|
|
48
|
-
assert.match(script,/https:\/\/registry\.npmjs\.org\/deadbyte-mcp\/0\.15\.
|
|
48
|
+
assert.match(script,/https:\/\/registry\.npmjs\.org\/deadbyte-mcp\/0\.15\.60/);
|
|
49
49
|
assert.match(script,/live npm registry tarball SHA-256 mismatch/);
|
|
50
50
|
assert.match(script,/live npm registry tarball integrity mismatch/);
|
|
51
51
|
assert.match(script,/DEADBYTE-R153-Stage-/);
|
|
@@ -54,6 +54,7 @@ test('R153 RED: mutable npx entrypoint stages exact registry package before priv
|
|
|
54
54
|
assert.match(script,/'\/inheritance:r'/);
|
|
55
55
|
assert.match(script,/verify-protected-stage-r153\.mjs/);
|
|
56
56
|
assert.match(script,/request-uac-migration-r153\.ps1/);
|
|
57
|
-
assert.match(script
|
|
57
|
+
assert.match(script,/\$helperArgs\s*=\s*@\('-Elevated'/);
|
|
58
|
+
assert.match(script,/& \$helper @helperArgs/);
|
|
58
59
|
assert.match(script,/Remove-Item -LiteralPath \$prefix -Recurse -Force/);
|
|
59
60
|
});
|
|
@@ -83,7 +83,7 @@ test('R72 compact baseline permits only R64 read offset and authorized coding-on
|
|
|
83
83
|
assert.deepEqual(diff.added,[]);
|
|
84
84
|
assert.deepEqual(diff.removed,[]);
|
|
85
85
|
const packageVersion=JSON.parse(await readFile(path.join(repoRoot,'package.json'),'utf8')).version;
|
|
86
|
-
if(['0.15.41','0.15.42','0.15.43','0.15.44','0.15.45','0.15.46','0.15.47','0.15.48','0.15.49','0.15.50','0.15.51','0.15.52','0.15.53','0.15.54','0.15.55','0.15.56','0.15.57','0.15.58'].includes(packageVersion)){
|
|
86
|
+
if(['0.15.41','0.15.42','0.15.43','0.15.44','0.15.45','0.15.46','0.15.47','0.15.48','0.15.49','0.15.50','0.15.51','0.15.52','0.15.53','0.15.54','0.15.55','0.15.56','0.15.57','0.15.58','0.15.59','0.15.60'].includes(packageVersion)){
|
|
87
87
|
assert.deepEqual([...diff.schema_changed].sort(),['machine_fs','native_diff_preview']);
|
|
88
88
|
assert.equal(diff.unchanged.length,41);
|
|
89
89
|
const prior=baseline.tools.find(tool=>tool.name==='machine_fs');
|