machine-bridge-mcp 3.0.0-beta.17 → 3.0.0-beta.173

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (563) hide show
  1. package/CHANGELOG.md +10 -1056
  2. package/README.md +71 -28
  3. package/SECURITY.md +40 -15
  4. package/SUPPORT.md +1 -1
  5. package/bin/machine-mcp.mjs +2 -1
  6. package/browser-extension/broker-auth.js +83 -0
  7. package/browser-extension/broker-liveness.js +35 -0
  8. package/browser-extension/browser-error-boundary.js +96 -0
  9. package/browser-extension/browser-operations.js +1456 -101
  10. package/browser-extension/devtools-input.js +195 -34
  11. package/browser-extension/devtools-observation.js +429 -0
  12. package/browser-extension/devtools-session.js +48 -0
  13. package/browser-extension/manifest.json +2 -2
  14. package/browser-extension/page-automation.js +578 -118
  15. package/browser-extension/pairing-bootstrap.js +42 -0
  16. package/browser-extension/pairing.js +28 -12
  17. package/browser-extension/service-worker.js +102 -101
  18. package/docs/AGENT_CONTEXT.md +13 -10
  19. package/docs/AUDIT.md +19 -541
  20. package/docs/CLIENTS.md +19 -6
  21. package/docs/COMPUTER_USE.md +297 -0
  22. package/docs/GETTING_STARTED.md +14 -17
  23. package/docs/LOCAL_AUTHORIZATION.md +3 -3
  24. package/docs/LOCAL_AUTOMATION.md +28 -22
  25. package/docs/LOGGING.md +36 -23
  26. package/docs/MANAGED_JOBS.md +54 -10
  27. package/docs/MULTI_ACCOUNT.md +13 -11
  28. package/docs/OPERATIONS.md +136 -49
  29. package/docs/OVERVIEW.md +13 -9
  30. package/docs/POLICY_REFERENCE.md +71 -3
  31. package/docs/PRIVACY.md +56 -6
  32. package/docs/THREAT_MODEL.md +46 -20
  33. package/docs/TOOL_REFERENCE.md +686 -63
  34. package/docs/UPGRADING.md +53 -89
  35. package/native/macos/MachineBridgeBackgroundInput.swift +1051 -0
  36. package/native/macos/MachineBridgeBackgroundInputSmokeFixture.swift +295 -0
  37. package/package.json +123 -25
  38. package/scripts/accepted-candidate-tarball.mjs +115 -0
  39. package/scripts/candidate-runtime-store.mjs +64 -9
  40. package/scripts/consumer-package-security.mjs +293 -0
  41. package/scripts/coverage-generation.mjs +41 -0
  42. package/scripts/foreground-daemon-recovery.mjs +88 -0
  43. package/scripts/github-backlog.mjs +43 -12
  44. package/scripts/github-push.mjs +58 -23
  45. package/scripts/github-release-asset.mjs +58 -0
  46. package/scripts/github-release.mjs +249 -144
  47. package/scripts/global-package-installation.mjs +68 -0
  48. package/scripts/hardened-npm-session.mjs +42 -0
  49. package/scripts/install-published-prerelease.mjs +109 -77
  50. package/scripts/local-release-acceptance.mjs +89 -42
  51. package/scripts/network-retry.mjs +8 -1
  52. package/scripts/npm-global-prefix.mjs +27 -0
  53. package/scripts/npm-publication-policy.mjs +2 -1
  54. package/scripts/persistent-activation-process.mjs +101 -0
  55. package/scripts/prerelease-activation.mjs +97 -16
  56. package/scripts/privacy-check.mjs +22 -14
  57. package/scripts/promotion-digest.mjs +10 -3
  58. package/scripts/publish-npm.mjs +313 -19
  59. package/scripts/published-release.mjs +65 -20
  60. package/scripts/release-acceptance.mjs +42 -63
  61. package/scripts/release-browser-extension-store.mjs +172 -0
  62. package/scripts/release-candidate-manifest.mjs +12 -0
  63. package/scripts/release-diagnostic.mjs +41 -0
  64. package/scripts/release-oauth-canary-core.mjs +325 -0
  65. package/scripts/release-oauth-canary-evidence.mjs +100 -0
  66. package/scripts/release-oauth-canary.mjs +127 -0
  67. package/scripts/release-publication-guard.mjs +50 -0
  68. package/scripts/release-soak.mjs +67 -20
  69. package/scripts/release-state.mjs +1 -1
  70. package/scripts/sbom-check.mjs +106 -0
  71. package/scripts/source-dependency-tree.mjs +21 -0
  72. package/scripts/start-release-candidate.mjs +199 -83
  73. package/scripts/verification-state.mjs +108 -0
  74. package/src/local/account-access.mjs +7 -1
  75. package/src/local/account-admin-response.mjs +92 -0
  76. package/src/local/account-admin.mjs +20 -5
  77. package/src/local/agent-context-projection.mjs +26 -7
  78. package/src/local/agent-context.mjs +44 -8
  79. package/src/local/agent-skill-discovery.mjs +16 -5
  80. package/src/local/app-automation-macos-jxa.mjs +350 -0
  81. package/src/local/app-automation.mjs +865 -160
  82. package/src/local/application-capability-projection.mjs +24 -0
  83. package/src/local/atomic-fs.mjs +31 -3
  84. package/src/local/autostart-log-maintenance.mjs +36 -0
  85. package/src/local/browser-bridge-http.mjs +1 -2
  86. package/src/local/browser-bridge.mjs +101 -27
  87. package/src/local/browser-broker-auth-http.mjs +67 -0
  88. package/src/local/browser-broker-auth.mjs +98 -0
  89. package/src/local/browser-broker-routes.mjs +60 -21
  90. package/src/local/browser-broker-server.mjs +20 -7
  91. package/src/local/browser-command.mjs +79 -30
  92. package/src/local/browser-computer-observation-service.mjs +216 -0
  93. package/src/local/browser-extension-identity.mjs +1 -1
  94. package/src/local/browser-extension-path.mjs +22 -0
  95. package/src/local/browser-extension-protocol.mjs +43 -9
  96. package/src/local/browser-operation-service.mjs +137 -117
  97. package/src/local/browser-pairing-grant.mjs +109 -0
  98. package/src/local/browser-pairing-http.mjs +2 -2
  99. package/src/local/browser-pairing-launch.mjs +58 -0
  100. package/src/local/browser-pairing-store.mjs +50 -23
  101. package/src/local/browser-request-registry.mjs +40 -14
  102. package/src/local/browser-request-settlement.mjs +78 -0
  103. package/src/local/browser-resource-input.mjs +74 -0
  104. package/src/local/browser-trusted-input-health.mjs +63 -0
  105. package/src/local/call-authority.mjs +21 -0
  106. package/src/local/call-capacity.mjs +45 -0
  107. package/src/local/call-registry-drain.mjs +54 -0
  108. package/src/local/call-registry.mjs +30 -15
  109. package/src/local/capability-observer.mjs +5 -0
  110. package/src/local/capability-ranking.mjs +3 -2
  111. package/src/local/child-process-settlement.mjs +132 -0
  112. package/src/local/cli-account-admin.mjs +5 -5
  113. package/src/local/cli-activate.mjs +88 -12
  114. package/src/local/cli-idle-sleep.mjs +15 -0
  115. package/src/local/cli-local-admin.mjs +33 -38
  116. package/src/local/cli-options.mjs +9 -9
  117. package/src/local/cli-ready-output.mjs +52 -0
  118. package/src/local/cli-service.mjs +56 -6
  119. package/src/local/cli.mjs +156 -129
  120. package/src/local/computer-use-application-observation.mjs +224 -0
  121. package/src/local/computer-use-arguments.mjs +270 -0
  122. package/src/local/computer-use-deadline.mjs +50 -0
  123. package/src/local/computer-use-dispatch-settlement.mjs +40 -0
  124. package/src/local/computer-use-expectation.mjs +171 -0
  125. package/src/local/computer-use-observation-contract.mjs +89 -0
  126. package/src/local/computer-use-observation.mjs +769 -0
  127. package/src/local/computer-use-recovery.mjs +82 -0
  128. package/src/local/computer-use-result-budget.mjs +145 -0
  129. package/src/local/computer-use-snapshot-store.mjs +67 -0
  130. package/src/local/computer-use.mjs +2160 -0
  131. package/src/local/daemon-http-relay-auth.mjs +26 -0
  132. package/src/local/daemon-http-relay-connection.mjs +392 -0
  133. package/src/local/daemon-http-relay-request.mjs +65 -0
  134. package/src/local/daemon-http-relay-sequence.mjs +49 -0
  135. package/src/local/daemon-process.mjs +54 -16
  136. package/src/local/delegated-process-sandbox.mjs +3 -2
  137. package/src/local/device-identity.mjs +12 -12
  138. package/src/local/device-root-provider.mjs +7 -7
  139. package/src/local/directory-metadata.mjs +47 -0
  140. package/src/local/doctor-reporting.mjs +23 -0
  141. package/src/local/durable-process-initial-settlement.mjs +40 -0
  142. package/src/local/durable-process-spec.mjs +80 -0
  143. package/src/local/errors.mjs +0 -12
  144. package/src/local/exclusive-file.mjs +82 -29
  145. package/src/local/exclusive-publication-recovery.mjs +70 -0
  146. package/src/local/execution-limits.mjs +9 -0
  147. package/src/local/execution-routing.mjs +276 -0
  148. package/src/local/execution-surface.mjs +23 -0
  149. package/src/local/file-mutation-coordinator.mjs +47 -0
  150. package/src/local/file-snapshot-preservation.mjs +24 -0
  151. package/src/local/filesystem-identity.mjs +54 -0
  152. package/src/local/fixed-process-environment.mjs +21 -0
  153. package/src/local/full-access-test.mjs +41 -18
  154. package/src/local/git-commit.mjs +69 -0
  155. package/src/local/git-config-safety.mjs +55 -0
  156. package/src/local/git-log-parser.mjs +41 -0
  157. package/src/local/git-metadata-boundary.mjs +77 -0
  158. package/src/local/git-metadata-tree-safety.mjs +59 -0
  159. package/src/local/git-operation-state.mjs +19 -0
  160. package/src/local/git-service.mjs +155 -21
  161. package/src/local/hardened-npm-download-timeout.mjs +46 -0
  162. package/src/local/hardened-npm-download.mjs +109 -0
  163. package/src/local/hardened-npm-extract.mjs +20 -0
  164. package/src/local/hardened-npm-verification.mjs +104 -0
  165. package/src/local/hardened-npm.mjs +199 -0
  166. package/src/local/hosted-file-read-budget.mjs +53 -0
  167. package/src/local/idle-sleep-mode.mjs +9 -0
  168. package/src/local/job-runner.mjs +280 -133
  169. package/src/local/lifecycle.mjs +6 -0
  170. package/src/local/log.mjs +5 -6
  171. package/src/local/macos-background-input.mjs +398 -0
  172. package/src/local/macos-idle-sleep-assertion.mjs +79 -0
  173. package/src/local/macos-idle-sleep-recovery.mjs +52 -0
  174. package/src/local/macos-trust-broker.mjs +113 -29
  175. package/src/local/managed-job-acceptance.mjs +30 -0
  176. package/src/local/managed-job-active-child.mjs +152 -0
  177. package/src/local/managed-job-activity.mjs +27 -0
  178. package/src/local/managed-job-cancellation.mjs +42 -0
  179. package/src/local/managed-job-capacity.mjs +17 -0
  180. package/src/local/managed-job-dependencies.mjs +180 -0
  181. package/src/local/managed-job-dependency-admission.mjs +44 -0
  182. package/src/local/managed-job-dependency-metadata.mjs +16 -0
  183. package/src/local/managed-job-dependency-retention.mjs +31 -0
  184. package/src/local/managed-job-directory-generation.mjs +60 -0
  185. package/src/local/managed-job-directory.mjs +77 -0
  186. package/src/local/managed-job-durable-process.mjs +50 -0
  187. package/src/local/managed-job-hosted-reconcile.mjs +16 -0
  188. package/src/local/managed-job-hosted-status.mjs +35 -0
  189. package/src/local/managed-job-idempotency.mjs +29 -0
  190. package/src/local/managed-job-listing.mjs +57 -0
  191. package/src/local/managed-job-lock.mjs +30 -14
  192. package/src/local/managed-job-output-redaction.mjs +47 -0
  193. package/src/local/managed-job-plan-integrity.mjs +13 -0
  194. package/src/local/managed-job-plan.mjs +66 -13
  195. package/src/local/managed-job-projection.mjs +29 -19
  196. package/src/local/managed-job-read-policy.mjs +39 -0
  197. package/src/local/managed-job-read-wait.mjs +65 -0
  198. package/src/local/managed-job-recovery-listing.mjs +27 -0
  199. package/src/local/managed-job-relaunch.mjs +52 -0
  200. package/src/local/managed-job-resource-context.mjs +17 -0
  201. package/src/local/managed-job-retention-policy.mjs +54 -0
  202. package/src/local/managed-job-retention.mjs +125 -0
  203. package/src/local/managed-job-runner-claim.mjs +102 -0
  204. package/src/local/managed-job-runner-exit-recovery.mjs +48 -0
  205. package/src/local/managed-job-runner-liveness.mjs +35 -0
  206. package/src/local/managed-job-runner.mjs +27 -31
  207. package/src/local/managed-job-state-validation.mjs +26 -0
  208. package/src/local/managed-job-storage.mjs +20 -5
  209. package/src/local/managed-job-terminal-maintenance.mjs +47 -0
  210. package/src/local/managed-job-terminal.mjs +14 -1
  211. package/src/local/managed-job-transient-recovery-capacity.mjs +141 -0
  212. package/src/local/managed-job-transient-recovery.mjs +30 -0
  213. package/src/local/managed-jobs.mjs +427 -357
  214. package/src/local/network-proxy.mjs +38 -2
  215. package/src/local/npm-cli.mjs +42 -0
  216. package/src/local/npm-environment.mjs +37 -0
  217. package/src/local/numbers.mjs +6 -0
  218. package/src/local/operation-authorization.mjs +38 -130
  219. package/src/local/operation-risk.mjs +25 -6
  220. package/src/local/owner-state-lock.mjs +43 -18
  221. package/src/local/package-identity.mjs +9 -0
  222. package/src/local/patch.mjs +20 -18
  223. package/src/local/path-inspection.mjs +23 -0
  224. package/src/local/private-toolchain-integrity.mjs +54 -0
  225. package/src/local/process-error-message.mjs +6 -0
  226. package/src/local/process-execution.mjs +78 -80
  227. package/src/local/process-foreground-timeout.mjs +50 -0
  228. package/src/local/process-identity.mjs +97 -7
  229. package/src/local/process-lock-read-retry.mjs +15 -0
  230. package/src/local/process-nonreplayable-settlement.mjs +50 -0
  231. package/src/local/process-result-projection.mjs +22 -0
  232. package/src/local/process-session-events.mjs +42 -0
  233. package/src/local/process-session-read.mjs +65 -0
  234. package/src/local/process-session-remote-activity.mjs +10 -0
  235. package/src/local/process-session-remote-poll.mjs +37 -0
  236. package/src/local/process-session-termination.mjs +73 -0
  237. package/src/local/process-sessions.mjs +132 -123
  238. package/src/local/process-tracker.mjs +113 -10
  239. package/src/local/process-tree-force-settlement.mjs +44 -0
  240. package/src/local/process-tree-ownership-types.d.ts +37 -0
  241. package/src/local/process-tree-ownership.mjs +38 -40
  242. package/src/local/process-tree-signal.mjs +34 -0
  243. package/src/local/process-tree-snapshot.mjs +77 -0
  244. package/src/local/process-tree-supervisor.mjs +69 -0
  245. package/src/local/process-tree.mjs +9 -54
  246. package/src/local/project-metadata.mjs +19 -6
  247. package/src/local/relay-call-recovery.mjs +75 -57
  248. package/src/local/relay-connect-timing.mjs +66 -0
  249. package/src/local/relay-connection-classification.mjs +142 -0
  250. package/src/local/relay-connection-support.mjs +100 -0
  251. package/src/local/relay-connection.mjs +194 -286
  252. package/src/local/relay-diagnostics.mjs +94 -6
  253. package/src/local/relay-heartbeat-options.mjs +16 -0
  254. package/src/local/relay-heartbeat-stall.mjs +47 -0
  255. package/src/local/relay-heartbeat-transport-state.mjs +30 -0
  256. package/src/local/relay-heartbeat.mjs +115 -0
  257. package/src/local/relay-inbound-state.mjs +41 -0
  258. package/src/local/relay-liveness-actions.mjs +66 -0
  259. package/src/local/relay-liveness.mjs +107 -0
  260. package/src/local/relay-peer-diagnostics.mjs +140 -0
  261. package/src/local/relay-probe-deadline.mjs +44 -0
  262. package/src/local/relay-probe-dispatch-metrics.mjs +22 -0
  263. package/src/local/relay-probe-dispatch.mjs +38 -0
  264. package/src/local/relay-reconnect.mjs +40 -0
  265. package/src/local/relay-recovery-admission.mjs +19 -0
  266. package/src/local/relay-recovery-capacity.mjs +29 -0
  267. package/src/local/relay-recovery-diagnostics.mjs +28 -0
  268. package/src/local/relay-redelivery-safety.mjs +43 -0
  269. package/src/local/relay-result-retention.mjs +66 -0
  270. package/src/local/relay-tool-schema-extension.mjs +31 -0
  271. package/src/local/relay-transport-confirmation.mjs +79 -0
  272. package/src/local/relay-transport-error-state.mjs +48 -0
  273. package/src/local/relay-transport-probe-send.mjs +27 -0
  274. package/src/local/relay-transport-probe.mjs +26 -0
  275. package/src/local/release-runtime-lock.mjs +18 -0
  276. package/src/local/remote-activity-idle-sleep-guard.mjs +79 -0
  277. package/src/local/remote-activity-idle-sleep-timeline.mjs +33 -0
  278. package/src/local/remote-configuration.mjs +2 -2
  279. package/src/local/remote-idle-sleep-assertions.mjs +41 -0
  280. package/src/local/resilient-relay-connection.mjs +212 -0
  281. package/src/local/resource-admission-diagnostic-error.mjs +21 -0
  282. package/src/local/resource-admission-diagnostics.mjs +50 -0
  283. package/src/local/resource-admission-policy.mjs +115 -0
  284. package/src/local/resource-admission.mjs +332 -0
  285. package/src/local/resource-build-root.mjs +83 -0
  286. package/src/local/resource-cargo-concurrency.mjs +38 -0
  287. package/src/local/resource-cmake-concurrency.mjs +42 -0
  288. package/src/local/resource-command-concurrency.mjs +37 -0
  289. package/src/local/resource-command-profile.mjs +176 -0
  290. package/src/local/resource-coordinator-accounting.mjs +21 -0
  291. package/src/local/resource-cpu-window.mjs +20 -0
  292. package/src/local/resource-disk-headroom.mjs +13 -0
  293. package/src/local/resource-elastic-memory.mjs +19 -0
  294. package/src/local/resource-elastic-request.mjs +36 -0
  295. package/src/local/resource-foreground-wait.mjs +29 -0
  296. package/src/local/resource-go-concurrency.mjs +43 -0
  297. package/src/local/resource-gradle-concurrency.mjs +57 -0
  298. package/src/local/resource-host-cache.mjs +39 -0
  299. package/src/local/resource-host-darwin.mjs +44 -0
  300. package/src/local/resource-host-linux.mjs +35 -0
  301. package/src/local/resource-host-sample-file.mjs +7 -0
  302. package/src/local/resource-host-snapshot.mjs +81 -0
  303. package/src/local/resource-lease-accounting.mjs +119 -0
  304. package/src/local/resource-lease-liveness.mjs +31 -0
  305. package/src/local/resource-legacy-staging-recovery.mjs +71 -0
  306. package/src/local/resource-light-command.mjs +19 -0
  307. package/src/local/resource-make-concurrency.mjs +42 -0
  308. package/src/local/resource-maven-concurrency.mjs +38 -0
  309. package/src/local/resource-ninja-command-concurrency.mjs +20 -0
  310. package/src/local/resource-ninja-concurrency.mjs +28 -0
  311. package/src/local/resource-operations.mjs +26 -10
  312. package/src/local/resource-pressure.mjs +86 -0
  313. package/src/local/resource-probe-command.mjs +27 -0
  314. package/src/local/resource-process-admission.mjs +59 -0
  315. package/src/local/resource-process-ancestry-cache.mjs +34 -0
  316. package/src/local/resource-process-ancestry.mjs +26 -0
  317. package/src/local/resource-process-priority.mjs +15 -0
  318. package/src/local/resource-project-key.mjs +53 -0
  319. package/src/local/resource-pytest-concurrency.mjs +33 -0
  320. package/src/local/resource-release-control-classification.mjs +14 -0
  321. package/src/local/resource-release-control-executable.mjs +70 -0
  322. package/src/local/resource-release-control-workspace.mjs +41 -0
  323. package/src/local/resource-request-contract.mjs +30 -0
  324. package/src/local/resource-script-classification.mjs +44 -0
  325. package/src/local/resource-shell-analysis.mjs +58 -0
  326. package/src/local/resource-staging-recovery.mjs +87 -0
  327. package/src/local/resource-state-file.mjs +22 -0
  328. package/src/local/resource-swift-concurrency.mjs +31 -0
  329. package/src/local/resource-transaction-lock.mjs +117 -0
  330. package/src/local/resource-wait.mjs +48 -0
  331. package/src/local/resource-waiter-diagnostics.mjs +42 -0
  332. package/src/local/resource-waiters.mjs +139 -0
  333. package/src/local/resource-xcode-command.mjs +7 -0
  334. package/src/local/resource-xcode-concurrency.mjs +34 -0
  335. package/src/local/resource-xcode-non-build.mjs +19 -0
  336. package/src/local/runtime-activation.mjs +594 -33
  337. package/src/local/runtime-activity-projection.mjs +48 -0
  338. package/src/local/runtime-application-automation.mjs +26 -0
  339. package/src/local/runtime-capabilities.mjs +48 -15
  340. package/src/local/runtime-device-session.mjs +111 -0
  341. package/src/local/runtime-diagnostic-projection.mjs +43 -0
  342. package/src/local/runtime-diagnostic-state.mjs +34 -0
  343. package/src/local/runtime-diagnostics.mjs +29 -22
  344. package/src/local/runtime-info-projection.mjs +65 -0
  345. package/src/local/runtime-info-relay-projection.mjs +22 -0
  346. package/src/local/runtime-package-identity.mjs +61 -0
  347. package/src/local/runtime-paths.mjs +2 -1
  348. package/src/local/runtime-process-routing.mjs +37 -0
  349. package/src/local/runtime-relay-acknowledgements.mjs +17 -0
  350. package/src/local/runtime-relay-connection-options.mjs +46 -0
  351. package/src/local/runtime-relay-control.mjs +95 -0
  352. package/src/local/runtime-relay-shutdown-drain.mjs +53 -0
  353. package/src/local/runtime-relay.mjs +26 -48
  354. package/src/local/runtime-reporting.mjs +39 -22
  355. package/src/local/runtime-resource-service.mjs +3 -3
  356. package/src/local/runtime-tool-handlers.mjs +19 -5
  357. package/src/local/runtime.mjs +180 -144
  358. package/src/local/secure-file.mjs +71 -22
  359. package/src/local/security-audit-activity.mjs +73 -0
  360. package/src/local/security-audit-dispatch.mjs +35 -0
  361. package/src/local/security-audit-log.mjs +181 -170
  362. package/src/local/security-audit-state.mjs +139 -0
  363. package/src/local/security-audit-storage.mjs +137 -0
  364. package/src/local/security-audit-warning.mjs +31 -0
  365. package/src/local/security-audit-worker.mjs +87 -0
  366. package/src/local/service-convergence.mjs +28 -3
  367. package/src/local/service-definition.mjs +24 -0
  368. package/src/local/service-environment.mjs +20 -10
  369. package/src/local/service-owner.mjs +146 -0
  370. package/src/local/service-restart-handoff.mjs +22 -8
  371. package/src/local/service-restartability.mjs +20 -0
  372. package/src/local/service-runtime-convergence.mjs +52 -0
  373. package/src/local/service-runtime.mjs +105 -0
  374. package/src/local/service-status.mjs +21 -8
  375. package/src/local/service.mjs +292 -85
  376. package/src/local/shell.mjs +84 -36
  377. package/src/local/short-identifiers.mjs +4 -0
  378. package/src/local/ssh-key.mjs +158 -42
  379. package/src/local/state-inventory.mjs +32 -24
  380. package/src/local/state-owner-lock-inventory.mjs +23 -0
  381. package/src/local/state-root-owned-namespaces.mjs +83 -0
  382. package/src/local/state-root-retirement.mjs +89 -0
  383. package/src/local/state.mjs +256 -89
  384. package/src/local/stdio.mjs +92 -67
  385. package/src/local/support-state-projection.mjs +30 -0
  386. package/src/local/system-network-route.mjs +76 -0
  387. package/src/local/system-sleep-diagnostics.mjs +186 -0
  388. package/src/local/systemd-removal.mjs +20 -0
  389. package/src/local/tool-executor.mjs +52 -37
  390. package/src/local/toolchain-operation-lock.mjs +41 -0
  391. package/src/local/tools.mjs +6 -5
  392. package/src/local/windows-service-convergence.mjs +49 -0
  393. package/src/local/windows-service.mjs +44 -57
  394. package/src/local/worker-deployment-fingerprint.mjs +102 -0
  395. package/src/local/worker-deployment.mjs +47 -58
  396. package/src/local/worker-health.mjs +26 -6
  397. package/src/local/worker-secret-file.mjs +35 -15
  398. package/src/local/workspace-file-service.mjs +141 -228
  399. package/src/local/workspace-file-transaction.mjs +189 -0
  400. package/src/local/workspace-search.mjs +55 -0
  401. package/src/local/wrangler-toolchain/package-lock.json +1505 -0
  402. package/src/local/wrangler-toolchain/package.json +23 -0
  403. package/src/local/wrangler-toolchain-verification.mjs +135 -0
  404. package/src/local/wrangler-toolchain.mjs +188 -0
  405. package/src/shared/access-contract.json +7 -1
  406. package/src/shared/activation-recovery.mjs +49 -0
  407. package/src/shared/authority-revocation.d.mts +9 -0
  408. package/src/shared/authority-revocation.mjs +28 -0
  409. package/src/shared/daemon-auth.d.mts +11 -0
  410. package/src/shared/daemon-auth.mjs +17 -0
  411. package/src/shared/foreground-timeout.d.mts +15 -0
  412. package/src/shared/foreground-timeout.mjs +70 -0
  413. package/src/shared/log-redaction.d.mts +2 -0
  414. package/src/shared/log-redaction.mjs +30 -14
  415. package/src/shared/mcp-protocol.d.mts +29 -0
  416. package/src/shared/mcp-protocol.mjs +300 -0
  417. package/src/shared/project-overview-projection.d.mts +4 -0
  418. package/src/shared/project-overview-projection.mjs +96 -0
  419. package/src/shared/relay-contract.json +45 -7
  420. package/src/shared/result-projection.d.mts +2 -1
  421. package/src/shared/result-projection.mjs +13 -2
  422. package/src/shared/sensitive-value-patterns.mjs +21 -0
  423. package/src/shared/server-metadata.json +16 -10
  424. package/src/shared/tool-argument-validation.d.mts +17 -0
  425. package/src/shared/tool-argument-validation.mjs +325 -0
  426. package/src/shared/tool-call-capacity.d.mts +41 -0
  427. package/src/shared/tool-call-capacity.mjs +59 -0
  428. package/src/shared/tool-catalog.json +659 -60
  429. package/src/worker/access.ts +12 -0
  430. package/src/worker/account-admin.ts +32 -11
  431. package/src/worker/authority-revocations.ts +174 -0
  432. package/src/worker/authority.ts +29 -2
  433. package/src/worker/daemon-auth.ts +5 -2
  434. package/src/worker/daemon-channel.ts +36 -0
  435. package/src/worker/daemon-http-auth.ts +63 -0
  436. package/src/worker/daemon-http-channel.ts +120 -0
  437. package/src/worker/daemon-http-controller.ts +165 -0
  438. package/src/worker/daemon-http-protocol.ts +67 -0
  439. package/src/worker/daemon-http-registry.ts +82 -0
  440. package/src/worker/daemon-last-observation.ts +30 -0
  441. package/src/worker/daemon-liveness.ts +8 -6
  442. package/src/worker/daemon-planned-drain.ts +28 -0
  443. package/src/worker/daemon-ready-dispatch.ts +23 -0
  444. package/src/worker/daemon-ready-messages.ts +76 -0
  445. package/src/worker/daemon-ready-waiter-policy.ts +55 -0
  446. package/src/worker/daemon-ready-waiter-state.ts +53 -0
  447. package/src/worker/daemon-ready-waiters.ts +62 -0
  448. package/src/worker/daemon-recovery-budget.ts +21 -0
  449. package/src/worker/daemon-registry.ts +69 -0
  450. package/src/worker/daemon-relay-diagnostics.ts +329 -0
  451. package/src/worker/daemon-socket-attachment.ts +57 -0
  452. package/src/worker/daemon-sockets.ts +56 -52
  453. package/src/worker/daemon-status.ts +38 -0
  454. package/src/worker/dpop.ts +11 -5
  455. package/src/worker/durable-process-timeout.ts +29 -0
  456. package/src/worker/errors.ts +67 -0
  457. package/src/worker/hosted-browser-target-schema.ts +31 -0
  458. package/src/worker/hosted-result-budget.ts +28 -0
  459. package/src/worker/http.ts +81 -26
  460. package/src/worker/index.ts +438 -448
  461. package/src/worker/managed-job-capability.ts +61 -0
  462. package/src/worker/managed-job-hosted-authority.ts +126 -0
  463. package/src/worker/managed-job-hosted-schema.ts +64 -0
  464. package/src/worker/managed-job-read-timeout.ts +37 -0
  465. package/src/worker/mcp-access.ts +13 -2
  466. package/src/worker/mcp-controller.ts +219 -0
  467. package/src/worker/mcp-http-accept.ts +11 -0
  468. package/src/worker/mcp-http-contract.ts +322 -0
  469. package/src/worker/mcp-job-monitor-claims.ts +94 -0
  470. package/src/worker/mcp-job-monitor-status.ts +28 -0
  471. package/src/worker/mcp-job-monitor-store.ts +149 -0
  472. package/src/worker/mcp-job-monitor-tools.ts +89 -0
  473. package/src/worker/mcp-job-monitor-ui.ts +129 -0
  474. package/src/worker/mcp-jsonrpc.ts +11 -29
  475. package/src/worker/mcp-removed-protocol.ts +17 -0
  476. package/src/worker/mcp-request-cancellation.ts +112 -0
  477. package/src/worker/mcp-response-cancel.ts +25 -0
  478. package/src/worker/mcp-response-proxy.ts +130 -0
  479. package/src/worker/mcp-response-stream.ts +50 -0
  480. package/src/worker/mcp-stale-schema-compat.ts +129 -0
  481. package/src/worker/mcp-stream-proxy-contract.ts +48 -0
  482. package/src/worker/mcp-streamed-tool-response.ts +19 -0
  483. package/src/worker/mcp-subscription-capacity.ts +47 -0
  484. package/src/worker/mcp-subscription-contract.ts +6 -0
  485. package/src/worker/mcp-subscription-registry.ts +122 -0
  486. package/src/worker/mcp-subscription-stream.ts +69 -0
  487. package/src/worker/mcp-tool-call-input.ts +23 -0
  488. package/src/worker/nonce-store.ts +32 -30
  489. package/src/worker/oauth-authorization-page.ts +21 -1
  490. package/src/worker/oauth-client-admin.ts +14 -7
  491. package/src/worker/oauth-client-contract.ts +38 -0
  492. package/src/worker/oauth-controller.ts +57 -46
  493. package/src/worker/oauth-field-contract.ts +31 -0
  494. package/src/worker/oauth-record-contract.ts +7 -0
  495. package/src/worker/oauth-refresh-authority.ts +27 -0
  496. package/src/worker/oauth-refresh-exchange.ts +162 -0
  497. package/src/worker/oauth-refresh-families.ts +109 -20
  498. package/src/worker/oauth-refresh-persistence.ts +116 -0
  499. package/src/worker/oauth-state.ts +27 -18
  500. package/src/worker/oauth-store-validation.ts +131 -0
  501. package/src/worker/oauth-token-derivation.ts +33 -0
  502. package/src/worker/oauth-token-issuance.ts +119 -0
  503. package/src/worker/oauth-tokens.ts +50 -204
  504. package/src/worker/observability.ts +40 -20
  505. package/src/worker/pending-call-capacity.ts +122 -0
  506. package/src/worker/pending-call-contract.ts +30 -9
  507. package/src/worker/pending-call-deadlines.ts +8 -4
  508. package/src/worker/pending-call-registration.ts +43 -0
  509. package/src/worker/pending-calls.ts +63 -67
  510. package/src/worker/runtime-alarm-storage.ts +37 -0
  511. package/src/worker/runtime-alarm.ts +79 -62
  512. package/src/worker/server-info-activity.ts +36 -0
  513. package/src/worker/server-info-tool-delivery.ts +54 -0
  514. package/src/worker/server-info.ts +169 -0
  515. package/src/worker/tool-call-recovery.ts +29 -0
  516. package/src/worker/tool-catalog.ts +70 -4
  517. package/src/worker/tool-timeout.ts +73 -15
  518. package/src/worker/websocket-protocol.ts +18 -0
  519. package/src/worker/worker-continuity-evidence.ts +122 -0
  520. package/src/worker/worker-edge-guard.ts +90 -0
  521. package/src/worker/worker-edge-log.ts +66 -0
  522. package/src/worker/worker-entry.ts +52 -0
  523. package/src/worker/worker-mcp-config.ts +28 -0
  524. package/src/worker/worker-metadata.ts +44 -0
  525. package/src/worker/worker-rate-limit-key.ts +30 -0
  526. package/src/worker/worker-runtime-config.ts +20 -0
  527. package/src/worker/worker-socket-disconnect-evidence.ts +58 -0
  528. package/src/worker/worker-static-routes.ts +43 -49
  529. package/src/worker/worker-task-lifetime.ts +18 -0
  530. package/src/worker/worker-tool-authority.ts +31 -0
  531. package/tsconfig.local.json +17 -1
  532. package/wrangler.jsonc +13 -0
  533. package/CODE_OF_CONDUCT.md +0 -24
  534. package/CONTRIBUTING.md +0 -68
  535. package/GOVERNANCE.md +0 -50
  536. package/docs/ARCHITECTURE.md +0 -314
  537. package/docs/ENGINEERING.md +0 -210
  538. package/docs/PROJECT_STANDARDS.md +0 -153
  539. package/docs/RELEASING.md +0 -231
  540. package/docs/TESTING.md +0 -162
  541. package/scripts/check-plan.mjs +0 -116
  542. package/scripts/check-runner.mjs +0 -78
  543. package/scripts/commit-message-check.mjs +0 -66
  544. package/scripts/coverage-check.mjs +0 -194
  545. package/scripts/generate-policy-reference.mjs +0 -92
  546. package/scripts/generate-tool-reference.mjs +0 -87
  547. package/scripts/generate-worker-types.mjs +0 -19
  548. package/scripts/markdown.mjs +0 -9
  549. package/scripts/prepare-pinned-npm.mjs +0 -97
  550. package/scripts/run-checks.mjs +0 -19
  551. package/scripts/sarif-security-gate.mjs +0 -148
  552. package/scripts/syntax-check.mjs +0 -52
  553. package/src/local/cli-approval.mjs +0 -73
  554. package/src/local/operation-state-lock.mjs +0 -13
  555. package/src/worker/mcp-resumption-config.ts +0 -46
  556. package/src/worker/mcp-resumption-http.ts +0 -43
  557. package/src/worker/mcp-resumption-records.ts +0 -167
  558. package/src/worker/mcp-resumption.ts +0 -234
  559. package/src/worker/mcp-session.ts +0 -72
  560. package/src/worker/mcp-stream-channel.ts +0 -125
  561. package/src/worker/mcp-stream-dispatch.ts +0 -186
  562. package/src/worker/mcp-stream-proxy.ts +0 -176
  563. package/src/worker/mcp-stream.ts +0 -129
package/CHANGELOG.md CHANGED
@@ -1,1061 +1,15 @@
1
1
  # Changelog
2
2
 
3
- ## 3.0.0-beta.17 - 2026-07-26
3
+ ## 3.0.0-beta.173 - 2026-09-09
4
4
 
5
- ### Fixed
5
+ - Keep root-certified daemon session certificates capped at 24 hours while removing the avoidable daemon-stop boundary for the default portable JWK root: the runtime derives a fresh ephemeral session ten minutes before expiry and reconnects the same daemon instance through existing relay reconciliation.
6
+ - Make WebSocket preflight/challenge authentication and signed HTTPS fallback polls read one shared current-session provider, so a rollover cannot leave the preferred and fallback transports on different certificate generations.
7
+ - Cover delayed timers after system suspension: when an authentication boundary is reached at or after the renewal point, a portable root synchronously renews before signing. Renewal failure retains the previous session, uses bounded 1/5/30/300-second retry, and the existing `relay_device_session_expired` fatal path remains fail closed if no valid renewal is available.
8
+ - Do not grant unattended signing to Secure Enclave roots. They retain their user-presence semantics and supervised-restart fallback. Owner runtime info exposes only coarse renewal generation/expiry/due/failure state, never key or certificate material.
9
+ - Raise the reviewed Sharp security floor from 0.35.3 to 0.35.4 in both the main development tree and the private Wrangler control-plane toolchain after the beta.171 live-activation preflight detected a new high-severity libheif advisory chain. The same Wrangler 4.127.1 / workerd 1.20260828.1 control-plane versions remain in place, and fresh production-only audits report zero vulnerabilities.
10
+ - Bound process-lock snapshot reads across the daemon's atomic startup-readiness publication. A path/descriptor identity mismatch retries only `MBM_IDENTITY_CHANGED` up to four reads before failing closed; hard-link, symlink, permission, oversized-file, and unrelated storage failures keep their existing immediate failure semantics. This closes the beta.172 post-ready activation race where the candidate Worker/service was already healthy but the activation subprocess failed while observing a concurrently replaced daemon lock.
11
+ - Advance package, Worker, and browser-extension identity to `3.0.0-beta.173`; hosted tool schema generation remains 27 because no MCP tool argument/result contract changes in this release.
6
12
 
7
- - Serve `/healthz`, `/`, and CORS preflight from the outer Worker so activation and doctor checks no longer consume Durable Object free-tier request volume. Durable Object free-tier exhaustion now returns a structured `503 durable_object_quota_exceeded` instead of Cloudflare error 1101.
13
+ ## Historical releases
8
14
 
9
- ### Durable Object stream request amplification fix
10
-
11
- - Replace the outer Worker's time-proportional internal Durable Object poll loop with a fixed two-request terminal path: one authenticated descriptor `prepare`, then one hibernatable WebSocket `subscribe`.
12
- - Add `mcp-stream-channel.ts` so `BridgeRoom` accepts a single stream subscriber through `DurableObjectState.acceptWebSocket()`, replaces stale resume subscribers, rechecks storage after registration to close the completion race, and pushes exactly one terminal JSON-RPC message.
13
- - Persist-ready notifications are fire-and-forget from `McpResumptionStore`; if persistence fails, the current online subscriber can still receive the transient terminal result while recovery storage keeps failure semantics.
14
- - Keep daemon candidate cleanup from treating stream-subscriber sockets as daemon candidates, and reject client-to-DO data on receive-only stream subscribers.
15
- - Fix the outer subscription waiter so invalid terminal payloads reject instead of leaving the SSE completion Promise permanently unsettled.
16
- - Extend deterministic infrastructure coverage for the fixed two-request budget, obsolete poll-mode rejection, subscriber replacement, registration races, immediate-completion paths, protocol errors, and non-daemon socket isolation. Update architecture, engineering, testing, audit, and operations contracts to describe subscribe push delivery instead of short pending/terminal polls.
17
-
18
- ## 3.0.0-beta.16 - 2026-07-25
19
-
20
- ### Pending-call recovery and verified handover
21
-
22
- - Separate the upstream MCP host/connector shard-mapper incident from Machine Bridge evidence. The exact temporary-keyspace error never appeared in Worker or daemon diagnostics and did not increment Worker server-error counters, so it is documented as an external boundary failure with unknown platform ownership rather than misclassified as a local daemon, OAuth, Git, or Cloudflare defect.
23
- - Close the Machine Bridge failure-amplification path discovered after recovery. Pending calls now retain monotonic operation and reconnect deadlines, schedule the earliest deadline through the Durable Object alarm, and run a compensating overdue sweep on every HTTP/WebSocket event. In-memory timers remain the fast path; a transient alarm-storage error is observable without converting already-dispatched work into a false terminal failure.
24
- - Make verified same-instance daemon handover atomic with respect to in-flight calls. Both attached and detached records move to the replacement before the incumbent closes, the complete `resume_calls` set is sent, remaining operation timeout is preserved, and failed replacement acknowledgement restores ownership to a still-open incumbent.
25
- - Add deterministic disabled-timer deadline tests, direct runtime-alarm scheduling/failure tests, and a real Wrangler/workerd race regression that connects a same-instance replacement while the incumbent still owns an active call. The call remains active rather than detached and completes through the verified replacement.
26
- - Use null-prototype dictionaries for managed-job `env` and `env_resources`, so valid variable names such as `__proto__`, `constructor`, `toString`, and `valueOf` remain ordinary own data instead of mutating JavaScript object prototypes. Add behavior coverage without weakening duplicate-variable rejection.
27
- - Correct architecture and operations documentation that still described Durable Object `waitUntil` ownership or direct rejection during socket replacement. Document the three deadline enforcement paths, stale-pending diagnosis, host/connector internal-storage error triage, and the exact test evidence.
28
-
29
- ## 3.0.0-beta.15 - 2026-07-25
30
-
31
- ### Event-driven streamed-call settlement
32
-
33
- - Block `3.0.0-beta.14` after exact owner-machine activation and repeated production verification. Version, launchd identity, private candidate runtime, status, doctor, sequence-zero delivery, session isolation, disconnect recovery, and terminal acknowledgement all converged, but a concurrent `server_info` still timed out while the original SSE remained open; session-scoped cancellation therefore could not enter. Beta.14 has no acceptance record and must not be pushed, published, or promoted.
34
- - Remove the last cross-event terminal Promise from streamed `tools/call` initiation. `BridgeRoom` now commits the recovery record, registers an event-settled pending call, sends the daemon envelope, and returns the descriptor without retaining a Promise for the daemon result. The later daemon WebSocket `tool_result`, explicit cancellation request, timeout, send failure, or reconnect-grace expiry owns terminal settlement and persistence.
35
- - Preserve ordinary JSON-only calls with the existing Promise-based request path while adding a separate event settlement mode to `PendingCallRegistry`. Same-instance daemon reconnect still detaches and rebinds both modes; terminal settlement removes request keys, closes observability, and writes exactly one resumable JSON-RPC result.
36
- - Replace the resumption store's live Promise map with an active-stream set plus a bounded transient terminal map used only when persistence fails. A pending persisted record without matching active state still produces the existing restart-ambiguity error instead of inventing completion.
37
- - Add deterministic event-lifecycle regressions that prove stream initiation returns before any terminal event, then exercise success, daemon rejection, cancellation, timeout, send failure, result transformation, persistence failure, and same-instance reconnect. Architecture checks forbid `dispatchJsonRpc` terminal Promises, `resumption.attach`, and Durable Object `waitUntil` from returning to the stream initiation path.
38
-
39
- ## 3.0.0-beta.14 - 2026-07-25
40
-
41
- ### Concurrent MCP control during streamed delivery
42
-
43
- - Block `3.0.0-beta.13` after exact owner-machine activation. Live recovery itself succeeded—sequence zero, session isolation, disconnect recovery, and one-time terminal acknowledgement all worked—but a production Cloudflare Durable Object that directly owned the open SSE response did not accept concurrent `server_info` or `notifications/cancelled` requests until that stream ended. Beta.13 has no acceptance record and must not be published or promoted.
44
- - Move public SSE ownership to the stateless outer Worker. `BridgeRoom` now authenticates and binds the request, commits the resumable record, dispatches local work, and returns only a bounded internal descriptor. The outer Worker emits sequence zero/keepalives/sequence one and polls the Durable Object with short immediate requests for pending or terminal state, so no Durable Object request remains open while a client stream is active.
45
- - Strip all internal stream-control headers from public requests before forwarding, then add them only on the trusted service-binding path. OAuth/DPoP, signed MCP-session, token/session replay isolation, explicit cancellation, bounded persistence, and acknowledged-terminal suppression remain enforced by `BridgeRoom`.
46
- - Extend real Wrangler integration to hold an SSE call open while a concurrent `server_info` succeeds and a session-scoped cancellation reaches the exact daemon call. Transport tests now parse complete SSE events rather than assuming one network chunk equals one event.
47
-
48
- ## 3.0.0-beta.13 - 2026-07-25
49
-
50
- ### Resumable MCP result delivery and outage closure
51
-
52
- - Complete the Streamable HTTP recovery contract. Every streamed `tools/call` now emits a sequence-zero SSE event identifier before local execution can complete, persists a token- and MCP-session-bound delivery record, emits the terminal result as sequence one, and accepts authenticated `GET /mcp` recovery with `Last-Event-ID`. Reusing sequence one returns an empty completed stream instead of delivering the terminal response twice.
53
- - Separate execution continuity from result-delivery continuity. An HTTP/SSE disconnect does not cancel the daemon call; only session-scoped `notifications/cancelled` does. A new POST always starts a new request, while GET only resumes a previously issued stream identifier, preventing retry semantics from being conflated with replay.
54
- - Bound Durable Object recovery state to 64 streams, two minutes, and 1.5 MiB per persisted terminal message. A compact metadata index avoids scanning stored result bodies. Result records carry SHA-256 integrity metadata, are isolated by OAuth token and MCP session, evict expired or oldest completed entries first, and return explicit errors for oversized replay data, lost in-memory execution after Worker restart, or stored-result corruption.
55
- - Preserve online delivery when persistence fails transiently, fail before side effects when a new recovery record cannot be admitted, and allow browser DPoP/resumption preflights by advertising both `DPoP` and `Last-Event-ID` in CORS.
56
- - Promote the recovery summary for an already-warned relay outage to `warn`, while brief self-healing interruptions remain debug-only. Default background-service logs now contain both outage start and recovery closure without exposing raw close reasons.
57
- - Add direct store fault/tamper/capacity tests, SSE framing tests, and live Wrangler integration that disconnects after sequence zero, completes the daemon call, rejects another session, recovers through GET, and proves the acknowledged terminal event is not duplicated.
58
- - Refresh the locked development-only `brace-expansion` transitive dependency from 5.0.7 to 5.0.8 after the mandatory pre-candidate registry audit reported GHSA-mh99-v99m-4gvg. Both complete and production-only audits must be clean before beta.13 candidate preparation.
59
- - Integrate Dependabot PR #56 into the complete beta.13 candidate rather than merging its incomplete two-file update. Wrangler advances to 4.114.0, Miniflare/workerd to the 2026-07-22 build, the exact `workerd@1.20260722.1` postinstall approval is reviewed and updated, and the existing patched `sharp@0.35.3` override remains authoritative.
60
-
61
- ## 3.0.0-beta.12 - 2026-07-23
62
-
63
- ### ChatGPT Streamable HTTP task continuity
64
-
65
- - Fix remote `tools/call` handling so an HTTP/SSE connection closing is no longer interpreted as MCP cancellation. Only an explicit session-scoped `notifications/cancelled` request may remove the pending request key and send `cancel_call` to the daemon.
66
- - Negotiate `text/event-stream` for clients that advertise it, prime the response immediately, send a bounded ten-second keepalive comment while work is active, and deliver the terminal JSON-RPC result as an SSE message. This prevents a long-running local operation from leaving the ChatGPT-to-Worker HTTP path completely idle.
67
- - Preserve the underlying Durable Object operation with `waitUntil` when the response stream is no longer writable, so transport disposal cannot silently terminate local work. JSON-only clients retain the existing single-response behavior.
68
- - Replace duplicated relay timing literals with one shared contract. Same-daemon reconnect recovery is extended from thirty seconds to two minutes, and the Worker pauses only the remaining normal call deadline while detached, avoiding both premature expiry during recovery and inflated timeouts while the daemon is healthy.
69
- - Add deterministic and live Worker regressions for SSE negotiation, immediate priming, keepalives, terminal result delivery, HTTP abort without cancellation, explicit cancellation after disconnect, shared timeout ceilings, and same-instance recovery timing.
70
-
71
- ## 3.0.0-beta.11 - 2026-07-23
72
-
73
- ### External-review verification and observability hardening
74
-
75
- - Share one portable content-redaction implementation between local and Worker logs. Worker string fields now redact embedded bearer/API tokens, credential URLs, email addresses, private-key headers, and user-home paths even when the field name itself is not sensitive.
76
- - Prevent caller-supplied local or Worker fields from replacing authoritative `timestamp`, `level`, `component`, `message`, or `event` metadata, and add regression coverage for both value leakage and metadata forgery.
77
- - Make the automatic execution model explicit in authenticated `server_info` authority snapshots and `machine-mcp doctor`: operations inside effective authority do not use per-operation prompts, and remote owner shell/browser/application actions have the daemon OS user's ambient authority.
78
- - Extract local-resource reads and SSH-resource registration into `runtime-resource-service.mjs`, reducing `LocalRuntime` from 697 to 653 lines while retaining the existing zero-extra-step browser/application resource path and public result contract.
79
- - Re-verify review claims against the repository invariants. The default `full` profile, single-maintainer release controls, Node 26/npm 12 baseline, packaged deployment/release helpers, systemd-user support, and cross-platform behavior suites remain intentional; none is weakened or removed merely to reduce surface area or ceremony.
80
- - Refresh the exact Wrangler runtime from 4.112.0 to 4.113.0 and advance the reviewed npm install-script allowlist to its exact `workerd 1.20260721.1`; a clean install must not depend on an unreviewed or locally cached postinstall.
81
-
82
- ## 3.0.0-beta.10 - 2026-07-22
83
-
84
- ### Published prerelease activation repair
85
-
86
- - normalize npm 12 single-result JSON arrays for version, integrity, SHA-1, dist-tags, and publication timestamps;
87
- - unblock exact registry-backed prerelease installation and soak activation without weakening integrity or dist-tag verification;
88
- - add a regression fixture matching the real npm 12 response shape that blocked beta.9 activation.
89
-
90
- ## 3.0.0-beta.9 - 2026-07-22
91
-
92
- ### Cross-platform release-gate repair
93
-
94
- - Block `3.0.0-beta.8` after owner activation and acceptance because pull-request CI found three release-blocking defects that local macOS verification could not establish: the Windows trusted-Git regression forced Linux permission semantics onto NTFS, Ubuntu coverage did not execute the macOS delegated-sandbox behavior probe, and CodeQL rejected an unused cleanup-path assignment.
95
- - Make trusted-Git regression coverage use the actual host platform while retaining POSIX group-writable rejection on Unix. Make macOS sandbox availability accept explicit platform and executable-presence probes for deterministic cross-platform tests, and exercise the complete read/write/outside-path/Keychain behavior matrix with a synthetic process boundary.
96
- - Remove the unused activation cleanup assignment rather than adding a CodeQL exception. These changes require a new exact candidate, live activation, acceptance, and full prerelease gate.
97
-
98
- ## 3.0.0-beta.8 - 2026-07-22
99
-
100
- ### Candidate repository hygiene correction
101
-
102
- - Block `3.0.0-beta.7` after owner-machine acceptance. A full staged-tree `git diff --cached --check` exposed an extra blank line at EOF in the newly added Worker device-session verifier; the earlier working-tree-only check did not inspect that untracked file, so the reported hygiene result was incomplete.
103
- - Remove only the extraneous EOF blank line. Runtime behavior, protocol behavior, activation logic, and the beta.7 live conclusions are unchanged.
104
- - Assign a new prerelease version and regenerate the exact candidate because even this packaged-source change invalidates the accepted beta.7 package and promotion digests.
105
-
106
- ## 3.0.0-beta.7 - 2026-07-22
107
-
108
- ### Nested npm lifecycle PATH normalization
109
-
110
- - Block `3.0.0-beta.6`. Its exact Worker and daemon activated successfully, but live launchd inspection still found repository `node_modules/.bin` entries and npm's private `node-gyp-bin`. The packaged beta.6 function was present and produced a clean PATH when called directly; the failure was caused by nested activation: the existing daemon PATH already contained one npm run-script prefix, and invoking `npm run release:candidate:activate` prepended a second. Beta.6 removed only through the first marker and therefore persisted the complete inner prefix.
111
- - Normalize through the last npm run-script marker, removing every nested lifecycle prefix while retaining the current Node/package directories, the operator PATH after the innermost marker, and platform defaults. Inactive candidate-runtime entries remain excluded.
112
- - Expand Unix and synthetic Windows regressions to two complete npm prefix/marker layers followed by a stale candidate and a user bin. Both layers must be removed; ordinary non-lifecycle `node_modules/.bin` entries remain supported.
113
-
114
- ## 3.0.0-beta.6 - 2026-07-22
115
-
116
- ### Reproducible background service environment
117
-
118
- - Block `3.0.0-beta.5`. Its exact candidate activated successfully on the owner machine: the same-version Worker and single launchd daemon reached readiness, `project_overview` reported distinct effective and daemon-ceiling authority, fixed Git metadata succeeded, `service start` preserved the existing PID, and detached `service restart` replaced the PID and returned to readiness with no pending calls. Post-activation inspection nevertheless found that the launchd `PATH` captured npm lifecycle injection from the activation command, including project `node_modules/.bin` prefixes, npm's private `node-gyp-bin`, and the beta.4 candidate runtime that activation immediately pruned.
119
- - Make service `PATH` construction reproducible across ordinary installation and prerelease activation. The current Node directory and current package bin are always added explicitly. When npm's `@npmcli/run-script` marker is present, the lifecycle-injected prefix is removed before inheriting the operator PATH. Any other entry below the candidate runtime store is rejected while the current candidate bin remains available. Ordinary user-supplied `node_modules/.bin` entries are retained when they were not injected by an npm lifecycle.
120
- - Add a cross-platform regression that reproduces the exact activation topology: npm project bins before the lifecycle marker, a stale prior candidate runtime after the marker, an inherited user bin, and the current runtime entry. The service definition must retain Node/current runtime/user tools, reject npm-private and stale candidate entries, preserve absolute-only deduplication, and continue to embed the sanitized value in launchd and systemd definitions.
121
-
122
- ## 3.0.0-beta.5 - 2026-07-22
123
-
124
- ### Relay resilience, lifecycle correctness, and fail-closed state hardening
125
-
126
- - Block `3.0.0-beta.4`. Live observation showed that the daemon process and launchd job could remain healthy while the authenticated WebSocket disappeared and later recovered with the same PID. The affected route was carried through the machine's system VPN/TUN; Machine Bridge cannot prove which internal VPN hop failed, but it can now distinguish application-level proxy selection from the operating-system network stack instead of reporting the misleading label `direct`.
127
- - Cap relay reconnect backoff at 15 seconds instead of 60 seconds. Add bounded outage count/start/duration, last close category/code, transport error class, last disconnect/ready timestamps, ready duration, and next-retry timing to `server_info` and `diagnose_runtime`. Emit timestamped `relay.outage.active` and `relay.outage.recovered` events without exposing close reasons, proxy endpoints, page data, tool arguments, or results.
128
- - Make `service start` idempotently ensure a running service and reserve explicit replacement for `service restart`. Require verified state/workspace ownership before touching the machine-global service, use detached restart handoff where behavior is verified, and fail closed on in-process Windows restart rather than risking a Task Scheduler `/End` operation that also kills the restart helper.
129
- - Replace raw launchd/systemd status dumps with structured summaries. Service status no longer exposes the user's home path, complete PATH, SSH agent socket, environment, or provider diagnostics. Autostart log schema migration now validates both owner-only log files before mutation, rejects symbolic or multiple-hard-link paths, writes schema 4 strictly, and aborts startup on incomplete migration instead of mixing text and NDJSON.
130
- - Treat a tool result, public error, Worker pong/welcome, browser response, and extension keepalive as explicit serialization/delivery boundaries. Circular values, BigInt, oversized structures, half-closed sockets, and send failures terminate only the affected request or transport and no longer crash or silently strand the whole relay.
131
- - Prevent delayed process-tree escalation from signaling a reused PID or process group while still cleaning descendants that survive their parent. Snapshot process identity before graceful termination, verify it before SIGKILL, bind escalation timers to tracker/session lifecycle, and cover parent-exits-first and resistant-descendant cases.
132
- - Pin implementation-owned Git and release-control commands to absolute, executable, non-group-writable binaries outside the workspace, state root, runtime root, and user home. Fixed metadata probes remain no-shell and minimal-environment; npm lifecycle PATH and workspace shims cannot replace `git` or `gh` in security/release decisions.
133
- - Pin the browser broker to the repository extension ID derived from `manifest.key`, verify both WebSocket Origin and `chrome.runtime.id`, split extension and runtime credentials, and migrate legacy pairing state under the maintenance lock. The extension now cleans per-socket keepalive timers and active requests on replacement, disables stale reconnect, rejects duplicate request IDs, and closes half-dead sockets on response-delivery failure.
134
- - Make corrupt workspace trust state persistently fail closed. Only a current-schema state envelope with matching workspace hash, canonical state-root/profile/state paths, and required policy/worker/resource objects can clear `recovery-required`; recovery markers are read once and strictly validate their bounded backup name and timestamp.
135
- - Make managed-job terminal persistence recoverable. Result, terminal status, private runtime/plan/PID/cancel cleanup, and cleanup confirmation form an ordered protocol. Result-write, status-write, and artifact-cleanup failures remain visible; status reconstruction from a valid terminal result prevents duplicate finally execution, while leftover secret/resource copies are retried by read/list/prune.
136
- - Give security-audit and legacy authorization state true cross-process locks. State removal also detects those locks plus managed-job transition/recovery locks, preventing uninstall from deleting a profile during an active mutation. Concurrent audit writers retain every event and a continuous hash chain.
137
- - Reject multiple-hard-link inodes at owner-only state, autostart logs, runner diagnostics, and path-based existing-file reads. Atomic overwrite remains safe because it replaces the workspace directory entry rather than modifying a shared inode.
138
- - Upgrade delegated macOS sandbox enablement from executable-presence testing to a behavior matrix that proves workspace access and denies outside reads/writes. Current hosts where the matrix fails remain fail closed; Keychain isolation is no longer claimed without an independently verified boundary.
139
- - Bound detached managed-job credentials and staging lifetime. Minimal plans launch the runner with a minimal control environment, explicit full-environment plans retain that choice, and unexecuted sensitive plans expire after 24 hours instead of remaining for the seven-day result-retention period.
140
- - Preserve both primary and cleanup failures for Secure Enclave enrollment and persistent candidate activation. Local cleanup failure is returned as an `AggregateError`; transactional rollback of an already updated Cloudflare Worker and local service definition remains an explicit operational residual rather than a false guarantee.
141
- - Add explicit 32-call stdio admission control, refresh-family revocation before replay-marker capacity eviction, constant-memory unauthorized-request body draining before rejection, trusted Windows PowerShell literal tests, browser broker load counters, function-complexity/module-size gates, and risk-directed coverage for every new boundary.
142
-
143
- ## 3.0.0-beta.4 - 2026-07-22
144
-
145
- ### Explicit daemon-ceiling reporting and fixed internal metadata execution
146
-
147
- - Mark `3.0.0-beta.3` as blocked. Its owner activation, persistent daemon handoff, relay readiness, service restart, and ordinary owner tool calls succeeded, but live verification exposed two delegated-account defects before publication: `project_overview` could report the request-effective `custom` policy as the daemon ceiling, and reviewer/editor Git metadata calls were routed through the arbitrary-process sandbox boundary.
148
- - Return request-effective `policy`/`tools` and daemon-ceiling `daemonPolicy`/`daemonTools` as separate local fields. The Worker now consumes the explicit ceiling fields and retains a compatibility fallback for older daemon responses, preventing a second interpretation of an already-intersected policy.
149
- - Add a fixed internal process path for bounded implementation-owned metadata probes. It uses validated argv, no shell, an isolated minimal environment, the existing timeout/output/cancellation/process-tree accounting, and never inherits the daemon full environment. Git status, diff, log, show, and project-root detection use this path; user-selected `run_process`, registered commands, and `exec_command` remain subject to the delegated sandbox and ordinary role ceilings.
150
- - Add real `LocalRuntime` regressions for editor project snapshots and reviewer Git metadata, a process-layer regression proving the internal path is not wrapped as delegated arbitrary execution, and Worker integration coverage that supplies distinct effective and daemon fields.
151
- - Prevent foreground startup in an unrelated workspace or isolated state root from unloading the machine-global autostart service. Platform service control now requires a live, verified `service` daemon lock for the exact state/workspace; the installed-package smoke test traps service-manager calls and proves zero-argument startup cannot stop the operator's real daemon. This fixes the repeated relay outages observed when the full verification plan reached `install:test`.
152
- - Make `--log-format json` authoritative for the complete logger surface. Direct `debug`/`info`/`success`/`warn`/`error` calls and persistent daemon readiness now emit one timestamped, redacted JSON object per line instead of silently falling back to unstructured text. Add regressions for stream routing, normalized levels, timestamps, and sensitive/path field redaction.
153
- - Override Wrangler/Miniflare’s transitive `sharp` dependency from vulnerable 0.34.5 to patched 0.35.3 after GHSA-f88m-g3jw-g9cj entered the audit database. Keep Wrangler itself pinned, update the npm script allowlist, and require full Worker/Miniflare integration plus zero-high-severity audit evidence for the override.
154
-
155
- ## 3.0.0-beta.3 - 2026-07-21
156
-
157
- ### Provisioned Secure Enclave broker boundary
158
-
159
- - Mark `3.0.0-beta.2` as blocked. Its live activation restored version 2 device-ID compatibility, but then attempted to create a persistent Secure Enclave key from a runtime-compiled, ad-hoc-signed command-line helper. Modern macOS routes Secure Enclave keys through the data-protection Keychain and rejected that helper with `errSecMissingEntitlement` (`-34018`) before Worker deployment or daemon handoff.
160
- - Stop treating a source-built ad-hoc helper as a production trust anchor. Without an explicitly configured provisioned broker, macOS retains or creates the owner-only portable P-256 root, performs no Keychain operation, requests no user-presence prompt, and proceeds with the coordinated version 3 upgrade.
161
- - Add opt-in Secure Enclave enrollment through `MBM_MACOS_TRUST_BROKER`. The configured absolute path must resolve to a regular executable that is not group/other writable, has a strict valid Apple code signature, carries a stable signing identifier and Team ID, and passes an end-to-end probe that creates and deletes a temporary Secure Enclave key. The enrolled root binds the canonical broker path, signing identifier, Team ID, protocol version, key tag, and public key; every later public-key check or signature revalidates that binding.
162
- - Keep the packaged Swift source and ad-hoc build only as a development and protocol-conformance fixture. It is intentionally rejected by the production broker validator. Add cross-platform provider-selection tests, macOS signature/binding/probe regressions, and truthful `server_info` provider metadata.
163
-
164
- ## 3.0.0-beta.2 - 2026-07-21
165
-
166
- ### Version 2 device-identity compatibility
167
-
168
- - Restore the stable RFC-style P-256 JWK member order (`crv`, `kty`, `x`, `y`) used by version 2 device identifiers. The initial beta accidentally reordered those members through a new shared canonicalization helper, causing an intact version 2 portable identity to fail before Worker or daemon handoff.
169
- - Add an explicit backward-compatibility regression that validates a persisted version 2 identifier and rejects the incorrect beta.1 ordering. Beta.1 is blocked and must not be activated or promoted.
170
-
171
- ## 3.0.0-beta.1 - 2026-07-21
172
-
173
- ### Request-scoped authority, trusted clients, and zero-routine-prompt security
174
-
175
- - Replace delegated terminal approval IDs and broad capability leases with a request-scoped authority intersection. Every remote request now evaluates the daemon capability ceiling, the authenticated account role ceiling, the OAuth client and refresh-token family, automatic safety invariants, and object ownership. A grant can no longer expand a reviewer, editor, or operator beyond its canonical role. Owner/full automation remains uninterrupted, but owner requests are still risk-classified and audited.
176
- - Bind retained process output, interactive process sessions, and managed jobs to account ID, account version, OAuth client, and refresh-token family. Cross-account or stale-session reads, input, cancellation, and output access fail closed. Protected local resources cannot be smuggled into delegated managed jobs, and non-owner accounts cannot create durable execution plans.
177
- - Enforce request-specific path visibility, unrestricted-path authority, absolute-path disclosure, and child-process environment selection throughout file, Git, Agent-context, process, and job services. Generic path-based file tools cannot read or write Machine Bridge control-plane state even under owner/full; arbitrary owner shell execution remains equivalent to the OS user and is documented as a residual risk. Delegated process execution requires a behavior-verified OS workspace sandbox; platforms where the sandbox merely exists but fails a deny-default launch probe reject delegated execution rather than silently running with local-user authority. Owner execution is unchanged.
178
- - Remove terminal-based operation authorization from the normal CLI and runtime. OAuth client authorization is the low-frequency trust event; ordinary operations run automatically within the account ceiling. Legacy leases are ignored by runtime and remain visible only for incident-response revocation. Trusted clients bind to one account and can be listed or revoked independently without rotating every account credential.
179
- - Propagate refresh-token family identity to the local daemon and reject relay envelopes without it. Access tokens remain fifteen minutes and rotating refresh families remain bounded. Client trust, account version, role, and family identity participate in authorization and object ownership.
180
- - Add a privacy-preserving chained security audit. It records tool, coarse risk category, result, duration, byte counts, target digest, and keyed principal references without storing command text, paths, file contents, form values, or output. Hash-chain verification detects local corruption or alteration and is exposed through runtime diagnostics without blocking ordinary work when the audit sink is unavailable.
181
- - Stop nonce-capacity handling from evicting live replay markers. A full replay cache now rejects new signed requests until entries expire instead of reopening the replay window.
182
- - Replace the long-lived file-backed device signer with a root-certified ephemeral session hierarchy. macOS prefers a non-exportable Secure Enclave P-256 root protected by user presence; one root signature per daemon start certifies a 24-hour in-memory session key used for preflight, challenge authentication, reconnect, and account administration. Root migration and rotation are two-phase: a pending public key is deployed and health-verified before local promotion.
183
- - Remove `ACCOUNT_ADMIN_SECRET` from local state and Worker secrets. Account/client administration now uses the same root-certified ephemeral P-256 session, with each request bound to origin, method, path, body hash, key ID, timestamp, and nonce. Add optional DPoP ES256 token binding for compatible clients while preserving Bearer interoperability. DPoP proof verification no longer consumes replay capacity before OAuth credential validation, preventing unauthenticated cache exhaustion; unsupported critical JWS headers are rejected.
184
- - Remove the terminal `job approve` execution path. `stage_job` remains a validated non-running draft; execution requires trusted owner `start_job` authority or an explicit local `machine-mcp job submit PLAN.json` action.
185
- - Add behavior-level regressions for canonical-full daemon versus delegated-role boundaries, cross-account process/job ownership, control-plane path protection, token-family binding, nonce saturation, chained audit tampering, and delegated sandbox capability probing. Expand critical-module coverage and rewrite authorization, operations, upgrade, security, and threat-model documentation around the zero-routine-prompt model.
186
- - This is a coordinated Worker, daemon, state, and browser-extension protocol upgrade. Version 3 components must converge together; existing remote clients must authorize once again because the relay principal now requires refresh-family and trusted-client binding.
187
- - Replace the direct-to-stable release path with mandatory `dev`/`beta`/`rc` channels, registry-verified soak, and content-preserving stable promotion. Major, minor, and patch releases require at least seven days, three days, and one day respectively. A blocking fix increments the prerelease and restarts the interval.
188
- - Add one persistent candidate activation command that verifies the exact tarball, updates the same-name Worker, proves candidate relay readiness, hands off to the login daemon, verifies the background version, and exits while the service remains active. Add exact prerelease npm/GitHub channel checks, published-package activation records, tracked soak evidence, promotion-content digests, and stable push/release/publication gates.
189
- - Remove the remaining internal APIs that could create version 2 capability leases. Only migration cleanup (`list`, `revoke`, `clear`) remains.
190
-
191
- ## 2.0.0 - 2026-07-21
192
-
193
- ### Device identity and usable local transaction authorization
194
-
195
- - Replace the long-lived daemon bearer secret with an enrolled P-256 device identity. Every WebSocket upgrade now requires a signed short-lived preflight bound to Worker origin, package version, nonce, and timestamp. Its nonce is consumed once through bounded transactional state, preventing both unauthenticated candidate churn and replay of a captured preflight. The Worker then issues a fresh challenge whose signature also binds the daemon instance before tools may be advertised or a verified incumbent may be replaced.
196
- - Fix Windows authorization tests to avoid asserting POSIX mode bits on NTFS, and record the exact expiring CodeQL assessment for the mandatory 256-bit machine-generated account credential verifier.
197
- - Let authenticated owner sessions execute directly within the daemon policy ceiling without terminal approval, while retaining local capability leases for high-impact operations from delegated non-owner accounts. The canonical `full` profile is unchanged. Workspace-contained reads and ordinary edits, project inspection, Git, and diagnostics remain automatic. Because the extension controls an existing logged-in browser profile, one `browser-session` lease covers profile reads and actions instead of prompting per click; registered-resource input and file upload retain an independent `data-export` boundary. Compound operations must satisfy every applicable scope, so browser uploads require both scopes and protected-resource desktop input requires both application control and data export. Remote process control and continuation, outside-workspace or sensitive reads/writes, managed-job listing/output/mutation, credential operations, and application inspection/control run uninterrupted once the bound account and OAuth client hold the required time-bounded scopes. The CLI supports scoped leases and an explicit at-most-eight-hour `--full` automation window.
198
- - Store only bounded identity/scope/time metadata and SHA-256 target digests in owner-only approval state; validate every persisted record and fail closed on malformed state. Canonicalize every patch destination, including `Move to` and symbolic-link ancestors, before classifying it, and reject final symbolic-link overwrites so classification and execution share the real target. Serialize daemon and CLI approval mutations with an owner-only process-identity lock so concurrent pending, grant, approval, revocation, and clear operations cannot silently overwrite one another. A catalog-completeness test forces every current and future tool through explicit risk review. Relay authorization now carries the authenticated OAuth client identity so leases cannot cross clients.
199
- - Reduce access-token lifetime from 30 days to 15 minutes. Refresh tokens now have a 14-day idle limit and a 30-day family limit; reuse of a rotated refresh token revokes the complete family, including active access tokens. Consumed-token and revoked-family replay records are hard-bounded, oldest-first pruned, and record-schema validated. The first device enrollment also rotates the deployment token version so pre-2.0 credentials cannot survive the upgrade.
200
- - Replace the account-management network bearer with per-request HMAC-SHA-256 authentication bound to Worker origin, HTTP method, path, body hash, timestamp, and random nonce. Transactional Durable Object nonce state rejects replay and fails closed when malformed; the local CLI workflow is unchanged.
201
- - Split operation-risk classification, lease persistence, daemon authentication, refresh-family persistence, and administration authentication into focused domain modules with behavior-level tests. Document capability ceilings, transaction authorization, upgrade/rollback boundaries, residual same-user risk, and the controls deliberately left external.
202
- - This is a coordinated Worker/daemon protocol upgrade. Version 2.0.0 components must be deployed and run together; the removed daemon bearer protocol is not retained as a compatibility bypass.
203
-
204
- ## 1.2.11 - 2026-07-20
205
-
206
- ### Bounded output continuation and repository backlog gate
207
-
208
- - Stop large one-shot process responses from overwhelming MCP hosts. `run_process`, `run_local_command`, and `exec_command` now inline only a bounded stdout/stderr preview, retain up to 1 MiB per stream in a temporary completed process session, and return an `output_session_id` for paged `read_process` continuation. Nonzero exits keep their human error message bounded while preserving structured continuation details.
209
- - Avoid protocol-level payload duplication by replacing the text mirror of large object results with a compact field summary while retaining the authoritative object in `structuredContent`. The fast/platform/full check runner suppresses successful child noise, preserves bounded head/tail diagnostics on failure, and supports explicit `MBM_CHECK_VERBOSE=1` streaming. Coverage cleanup now retries concurrent late V8 coverage-file writes instead of failing after the thresholds already passed.
210
- - Resolve the release-acceptance file race by opening no-follow descriptors first, checking descriptor/path identity, and reading acceptance records and tarballs through bounded descriptors. Remove the temporary CodeQL exception and add deterministic path-replacement and symbolic-link regressions.
211
- - Add a guarded GitHub backlog pre-push check. `npm run github:push` now blocks unrelated open pull requests and open issues not covered by a standard closing keyword in the current branch commits; the current branch PR remains updateable. Add unit and integration coverage for output paging, compact MCP projection, bounded check diagnostics, and backlog enforcement.
212
-
213
- ## 1.2.10 - 2026-07-20
214
-
215
- ### Relay interruption recovery
216
-
217
- - Preserve an in-flight MCP tool call across a brief daemon WebSocket interruption instead of converting every transient proxy or network reset into an immediate cancellation. The Worker now detaches pending calls for a bounded 30-second grace period and rebinds them only when the same local daemon process instance completes the full authenticated readiness probe on its replacement socket.
218
- - Keep the local operation running during that grace period and queue a completed result until the relay is ready again. Before `ready_ack`, the Worker sends an authoritative `resume_calls` set so the runtime cancels work whose client disappeared during the outage; results are replayed only for same-instance calls that still have a receiver. A different daemon instance cannot claim them, and an unrecovered outage cancels ordinary calls and process trees when the grace period expires.
219
- - Add deterministic registry/runtime regressions and a real Worker/OAuth/MCP fault-injection test that starts a tool call, forcibly drops the daemon WebSocket, reconnects the same daemon instance, and proves the original HTTP request completes. Expose the bounded `pending_calls.detached` count for diagnosis, require a validated ephemeral daemon instance identifier in the current-version hello contract, and update architecture, logging, operations, audit, and multi-account documentation.
220
-
221
- ## 1.2.9 - 2026-07-18
222
-
223
- - Repair cross-platform release infrastructure found by PR CI: the layered check runner now invokes the pinned npm CLI through Node instead of spawning `npm.cmd`, and `release:accept` computes and locally validates the portable Git-content digest through a temporary index so CI can verify accepted package content across merge commits without mutating the maintainer index.
224
- - Correct the release handoff: add `npm run release:candidate:start -- --allow-worker-deploy` for an isolated local installation plus explicitly authorized in-place candidate Worker deployment, require owner-authorized and agent-operated live verification before acceptance, allow the coding agent to record acceptance and complete commit/push/tag/GitHub Release work, and add `npm run release` as the canonical source-release command. npm publication and Worker deployment remain owner-operated.
225
-
226
- ### Architecture headroom, verification feedback, and threat model
227
-
228
- - Split tool registration, relay adaptation, path redaction, Agent-context projection/rendering, bounded skill discovery and text reading, browser request lifecycle, runtime-client broker routing, authenticated loopback server setup, browser HTTP handling, Windows launcher quoting, managed-job transition locks, runner identity, private storage, public projections, Worker OAuth authorization-page rendering, JSON-RPC framing, and WebSocket protocol cleanup out of near-limit orchestration modules. Tighten architecture budgets around the new boundaries so `runtime`, Agent context, browser broker, Windows service, managed jobs, and `BridgeRoom` retain explicit headroom instead of treating their previous line caps as targets.
229
- - Replace the monolithic package-script chain with audited `check:fast`, `check:platform`, and `check:full` plans while keeping `npm run check` as the complete gate. Each task reports elapsed time; macOS and Windows CI run the cross-platform behavior plan plus installed-package smoke coverage, while Ubuntu runs the full coverage, browser, package, stdio, Worker/OAuth, and real-browser suites.
230
- - Expand critical-module coverage gates to state persistence, relay lifecycle, managed jobs, runtime path redaction, Agent-context projection, browser broker/request routing, Worker OAuth, JSON-RPC framing, and WebSocket protocol helpers. Add strict checked-JavaScript coverage for the runtime path/redaction, Agent-context projection, skill-discovery, and bounded text-file boundaries. Repair a detached-process self-test race by waiting monotonically for the child PID handoff file, and remove fixed CI-job-count and implementation-location assumptions from source-shape tests.
231
- - Replace the oversized README with a decision-oriented entry path, add a component overview and explicit threat model, document the Node 26/npm 12 support trade-off, and add a contributor first-30-minutes workflow. Security objectives, attacker classes, non-goals, and external governance gaps are now stated separately from incident and release audit history.
232
-
233
- ## 1.2.8 - 2026-07-17
234
-
235
- ### Owner-tested release gate and dependency workflow repair
236
-
237
- - Replace the previous automation-only release assumption with an explicit repository-owner local acceptance boundary. `npm run release:candidate` runs the complete suite and creates the exact npm tarball under ignored local state; `npm run release:accept` records the owner decision only when a second pack is byte-identical. The tracked acceptance record contains package identity, SHA-1, SHA-512 integrity, timestamp, and a fixed confirmation marker, while excluding personal identity, machine paths, logs, credentials, and user content.
238
- - Add `npm run github:push`, which rejects dirty trees, detached HEAD, direct `main` pushes, untracked acceptance records, or package-hash drift before pushing a release-relevant branch. Pull-request CI and `release:publish` independently rebuild and verify the accepted package. `release:publish` no longer pushes `main`; it requires the accepted branch to have been reviewed and merged so local `HEAD` already equals `origin/main`.
239
- - Distinguish npm-package changes from GitHub-only repository infrastructure. The release-impact gate now derives package relevance from `package.json.files`, so Action-only Dependabot PRs no longer deadlock on an unrelated npm version bump while source, scripts, browser extension, package metadata, and shipped documentation remain versioned.
240
- - Consolidate the five pending GitHub Action updates atomically: CodeQL `init`, `analyze`, and `upload-sarif` now use the same 4.37.1 commit; `actions/setup-node` advances to 7.0.0; and `actions/upload-artifact` advances to 7.0.1. Dependabot now groups all GitHub Action updates so coupled action families cannot be split into incompatible PRs.
241
- - Update Wrangler from 4.111.0 to 4.112.0 and advance the exact reviewed `workerd` install-script allowlist to 1.20260714.1. Complete and production dependency audits remain at zero known vulnerabilities.
242
- - Rewrite the release, contribution, automation, engineering, architecture, testing, and audit contracts around the owner-tested artifact boundary. Add executable regression coverage for package-impact classification, package-hash acceptance, workflow grouping, CI verification, no automatic `main` push, and package-manifest inclusion of every new helper.
243
-
244
- ## 1.2.7 - 2026-07-17
245
-
246
- ### Process supervision, lifecycle, and isolation audit
247
-
248
- - Separate argv validation, execution limits, process-tree supervision, one-shot execution, and interactive process sessions into explicit modules. Shell helpers, managed jobs, call cancellation, runtime shutdown, and process sessions now share one graceful `SIGTERM` followed by forced tree-termination contract instead of importing session internals or maintaining duplicate platform branches.
249
- - Reclaim an unresponsive detached service daemon only after revalidating PID, process start time, entrypoint, command line, daemon mode, workspace, and state root immediately before `SIGKILL`. PID reuse, identity drift, foreground ownership, and ambiguous records remain fail closed. Process-session termination now also escalates after a bounded grace period.
250
- - Add a machine-readable `server_info.runtime.execution_guardrails` contract for tool-call concurrency, process timeout/stdin/output limits, process-session limits, and cleanup semantics. CPU quota, memory quota, and network isolation are reported explicitly as `not-enforced`; hard isolation still requires a dedicated account, container, or VM.
251
- - Make browser-broker startup generation-aware so `stop()` cannot race an asynchronous listen/proxy connection and leave a listener alive. Pending proxy routes now receive a terminal error during shutdown, broker recovery failures emit structured debug events, and the local browser-health probe uses bounded direct `127.0.0.1` HTTP instead of environment-routed `fetch`.
252
- - Reject detached managed-job launch when no process ID was obtained, attach an asynchronous child-error observer, make `shell: false` explicit, and remove duplicate plan-scrubbing logic. Correct stale relay-readiness and runtime-observability documentation, and add fault-path tests for resistant descendants, forced daemon reclamation, startup cancellation, proxy-bypassed loopback health, runner spawn failure, and honest OS-enforcement reporting.
253
-
254
- ## 1.2.6 - 2026-07-17
255
-
256
- ### Relay ready-context and implicit service-daemon takeover
257
-
258
- - Keep end-to-end readiness fail-closed, but stop treating an incomplete inbound relay context that only carries `sessionId` as permanently unready. After a verified ready connection, the runtime consults live relay status when the per-message snapshot omits `ready`; an explicit `ready: false` snapshot still rejects tool calls. `RelayConnection` now always forwards boolean `authenticated` and `ready` with the session generation.
259
- - Recognize managed service daemons started with only `--daemon-only` (no explicit `--workspace` / `--state-dir` on the process argv) when the lock owner already matches the active workspace state. Partial identity (one of the two path flags) remains rejected so foreign processes cannot be taken over. This allows recovery of source-tree recovery daemons that previously stayed orphaned across CLI upgrades.
260
- - Add regression coverage for pre-ready vs ready inbound message contexts, sessionId-only dispatch after readiness, explicit `ready: false` fail-closed behavior, and implicit daemon-only stop/takeover.
261
-
262
- ## 1.2.5 - 2026-07-17
263
-
264
- ### End-to-end relay readiness and safe daemon handover
265
-
266
- - Separate authenticated WebSocket transport from verified service readiness. A daemon now becomes externally usable only after the Worker sends a random readiness probe and receives its result through the same local message dispatch, relay-session binding, and `tool_result` delivery path used by real calls. `hello_ack` and heartbeats alone can no longer produce `daemon.connected=true` when result delivery is broken. The local runtime also rejects pre-ready tool calls and a premature `ready_ack` that was not preceded by a successfully delivered probe result.
267
- - Keep the incumbent verified daemon active while a replacement is authenticated and probed. A failed, malformed, silent, or incompatible candidate is closed without displacing the working connection; only a successful `ready_ack` handover replaces the incumbent. Candidate hello, readiness, and steady-state liveness have independent bounded deadlines enforced by Durable Object alarms.
268
- - Extract daemon attachment/state transitions into `DaemonSocketRegistry`, expose authenticated/probing/ready counts and readiness timestamps through `server_info`, and add fault-injection coverage for missing acknowledgements, invalid probe results, replacement races, reconnect backoff, session-generation propagation, and full OAuth/MCP/WebSocket routing.
269
- - Correct capability ranking after the local research-skill rename: generic identity tokens such as `web`, `cli`, and `tool` no longer dominate selection, while concrete Chinese research/search intent maps to `research`, `search`, and `find`. This prevents a browser-form task from selecting a web-research skill without weakening explicit research requests.
270
- - Remove a duplicate Worker route guard, require awaited alarm rescheduling after inbound activity, retain zero production dependency vulnerabilities, and refresh architecture, operations, logging, testing, upgrade, and audit documentation. State schema 6 and policy revision 5 remain unchanged.
271
-
272
- ## 1.2.4 - 2026-07-17
273
-
274
- ### Relay tool_result session context regression
275
-
276
- - Pass the authenticated relay session generation into every inbound WebSocket `onMessage` callback. The 1.2.2 session-binding change discarded every `tool_result` with `session_ended` because handlers received `sessionId=0` even while heartbeats kept the socket live, so MCP tools timed out despite `daemon.connected=true`.
277
- - Emit an explicit error when a tool result is discarded because the inbound call context lacked a session id, and include both expected and active session ids in the structured event.
278
- - Add a regression that proves message dispatch attaches the current authenticated session generation.
279
-
280
- ## 1.2.3 - 2026-07-17
281
-
282
- ### Worker daemon false-online liveness
283
-
284
- - Treat authenticated daemon sockets as live only when inbound traffic is recent. `role=daemon` plus `readyState=OPEN` is no longer enough after Durable Object hibernation or a half-closed transport, which previously left `daemon.connected=true` while every `tool_call` timed out.
285
- - Persist `lastSeenAt` on daemon attachments, refresh it on `hello`, heartbeats, and `tool_result`, and reclaim silent sockets through the Durable Object alarm as well as on tool send failure or prolonged silence during a timed-out call.
286
- - Report `daemon.last_seen_at`, `daemon.liveness_timeout_ms`, and `worker.sockets_live` from `server_info` so control-plane counters that reset on DO wake are not mistaken for live authenticated sockets.
287
- - Add pure liveness helpers and regression coverage for fresh, silent, candidate, and legacy attachments without `lastSeenAt`.
288
-
289
- ## 1.2.2 - 2026-07-17
290
-
291
- ### Relay result lifecycle and human-readable diagnostics
292
-
293
- - Bind every local `tool_result` to the authenticated relay session that delivered its `tool_call`. A result from a disconnected or replaced socket is discarded instead of being sent over a newer connection, and a caller cancellation marks the eventual local result as intentionally undeliverable. Routine late-result races are debug-only rather than repeated `relay.tool_result.delivery_failed` warnings; an actual synchronous WebSocket send failure still invalidates the ambiguous transport.
294
- - Propagate MCP HTTP cancellation into the Worker pending-call registry. Incoming request cancellation removes both internal and session request-key indexes, sends a best-effort daemon cancellation, and records the call as cancelled. The Worker deployment now explicitly enables Cloudflare request-signal delivery and passthrough to the Durable Object.
295
- - Add an `unmatched_results` Worker metric for results that arrive after their pending record was removed. Human log mode uses natural-language event messages and omits the redundant machine event key, while JSON mode retains stable event names and bounded structured fields.
296
- - Add regression coverage for relay-session replacement, stale-result suppression, request-signal cleanup, human log rendering, compatibility flags, and unmatched-result observability. Local Wrangler integration continues to cover the complete OAuth/MCP/WebSocket flow and explicit MCP cancellation.
297
-
298
- ## 1.2.1 - 2026-07-16
299
-
300
- ### Fail-closed input contracts and bounded CLI adapters
301
-
302
- - Eliminate prototype-chain lookup from externally controlled command, action, account-role, policy-profile, form-field, keyboard, and local-resource keys. Dispatch and enumerations now use `Map`, `Set`, `Object.hasOwn`, or null-prototype records; names such as `constructor` and `__proto__` can no longer become inherited handlers or unauthorized enum members. A malformed current-schema OAuth account role is repaired in place to a disabled reviewer account, its version is advanced, and every existing authorization code and token is revoked so an affected installation remains administrable without granting authority.
303
- - Make Worker deployment output parsing and health verification share one canonical `workers.dev` origin validator. Wrangler output containing unrelated `/mcp`, `/healthz`, path-bearing, or wrong-name URLs is no longer accepted as deployment evidence and cannot poison the persisted URL or deployment fingerprint.
304
- - Preserve the exact browser `maxBytes` contract for non-ASCII page source. The DOM serializer now backs off to a complete UTF-8 prefix instead of decoding a split code point into a replacement character whose encoded size exceeds the reported budget; regressions cover emoji and Chinese text at every partial-byte boundary.
305
- - Replace ordinary browser and service CLI branch trees with named, map-driven adapters. The service adapter is independently injectable and reaches 100% function and over 90% branch coverage; architecture checks are split into module boundaries, repository hygiene, browser/security structure, and release/documentation contracts so source-shape guards remain supplemental to executable behavior tests.
306
- - Keep local state schema 6, policy revision 5, browser pairing, resources, jobs, and Worker identity unchanged for an in-place upgrade from 1.2.0. Normal startup still converges the versioned Worker and the unpacked extension must be reloaded; no live deployment, credential rotation, daemon replacement, global installation, or npm publication is performed by this source change.
307
-
308
- ## 1.2.0 - 2026-07-16
309
-
310
- ### Typed evolution boundaries and project governance
311
-
312
- - Split the highest-change orchestration modules along real lifecycle boundaries. Worker OAuth storage, registration, authorization, account administration, token verification, and mutation serialization now live in `OAuthController`; local runtime reporting, fixed diagnostics, and capability composition have dedicated services; Agent configuration/path validation and browser MCP operation semantics no longer share files with discovery or loopback broker transport. Persisted state schema 6, policy revision 5, token records, browser pairing, resources, and managed-job data remain unchanged for an in-place upgrade from 1.1.5.
313
- - Make Worker TypeScript imports explicit and directly executable under Node 26, including `.ts` specifiers and JSON import attributes. Add a focused OAuth-controller state-machine suite covering registration throttling, authorization failure/success, resource-bound access tokens, expiry pruning, schema mismatch, and missing identity keys while retaining the real workerd OAuth/MCP integration.
314
- - Add a strict checked-JavaScript contract gate for local policy, call lifecycle, Agent configuration and path containment, browser handshake parsing, capability ranking, monotonic deadlines, record/number normalization, and bounded metadata reads. Expand correctness linting to reject async Promise executors, returned Promise-executor values, unsafe `finally`, useless catches, invalid `typeof`, self-assignment, and invalid NaN comparisons, and unused imports/variables; fix every newly detected occurrence rather than waiving the rules.
315
- - Raise risk-directed coverage gates and include Agent, browser, runtime-boundary, and OAuth-controller fixtures. Worker pending-call and policy modules now have branch floors; the extracted runtime reporting, diagnostics, capability, browser operation, browser protocol, Agent contract, and capability-ranking modules have independent function and branch minima. Lower architecture line caps prevent the orchestration modules from regaining the extracted responsibilities.
316
- - Add a five-minute README path, explicit Node 26/npm 12 support boundaries, a current-only upgrade and rollback contract, support/reporting guidance, project governance and succession rules, and a code of conduct. The first control required after a second active maintainer joins is non-author and last-push approval for security-sensitive code and release surfaces.
317
- - Preserve release and supply-chain behavior: no live npm publication, Worker deployment, secret rotation, or daemon/service replacement is performed by this source release. Trusted npm publishing with GitHub OIDC still requires the external package-owner trust relationship and remains the next publication-control improvement.
318
-
319
- ## 1.1.5 - 2026-07-16
320
-
321
- ### Windows autostart and persisted network environment
322
-
323
- - Replace the oversized Windows Scheduled Task `/TR` invocation with a short private launcher. The launcher contains the full quoted Node/CLI/workspace argv, routes output to the normal service logs, exits on success, and restarts nonzero daemon exits after five seconds. Register it for current-user logon at `LIMITED` run level, and reject a custom state path when even the short action exceeds Task Scheduler's 262-character boundary.
324
- - Query Windows task state and last result through fixed PowerShell object properties instead of localized `schtasks` text. Creation, start, stop, and removal are verified against observed state; an installed `Ready` task is no longer reported as active, and localized nonzero stop/delete output cannot create a false failure after the requested state is reached. Default reboot recovery occurs after that Windows user signs in, not before login or as `SYSTEM`.
325
- - Persist an owner-only allowlist of proxy and custom-CA environment variables for autostart daemons. Session-only PowerShell proxy settings now survive logon/reboot, environment-free later starts do not erase them, explicit case-insensitive replacements remove stale variants, and status/logging expose only configured key names. Unrelated environment secrets, oversized values, and control characters are rejected.
326
- - Extend Worker idempotency coverage through a real disk-state reload to prove that a successful Wrangler upload followed by health timeout is not repeated by a new process. Clarify that a different canonical `--workspace` intentionally selects a different profile and Worker, and add terminal guidance to rotate any one-time account password exposed in shared output.
327
- - Refresh the exact `ws` and Wrangler pins. The `ws` patch tightens fragment buffering limits, while Wrangler advances its bundled `workerd`; update the reviewed install-script allowlist to the exact new `workerd` version and retain zero high-severity or production audit findings.
328
-
329
- ## 1.1.4 - 2026-07-15
330
-
331
- ### File integrity and contract corrections
332
-
333
- - Preserve exact UTF-8 line endings in `read_file` whole-file and line-range results. CRLF files no longer return LF-normalized content paired with a SHA-256 value for different text.
334
- - Flush workspace write and patch staging files through their open descriptors before atomic commit, remove partial staging files after failed writes, and report incomplete staging cleanup instead of leaving hidden residual data silently. This aligns `write_file`, `edit_file`, and `apply_patch` with the documented durability contract while retaining exact POSIX mode application.
335
- - Surface incomplete `apply_patch` rollback as an explicit recovery error, and return a warning when a committed transaction cannot remove an internal staging or backup artifact instead of silently hiding residual workspace state.
336
- - Enforce the documented 3-64 character account-name rule for newly created accounts in both the local administration client and Worker. Existing one-character accounts created by older versions remain discoverable for login and administration.
337
- - Correct CLI `--json` guidance to state that a newly generated account password is intentionally included once during initial creation or rotation; stored administration, daemon, and token-version secrets remain omitted.
338
-
339
- ## 1.1.3 - 2026-07-15
340
-
341
- ### Copilot Studio final OAuth callback
342
-
343
- - Complete the Power Platform browser callback chain by allowing `https://copilotstudio.microsoft.com` only when the already validated OAuth redirect URI belongs to Microsoft's HTTPS `consent.azure-apim.net` domain. Copilot Studio redirects global consent to a regional consent endpoint and then to its own `/connection/oauth/redirect` page; Chromium applies the originating authorization page's `form-action` policy across every hop.
344
- - Preserve the narrow security boundary: ordinary OAuth clients still receive only `'self'` plus their exact validated redirect origin, Microsoft consent callbacks retain the consent-subdomain allowance, and lookalike domains receive neither the regional nor Copilot Studio exception.
345
- - Extend the real Chrome regression to prove four policy states: self-only blocks the first callback, global-only blocks the regional handoff, global-plus-regional blocks the final Studio handoff, and the complete policy preserves `code` and `state` through the entire chain.
346
-
347
- ## 1.1.2 - 2026-07-15
348
-
349
- ### Copilot Studio regional OAuth callback
350
-
351
- - Allow a validated Microsoft `consent.azure-apim.net` OAuth callback to continue through Power Platform's HTTPS regional consent subdomains. Chromium applies the authorization page's `form-action` policy across redirects; the previous exact-global-origin policy let the Worker issue a valid authorization code but blocked Microsoft's `global` to `asia-001` handoff before token exchange, leaving Copilot Studio disconnected.
352
- - Keep the exception narrow: every authorization page still allows only `'self'` and its exact validated redirect origin, and only callbacks already validated on the Microsoft consent domain receive `https://*.consent.azure-apim.net`. Other OAuth clients, CORS rules, redirect binding, PKCE, account authentication, and token validation are unchanged.
353
- - Add Worker integration coverage for the Copilot Studio CSP and a real headless-Chrome three-stage regression proving that self-only policy blocks the first callback, exact-first-hop policy blocks the regional redirect, and the completed policy preserves `code` and `state` through the two-hop chain.
354
-
355
- ## 1.1.1 - 2026-07-15
356
-
357
- ### Windows Worker deployment convergence
358
-
359
- - Make Worker health probes use the same standard `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` routing model as the relay. The previous direct `fetch` probe could time out on Windows or managed networks after Wrangler had already completed a valid deployment. Restrict probes to the recorded HTTPS `workers.dev` origin and reject redirects so persisted state cannot redirect the verifier to an arbitrary network target.
360
- - Persist the successful Wrangler deployment URL, content/secret fingerprint, and deployed package version before the secondary health probe. A timeout, proxy failure, TLS failure, network failure, or temporary HTTP 5xx response now stops with corrective guidance and a later start verifies the same Worker instead of uploading it again; only bounded, definitive stale-version/identity evidence triggers automatic same-name redeployment.
361
- - Prevent accidental Worker proliferation by rejecting a changed `--worker-name` for an initialized workspace unless `--force-worker` explicitly authorizes the replacement. Retain prior names in local inventory so full uninstall can delete intentionally replaced Workers. Add a real local CONNECT-proxy regression, deployment ambiguity/idempotency tests, worker-name replacement tests, expanded CLI/state coverage, and higher critical-module coverage floors.
362
-
363
- ## 1.1.0 - 2026-07-15
364
-
365
- ### Claude and Microsoft Copilot Studio remote MCP
366
-
367
- - Add hosted-client OAuth interoperability for Claude custom connectors and Microsoft Copilot Studio while preserving the existing Streamable HTTP transport and current MCP protocol contract. Authorization-server and protected-resource discovery now advertise `offline_access` and the refresh-token grant; dynamic client registration declares both authorization-code and refresh-token grants.
368
- - Issue hashed access and refresh-token records from authorization-code exchange. Public-client refresh requests are form-encoded, bound to the original client/account/version/role/scope/resource, and rotate the refresh token atomically. Reuse, expiry, account changes, or deployment token-version changes return `invalid_grant`. Refresh state uses a separate versioned Durable Object key, so existing primary OAuth state does not require migration. The per-source DCR throttle now counts only registrations that have not completed authorization, preventing legitimate Claude or Copilot reconnections from consuming the abuse quota while retaining the deployment-wide client cap.
369
- - Exercise the exact hosted Claude callback, the unauthenticated `resource_metadata` challenge, discovery/DCR metadata, refreshed MCP access, refresh replay rejection, and account-targeted refresh revocation in the real Worker integration. Document Claude and Copilot Studio setup, and retain the narrow ChatGPT/Grok browser CORS set because Claude and Copilot Studio connect through cloud-side infrastructure rather than browser-origin response sharing.
370
-
371
- ## 1.0.8 - 2026-07-14
372
-
373
- ### Effective account authority reporting
374
-
375
- - Separate the authenticated account authority from the local daemon capability ceiling in remote diagnostics. `server_info.authorization.effective_policy` and `effective_tools` are now the authoritative account fields, while `daemon.policy` and `daemon.tools` are explicitly scoped as pre-role ceilings. The response also includes a deterministic authority summary and scope labels so clients cannot reasonably equate an `editor` account with a `full` daemon.
376
- - Make remote `project_overview` return the role-intersected policy and tools at its existing top-level fields, while preserving the daemon values separately as `daemonPolicy` and `daemonTools`. Add a Worker integration regression that authorizes an `editor` account against a canonical `full` daemon and proves shell/browser tools remain excluded at both reporting surfaces and at relay enforcement.
377
- - Update MCP initialization guidance, tool descriptions, operations diagnostics, architecture, client, account, testing, and generated tool-reference documentation to use the effective-account fields when diagnosing permissions.
378
-
379
- ## 1.0.7 - 2026-07-14
380
-
381
- ### Browser-complete OAuth callback navigation
382
-
383
- - Fix the authorization page CSP so a successful same-origin form POST may follow its `303 See Other` to the exact, already registered and validated OAuth redirect origin. The previous static `form-action 'self'` policy let the Worker issue a correct redirect but caused Chromium to block the callback navigation and leave the user on the consent page.
384
- - Keep the policy narrow: each consent page receives only `'self'` plus that request's exact redirect origin, never a wildcard or scheme-wide allowance. Add a real headless-Chrome negative/positive regression proving the old policy blocks the callback and the new policy preserves `code` and `state`; retain Worker-level CSP, PKCE, redirect/resource, password, and token tests. Invalid credentials now preserve only the non-secret account name and display an accessible error while never reflecting the password.
385
-
386
- ## 1.0.6 - 2026-07-14
387
-
388
- ### OAuth navigation origin handling
389
-
390
- - Stop treating the browser `Origin` header as an authentication boundary for actual Worker requests. OAuth authorization navigations and form submissions from opaque or client-specific browser containers now reach normal protocol validation instead of failing early with `origin_not_allowed`.
391
- - Keep CORS response sharing strict: only the Worker origin, the built-in ChatGPT/Grok origins, and exact `MBM_ALLOWED_ORIGINS` additions pass preflight and receive `Access-Control-Allow-Origin`. Unrelated and `null` origins receive no CORS permission, while PKCE, exact redirect/resource binding, account authentication, bearer tokens, and admin/daemon secrets remain authoritative.
392
-
393
- ## 1.0.5 - 2026-07-14
394
-
395
- ### Built-in ChatGPT and Grok origins
396
-
397
- - Allow the exact first-party browser origins used by ChatGPT (`https://chatgpt.com` and legacy `https://chat.openai.com`) and Grok (`https://grok.com` and `https://x.com`) directly in Worker origin validation. Users no longer need to run Wrangler or edit Cloudflare variables to complete OAuth from those clients.
398
- - Keep `MBM_ALLOWED_ORIGINS` as an additive exact-origin extension point, preserve same-origin and no-Origin requests, reject unrelated and `null` origins, and apply one predicate to preflight and actual requests. Integration tests exercise every built-in origin alongside a configured custom origin.
399
-
400
- ## 1.0.4 - 2026-07-14
401
-
402
- ### Windows first-run workspace
403
-
404
- - Keep the first interactive workspace question on Windows, but default it to `%USERPROFILE%\MachineBridge` instead of the Command Prompt current directory. Pressing Enter creates, canonicalizes, and remembers that folder, so users do not need `cd` or directory knowledge and an elevated prompt cannot accidentally select `C:\Windows\System32`.
405
- - Preserve explicit `--workspace` semantics for automation, while allowing an interactively entered Windows workspace folder to be created when it does not yet exist. The installed zero-argument startup test now verifies the remembered platform default.
406
-
407
- ## 1.0.3 - 2026-07-14
408
-
409
- ### Code-scanning and supply-chain integrity
410
-
411
- - Fix the SARIF gate so results with omitted rule metadata fail closed instead of being silently classified as non-security. Remove stale broad CodeQL exceptions, harden the generic process boundary with a fixed-option non-shell `child_process.spawn` wrapper and behavior regression, and retain only one exact, expiring false-positive record for that intentional authority boundary.
412
- - Gate OpenSSF Scorecard SARIF before upload. Replace mutable npm bootstrap commands with an exact npm 12.0.1 tarball plus pinned SHA-512 verification, make the source wrapper use `npm ci`, and convert randomized security properties to a deterministic `fast-check` `.js` suite recognized by the pinned Scorecard scanner, and separate the signed Scorecard analysis job from the failing SARIF gate job required by the action's workflow-verification rules.
413
- - Record only four expiring Scorecard governance/time exceptions that cannot be repaired by source code alone, reject remediable pinning/fuzzing exceptions, and require exact-commit CI, CodeQL, Governance, and Scorecard success before creating a source release.
414
-
415
- ## 1.0.2 - 2026-07-14
416
-
417
- ### Deadline and architecture integrity
418
-
419
- - Replace wall-clock arithmetic in startup-lock waits, verified daemon takeover/stop, process-session exit waits, managed-job recovery-lock handoff, full-access diagnostics, browser waits, page actionability/stability checks, application-discovery cache freshness, and local/Worker duration metrics with monotonic elapsed time. System clock rollback can no longer extend these bounded state machines, and a forward correction cannot force premature timeout; persisted expiry and retention timestamps remain wall-clock based.
420
- - Add deterministic clock-fault regressions at the shared deadline primitive, startup-lock production path, and browser-extension production path, and make the deadline suite a mandatory part of `npm run check`.
421
- - Correct stale architecture claims after the state-schema-6 and named-account releases: remote tokens are bound to named account principals and roles, duplicate JSON-RPC ids are scoped to one signed MCP session, and application-level account isolation is distinguished from OS/browser tenancy. Architecture tests reject a return to the obsolete statements.
422
-
423
- ## 1.0.1 - 2026-07-14
424
-
425
- ### Startup and release-gate reliability
426
-
427
- - Fix two production CLI references that were used without imports: `readdirSync` in the default Worker deployment fingerprint path and `inspectProcessInstance` in secret rotation. The former made a freshly installed 1.0.0 package fail immediately on zero-argument startup even though syntax, package, and cross-platform CI checks were green.
428
- - Fix the Windows Wrangler execution boundary uncovered by the new startup probe. Runtime code no longer passes `wrangler.cmd` to `spawn(..., { shell: false })`, which fails with `EINVAL` on Node 26; it invokes the dependency's declared JavaScript entrypoint through the current Node executable on every platform. A focused regression and the installed startup probe prevent a return to shell shims.
429
- - Add an ESLint correctness gate over Node production code, tests, scripts, and the packaged browser extension. Undefined identifiers, redeclarations, duplicate keys, unreachable statements, and non-loop constant conditions now fail `npm run check` before packaging or publication. A configuration self-test injects synthetic undefined Node/browser bindings so retaining a no-op or mis-scoped lint script cannot satisfy the gate.
430
- - Strengthen `install:test` to install the real `npm pack` tarball into an isolated global prefix and execute the installed CLI with zero arguments from a package-free workspace and isolated state root. A cross-platform fake Wrangler shim provides a controlled external boundary; the test requires state initialization, rejects `ReferenceError`/`is not defined`, and proves that default startup reaches Worker orchestration rather than only supporting `--version`.
431
- - Make both static lint and the installed zero-argument startup probe mandatory parts of the complete local, prepublish, Linux, macOS, and Windows release gate. Architecture checks prevent either gate from being removed silently and now enforce the existing exact-semver dependency policy instead of leaving it as documentation only.
432
-
433
- ## 1.0.0 - 2026-07-14
434
-
435
- ### Current-only protocol and runtime contract
436
-
437
- - Declare only MCP protocol `2025-11-25` across shared metadata, stdio, the local runtime, daemon handshakes, and the Cloudflare Worker. Older protocol dates are no longer advertised as supported; clients must negotiate the current protocol before invoking tools.
438
- - Add stateless, HMAC-bound `MCP-Session-Id` issuance. Concurrent chat windows using the same OAuth token now have independent JSON-RPC request-id and cancellation domains; sessionless independent POST requests no longer share a token-wide request-id lock.
439
- - Make terminal relay delivery fail closed: when a completed daemon call cannot return its `tool_result`, the daemon interrupts the ambiguous socket so Worker socket cleanup releases pending calls immediately instead of retaining a phantom active call until its long timeout.
440
- - Remove numeric-only managed-job lock interpretation and the remaining dead compatibility branches, unused imports, unreachable conditions, and stale orchestration variables. Current JSON ownership records with process start identity and random tokens are the only accepted lock contract.
441
- - Keep the current local state schema intact so an existing 0.18.x state root upgrades in place. The source upgrade remains operationally bounded: install the new package, run one normal `machine-mcp` startup to converge Worker and daemon versions, then reload the unpacked browser extension.
442
-
443
- ### Descriptor-first file and process security
444
-
445
- - Centralize regular-file opens behind a no-follow descriptor primitive that validates the opened object, applies permissions through the descriptor, and performs bounded reads without a separate path check. State, privacy scanning, service logs, managed-job diagnostics, and owner-only files now use this boundary.
446
- - Inspect SSH key pairs from private, bounded snapshots copied into a private temporary directory. Fingerprinting and public/private correspondence no longer operate on mutable caller paths, and the original files are revalidated by identity and constant-time byte comparison before success is returned.
447
- - Fix managed-job recovery handoff so the recovery runner must remove `recovery.lock` with the exact handed-off PID and ownership token. It can no longer delete a replacement claim by path alone.
448
- - Separate the internal `runExecutable` argv boundary from explicit shell execution, bound executable/argv sizes, reject NUL bytes, and retain `shell: false` for direct execution. Worker deployment consistency now uses an HMAC fingerprint keyed by deployment secrets rather than an ordinary digest over secret values.
449
-
450
- ### Enforced security evidence
451
-
452
- - Extend classified Windows atomic-replacement retries from 16 to 32 bounded attempts after hosted Windows runners reproduced an `EPERM` sharing window beyond the previous budget. The algorithm still uses one same-directory atomic rename, exponential backoff with jitter, and no delete-destination fallback.
453
- - Move the repository's local GitHub control-plane prohibition into shared MCP initialization and built-in working agreements so it is visible before project-specific task execution. If local Machine Bridge `git`/`gh` access is unavailable, automation must stop rather than fall back to a hosted GitHub connector or ChatGPT plugin. Align `ENGINEERING.md` and `CONTRIBUTING.md` with the source-release ownership contract.
454
- - Fail closed when owner-only directories are symlinks, non-directories, cannot be restricted to `0700` on POSIX, or remain group/other-accessible. Extract Worker deployment secret-file lifecycle from the CLI, bind temporary names to process-start identity, delete only positively reclaimable stale files, and surface cleanup failures instead of silently retaining management secrets.
455
- - Apply the same private-directory boundary to browser pairing, fail managed-job launch when existing diagnostic logs cannot be safely trimmed, and roll back POSIX file/patch commits when exact mode application fails. State-root removal now blocks on unreadable, malformed, symbolic-link, oversized, or otherwise unverifiable config/profile/daemon records instead of treating them as absent.
456
- - Remove the unused local error factory and default-role constant and make internal-only protocol, pairing, instruction, file, and OAuth helpers non-exported, reducing dead and misleading module surface.
457
-
458
- - Add a SARIF security gate to the required CodeQL workflow. Any new security-tagged result fails the required check; intentional high-authority process boundaries require an exact rule/path exception with a substantive rationale and expiry date.
459
- - Add deterministic property tests over hostile browser-protocol bytes, policy combinations, argv values, and shell-metacharacter arguments. Add production-path service command coverage and remove test-only filesystem check/use patterns that obscured CodeQL results.
460
- - Preserve the complete cross-platform, Worker, stdio, browser, lifecycle, atomic-file, process-tree, package, privacy-history, dependency, and release-integrity suite as the release gate.
461
-
462
- ## 0.18.1 - 2026-07-14
463
-
464
- ### Fixed
465
-
466
- - Wait for launchd service state to converge after a successful `bootout` before deciding that stop or restart failed. The bounded poll handles macOS's asynchronous unload window while still failing closed when the service remains active.
467
- - Add deterministic coverage for delayed launchd inactivity and for the bounded failure path.
468
-
469
- ## 0.18.0 - 2026-07-14
470
-
471
- ### Isolated multi-account authorization
472
-
473
- - Replace the workspace-wide shared OAuth password with named accounts and four roles: reviewer, editor, operator, and owner. OAuth codes and tokens are bound to one account id, account version, and role; account changes revoke only that account's credentials.
474
- - Intersect each account role with the connected daemon policy when listing or invoking tools. The Worker rejects unauthorized tools before relay, and every relayed call carries immutable account authorization metadata for a second local enforcement check.
475
- - Add owner-only account administration for listing, creating, enabling, disabling, changing roles, rotating passwords, and removing accounts. Passwords are generated 256-bit tokens stored as independent salted HMAC-SHA-256 verifiers; arbitrary human-chosen passwords are rejected, plaintext tokens are shown once, and they are not retained in local state.
476
- - Upgrade the existing Cloudflare Worker and Durable Object in place. A one-time release operation converts the current shared credential into the initial owner account and annotates existing OAuth codes and tokens without changing their keys or the global token version, preserving the existing ChatGPT connector authorization.
477
-
478
- ### Runtime reliability and diagnostics
479
-
480
- - Cancel all relay-owned local calls immediately when the relay disconnects. Process execution now rejects cancellation before a child emits `close`, while process ownership remains tracked until actual exit, preventing permanently active calls without losing process cleanup.
481
- - Replace prefix-only command capture with bounded beginning-and-end retention. Long stdout and stderr report exact omitted byte counts and preserve the diagnostic tail where test and compiler failures normally appear.
482
- - Consume rejected authenticated MCP request bodies before returning 401, preventing workerd request-stream exceptions after per-account token revocation.
483
-
484
- ### Breaking state and maintenance model
485
-
486
- - Advance local state to schema 6, the state-root marker to schema 2, and policy to revision 5. Final runtime code accepts only the current formats; valid obsolete state is rejected instead of migrated, while syntactically corrupt JSON is isolated and rebuilt as current empty state.
487
- - Remove shared-password CLI flags, policy migration branches, old daemon-lock interpretation, numeric managed-job PID compatibility, and old log-format archival. The one-time in-place release operation updates live state and deletes obsolete artifacts before the final runtime is installed.
488
-
489
- ## 0.17.1 - 2026-07-14
490
-
491
- ### Installation and first use
492
-
493
- - Add an end-to-end installation and first-use guide covering transport selection, authority profiles, prerequisites, released and source installation, first remote deployment, current ChatGPT developer-mode connection, stdio configuration, existing-profile browser pairing, verification, routine operation, multi-workspace use, upgrades, layered troubleshooting, and fail-closed removal.
494
- - Link the detailed guide from the README while retaining the compact command reference, and clarify how to distinguish package, Cloudflare, daemon, MCP-host, operating-system, and browser failures.
495
-
496
- ### Multi-client and multi-account boundary
497
-
498
- - Document that the existing Worker supports multiple OAuth client registrations and access tokens but does not provide isolated human/service accounts: all successful authorizations use one per-workspace connection password and share the same policy and daemon authority.
499
- - Define a principal-aware evolution path that keeps OAuth clients separate from principals, memberships, and named grants; uses capability intersection and dual Worker/local enforcement; adds targeted revocation and per-principal quotas; and retains one bridge/Durable Object per workspace or trust domain.
500
- - Make the security and architecture contracts explicit: mutually untrusted users require separate bridge instances and preferably separate low-privilege OS, container, or VM boundaries because application-level roles cannot isolate local process, shell, browser, or credential-store authority.
501
-
502
- ## 0.17.0 - 2026-07-13
503
-
504
- ### Project governance and contribution flow
505
-
506
- - Define a risk-based project standard covering GitHub Flow, Conventional Commits, architecture boundaries, MCP contract ownership, testing, errors, logging, supply-chain security, documentation, review, and explicit exceptions. Add pull-request and structured issue templates plus area ownership through CODEOWNERS.
507
- - Add an executable Conventional Commit policy for pull-request and main-branch commit titles. Keep the repository on squash-based GitHub Flow rather than introducing permanent develop/release branches that do not match its single-maintainer, continuously released operating model.
508
- - Require all repository-host operations to use local `git`, `gh`, and `gh api` through Machine Bridge. Explicitly prohibit hosted GitHub connectors or ChatGPT GitHub plugins so remote mutations, credentials, refs, checks, and recovery remain observable from one local control plane.
509
- - Make repository automation responsible for closing the source-change lifecycle: after all required checks pass it squash-merges the pull request, verifies `main`, creates and pushes the annotated version tag, and creates or updates the matching GitHub Release. npm publication, Worker deployment, credentials, global installation, and daemon/service replacement remain separately authorized live operations.
510
-
511
- ### Generated contracts and security automation
512
-
513
- - Generate a complete MCP tool reference from the shared tool catalog and reject stale output in the required suite. The tool catalog remains the single source for names, availability, annotations, and JSON input schemas; REST-specific Swagger documentation is not duplicated for the MCP surface.
514
- - Add pinned, least-privilege GitHub workflows for CodeQL analysis, pull-request dependency review, OpenSSF Scorecard publication, and governance checks. Preserve exact dependency versions, registry signature/attestation verification, SBOM generation, history privacy scanning, and cross-platform package tests.
515
-
516
- ### Cohesion, reuse, and runtime reliability
517
-
518
- - Extract optional project-metadata reads, strict integer normalization, plain-record validation, and uninstall/service state inventory into focused shared modules. Remove duplicate numeric clamping, record classification, and no-follow UTF-8 metadata readers while preserving the distinct strict validation semantics used by browser/application commands and Agent Context instruction files. Plain-record validation now rejects class instances instead of treating every non-array object as protocol/configuration data.
519
- - Reduce the CLI entrypoint from 1,169 to 1,063 lines by moving profile, Worker, active-job, and process-lock inventory behind a dedicated boundary. Add direct failure-path tests and enforce 91% function/73% branch coverage for the new inventory module; raise the CLI branch floor from 5% to 10%.
520
- - Canonicalize existing state roots before profile enumeration, fixing macOS `/var` versus `/private/var` alias mismatches that could make service removal or lock inspection report inconsistent profile paths. Retry only the final daemon-lock handoff after a verified service stop, and keep daemon fixture subprocesses out of V8 coverage so process teardown does not create platform-timing failures.
521
- - Generate Wrangler environment declarations through a cross-platform script that creates ignored `.wrangler/` state before invoking Wrangler, instead of writing under `src/worker`; packaging tests reject generated type declarations. This removes clean-runner state dependence and reduces the dry-run package from about 410 KB/1.8 MB unpacked to about 314 KB/1.22 MB while retaining every Worker runtime module.
522
- - Replace repeated empty WebSocket send/close catches in the Worker and browser extension with small module-local best-effort helpers whose comments preserve the primary failure semantics. Architecture checks reject unexplained empty catches on those protocol boundaries.
523
-
524
- ### Tests and documentation
525
-
526
- - Extend architecture checks to require generated tool documentation, governance scripts, security workflows, explicit workflow permissions, immutable Action references, and rejection of privileged pull-request triggers or write-all permissions.
527
- - Document why aggregate 80% coverage is not a sufficient quality target, identify the current CLI orchestration branch-coverage weakness, and retain per-module risk thresholds plus behavior-level cross-platform, concurrency, fault-injection, and protocol tests.
528
-
529
- ## 0.16.2 - 2026-07-13
530
-
531
- ### Fixed
532
-
533
- - Package the entire `src/worker` directory (instead of just `src/worker/index.ts`) in the published npm package so that global installations have all files required to compile/deploy the Worker.
534
- - Add regression coverage in packaging tests to verify all worker modules are present.
535
-
536
- ## 0.16.1 - 2026-07-13
537
-
538
- ### Fixed
539
-
540
- - Fix `machine-mcp` startup after 0.16.0 by keeping normalized policy capabilities immutable while allowing the sealed CLI-owned state record to update persistence metadata.
541
- - Add regression coverage proving `updatedAt` remains writable without permitting capability fields or undeclared fields to be mutated.
542
-
543
- ## 0.16.0 - 2026-07-13
544
-
545
- ### Runtime boundaries and lifecycle
546
-
547
- - Replace the monolithic local tool dispatcher with a middleware-based execution pipeline covering policy authorization, bounded call registration, cancellation/deadlines, stable error normalization, structured lifecycle events, and per-tool metrics. Add explicit runtime lifecycle states and a process tracker so stop/cancel paths release calls and child ownership deterministically.
548
- - Extract workspace filesystem transactions, process/shell execution, Git operations, CLI option/policy parsing, local resource/browser/job administration, capability ranking, managed-job plan/resource validation, browser extension protocol handling, and browser pairing persistence into focused modules. Add executable line-count and dependency-direction limits so these responsibilities cannot silently return to `LocalRuntime`, the CLI entrypoint, or browser manager.
549
- - Split the Worker Durable Object into HTTP/CORS boundaries, OAuth state/PKCE helpers, shared policy evaluation, structured errors, pending-call indexing, and observability. Replace the linear pending-call scan with an atomic ID/request-key registry so completed, cancelled, timed-out, send-failed, and disconnected calls clear both indexes before settling; JSON-RPC request IDs can be reused immediately after completion.
550
-
551
- ### Policy, errors, logging, and observability
552
-
553
- - Define policy revision 4 in one shared contract consumed by the local daemon, Worker, generated documentation, tests, and architecture checks. Fix `start_job` to require both write and direct-execution capabilities, keep `cancel_job` write-gated, and expose read-only resource/job inventory to review-mode clients without granting mutation authority.
554
- - Introduce typed `BridgeError`/Worker errors with allowlisted stable codes and retryability. Centralize legacy error classification at adapters instead of making transports and tests depend on free-form English messages. Unknown programming errors are no longer silently converted into ordinary managed-resource unavailability; a failing timeout callback still settles and clears its pending indexes.
555
- - Add structured JSON lifecycle logging and in-memory observability for calls, durations, errors, active processes, pending request indexes, daemon candidates, socket transitions, and per-tool outcomes. Autostart services now use warning-level JSON logs by default while foreground output remains human-readable; local and Worker structured-field redaction is behavior-tested.
556
-
557
- ### Tests, documentation, and audit follow-up
558
-
559
- - Add behavior tests for policy parity, compound ACLs, middleware order, runtime lifecycle transitions, process ownership, pending-ID reuse, socket cleanup, Worker/local error serialization, structured log privacy, bilingual capability ranking, and generated policy documentation. Replace brittle source-string and monkeypatched happy-path tests with production-path deadline, process-tree, OAuth/MCP, and resource-reload coverage.
560
- - Add a critical-module V8 coverage gate with per-module function/branch baselines, rather than a single aggregate percentage that hides weak orchestration coverage. Generate `docs/POLICY_REFERENCE.md` from the shared policy contract and tool catalog; CI rejects stale generated documentation.
561
- - Correct an extraction defect where a re-exported resource inspector was not locally bound and a broad catch disguised the resulting `ReferenceError` as `resource_unavailable`. File availability now degrades only for classified filesystem conditions; unexpected implementation faults remain visible.
562
-
563
- ## 0.15.0 - 2026-07-13
564
-
565
- ### Daily-profile browser verification and protocol safety
566
-
567
- - Verify the unpacked extension in the user's ordinary Chrome profile with a localhost-only live smoke test covering the acknowledged protocol handshake, real tab lifecycle, semantic inspection, open Shadow DOM, complex form fill, fixed DevTools text/click input, waits, screenshot capture, and cleanup. `browser status` and loopback health now report extension version/protocol, that Machine Bridge did not launch the browser, and the fact that daily-vs-isolated profile identity is not machine-verifiable.
568
- - Upgrade the extension protocol to an acknowledged `hello`/`hello_ack` state machine with exact packaged-version, protocol, and capability equality. WebSocket open is no longer treated as authenticated readiness, pairing material is persisted only after a successful capability handshake, failed candidate pairing preserves the prior configuration, pairing-page and broker ports must match, and extension WebSocket origins require a canonical 32-character Chromium extension ID.
569
- - Prevent duplicate side effects after an ambiguous trusted-input failure. `auto` falls back to DOM only before any DevTools `Input` command starts; after dispatch begins, the operation fails with an explicit unknown-outcome instruction to inspect the page before retrying. Screenshot capture temporarily activates only the requested tab, never focuses its window, and restores the previous active tab unless the user changed it concurrently.
570
-
571
- ### Bounded page processing and extension architecture
572
-
573
- - Apply `max_bytes` and `max_elements` as aggregate request budgets across at most 64 accessible frames. Replace full `outerHTML` construction with a bounded iterative DOM serializer, cap page scans at 100,000 nodes, bound page-controlled metadata/text, cap reusable refs at 10,000 per frame, redact URL userinfo, mark contenteditable secret controls as sensitive, and report frame/node/text/ref truncation explicitly.
574
- - Report partial multi-field form mutation precisely when a later field or submission fails. Navigation waits now inherit the bounded request deadline rather than using a hidden fixed 30-second timer.
575
- - Extract tab/page/wait/source/screenshot orchestration into fixed `browser-operations.js`; the Manifest V3 service worker now owns only pairing, transport, acknowledged readiness, cancellation, and response routing. Architecture tests enforce this responsibility boundary.
576
-
577
- ### Cross-platform audit and regression coverage
578
-
579
- - Replace ad-hoc Windows Scheduled Task argument quoting with the Windows CRT-compatible backslash/quote algorithm, including drive-root and trailing-backslash paths.
580
- - Add behavior tests for handshake readiness, provisional pairing persistence, trusted-input replay prevention, focus restoration, aggregate frame/source budgets, hostile DOM/text bounds, partial form failure, strict extension origins, and Windows command-line quoting. Synchronize architecture, security, operations, testing, audit, and tool documentation.
581
-
582
- ## 0.14.0 - 2026-07-13
583
-
584
- ### Windows installation and OAuth callback reliability
585
-
586
- - Bootstrap installation through pinned npm 12.0.1 from an empty temporary directory before using `--allow-scripts`, declare the npm 12 requirement in package `engines`, and make `machine-mcp doctor` verify the active npm version. This removes the unsupported old-npm path shown by Windows and gives accurate diagnostics for `Unknown cli config "--allow-scripts"` and legacy `devEngines.node` errors without guessing which package supplied the invalid metadata.
587
- - Construct OAuth callback destinations with the URL API and return `303 See Other` after consent instead of manually concatenating a `Location` string. Add an end-to-end ChatGPT callback regression with reserved state characters and exact origin/path checks.
588
- - Extend the isolated install smoke test to require npm 12, install from an empty directory, verify the packaged npm engine requirement, and run the test on Linux, macOS, and Windows CI.
589
-
590
- ### Existing-profile browser automation
591
-
592
- - Keep the authenticated Manifest V3 extension as the primary browser backend so automation operates the user's ordinary Chromium profile, tabs, extensions, cookies, and login state instead of launching a separate profile. Add tab creation/activation/closure and explicit combined waits for URL, document readiness, page text, and element state.
593
- - Replace fragile inspect-then-selector flows with bounded semantic snapshots containing stable per-document/frame element references, visibility/enabled/editable state, and viewport geometry. Page actions now wait for attachment, visibility, enabled/editable state, geometric stability, and unobscured pointer hit targets; ambiguous selectors and stale references fail explicitly.
594
- - Add double-click, hover, append-text, and scroll-into-view actions. Top-frame click, double-click, hover, key press, and text input can use fixed short-lived Chromium DevTools Input commands through explicit `auto`, `trusted`, or `dom` modes. The extension exposes no caller-selected CDP method or arbitrary JavaScript and detaches the debugger in `finally`.
595
-
596
- ### Architecture, security, tests, and documentation
597
-
598
- - Extract browser command normalization into a focused local module and isolate trusted input in a fixed extension module. Add a versioned extension capability handshake, stale-build reload guidance, explicit keepalive handling, and replacement validation that preserves the current compatible connection until the candidate is accepted; accepted replacements reject in-flight direct and proxied requests with retry guidance instead of leaving them to time out. Preserve resource-backed secrets/files, strict action/value validation, bounded broker messages, cancellation, source limits, and the existing owner-only pairing model.
599
- - Add behavior-level tests for command contracts, trusted-input command sequences and cleanup, semantic-ref stability, deterministic scrolling, obscured-target waiting, stale refs, broker routing, catalog parity, and architecture invariants. Update browser setup, permission, security, architecture, testing, and tool documentation.
600
-
601
- ## 0.13.0 - 2026-07-13
602
-
603
- ### Automatic capability routing and observability
604
-
605
- - Register bounded `package.*` commands from safe root `package.json` script names, while preserving explicit manifest override/deletion and never injecting script bodies. Windows uses a fixed `cmd.exe` wrapper for package-manager shims; Unix keeps direct executable argv. Extend default skill discovery to project `.codex/skills` and unrestricted `CODEX_HOME/skills` compatibility roots.
606
- - Match installed applications by their actual names for every canonical-full task instead of requiring generic “app/window” words, with a bounded discovery cache to avoid repeated filesystem scans.
607
- - Normalize a bounded set of common English inflections and Chinese workflow intents before skill/command ranking, and weight capability-name matches above incidental description overlap. This fixes Chinese selection of `skill-creator`, `web-research-cli`, and `skill-installer` and prevents generic “create” wording from preferring unrelated design skills.
608
- - Record privacy-preserving bootstrap and task-resolution telemetry in `server_info` and `project_overview`: counts, timestamps, source/load flags, selected capability metadata, and a runtime-keyed task fingerprint rather than raw task text. Suppress weak skill-overlap recommendations and clarify that the MCP host still controls whether the resolver and recommended tools are invoked.
609
-
610
- ### Process and network lifecycle
611
-
612
- - Consolidate graceful process-tree termination plus forced escalation. Timeout, cancellation, and replacement now retain the escalation timer after the direct child exits, preventing a SIGTERM-resistant descendant with detached stdio from surviving as an orphan.
613
- - Add relay support for standard `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` routing through a reviewed HTTP(S) proxy agent. Invalid proxy URLs or unsupported proxy protocols fail fast with corrective guidance; status exposes only direct/proxy/invalid route state and never proxy URLs or credentials.
614
-
615
- ### Architecture, tests, and documentation
616
-
617
- - Extract package metadata/command discovery and capability observation into focused modules, add domain-to-adapter import-boundary checks, remove duplicate object fields, and centralize reused metadata parsing.
618
- - Add behavior-level regression coverage for automatic package commands, direct `.codex/skills` compatibility, capability telemetry privacy, application-cache refresh, proxy selection/failure, and the direct-child-exits-first orphan-process boundary. Synchronize architecture, operations, logging, security, testing, and agent-context documentation.
619
-
620
- ## 0.12.2 - 2026-07-12
621
-
622
- ### Cross-platform persistence and browser reliability
623
-
624
- - Extend transient Windows atomic replacement from eight short linear retries to sixteen bounded exponential retries with jitter. The implementation continues to use one same-directory atomic rename and never falls back to deleting the destination, while tolerating longer antivirus/indexer/reader sharing windows.
625
- - Eliminate a broker-test race that could miss the runtime `hello` message between WebSocket `open` and listener registration. Pairing HTTP requests and WebSocket open/message/close waits are now bounded, and failed proxy candidates are terminated so a handshake cannot retain the test process indefinitely.
626
-
627
- ### CI, release, and supply-chain integrity
628
-
629
- - Require a completed successful push-triggered GitHub Actions run for the exact `origin/main` commit before creating or verifying a version tag, GitHub Release, or release asset. A local test pass is necessary but no longer sufficient for publication.
630
- - Pin all third-party GitHub Actions to immutable commit SHAs, retain Dependabot updates, and enforce the pinning plus the release-CI wiring through architecture and dedicated release-gate tests.
631
- - Run a reachable-history privacy audit in the package-audit job. The scanner covers historical UTF-8 blob contents, historical paths, and commit messages without printing matched values, while narrowly ignoring the standard public Dependabot signing trailer.
632
-
633
- ### Regression coverage and audit follow-up
634
-
635
- - Add deterministic tests for twelve consecutive transient Windows replacement failures, exponential delay selection, lost browser handshakes, bounded socket waits, portable simulated-Linux launcher paths on Windows, POSIX-versus-Windows daemon-stop semantics, deleted historical credential blobs, public automation trailers, and successful/failed/pending release CI states.
636
- - Update the architecture, engineering, privacy, testing, release, security, and audit documentation. Record remaining immutable Git-history identity metadata separately from current-tree and active-credential findings.
637
-
638
- ## 0.12.1 - 2026-07-12
639
-
640
- ### Real local automation corrections
641
-
642
- - Make the fixed macOS JXA helper return JSON as the top-level `osascript` result instead of using `console.log`, which real `osascript` sends to stderr. Empty helper stdout now fails explicitly rather than being interpreted as a successful empty object.
643
- - Skip recursive macOS menu-bar/menu traversal by default so bounded inspection reaches main-window controls promptly. Add `include_menus` to inspection and actions for explicit menu automation.
644
- - Normalize hyphens, underscores, dots, and spaces during capability ranking, and strongly boost explicitly named skills and commands. Natural-language references such as `agents progressive disclosure` now select `agents-progressive-disclosure` instead of a generic competing skill.
645
-
646
- ### Live verification and regression coverage
647
-
648
- - Add regression coverage for missing JXA output, menu-recursion forwarding, and punctuation-normalized Skill selection. Add an opt-in real macOS Calculator smoke path and document isolated-profile MV3 browser validation.
649
- - Validate the source runtime with a temporary real global instruction file, an existing user Skill, a registered direct-argv command, shell execution, Calculator discovery/open/activation/inspection/click, and a real unpacked browser extension controlling a local form through inspect/fill/click/source/screenshot operations. Test files, browser profiles, temporary global configuration, tabs, and application state are removed afterward.
650
-
651
- ## 0.12.0 - 2026-07-12
652
-
653
- ### Locking, persistence, and process lifecycle
654
-
655
- - Replace partial-write-prone final-path lock creation with fully written, flushed temporary files and atomic same-directory hard-link claims. Record ownership tokens and process start times, detect PID reuse, verify file identity before stale-lock removal, preserve recent malformed locks, and add bounded startup-lock waiting.
656
- - Add a state-root maintenance lock for full uninstall, including checks in already constructed managed-job and browser managers. State roots must be disjoint from selected workspaces, including non-existent paths beneath canonicalized platform aliases; unreadable locks/jobs and ambiguous process identities now block destructive cleanup rather than being treated as inactive.
657
- - Consolidate owner-only state, managed-job, runner, browser-pairing, and service-definition commits on one flushed atomic replacement primitive. Only successfully read invalid JSON is backed up; permission, symbolic-link, size, invalid UTF-8, and I/O failures propagate without silently reconstructing empty state.
658
- - Persist managed-job runner process identity, protect transition/recovery locks with token and file-snapshot checks, hand recovery ownership to the runner without an unconditional delete, and keep timeout/cancellation escalation alive until resistant descendant process trees are terminated.
659
-
660
- ### Services, uninstall, and cross-platform behavior
661
-
662
- - Extract one fail-closed service lifecycle: stop the platform service, stop every verified workspace daemon, and remove the service definition only after all stop phases succeed. Full uninstall scans every profile and rechecks managed jobs and process locks while holding maintenance ownership.
663
- - Normalize launchd, systemd user services, and Windows Scheduled Tasks to a common success/failure contract so non-zero Linux/Windows stop results cannot be mistaken for success. Preserve service definitions and local state whenever stop, verification, definition removal, or remote Worker discovery is incomplete.
664
- - Make CLI helper timeouts terminate process groups/trees rather than only direct children, including forced escalation for descendants that ignore graceful termination.
665
-
666
- ### Security, privacy, and local automation
667
-
668
- - Expand repository privacy and log redaction coverage for npm authentication, common cloud/source-control/chat/payment tokens, JWT-shaped values, embedded-credential URLs, broader private-key headers, credential-shaped filenames, and non-example identities. Scanner read/traversal failures now fail closed without echoing matched values.
669
- - Add final-component no-follow reads in restricted filesystem paths, reject NUL application action values, and normalize browser-upload filenames and MIME types to prevent deceptive metadata or downstream form parsing ambiguity.
670
- - Close authenticated browser broker sockets with protocol-specific WebSocket codes for oversized, invalid UTF-8/JSON, or structurally invalid messages instead of silently retaining faulty clients.
671
-
672
- ### Tests, architecture, and documentation
673
-
674
- - Replace the hand-maintained JavaScript syntax list with recursive entrypoint discovery; remove stale imports and duplicated lifecycle logic. Add executable concurrency, atomicity, PID-reuse, service-failure, process-tree, state-corruption, unsafe-root, unreadable-job, browser-protocol, upload-metadata, and privacy regression tests.
675
- - Add `docs/AUDIT.md` and synchronize architecture, security, operations, logging, privacy, managed-job, local-automation, testing, contribution, and release documentation with the implemented fail-closed behavior and residual OS-level limitations.
676
-
677
- ## 0.11.1 - 2026-07-12
678
-
679
- ### Reliable macOS service and orphan-daemon takeover
680
-
681
- - Stop launchd jobs by their loaded service target first, with the plist form retained as a compatibility fallback. Treat an already-unloaded job as an idempotent success, verify the post-stop state before reporting success, and prevent `service start` or `service uninstall` from continuing when the existing job remains active.
682
- - Detect legacy daemon locks that predate mode/version metadata by inspecting the live process command line. A process is eligible for takeover only when its PID, daemon purpose, canonical workspace, canonical state root, entrypoint, and `--daemon-only` arguments all match. Foreground or unverifiable processes are never signalled.
683
- - Let normal foreground startup and `machine-mcp service stop` terminate a verified detached/orphan service daemon with `SIGTERM`, wait for the actual PID as well as the lock to disappear, reclaim stale locks through the normal token-aware primitive, and fail with a bounded timeout rather than escalating to a forced kill.
684
- - Extend `machine-mcp service status` to report platform-service state and workspace-daemon state separately, including whether a live legacy process was verified as service-style. This makes a launchd-unloaded but still-running daemon visible instead of presenting a misleading inactive-only status.
685
-
686
- ### Tests and documentation
687
-
688
- - Add real child-process regression coverage for legacy orphan takeover, canonical `/var` versus `/private/var` path aliases, foreground-process protection, non-forcing timeout behavior, launchd service-target generation, and packaged daemon-process module presence. Update upgrade and recovery guidance for the exact npm install command and split service/daemon diagnosis.
689
-
690
- ## 0.11.0 - 2026-07-12
691
-
692
- ### Zero-configuration agent working agreements
693
-
694
- - Add a package-controlled `machine-bridge://defaults/working-agreements` instruction layer so every stdio and remote MCP session starts with conservative, auditable guidance even when the user and repository provide no `MODEL.md`, `AGENTS.md`, or manifest. The baseline covers inspect-before-editing, minimal coherent changes, preservation of unrelated work, existing-toolchain reuse, tests/documentation synchronization, honest validation reporting, secret handling, safe Git practice, and explicit authorization for publication, deployment, credential rotation, live-data mutation, system-wide installation, and destructive operations.
695
- - Keep the baseline lower precedence than explicit user and root-to-target project instructions. Expose its source, size, hash, precedence, and optional content through `session_bootstrap`, `agent_context`, and `resolve_task_capabilities`; include its hash in live capability fingerprints. The defaults are behavioral guidance rather than a replacement for Machine Bridge policy, host approvals, operating-system permissions, hooks, sandboxes, or external isolation.
696
-
697
- ### Bounded automatic project context
698
-
699
- - Add `machine-bridge://project-context/current`, regenerated on every relevant context scan from bounded repository metadata: target-relative path, recognized project/build entry files, JavaScript package-manager and lockfile facts, package script names, runtime constraints/version hints, common documentation files, and CI entrypoint filenames. The scanner executes nothing, writes no user or repository files, omits script bodies, dependency values, source/document contents, absolute home paths, and command output, and never claims a declared command was validated.
700
- - Harden repository-controlled metadata with strict character/count/byte limits, no-follow regular-file reads, safe workflow-name filtering, independent 16 KiB output bounds, and conservative skipping of symbolic links, invalid UTF-8, oversized files, permission failures, and transient metadata races. Add user-global `builtin_instructions` and `automatic_project_context` boolean opt-outs; project manifests cannot disable the user's baseline controls.
701
-
702
- ### Documentation and verification
703
-
704
- - Document the default instruction model, precedence, opt-outs, privacy data surface, security boundary, recommended `AGENTS.md` content, progressive disclosure, and official cross-agent best-practice sources. Update repository automation guidance, shared MCP tool descriptions, initialization instructions, architecture, clients, logging, privacy, security, testing, and package contents.
705
- - Add regression coverage for no-file defaults, initialization injection over stdio, automatic project refresh/fingerprints, package-manager/lockfile/script/CI discovery, script-body non-disclosure, hostile metadata filtering, global opt-out, project opt-out rejection, precedence, and packaged-module presence.
706
-
707
- ## 0.10.1 - 2026-07-12
708
-
709
- ### Foreground startup and upgrade takeover
710
-
711
- - Make a normal `machine-mcp` start reliably take over from an active platform autostart daemon: detect whether the service is active, request shutdown, wait up to 15 seconds for the workspace daemon lock to be released, and then continue foreground startup with the newly installed CLI. A failed bounded takeover now exits with explicit `service stop`/`service status` recovery guidance instead of silently leaving the old process in place.
712
- - Record foreground/background mode and package version in new daemon locks. A genuine lock conflict now identifies the running mode/version when known, explains how to stop it, and no longer prints the misleading `[ok] ready` block when no restart or requested change occurred. Service-style duplicate starts remain silent idempotent successes.
713
-
714
- ### Global instructions and operator guidance
715
-
716
- - Add copy-paste setup instructions for `~/.config/machine-bridge-mcp/agent.json` and the global `MODEL.md`, explain global-versus-project precedence, live rescanning, and when a new MCP conversation/reconnection is needed for initialization-time injection.
717
- - Document the foreground/background distinction, safe global upgrade sequence, owner-only instruction-file permissions, background log locations, and the exact optional-dependency install command that avoids the development-only `fsevents` warning.
718
-
719
- ## 0.10.0 - 2026-07-12
720
-
721
- ### Session context and capability selection
722
-
723
- - Add a global `model_instructions_file` in `~/.config/machine-bridge-mcp/agent.json`. Stdio and remote MCP initialization append the bounded user-designated instructions when the local runtime is reachable; `session_bootstrap` exposes the same content explicitly. Project manifests cannot override the global file.
724
- - Add `resolve_task_capabilities`, which rescans effective instructions, filesystem skills, and registered commands for every task, returns a refresh fingerprint, ranks relevant capabilities, optionally loads the best skill, and recommends application/browser/file/Git/process tools. Newly added or edited skills are visible without daemon restart or dynamic MCP tool registration. Multilingual tokenization avoids weak single-character Chinese overlap when automatically selecting a skill.
725
- - Preserve the host boundary: Machine Bridge automates discovery, refresh, ranking, and progressive loading, while the ChatGPT/MCP host still decides whether a tool is exposed, approved, or invoked.
726
-
727
- ### Existing-profile browser and local applications
728
-
729
- - Add a packaged Manifest V3 Chromium extension and authenticated loopback machine broker for the user's existing browser profile, windows, tabs, cookies, extensions, and login state. Multiple workspace or stdio runtimes share one extension connection through authenticated broker clients.
730
- - Add structured browser tools for tab listing, current DOM source, frame-aware and open-Shadow-DOM interactive-element inspection, navigation/actions, complex multi-field forms, visible screenshots, and resource-backed file inputs. Page operations run through a fixed packaged module injected into the target frame rather than caller-provided or service-worker-closure code. Registered local resources can provide sensitive field text or upload bytes without returning those values through MCP results.
731
- - Add installed-application discovery/opening and structured macOS Accessibility inspection/actions. The implementation uses fixed JXA code and does not accept caller-supplied JavaScript, AppleScript, JXA, or browser-extension source. Application paths are normalized to process names, selector indices apply to filtered matches, Linux desktop launchers use `gio launch`, Windows discovery prioritizes Start Menu launchers, and secure Accessibility fields never return values.
732
- - Add `machine-mcp browser status|setup|pair|path` for one-time unpacked-extension setup and diagnosis. Pairing tokens remain in owner-only state and non-cacheable loopback HTML rather than MCP output, browser URL fragments, or operational logs. Established pairing is replacement-locked and requires a browser-action click on the active local pairing page before switching broker state. The extension badge reports connection state and its action opens the saved pairing page; signed browser-store packaging is the intended mass-market distribution path.
733
-
734
- ### Architecture, security, and verification
735
-
736
- - Split agent context, application automation, and browser broker into dedicated local domain modules while retaining one static catalog shared by Worker and stdio. Bound Worker initialization bootstrap to a short failure-tolerant daemon call.
737
- - Add loopback Host validation, extension-origin checks, authenticated extension/runtime WebSocket subprotocols, bounded messages/concurrency/source/forms/uploads, proxy timeout/cancellation cleanup, restricted-page handling, secret/value/result non-disclosure, and full-profile gating. Treat the owner-only browser pairing file as a recognized state-root entry so safe uninstall remains available.
738
- - Extend version synchronization to the browser-extension manifest and add broker owner/client proxy, pairing-token, resource-upload, stdio initialization, live skill refresh, and remote initialization regression coverage. Update architecture, security, operations, logging, privacy, testing, client, release, and user documentation.
739
-
740
- ## 0.9.0 - 2026-07-12
741
-
742
- ### Agent context and local workflows
743
-
744
- - Add `agent_context`, a bounded bootstrap tool with Codex-compatible instruction precedence: unrestricted `CODEX_HOME`/`~/.codex` guidance, then project root-to-target scopes, selecting the first non-empty `AGENTS.override.md` or `AGENTS.md` candidate per directory under a default 32 KiB combined budget. Add hierarchical `.machine-bridge/agent.json` manifests plus an optional unrestricted user manifest at `~/.config/machine-bridge-mcp/agent.json` for custom candidate priority and bounds.
745
- - Add `list_local_skills` and `load_local_skill` with Codex-style progressive disclosure. Default discovery scans target-to-root `.agents/skills`, unrestricted user/admin roots, and canonicalized symlinked skill directories; invalid metadata is skipped with bounded warnings. Skill loading returns instructions and a relative file inventory without implicitly executing scripts.
746
- - Add `list_local_commands` and direct-argv `run_local_command`. Nearest manifests can override or remove inherited commands, caller arguments require manifest opt-in, and callers cannot increase the manifest timeout ceiling.
747
-
748
- ### Architecture, security, and tests
749
-
750
- - Extract agent discovery into `AgentContextManager` rather than expanding transport or runtime dispatch responsibilities. Keep a static MCP catalog across Worker and stdio transports so host-side caching and filtering do not require dynamic per-skill tools.
751
- - Reject escaping instruction/config paths, unknown manifest fields, out-of-policy skill symlink targets, symbolic-link skill entrypoints, ambiguous skill names, oversized content/argv, and execution attempts under non-execution profiles. Document that repository instructions and skills are untrusted content and that registered commands are convenience aliases, not a sandbox or approval boundary.
752
- - Add regression coverage for global/project override selection, empty-candidate fallback, custom priority, instruction-byte ceilings, target-to-root skill discovery, symlinked skill folders, invalid metadata warnings, command override/removal, literal argument handling without shell parsing, timeout ceilings, path escape denial, and execution-profile denial. Update server instructions, architecture, security, testing, and operator documentation for the new bootstrap workflow.
753
-
754
- ## 0.8.2 - 2026-07-11
755
-
756
- ### Relay reliability and protocol correctness
757
-
758
- - Add a deadline for WebSocket connection establishment so a transport stuck in `CONNECTING` cannot freeze automatic reconnection indefinitely. Sustained-outage reminders now run on an independent exponential-backoff timer capped at 15 minutes instead of appearing only when another reconnect event happens.
759
- - Handle Worker `{type:"error"}` messages explicitly. A daemon hello timeout is classified as transient and retried; unknown protocol errors, duplicate hello messages, identity/version mismatch, and authentication rejection terminate with actionable guidance instead of becoming an `unknown websocket message` warning.
760
- - Validate daemon WebSocket JSON as a non-array object before field access. Invalid JSON closes with code 1007, non-object/unknown/duplicate protocol messages close with code 1002, and active daemon replacement semantics remain unchanged.
761
-
762
- ### Logging, tests, and documentation
763
-
764
- - Replace default outage/recovery JSON field dumps with readable duration, attempt, cause, automatic-recovery, and long-outage action text. Exact seconds, error classes, retry delays, and raw transport details remain debug-only. Advance the autostart log schema so historical 0.8.1-format lines are separated into the bounded owner-only legacy snapshot. Treat a service-style daemon-only start that finds the workspace daemon already running as a silent idempotent success, preventing repeated lock warnings and duplicate readiness output from accumulating in service logs.
765
- - Add deterministic tests for stalled connection attempts, autonomous reminder backoff, retryable versus fatal relay error messages, close-reason classification, and runtime control-message routing. Extend live Worker integration coverage to invalid JSON, non-object messages, duplicate hello, and unknown authenticated messages. Enable TypeScript unused-local and unused-parameter checks to prevent dead Worker code from accumulating.
766
- - Update architecture, operations, logging, testing, and README guidance to match the implemented state machine and operator-facing behavior. Add a repository automation contract separating code/test/commit/push work from npm publication, global CLI installation, Worker deployment, credential rotation, and daemon/service operations; the owner performs those live release steps explicitly. Improve release-check diagnostics so a missing local or remote version tag is reported distinctly from a tag pointing at the wrong commit, with the required `release:publish` step named directly.
767
-
768
- ## 0.8.1 - 2026-07-11
769
-
770
- ### Fixed
771
-
772
- - Recognize and validate the Worker's pre-handshake `welcome` control message instead of reporting it as an unknown WebSocket warning. A valid welcome remains debug-only and does not imply authenticated readiness; identity or version mismatch still fails immediately.
773
- - Add a versioned autostart-log schema migration. On the first daemon start after this logging-format change, bounded prior logs are copied to owner-only `daemon.*.legacy.log` snapshots and the active logs are cleared, preventing historical raw close-code lines from appearing to be current behavior.
774
-
775
- ### Tests and documentation
776
-
777
- - Add relay/runtime regression coverage for valid welcome handling and welcome metadata validation, plus service tests for one-time bounded legacy-log migration and schema-marker idempotence.
778
- - Record the protocol producer/consumer contract rule and document how current and legacy daemon logs are separated.
779
-
780
- ## 0.8.0 - 2026-07-11
781
-
782
- ### Architecture
783
-
784
- - Rename the transport-independent tool engine from `LocalDaemon`/`daemon.mjs` to `LocalRuntime`/`runtime.mjs`, reserving daemon terminology for the background process and relay attachment.
785
- - Extract authenticated WebSocket lifecycle into `relay-connection.mjs`, separating transport state, handshake readiness, heartbeat liveness, reconnect backoff, and outage observability from local file/Git/process execution.
786
- - Add `docs/ENGINEERING.md` as the normative record for product invariants, architectural boundaries, logging semantics, resilience, testing, documentation, and public-versus-local project knowledge. Record the owner-required default `full` profile as an explicit invariant.
787
-
788
- ### Logging and operator experience
789
-
790
- - Replace raw default-level relay close output such as `{"code":1006,"reason":""}` with a state-transition policy: brief self-healing interruptions are debug-only, sustained outages produce one rate-limited actionable warning, and recovery produces one duration/attempt summary.
791
- - Keep WebSocket close codes, reason strings, retry delays, heartbeat details, and brief recoveries at debug level. Expand coarse operational error classification for network and authentication failures; treat authentication and relay identity/version mismatch as immediate actionable fatal errors rather than retryable network outages.
792
- - Add an ignored `.project-local/` area for machine-specific maintenance notes while keeping reusable decisions in tracked documentation and credentials out of both.
793
-
794
- ### Reliability and correctness
795
-
796
- - Treat a WebSocket `open` event only as transport availability; authenticated relay readiness now requires `hello_ack`. Remove the startup path that printed `Remote MCP bridge is ready` after a timeout even when authentication had not completed.
797
- - Terminate and retry candidates that do not acknowledge the daemon handshake, detect silent half-open connections through inbound heartbeat timeouts, and preserve bounded exponential reconnect backoff.
798
- - Handle Cloudflare Durable Object `webSocketError` as well as `webSocketClose`, immediately rejecting pending calls bound to the failed socket through one idempotent cleanup path.
799
- - Consolidate managed-job transition/recovery locking into one stale-PID-aware primitive and manager/runner regular-file reads into one no-follow bounded helper, with direct regression tests.
800
- - Replace mechanical runtime/CLI switch and conditional routing with catalog-checked handler tables and named command phases while preserving explicit patch, runner, and recovery state machines.
801
- - Replace technical Worker health warning details at default level with a user-facing reason while retaining the raw health code at debug.
802
-
803
- ### Installation, tests, and documentation
804
-
805
- - Use the empirically verified npm 12 global install command with `--omit=optional` and the reviewed `esbuild,workerd,sharp,fsevents` script names. Add an isolated tarball/global-install smoke test that rejects blocked-script warnings, verifies `fsevents` is absent from the installed runtime, and executes the installed CLI.
806
- - Add deterministic relay lifecycle tests for authenticated readiness, brief-interruption suppression, persistent-outage escalation, recovery summaries, handshake/heartbeat timeout, transport construction/error paths, supersession, acknowledgement identity/version mismatch, and close-code classification. Add architecture/documentation regression checks for module cycles, obsolete naming, broken links, invisible ASCII controls, and retained engineering invariants.
807
- - Update architecture, operations, logging, privacy, testing, contribution, README, and CLI guidance to match the implemented behavior.
808
-
809
- ## 0.7.1 - 2026-07-11
810
-
811
- ### Fixed
812
-
813
- - Persist a sanitized absolute-only command `PATH` in launchd and systemd service definitions, always including the stable Node and CLI directories plus platform defaults. This restores Homebrew/npm/git command resolution for background canonical `full` daemons without accepting empty or relative PATH entries.
814
- - Align `doctor` with the declared sole runtime baseline by requiring Node.js 26 instead of reporting Node.js 22-25 as supported.
815
-
816
- ### Tests and documentation
817
-
818
- - Add service-definition regression tests for PATH preservation, duplicate removal, relative-entry rejection, and launchd/systemd emission; document why `machine-mcp service install` should be rerun after PATH layout changes.
819
-
820
- ## 0.7.0 - 2026-07-11
821
-
822
- ### Runtime and dependencies
823
-
824
- - Raise the sole supported runtime baseline to Node.js 26 and npm 12, add exact local version files and strict engine checks, update Node type definitions to 26.1.1, and run the cross-platform CI suite on Node 26, and disable setup-node's automatic package-manager cache, and bootstrap npm 12 outside the repository before strict project engine checks apply.
825
- - Confirm Wrangler 4.110.0, ws 8.21.0, and TypeScript 7.0.2 are current; retain exact reviewed dependency versions and zero known audit findings.
826
- - Accept both legacy array and npm 12 keyed-object `npm pack --json` metadata, invoke the active npm CLI through Node on Windows, keep generated CI SBOM files outside the repository privacy/publication surface, and retry only classified transient GitHub network failures with Git forced to HTTP/1.1. Release creation verifies server state after an ambiguous response before proceeding.
827
-
828
- ### Security and privacy
829
-
830
- - Replace private environment-derived aliases in public examples with synthetic identifiers and add a repository privacy gate covering tracked and unignored new files, file names, common credential forms, local home paths, SSH host identifiers, and an ignored machine-specific denylist without echoing matched values. Reject publication-surface symbolic links instead of following their targets.
831
- - Hide local resource and generated-key paths by default; require explicit `--show-paths` or `expose_paths=true`, return only bare SSH fingerprints, and broaden operational-log redaction for paths, email addresses, token forms, key headers, and Unicode display controls.
832
- - Separate unrestricted filesystem access from absolute-path display, dynamically redact requested external paths from tool errors, harden autostart files/logs against permissive modes and symbolic links, canonicalize OAuth redirect URIs, and remove bidirectional/zero-width controls from authorization-page display text.
833
-
834
- ### Correctness and durability
835
-
836
- - Verify staged managed-job hashes during inspection, approval, and runner startup; serialize approve/cancel transitions and reclaim stale transition/recovery locks even after PID reuse; reject direct execution of unapproved staged plans; remove stale runner claims during recovery; and redact registered-resource source-path aliases from retained output.
837
- - Clear delayed force-kill timers after process exit, enforce the stdio line limit during incremental reads, reject oversized local WebSocket payloads before string conversion, reject ID-less `tools/call` notifications instead of silently executing them, and accept actual collision-suffixed corrupt-config backups during guarded state removal.
838
- - Make autostart prefer a stable PATH alias that resolves to the active Node executable instead of a versioned package-manager Cellar path, preventing minor Node upgrades from leaving launchd/systemd definitions pointing at removed binaries.
839
- - Open and trim managed-job runner diagnostic logs through no-follow file descriptors, rejecting symbolic-link targets instead of following them.
840
-
841
- ### Release governance and diagnostics
842
-
843
- - Add a release-impact gate requiring a newer package version and matching CHANGELOG section for every tracked or nonignored repository change after the latest version tag. Document that reviewed changes must be pushed to GitHub and followed by a matching npm release.
844
- - Clarify in `server_info`, runtime diagnostics, and operations documentation that canonical `full` controls the local daemon and relay catalog only. A connector host can expose a smaller subset, and that host-side subset is not observable or overrideable by Machine Bridge.
845
-
846
- ### Tests and documentation
847
-
848
- - Add regression coverage for privacy scanning of new files, clean/parseable package manifests and sensitive-artifact exclusion, default path omission and explicit disclosure, hidden unrestricted paths, plan tampering, direct staged-runner invocation, transition locks, source-path redaction, symlink log targets, corrupt-state cleanup, Unicode authorization spoofing, oversized stdio recovery, ID-less tool calls, and comment-free SSH fingerprints.
849
- - Make release packaging resilient to lifecycle output by using silent JSON mode, and document repository privacy incident response, immutable history/package limitations, explicit path disclosure, plan integrity enforcement, same-user filesystem race residuals, and privacy checks in the release process.
850
-
851
- ## 0.6.2 - 2026-07-10
852
-
853
- ### Fixed
854
-
855
- - Retry atomic JSON file replacement with bounded backoff for transient Windows sharing failures (`EPERM`, `EACCES`, `EBUSY`, and `ENOTEMPTY`). State, managed-job manager, and detached runner commits now use one shared implementation.
856
- - Prevent an intermittent Windows `runner_failed` result caused by a transient status-file replacement failure after the same commit had passed the protected pull-request checks.
857
- - Preserve immediate failure for non-transient filesystem errors and keep temporary-file cleanup behavior unchanged.
858
- - Restore corrupt-state backup creation through the shared replacement primitive, add collision-resistant backup names, and verify that recovery preserves the original corrupt bytes.
859
-
860
- ### Tests and diagnostics
861
-
862
- - Add deterministic injected transient/non-transient atomic replacement tests.
863
- - Run the full real-machine sandbox three consecutive times on Windows, exercising repeated detached runner, status, result, and finally-step commits.
864
- - Include managed-job error and cleanup classifications in `full-test` output when a lifecycle check fails.
865
-
866
- ## 0.6.1 - 2026-07-10
867
-
868
- ### Full-profile contract and operator workflows
869
-
870
- - Make named profiles canonical capability contracts. A stored `full` label is repaired to writes, shell execution, unrestricted paths, full parent environment, absolute path output, and the complete tool catalog; deliberate individual overrides remain `custom`. Advance the policy revision to 3 and expose the contract in `server_info` and `doctor`.
871
- - Add `machine-mcp full-test`, a real local-machine acceptance suite using disposable directories. It verifies outside-workspace I/O, direct and shell execution, parent-environment inheritance, SSH key generation, sandbox `authorized_keys`, SSH client parsing, Google OS Login command availability, a non-mutating sudo probe, and detached finally cleanup without changing cloud or remote state.
872
- - Add `machine-mcp resource generate-ssh-key NAME [PATH]` and the canonical-full-only MCP tool `generate_ssh_key_resource`. Both generate or reuse an Ed25519 pair locally, register the private file as a resource, and return only paths, modes, key type, and public fingerprint.
873
-
874
- ### Logging
875
-
876
- - Remove every ordinary per-tool event from default `info`/`warn` logs. Starts, successes, failures, cancellations, durations, slow calls, tool names, coarse outcome classes, and call correlation are now debug-only in both remote daemon and stdio transports.
877
- - Keep default logs focused on deployment, connection, protocol, relay, service, and infrastructure health. Tool arguments, command text, inputs, outputs, and results remain omitted at all levels.
878
-
879
- ### Security, correctness, and portability
880
-
881
- - Verify that an existing SSH public key matches its private key and that the private key is usable non-interactively before reuse. Reject incomplete pairs and symbolic links, enforce owner-only private modes where supported, and never return private bytes.
882
- - Fix the previously untested RSA key-generation argument order and add real RSA coverage.
883
- - Centralize CLI and MCP key generation/registration in one locked state transaction. Roll back a newly created pair if state persistence fails, handle canonical path aliases, and reapply permissions after cross-filesystem installation.
884
- - Validate the resource state layout before deriving its root and restrict the MCP key generator to the complete canonical `full` profile.
885
- - Avoid reading user SSH configuration during `full-test`, canonicalize temporary path aliases, and report sudo/cloud prerequisites separately from core Machine Bridge capability.
886
-
887
- ### Tests and documentation
888
-
889
- - Add real Ed25519/RSA generation, reuse, mismatch, incomplete-pair, symlink, mode, private-content, CLI, stdio, Worker-policy, and real-machine full-profile regression coverage.
890
- - Update logging, architecture, operations, client, managed-job, security, and testing documentation to match the canonical-full and debug-only per-tool event contracts.
891
-
892
- ## 0.6.0 - 2026-07-10
893
-
894
- ### Added
895
-
896
- - Add `diagnose_runtime`, a fixed-input layered diagnostic that distinguishes requests reaching the daemon from Machine Bridge policy, local filesystem, process-spawn, shell, managed-job storage, and registered-resource failures. `machine-mcp doctor` runs the same local probes.
897
- - Add operator-registered local file resources. Credentials and other local-only files can be referenced by alias and injected into managed steps through a private copied path, stdin, or an environment variable without sending file contents or source paths through MCP.
898
- - Add durable managed jobs with ordered argv steps, bounded output, job-scoped temporary files, detached execution, cancellation, idempotent `finally_steps`, dead-runner detection, bounded recovery, and local CLI inspection/cancellation.
899
- - Add two-phase handoff: `stage_job` persists a validated non-running plan for operator review, and `machine-mcp job approve JOB_ID` provides explicit local authorization when a host blocks execution-class tools.
900
- - Add a local JSON fallback with `machine-mcp job submit plan.json` for situations where the MCP host cannot deliver an execution request.
901
-
902
- ### Security and privacy
903
-
904
- - Keep resource values out of MCP plans and results. Referenced files are reopened, bounded, hashed at acceptance, verified before use, copied with owner-only permissions, and removed after cleanup.
905
- - Redact exact resource paths, exact UTF-8 values, and bounded exact base64/hex forms from retained output. Add `capture_output: "discard"` for credential-consuming commands where output must not be retained.
906
- - Delete active job plans, runner PID files, temporary helper contents, argv, stdin, environment overrides, resource source paths, and hashes after terminal commit. Retain only bounded status/redacted results for up to seven days and 50 jobs.
907
- - Enforce canonical managed-job cwd containment in restricted profiles, bounded per-job resources/temporary files/output, no-follow plan/resource reads, owner-only job state, bounded runner diagnostics, recovery mutual exclusion, and a three-attempt automatic recovery limit.
908
- - Refuse uninstall while detached jobs remain active. Later profile changes affect new submissions; accepted running jobs require explicit cancellation.
909
- - Clarify that managed jobs are durability and local-authorization mechanisms, not a bypass for MCP-host, operating-system, or endpoint-security policy.
910
-
911
- ### Operations and tests
912
-
913
- - Add local resource commands: `resource add`, `list`, `check`, and `remove`.
914
- - Add local managed-job commands: `job submit`, `inspect`, `approve`, `list`, `read`, and `cancel`. Approval is interactive by default; `--yes` is required for non-interactive JSON approval.
915
- - Add state schema version 5 for resource registry metadata while redacting resource source paths from normal status output.
916
- - Add regression coverage for staging/approval/cancel-before-start, stdio disconnect survival, resource replacement races and output redaction, job-scoped helper cleanup, failure/timeout/cancellation finally paths, concurrent recovery, corrupt plans, output budgets, local CLI fallback, uninstall refusal, and cross-profile tool exposure.
917
- - Add a dedicated managed-jobs/resource operations and threat-model guide.
918
-
919
- ## 0.5.0 - 2026-07-10
920
-
921
- ### Changed
922
-
923
- - Replace routine per-tool success chatter with explicit log levels. Foreground mode defaults to `info`, autostart uses `warn`, fast successful calls are debug-only, and successful calls over 30 seconds remain visible as slow-call events. `--verbose` maps to `debug`; `--quiet` maps to `error`; `--log-level` accepts `error`, `warn`, `info`, or `debug`.
924
- - Record policy origin and revision in state and daemon metadata. The exact legacy implicit-default policy shape is migrated once to the current maximum-permission `full` profile, while explicit named profiles and identified custom policies are preserved.
925
- - Redact JSON connection credentials and standalone secret-rotation output by default. Printing the client connection password now requires the explicit reconnect flag; the daemon secret is never printed in full.
926
- - Centralize server name, MCP protocol versions, and instructions in shared metadata consumed by both Worker and local transports.
927
- - Reject obsolete removed-local-API flags instead of silently accepting them.
928
-
929
- ### Security and privacy
930
-
931
- - Upgrade and pin `ws` to 8.21.0 to address current memory-disclosure and denial-of-service advisories; pin the reviewed Wrangler runtime version.
932
- - Bind text, image, and search reads to an opened file handle, enforce limits against that handle, and avoid `stat`/read growth races.
933
- - Bound state, configuration, marker, lock, service-command, log-message, and structured-log sizes. Reject symbolic-link state files, use no-follow reads where supported, and make service-log tail trimming UTF-8 and line safe.
934
- - Remove stale temporary Worker secret files when their owner process is gone, not only after an age threshold.
935
- - Document and expose that Machine Bridge has no sensitive-filename blacklist. Local `full` permits any OS-readable UTF-8 regular file, but cannot override operating-system or independent MCP-host/platform policy.
936
-
937
- ### Tests and operations
938
-
939
- - Add regression coverage for legacy policy migration, sensitive-looking files outside the workspace, inherited full-profile environment, default daemon/stdio log suppression, log bounding, state write bounds, service warning-level configuration, and shared metadata drift.
940
- - Audit both complete and production-only dependency graphs in GitHub Actions.
941
- - Document npm's scoped install-script approval for Wrangler native dependencies and add a dedicated logging/observability reference.
942
-
943
- ## 0.4.2 - 2026-07-10
944
-
945
- ### Fixed
946
-
947
- - Canonicalize the configured workspace and requested targets through the same asynchronous `realpath` path on Windows, while retaining a native synchronous initial value. This prevents Windows short-path/long-path aliases for the same temporary directory from being misclassified as a workspace escape.
948
- - Keep workspace confinement unchanged: only the representation comparison changed, and targets outside the canonical workspace remain rejected in restricted profiles.
949
-
950
- ### Verification
951
-
952
- - Preserve the existing cross-platform path-boundary regression, which exposed the issue on the Windows GitHub Actions runner while Linux and macOS passed.
953
- - Make the minimal-environment shell regression use a cross-platform Node command instead of POSIX parameter-expansion syntax under PowerShell.
954
- - Convert test entry-point file URLs with `fileURLToPath()` so Windows does not interpret `/D:/...` URL paths as `C:\D:\...` filesystem paths.
955
- - Launch Wrangler's JavaScript entry point through the active Node executable in integration tests instead of directly spawning the Windows `.cmd` shim.
956
-
957
- ## 0.4.1 - 2026-07-10
958
-
959
- ### Changed
960
-
961
- - Make `full` the default policy for newly selected workspaces and generated client configurations, prioritizing immediate usability. The default now enables all tools, unrestricted direct filesystem paths, absolute path output, shell execution, process sessions, and the complete parent environment; existing saved workspace policies remain unchanged.
962
- - Reframe stdio as an optional local transport rather than a model provider or a replacement for native Claude, Cursor, Codex, or ChatGPT Desktop tooling. Expand client documentation to distinguish the MCP host/model from the Machine Bridge tool server and explain when stdio is redundant or useful.
963
- - Activate cross-platform GitHub Actions checks on Linux, macOS, and Windows, update official actions to the current major releases, disable checkout credential persistence, and retain production dependency/package auditing.
964
-
965
- ### Tests and documentation
966
-
967
- - Add regression coverage for the maximum-permission default and for `client-config` emitting `full` when no profile is supplied.
968
- - Update architecture, operations, security, and client guidance for profile-dependent path display, filesystem scope, and environment inheritance.
969
-
970
- ## 0.4.0 - 2026-07-10
971
-
972
- ### Architecture and compatibility
973
-
974
- - Refactor the project into one transport-independent local runtime shared by the existing OAuth-protected Cloudflare relay and a new local MCP stdio server.
975
- - Update MCP negotiation to `2025-11-25` while retaining compatibility with `2025-06-18` and `2025-03-26`; validate protocol-version headers and implement cancellation in both transports.
976
- - Add ready-to-paste stdio configuration generation for Claude Desktop, Cursor, Codex CLI, and generic MCP clients.
977
- - Replace duplicated Worker/runtime tool declarations with one schema-and-annotation catalog, tested for drift and policy consistency.
978
-
979
- ### Security and privacy
980
-
981
- - Make the least-privilege `review` profile the default for newly selected workspaces; preserve stored pre-0.4 permissions during upgrade.
982
- - Add explicit `review`, `edit`, `agent`, and `full` profiles plus `off`, direct-argv, and shell execution modes.
983
- - Return workspace-relative paths by default, redact canonical/platform-alias paths from tool errors, omit Git author email unless requested, and reduce operational failures to coarse error classes.
984
- - Replace the previous minimal environment with isolated HOME, temp, and cache directories; retain full parent environment only through explicit opt-in.
985
- - Reject duplicate in-flight JSON-RPC IDs, canonical patch-path collisions, stale edits, unsupported image signatures, oversized session data, and ambiguous patch context.
986
- - Make create-only writes atomic against concurrent destination creation and strengthen multi-file patch staging, revalidation, rollback, and mutation serialization.
987
-
988
- ### Tools and runtime
989
-
990
- - Add bounded line-range reads, native MCP raster-image results, exact text editing, and structured multi-file add/update/move/delete patches.
991
- - Add staged diffs, structured Git log, bounded Git show, and privacy-aware author metadata.
992
- - Add direct argv execution and bounded interactive process sessions with retained offsets, stdin, output/exit waits, cancellation, tree termination, and disconnect cleanup.
993
- - Return structured tool content alongside text compatibility output and expose tool annotations for client planning.
994
-
995
- ### Reliability, testing, and operations
996
-
997
- - Add live stdio integration coverage for initialization, tool discovery, structured/image content, edits, patches, direct execution, sessions, cancellation, and post-cancellation health.
998
- - Expand Worker integration coverage for latest protocol negotiation, disconnected tool advertisement, rich content, exact daemon tool sets, and remote cancellation.
999
- - Add catalog, policy-profile, canonical-collision, no-partial-patch, Git privacy, path-redaction, isolated-environment, and session tests.
1000
- - Add a Linux/macOS/Windows GitHub Actions template, Node 22/24 coverage, package/audit checks, and Dependabot configuration.
1001
- - Rewrite architecture, security, client, operations, and testing documentation around explicit trust boundaries and non-goals.
1002
-
1003
- ## 0.3.3 - 2026-07-10
1004
-
1005
- ### Security
1006
-
1007
- - Add an exact-version npm `allowScripts` policy for the reviewed Wrangler runtime/build binaries (`esbuild@0.28.1`, `sharp@0.34.5`, and `workerd@1.20260708.1`) and explicitly deny the optional `fsevents` install script. Dependency upgrades therefore require renewed script approval.
1008
-
1009
- ### Changed
1010
-
1011
- - Exclude the development-only Worker integration test from the published npm package while retaining it in the repository and CI.
1012
- - Add a fail-closed release command that synchronizes `main`, the version tag, the GitHub Release, and its npm tarball; block `npm publish` when those artifacts do not match.
1013
-
1014
- ## 0.3.2 - 2026-07-10
1015
-
1016
- ### Fixed
1017
-
1018
- - Keep the healthy daemon active until a replacement connection completes its authenticated `hello` handshake; enforce the candidate deadline with a Durable Object alarm so it survives WebSocket hibernation, and reject stale or non-handshaking candidates without disrupting the active connection.
1019
- - Send the candidate acknowledgement before closing the previous daemon, expire failed acknowledgements, clean up duplicate authenticated sockets on subsequent handshakes, and reject pre-handshake messages without changing active tool metadata.
1020
-
1021
- ## 0.3.1 - 2026-07-10
1022
-
1023
- ### Security
1024
-
1025
- - Replace reversible unsalted source-address hashes used for OAuth registration limits and password throttling with deployment-keyed HMAC identifiers; stop persisting User-Agent-derived identities, remove legacy unsalted identifiers during store migration, and fail closed if no identity key is configured.
1026
-
1027
- ### Fixed
1028
-
1029
- - Preserve timeout escalation after the direct child exits so a process-group `SIGKILL` still removes descendants that ignore `SIGTERM`; add a regression test for the orphan-process boundary.
1030
- - Replace legacy unsalted source-identity hashes with deployment-keyed HMAC identifiers, prune legacy stored identifiers, and add integration coverage for registration quotas and login throttling.
1031
-
1032
- ## 0.3.0 - 2026-07-10
1033
-
1034
- ### Security
1035
-
1036
- - Confine filesystem tools to the canonical workspace by default; add explicit `--unrestricted-paths` opt-in and symbolic-link escape protection.
1037
- - Make `write_file` bounded and atomic, reject symbolic-link/non-regular destinations, and enforce optimistic hashes consistently.
1038
- - Add recursive log-field and token redaction, control-character neutralization, owner-only service logs, and bounded log trimming.
1039
- - Harden OAuth with strict PKCE/resource/client/redirect validation, validated client disclosure on the consent page, password-failure throttling, bounded dynamic registration, per-source and per-client limits, inactive-client cleanup, strict HTTP methods/UTF-8 handling, and security response headers.
1040
- - Minimize unauthenticated and relay metadata disclosure: remove workspace name/path hash/process ID from the daemon handshake, reduce default observability sampling, and bind pending calls to their originating daemon socket.
1041
- - Bound Worker/daemon request sizes and concurrency; serialize OAuth mutations; isolate WebSocket generations; serialize per-workspace startup/deploy/rotation operations; terminate timed-out or disconnected child processes and bound Wrangler subprocesses.
1042
-
1043
- ### Changed
1044
-
1045
- - Raise the minimum Node.js version to 22 because the current Wrangler release no longer runs on Node 20; require the installed Wrangler dependency instead of falling back to an implicit network `npx` execution.
1046
- - Remove the experimental local OpenAI-compatible `/v1` API and MCP sampling proxy.
1047
- - Detect nested Git repositories for `git_status` and `git_diff`, while disabling repository-configured external diff, text conversion, and filesystem-monitor hooks for bridge Git operations.
1048
- - Use atomic local state/config writes, bounded corrupt-state backups, strict adoption/migration of dedicated state roots, and guarded state-root deletion during uninstall, including refusal while active daemon/startup locks remain.
1049
- - Reject unknown, duplicate, malformed, and command-inapplicable CLI options; fix boolean options consuming positional workspaces.
1050
- - Verify the expected Worker version before accepting a deployment hash.
1051
- - Reduce the default Worker request-body limit to 8 MiB; bound command length, directory results, recursive traversal, and path-result payloads; provide exact-origin CORS while rejecting implicit loopback browser origins.
1052
- - Update Wrangler to 4.110.x, TypeScript to 5.9.x, and Node type definitions to the supported Node 22 API line.
1053
-
1054
- ### Tests and documentation
1055
-
1056
- - Expand self-tests across path boundaries, symlinks, writes, UTF-8, nested Git, environment isolation, locking, CLI parsing, state recovery/removal guards, logging, service logs, and Worker hardening invariants.
1057
- - Add a live local Worker OAuth/MCP integration test, verified Node 22/24 compatibility, a Worker build dry-run, dependency audit, security policy, and architecture document.
1058
-
1059
- ## 0.2.5
1060
-
1061
- - Previous release.
15
+ Historical prerelease entries remain available from Git tags and repository release records. From a source checkout, inspect the changelog shipped by a prior release with `git show v<version>:CHANGELOG.md`. This current file intentionally describes only the active candidate and the history location.