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,154 @@
1
+ # DODO Advanced Agent Runtime
2
+
3
+ Advanced Agent Runtime เป็นชั้นประสานงานสำหรับงานพัฒนาที่ต้องวางแผน ทดลองหลาย
4
+ สมมติฐาน เก็บหลักฐาน และกู้สถานะหลัง reconnect/restart โดยไม่สร้างสิทธิ์ใหม่ให้ AI
5
+
6
+ ## วงจรการทำงาน
7
+
8
+ ```text
9
+ Goal → Context → Plan → Act → Observe → Verify → Diagnose → Repair → Verify
10
+ ```
11
+
12
+ ตัวอย่างผ่าน Compact/Hybrid surface:
13
+
14
+ ```text
15
+ dodo_assist_change(operation="agent_run_open", args={
16
+ goal: "แก้ callback ที่คืนสถานะผิด",
17
+ completionCriteria: ["targeted tests pass", "no unrelated file changes"],
18
+ capabilities: {
19
+ allowedProjectIds: [],
20
+ writablePaths: ["src/auth", "tests/auth"],
21
+ allowedPrograms: ["npm"],
22
+ allowNetwork: false,
23
+ allowBrowser: false,
24
+ allowDesktop: false,
25
+ allowMedia: false,
26
+ allowWorkflow: false,
27
+ secretAccess: false,
28
+ maxHypotheses: 3,
29
+ maxActions: 50,
30
+ maxRunningJobs: 1,
31
+ maxWallMinutes: 60
32
+ }
33
+ })
34
+
35
+ dodo_assist_change(operation="agent_plan_set", args={...})
36
+ dodo_assist_change(operation="agent_hypothesis_open", args={...})
37
+ dodo_assist_change(operation="agent_intent_acquire", args={...})
38
+ dodo_write(operation="agent_write", args={
39
+ runId: "arun_...",
40
+ hypothesisId: "ahyp_...",
41
+ operation: "edit_file",
42
+ args: {path: "src/auth/callback.ts", edits: [...], expectedHash: "sha256:..."}
43
+ })
44
+ ```
45
+
46
+ Full surface เปิด operations รายตัว 17 รายการ:
47
+
48
+ ```text
49
+ agent_run_open
50
+ agent_run_status
51
+ agent_plan_set
52
+ agent_hypothesis_open
53
+ agent_intent_acquire
54
+ agent_intent_release
55
+ agent_read
56
+ agent_write
57
+ agent_exec
58
+ agent_snapshot_create
59
+ agent_snapshot_compare
60
+ agent_snapshot_rollback
61
+ agent_hypothesis_judge
62
+ agent_skill_search
63
+ agent_skill_inspect
64
+ agent_skill_propose
65
+ agent_run_control
66
+ ```
67
+
68
+ Compact/Hybrid ใช้ `dodo_assist_read`, `dodo_assist_change`, `dodo_write` และ
69
+ `dodo_exec` โดยอ่าน schema ล่าสุดจาก `dodo_discover`
70
+
71
+ ## Authority และ capabilities
72
+
73
+ Run ผูกกับ principal, active workspace และ workspace epoch และมี
74
+ `authority: coordination_only` Capabilities ของ run ลดขอบเขตจากสิทธิ์ที่ caller มี
75
+ อยู่แล้วเท่านั้น:
76
+
77
+ - `allowedProjectIds` ต้องเป็น project ที่ caller อ่านได้ในขณะเปิด run
78
+ - `writablePaths` จำกัด path เพิ่มจาก WorkspaceFS/path/secret policy เดิม
79
+ - `allowedPrograms` จำกัด executable เพิ่มจาก trusted resolver เดิม
80
+ - network/browser/desktop/media/workflow ปิดเป็นค่าเริ่มต้นและต้องเปิดต่อ run
81
+ - `secretAccess` เป็น `false` เท่านั้น
82
+ - hypothesis, action, running-job และ wall-time quota มีเพดานต่อ run
83
+
84
+ ทุก managed action เรียก target definition ผ่าน invocation pipeline ปกติ จึงตรวจ
85
+ OAuth scope, installation identity, live workspace ACL, workspace ID/epoch, trust,
86
+ target-bound approval, strict input schema, expected hash, path/secret/link guards,
87
+ command sandbox, caller idempotency และ audit อีกครั้ง Run ID, plan, hypothesis,
88
+ intent, snapshot, evidence หรือ skill ไม่ใช่ capability
89
+
90
+ ## Plan, hypothesis และ intent
91
+
92
+ `agent_plan_set` เพิ่ม immutable revision โดยใช้ `expectedRevision` และปฏิเสธ dependency
93
+ ที่หาย, self-reference หรือ cycle แต่ plan ไม่ execute operation
94
+
95
+ แต่ละ hypothesis ระบุ probable cause และ expected evidence การเขียนต้องถือ active
96
+ path intent ที่ครอบทุก path และ path ต้องอยู่ใน `writablePaths` ของ run ด้วย Intent
97
+ ที่ overlap กันระหว่าง active hypotheses ถูกปฏิเสธ จึงไม่ให้ candidate สองตัวเขียนทับ
98
+ พื้นที่เดียวกันพร้อมกัน Symbol/resource intent ใช้ประสานงานเท่านั้นและไม่แทน filesystem
99
+ หรือ resource permission
100
+
101
+ ## Managed read, write และ exec
102
+
103
+ - `agent_read` เรียก read-scope target ใน Full core catalog
104
+ - `agent_write` เรียก write-scope target ยกเว้น raw rollback; rollback หลัง snapshot
105
+ ใช้ `agent_snapshot_rollback`
106
+ - `agent_exec` รับเฉพาะ target ที่ใช้ explicit program/argv หรือ owned runtime handle
107
+ และไม่เปิด `run_command`, `run_commands`, `schedule_propose`, `job_input` หรือ
108
+ `job_cancel`
109
+
110
+ Command ยังรันด้วยสิทธิ์ OS ของผู้ใช้ตาม trust/sandbox ที่เจ้าของตั้งไว้ Coordinator
111
+ ไม่มี owner control และ pause/cancel run จะไม่ kill job หากต้องหยุด process ต้องเรียก
112
+ operation ของ JobManager/Runtime ที่เป็นเจ้าของ handle โดยตรง
113
+
114
+ ## Snapshot, evidence และ recovery
115
+
116
+ Snapshot เก็บเฉพาะ guarded file metadata, manifest hash และ changeset baseline ไม่เก็บ
117
+ file contents การ compare แสดง path metadata ที่เปลี่ยนและ caller-owned committed
118
+ changesets ที่สร้างหลัง snapshot การ rollback ต้องระบุ snapshot + changeset ที่ตรงกัน,
119
+ ถือ path intent และผ่าน `rollback_changes` journal/conflict/approval/idempotency เดิม
120
+
121
+ Hypothesis judgement และ completion ต้องอ้าง caller-owned `CURRENT` Runtime evidence
122
+ ที่ revalidate ได้ Completion ต้องมีผล passed สำหรับ completion criteria ทุกข้อความแบบ
123
+ exact match จึงเปลี่ยนสถานะเป็น `COMPLETED`
124
+
125
+ หลัง server restart action ที่ค้าง `RUNNING` จะเป็น `INTERRUPTED` พร้อม
126
+ `SERVER_RESTARTED` และ run epoch เก่าจะเป็น `RECOVERY_REQUIRED` เจ้าของงานต้องอ่าน
127
+ status แล้วเรียก `agent_run_control(action="recover")` อย่างชัดเจน ระบบไม่ replay
128
+ effectful action และไม่ signal stored PID
129
+
130
+ ## Reusable skills
131
+
132
+ AI เสนอ guidance ได้ด้วย `agent_skill_propose` แต่ proposal ถูกซ่อนจาก search จนกว่า
133
+ เจ้าของจะตรวจ exact digest ผ่าน private authenticated IPC:
134
+
135
+ ```bash
136
+ dodo agent skill pending
137
+ dodo agent skill show askillprop_xxxxxxxxxxxx
138
+ dodo agent skill approve askillprop_xxxxxxxxxxxx --digest sha256:...
139
+ # หรือ
140
+ dodo agent skill reject askillprop_xxxxxxxxxxxx --digest sha256:...
141
+ ```
142
+
143
+ Approved skill มี version แบบ immutable และ `authority: untrusted_guidance` เสมอ
144
+ `agent_skill_search` คืนเฉพาะ metadata; `agent_skill_inspect` จึงเปิด steps ของ version
145
+ ที่ผ่าน review Skill ไม่ถูกติดตั้งเป็น code, ไม่ execute เอง และไม่ grant scope, ACL,
146
+ trust, approval, sandbox exception, network หรือ owner permission
147
+
148
+ ## ข้อจำกัด
149
+
150
+ - มี active workspace เดียวต่อ DODO process; federation ใน run ยังคง read-only
151
+ - Coordinator ไม่ใช่ autonomous daemon และไม่เฝ้าหรือแก้ project เองนอก MCP call
152
+ - ไม่มี unrestricted shell, hidden owner control หรือ automatic approval
153
+ - snapshot เป็น metadata comparison ไม่ใช่ VM/filesystem snapshot
154
+ - cancel/pause run ไม่หยุด process และไม่ลบ workspace files
@@ -0,0 +1,110 @@
1
+ # AI Providers, Sub-agents และหลายโปรเจกต์
2
+
3
+ DODO MCP 1.0.0 สามารถเปิด runtime ของหลายโปรเจกต์ใน process เดียว และเรียกโมเดลจาก backend ผ่าน connection/profile ที่เจ้าของเลือกได้ ค่าเริ่มต้นเป็นโหมดส่วนตัว: เพิ่มโปรเจกต์, connection และ profile แล้วใช้งานได้ทันทีโดยไม่ต้องทำ allowlist ซ้ำ
4
+
5
+ ## เริ่มใช้งานผ่านเว็บ
6
+
7
+ 1. เปิด `dodo start` หรือ `dodo --cli` แล้วเข้า Local Config จาก URL ส่วนตัวที่ terminal แสดง ใช้หน้าเว็บ loopback เท่านั้น หน้า "ภาพรวม" แสดงขั้นตอนถัดไป (เพิ่มโปรเจกต์ → เพิ่ม Provider → สร้าง Profile → เริ่มงาน) พร้อมสถานะและรายการที่ต้องตรวจสอบ
8
+ 2. หน้า "โปรเจกต์": เพิ่ม absolute path ของ A/B แล้วพร้อมใช้ทันที การเลือกดู B ไม่เปลี่ยน default และไม่หยุด A
9
+ 3. หน้า "Providers & Profiles" (ส่วน AI Providers): เลือก preset หรือ Custom, protocol, Base URL และกรอก key เลือกเฉพาะรอบนี้หรือ macOS Keychain ปุ่มบันทึกตรวจรูปแบบ/endpoint policy และแสดงสถานะบันทึกพร้อมเวลา; ปุ่มรายชื่อโมเดลเป็น credential test แยกจากการทดสอบ inference ผลบอกชื่อ connection, เวลา และเมื่อพลาดจะระบุว่าไม่ retry อัตโนมัติ
10
+ 4. หน้าเดียวกัน (ส่วน Agent Profiles): สร้าง Coding/Review/Research เลือก connection, Model ID, scopes, tool calling, image input และ budgets แล้วใช้กับทุกโปรเจกต์ที่ลงทะเบียนได้ทันที
11
+ 5. หากเป็น installation ที่แชร์หลาย client ให้เปลี่ยน Settings เป็น managed แล้วกำหนด trust, project ACL, profile/client allowlist และ source egress ต่อโปรเจกต์ (การสลับโหมดมีกล่องยืนยันเสมอ) ในโหมดส่วนตัว ฟอร์มสิทธิ์รายโปรเจกต์ถูกซ่อนและแทนด้วยโน้ตสั้นพร้อม tooltip
12
+ 6. ปุ่มทดสอบ inference/tool calling ส่งข้อมูลสังเคราะห์และอาจมีค่าใช้จ่าย ต้องยืนยันผ่านกล่อง warning ก่อนทุกครั้ง (ค่าใช้จ่ายที่ไม่ทราบแสดงว่า "ไม่ทราบ" ไม่ใช่ศูนย์) ระหว่างทดสอบมี loading modal และปุ่มถูกปิดกันส่งซ้ำ; ผลระบุชื่อ connection, Model ID, ชนิดการทดสอบ และเวลา ผลเก่าไม่รับรองค่าที่เปลี่ยนภายหลัง เมื่อพลาดจะแสดงทั้ง inline และ modal พร้อมข้อความว่าไม่ retry อัตโนมัติ โมเดลที่เปิด tool calling เองแต่ยังไม่ทดสอบยังไม่ถือว่า live coding integration ผ่าน
13
+ 7. หน้า "Chat & Tasks": เลือกโปรเจกต์/profile ระบุงาน ส่งงานหนึ่งครั้ง (มี idempotency key กันงานซ้ำเมื่อ reconnect) แล้วดู "Runs & Jobs" แสดงสถานะอ่านง่าย ข้อความ, tool receipts และผล jobs อยู่ใน details ที่พับได้ การยกเลิก/ลบประวัติต้องยืนยันก่อน
14
+
15
+ ประวัติแสดงผลที่มองเห็นได้และหลักฐาน ไม่แสดง raw reasoning/continuation ของ provider หากติด approval ให้อ่านคำขอของ operation เป้าหมายและอนุมัติผ่าน owner controls จากนั้น Resume ด้วยผู้เรียกเดิม การกด Resume ไม่ขยาย scopes หรือ trust
16
+
17
+ ## Protocols
18
+
19
+ | Preset | Protocol | Base URL เริ่มต้น |
20
+ |---|---|---|
21
+ | OpenAI / GPT | Responses | `https://api.openai.com/v1` |
22
+ | Gemini | Native Interactions | `https://generativelanguage.googleapis.com/v1beta` |
23
+ | Claude | Anthropic Messages | `https://api.anthropic.com/v1` |
24
+ | MiniMax | Anthropic-compatible | `https://api.minimax.io/anthropic/v1` |
25
+ | GLM / Z.AI | Chat Completions | `https://api.z.ai/api/paas/v4` |
26
+ | Kimi | Chat Completions | `https://api.moonshot.ai/v1` |
27
+ | Ollama | Native Chat | `http://127.0.0.1:11434/api` |
28
+
29
+ Custom เลือก protocol ได้ทั้งห้าแบบและสร้างหลาย connection ของค่ายเดียวกันได้ ไม่มี fallback เปลี่ยน endpoint/provider อัตโนมัติ รายชื่อโมเดลขึ้นอยู่กับ endpoint; ถ้าไม่รองรับให้กรอก Model ID เอง ไม่รับประกันว่า model ทุกตัวรองรับ tool calling/ภาพหรือ token limits เท่ากัน
30
+
31
+ Adapter เก็บ call IDs และ continuation ของ protocol รวมถึง Anthropic thinking signatures, Gemini steps, Responses encrypted reasoning และ Chat/Ollama continuation แบบ private เพื่อส่งผล tools รอบถัดไปอย่างถูกต้อง Responses ใช้ `store:false` และ encrypted reasoning include; Gemini ใช้ `store:false` การตั้งนี้ไม่เปลี่ยนนโยบาย retention ทั้งหมดของผู้ให้บริการ
32
+
33
+ เอกสาร protocol: [OpenAI function calling](https://developers.openai.com/api/docs/guides/function-calling), [Gemini Interactions](https://ai.google.dev/gemini-api/docs/interactions-overview), [Anthropic tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview), [MiniMax compatibility](https://platform.minimax.io/docs/api-reference/text-anthropic-api), [GLM compatibility](https://docs.z.ai/guides/develop/openai/python), [Kimi API](https://platform.kimi.ai/docs/api/overview), [Ollama Chat](https://docs.ollama.com/api/chat)
34
+
35
+ Ollama loopback อาจเรียก cloud model ได้ ต้องเลือก inference location และใช้ปุ่มตรวจ metadata ไม่ติดป้ายว่า local จาก hostname เพียงอย่างเดียว การตรวจเป็นหลักฐานที่ endpoint รายงาน ไม่ใช่ OS network sandbox ดู [Ollama Cloud](https://docs.ollama.com/cloud)
36
+
37
+ ## Credential และ endpoint
38
+
39
+ - Session key อยู่ในหน่วยความจำจน DODO ปิด; Keychain ใช้บน macOS และอาจมีหน้าต่างระบบให้เจ้าของอนุญาต
40
+ - Private state เก็บ credential reference/สถานะเท่านั้น ไม่ส่ง key กลับมาเติม UI ไม่มี key ใน repo, localStorage, URL, logs หรือ process arguments
41
+ - เปลี่ยน endpoint/protocol/storage ต้องกรอก key ใหม่ ไม่มีการส่ง key เดิมไปปลายทางใหม่ การแก้ connection ที่มี run ใช้อยู่ถูกปฏิเสธจนหยุด/จบงาน
42
+ - Public ใช้ HTTPS; loopback/LAN ต้องเลือกอนุญาต private endpoint ชัดเจน DNS ถูกตรวจทุก address แล้ว pin socket; ไม่ตาม redirect, metadata/link-local และ DODO MCP/admin ports ถูกปฏิเสธ
43
+ - การอนุญาต AI provider แยกจาก `allowWebFetch` และไม่เปิด Desktop/microphone/system audio หรือเปลี่ยน tunnel token ให้ persistent
44
+ - หน้าเว็บใช้ owner authentication เดิม; loopback ไม่ถือเป็น authentication ด้วยตัวเอง Public MCP ไม่มี admin routes
45
+
46
+ ## MCP หลายโปรเจกต์
47
+
48
+ Full มี 125 tools; Compact 19; Hybrid 49 operations ใหม่ใช้ gateways เดิม
49
+
50
+ ```text
51
+ project_overview()
52
+ → รายชื่อ projects ที่ caller ได้รับอนุญาต
53
+ project_overview(targetProjectId="prj_…")
54
+ → workspaceId, workspaceEpoch และ ai.profiles ของเป้าหมาย
55
+
56
+ dodo_write(
57
+ targetProjectId="prj_…",
58
+ workspaceId="…", workspaceEpoch="…",
59
+ operation="write_file",
60
+ args={path:"example.txt", content:"alpha"}
61
+ )
62
+ ```
63
+
64
+ `targetProjectId` เป็น optional สำหรับ Full tools และ Compact gateways ไม่ส่งหมายถึง default เดิม Scope/ACL/context ตรวจหลังเลือก target; OAuth identity ยังต้องมีอายุ, audience และ live grant ถูกต้อง Root-bound grants เดิมใช้ข้าม workspace ไม่ได้ `projectId/projectIds` ของ read federation เดิมยังเป็น read-only และห้ามผสมกับ target routing แบบกำกวม ห้ามใส่ target/context ซ้ำใน gateway args
65
+
66
+ ## Sub-agent contract
67
+
68
+ Sub-agent ยังพร้อมใช้จากหน้า Local Config → Chat & Tasks เสมอ ส่วน MCP clients จะไม่
69
+ เห็น operations กลุ่มนี้โดยค่าเริ่มต้น เจ้าของเปิดได้ที่ **Settings → Sub-agent tools
70
+ ใน MCP** แล้ว restart DODO และ rescan/recreate MCP app เมื่อปิด Full live catalog มี
71
+ 121 tools; เมื่อเปิดมีครบ 125 ส่วน Compact/Hybrid ยังมี 19/49 ชื่อเท่าเดิมแต่ operation
72
+ enum และ `dodo_discover` จะมีสี่ operations ด้านล่างเฉพาะเมื่อเปิดเท่านั้น
73
+
74
+ ```text
75
+ dodo_discover(operation="subagent_spawn")
76
+ dodo_assist_change(
77
+ targetProjectId="prj_…", workspaceId="…", workspaceEpoch="…",
78
+ operation="subagent_spawn",
79
+ args={profileId:"profile_…",task:"แก้ฟังก์ชันและรัน test",idempotencyKey:"task-unique-0001"}
80
+ )
81
+ → run ID
82
+
83
+ dodo_assist_read(operation="subagent_status", args={runId:"…"}, …context)
84
+ dodo_assist_read(operation="subagent_result", args={runId:"…",after:0}, …context)
85
+ dodo_assist_change(operation="subagent_control", args={runId:"…",action:"pause|resume|cancel"}, …context)
86
+ ```
87
+
88
+ ตรวจชื่อ fields จาก `dodo_discover` ก่อนเรียก ผล result มี receipts แบบแบ่งหน้าและ `nextEventCursor` การ retry spawn ด้วย key/args เดิมได้ run เดิม key เดิมกับงานใหม่ถูกปฏิเสธ
89
+
90
+ Spawn ต้องมี `dodo:exec` และ profile ลดสิทธิ์จาก caller ได้เท่านั้น โหมดส่วนตัวถือว่าการลงทะเบียน project และการเลือก remote profile เป็น owner consent สำหรับ project access/source egress; โหมด managed ยังบังคับ project ACL และ profile/provider permission แยกกัน Child run ผูกหนึ่ง project ไม่เรียก agent ซ้อนหรือ owner controls และทุก model tool call ยังตรวจ original schema, live grant, epoch, expected hash, secret/path guards, sandbox และ output contract
91
+
92
+ ค่าเริ่มต้นพร้อมกัน 4 runs ทั้งเครื่อง, 2 ต่อ project, 1 ต่อ Ollama connection, queue 32; profile สูงสุด 20 model calls/50 tool actions/30 นาที ตั้ง input/output budget ตามโมเดล (เริ่ม 64,000/4,096) Input ใช้ UTF-8 byte bound แบบ conservative พร้อม image allowance ไม่ใช่ tokenizer ของทุกค่าย หากไม่มีข้อมูล usage/ราคา ค่าใช้จ่ายแสดง “ไม่ทราบ” ราคาที่กรอกเป็น estimate ไม่ใช่ billing guarantee
93
+
94
+ ## Queue, pause และ recovery
95
+
96
+ Direct MCP, agent และ schedule ที่อาจแก้ไฟล์ใช้ mutation queue เดียวต่อโปรเจกต์ คำสั่ง shell/exec ถือคิวจน process จบ Read ยังขนานได้ คนละโปรเจกต์มี services/epoch/jobs แยกกันและไม่ใช้ `process.chdir()` คิวไม่ป้องกันโปรแกรมภายนอก จึงยังตรวจ expected hash ตอนถึงคิว และ workspace guard ไม่ใช่ OS sandbox
97
+
98
+ Pause หยุดขั้นถัดไป; job ที่เริ่มไปแล้วอาจทำต่อจนจบ Cancel พยายามหยุดเฉพาะ job ของ run นั้น ไม่ rollback ผลที่เกิดแล้วโดยอัตโนมัติ ทั้งสองอย่างไม่รับประกันยกเลิก provider billing สำหรับ request ที่ส่งไปแล้ว
99
+
100
+ History เก็บใน private SQLite แยก project/caller ไม่เป็น approved memory อัตโนมัติ ค้นหา/ลบ terminal runs และตั้ง retention ได้ Run events ส่งด้วย authenticated fetch + cursor; reconnect ไม่สร้างงานใหม่และไม่มี token ใน URL ปิด browser แล้วงานยังทำต่อเมื่อ DODO เปิดอยู่
101
+
102
+ หลัง DODO restart งานค้างเป็น `interrupted` ต้อง Resume ด้วยสิทธิ์ใหม่จาก caller เดิม หากผล inference/action ไม่แน่นอนจะบล็อก Resume และให้ตรวจ receipts ก่อนสร้างงานใหม่ ไม่ replay side effect เงียบ ๆ OAuth token ไม่ถูกเก็บเพื่อใช้ต่อถาวร delegation lease มีเพดาน 30 นาที; หมดอายุรอ authentication ใหม่ Revoke หยุดขั้นถัดไปโดยไม่ให้ owner Resume เป็นสิทธิ์ที่กว้างกว่า caller เดิม
103
+
104
+ ## ข้อจำกัดและการตรวจรับ
105
+
106
+ - Runtime พร้อมใช้ได้ไม่เกิน 16 secondary projects ต่อ instance; ปิด runtime ที่ว่างก่อนเปิดเพิ่ม ถ้ามี requests/jobs/agents ใช้อยู่จะปฏิเสธการปิด/ถอด
107
+ - Chat รองรับข้อความและ explicit workspace image paths ผ่าน Resource Layer เมื่อ profile รองรับภาพ ไม่มีการอัปโหลดทั้ง repo หรือ binary อื่นไปโมเดลเอง
108
+ - Owner controls ที่ไม่ใช่งานประจำบางรายการใช้แบบฟอร์ม advanced operation/JSON ร่วม validation เดิม; เริ่มโปรแกรม/ปลด Keychain/macOS permissions ยังเป็นการกระทำของเจ้าของบนเครื่อง
109
+ - ทดสอบ protocol fixtures ทั้งเจ็ด presets ไม่เท่ากับ live provider integration ต้องดู `docs/TEST_REPORT.md` และ manual checklist แยก provider/แพลตฟอร์ม
110
+ - งานนี้ไม่เพิ่ม native Windows support, Git worktrees, training หรือ publish release อัตโนมัติ
@@ -0,0 +1,331 @@
1
+ # DODO MCP — Architecture
2
+
3
+ ## Overview
4
+
5
+ DODO แบ่งเป็น data plane สำหรับ MCP tools และ owner control plane สำหรับ Local Config/CLI ทั้งสอง plane ใช้ state และ workspace lifecycle เดียวกัน แต่ public MCP ไม่มี admin endpoint
6
+
7
+ ```text
8
+ AI client
9
+ │ OAuth + MCP
10
+
11
+ HTTP MCP 127.0.0.1:21730 ──► surface registry ──► policy/invocation pipeline
12
+
13
+ ├─ workspace services
14
+ ├─ changes and jobs
15
+ ├─ Git/intelligence/LSP
16
+ ├─ assistance/multimodal/workflow
17
+ ├─ Context Engine ──► evidence + L0–L6 cache
18
+ ├─ Memory ──► reviewed evidence + stale lifecycle
19
+ ├─ Runtime Intelligence ──► durable tasks + bounded evidence
20
+ ├─ Advanced Agent Runtime ──► plans + hypotheses + intents + reviewed skills
21
+ ├─ Project Brain ──► incremental AST graph
22
+ └─ resource references ──► private SHA-256 CAS
23
+
24
+ Owner browser/CLI
25
+ │ loopback + capability token / IPC
26
+
27
+ Local Config 127.0.0.1:21731 ──► WorkspaceHost ──► active workspace lifecycle
28
+
29
+ Local owner CLI ──► authenticated tunnel IPC ──► bounded cloudflared supervisor
30
+
31
+ Local owner CLI/Config ──► project registry ──► projectId + workspace reference
32
+
33
+ Authorized MCP read ──► federation resolver ──► isolated read context A/B/…
34
+ ```
35
+
36
+ ## Project Brain และ incremental graph
37
+
38
+ `ProjectBrainService` เป็น service ต่อ active workspace และใช้ SQLite tables แยก
39
+ สำหรับ index state, parsed-file cache, nodes, edges และ bounded run history
40
+ background scheduler ตรวจ metadata เป็นช่วง แล้ว snapshot เฉพาะไฟล์ที่เปลี่ยนผ่าน
41
+ `WorkspaceFS` ก่อนส่ง UTF-8 text ไปยัง worker ที่โหลด bundled TypeScript เท่านั้น
42
+ ไม่มีการโหลด compiler plugin, language plugin หรือ code จาก repository
43
+
44
+ cache key ผูก content SHA-256, parser version, schema version และ config hash
45
+ exact-content move รักษา opaque file identity ทำให้ `symbol://<project>/<entity>`
46
+ คงเดิม จากนั้น affected calculator สร้าง graph ใหม่เฉพาะ source ที่เปลี่ยน ผู้ import
47
+ source นั้น และ source ที่อ้างชื่อ symbol ที่เปลี่ยน transaction เดียว commit cache,
48
+ nodes, edges, metrics และ run state จึงไม่เกิด graph ครึ่งรุ่น
49
+
50
+ index เป็น evidence ที่สร้างใหม่ได้ ไม่ใช่ authority ทุก `brain_query` และ
51
+ `brain_symbol` ตรวจ principal/live grant/target authority, workspace context,
52
+ `WorkspaceFS` policy และ SHA-256 ปัจจุบันซ้ำ stale row ถูกตัดออกโดย default และ
53
+ cursor ใช้ HMAC ผูก query, workspace และ principal การเปลี่ยน workspace ปิด parser,
54
+ scheduler และ run เดิมก่อนปิด database
55
+
56
+ ## Bootstrap and workspace lifecycle
57
+
58
+ `bootstrapWorkspace` เปิด database, store, root policy, ignore engine, planner/applier, jobs, Git, search, intelligence และ optional services สำหรับ root เดียว
59
+
60
+ HTTP launcher เริ่มได้โดยไม่มี active project เพื่อให้ `dodo` รันจาก directory ใดก็ได้
61
+ ระหว่างนี้ process bootstrap private inert root ใต้ config directory สำหรับ control-plane
62
+ resources เท่านั้น `workspaceSelected=false` ยังเปิด OAuth installation login และ
63
+ authenticated MCP catalog เพื่อให้ remote client เชื่อมต่อได้ก่อน แต่ invocation pipeline
64
+ ไม่ให้สิทธิ์กับ inert root และคืน `WORKSPACE_ACCESS_REQUIRED` จนมี registered target จริง
65
+ `/healthz` และ Local Config ยังพร้อมให้เจ้าของเพิ่มหรือเลือกโปรเจกต์
66
+ เมื่อ target ผ่าน shared root policy, readiness และ WorkspaceHost switch lifecycle แล้ว
67
+ จึง flip active state, เริ่ม schedules และให้ request ใหม่สร้าง MCP context ของ root จริง
68
+
69
+ `WorkspaceHost` ถือ active workspace เดียวต่อ process การเปลี่ยน workspace ทำแบบ prepare → readiness → drain/teardown → commit และ rollback เมื่อขั้นตอน prepare ล้มเหลว ทุก request resolve active workspace ตอนเริ่ม request และตรวจ identity/epoch ซ้ำใน invocation pipeline
70
+
71
+ running jobs, in-flight requests, stale Local Config headers และ duplicate server ownership ถูกตรวจเป็น precondition การสลับจะไม่ kill jobs เงียบ ๆ
72
+
73
+ `startupProjectId` ชี้ owner registry entry เพื่อเลือก startup root แต่ไม่ใช่ authority
74
+ ระบบ resolve canonical identity/readiness ใหม่ทุก startup และ fallback เป็น launcher mode
75
+ เมื่อพิสูจน์ target ไม่ได้ ไม่มี service ใดเปลี่ยน root จาก `process.cwd()`
76
+
77
+ ## Project registry
78
+
79
+ Project Registry อยู่ใน installation SQLite และใช้ opaque random project ID แยกจาก
80
+ path-derived workspace ID รายการเก็บ canonical root, directory identity แบบ
81
+ device/inode/birthtimeNs, display metadata และ readiness เท่านั้น ไม่ใช่ authority
82
+ store และไม่มี MCP/public route การใช้ birth time แยก directory generation ใหม่ออก
83
+ จาก inode เดิมที่ Linux อาจนำกลับมาใช้ซ้ำ
84
+
85
+ การ relocate ที่พิสูจน์ directory identity เดิมได้รักษา project ID แต่คำนวณ
86
+ workspace ID จาก path ใหม่ ทำให้ managed trust และ client ACL ไม่ถูกคัดลอก Registry mutation
87
+ และ audit commit ใน transaction เดียวกัน การ remove เป็น soft removal และไม่ลบไฟล์
88
+ workspace history หรือ security state
89
+
90
+ ## Read-only federation
91
+
92
+ Phase 03 เพิ่ม `FederationService` เป็น isolation layer สำหรับ owner-registered
93
+ projects โดยไม่ bootstrap target เป็น active runtime และไม่เปลี่ยน `process.cwd()`
94
+ แต่ละ target สร้าง `IgnoreEngine`, `WorkspaceFS`, read/list/search/overview และ Git
95
+ read service ของตัวเอง พร้อม process-local federation epoch และ cache แบบ LRU
96
+ ที่มีเพดาน 16 target contexts
97
+
98
+ request ยังยึด active workspace ID/epoch ใน invocation pipeline แล้ว federation
99
+ ตรวจ installation identity, grant revocation, token/grant read scope และ target
100
+ authority ตาม access mode ซ้ำ Project Registry ถูก resolve และตรวจ canonical directory identity
101
+ ทุกครั้งก่อนใช้ cache cache key ผูก workspace ID, registry update และ
102
+ dev/inode/birthtimeNs
103
+
104
+ cross-project search รับสูงสุด 8 project IDs แบ่ง result quota รวมและทำ target ที่
105
+ พร้อมแบบ concurrent ผลแต่ละ target มี project/workspace identity, epoch และ hashes
106
+ ของ source files Target ที่ authorized แต่ unavailable แสดงเป็น partial failure;
107
+ หาก target ใดไม่มี authority request ทั้งก้อนถูกปฏิเสธก่อนคืนผล
108
+
109
+ Federation audit เขียนอีกแถวด้วย target workspace ID นอกเหนือจาก outer tool audit
110
+ ของ active workspace ทำให้ history กรองตาม project ได้ `projectId/projectIds` เปิดเฉพาะ
111
+ read tools; write/exec/jobs/plans ใช้ explicit `targetProjectId` เพื่อเลือก runtime แยก
112
+
113
+ ## Tool invocation
114
+
115
+ ทุก direct tool และ gateway ใช้ pipeline กลาง:
116
+
117
+ 1. resolve principal
118
+ 2. เลือก target runtime (หรือ default เมื่อไม่ระบุ) แล้วตรวจ workspace และ target authority
119
+ 3. ตรวจ workspace ID/epoch
120
+ 4. ตรวจ required OAuth scope
121
+ 5. parse input schema แบบ strict
122
+ 6. ตรวจ effective trust/action/approval และ idempotency
123
+ 7. เรียก handler
124
+ 8. validate output และส่ง content blocks
125
+ 9. บันทึก audit แบบ scrubbed
126
+
127
+ Gateway ไม่เรียก handler ตรง ๆ และไม่สามารถเรียก gateway อื่น, project overview หรือ owner controls
128
+
129
+ ## Context Engine และ evidence
130
+
131
+ `ContextEngineService` ทำ goal-driven retrieval ต่อ active workspace โดยรวม guarded
132
+ lexical search, Project Brain, Git และ read-only federation ผลลัพธ์แยก evidence class,
133
+ project/source provenance, confidence, freshness และข้อจำกัด Ranking deterministic
134
+ ภายใต้ query/ACL/index version เดียวกันและจำกัดด้วย byte budget/cursor
135
+
136
+ SQLite เก็บ caller-scoped cache L0–L6, evidence และ aggregate metrics Derived cache
137
+ ผูก dependency path/hash ก่อน reuse ระบบตรวจ live active/target ACL และ guarded source
138
+ ซ้ำ หาก hash เปลี่ยนจะ mark evidence เดิม stale และ invalidate L1–L6 Cursor ใช้ HMAC
139
+ ผูก principal/workspace/query/index version ค่า ID/hash/cache ไม่ใช่ authority และ
140
+ retrieved content ทุกชนิดเป็น untrusted data
141
+
142
+ ## Memory และ reviewed learning
143
+
144
+ `MemoryService` แยก durable experience จาก Context cache และ Project Brain MCP
145
+ caller สร้างได้เพียง proposal จาก current `context_evidence` ของ principal เดียวกัน
146
+ เจ้าของอนุมัติ proposal ID + digest ผ่าน authenticated private IPC เท่านั้น ก่อน commit
147
+ ระบบตรวจ source hash, conflict set, active workspace และ explicit cross-project
148
+ visibility ซ้ำใน transaction
149
+
150
+ Memory record มี source provenance, confidence, retention, CURRENT/STALE, content hash
151
+ และ `authority: evidence_only` การค้นตรวจ live target ACL/readiness แล้วจำกัด scan,
152
+ byte budget และ signed cursor Context Engine รับ memory ที่ current เป็น `MEMORY`
153
+ evidence และใส่ memory content hash/manifest ใน dependency cache เมื่อ source เปลี่ยน
154
+ memory stale และ derived cache ใช้ซ้ำไม่ได้
155
+
156
+ Learning proposal ต้องอ้าง current owner-reviewed successful memory อย่างน้อยสองชิ้น
157
+ Owner review บันทึก audit เท่านั้น ไม่มี handler สำหรับติดตั้ง/execute หรือเปลี่ยน policy
158
+
159
+ ## Runtime Intelligence
160
+
161
+ `RuntimeService` อยู่ต่อ active workspace และเก็บ session, task reference และ immutable
162
+ evidence ใน SQLite Session ผูก digest ของ `grantId + clientId`, workspace ID และ
163
+ expiration งาน process/test/container ใช้ `JobManager` เดิมด้วย explicit program+argv,
164
+ environment allowlist, timeout, execution approval, idempotency และ owner-selected
165
+ command sandbox จึงไม่มี runtime shell หรือ process launcher อีกชุดหนึ่ง
166
+
167
+ process evidence เก็บ status/exit/signal/timestamps, stream byte counts และ SHA-256 ของ
168
+ bounded sample เท่านั้น Optional JSON test report อ่านผ่าน `WorkspaceFS` และลดเหลือ
169
+ aggregate counts กับ source hash ส่วน Browser collector เรียก `BrowserService.observe`
170
+ บน owned session เดิม แล้ว persist safe URL ที่ไม่มี query, content/screenshot hashes,
171
+ event counts และ bounded navigation timing โดย WebSocket policy ยังคง blocked ตาม
172
+ browser isolation ส่วน bounded DOM/image ส่งผ่าน MCP response แต่ไม่ถูกเก็บใน runtime tables
173
+
174
+ Snapshot hash มาจาก guarded file metadata manifest และแสดง caller-owned committed
175
+ changeset IDs เป็น rollback candidates เท่านั้น การ rollback จริงยังผ่าน
176
+ `rollback_changes` และ conflict journal เดิม Evidence revalidation ไม่แก้ record เดิม:
177
+ source เปลี่ยนหรือหายจะ mark record `STALE` Context Engine ใช้ current runtime row เป็น
178
+ `OBSERVATION` และผูก content hash + caller-specific runtime manifest เป็น cache
179
+ dependency ทุก access ตรวจ live OAuth grant/workspace ACL ใหม่
180
+
181
+ ## Advanced Agent Runtime
182
+
183
+ `AgentRuntimeService` ผูกกับ active `BootstrappedWorkspace` และเก็บ durable run ของ
184
+ principal เดียวกัน: immutable plan revisions, bounded hypotheses, intent locks,
185
+ metadata snapshots, target-action receipts, evidence judgements และ reviewed skill
186
+ versions ทุก run มี `authority=coordination_only` และ capability envelope ที่ลด
187
+ project/path/program/network/browser/desktop/media/workflow/quota จาก authority เดิม
188
+
189
+ `agent_read`, `agent_write` และ `agent_exec` เลือกได้เฉพาะ allowlist ที่สร้างจาก
190
+ `CORE_TOOL_CATALOG` แล้วเรียก target ผ่าน `invokeToolDefinition` จึงไม่มี security
191
+ pipeline ชุดที่สอง Path write ต้องผ่าน run writable-path check + covering intent ก่อน
192
+ ผ่าน target WorkspaceFS/secret/hash checks ส่วน exec ใช้ explicit argv หรือ owned
193
+ runtime handles และตรวจ program/feature/job quota ก่อน target approval/sandbox
194
+
195
+ Snapshot เก็บ metadata manifest และ changeset baseline; compare คืน caller-owned
196
+ post-snapshot candidates; rollback ใช้ original `rollback_changes` pipeline Restart
197
+ เปลี่ยน unfinished action เป็น `INTERRUPTED/SERVER_RESTARTED` และ run epoch เก่าเป็น
198
+ `RECOVERY_REQUIRED` โดยไม่ replay หรือ signal stored PID Skill proposal อยู่ใน private
199
+ review queue จน owner อนุมัติ exact digest; approved steps ยังเป็น non-executable
200
+ `untrusted_guidance`
201
+
202
+ ## Universal Resource Layer and CAS
203
+
204
+ `ResourceService` ผูกกับ active `BootstrappedWorkspace` และสร้าง opaque resource
205
+ reference ที่ bind กับ workspace ID และ digest ของ `grantId` + `clientId` ส่วน
206
+ `CasStore` เป็น installation-private immutable object store ที่
207
+ `<configDir>/store/sha256/<prefix>/<hash>` metadata/reference อยู่ใน SQLite แยกจาก
208
+ object bytes จึง deduplicate object เดียวกันได้โดยไม่ทำให้ hash หรือ URI เป็นสิทธิ์
209
+
210
+ การ ingest จาก workspace ผ่าน `WorkspaceFS`, regular-file/link checks, file identity
211
+ ก่อนและหลัง streaming และ expected SHA-256/MIME เมื่อ caller ระบุ จาก media asset
212
+ ต้องผ่าน owner lookup ของ `MediaStorage` อีกชั้น ทุก access ตรวจ live OAuth grant,
213
+ client registration, workspace ACL, principal owner, object size และ full SHA-256
214
+ ก่อนอ่าน range
215
+
216
+ `resource_read`/`resource_read_range` จำกัดหนึ่ง chunk ไม่เกิน 256 KiB และคืน
217
+ resume token ที่ signed/bound กับ workspace, principal, resource/hash และ expiry
218
+ แต่ token ไม่ข้าม authorization `resource_preview` ส่ง image/audio content block
219
+ เฉพาะ output ที่ bounded ส่วน ZIP provider อ่านเฉพาะ central directory โดยไม่
220
+ inflate และ SVG อยู่ใน text path ไม่ถูก render เป็น active content GC ลบ object
221
+ เฉพาะเมื่อไม่มี live reference ภายใต้ SQLite write transaction โดยเว้น grace
222
+ หนึ่งชั่วโมงสำหรับ object ที่เพิ่งสร้าง/verify เพื่อไม่ให้ชนกับขั้นสร้าง reference
223
+ การ publish ใช้ fsynced staging inode + create-if-absent hard link และ SQLite trigger
224
+ บังคับโควตารวม 2 GiB ซ้ำเพื่อรองรับหลาย process
225
+
226
+ ## Evaluation and release evidence
227
+
228
+ `src/evaluation/` แยก report contract ออกจาก deterministic scoring ส่วน
229
+ `tests/evaluation/dodoBench.test.ts` เรียก real HTTP/OAuth fixtures ผ่าน Compact
230
+ gateways Report ผูก revision, dataset, dependency lock, config และ host environment
231
+ โดยไม่สร้าง model-token estimate
232
+
233
+ `scripts/release-gate.mjs` สร้าง immutable tarball แล้วส่ง exact file ให้
234
+ `scripts/release-smoke.mjs` ติดตั้งใน fresh prefix Smoke เปิด runtime จาก package ที่
235
+ ติดตั้งใหม่และตรวจ STDIO Full กับ Streamable HTTP/OAuth Compact สคริปต์ไม่ publish
236
+ และไม่ใช้ owner state จริง
237
+
238
+ ## Tool surfaces
239
+
240
+ - Complete capability catalog 125 individual definitions (Core 104 + Advanced Agent Runtime 17 + Sub-agents 4)
241
+ - Full live catalog ค่าเริ่มต้น 121 definitions; owner เปิด Sub-agent MCP exposure แล้วเป็น 125
242
+ - Compact catalog 19 definitions: overview, discover และ gateways
243
+ - Hybrid catalog 49 definitions: compact core ตามด้วย direct tools
244
+
245
+ `schemas/tools.json` เป็น complete full schema ส่วน compact และ hybrid เป็น schema แยก
246
+ พร้อม metadata ของ optional feature ค่า `exposeSubagentsToMcp=false` จะกรองสี่
247
+ Sub-agent definitions ออกจาก Full และกรองสี่ operation names ออกจาก gateway schemas,
248
+ instructions และ `dodo_discover` ของ Compact/Hybrid โดยจำนวน gateway names ยังคง
249
+ 19/49 การเลือก surface หรือ feature exposure ไม่เปลี่ยน permission
250
+
251
+ ## Personal และ managed access mode
252
+
253
+ Global config ค่าเริ่มต้นเป็น `personal` สำหรับ installation ที่มีเจ้าของคนเดียว การ
254
+ อนุมัติ OAuth หนึ่งครั้งให้ installation identity และ scope ceiling จากนั้นทุก path ที่
255
+ owner เพิ่มลง Project Registry พร้อมใช้ตาม scopes โดยไม่สร้าง client ACL ซ้ำ Effective
256
+ trust เป็น `trusted` และ enabled AI profile ใช้ได้กับ registered projects ทั้งหมด การ
257
+ เลือก remote profile เป็น owner consent ให้ส่ง bounded context ของโปรเจกต์นั้น
258
+
259
+ `managed` คงโมเดลละเอียดเดิม: target authority เป็น intersection ของ token/grant scope,
260
+ workspace client ACL, saved trust, profile/client allowlist และ source-egress choice
261
+ การเปลี่ยน mode ทำได้เฉพาะ authenticated Local Config และมีผลกับ request ใหม่ทันที
262
+
263
+ ทั้งสอง mode ใช้ invocation pipeline เดียวกันและยังตรวจ live grant/revocation,
264
+ workspace ID/epoch, registered target/readiness, path/secret/symlink/hardlink guards,
265
+ expected hash, idempotency และ owner-configured command sandbox Profile ลด scopes ได้
266
+ แต่เพิ่มไม่ได้ Repo config, model output และ remembered data ไม่เปลี่ยน access mode
267
+
268
+ ## State and security
269
+
270
+ SQLite ใช้ durable migrations, WAL ตาม platform และ transaction ที่เหมาะสม Changesets มี immutable plan, journal, backups และ recovery marker
271
+
272
+ Global config อยู่นอก workspace ใน platform config directory และรองรับ `DODO_CONFIG_DIR` เป็น explicit override
273
+
274
+ `dodo setup --import-state` ใช้ state-import pipeline แยกจาก runtime bootstrap โดยอ่านได้เฉพาะ `config.json` ที่เป็น private regular file, validate ด้วย config schema, เลือกเฉพาะ non-authority allowlist, ตรวจ SHA-256 ซ้ำก่อนเขียน และ commit target ด้วย atomic rename การนำเข้าจะไม่เปิด SQLite เดิมหรืออ่าน/copy keys, tokens, ACL, trust, approvals, schedules, executable registrations หรือ runtime state
275
+
276
+ Repo config เป็น hints-only และไม่สามารถ widen permissions, change OAuth, disable guards หรือ grant client access
277
+
278
+ ## Tunnel lifecycle
279
+
280
+ Tunnel config อยู่ใน global owner config และมีเฉพาะ non-secret startup preference,
281
+ legacy mode/reference, canonical executable selection, loopback metrics port และ bounded
282
+ restart count เส้นทางหลักไม่เขียน credential reference; token ถูก resolve จาก owner
283
+ input เฉพาะรอบและส่งผ่าน child environment โดยไม่เข้า argv
284
+
285
+ managed supervisor เป็น foreground process มี state machine `starting → connecting → connected/backoff → stopped/failed`, private bounded/redacted log และ authenticated singleton IPC `status/logs/stop` การ stop อ้างอิง live `ChildProcess` ที่ supervisor ถืออยู่เท่านั้น External mode ไม่ spawn process และ `doctor` ตรวจ local/public health โดยไม่จัดการ Cloudflare account หรือ DNS
286
+
287
+ `TunnelRuntime` ผูก supervisor หนึ่งตัวกับ DODO HTTP process เจ้าของส่ง run-scoped
288
+ token ได้จาก hidden terminal prompt ระหว่าง `dodo start` หรือ owner-authenticated Local
289
+ Config endpoint Token ไม่เข้า trusted config หรือ OS credential provider Runtime ส่งค่า
290
+ ผ่าน `TUNNEL_TOKEN` ให้ child โดยตรง เก็บเพียงสถานะที่ไม่มี secret และปิด child ก่อน
291
+ DODO process จบ การเปลี่ยน workspace ไม่ย้ายหรือเพิ่มสิทธิ์ใด ๆ และ Local Config port
292
+ ยังไม่ถูก mount บน MCP/public listener
293
+
294
+ ## Optional services
295
+
296
+ Optional services ถูกสร้างจาก config และ probe readiness ก่อน expose capability ได้แก่ LSP, desktop, media, browser, game, speech และ workflow ทุก operation ใช้ policy gate เดิม
297
+
298
+ ## Observability
299
+
300
+ startup log แสดง transport, selected surface, tool count และ schema bytes แบบ bounded ไม่ log request args, token หรือ file content
301
+
302
+ ## Installation runtimes และ AI execution
303
+
304
+ `InstallationRuntime` ถือ installation Store แยกจากอายุ default workspace และ lazy-open
305
+ registered target runtimes ภายใต้ lease ก่อน recovery แต่ละ runtime มี refs/jobs/queue
306
+ ของตนเอง การเปิด B ไม่ปิด A; explicit routes ใช้ manager refcount และ default switch
307
+ ยังใช้ WorkspaceHost drain guard การ release ref เป็น idempotent
308
+
309
+ `projectAuthority` แยก identity (expiry/audience/live grant) จาก target scope intersection
310
+ และ legacy binding `invokeToolDefinition` เป็นจุดร่วมของ direct/gateway/model actions
311
+ รวม strict input/output validation, fresh principal หลังรอ queue, context, policy/audit
312
+ MutationQueue ใช้ AsyncLocalStorage เพื่อ nested invocation และ job-held references;
313
+ queued cancellation ถอน waiter ได้ ไม่มี handler/private-owner dispatcher ที่โมเดลเรียกเอง
314
+
315
+ AISettings เก็บ metadata ใน `ai_settings`; key อยู่ session Buffer หรือ macOS Keychain
316
+ Adapter ห้าชนิดมี native request/stream decoder และ continuation แยกตาม protocol
317
+ Network resolve-all/validate/pin, refuse redirects, timeout/response cap และตรวจ live
318
+ run authority ก่อนส่ง request Subagents จำกัด tools จาก catalog เดิมและลด caller scope
319
+ ผ่าน profile พร้อม project restriction Personal mode ใช้ owner-selected profile เป็น
320
+ egress consent ส่วน managed mode เพิ่ม project/provider/client egress checks
321
+
322
+ `ai_runs` เก็บ bounded private continuation/delegation (ไม่มี raw OAuth token), usage,
323
+ idempotency digest และ execution ownership `ai_events` เก็บ visible progress/receipts
324
+ แบบ cursor Jobs ที่ agent เริ่มถูกติดตามจนเสร็จและส่ง observed output กลับโมเดล
325
+ Unknown outcome เป็น review barrier; process restart ไม่ replay และต้อง explicit Resume
326
+ จากผู้เรียกเดิม Config/profile digest เปลี่ยนระหว่าง run จะหยุดและให้สร้าง task ใหม่
327
+
328
+ Owner UI อยู่ `configUi/workbench.js/.css` ใช้ authenticated same-origin fetch และ
329
+ `aiAdmin.ts` บน private listener เท่านั้น CLI/advanced web controls ใช้ IPC dispatcher,
330
+ setup/config validation ชุดเดิม ไม่มี secret fallback หรือการเปิด permission อัตโนมัติ
331
+ รายละเอียด [ADR-045](adr/045-ai-providers-multiproject.md)