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,283 @@
1
+ # DODO MCP — Manual Acceptance
2
+
3
+ ผล manual ต้องบันทึกเป็น `MANUAL_PASS` หรือ `MANUAL_NOT_RUN` พร้อมวันเวลาและ environment ห้ามเดาผลจาก automated test
4
+
5
+ สถานะล่าสุดของ owner-state setup/import gate: `MANUAL_NOT_RUN` (2026-09-14) ชุด automated ใช้ fixture แยกและไม่แตะ config/OAuth/tunnel ของผู้ใช้
6
+
7
+ สถานะ Cloudflare Tunnel จริง: `MANUAL_NOT_RUN` (2026-09-14) automated tests ใช้ fake executable และ loopback readiness fixture เท่านั้น ไม่มี Tunnel token, Cloudflare connection, DNS หรือ firewall ใดถูกใช้
8
+
9
+ ## Cloudflare Tunnel
10
+
11
+ 1. สร้าง remotely-managed Tunnel และ public hostname ใน Cloudflare ด้วยบัญชีเจ้าของ
12
+ 2. route ทุก path ของ hostname ไป `http://127.0.0.1:21730` และยืนยันว่าไม่มี route ไป `21731`/`21732`
13
+ 3. รัน `dodo setup --check --components cloudflared`
14
+ 4. รัน `dodo start` แล้วกรอก token ที่ hidden prompt; ตรวจว่า config/Keychain ไม่มี token
15
+ 5. หยุดแล้วเริ่มใหม่ กด Enter ที่ prompt และยืนยันว่าเปิดเฉพาะ local MCP
16
+ 6. เปิด Local Config กรอก token ใน Temporary Tunnel token แล้วกดเปิด; ตรวจช่องถูกล้างและ response/state ไม่มี token
17
+ 7. ตรวจ `dodo tunnel status` ว่า `credentialSource=temporary` และ connected หลัง `/ready` ตอบจริง
18
+ 8. ตรวจ `dodo tunnel doctor` แยก local/public health และไม่กล่าวว่า AI client connected
19
+ 9. ตรวจ process list ว่า argv ไม่มี token และ `dodo tunnel logs` ไม่มี token
20
+ 10. ทดสอบ OAuth + MCP ผ่าน public origin แล้ว stop จาก Local Config; ยืนยัน child หยุดแต่ local MCP ยังอยู่
21
+ 11. เริ่ม tunnel ใหม่แล้วหยุด DODO; ยืนยัน child หยุดตาม
22
+ 12. บันทึก macOS และ Linux Docker แยก environment; Windows คง `MANUAL_NOT_RUN` จนถึง phase สุดท้าย
23
+
24
+ ## Setup foundation
25
+
26
+ 1. ใช้ config directory ชั่วคราวและรัน `dodo setup --check` กับ `dodo setup --plan`
27
+ 2. ตรวจว่าไม่มี config, tools, receipt หรือ project file ถูกสร้าง
28
+ 3. เลือก dependency ที่ยังขาดแล้วรันโดยไม่มี `--yes`
29
+ 4. ตรวจว่า installer ไม่เริ่มและไม่มี state ถูกเขียน
30
+ 5. รันใหม่ด้วย `--yes` เฉพาะใน fixture ที่อนุญาต แล้วตรวจ receipt schema/version และ readiness probe
31
+
32
+ ## Existing-state import
33
+
34
+ 1. สร้าง fixture source ที่มี config preferences, OAuth/key fixture และ state DB fixture
35
+ 2. รัน plan และตรวจว่ารายการ import มีเฉพาะ safe config fields
36
+ 3. รัน `--import-state` และตรวจว่า source ยังอยู่ครบ
37
+ 4. ตรวจ target ไม่มี DB, keys, tokens, ACL, trust, approvals หรือ permission-bearing config
38
+ 5. เปลี่ยน source หลัง plan แล้วตรวจว่า import ถูกปฏิเสธและ target ไม่ถูกสร้าง
39
+ 6. ทดสอบ malformed/unknown config, symlink และ active IPC marker ให้ fail closed
40
+
41
+ ## Local Config
42
+
43
+ 0. UI ใหม่ (2026-09-14): ตรวจบนเครื่องจริงว่า (ก) nav 8 หน้าใช้ได้ทั้ง desktop และมือถือ
44
+ (ข) tooltip `?` เปิดด้วยการแตะบนอุปกรณ์ touch จริงและ screen reader อ่านได้
45
+ (ค) กล่องยืนยัน SweetAlert แสดงก่อนการลบ/ยกเลิก/เปลี่ยนโหมดทุกครั้ง
46
+ (ง) ผลทดสอบ Provider แสดงชื่อ connection, โมเดล, ชนิดการทดสอบ และเวลา
47
+ — สถานะปัจจุบัน: ผ่านใน Chromium fixture (ดู TEST_REPORT); อุปกรณ์ touch จริงและ
48
+ screen reader จริงยัง **MANUAL_NOT_RUN**
49
+ 1. จาก directory ที่ไม่ใช่โปรเจกต์และ config ใหม่ รัน `dodo` แล้วตรวจว่า anonymous MCP ได้ 401,
50
+ OAuth login และ authenticated `tools/list` ใช้ได้ แต่ `project_overview` ได้
51
+ `WORKSPACE_ACCESS_REQUIRED` และไม่เผย private inert root
52
+ 2. เปิด Local Config URL จาก terminal
53
+ 3. ตรวจว่าไม่มี root จาก CWD ปรากฏ และ Project Registry ยังเพิ่ม/เลือก path ได้
54
+ 4. เพิ่ม fixture A โดยเลือก “เปิดโปรเจกต์นี้ทันที” แล้วตรวจ root, MCP/OAuth และ config listener
55
+ 5. ปิดแล้วเปิด `dodo` จาก directory อื่น ตรวจว่า A ถูกเลือกจาก registry preference
56
+ 6. เปลี่ยนไปยัง fixture project B
57
+ 7. ตรวจว่า overview จาก MCP เห็น B จริง
58
+ 8. ตรวจ workspace ID/epoch เปลี่ยน และหน้าเว็บแจ้งให้โหลด context ใหม่
59
+ 9. กลับไป A แล้วตรวจว่า ACL/trust ไม่ปะปน
60
+
61
+ ## Interactive CLI
62
+
63
+ 1. รัน `dodo --cli` จาก Home/Desktop และตรวจว่าแสดง project ที่เลือกล่าสุด
64
+ 2. เลือก project เดิมและเพิ่ม fixture ใหม่ด้วย absolute path
65
+ 3. ตรวจว่า server ใช้ root ที่เลือก ไม่ใช่ CWD
66
+ 4. เลือก setup check และตรวจว่ารายการมี cloudflared
67
+ 5. เลือกเปิด Tunnel แบบ temporary แล้วตรวจ process list/config/log/audit ว่าไม่มี token
68
+ ไม่มี token จากนั้นลบ credential ผ่าน Local Config
69
+
70
+ สถานะ owner-browser/terminal สำหรับ launcher และเมนูใหม่: `MANUAL_NOT_RUN`
71
+
72
+ ## Workspace safety
73
+
74
+ 1. เริ่ม job ที่ยังทำงานอยู่
75
+ 2. ลองเปลี่ยน workspace
76
+ 3. ต้องถูกปฏิเสธพร้อมบอกให้รอหรือ cancel job
77
+ 4. ทำให้ target bootstrap ล้มเหลว
78
+ 5. ตรวจว่า workspace เดิมยังเรียก tool ได้
79
+
80
+ ## Project Registry
81
+
82
+ 1. ใช้ `dodo project add /absolute/path --name "Fixture A"` และตรวจว่า `list/info` แสดง canonical path, project ID และ `ready`
83
+ 2. เพิ่ม path เดิมซ้ำและตรวจว่า project ID ไม่เปลี่ยน
84
+ 3. เปิด Local Config แล้วตรวจว่ารายการแสดง active/readiness โดยไม่มี client secret หรือ token
85
+ 4. เพิ่ม Fixture B จากหน้าเว็บ แล้วกดเปิดโปรเจกต์ ตรวจว่า MCP ใช้ B จริงและ AI ต้องเรียก `project_overview` ใหม่
86
+ 5. ตรวจว่า trust/client ACL ของ A ไม่ปรากฏใน B
87
+ 6. rename directory fixture แล้วเพิ่ม path ใหม่ ตรวจว่า project ID คงเดิมแต่ workspace ID เปลี่ยน
88
+ 7. แทน path ด้วย directory identity อื่นและตรวจว่า DODO ปฏิเสธการ takeover
89
+ 8. นำรายการออกหลังยืนยัน ตรวจว่าไฟล์ ประวัติ trust และ ACL ยังอยู่
90
+ 9. เปิด Local Config โดยไม่มี private fragment, จาก origin อื่น และผ่าน proxy headers; ทุกกรณีต้องถูกปฏิเสธ
91
+
92
+ สถานะการตรวจ Project Registry บน browser/owner environment จริง: `MANUAL_NOT_RUN`
93
+
94
+ ## Multi-project federation
95
+
96
+ 1. สร้าง fixture A/B และลงทะเบียนทั้งคู่ด้วย owner CLI/Local Config
97
+ 2. ให้ client 1 มี `dodo:read` ใน A/B และ client 2 มีเฉพาะ A
98
+ 3. จาก active A เรียก `project_overview` แล้วตรวจว่าแต่ละ client เห็นเฉพาะรายการที่มี ACL
99
+ 4. ให้ client 1 เรียก `project_overview({projectId: B})`, `read_files` ของ A/B พร้อมกัน และ `search_code({projectIds:[A,B]})`
100
+ 5. ตรวจผลทุก project มี project/workspace identity, federation epoch และ source hash โดย active root/epoch ไม่เปลี่ยน
101
+ 6. ให้ client 2 query B ต้องได้ `FORBIDDEN` และ response ต้องไม่มี path/name/content ของ B
102
+ 7. อ่าน `.env`, traversal, symlink/hardlink และ replaced root ใน B ต้อง fail closed
103
+ 8. ทำ B unavailable แล้วค้น A/B ต้องได้ผล A พร้อม partial failure ของ B
104
+ 9. ส่ง stale active epoch ต้องถูกปฏิเสธก่อนอ่าน target
105
+ 10. ใส่ `projectId` ใน write/exec args ต้องถูก schema ปฏิเสธ และไฟล์/job ต้องไม่เกิด
106
+
107
+ สถานะการตรวจ multi-project federation ผ่าน external AI/owner environment จริง: `MANUAL_NOT_RUN`
108
+
109
+ ## Universal Resource Layer
110
+
111
+ สถานะ: **MANUAL_NOT_RUN** สำหรับ external AI/web client จริง
112
+
113
+ 1. `resource_inspect` ไฟล์ text/image/audio อย่างละหนึ่งไฟล์ใน fixture
114
+ 2. อ่าน text กลับด้วย `resource_read` และอ่านไฟล์ใหญ่ต่อด้วย resume token
115
+ 3. ยืนยัน `resource_preview` แสดง MCP image/audio block จริง
116
+ 4. ใช้ `dodo_discover(operation="resource_read_range")` แล้วเรียกผ่าน `dodo_media`
117
+ 5. ทดลอง `.env`, path traversal และ resource ID จาก client อื่น ต้องถูกปฏิเสธ
118
+ 6. revoke workspace access แล้ว resource เดิมต้องอ่านไม่ได้
119
+ 7. restart fixture server แล้ว reference เดิมยังอ่านได้ด้วย epoch ใหม่
120
+
121
+ ห้ามใช้ไฟล์จริงที่เป็นความลับและห้ามเปลี่ยน MANUAL_PASS จาก automated test เท่านั้น
122
+
123
+ ## Project Brain
124
+
125
+ สถานะ: **MANUAL_NOT_RUN** สำหรับ external AI และ owner project จริง
126
+
127
+ 1. เปิด fixture TypeScript project แล้วรอ `brain_status` เป็น `completed`
128
+ 2. ค้น symbol/import/route/test/dependency ด้วย `brain_query`
129
+ 3. แก้หนึ่งไฟล์และยืนยัน metrics ว่า `parsedFiles` ไม่เท่ากับทั้ง project
130
+ 4. ย้ายไฟล์แบบ exact-content และตรวจว่า `symbol://` URI เดิม resolve ไป path ใหม่
131
+ 5. แก้ source หลัง index แล้วตรวจว่า query default ตัด stale result และ
132
+ `includeStale:true` ระบุ freshness ตามจริง
133
+ 6. ลอง `.env`, traversal, symlink/hardlink, token read-only, revoked ACL และ stale epoch
134
+ 7. pause/cancel/rebuild ใน inspect mode และยืนยัน approval ผูก target operation
135
+ 8. restart ระหว่าง run แล้วตรวจ interrupted recovery และ committed graph เดิม
136
+
137
+ automated fixtures ผ่านรายการหลักแล้ว แต่ยังไม่ได้วัด performance ระยะยาวกับ repository
138
+ ของผู้ใช้หรือ workflow ผ่าน external AI จึงยังเป็น `MANUAL_NOT_RUN`
139
+
140
+ ## Context Engine และ Evidence
141
+
142
+ สถานะ: **MANUAL_NOT_RUN** สำหรับ external AI และ owner repository จริง
143
+
144
+ 1. เรียก `context_query` ด้วย goal เดียวกันสองครั้งและตรวจ ranking/evidence ID คงเดิม พร้อม cache hit ครั้งที่สอง
145
+ 2. ใช้ budget เล็กและ cursor อ่านหน้าถัดไปโดยไม่มี evidence ซ้ำหรือข้าม
146
+ 3. ตรวจทุกผลมี project/source hash, confidence, generated/verified time, freshness และ `untrusted_content`
147
+ 4. แก้ source หลัง query แล้วตรวจว่า evidence เดิมเป็น stale และ query ใหม่ใช้ hash ใหม่
148
+ 5. ลงทะเบียน fixture A/B ให้ client อ่านได้ทั้งคู่ แล้ว query ด้วย project name/ID โดย active workspace ไม่เปลี่ยน
149
+ 6. ถอน ACL ของ B แล้วตรวจ query และ evidence เดิมถูกปฏิเสธโดยไม่เผย absolute path
150
+ 7. ค้น marker ใน `.env`, private state, symlink/hardlink และตรวจว่าไม่ปรากฏในผล/cache diagnostics
151
+ 8. ตรวจ `context_status` มี L0–L6 metrics แต่ไม่มี goal, path, source content หรือ credential
152
+ 9. ตรวจ owner-reviewed CURRENT memory แสดงเป็น `MEMORY`; runtime และ federated graph
153
+ ที่ยังไม่มี provider แสดง unavailable/partial ตามจริง
154
+
155
+ Automated HTTP/OAuth fixtures ผ่าน contract หลักแล้ว แต่ยังไม่เปลี่ยนสถานะ manual
156
+ จนกว่าจะทดสอบกับ external AI และ repository ที่เจ้าของเลือกจริง
157
+
158
+ ## Memory และ reviewed learning
159
+
160
+ สถานะ: **MANUAL_NOT_RUN** สำหรับ external AI และ owner repository จริง
161
+
162
+ 1. ให้ AI เรียก `context_query` แล้วเสนอ `memory_propose` จาก current evidence ID
163
+ 2. ตรวจว่า `memory_search` ยังไม่คืน proposal ก่อน owner approval
164
+ 3. ใช้ `dodo memory show` ตรวจ claim, provenance, conflicts และ digest แล้ว approve
165
+ 4. เริ่ม conversation ใหม่และตรวจว่า `memory_search`/`context_query` พบ memory ที่
166
+ owner reviewed พร้อม `evidence_only` และ `untrusted_content`
167
+ 5. แก้ source แล้วตรวจว่า memory เป็น STALE และไม่ปรากฏใน current-only search
168
+ 6. ให้ client อื่นลองใช้ evidence ID เดิมและ memory ของ project ที่ไม่มี ACL ต้องถูกปฏิเสธ
169
+ 7. เสนอ learning จาก successful memory สองรายการ ตรวจ owner review และยืนยันว่าไม่มี
170
+ skill/workflow ถูกติดตั้งหรือ execute
171
+ 8. prune stale fixture แล้วตรวจว่า CURRENT memory และ project files ยังอยู่
172
+
173
+ Automated fixtures ผ่าน contract หลักแล้ว แต่ยังไม่เปลี่ยนสถานะ manual จนกว่าจะใช้
174
+ external AI และ owner-selected fixture จริง
175
+
176
+ ## Runtime Intelligence
177
+
178
+ สถานะ: **MANUAL_NOT_RUN** สำหรับ external AI และ owner repository จริง
179
+
180
+ 1. เปิด runtime session แล้วเริ่ม test task แบบ `program + args` ผ่าน Compact gateway
181
+ 2. ตัด/reconnect MCP ระหว่างงาน ตรวจ session/task เดิมและไม่เกิด process ซ้ำเมื่อ retry key เดิม
182
+ 3. observe task แล้วตรวจ evidence มี status/count/hash แต่ไม่มี raw stdout/stderr หรือ secret fixture
183
+ 4. ทดสอบ cancel และ wall timeout จาก task แยกกัน
184
+ 5. สร้าง snapshot แก้ fixture ภายนอก แล้ว revalidate ต้องได้ `STALE`
185
+ 6. เปิด owned workspace browser session, collect evidence และตรวจ MCP image จริง
186
+ 7. ตรวจฐานข้อมูล runtime ไม่มี DOM, console, cookie, authorization header หรือ input value
187
+ 8. ถอน workspace ACL ระหว่าง session แล้ว handle เดิมต้องใช้ไม่ได้
188
+ 9. ใช้ `context_query` ค้น current runtime evidence และตรวจ source เป็น `dodo-runtime://...`
189
+ 10. ปิด session ขณะ task running ต้องถูกปฏิเสธ; cancel/wait แล้วจึงปิดได้
190
+
191
+ Automated HTTP/OAuth/Chromium fixtures ผ่าน contract หลักแล้ว แต่ไม่ถือเป็น manual
192
+ external-client acceptance
193
+
194
+ ## Advanced Agent Runtime
195
+
196
+ สถานะ: **MANUAL_NOT_RUN** สำหรับ external AI และ owner repository จริง
197
+
198
+ 1. เปิด run พร้อม completion criteria, writable paths, explicit programs และ quota ที่แคบ
199
+ 2. สร้าง plan revision และ hypotheses สองตัว; ให้ path intents overlap แล้วต้องปฏิเสธตัวที่สอง
200
+ 3. snapshot → managed write/edit → verify → compare → rollback exact changeset
201
+ 4. ตัด/restart server ระหว่าง action แล้วตรวจ `RECOVERY_REQUIRED`; อ่าน status ก่อน recover
202
+ 5. ใช้ current Runtime evidence judge hypotheses และ complete เฉพาะเมื่อ criteria ครบ
203
+ 6. ถอน workspace ACL ระหว่าง run แล้ว handle เดิมต้องถูกปฏิเสธทันที
204
+ 7. เสนอ skill ที่มี hostile instruction ตรวจว่าหายจาก search จน owner review exact digest
205
+ 8. approve safe skill แล้วตรวจ progressive search/inspect และยืนยันว่าไม่มี code ถูกติดตั้ง/รัน
206
+ 9. เริ่ม long job แล้ว pause/cancel coordinator; job ต้องยังอยู่จน owner/caller หยุดโดย explicit handle
207
+ 10. ตรวจ audit แยก coordinator operation, target operation และ private owner review
208
+
209
+ Automated HTTP/OAuth/restart/security fixtures ผ่าน contract หลักแล้ว แต่ไม่ถือเป็น
210
+ manual external-client acceptance
211
+
212
+ ## HTTP Compact
213
+
214
+ 1. เชื่อม MCP ด้วย OAuth
215
+ 2. ตรวจ `listTools` มี 19 tools และมี `project_overview`, `dodo_discover`, gateways
216
+ 3. เรียก overview
217
+ 4. discover `write_file`
218
+ 5. สร้างไฟล์ fixture ผ่าน `dodo_write`
219
+ 6. อ่านกลับผ่าน `dodo_read`
220
+ 7. แก้ด้วย expected hash
221
+ 8. ทำ external change แล้วตรวจ conflict
222
+ 9. ลบ fixture
223
+
224
+ ## STDIO Full
225
+
226
+ 1. รัน `dodo stdio --root /absolute/fixture`
227
+ 2. ตรวจ full catalog ค่าเริ่มต้น 121 tools และไม่มี `subagent_*`
228
+ 3. ทดสอบ project overview, read, write และ edit
229
+
230
+ ## Sub-agent MCP exposure
231
+
232
+ Automated catalog/API/Chromium/fresh-package fixtures: **AUTOMATED_PASS**
233
+
234
+ 1. เปิด Local Config → Settings และตรวจว่าสวิตช์ “เปิดให้ MCP clients เห็น Sub-agent tools” ปิดเป็นค่าเริ่มต้น
235
+ 2. ตรวจ Full live catalog มี 121 tools; Compact/Hybrid มี 19/49 ชื่อและ discover หา `subagent_spawn` ไม่พบ
236
+ 3. ตรวจ Chat & Tasks ยังสร้างและดูงานได้จากหน้าเว็บ
237
+ 4. เปิดสวิตช์ ยืนยันผ่าน dialog แล้วตรวจข้อความว่าต้อง restart/rescan
238
+ 5. restart fixture เท่านั้น แล้วตรวจ Full มี 125 และ Compact discover/gateway มี `subagent_spawn/status/result/control`
239
+ 6. ปิดสวิตช์อีกครั้ง restart และตรวจว่า run history ยังอยู่ แต่ MCP definitions ถูกซ่อน
240
+
241
+ การ restart server จริงและ rescan ผ่าน ChatGPT/remote client จริง: **MANUAL_NOT_RUN**
242
+
243
+ ## Security
244
+
245
+ - anonymous HTTP ต้อง 401
246
+ - read-only token ต้องถูกปฏิเสธเมื่อเรียก write/exec
247
+ - managed mode: client ที่ไม่มี ACL ต้องถูกปฏิเสธ; personal mode: unregistered target ต้องถูกปฏิเสธ
248
+ - inspect mode ต้องมี owner approval
249
+ - secret paths และ traversal ต้องถูกปฏิเสธ
250
+ - ห้ามแสดง client secret, access token หรือ private config token
251
+
252
+ ## External clients
253
+
254
+ เพิ่ม MCP connection ใน client ที่ต้องการ ใช้ OAuth, scan tools และบันทึกจำนวน tools ที่ client แสดงจริง หาก catalog ถูก cache ให้ recreate connection ตาม client instructions
255
+
256
+ ## DodoBench และ release gate
257
+
258
+ Automated fixtures: รัน `npm run bench`, `npm run release:gate` บน macOS และ
259
+ `npm run test:linux:docker` สำหรับ Linux แล้วตรวจ `gate-report.json` ใต้ ignored
260
+ `release-evidence/` Self-hosted GitHub Actions รัน Linux Docker และ Windows native
261
+ candidate บน trusted main/manual เท่านั้น Manual external AI, owner repository และ
262
+ Windows 11 ต้องรายงานแยกตาม environment จริง ห้ามเปลี่ยน `MANUAL_NOT_RUN` จากผล
263
+ automated บน macOS, Linux Docker หรือ Windows runner
264
+
265
+ ## AI Providers / Multi-project owner acceptance
266
+
267
+ ใช้ fixture A/B แยกจาก source ของเจ้าของ ไม่ทดสอบ paid inference โดยไม่มีเจ้าของตั้ง
268
+ credentials ผ่าน private UI ผลต้องแยกตาม provider/model/platform ไม่รวมเป็น PASS เดียว
269
+
270
+ - เพิ่ม provider/model/profile ผ่านเว็บ เลือก session/Keychain และ grant project/client/egress
271
+ - ทดสอบ synthetic inference และ tool calling ด้วยปุ่มแยก เก็บเวลา/model/ผล ไม่มี key
272
+ - MCP caller A spawn บน A พร้อม web owner run บน B; read-back/diff/test receipts ต้องตรง
273
+ - Read-only เขียนหรือ spawn ไม่ได้; managed mode ที่ไม่มี target ACL ถูกปฏิเสธ และ inspect ขอ approval เฉพาะ operation
274
+ - แก้ไฟล์ภายนอกระหว่าง read/edit ต้อง conflict ไม่ overwrite
275
+ - Pause/cancel, ปิด browser/reconnect, expiry/revoke, restart/Resume ไม่ replay side effects
276
+ - Unknown inference/action outcome ต้องรอ review ไม่ส่งซ้ำเงียบ ๆ
277
+ - ตรวจ Keychain dialog และ local Ollama metadata รวมกรณี cloud model บน loopback
278
+ - ตรวจภาพจาก explicit resource paths และตอบกลับ text/tool results ไม่มี raw reasoning/key
279
+ - ตรวจ desktop/390px/theme/keyboard, history search/delete/retention และ advanced owner controls
280
+
281
+ Live OpenAI, Gemini, Claude, MiniMax, GLM, Kimi, Ollama: MANUAL_NOT_RUN สำหรับงานนี้
282
+ จนกว่าจะมีหลักฐานจาก account/model จริง Browser automation และ synthetic Keychain
283
+ round-trip เป็น AUTOMATED_PASS ไม่ใช้แทน MANUAL_PASS ของ provider
package/docs/MEMORY.md ADDED
@@ -0,0 +1,128 @@
1
+ # DODO Memory and Reviewed Learning
2
+
3
+ DODO Memory เก็บประสบการณ์และการตัดสินใจที่ตรวจย้อนกลับได้ เพื่อให้ AI ใช้
4
+ บริบทเดิมต่อใน conversation ใหม่โดยไม่ยก memory ให้เป็น source of truth, permission
5
+ หรือ policy
6
+
7
+ ## หลักการ
8
+
9
+ - AI อ่านได้เฉพาะ memory ที่เจ้าของอนุมัติและมองเห็นใน workspace ที่ client มี
10
+ `dodo:read` ACL อยู่ในขณะเรียก
11
+ - AI สร้างได้เพียง proposal จาก `context_evidence` ที่ยัง current และเป็นของ
12
+ principal เดียวกัน
13
+ - การบันทึกถาวรต้องผ่าน private owner IPC ด้วย proposal ID และ digest ที่ตรงกัน
14
+ - source hash, retention และ project readiness ถูกตรวจซ้ำเมื่อค้น ตรวจ หรือใช้เป็น
15
+ Context Engine evidence
16
+ - memory ทุกชิ้นมี `authority: evidence_only` และ `trust: untrusted_content`
17
+ - learning proposal ไม่ติดตั้ง ไม่ execute และไม่เปลี่ยน permission แม้เจ้าของกด
18
+ approve การ approve บันทึกผล review เท่านั้น
19
+
20
+ ประเภทที่รองรับ:
21
+
22
+ ```text
23
+ fact · decision · failure · successful-fix · workaround · convention · preference
24
+ ```
25
+
26
+ ## สร้างและอนุมัติ memory
27
+
28
+ Full surface:
29
+
30
+ ```text
31
+ context_query(goal="Find the session boundary", terms=["SessionStore"])
32
+ memory_propose(
33
+ kind="decision",
34
+ claim="Keep session state scoped to one workspace.",
35
+ rationale="Current source evidence defines this boundary.",
36
+ affectedEntities=["SessionStore"],
37
+ evidenceIds=["evidence_..."]
38
+ )
39
+ ```
40
+
41
+ Compact/Hybrid ใช้ `dodo_assist_read → context_query` และ
42
+ `dodo_assist_change → memory_propose` ตาม schema จาก `dodo_discover`
43
+
44
+ Proposal ยังไม่เป็น memory จนกว่าเจ้าของจะตรวจผ่าน terminal:
45
+
46
+ ```bash
47
+ dodo memory pending
48
+ dodo memory show memprop_xxxxxxxxxxxx
49
+ dodo memory approve memprop_xxxxxxxxxxxx --digest sha256:...
50
+ ```
51
+
52
+ หากต้องการให้ project ที่ลงทะเบียนไว้อ่าน memory เดียวกัน เจ้าของต้องระบุ project ID
53
+ อย่างชัดเจน:
54
+
55
+ ```bash
56
+ dodo memory approve memprop_xxxxxxxxxxxx \
57
+ --digest sha256:... \
58
+ --share-with prj_2bcdefghjkmn
59
+ ```
60
+
61
+ การแชร์ส่งต่อ claim และ provenance ของ memory ไปยัง project เป้าหมาย แต่ไม่ให้ ACL
62
+ แก่ client เจ้าของยังต้องให้ `dodo:read` ใน project นั้นแยกต่างหาก
63
+
64
+ ## อ่าน ตรวจ และหมดอายุ
65
+
66
+ ```text
67
+ memory_search(query="session workspace")
68
+ memory_inspect(memoryId="memory_...")
69
+ memory_status()
70
+ ```
71
+
72
+ ผลค้นหาจำกัดจำนวนและ byte budget ใช้ signed cursor ที่ผูก query, active workspace
73
+ และ principal หาก scan ถูกตัดด้วยเพดานภายในจะได้ `partial: true`
74
+
75
+ เมื่อ source hash เปลี่ยน, source ใช้งานไม่ได้ หรือ retention หมด ระบบเปลี่ยนสถานะ
76
+ เป็น `STALE` และไม่คืนรายการนั้นโดย default เจ้าของดูรายการ stale, ตรวจซ้ำ หรือล้าง
77
+ เฉพาะข้อมูลเก่าได้:
78
+
79
+ ```bash
80
+ dodo memory list --include-stale
81
+ dodo memory reverify memory_xxxxxxxxxxxx --digest sha256:...
82
+ dodo memory prune --older-than 30 --yes
83
+ ```
84
+
85
+ `prune` ลบได้เฉพาะ proposal ที่ rejected/expired/stale และ memory ที่สร้างจาก active
86
+ workspace ซึ่ง stale เกินอายุที่กำหนด ไม่ลบ CURRENT memory, ไม่ลบ memory ต้นทางของ
87
+ project อื่นที่แชร์มาให้อ่าน และไม่แตะไฟล์ project
88
+
89
+ ## Reviewed workflow/skill learning
90
+
91
+ AI เสนอ workflow หรือ skill ได้เมื่อมี memory แบบ `successful-fix`, `workaround`
92
+ หรือ `convention` ที่ current อย่างน้อยสองรายการ:
93
+
94
+ ```text
95
+ memory_learning_propose(
96
+ kind="workflow",
97
+ title="Verify repeated repair",
98
+ summary="Check both prerequisites before proposing the repair.",
99
+ steps=["Read current sources", "Run the relevant verification"],
100
+ memoryIds=["memory_...", "memory_..."]
101
+ )
102
+ ```
103
+
104
+ เจ้าของตรวจและบันทึกผล review ผ่าน:
105
+
106
+ ```bash
107
+ dodo memory learning pending
108
+ dodo memory learning show learning_xxxxxxxxxxxx
109
+ dodo memory learning approve learning_xxxxxxxxxxxx --digest sha256:...
110
+ ```
111
+
112
+ DODO จะไม่ติดตั้งหรือเรียก workflow/skill จากขั้นตอนนี้ การนำ proposal ไปสร้าง
113
+ automation หรือ executable skill ต้องเป็นงานแยกที่เจ้าของสั่งภายหลัง
114
+
115
+ ## Security boundaries
116
+
117
+ - ไม่มี MCP operation สำหรับ approve/reject/prune หรือ learning review
118
+ - proposal text ที่ดูเหมือน credential ถูกปฏิเสธ และไม่มี raw source content ถูกเก็บ
119
+ เป็น claim อัตโนมัติ
120
+ - evidence ID ใช้ข้าม client/principal ไม่ได้ และ source เปลี่ยนก่อน approval จะทำให้
121
+ proposal เป็น `STALE`
122
+ - duplicate และ conflict ถูกตรวจซ้ำตอน approval; conflict ต้องใช้
123
+ `--allow-conflict` โดยเจ้าของอย่างชัดเจน
124
+ - memory ID, digest, cursor, project registration และ learning proposal ไม่ใช่
125
+ capability และไม่ข้าม OAuth, live grant, ACL, workspace ID/epoch, trust, approval,
126
+ sandbox หรือ path/secret guards
127
+ - README, repository instruction, web/tool output และ memory เองเป็น untrusted data
128
+ เสมอ จึงไม่สามารถสร้าง permanent instruction โดยไม่มี owner review
@@ -0,0 +1,32 @@
1
+ # DODO Multimodal
2
+
3
+ DODO รองรับภาพ เสียง วิดีโอ เบราว์เซอร์ เกม และ speech เมื่อ dependency, model และ owner permission พร้อม ระบบไม่ดาวน์โหลด model หรือเปิด device permission เองตอนติดตั้ง
4
+
5
+ ## Capabilities
6
+
7
+ - image view และ screen observation
8
+ - media open, extract, subtitles, search, read, jobs และ close
9
+ - speech synthesis และ transcription ผ่าน engine ที่ owner ติดตั้ง
10
+ - isolated browser session, observe และ action
11
+ - game session และ step
12
+
13
+ Compact surface ใช้ `dodo_media`, `dodo_browser` และ `dodo_game` ส่วน Full surface มี tool รายตัวครบ
14
+
15
+ ## Permission and files
16
+
17
+ media path ต้องผ่าน workspace/path policy, secret guards และ regular-file checks model ต้องเป็นไฟล์ปกติที่ตรวจขนาดและ link safety แล้ว owner ต้องเลือก model path เอง
18
+
19
+ browser ทำงานใน session ที่ DODO สร้างและจำกัดตาม operation policy action ใช้ observation freshness และ idempotency ไม่ retry side effect ที่ผลลัพธ์ไม่แน่นอน
20
+
21
+ ## Content blocks
22
+
23
+ gateway ต้องส่ง MCP image/audio content blocks จาก target ต่อไปโดยไม่แปลงเป็น JSON text อย่างเดียว structured output และ `isError` ต้องคง semantics เดิม
24
+
25
+ ## Setup
26
+
27
+ ```bash
28
+ dodo setup --check
29
+ dodo-media-setup --check
30
+ ```
31
+
32
+ เมื่อ capability ไม่พร้อม ให้ใช้ผล `NOT_SUPPORTED` และติดตั้ง dependency/model ด้วย owner action ที่ตรวจสอบแหล่งที่มาเอง
@@ -0,0 +1,146 @@
1
+ # DODO Project Registry
2
+
3
+ Project Registry เป็นทะเบียนโปรเจกต์ระดับ installation สำหรับเจ้าของเครื่อง ใช้
4
+ project ID แบบ opaque และคงที่เพื่ออ้างอิงโปรเจกต์โดยไม่ใช้ path เป็น identity
5
+ เพียงอย่างเดียว Registry ไม่ใช่ MCP tool และไม่ให้สิทธิ์แก่ AI
6
+
7
+ ## คำสั่ง
8
+
9
+ ```bash
10
+ dodo project add /absolute/path/to/project
11
+ dodo project add /absolute/path/to/project --name "Web application"
12
+ dodo project list
13
+ dodo project info prj_xxxxxxxxxxxx
14
+ dodo project remove prj_xxxxxxxxxxxx --yes
15
+ ```
16
+
17
+ ทุกคำสั่งรองรับข้อมูล local owner เท่านั้น `list`, `info` และ `add` รองรับ
18
+ `--json`; `remove` ต้องมี `--yes` หลังตรวจ project ID และ path แล้ว
19
+
20
+ ## Identity
21
+
22
+ - `projectId` เป็น opaque random ID และไม่เผย path
23
+ - `workspaceId` ยังคงสร้างจาก installation identity + canonical root ตาม contract
24
+ เดิม และเป็น authority key สำหรับ trust/client ACL
25
+ - Registry เก็บ canonical realpath, directory identity แบบ
26
+ `device + inode + birthtimeNs`, display name, metadata version และเวลา
27
+ created/updated การผูก birth time ป้องกัน Linux นำเลข inode เดิมกลับมาใช้กับ
28
+ directory ที่สร้างใหม่แล้วถูกเข้าใจผิดว่าเป็นโปรเจกต์เดิม
29
+ - หาก directory ถูก rename ภายใน filesystem เดิม แล้วเจ้าของเรียก `project add`
30
+ ที่ path ใหม่ DODO จะรักษา projectId เมื่อพิสูจน์ directory generation เดิมได้
31
+ ครบ แต่จะใช้ workspaceId ของ path ใหม่ จึงไม่คัดลอก trust หรือ client ACL ตามไป
32
+
33
+ Project Registry ปฏิเสธ filesystem ที่ไม่เปิดเผย birth time ที่เสถียร โดยไม่เดา
34
+ identity จาก path หรือ inode เพียงอย่างเดียว Active workspace ปกติยังใช้ root policy
35
+ เดิม; ข้อกำหนดนี้ใช้กับการเพิ่มโปรเจกต์ลง durable registry
36
+
37
+ ## Readiness
38
+
39
+ รายการแต่ละตัวรายงานสถานะตาม filesystem ปัจจุบัน:
40
+
41
+ - `ready`: canonical path และ directory identity ตรงกับที่บันทึก
42
+ - `missing`: path เดิมหายไป
43
+ - `symlinked`: path เดิมถูกแทนด้วย symbolic link
44
+ - `replaced`: path เดิมชี้ไป directory identity อื่น
45
+ - `inaccessible`: ตรวจ path/identity ไม่ได้
46
+ - `invalid`: metadata version หรือข้อมูล registry ไม่ผ่าน validation
47
+ - `removed`: เจ้าของนำรายการออกแล้ว แต่ history/authority ยังอยู่
48
+
49
+ DODO ไม่ถือว่า `missing`, `symlinked`, `replaced`, `inaccessible` หรือ `invalid`
50
+ พร้อมใช้งาน และไม่ย้าย authority อัตโนมัติ
51
+
52
+ ## Local Config
53
+
54
+ หน้า Local Config แสดงรายการและ readiness เพิ่มโปรเจกต์ เปิดโปรเจกต์ที่พร้อม
55
+ ผ่าน workspace switch lifecycle เดิม และนำรายการออกหลังยืนยันได้ API เหล่านี้
56
+ อยู่บน listener loopback ของ Local Config เท่านั้น ใช้ private capability,
57
+ Host/Origin checks, rate limit และ workspace/epoch headers เดิม ไม่มี route นี้บน
58
+ MCP/public listener
59
+
60
+ `dodo --cli` ใช้ registry เดียวกันสำหรับเลือกหรือเพิ่มโปรเจกต์ และบันทึก
61
+ `startupProjectId` เป็น preference ระดับ installation ค่านี้ไม่ข้าม OAuth scope หรือ
62
+ filesystem guards และต้อง resolve registry + ตรวจ readiness ใหม่ทุกครั้งที่เปิด server
63
+
64
+ `dodo` และ `dodo start` ไม่ยึด process CWD เป็น workspace โดยอัตโนมัติอีกต่อไป:
65
+
66
+ - ถ้าโปรเจกต์ที่เลือกล่าสุดยัง `ready` จะเปิด root นั้น
67
+ - ถ้ายังไม่เลือกหรือรายการไม่พร้อม จะเปิด launcher mode โดยไม่มี active AI workspace
68
+ - เจ้าของเลือก path แรกจาก Local Config, `dodo --cli` หรือ `dodo start --root PATH`
69
+ - `dodo stdio --root PATH` ยังคง explicit เพราะ STDIO lifecycle ถูก client เป็นผู้สร้าง
70
+
71
+ launcher mode ใช้ directory ภายใน private config เป็น resource ชั่วคราวเท่านั้น
72
+ directory นี้ไม่ถูกส่งเป็น project root และ MCP/OAuth data plane ตอบ
73
+ OAuth login และ authenticated catalog ใช้ได้ระหว่างยังไม่มี default workspace แต่
74
+ ทุก operation ต้องรอ real workspace พร้อม โหมดส่วนตัวพร้อมใช้หลัง owner ลงทะเบียน
75
+ path; โหมด managed ต้องมี owner-granted ACL เพิ่มด้วย
76
+
77
+ ## Read-only federation
78
+
79
+ MCP อ่านโปรเจกต์ที่ลงทะเบียนไว้ได้โดยไม่เปลี่ยน active workspace ผ่าน tools เดิม:
80
+
81
+ - `project_overview({projectId})`
82
+ - `list_files({projectId, ...})`
83
+ - `read_files({projectId, ...})`
84
+ - `search_code({projectId, ...})`
85
+ - `search_code({projectIds: [...]})` สำหรับค้นพร้อมกันสูงสุด 8 โปรเจกต์
86
+
87
+ ใน Compact/Hybrid surface ให้ใส่ fields เหล่านี้ใน `args` ของ `dodo_read`
88
+ ตาม schema ที่ `dodo_discover` คืนมา จำนวน tools ปัจจุบันเป็น Full 125, Compact 19
89
+ และ Hybrid 49
90
+
91
+ `project_overview()` ของ active workspace แสดง `federation.projects` เฉพาะรายการ
92
+ ที่ client อ่านได้ โหมดส่วนตัวใช้ live `dodo:read` จาก owner-approved installation
93
+ grant กับ registry; โหมด managed ต้องมี live target ACL เพิ่ม สำหรับ HTTP ต้องเป็น
94
+ OAuth installation identity รุ่นปัจจุบันด้วย Legacy workspace-bound grant ใช้ข้าม
95
+ โปรเจกต์ไม่ได้ ส่วน local STDIO เป็น owner process
96
+
97
+ ทุก target ถูกตรวจซ้ำก่อนอ่าน:
98
+
99
+ 1. project ID ต้องมาจาก owner registry
100
+ 2. canonical path และ directory identity ต้องมีสถานะ `ready`
101
+ 3. grant ต้องไม่ถูก revoke และต้องมี `dodo:read`; managed mode ตรวจ target ACL เพิ่ม
102
+ 4. shared ignore/path/secret policy ของ target ถูกสร้างใหม่จาก global policy
103
+ 5. request ยังต้องใช้ active workspace ID/epoch ที่ถูกต้อง
104
+
105
+ ผล federated มี target project ID, workspace ID, federation epoch และ source hash
106
+ แยกจาก envelope ของ active workspace การค้นหลายโปรเจกต์ใช้ quota รวมแบบ bounded;
107
+ target ที่ owner อนุญาตแต่ unavailable ถูกระบุเป็น partial failure ส่วน target ที่
108
+ ไม่มี authority ตาม access mode ปัจจุบันทำให้ทั้ง request ถูกปฏิเสธและไม่เผย path/metadata
109
+
110
+ Federation นี้ไม่เปลี่ยน `process.cwd()` หรือ default workspace สำหรับ write/exec
111
+ ข้ามโปรเจกต์ใช้ `targetProjectId` แยกจาก read federation ตามหัวข้อถัดไป
112
+
113
+ ## การนำรายการออก
114
+
115
+ `dodo project remove` เป็น soft removal ของ registry metadata เท่านั้น ระบบไม่ลบ:
116
+
117
+ - ไฟล์หรือ directory ของโปรเจกต์
118
+ - workspace history, changesets หรือ audit เดิม
119
+ - trust mode หรือ client ACL
120
+ - OAuth installation identity, clients หรือ grants
121
+
122
+ การเพิ่ม canonical root เดิมภายหลังจะได้ project ID ใหม่ แต่ workspace authority
123
+ ยังเป็นไปตาม workspace identity contract เดิม
124
+
125
+ ## ขอบเขต
126
+
127
+ หนึ่ง process มี default workspace หนึ่งตัว และ runtime เป้าหมายแยกกันได้สูงสุด
128
+ 16 secondary projects Owner เพิ่ม path เท่านั้น ไม่มีการค้นทั้งเครื่องอัตโนมัติ
129
+
130
+ ## Explicit target routing
131
+
132
+ Full/Compact รับ `targetProjectId` ระดับบนร่วมกัน เรียก overview ของ target เพื่อรับ
133
+ workspace ID/epoch ก่อนอ่าน/เขียน/รัน การเลือก runtime เกิดก่อน target scope/context
134
+ และ managed ACL checks; client ที่ไม่มีสิทธิ์ default ยังได้รับรายชื่อเฉพาะ projects ที่ได้รับอนุญาต
135
+ เพื่อเลือก target ได้ การไม่ส่ง target คง default behavior เดิม ห้ามผสม target กับ
136
+ `projectId/projectIds` และห้าม nested target/context ใน gateway args
137
+
138
+ Runtime แต่ละตัวมี epoch, services, workers, jobs, trust และ resource ownership ของตัวเอง
139
+ ถือ private project lease ก่อน bootstrap/recovery และตรวจ readiness ใหม่ก่อน acquire
140
+ Job/agent/request ที่ยังใช้อยู่ทำให้การปิด/ถอด project ถูกปฏิเสธ งาน mutation ทั้งจาก
141
+ MCP/agent/schedule ใช้ queue เดียวต่อ project; command ถือ queue จน job จบ อ่านขนานได้
142
+ และแต่ละ project รันพร้อมกันได้ Hash ยังตรวจตอนถึง queue เพื่อป้องกัน external edits
143
+
144
+ Projects ในเว็บเลือกหน้าจอแยกจากการตั้ง default Personal mode ใช้ trusted policy กับ
145
+ registered projects โดยตั้งใจ ส่วน managed mode ไม่คัดลอก trust/ACL/approval/run
146
+ override ระหว่าง projects คู่มือ AI/profile permission อยู่ที่ [AI Providers](AI_PROVIDERS.md)