dodo-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (447) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +425 -0
  3. package/dist/auth/adapter.js +43 -0
  4. package/dist/auth/adapter.js.map +1 -0
  5. package/dist/auth/clientDeletion.js +45 -0
  6. package/dist/auth/clientDeletion.js.map +1 -0
  7. package/dist/auth/clients.js +55 -0
  8. package/dist/auth/clients.js.map +1 -0
  9. package/dist/auth/constants.js +10 -0
  10. package/dist/auth/constants.js.map +1 -0
  11. package/dist/auth/interactions.js +184 -0
  12. package/dist/auth/interactions.js.map +1 -0
  13. package/dist/auth/keys.js +56 -0
  14. package/dist/auth/keys.js.map +1 -0
  15. package/dist/auth/provider.js +131 -0
  16. package/dist/auth/provider.js.map +1 -0
  17. package/dist/auth/verifier.js +74 -0
  18. package/dist/auth/verifier.js.map +1 -0
  19. package/dist/cli/kill.js +124 -0
  20. package/dist/cli/kill.js.map +1 -0
  21. package/dist/cli/main.js +1393 -0
  22. package/dist/cli/main.js.map +1 -0
  23. package/dist/cli/menu.js +127 -0
  24. package/dist/cli/menu.js.map +1 -0
  25. package/dist/cli/terminal.js +30 -0
  26. package/dist/cli/terminal.js.map +1 -0
  27. package/dist/config/globalConfig.js +144 -0
  28. package/dist/config/globalConfig.js.map +1 -0
  29. package/dist/config/limits.js +42 -0
  30. package/dist/config/limits.js.map +1 -0
  31. package/dist/config/paths.js +94 -0
  32. package/dist/config/paths.js.map +1 -0
  33. package/dist/config/projectConfig.js +63 -0
  34. package/dist/config/projectConfig.js.map +1 -0
  35. package/dist/config/stateImport.js +306 -0
  36. package/dist/config/stateImport.js.map +1 -0
  37. package/dist/config/tunnelConfig.js +23 -0
  38. package/dist/config/tunnelConfig.js.map +1 -0
  39. package/dist/errors.js +82 -0
  40. package/dist/errors.js.map +1 -0
  41. package/dist/evaluation/contracts.js +86 -0
  42. package/dist/evaluation/contracts.js.map +1 -0
  43. package/dist/evaluation/dodoBench.js +69 -0
  44. package/dist/evaluation/dodoBench.js.map +1 -0
  45. package/dist/index.js +26 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/ipc/authentication.js +117 -0
  48. package/dist/ipc/authentication.js.map +1 -0
  49. package/dist/ipc/client.js +86 -0
  50. package/dist/ipc/client.js.map +1 -0
  51. package/dist/ipc/installationClient.js +83 -0
  52. package/dist/ipc/installationClient.js.map +1 -0
  53. package/dist/ipc/ownerControl.js +46 -0
  54. package/dist/ipc/ownerControl.js.map +1 -0
  55. package/dist/ipc/protocol.js +2 -0
  56. package/dist/ipc/protocol.js.map +1 -0
  57. package/dist/ipc/server.js +108 -0
  58. package/dist/ipc/server.js.map +1 -0
  59. package/dist/platform/execResolve.js +64 -0
  60. package/dist/platform/execResolve.js.map +1 -0
  61. package/dist/platform/fileIdentity.js +26 -0
  62. package/dist/platform/fileIdentity.js.map +1 -0
  63. package/dist/platform/fsRetry.js +22 -0
  64. package/dist/platform/fsRetry.js.map +1 -0
  65. package/dist/platform/pathPolicy.js +29 -0
  66. package/dist/platform/pathPolicy.js.map +1 -0
  67. package/dist/platform/privateFs.js +116 -0
  68. package/dist/platform/privateFs.js.map +1 -0
  69. package/dist/platform/processTree.js +31 -0
  70. package/dist/platform/processTree.js.map +1 -0
  71. package/dist/platform/shell.js +74 -0
  72. package/dist/platform/shell.js.map +1 -0
  73. package/dist/platform/speech.js +94 -0
  74. package/dist/platform/speech.js.map +1 -0
  75. package/dist/platform/system.js +28 -0
  76. package/dist/platform/system.js.map +1 -0
  77. package/dist/platform/windowsSandbox.js +129 -0
  78. package/dist/platform/windowsSandbox.js.map +1 -0
  79. package/dist/projects/federation.js +312 -0
  80. package/dist/projects/federation.js.map +1 -0
  81. package/dist/projects/registry.js +291 -0
  82. package/dist/projects/registry.js.map +1 -0
  83. package/dist/security/accessMode.js +19 -0
  84. package/dist/security/accessMode.js.map +1 -0
  85. package/dist/security/approvals.js +56 -0
  86. package/dist/security/approvals.js.map +1 -0
  87. package/dist/security/env.js +57 -0
  88. package/dist/security/env.js.map +1 -0
  89. package/dist/security/mutationQueue.js +78 -0
  90. package/dist/security/mutationQueue.js.map +1 -0
  91. package/dist/security/policy.js +22 -0
  92. package/dist/security/policy.js.map +1 -0
  93. package/dist/security/projectAuthority.js +22 -0
  94. package/dist/security/projectAuthority.js.map +1 -0
  95. package/dist/security/redact.js +30 -0
  96. package/dist/security/redact.js.map +1 -0
  97. package/dist/server/aiAdmin.js +201 -0
  98. package/dist/server/aiAdmin.js.map +1 -0
  99. package/dist/server/appServer.js +461 -0
  100. package/dist/server/appServer.js.map +1 -0
  101. package/dist/server/bootstrap.js +185 -0
  102. package/dist/server/bootstrap.js.map +1 -0
  103. package/dist/server/configUi/app.css +347 -0
  104. package/dist/server/configUi/app.js +958 -0
  105. package/dist/server/configUi/index.html +379 -0
  106. package/dist/server/configUi/ui/alerts.js +92 -0
  107. package/dist/server/configUi/ui/dom.js +19 -0
  108. package/dist/server/configUi/ui/tooltips.js +115 -0
  109. package/dist/server/configUi/vendor/VERSION.txt +1 -0
  110. package/dist/server/configUi/vendor/sweetalert2.min.css +1 -0
  111. package/dist/server/configUi/vendor/sweetalert2.min.js +5 -0
  112. package/dist/server/configUi/workbench.css +62 -0
  113. package/dist/server/configUi/workbench.js +394 -0
  114. package/dist/server/installationRuntime.js +155 -0
  115. package/dist/server/installationRuntime.js.map +1 -0
  116. package/dist/server/instructions.js +17 -0
  117. package/dist/server/instructions.js.map +1 -0
  118. package/dist/server/ipcDispatch.js +225 -0
  119. package/dist/server/ipcDispatch.js.map +1 -0
  120. package/dist/server/localConfig.js +561 -0
  121. package/dist/server/localConfig.js.map +1 -0
  122. package/dist/server/optionalServices.js +30 -0
  123. package/dist/server/optionalServices.js.map +1 -0
  124. package/dist/server/projectLease.js +46 -0
  125. package/dist/server/projectLease.js.map +1 -0
  126. package/dist/server/stdioServer.js +75 -0
  127. package/dist/server/stdioServer.js.map +1 -0
  128. package/dist/server/version.js +13 -0
  129. package/dist/server/version.js.map +1 -0
  130. package/dist/server/workspaceHost.js +194 -0
  131. package/dist/server/workspaceHost.js.map +1 -0
  132. package/dist/services/agent/agentService.js +598 -0
  133. package/dist/services/agent/agentService.js.map +1 -0
  134. package/dist/services/agent/contracts.js +102 -0
  135. package/dist/services/agent/contracts.js.map +1 -0
  136. package/dist/services/ai/adapters.js +287 -0
  137. package/dist/services/ai/adapters.js.map +1 -0
  138. package/dist/services/ai/contracts.js +39 -0
  139. package/dist/services/ai/contracts.js.map +1 -0
  140. package/dist/services/ai/credentials.js +77 -0
  141. package/dist/services/ai/credentials.js.map +1 -0
  142. package/dist/services/ai/network.js +113 -0
  143. package/dist/services/ai/network.js.map +1 -0
  144. package/dist/services/ai/settings.js +178 -0
  145. package/dist/services/ai/settings.js.map +1 -0
  146. package/dist/services/ai/subagents.js +468 -0
  147. package/dist/services/ai/subagents.js.map +1 -0
  148. package/dist/services/assistance/analysis.js +352 -0
  149. package/dist/services/assistance/analysis.js.map +1 -0
  150. package/dist/services/assistance/contracts.js +54 -0
  151. package/dist/services/assistance/contracts.js.map +1 -0
  152. package/dist/services/assistance/verification.js +274 -0
  153. package/dist/services/assistance/verification.js.map +1 -0
  154. package/dist/services/brain/brainParser.js +97 -0
  155. package/dist/services/brain/brainParser.js.map +1 -0
  156. package/dist/services/brain/brainService.js +733 -0
  157. package/dist/services/brain/brainService.js.map +1 -0
  158. package/dist/services/brain/brainWorker.js +212 -0
  159. package/dist/services/brain/brainWorker.js.map +1 -0
  160. package/dist/services/brain/contracts.js +154 -0
  161. package/dist/services/brain/contracts.js.map +1 -0
  162. package/dist/services/brain/protocol.js +2 -0
  163. package/dist/services/brain/protocol.js.map +1 -0
  164. package/dist/services/changes/applier.js +544 -0
  165. package/dist/services/changes/applier.js.map +1 -0
  166. package/dist/services/changes/contentBudget.js +11 -0
  167. package/dist/services/changes/contentBudget.js.map +1 -0
  168. package/dist/services/changes/planner.js +284 -0
  169. package/dist/services/changes/planner.js.map +1 -0
  170. package/dist/services/changes/types.js +3 -0
  171. package/dist/services/changes/types.js.map +1 -0
  172. package/dist/services/context/contextEngine.js +746 -0
  173. package/dist/services/context/contextEngine.js.map +1 -0
  174. package/dist/services/context/contracts.js +88 -0
  175. package/dist/services/context/contracts.js.map +1 -0
  176. package/dist/services/desktop/desktopPolicy.js +76 -0
  177. package/dist/services/desktop/desktopPolicy.js.map +1 -0
  178. package/dist/services/desktop/desktopService.js +130 -0
  179. package/dist/services/desktop/desktopService.js.map +1 -0
  180. package/dist/services/desktop/nativeBackend.js +174 -0
  181. package/dist/services/desktop/nativeBackend.js.map +1 -0
  182. package/dist/services/desktop/protocol.js +32 -0
  183. package/dist/services/desktop/protocol.js.map +1 -0
  184. package/dist/services/files/readService.js +136 -0
  185. package/dist/services/files/readService.js.map +1 -0
  186. package/dist/services/git/gitService.js +369 -0
  187. package/dist/services/git/gitService.js.map +1 -0
  188. package/dist/services/intelligence/intelService.js +136 -0
  189. package/dist/services/intelligence/intelService.js.map +1 -0
  190. package/dist/services/intelligence/protocol.js +2 -0
  191. package/dist/services/intelligence/protocol.js.map +1 -0
  192. package/dist/services/intelligence/tsWorker.js +419 -0
  193. package/dist/services/intelligence/tsWorker.js.map +1 -0
  194. package/dist/services/jobs/commandInput.js +34 -0
  195. package/dist/services/jobs/commandInput.js.map +1 -0
  196. package/dist/services/jobs/jobManager.js +398 -0
  197. package/dist/services/jobs/jobManager.js.map +1 -0
  198. package/dist/services/jobs/sandbox.js +156 -0
  199. package/dist/services/jobs/sandbox.js.map +1 -0
  200. package/dist/services/jobs/sandboxWiring.js +37 -0
  201. package/dist/services/jobs/sandboxWiring.js.map +1 -0
  202. package/dist/services/jobs/spool.js +112 -0
  203. package/dist/services/jobs/spool.js.map +1 -0
  204. package/dist/services/jobs/windowsSandboxChild.js +24 -0
  205. package/dist/services/jobs/windowsSandboxChild.js.map +1 -0
  206. package/dist/services/jobs/windowsSandboxWorker.js +155 -0
  207. package/dist/services/jobs/windowsSandboxWorker.js.map +1 -0
  208. package/dist/services/lsp/documentUri.js +16 -0
  209. package/dist/services/lsp/documentUri.js.map +1 -0
  210. package/dist/services/lsp/jsonrpc.js +382 -0
  211. package/dist/services/lsp/jsonrpc.js.map +1 -0
  212. package/dist/services/lsp/lspService.js +1051 -0
  213. package/dist/services/lsp/lspService.js.map +1 -0
  214. package/dist/services/memory/contracts.js +94 -0
  215. package/dist/services/memory/contracts.js.map +1 -0
  216. package/dist/services/memory/memoryService.js +683 -0
  217. package/dist/services/memory/memoryService.js.map +1 -0
  218. package/dist/services/multimodal/browserService.js +407 -0
  219. package/dist/services/multimodal/browserService.js.map +1 -0
  220. package/dist/services/multimodal/byteRange.js +31 -0
  221. package/dist/services/multimodal/byteRange.js.map +1 -0
  222. package/dist/services/multimodal/contracts.js +59 -0
  223. package/dist/services/multimodal/contracts.js.map +1 -0
  224. package/dist/services/multimodal/gameService.js +95 -0
  225. package/dist/services/multimodal/gameService.js.map +1 -0
  226. package/dist/services/multimodal/images.js +107 -0
  227. package/dist/services/multimodal/images.js.map +1 -0
  228. package/dist/services/multimodal/mediaService.js +279 -0
  229. package/dist/services/multimodal/mediaService.js.map +1 -0
  230. package/dist/services/multimodal/mediaWorker.js +143 -0
  231. package/dist/services/multimodal/mediaWorker.js.map +1 -0
  232. package/dist/services/multimodal/multimodalService.js +51 -0
  233. package/dist/services/multimodal/multimodalService.js.map +1 -0
  234. package/dist/services/multimodal/network.js +69 -0
  235. package/dist/services/multimodal/network.js.map +1 -0
  236. package/dist/services/multimodal/operations.js +40 -0
  237. package/dist/services/multimodal/operations.js.map +1 -0
  238. package/dist/services/multimodal/storage.js +160 -0
  239. package/dist/services/multimodal/storage.js.map +1 -0
  240. package/dist/services/multimodal/workflowService.js +179 -0
  241. package/dist/services/multimodal/workflowService.js.map +1 -0
  242. package/dist/services/overview.js +284 -0
  243. package/dist/services/overview.js.map +1 -0
  244. package/dist/services/resources/casStore.js +304 -0
  245. package/dist/services/resources/casStore.js.map +1 -0
  246. package/dist/services/resources/contracts.js +75 -0
  247. package/dist/services/resources/contracts.js.map +1 -0
  248. package/dist/services/resources/mime.js +77 -0
  249. package/dist/services/resources/mime.js.map +1 -0
  250. package/dist/services/resources/providerRegistry.js +22 -0
  251. package/dist/services/resources/providerRegistry.js.map +1 -0
  252. package/dist/services/resources/providers.js +120 -0
  253. package/dist/services/resources/providers.js.map +1 -0
  254. package/dist/services/resources/resourceService.js +282 -0
  255. package/dist/services/resources/resourceService.js.map +1 -0
  256. package/dist/services/runtime/contracts.js +65 -0
  257. package/dist/services/runtime/contracts.js.map +1 -0
  258. package/dist/services/runtime/runtimeService.js +364 -0
  259. package/dist/services/runtime/runtimeService.js.map +1 -0
  260. package/dist/services/schedules/scheduleService.js +198 -0
  261. package/dist/services/schedules/scheduleService.js.map +1 -0
  262. package/dist/services/search/searchService.js +434 -0
  263. package/dist/services/search/searchService.js.map +1 -0
  264. package/dist/services/search/searchWorker.js +58 -0
  265. package/dist/services/search/searchWorker.js.map +1 -0
  266. package/dist/setup/componentProbes.js +259 -0
  267. package/dist/setup/componentProbes.js.map +1 -0
  268. package/dist/setup/download.js +139 -0
  269. package/dist/setup/download.js.map +1 -0
  270. package/dist/setup/managedTools.js +118 -0
  271. package/dist/setup/managedTools.js.map +1 -0
  272. package/dist/setup/sandboxProbe.js +172 -0
  273. package/dist/setup/sandboxProbe.js.map +1 -0
  274. package/dist/setup/setup.js +522 -0
  275. package/dist/setup/setup.js.map +1 -0
  276. package/dist/setup/windowsChromiumAcl.js +56 -0
  277. package/dist/setup/windowsChromiumAcl.js.map +1 -0
  278. package/dist/setup/windowsSandboxInstall.js +94 -0
  279. package/dist/setup/windowsSandboxInstall.js.map +1 -0
  280. package/dist/setup/windowsSpeechInstall.js +86 -0
  281. package/dist/setup/windowsSpeechInstall.js.map +1 -0
  282. package/dist/store/db.js +711 -0
  283. package/dist/store/db.js.map +1 -0
  284. package/dist/store/scopeEncoding.js +15 -0
  285. package/dist/store/scopeEncoding.js.map +1 -0
  286. package/dist/store/store.js +467 -0
  287. package/dist/store/store.js.map +1 -0
  288. package/dist/tools/agentRuntimeTools.js +216 -0
  289. package/dist/tools/agentRuntimeTools.js.map +1 -0
  290. package/dist/tools/agentTools.js +317 -0
  291. package/dist/tools/agentTools.js.map +1 -0
  292. package/dist/tools/assistanceTools.js +126 -0
  293. package/dist/tools/assistanceTools.js.map +1 -0
  294. package/dist/tools/brainTools.js +130 -0
  295. package/dist/tools/brainTools.js.map +1 -0
  296. package/dist/tools/catalog.js +30 -0
  297. package/dist/tools/catalog.js.map +1 -0
  298. package/dist/tools/changeTools.js +188 -0
  299. package/dist/tools/changeTools.js.map +1 -0
  300. package/dist/tools/context.js +243 -0
  301. package/dist/tools/context.js.map +1 -0
  302. package/dist/tools/contextTools.js +57 -0
  303. package/dist/tools/contextTools.js.map +1 -0
  304. package/dist/tools/coreCatalog.js +82 -0
  305. package/dist/tools/coreCatalog.js.map +1 -0
  306. package/dist/tools/desktopTools.js +41 -0
  307. package/dist/tools/desktopTools.js.map +1 -0
  308. package/dist/tools/directTools.js +273 -0
  309. package/dist/tools/directTools.js.map +1 -0
  310. package/dist/tools/envelope.js +71 -0
  311. package/dist/tools/envelope.js.map +1 -0
  312. package/dist/tools/extraTools.js +298 -0
  313. package/dist/tools/extraTools.js.map +1 -0
  314. package/dist/tools/gitTools.js +93 -0
  315. package/dist/tools/gitTools.js.map +1 -0
  316. package/dist/tools/jobTools.js +454 -0
  317. package/dist/tools/jobTools.js.map +1 -0
  318. package/dist/tools/memoryTools.js +102 -0
  319. package/dist/tools/memoryTools.js.map +1 -0
  320. package/dist/tools/metaTools.js +153 -0
  321. package/dist/tools/metaTools.js.map +1 -0
  322. package/dist/tools/multimodalTools.js +262 -0
  323. package/dist/tools/multimodalTools.js.map +1 -0
  324. package/dist/tools/projectTools.js +261 -0
  325. package/dist/tools/projectTools.js.map +1 -0
  326. package/dist/tools/resourceTools.js +81 -0
  327. package/dist/tools/resourceTools.js.map +1 -0
  328. package/dist/tools/runtimeTools.js +137 -0
  329. package/dist/tools/runtimeTools.js.map +1 -0
  330. package/dist/tools/scheduleTools.js +10 -0
  331. package/dist/tools/scheduleTools.js.map +1 -0
  332. package/dist/tools/semanticTools.js +141 -0
  333. package/dist/tools/semanticTools.js.map +1 -0
  334. package/dist/tools/subagentTools.js +32 -0
  335. package/dist/tools/subagentTools.js.map +1 -0
  336. package/dist/tools/surface.js +644 -0
  337. package/dist/tools/surface.js.map +1 -0
  338. package/dist/tunnel/control.js +113 -0
  339. package/dist/tunnel/control.js.map +1 -0
  340. package/dist/tunnel/credentials.js +392 -0
  341. package/dist/tunnel/credentials.js.map +1 -0
  342. package/dist/tunnel/log.js +84 -0
  343. package/dist/tunnel/log.js.map +1 -0
  344. package/dist/tunnel/runtime.js +55 -0
  345. package/dist/tunnel/runtime.js.map +1 -0
  346. package/dist/tunnel/supervisor.js +280 -0
  347. package/dist/tunnel/supervisor.js.map +1 -0
  348. package/dist/util/bytes.js +53 -0
  349. package/dist/util/bytes.js.map +1 -0
  350. package/dist/util/hash.js +53 -0
  351. package/dist/util/hash.js.map +1 -0
  352. package/dist/workspace/fs.js +305 -0
  353. package/dist/workspace/fs.js.map +1 -0
  354. package/dist/workspace/identity.js +17 -0
  355. package/dist/workspace/identity.js.map +1 -0
  356. package/dist/workspace/ignores.js +173 -0
  357. package/dist/workspace/ignores.js.map +1 -0
  358. package/dist/workspace/root.js +59 -0
  359. package/dist/workspace/root.js.map +1 -0
  360. package/docs/AGENT_RUNTIME.md +154 -0
  361. package/docs/AI_PROVIDERS.md +110 -0
  362. package/docs/ARCHITECTURE.md +331 -0
  363. package/docs/ASSISTANCE.md +31 -0
  364. package/docs/AUTH.md +59 -0
  365. package/docs/BRAIN.md +92 -0
  366. package/docs/COMPATIBILITY.md +92 -0
  367. package/docs/CONFIRMATION.md +13 -0
  368. package/docs/CONTEXT.md +87 -0
  369. package/docs/DESKTOP.md +35 -0
  370. package/docs/EVALUATION.md +86 -0
  371. package/docs/LARGE_INPUTS.md +21 -0
  372. package/docs/LSP.md +21 -0
  373. package/docs/MANUAL_ACCEPTANCE.md +283 -0
  374. package/docs/MEMORY.md +128 -0
  375. package/docs/MULTIMODAL.md +32 -0
  376. package/docs/PROJECTS.md +146 -0
  377. package/docs/RELEASE_1.0.0.md +111 -0
  378. package/docs/RELEASE_NOTES.md +92 -0
  379. package/docs/RESOURCES.md +83 -0
  380. package/docs/RUNTIME.md +125 -0
  381. package/docs/SCHEDULES.md +23 -0
  382. package/docs/SECURITY.md +250 -0
  383. package/docs/TEST_REPORT.md +312 -0
  384. package/docs/TUNNEL.md +86 -0
  385. package/docs/WEB_CLIENTS.md +43 -0
  386. package/docs/WINDOWS.md +79 -0
  387. package/docs/adr/001-one-process-one-workspace.md +22 -0
  388. package/docs/adr/002-external-tunnel.md +19 -0
  389. package/docs/adr/003-sdk-v2-legacy-stateless.md +20 -0
  390. package/docs/adr/004-embedded-oauth-provider.md +19 -0
  391. package/docs/adr/005-static-client-baseline.md +19 -0
  392. package/docs/adr/006-guarded-fs-explicit-exec.md +16 -0
  393. package/docs/adr/007-preview-hash-journal.md +18 -0
  394. package/docs/adr/008-ts-js-semantics-first.md +17 -0
  395. package/docs/adr/009-jobs-polling.md +18 -0
  396. package/docs/adr/010-sqlite-better-sqlite3.md +18 -0
  397. package/docs/adr/011-env-example-secure-default.md +19 -0
  398. package/docs/adr/012-workspace-scope-grant.md +24 -0
  399. package/docs/adr/013-loopback-proxy-trust.md +18 -0
  400. package/docs/adr/014-direct-coding-tier.md +48 -0
  401. package/docs/adr/015-coding-agent-parity.md +56 -0
  402. package/docs/adr/016-oidc-openid-consent.md +15 -0
  403. package/docs/adr/017-installation-identity-local-config.md +44 -0
  404. package/docs/adr/018-access-scope-encoding.md +11 -0
  405. package/docs/adr/019-runtime-workspace-switch.md +59 -0
  406. package/docs/adr/020-desktop-access.md +50 -0
  407. package/docs/adr/021-persistent-desktop-consent.md +39 -0
  408. package/docs/adr/022-owner-kill-preserves-login.md +30 -0
  409. package/docs/adr/023-large-coding-inputs.md +49 -0
  410. package/docs/adr/024-usage-rounds-and-schedules.md +72 -0
  411. package/docs/adr/025-owner-chat-whitelist.md +53 -0
  412. package/docs/adr/026-remove-conversation-confirmation.md +35 -0
  413. package/docs/adr/027-workspace-client-list.md +20 -0
  414. package/docs/adr/028-owner-client-deletion.md +25 -0
  415. package/docs/adr/029-compact-tool-surface.md +121 -0
  416. package/docs/adr/030-windows-native-candidate.md +71 -0
  417. package/docs/adr/031-owner-selected-tunnel-supervision.md +13 -0
  418. package/docs/adr/032-owner-project-registry.md +43 -0
  419. package/docs/adr/033-read-only-project-federation.md +61 -0
  420. package/docs/adr/034-universal-resource-cas.md +60 -0
  421. package/docs/adr/035-project-brain-incremental-index.md +51 -0
  422. package/docs/adr/036-context-engine-evidence.md +53 -0
  423. package/docs/adr/037-owner-reviewed-memory.md +46 -0
  424. package/docs/adr/038-runtime-intelligence.md +46 -0
  425. package/docs/adr/039-advanced-agent-runtime.md +57 -0
  426. package/docs/adr/040-dodobench-release-gate.md +43 -0
  427. package/docs/adr/041-local-macos-docker-linux-gates.md +32 -0
  428. package/docs/adr/042-project-directory-generation-identity.md +36 -0
  429. package/docs/adr/043-trusted-self-hosted-platform-gates.md +38 -0
  430. package/docs/adr/044-global-launcher-and-cli-menu.md +43 -0
  431. package/docs/adr/045-ai-providers-multiproject.md +56 -0
  432. package/docs/adr/046-personal-access-mode.md +32 -0
  433. package/docs/adr/README.md +64 -0
  434. package/examples/.dodo.json.example +20 -0
  435. package/examples/cloudflared.yml +23 -0
  436. package/examples/reverse-proxy-fixture.mjs +37 -0
  437. package/native/desktop-linux.py +387 -0
  438. package/native/desktop-windows.cs +180 -0
  439. package/native/desktop.swift +212 -0
  440. package/package.json +145 -0
  441. package/schemas/global-config.schema.json +497 -0
  442. package/schemas/project-config.schema.json +75 -0
  443. package/schemas/tools.compact.json +3236 -0
  444. package/schemas/tools.hybrid.json +8194 -0
  445. package/schemas/tools.json +34518 -0
  446. package/scripts/guard-publish.mjs +12 -0
  447. package/scripts/setup-multimodal.mjs +70 -0
@@ -0,0 +1,71 @@
1
+ # ADR-030: Windows native candidate and authenticated owner IPC
2
+
3
+ Date: 2026-09-10
4
+ Status: Implemented candidate; native Windows validation and support claim pending
5
+ Target source version: Windows native work
6
+
7
+ ## Context
8
+
9
+ The Windows proposal identifies independent blockers in Unix-only IPC, POSIX
10
+ shell/execute-bit assumptions, process-group cancellation, executable search,
11
+ NTFS aliases and private-state permissions. Extending platform support must
12
+ not turn a missing sandbox, private ACL or trusted executable into an implicit
13
+ permission grant. Existing dirty working-tree changes must be preserved.
14
+
15
+ ## Decision
16
+
17
+ Introduce shared platform helpers under `src/platform` and route jobs, git,
18
+ search, LSP and media execution through the relevant helpers. Resolve implicit
19
+ executables using absolute canonical paths outside the workspace; sanitize
20
+ Windows PATH/PATHEXT and environment keys. Prefer Git for Windows Bash, with
21
+ an explicit cmd.exe fallback and restricted batch arguments. Use bounded
22
+ UTF-16 argv and cmd-line budgets. Windows cancellation targets live owned
23
+ children through the absolute system taskkill executable, with hard-kill-only
24
+ semantics; it is not Job Object containment.
25
+
26
+ Use an owner-private per-listener credential on every OS. Windows transport
27
+ uses a fresh named pipe; POSIX retains Unix sockets. Both peers authenticate
28
+ using fresh nonce challenges and domain-separated HMAC over exact payloads.
29
+ Credentials never travel on the IPC connection, and privileged requests are
30
+ not sent until server authentication succeeds. Invalid/replayed proofs fail
31
+ before owner command dispatch. Socket/descriptor cleanup is generation-bound.
32
+
33
+ Windows state uses LOCALAPPDATA/dodo and checked DACLs; POSIX retains owner/mode
34
+ checks. The Windows ACL code permits the current SID, SYSTEM and Administrators.
35
+ Same-user processes and administrators remain inside the trust boundary.
36
+ ACL failure is fatal rather than silently substituting ineffective chmod.
37
+
38
+ Reject ambiguous NTFS lexical paths and recheck canonical components against
39
+ containment and secret/protected guards. Do not claim elimination of same-user
40
+ check/use races. Retry transient Windows sharing locks only within a bounded
41
+ budget, never deleting a destination or clearing read-only attributes to force
42
+ a write. Preserve BOM and CRLF bytes in source edits.
43
+
44
+ OAuth, workspace/client ACLs, trust modes, per-action approvals, journals and
45
+ compact/hybrid/full exposure retain their existing authority. Windows has no
46
+ DODO command sandbox; requested sandboxing fails closed. Schedules require an
47
+ explicit unsandboxed specification and separate local owner approval. Desktop
48
+ and macOS speech remain unsupported on Windows; no silent privilege downgrade.
49
+
50
+ ## Compatibility and rollout
51
+
52
+ The project keeps its current baseline while the Windows support status remains
53
+ EXPERIMENTAL until the proposal's native gates pass. Add an allow-failure
54
+ Windows Node 22/24 CI evidence job first; do not skip entire legacy suites to
55
+ produce green results. Only after native tests and Windows 11 manual acceptance
56
+ may that job become required and documentation say supported.
57
+
58
+ The IPC protocol intentionally has no unauthenticated fallback. Owners
59
+ must stop running servers from the existing installation or terminal before
60
+ replacing the installation. OAuth/state is not cleared. Building a checkout
61
+ never replaces a running server or a global installation by itself.
62
+
63
+ ## Evidence and outstanding gates
64
+
65
+ Portable contracts exercise actual filesystem, processes and IPC on the local
66
+ host. Windows-only tests remain skipped on POSIX and are not native evidence.
67
+ Actual 8.3 aliases, DACL isolation from a second OS user, Defender/OneDrive,
68
+ Windows full-suite portability and a real external Windows MCP client remain
69
+ native/manual gates. See `docs/WINDOWS.md`, `docs/TEST_REPORT.md` and
70
+ `release-evidence/Windows native work/verification.json`. No npm publication, git tag or
71
+ production deployment is implied by this ADR.
@@ -0,0 +1,13 @@
1
+ # ADR-031 — Owner-selected Cloudflare Tunnel supervision
2
+
3
+ **Status:** accepted (implemented)
4
+
5
+ **Decision.** DODO starts only an owner-selected, trusted `cloudflared` executable owned by the current HTTP process. `dodo start` can attach it immediately; the authenticated Local Config can start or stop the same process-owned runtime. The owner still creates the remotely-managed Tunnel, public hostname and DNS in Cloudflare.
6
+
7
+ The default flow uses a run-scoped token entered through a hidden terminal prompt or the authenticated loopback Local Config. The token is never persisted in global config or an OS credential store. A process-owned `TunnelRuntime` forwards it through the managed child's dedicated environment and stops that child with DODO; it is absent from argv, logs, MCP, audit and job environments. Explicit secure credential references remain supported only by advanced standalone tunnel commands for compatibility.
8
+
9
+ The supervisor uses a separate authenticated singleton owner IPC endpoint, loopback readiness, bounded restarts, private bounded/redacted logs and live child handles for termination. It never signals a saved PID or searches by process name. Local Config and the metrics listener remain loopback-only and are not part of the public route.
10
+
11
+ **Trade-off.** Foreground supervision is easier to inspect and stop safely, but the terminal must remain open. Native service installation is left to the owner. A readiness success proves a Cloudflare connection, not that an AI client is connected.
12
+
13
+ **Evidence.** `tests/security/tunnelCredentials.test.ts`, `tests/integration/tunnelSupervisor.test.ts`, authenticated IPC tests, setup tests and packaging tests exercise credential boundaries, argv non-disclosure, exact redaction, singleton ownership, readiness, bounded restart and owned stop without using a real Cloudflare credential or network tunnel. Real macOS/Windows/Linux Tunnel validation remains a manual gate in `docs/MANUAL_ACCEPTANCE.md`.
@@ -0,0 +1,43 @@
1
+ # ADR-032: Owner-only durable project registry
2
+
3
+ Status: Accepted
4
+
5
+ ## Context
6
+
7
+ Workspace identity เดิมเหมาะกับการ enforce authority ของ active root แต่ถูกสร้าง
8
+ จาก installation secret และ canonical path จึงไม่ใช่ stable product identity เมื่อ
9
+ เจ้าของ rename โปรเจกต์ และไม่สามารถใช้เป็นรายการหลายโปรเจกต์ที่ตรวจ readiness ได้
10
+
11
+ ## Decision
12
+
13
+ เพิ่ม installation-level SQLite `project_registry` ที่ใช้ opaque random `projectId`
14
+ แยกจาก path-derived `workspaceId` Registry เก็บ canonical root, directory identity,
15
+ display name, metadata version และ timestamps พร้อม soft removal
16
+
17
+ CLI และ Local Config เท่านั้นที่เข้าถึง registry ไม่มี MCP tool หรือ public admin
18
+ route การ add/remove ไม่เปลี่ยน trust, OAuth, ACL, jobs, plans หรือ history
19
+
20
+ การ add path ใหม่ที่ path เดิมหายและ directory identity ตรงกับรายการเดิมถือเป็น
21
+ relocation: projectId คงเดิม แต่ workspaceId เปลี่ยนตาม canonical path ใหม่ จึงไม่มี
22
+ authority ไหลตาม project identity หาก path เดิมถูกแทนด้วย identity อื่น ระบบ fail
23
+ closed และต้องให้เจ้าของ remove/add หลัง review
24
+
25
+ รายละเอียดการเพิ่ม birth-time generation marker หลังพบ inode reuse บน Linux อยู่ใน
26
+ [ADR-042](042-project-directory-generation-identity.md)
27
+
28
+ Registry mutation และ scrubbed audit commit ใน SQLite transaction เดียวกัน
29
+ metadata ที่ผิดรุ่นถูกแสดงเป็น `invalid` และไม่ถือว่า ready แต่ยังนำออกแบบ reviewed
30
+ removal ได้
31
+
32
+ ## Consequences
33
+
34
+ process หนึ่งยังมี active workspace เดียว Registry เป็น foundation สำหรับ federation
35
+ ภายหลังและไม่เปลี่ยน MCP catalog การนำรายการออกไม่ลบ workspace authority/history
36
+ เพื่อหลีกเลี่ยง destructive side effects
37
+
38
+ ## Evidence
39
+
40
+ `tests/unit/projectRegistry.test.ts`, `tests/security/projectRegistry.test.ts`,
41
+ `tests/integration/projectRegistry.test.ts`, Local Config/workspace switch regression
42
+ tests และ packaging smoke ครอบคลุม migration, duplicate/concurrent add, relocation,
43
+ identity replacement, corruption recovery, ACL isolation และ owner boundary
@@ -0,0 +1,61 @@
1
+ # ADR-033: Read-only project federation before effectful multi-project runtime
2
+
3
+ ## Status
4
+
5
+ Accepted — DODO MCP 1.0.0 development baseline.
6
+
7
+ ## Context
8
+
9
+ The owner Project Registry provides stable project IDs and readiness metadata,
10
+ but registry membership is deliberately not authority. DODO needs bounded
11
+ cross-project retrieval without changing the active workspace or weakening the
12
+ existing OAuth, workspace ACL, path, secret and audit boundaries.
13
+
14
+ Bootstrapping every target as another full runtime would also start or recover
15
+ jobs, schedules, planners, workers and mutable resources. That would introduce
16
+ effectful behavior before per-project locking and ownership contracts exist.
17
+
18
+ ## Decision
19
+
20
+ DODO adds an isolated `FederationService` for read-only retrieval:
21
+
22
+ - targets are selected only by opaque IDs already in the owner registry;
23
+ - remote access requires a live installation identity grant, `dodo:read` in the
24
+ grant/current principal, and `dodo:read` in the target workspace ACL;
25
+ - local STDIO is the owner principal and may read owner-registered targets;
26
+ - target canonical path and directory identity are checked before each access;
27
+ - each cached target has its own workspace filesystem policy, read/list/search/
28
+ overview services and process-local federation epoch; the runtime cache is
29
+ bounded to 16 least-recently-used targets;
30
+ - cross-project search is capped at eight projects and one shared result budget;
31
+ - authorized unavailable targets are explicit partial failures; an unauthorized
32
+ target rejects the whole request before any result is returned;
33
+ - source hashes and target identity accompany results, while MCP envelope context
34
+ remains the active workspace;
35
+ - target-scoped audit rows are written in addition to the outer tool audit.
36
+
37
+ The existing tool names are retained. `project_overview`, `list_files` and
38
+ `read_files` accept optional `projectId`; `search_code` accepts `projectId` or
39
+ `projectIds`. Compact and Hybrid clients reach the same contract through
40
+ `dodo_read`, so the Phase 03 surfaces remained 74/19/49 tools. ADR-034 later adds
41
+ six full resource operations through the existing `dodo_media` gateway, making the
42
+ current surfaces 80/19/49 without changing federation behavior.
43
+
44
+ ## Security consequences
45
+
46
+ Registry metadata, search results, workflows and source hashes never become
47
+ authority. The implementation does not change `process.cwd()`, active workspace,
48
+ trust or ACL. Unknown/unauthorized project IDs return a generic refusal without
49
+ paths. The target uses the same shared path/secret policy as an active workspace.
50
+
51
+ Write, exec, jobs, plans, approvals, desktop and resource handles remain limited
52
+ to the one active `BootstrappedWorkspace`. Clients must ask the owner to switch,
53
+ call `project_overview` again and re-read current source before an effect.
54
+
55
+ ## Follow-up gate
56
+
57
+ Effectful federation requires a separate ADR and evidence for per-project intent
58
+ locks, stale-context binding, approval digests, journal/rollback recovery, job
59
+ ownership/cancellation and bounded service shutdown. It must route target tools
60
+ through the common invocation pipeline and may not infer permission from this
61
+ read-only federation.
@@ -0,0 +1,60 @@
1
+ # ADR-034 — Universal Resource Layer and private content-addressed storage
2
+
3
+ **Status:** Accepted for DODO 1.0.0 Phase 04
4
+
5
+ ## Context
6
+
7
+ File tools, runtime media assets and generated previews previously used different
8
+ identities and lifetimes. Large binary data also had no generic resumable contract;
9
+ clients either needed a type-specific tool or risked loading a complete payload.
10
+
11
+ ## Decision
12
+
13
+ Add six individual full-surface operations:
14
+ `resource_inspect`, `resource_read`, `resource_read_range`, `resource_preview`,
15
+ `resource_extract`, and `resource_transform`. Compact and Hybrid expose the same
16
+ operations through the existing `dodo_media` gateway, so their catalog budgets stay
17
+ 19 and 49 while Full grows from 74 to 80.
18
+
19
+ Resource bytes use an installation-private SHA-256 CAS. SQLite stores immutable
20
+ object metadata and opaque references separately. A reference is scoped to the
21
+ active workspace and a digest of `grantId` + `clientId`; it expires after 24 hours.
22
+ Identical bytes share one object, but no reference, URI, hash, or resume token grants
23
+ access by itself.
24
+
25
+ Workspace ingest must pass the shared `WorkspaceFS` secret/protected/link policy,
26
+ explicit private-state exclusion, regular-file identity checks before and after a
27
+ streaming copy, size/quota limits, SHA-256 verification and optional expected
28
+ hash/MIME checks. Owned runtime media assets may enter CAS only after their existing
29
+ `MediaStorage` owner and live exec-scope checks pass.
30
+
31
+ Every read verifies live OAuth/client/grant/workspace ACL, workspace context,
32
+ principal ownership, private object identity, byte size and SHA-256. Range responses
33
+ are at most 256 KiB. Resume tokens are HMAC-signed, expire after ten minutes and bind
34
+ the object/hash/offset/workspace/principal, but still require all live authorization.
35
+
36
+ Raster previews are bounded JPEG MCP image blocks. Small audio can be returned as an
37
+ MCP audio block. SVG remains untrusted text. ZIP extraction reads bounded central
38
+ directory metadata only and never inflates entries. Unsupported PDF/OCR/media text
39
+ extraction returns an explicit unsupported result rather than inventing content or
40
+ executing an external decoder. Transform is currently one bounded raster thumbnail
41
+ and retains the existing exec/trust/owner-approval policy.
42
+
43
+ CAS publication links one complete fsynced staging inode into its hash path with
44
+ create-if-absent semantics, so a concurrent writer cannot overwrite the winner. A
45
+ SQLite trigger is the authoritative aggregate 2 GiB quota check across processes.
46
+ GC deletes expired references and then removes only objects with no remaining
47
+ references while holding the SQLite write transaction. Newly created or freshly
48
+ verified objects receive a one-hour orphan grace period so GC cannot race reference
49
+ creation. Staging and unregistered crash leftovers older than that grace are removed
50
+ on startup.
51
+
52
+ ## Consequences
53
+
54
+ - All supported bytes now have one immutable identity and range contract.
55
+ - CAS dedup does not merge ownership or workspace authority.
56
+ - Full clients receive six new definitions; remote Compact/Hybrid clients retain
57
+ their established tool counts and discover the operations dynamically.
58
+ - Full-hash verification before a range favors integrity over first-byte latency.
59
+ - PDF text, OCR, archive inflation and general media transcoding remain provider work
60
+ for later phases; current providers do not silently claim those capabilities.
@@ -0,0 +1,51 @@
1
+ # ADR-035 — Incremental Project Brain with source-verified graph evidence
2
+
3
+ ## Status
4
+
5
+ Accepted for DODO MCP 1.0.0.
6
+
7
+ ## Context
8
+
9
+ Per-request AST/LSP calls answer a focused question but do not preserve a bounded project
10
+ map. A persistent graph can reduce repeated work, yet cached code metadata creates a
11
+ security and correctness risk if clients treat it as authority or current source.
12
+
13
+ ## Decision
14
+
15
+ DODO keeps one regenerable Project Brain per workspace in installation SQLite. A bounded
16
+ worker parses TypeScript/JavaScript with DODO's pinned TypeScript package and parses
17
+ `package.json` as data. It never loads repository plugins or runs repository code.
18
+
19
+ The cache key includes source SHA-256, parser version, graph schema version and relevant
20
+ configuration. Incremental runs preserve unchanged parsed payloads, calculate affected
21
+ sources from import and symbol-reference evidence, and commit cache plus graph atomically.
22
+ An opaque file identity survives one unambiguous exact-content move, so semantic
23
+ `symbol://` identifiers can survive path changes.
24
+
25
+ Index records are evidence, not capabilities. Every public query rechecks the live grant,
26
+ workspace ACL, workspace context, guarded path and current source hash. Stale records are
27
+ omitted by default. HMAC cursors are bound to principal, workspace and query. Maintenance
28
+ operations require `dodo:exec` and target-specific trust approval.
29
+
30
+ ## Consequences
31
+
32
+ - Full grows to 86 operations; Compact remains 19 and Hybrid remains 49 by routing the six
33
+ brain operations through existing assistance gateways.
34
+ - TypeScript/JavaScript and package dependency graphs are available immediately; other
35
+ language graph providers require an explicit later contract.
36
+ - File-system metadata avoids hashing unchanged files on each poll, while final query
37
+ freshness still depends on SHA-256.
38
+ - Exact-content copies get new identity; ambiguous multiple removals do not reuse identity.
39
+ - Route/test/reference relations are labelled syntax evidence and do not claim runtime truth.
40
+ - Interrupted or corrupt state queues a full rebuild while retaining the last committed graph.
41
+
42
+ ## Rejected alternatives
43
+
44
+ - Treat graph IDs as authorization: rejected because copied/stale metadata must not bypass
45
+ direct source policy.
46
+ - Load repository TypeScript plugins or execute build scripts: rejected because repository
47
+ configuration has no authority.
48
+ - Rebuild the entire repository for every file change: rejected because the feature requires
49
+ measurable incremental work.
50
+ - Use embeddings as the sole source of truth: rejected because results need source location,
51
+ hash, parser version and deterministic freshness evidence.
@@ -0,0 +1,53 @@
1
+ # ADR-036 — Goal-driven Context Engine and source-verifying evidence
2
+
3
+ **Status:** Accepted for DODO 1.0.0 Phase 06
4
+
5
+ ## Context
6
+
7
+ Low-level search, Project Brain and read-only federation expose useful evidence, but
8
+ an AI client still had to select and merge each source itself. A raw repository dump
9
+ would exceed context budgets, obscure omissions and make stale or inferred data look
10
+ equivalent to verified source.
11
+
12
+ ## Decision
13
+
14
+ Add `context_query`, `context_evidence` and `context_status` to Full. Compact and
15
+ Hybrid route all three through the existing `dodo_assist_read` gateway, keeping their
16
+ catalog sizes at 19 and 49 while Full grows from 86 to 89.
17
+
18
+ `context_query` accepts a goal, optional terms, up to eight authorized project
19
+ selectors, an evidence byte budget and pagination. It combines bounded literal
20
+ search, active Project Brain entities/relations, active Git metadata and federated
21
+ read search. Ranking is deterministic and includes reasons. Output always separates
22
+ FACT, OBSERVATION, MEMORY, INFERENCE and HYPOTHESIS; unavailable Phase 07 memory and
23
+ Phase 08 runtime sources remain explicit empty/unavailable data.
24
+
25
+ Evidence records carry project/workspace identity, source type, opaque source URI,
26
+ relative path, SHA-256, location, optional commit, confidence, generation/verification
27
+ times, freshness and limitations. All retrieved content is marked untrusted.
28
+ `context_evidence` resolves only records owned by the same principal/request workspace
29
+ and rechecks live authorization and the current source dependency.
30
+
31
+ SQLite stores caller-scoped context cache levels L0–L6, evidence records and aggregate
32
+ metrics. Derived levels include dependency path/hash sets. Every L6 reuse first
33
+ rechecks active and target ACL plus all dependencies; mismatch marks prior evidence
34
+ stale and invalidates L1–L6. Cache/evidence have TTL and per-principal row caps. HMAC
35
+ cursors bind query, source index version, active workspace and principal.
36
+
37
+ ## Security consequences
38
+
39
+ Retrieval uses `dodo:read` and cannot call write/exec handlers. Project selectors are
40
+ resolved only from the caller's authorized federation view; unauthorized targets fail
41
+ without returning path metadata. Active and target `WorkspaceFS` policy remains the
42
+ source/path/secret authority. Evidence IDs, hashes, source URIs, cache rows and cursor
43
+ tokens grant no access. Repository instructions and retrieved text never alter OAuth,
44
+ ACL, trust, approvals, command sandbox or tool policy.
45
+
46
+ ## Consequences
47
+
48
+ - An AI can request bounded context by goal while seeing omissions and unavailable
49
+ providers explicitly.
50
+ - Stale evidence is inspectable as stale and is never silently presented as current.
51
+ - Full clients receive three additional definitions; remote catalog budgets remain
52
+ unchanged.
53
+ - Federated semantic graph, durable memory and runtime evidence remain later phases.
@@ -0,0 +1,46 @@
1
+ # ADR-037 — Evidence-backed owner-reviewed memory
2
+
3
+ **Status:** Accepted for DODO 1.0.0 Phase 07
4
+
5
+ ## Decision
6
+
7
+ DODO แยก durable memory ออกจาก Context cache และ Project Brain โดยมี seven explicit
8
+ kinds, source evidence snapshot, confidence, retention, CURRENT/STALE lifecycle และ
9
+ project visibility แยกต่อ record
10
+
11
+ MCP caller สร้างได้เฉพาะ non-permanent proposal จาก current `context_evidence` ของ
12
+ principal เดียวกัน Permanent memory เกิดได้ผ่าน authenticated private owner IPC เมื่อ
13
+ proposal ID และ digest ตรงกัน และเมื่อ source/conflict set ยังตรงกับตอนเสนอ
14
+
15
+ Cross-project visibility ต้องระบุ project IDs ตอน owner approval และไม่ grant client
16
+ ACL Learning proposal ต้องอ้าง current reviewed memory อย่างน้อยสองรายการ การ review
17
+ learning ไม่ติดตั้ง ไม่ execute และไม่สร้าง authority
18
+
19
+ Memory search ใช้ target tool pipeline, live OAuth/grant/ACL, bounded scan/budget และ
20
+ principal/workspace/query-bound HMAC cursor Context Engine ใช้ memory เป็น evidence class
21
+ `MEMORY` และผูก memory content hash/manifest เป็น cache dependency
22
+
23
+ ## Why
24
+
25
+ Cache ลดงานซ้ำในช่วงสั้น แต่ไม่เหมาะกับการเก็บ decision หรือ successful fix ข้าม
26
+ conversation ส่วน graph อธิบายโครงสร้าง code มากกว่าประสบการณ์ การมี store แยกทำให้
27
+ owner ตรวจ provenance, conflict, freshness และ retention ได้โดยไม่ยอมให้ repository
28
+ content กลายเป็น policy
29
+
30
+ ## Consequences
31
+
32
+ - Full surface เพิ่มห้า memory operations; catalog หลัง Phase 08 เป็น 104 tools; Phase 09 เพิ่มเป็น 121 tools;
33
+ Compact/Hybrid คง 19/49 และ route
34
+ ผ่าน assistance gateways
35
+ - SQLite migration เพิ่ม proposal, memory, visibility และ learning-review tables
36
+ - source ที่เปลี่ยนหรือ retention หมดทำให้ memory stale และ Context cache ที่พึ่งพา
37
+ memory นั้นใช้ต่อไม่ได้
38
+ - owner approval/prune/review มี scrubbed audit และไม่อยู่บน public MCP listener
39
+ - v1 ไม่มี autonomous skill installation, self-modifying policy หรือ cross-user sharing
40
+
41
+ ## Verification
42
+
43
+ Unit, HTTP+OAuth integration และ security fixtures ครอบคลุม proposal/approval digest,
44
+ retrieval, Context integration, source staleness, client/ACL/project isolation,
45
+ duplicate/conflict, retention/prune, credential-shaped input, prompt injection,
46
+ learning review และ owner audit
@@ -0,0 +1,46 @@
1
+ # ADR-038 — Caller-scoped Runtime Intelligence
2
+
3
+ **Status:** Accepted for DODO 1.0.0 Phase 08
4
+
5
+ ## Decision
6
+
7
+ DODO เพิ่ม durable runtime session, task reference และ immutable evidence store ต่อ
8
+ active workspace Session/evidence ผูก digest ของ `grantId + clientId`, workspace และ
9
+ expiration และตรวจ live OAuth/client/workspace ACL ซ้ำทุก access
10
+
11
+ Runtime task ใช้ `JobManager` และ invocation pipeline เดิมเท่านั้น: explicit
12
+ program+argv, policy approval, idempotency, environment allowlist, timeout และ
13
+ owner-selected command sandbox Browser collector ใช้ owned `BrowserService` session
14
+ เดิมและไม่มี operation เปิด browser/web/permission เอง
15
+
16
+ Persist เฉพาะ safe structured metadata, aggregate counts และ hashes ไม่ persist raw
17
+ stdout/stderr, DOM/console text, request headers, cookies, credentials หรือ environment
18
+ values Evidence เปลี่ยนเป็น STALE เมื่อ source recheck ไม่ตรง Snapshot เป็น metadata
19
+ manifest และ rollback candidates; rollback จริงยังใช้ change journal เดิม
20
+
21
+ Context Engine รับ current caller-owned runtime evidence เป็น `OBSERVATION` และใช้
22
+ evidence content hash + caller-specific runtime manifest เป็น dependency Runtime
23
+ diagnosis แยก FACT/OBSERVATION/INFERENCE และไม่มี effectful handler
24
+
25
+ ## Why
26
+
27
+ JobManager ทำให้งานอยู่รอดข้าม protocol reconnect อยู่แล้ว แต่ไม่มี task grouping,
28
+ bounded evidence provenance หรือ safe path เข้า Context Engine การสร้าง runtime layer
29
+ บน service เดิมรักษา execution authority หนึ่งชุดและป้องกัน divergence ระหว่าง job,
30
+ browser, sandbox และ gateway policy
31
+
32
+ ## Consequences
33
+
34
+ - Full surface เพิ่ม 10 operations เป็น 104 ณ Phase 08; Phase 09 เพิ่มเป็น 121 โดย Compact/Hybrid คง 19/49
35
+ - SQLite migration เพิ่ม runtime sessions/tasks/evidence พร้อม FK, quota และ expiry
36
+ - server restart รักษา completed task/evidence metadata แต่ไม่ reattach หรือ signal PID
37
+ - raw debugging output ยังใช้ bounded `job_output`; runtime evidence ไม่ทำสำเนา
38
+ - v1 ไม่มี autonomous watcher, permission grant, hidden-input capture หรือ automatic fix
39
+
40
+ ## Verification
41
+
42
+ HTTP+OAuth fixtures ครอบคลุม start/observe/cancel/timeout/idempotent retry,
43
+ disconnect/restart reconnect, snapshot staleness, Context retrieval, browser image
44
+ passthrough, raw-output non-retention, live ACL revoke, principal isolation,
45
+ secret/traversal path guards, inspect approval และ evidence quotas Packaging fixture
46
+ ยืนยัน runtime code/docs และ compact dispatch จาก tarball ที่ติดตั้งใหม่
@@ -0,0 +1,57 @@
1
+ # ADR-039 — Capability-narrowing Advanced Agent Runtime
2
+
3
+ **Status:** Accepted for DODO 1.0.0 Phase 09
4
+
5
+ ## Decision
6
+
7
+ DODO เพิ่ม durable Agent Runtime สำหรับ goal, immutable plan revisions, bounded parallel
8
+ hypotheses, path/symbol/resource intents, metadata snapshots, evidence-backed judgement,
9
+ restart recovery และ owner-reviewed reusable guidance
10
+
11
+ Run เป็น coordination state ที่ผูก principal, workspace และ epoch และมี capabilities
12
+ ที่ลดขอบเขตจาก authority เดิมเท่านั้น Managed read/write/exec ต้อง dispatch target จาก
13
+ Core catalog ผ่าน `invokeToolDefinition`; target scope, live ACL, trust approval,
14
+ WorkspaceFS, expected hash, command sandbox, idempotency และ audit ยังคง authoritative
15
+
16
+ Effectful path operation ต้องอยู่ใน run `writablePaths` และถือ path intent ที่ครอบ path
17
+ นั้น Intent overlap ระหว่าง hypotheses ถูกปฏิเสธ Snapshot ไม่เก็บ contents และ rollback
18
+ ได้เฉพาะ exact caller-owned post-snapshot changeset ผ่าน original rollback pipeline
19
+
20
+ Skill proposal เป็น immutable untrusted guidance ที่ไม่ปรากฏใน search จน owner ตรวจ
21
+ exact digest ผ่าน authenticated private IPC Approved version ไม่ executable และไม่เป็น
22
+ permission Coordinator pause/cancel ไม่ kill jobs
23
+
24
+ ## Why
25
+
26
+ Runtime Intelligence มี task/evidence ที่ตรวจสอบย้อนกลับได้ แต่ยังไม่มี contract สำหรับ
27
+ แบ่ง hypothesis, ป้องกัน candidate เขียนชนกัน, ผูก completion กับ current evidence หรือ
28
+ กู้ coordinator state หลัง restart การเพิ่ม service ที่เก็บ metadata และเรียก target
29
+ pipeline เดิมช่วยเพิ่มการประสานงานโดยไม่สร้าง execution authority ชุดที่สอง
30
+
31
+ ## Consequences
32
+
33
+ - Full surface เพิ่ม 17 operations เป็น 121; Compact/Hybrid คง 19/49
34
+ - Core 104 definitions คงชื่อ ลำดับ schema และ behavior เดิม
35
+ - SQLite migration เพิ่ม runs/plans/hypotheses/intents/actions/snapshots/judgements และ
36
+ versioned skill proposal/skill tables
37
+ - managed exec ใช้ explicit argv/owned handles และมี program/feature/job quotas เพิ่ม
38
+ - restart ไม่ replay action; run เก่าเข้า `RECOVERY_REQUIRED`
39
+ - owner review มีเฉพาะ private IPC/CLI ไม่มี MCP approval operation
40
+
41
+ ## Rejected alternatives
42
+
43
+ - generic autonomous super-tool: authority กว้างและ audit target ไม่ชัด
44
+ - plan/skill เป็น permission: ทำให้ untrusted stored content เพิ่มสิทธิ์ได้
45
+ - automatic rollback/retry หลัง uncertain effect: เสี่ยงทำ side effect ซ้ำ
46
+ - cancel coordinator แล้ว kill ทุก job: ละเมิด ownership และอาจหยุดงานอื่น
47
+
48
+ ## Verification
49
+
50
+ HTTP+OAuth integration fixtures ครอบคลุม immutable plan, conflicting hypotheses,
51
+ managed file change, metadata snapshot compare/rollback, current Runtime evidence,
52
+ deterministic judgement, exact completion criteria, explicit argv และ restart recovery
53
+
54
+ Security fixtures ครอบคลุม anonymous/read-only, principal isolation, live ACL revoke,
55
+ stale epoch, writable-path + intent checks, secret/traversal/nested-context rejection,
56
+ program allowlist, target-bound inspect approval, hostile skill rejection และยืนยันว่า
57
+ cancel run ไม่ kill owned job
@@ -0,0 +1,43 @@
1
+ # ADR-040: Revision-bound DodoBench and release evidence
2
+
3
+ Status: Accepted
4
+
5
+ ## Context
6
+
7
+ DODO มีหลาย capability ที่ทำงานร่วมกัน การนับ tool หรือทดสอบ handler แยกไม่พิสูจน์
8
+ ว่า HTTP/OAuth, gateway, workspace security, durable state และ package artifact ยังทำงาน
9
+ ร่วมกัน การประเมินด้วย AI เพียงครั้งเดียวก็ทำซ้ำยากและไม่ทราบ model/token baseline
10
+
11
+ ## Decision
12
+
13
+ ใช้ DodoBench แบบ deterministic กับ isolated fixtures และ real HTTP/OAuth เป็น
14
+ regression gate เก็บ baseline แบบ versioned และผูก report กับ source revision,
15
+ dependency lock, dataset, configuration และ host environment ไม่สร้าง model-token
16
+ estimate เมื่อไม่มี model call
17
+
18
+ Release candidate ต้องผ่าน build/type/lint/test, DodoBench, production audit,
19
+ manifest policy, immutable tarball checksum และ fresh exact-tarball install ซึ่งตรวจ
20
+ ทั้ง STDIO Full และ HTTP Compact Candidate automation กับ release readiness เป็นคนละค่า:
21
+ platform/manual/registry evidence ที่ยังไม่ได้รันต้องแสดงตามจริง
22
+
23
+ Evidence directory เป็น local ignored output และไม่ถูก pack สคริปต์ release gate ไม่
24
+ publish package และไม่รับ authority จาก benchmark result
25
+
26
+ ## Consequences
27
+
28
+ Regression หลักตรวจซ้ำได้และชี้ revision ชัดเจน แต่ local fixture latency ไม่ใช่ SLA,
29
+ browser case ขึ้นกับ Chromium และ external AI/Windows hardware ยังต้องมี separate gate
30
+ การเปลี่ยน baseline ต้อง review dataset และ threshold พร้อมกัน
31
+
32
+ ## Addendum — local macOS and Docker Linux evidence
33
+
34
+ ช่วงก่อนเริ่ม Windows phase ใช้ macOS local และ Linux Docker เป็น required automated
35
+ platforms ไม่ใช้ GitHub Actions Docker image ติดตั้ง Chromium และสร้าง package/fresh
36
+ install evidence จาก source copy แยก report ต้องตรงกับ host Git revision และ lock digest
37
+ Windows แสดงเป็น `DEFERRED_MANUAL_NOT_RUN`; Linux Docker ไม่ใช่ Windows evidence
38
+
39
+ ## Addendum — trusted self-hosted runners
40
+
41
+ ADR-043 เปิด GitHub Actions กลับมาหลัง dedicated Linux/Windows runners พร้อมใช้งาน
42
+ Linux ยังคงรัน Docker gate เดิมและ Windows รัน native candidate gate ส่วน macOS เป็น
43
+ local release gate Report ระบุ runner origin และ automated Windows ไม่แทน manual gate
@@ -0,0 +1,32 @@
1
+ # ADR-041: Local macOS and Docker Linux release gates
2
+
3
+ Status: Superseded by ADR-043
4
+
5
+ ## Context
6
+
7
+ GitHub-hosted jobs ไม่ได้เริ่มทำงานจริงและจึงไม่ใช่หลักฐานทดสอบ การแสดง workflow
8
+ สีเขียวจาก allow-failure อาจทำให้เข้าใจผิด ขณะเดียวกันทีมต้องการพัฒนา core ต่อบน
9
+ macOS และตรวจ portability บน Linux ก่อน โดยเลื่อน Windows native ไปช่วงสุดท้าย
10
+
11
+ ## Decision
12
+
13
+ ลบ GitHub Actions test workflows ใช้ macOS checkout เป็น platform แรก และสร้าง Linux
14
+ Docker image จาก checkout เป็น platform ที่สอง Image ใช้ Node 22, ติดตั้ง Chromium,
15
+ รัน build/typecheck/lint/full tests/DodoBench/audit/package/fresh-install smoke
16
+ เหมือน release gate หลัก
17
+
18
+ Docker build context ตัด Git metadata, credentials, local state, models, release evidence
19
+ และ private development documents ออก Runner อ่าน revision/dirty state จาก host Git,
20
+ ส่งเข้า container เป็น source attestation และตรวจ report กลับกับ package-lock digest
21
+
22
+ Strict gate ต้องมี `AUTOMATED_PASS` จาก macOS และ Linux บน revision/lock เดียวกัน
23
+ Linux report ต้องมาจาก clean source ที่มี `docker-host-git` provenance และผ่าน fresh
24
+ tarball install จึงไม่สามารถนำ dirty candidate หรือ evidence จาก runner อื่นมาแทนได้
25
+ Windows มีสถานะ `DEFERRED_MANUAL_NOT_RUN` และไม่อยู่ใน required platform set จนกว่า
26
+ native Windows phase จะถูกเปิดอย่างชัดเจน
27
+
28
+ ## Consequences
29
+
30
+ ผล Linux ทำซ้ำได้โดยไม่พึ่งสถานะ GitHub account และ browser fixture รันใน container
31
+ จริง แต่ Docker Linux ยังใช้ kernel/architecture ของ Docker Desktop และไม่แทนเครื่อง
32
+ Windows หรือ manual external-AI acceptance ไม่มีสคริปต์ใด publish npm
@@ -0,0 +1,36 @@
1
+ # ADR-042: Bind registered projects to a directory generation
2
+
3
+ Status: Accepted
4
+
5
+ ## Context
6
+
7
+ Project Registry เดิมระบุ directory ด้วย canonical path, device และ inode การรัน
8
+ Linux gate ใน Docker พบว่า filesystem สามารถนำ inode เดิมกลับมาใช้ทันทีหลังลบแล้ว
9
+ สร้าง directory ใหม่ที่ path เดิม ทำให้ tuple เดิมไม่พอพิสูจน์ว่าเป็น directory
10
+ generation เดิม ความคลาดเคลื่อนนี้อาจทำให้ registry รายงาน replacement ว่า ready
11
+
12
+ ## Decision
13
+
14
+ Project Registry metadata v2 เก็บ `root_birthtime_ns` เพิ่มจาก canonical realpath,
15
+ device และ inode ทุก readiness check และ federation cache key ต้องตรวจ marker นี้ด้วย
16
+ การ relocate รักษา opaque project ID ได้ต่อเมื่อทั้งสามค่าตรงกับรายการเดิม
17
+
18
+ Migration เพิ่ม column ใหม่แต่ไม่ auto-upgrade row v1 เพราะไม่มี birth time เดิมให้
19
+ เปรียบเทียบ และการเห็น device/inode เดิมในปัจจุบันยังแยก inode reuse ไม่ได้ Row นั้น
20
+ จึงคง metadata v1 และถูกอ่านเป็น `invalid` จนเจ้าของ review, remove และ add path ใหม่
21
+
22
+ การเพิ่มโปรเจกต์ใหม่บน filesystem ที่ไม่มี stable directory birth time จะได้
23
+ `NOT_SUPPORTED` พร้อมคำแนะนำให้ย้ายไป local filesystem ที่รองรับ ข้อจำกัดนี้ไม่เพิ่ม
24
+ สิทธิ์และไม่เปลี่ยน active-workspace ACL, OAuth, trust หรือ path guards
25
+
26
+ ## Consequences
27
+
28
+ Directory replacement ถูกปฏิเสธแม้ numeric inode ถูก reuse และ federation context
29
+ ไม่ reuse cache ข้าม directory generation แลกกับการไม่รองรับ durable Project Registry
30
+ บน filesystem บางชนิดที่รายงาน birth time ไม่ได้
31
+
32
+ ## Evidence
33
+
34
+ `tests/unit/projectRegistry.test.ts` จำลอง inode reuse แบบ deterministic และทดสอบ
35
+ v1-to-v2 migration ส่วน Linux Docker gate รัน Project Registry, federation,
36
+ security และ packaging suites บน Linux จริง