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,250 @@
1
+ # DODO MCP — Security
2
+
3
+ ## Security model
4
+
5
+ DODO ใช้หลายชั้นร่วมกัน:
6
+
7
+ - OAuth 2.1 + authorization code + PKCE S256 สำหรับ MCP
8
+ - static client registration และ owner-controlled consent
9
+ - installation identity แยกจาก workspace client ACL
10
+ - OAuth scopes `dodo:read`, `dodo:write`, `dodo:exec`
11
+ - trust modes `inspect`, `edit`, `trusted`
12
+ - local approval สำหรับ effectful actions
13
+ - workspace ID/epoch validation
14
+ - shared root/path policy และ secret deny list
15
+ - expected hash, journal, atomic write และ rollback
16
+ - bounded jobs, scrubbed environment และ audit
17
+
18
+ การผ่านชั้นใดชั้นหนึ่งไม่ grant สิทธิ์ชั้นอื่น
19
+
20
+ Project Registry เป็น owner metadata แยกจาก authority: project ID หรือ readiness
21
+ ไม่ grant OAuth scope, workspace ACL หรือ trust และ AI ไม่มี MCP tool สำหรับเพิ่ม ลบ
22
+ หรือเปลี่ยนรายการโปรเจกต์
23
+
24
+ Registry ตรวจ canonical realpath กับ device, inode และ directory birth time ทุกครั้ง
25
+ ก่อนถือว่า target พร้อมใช้งาน จึง fail closed เมื่อ path ถูกแทน แม้ Linux จะนำเลข
26
+ inode เดิมกลับมาใช้ Migration ไม่ auto-upgrade row เก่าที่ไม่มี birth time เพราะไม่มี
27
+ หลักฐานพอแยก inode reuse; row นั้นคงเป็น invalid จนเจ้าของ review, remove และ add ใหม่
28
+
29
+ Read-only federation ตรวจ ACL แยกทุก target และรับเฉพาะ project ID จาก registry
30
+ ที่ owner สร้าง Remote client ต้องใช้ installation identity grant; legacy token ที่
31
+ ผูก workspace เดียวข้ามโปรเจกต์ไม่ได้ รายการโปรเจกต์ใน overview ถูกกรองก่อนส่ง และ
32
+ request ที่อ้าง target ไม่มี ACL ถูกปฏิเสธโดยไม่เผย absolute path หรือ metadata
33
+
34
+ ## HTTP and Local Config
35
+
36
+ MCP และ public route ต้องผ่าน OAuth เสมอ ห้ามใช้ localhost เป็น authentication, ห้ามเปิด CORS เป็น `*`, ห้ามส่ง token ใน query string และห้าม trust proxy headers จากภายนอก
37
+
38
+ Local Config bind loopback ใช้ private capability token, expiration, Host/Origin checks, forwarded-header rejection และ rate limit ไม่มี Local Config/admin endpoint บน public MCP plane
39
+
40
+ UI assets เสิร์ฟจากแพ็กเกจเองทั้งหมดรวมถึง SweetAlert2 ที่ vendor แบบ pin version (ไม่มี CDN; CSP ยังเป็น `script-src 'self'; style-src 'self'` โดยไม่มี `unsafe-inline`/`unsafe-eval`) เส้นทาง `/assets` เป็น fail-closed: path ที่ decode แล้วต้องตรงรูปแบบเข้มงวด (ลึกได้หนึ่งระดับเฉพาะ `ui/`, `vendor/`), นามสกุลอยู่ใน allowlist (`.css/.js/.svg`), ปฏิเสธ `..`, backslash, NUL และไฟล์ที่ resolve ออกนอก UI directory ทั้งหมดตอบ 404 ข้อความจาก server/paths/client/provider ทุกตัว render ผ่าน `textContent` (SweetAlert ใช้ `titleText`/`text` เท่านั้น ไม่ใช้ `html`) กล่องยืนยันของ UI เป็นชั้น UX เพิ่มเติม ไม่แทนที่ approval/validation ฝั่ง server
41
+
42
+ Launcher mode ไม่มี active AI workspace และไม่ใช้ CWD เป็น implicit authority
43
+ private inert root ไม่ถูกแสดงต่อ client; OAuth และ authenticated catalog เปิดให้ตั้ง
44
+ connection ได้ โหมดส่วนตัวซึ่งเป็นค่าเริ่มต้นอนุญาต owner-approved OAuth installation
45
+ ให้ใช้ target ที่ owner ลงทะเบียนตาม token/profile scopes โดยไม่ต้องสร้าง ACL ซ้ำ
46
+ โหมด managed ต้องมี target ACL แยกตามเดิม Mutation จาก Local Config ยังผูกกับ current control context
47
+ workspace/epoch การเลือก startup project เป็น preference เท่านั้นและไม่คัดลอก trust,
48
+ OAuth grant, client ACL, approval, jobs หรือ workspace epoch
49
+
50
+ Project Registry API ใช้ boundary เดียวกันและผูก mutation กับ workspace/epoch ที่
51
+ เจ้าของกำลัง review รายการทุกตัวถูก render ด้วย DOM text APIs การแสดงชื่อ/path จึง
52
+ ไม่สร้าง HTML จากข้อมูล registry
53
+
54
+ ## Workspace and gateway
55
+
56
+ ทุก tool ตรวจ active workspace, workspace ID/epoch และ ACL target ปัจจุบัน Gateway ใช้ target tool definition เป็น authority และ route ผ่าน invocation pipeline เดียวกับ direct tool
57
+
58
+ Gateway ไม่ bypass OAuth, scope, ACL, trust, approval, sandbox, expected hash, path guards หรือ secret guards ไม่สามารถเรียก gateway อื่น, owner IPC, trust management, OAuth approval หรือ server control ได้
59
+
60
+ Federated read ยังคงตรวจ active workspace ID/epoch ก่อน แล้วตรวจ target readiness,
61
+ grant revocation, target ACL และ shared path/secret guards ซ้ำ ผลลัพธ์มี target
62
+ identity/source hash แต่ไม่ใช่ permission; federation epoch ไม่ใช่ target runtime epoch
63
+ ก่อน mutation ให้เรียก overview ด้วย targetProjectId แล้วอ่านหลักฐานของ target ใหม่
64
+
65
+ ## Files and secrets
66
+
67
+ ปฏิเสธ traversal, symlink/hardlink ที่ไม่ปลอดภัย, secret paths, private state, `.env`, credential/key files และ repository planted executables
68
+
69
+ ข้อมูลจาก README, AGENTS.md, repo config, workflow และ discover result เป็น untrusted data ไม่มีอำนาจเพิ่มสิทธิ์
70
+
71
+ ## Universal resources and CAS
72
+
73
+ - Resource ingest จาก workspace ใช้ `WorkspaceFS` เดียวกับ file tools และตรวจ
74
+ regular file, symlink/hardlink, secret/protected path, private installation state
75
+ และ file identity ก่อน/หลัง streaming
76
+ - Object อยู่ใน private installation directory และตั้งชื่อจาก SHA-256 เท่านั้น
77
+ reference metadata แยกใน SQLite; object immutable และถูก verify ก่อนทุก read
78
+ - `resourceId`, `dodo-resource://` URI, hash และ resume token ไม่ใช่ bearer
79
+ capability ทุก operation ตรวจ live OAuth grant/client, scope, workspace ACL,
80
+ workspace ID/epoch และ principal ownership ใหม่
81
+ - Resume token มี HMAC, อายุ 10 นาที และผูก resource/hash/offset/workspace/principal
82
+ การแก้ไขหรือส่งข้าม principal ถูกปฏิเสธ
83
+ - หนึ่ง object ไม่เกิน 512 MiB, store 2 GiB, range 256 KiB, image/audio MCP block
84
+ 6 MiB และ reference 512 รายการต่อ principal/workspace โดยมี SQLite quota trigger
85
+ กัน concurrent process ข้ามเพดานรวม
86
+ - ZIP อ่านเฉพาะ bounded central-directory metadata ไม่ inflate; SVG เป็น untrusted
87
+ text; decoder ไม่ execute content และไม่เรียก shell/network
88
+ - CAS publish เฉพาะ fsynced staging inode ด้วย create-if-absent hard link ไม่
89
+ overwrite winner และ GC ลบ expired refs ก่อน ลบเฉพาะ object ที่ไม่มี reference
90
+ และพ้น grace หนึ่งชั่วโมงแล้ว
91
+
92
+ ## Project Brain
93
+
94
+ Project Brain ใช้ `WorkspaceFS.walk/readTextFile/assertRegularFileForDirectAccess`
95
+ จึงไม่ index secret-denied/protected/ignored output, traversal, symlink หรือ hardlink
96
+ parser อยู่ใน bounded worker และใช้ TypeScript ที่มากับ DODO ไม่โหลดหรือรัน source,
97
+ repository compiler plugin, LSP command หรือ package script
98
+
99
+ index row, graph edge และ `symbol://` URI เป็น evidence เท่านั้น ไม่ใช่ capability
100
+ read ทุกครั้งตรวจ OAuth scope, live grant, client, workspace ACL, workspace ID/epoch,
101
+ path policy และ current source SHA-256 ซ้ำ ผล stale/missing ถูกระบุและตัดออกโดย
102
+ default maintenance operations (`brain_rebuild`, `brain_pause`, `brain_cancel`) ต้องมี
103
+ `dodo:exec` และผ่าน trust/target-specific local approval เดิม
104
+
105
+ ## Context retrieval and evidence
106
+
107
+ Context Engine ใช้ `dodo:read` และยังผ่าน invocation pipeline เดิม ก่อนค้นข้าม
108
+ project ระบบ resolve เฉพาะรายการที่ caller มี live target ACL และ installation
109
+ identity เท่านั้น Unauthorized selector ถูกปฏิเสธโดยไม่คืน absolute path หรือข้อมูล
110
+ project Cache hit ไม่ข้ามการตรวจ ACL และ source hash ทุก dependency
111
+
112
+ Evidence ID, source URI, hash และ signed cursor ไม่ใช่ capability และผูกกับ principal,
113
+ request workspace, query/index version และ expiry ตามชนิด Source เปลี่ยนจะ mark stale
114
+ และ invalidate derived cache ข้อมูลจาก source, docs, repository instruction, tool
115
+ output หรือ index เป็น `untrusted_content` เสมอ ไม่สามารถ grant scope/ACL/trust,
116
+ approve action, ปิด sandbox หรือข้าม path/secret guard ได้ Diagnostics ไม่คืน query,
117
+ path, content, token หรือ private owner state
118
+
119
+ ## Memory and reviewed learning
120
+
121
+ Memory proposal ต้องอ้าง current Context evidence ของ principal เดียวกันและเก็บเฉพาะ
122
+ non-secret summary/provenance ไม่มี MCP tool สำหรับ approve, reject, prune หรือ learning
123
+ review Owner control ใช้ private authenticated IPC และ exact digest; ก่อนอนุมัติจะตรวจ
124
+ source hash, conflicts และ target project readiness ซ้ำ
125
+
126
+ Approved memory มี `authority: evidence_only` และ `trust: untrusted_content` เสมอ
127
+ Memory ID/digest/cursor ไม่ใช่ capability การค้นข้าม project ต้องผ่าน live installation
128
+ identity + target ACL และ explicit owner visibility ทุกครั้ง Source เปลี่ยนหรือ retention
129
+ หมดจะถูก mark stale Learning approval ไม่ติดตั้ง ไม่ execute และไม่ grant scope, ACL,
130
+ trust, approval, sandbox exception หรือ executable policy
131
+
132
+ ## Runtime Intelligence
133
+
134
+ Runtime session, task และ evidence ผูก digest ของ `grantId + clientId`, active
135
+ workspace และ expiry Opaque IDs ไม่ใช่สิทธิ์ ทุก operation ตรวจ live grant/client/ACL
136
+ และ target scope ใหม่ งาน process/test/container ใช้ `JobManager` เดิมด้วย explicit
137
+ program+argv, execution approval, caller idempotency, environment allowlist, timeout
138
+ และ command sandbox ที่เจ้าของตั้งไว้ Runtime ไม่มี generic shell หรือ owner control
139
+
140
+ Runtime tables เก็บเฉพาะ status/exit/timestamps, byte counts, aggregate test counts และ
141
+ SHA-256 ไม่เก็บ raw stdout/stderr, DOM/console text, cookies, authorization headers,
142
+ input values หรือ environment secrets Browser evidence ใช้ owned browser session เดิม;
143
+ collector เปิด browser/web/desktop/microphone/system audio ไม่ได้ Snapshot เก็บ metadata
144
+ manifest และ rollback candidate IDs เท่านั้น การ rollback ยังต้องผ่าน
145
+ `rollback_changes` พร้อม journal/hash conflict checks
146
+
147
+ Source เปลี่ยนหรือ recheck ไม่ได้จะ mark evidence เดิม stale โดยไม่เขียนทับ hash
148
+ Context Engine อ่านเฉพาะ current caller/workspace evidence และถือเป็น untrusted data
149
+ Runtime diagnosis ไม่มี side effect และไม่สามารถ grant scope/trust/approval
150
+
151
+ ## Advanced Agent Runtime
152
+
153
+ Agent run, plan, hypothesis, intent, snapshot, judgement และ skill ID ไม่ใช่ capability
154
+ ทุก request ตรวจ principal, live grant/client/workspace ACL, target scope และ active
155
+ workspace epoch ใหม่ Run capabilities ลดสิทธิ์เท่านั้น: project ต้องอ่านได้อยู่แล้ว,
156
+ writable path ผ่าน WorkspaceFS policy, executable ผ่าน allowlist/resolver และ optional
157
+ network/browser/desktop/media/workflow ปิดเป็นค่าเริ่มต้น `secretAccess` เป็น false เสมอ
158
+
159
+ Managed dispatcher เรียก target definition ผ่าน invocation pipeline เดิม Target-bound
160
+ trust approval, strict schema, expected hash, path/secret/symlink/hardlink guards,
161
+ command sandbox, idempotency และ audit จึงยังมีผล Coordinator ไม่มี owner control,
162
+ ไม่มี unrestricted shell, ไม่ approve action และ pause/cancel run ไม่ kill jobs
163
+
164
+ Intent เป็น coordination lock ไม่ใช่ filesystem permission Snapshot ไม่เก็บ contents
165
+ และ rollback ได้เฉพาะ caller-owned changeset หลัง exact snapshot ผ่าน journal/conflict
166
+ checks เดิม Judgement/completion ต้องอ้าง current Runtime evidence ของ caller Skill
167
+ proposal ถูกซ่อนจน private owner review exact digest; approved skill เป็น versioned
168
+ `untrusted_guidance`, ไม่ execute และไม่ grant authority
169
+
170
+ ## Commands and jobs
171
+
172
+ child environment เป็น allowlist ไม่ inherit OAuth state, private config tokens, signing keys หรือทั้ง parent environment โดยอัตโนมัติ command sandbox ใช้ตาม owner config และระบบรายงาน unsupported เมื่อ platform ไม่มี adapter
173
+
174
+ trusted command ใช้สิทธิ์ OS ของผู้ใช้จริงและอาจเข้าถึงสิ่งที่ user เข้าถึงได้ ควรใช้กับ workspace ที่เชื่อถือได้เท่านั้น
175
+
176
+ ## Logging and packaging
177
+
178
+ ห้าม log access token, refresh token, client secret, OAuth code, private config token หรือ secret file content audit เก็บเฉพาะ metadata ที่ scrubbed
179
+
180
+ package tarball ต้องไม่มี state DB, private keys, credentials, models, media fixtures หรือ temporary release files
181
+
182
+ ## Evaluation boundary
183
+
184
+ DodoBench ใช้ OAuth, workspace ACL, scope, epoch, trust, approval และ path/secret guards
185
+ ชุดเดียวกับ runtime จริง ไม่มี benchmark bypass หรือ privileged principal ผลและ release
186
+ evidence ไม่มี token, OAuth code, client secret, private config capability, source content
187
+ หรือ state database และถูก ignore จาก Git/npm Release gate บล็อก high/critical
188
+ production dependency findings แต่ไม่ publish package หรือเปลี่ยน owner configuration
189
+
190
+ ### Optional Sub-agent MCP exposure
191
+
192
+ `exposeSubagentsToMcp` ปิดเป็นค่าเริ่มต้นและควบคุมเฉพาะ tool catalog ของ MCP เมื่อปิด
193
+ Full จะไม่ register สี่ Sub-agent definitions และ Compact/Hybrid จะไม่ใส่ operations
194
+ เหล่านี้ใน gateway enum, server instructions หรือ `dodo_discover` หน้าเว็บ owner-only
195
+ ยังสร้างและจัดการ agent ได้ การเปิดสวิตช์ไม่ grant `dodo:exec`, ไม่เพิ่ม project ACL,
196
+ ไม่เปลี่ยน trust/profile policy และไม่ข้าม approvals, sandbox, path/secret guards หรือ
197
+ workspace context ทุก call ที่เปิดให้เห็นยังผ่าน invocation pipeline เดิมทั้งหมด
198
+
199
+ ## Cloudflare Tunnel
200
+
201
+ เจ้าของเป็นผู้สร้าง remotely-managed Tunnel, hostname และ DNS DODO ไม่ใช้ Cloudflare API เมื่อรัน `dodo start` ใน terminal ระบบถาม Tunnel token แบบซ่อนและ supervise เฉพาะ live `cloudflared` child ของ process นั้น หรือเจ้าของเริ่ม/หยุดรอบเดียวกันจาก Local Config ที่ผ่าน owner authentication
202
+
203
+ เส้นทางหลักใช้ token แบบ run-scoped เท่านั้น: token อยู่ในหน่วยความจำของ DODO และ environment ของ child `cloudflared` ระหว่างรอบ ไม่ถูกบันทึกใน config, Keychain, Credential Manager, Secret Service, CLI argv, child arguments, logs, MCP catalog/response, audit หรือ setup receipt ค่า `TUNNEL_TOKEN` และ `TUNNEL_TOKEN_FILE` ถูกปฏิเสธจาก environment ของ MCP jobs เสมอ Local Config รับ token ผ่าน private loopback capability, ล้าง request field หลังส่ง และตอบกลับเพียง `tokenStored:false`
204
+
205
+ Local Config รับ token เฉพาะ POST ที่ผ่าน private capability, Host/Origin/proxy checks,
206
+ rate limit และ control-context headers แล้วส่งให้ process-owned runtime โดยตรง
207
+ Response/config/audit เก็บเฉพาะสถานะที่ไม่มี secret ไม่มี MCP tool สำหรับส่ง token หรือ
208
+ ควบคุม tunnel หน้าเว็บเริ่ม network process เฉพาะเมื่อ owner กด “เปิด Tunnel รอบนี้”
209
+ และการตั้ง startup preference ไม่เริ่ม network process
210
+
211
+ Tunnel route ต้องชี้ทุก public path ไป MCP/OAuth listener `127.0.0.1:21730` เท่านั้น Local Config `21731`, metrics `21732` และ private IPC ไม่ถูก expose readiness บอกสถานะ Cloudflare connection เท่านั้น ไม่ใช่หลักฐานว่า AI client กำลังเชื่อมต่อ
212
+
213
+ ## Setup and existing-state import
214
+
215
+ `dodo setup --check` และ `dodo setup --plan` เป็น read-only การติดตั้ง dependency ที่ยังขาดต้องมี `--yes` จาก local owner ก่อนเริ่ม installer โดย flag นี้ไม่ข้าม OS elevation, Desktop consent หรือ policy อื่น
216
+
217
+ `dodo setup --import-state` นำเข้าได้เฉพาะ preference allowlist จาก private `config.json`: config version, MCP/config ports, bounded limits, search backend, log retention และ tool surface เท่านั้น ระบบไม่ copy database, OAuth signing keys, cookies, clients, grants, authorization codes, tokens, workspace ACL, trust, approvals, schedules, public URL/Host/Origin allowlists, web/desktop permissions, LSP commands, environment allowlist หรือ sandbox writable paths
218
+
219
+ ก่อน commit ระบบตรวจ file type, ownership/ACL, link count, symlink, runtime markers, size และ SHA-256 ซ้ำ หาก source เปลี่ยน, schema ไม่ตรง, มี unknown field หรือมี DODO process ใช้งาน state นั้นอยู่ การนำเข้าจะ fail closed และรักษา source/target เดิมไว้
220
+
221
+ ## AI providers และ target projects
222
+
223
+ Owner-registered `targetProjectId` เลือก runtime ก่อนคำนวณ scope/ACL; token ของ default
224
+ project ไม่เป็น authority ของ target Legacy root-bound grant ยังข้ามไม่ได้ ทุก model
225
+ operation ผ่าน wrapper เดิมพร้อม live checks หลังรอ queue Profile ทำได้เพียงลดสิทธิ์
226
+ และ child run ถูกจำกัดให้ project เดียว ไม่ spawn ต่อหรือเข้าถึง owner controls
227
+ Approved workflow, memory, skill, model output และ repository content ไม่เป็น permission
228
+
229
+ Provider access เป็น egress permission แยกจาก `allowWebFetch` และแยกต่อ project/profile/
230
+ client ในโหมด managed ส่วนโหมดส่วนตัวถือว่าการเลือก remote profile เพื่อเริ่ม run เป็น
231
+ owner consent สำหรับส่ง bounded context ของ project นั้น ไม่ส่งทั้ง repo/ภาพ/binary อัตโนมัติ
232
+ Loopback Ollama ไม่ใช่หลักฐาน local inference ต้องตรวจ metadata ของ model ก่อนใช้
233
+ ใน project ที่ไม่อนุญาต source egress; endpoint ของเจ้าของยังเป็น trust boundary
234
+
235
+ Keys ใช้ session memory หรือ macOS Keychain ผ่าน stdin (ไม่ใส่ argv) State เก็บ ref
236
+ เท่านั้น UI ไม่อ่าน key กลับและไม่เก็บใน browser storage Endpoint เปลี่ยนต้องป้อน key
237
+ ใหม่และ connection ที่ใช้งานถูกล็อกไม่ให้แก้กลาง run Public endpoint ต้อง HTTPS
238
+ Private/LAN ต้อง opt-in; DNS ตรวจทุก address แล้ว pin, metadata/admin endpoint ถูกปฏิเสธ
239
+ และ credentials ไม่ตาม redirect Known key echoes ถูกปฏิเสธก่อนบันทึก result/continuation
240
+
241
+ Run history/continuation อยู่ใน private state แยก workspace/caller ไม่ export reasoning
242
+ ให้ UI ไม่มี raw access/refresh token ใน delegation ก่อนแต่ละ model/tool action ตรวจ
243
+ lease/grant/ACL/profile ใหม่; revoke หยุดขั้นถัดไปและ resume ไม่เปลี่ยน caller เป็น owner
244
+ Unknown outcomes ไม่ auto-retry Queue ไม่แทน expected hash หรือ OS sandbox; shell job
245
+ รันด้วยสิทธิ์ OS-user ภายใต้ sandbox/trust ที่เจ้าของตั้งเดิม
246
+
247
+ Local Config ยังคง loopback, token expiry, Host/Origin/proxy-header/rate checks และ CSP
248
+ Admin API ไม่อยู่บน public MCP Events ใช้ authenticated fetch/cursor ไม่ใส่ token ใน URL
249
+ ใช้ textContent แสดง path/model/error และไม่ render HTML จากโมเดล Tunnel credential
250
+ ยัง run-scoped ตามเดิม การเริ่ม DODO/Keychain/macOS permissions ต้องผ่านเจ้าของ
@@ -0,0 +1,312 @@
1
+ # DODO MCP — Test Report
2
+
3
+ ## Scope
4
+
5
+ รายงานนี้ใช้กับ DODO MCP 1.0.0 source และแยกผล automated กับ manual อย่างชัดเจน
6
+
7
+ ## Optional Sub-agent MCP exposure — 2026-09-14
8
+
9
+ เพิ่ม owner-only switch ที่ Local Config → Settings ค่าเริ่มต้นปิด โดยหน้าเว็บ Chat &
10
+ Tasks ยังใช้ agent ได้ Full live catalog เปลี่ยนจาก complete 125 เป็น 121 ขณะที่
11
+ Compact/Hybrid คง 19/49 tool names แต่กรอง operation enum, discover, overview note และ
12
+ server instructions ให้ตรงกับ runtime ผลเปิดสวิตช์ต้อง restart/rescan และไม่ได้เพิ่ม
13
+ OAuth scope, ACL, trust, profile authority, approval หรือข้าม guards ใด ๆ
14
+
15
+ - `npm run build`, typecheck, lint — **AUTOMATED_PASS**
16
+ - catalog/default/config/auth tests — **AUTOMATED_PASS**: default false, Full 121,
17
+ opt-in Full 125, Compact/Hybrid 19/49, hidden operation `NOT_FOUND`, stale/unauthorized
18
+ Local Config writes ถูกปฏิเสธ
19
+ - Chromium UI-04 — **AUTOMATED_PASS**: switch, SweetAlert confirmation, persisted config,
20
+ restart notice และ Chat & Tasks ยังเข้าถึงได้; console/CSP errors = 0
21
+ - `npm run test:all` — **AUTOMATED_PASS**: 649 passed / 31 skipped / 0 failed ใน
22
+ 94 files ผ่าน, 2 files ข้ามตาม platform และ packaging 16/16
23
+ - exact tarball smoke — **AUTOMATED_PASS**: fixture เปิด option โดยชัดแจ้ง, STDIO 125,
24
+ HTTP Compact 19, OAuth, write/edit/read-back, target routing และ Sub-agent receipt ผ่าน
25
+ - `npm audit --omit=dev` — **AUTOMATED_PASS**: 0 vulnerabilities
26
+ - owner server restart + external ChatGPT rescan — **MANUAL_NOT_RUN**
27
+
28
+ ## Local Config UI redesign — 2026-09-14 (macOS, Node 22.23.2)
29
+
30
+ ปรับ Information Architecture เป็น dashboard 8 หน้า, เพิ่มระบบ tooltip ที่เข้าถึงได้, vendor SweetAlert2 11.26.25 (same-origin, CSP `'self'` เดิม ไม่มี `unsafe-inline`/`unsafe-eval`), provider action lifecycle, personal-mode UX และ hardened `/assets` route (normalize + extension allowlist + traversal fail-closed) ผลรันจริง:
31
+
32
+ - `npm run build` / `npm run typecheck` / `npm run lint` — **AUTOMATED_PASS** (exit 0)
33
+ - `npx vitest run tests/security/localConfig.test.ts` — **AUTOMATED_PASS** 9/9 (รวม CSP ไม่มี CDN, asset traversal/encoded/NUL/deep-path → 404, ไฟล์ first-party ไม่มี `innerHTML`, vendored assets เสิร์ฟจาก same origin)
34
+ - `npx vitest run tests/integration/aiWorkbench.test.ts` — **AUTOMATED_PASS** 1/1 ใน Chromium จริง (nav ใหม่, SweetAlert confirm ก่อน probe, ผลทดสอบมี connection/model/เวลา, XSS ใน model output ไม่ทำงาน, ไม่มี secret ใน storage, 390px ไม่มี horizontal scroll, dark/light, keyboard focus, `pageerror` = 0)
35
+ - `npx vitest run tests/integration/configUiComponents.test.ts` (UI-01..04) — **AUTOMATED_PASS** 4/4 ใน Chromium จริง: tooltip, SweetAlert, double-submit, text-only hostile names, personal/managed controls, theme/reduced motion, 320px และ Sub-agent MCP switch พร้อม restart notice/Chat & Tasks continuity; console error/CSP violation = 0
36
+ - `npm run test:pack` — **AUTOMATED_PASS** 16/16 (PACK-07 ตรวจ ui/ + vendor/ อยู่ใน tarball, ไม่มี URL ภายนอกใน index.html, vendored SweetAlert2 ตรง byte กับ devDependency ที่ pin)
37
+ - `npm run test:all` — **AUTOMATED_PASS**: 649 passed / 31 skipped (Windows-only บน macOS) / 0 failed ใน 94 ไฟล์ + packaging 16/16
38
+ - Screenshot จาก Chromium fixture: `release-evidence/ai-workbench/{providers-desktop,task-desktop,task-mobile,history-mobile-light,overview-320}.png`
39
+ - **MANUAL_NOT_RUN**: การแตะ tooltip บนอุปกรณ์ touch จริง (ทดสอบผ่าน Chromium click-as-tap แล้วเท่านั้น), screen reader จริง (VoiceOver/NVDA), และการใช้งานบนเบราว์เซอร์อื่นนอกจาก Chromium
40
+
41
+ ### Visual pass (theme tokens)
42
+
43
+ ใช้พื้น charcoal/slate แบบเรียบใน dark mode และ warm neutral ใน light mode แยกชั้นด้วย surface, border และ spacing พร้อม accent ม่วงเฉพาะ control/สถานะสำคัญ ไม่มี gradient, ambient glow หรือ asset ตกแต่งจากภายนอก ส่วน sticky navigation ใช้ `backdrop-filter` เฉพาะเมื่อ browser รองรับ ตรวจด้วย Chromium fixture ว่า dark/light สลับค่าจริง และ `PACK-07` ล็อกข้อกำหนดว่า first-party CSS ต้องไม่มี `linear-gradient`, `radial-gradient` หรือ `conic-gradient` เทสต์ทั้งหมดข้างต้นรันซ้ำผ่านหลังปรับสี (AUTOMATED_PASS ทั้งชุด)
44
+
45
+ ### Layout tidy pass (spacing/grid system)
46
+
47
+ จัดระเบียบตามหลัก 2026 (8px spacing scale, law of proximity, one shared shell width): เพิ่ม token ระยะ `--s1..--s8` + `--shell`/`--card-pad`, ลบการซ้อน card-in-card (`#workbench` เป็น layout container ไม่ใช่ card แล้ว, `.wb-section` ใช้ chrome เดียวกับ `.card` ทุกหน้า), รวมทุกหน้าให้กว้างเท่ากันและจัดกึ่งกลาง, form field กริด 2 คอลัมน์ระยะสม่ำเสมอ, ปุ่ม action เป็นแถวระยะเท่ากันแทน margin เฉพาะจุด, ยุบ `#wb-notice` ที่ว่างและทำเป็นกล่องเมื่อมีข้อความ ผลรัน gate เต็มล่าสุดหลังจัด layout และเพิ่ม Sub-agent exposure switch: **649 passed / 31 skipped / 0 failed + packaging 16/16** (รวม assertion viewport 320/390 ไม่มี horizontal scroll, personal-mode visibility, dark/light) — AUTOMATED_PASS
48
+
49
+ ## AI Providers / Multi-project — current source verification
50
+
51
+ วันที่ 2026-09-14 บน macOS, Node 22.23.2; source v1.0.0 ที่ยังไม่ publish
52
+
53
+ | Gate | ผล |
54
+ |---|---|
55
+ | Build, typecheck, lint | AUTOMATED_PASS |
56
+ | Unit/integration/security/compatibility | AUTOMATED_PASS — 94 files, 649 tests; skipped 2 files / 31 tests ตาม platform/prerequisite |
57
+ | Packaging suite | AUTOMATED_PASS — 16 tests |
58
+ | Production npm audit | AUTOMATED_PASS — 0 vulnerabilities |
59
+ | Chromium owner UI | AUTOMATED_PASS — 1440px/390px, dark/light, keyboard, safe model text, explicit resource image attachment, create file in B and history reconnect without replay |
60
+ | macOS Keychain | AUTOMATED_PASS — synthetic set/get/delete round-trip; fixture item deleted |
61
+ | Exact tarball fresh install | AUTOMATED_PASS — explicit Sub-agent opt-in: Full 125, Compact HTTP 19 + OAuth, write/edit/read-back, target B, provider fixture agent write + receipt; cleanup passed |
62
+ | Linux Docker | NOT_RUN — runner command stops at docker info; local Engine socket unavailable |
63
+ | Live OpenAI, Gemini, Claude, MiniMax, GLM, Kimi, Ollama | MANUAL_NOT_RUN — no live credentials/model inference used |
64
+ | Native Windows for this feature | MANUAL_NOT_RUN — outside this task |
65
+
66
+ Protocol fixtures exercise all seven presets / five adapters, fragmented streams, tool
67
+ call IDs and continuation/signatures, 429, abort/interruption, credential-echo rejection,
68
+ DNS/private/metadata policy and redirect refusal. These results do not establish live
69
+ model compatibility or provider billing behavior.
70
+
71
+ Personal-mode regressions prove an owner-approved OAuth token can list/read/write an
72
+ owner-registered Project B with no duplicate workspace ACL, while read-only scope still
73
+ cannot write. Enabled remote profiles are discoverable without a ProjectAI allowlist;
74
+ managed mode remains explicit and retains existing ACL/trust/egress tests. Persistent
75
+ Desktop consent is reused across workspace epochs/projects, temporary consent remains
76
+ workspace-bound, snapshots remain stale across epochs, and installation disable revokes it.
77
+
78
+ Real HTTP + OAuth fixtures prove parallel A/B jobs and writes, no-default-ACL project
79
+ selection, target scope/context rejection, secret/hash guards and isolated changesets.
80
+ Agent fixtures verify write/read/edit/exec/read, actual stdout receipts, inspect approvals,
81
+ queued revocation/conflict, owned-job cancellation, no recursive spawn, idempotency,
82
+ explicit process-crash recovery and uncertain-outcome refusal. Runtime teardown tests
83
+ prove new requests cannot acquire a closing target while the default remains usable.
84
+
85
+ Private non-secret evidence is retained under release-evidence/ai-workbench (ignored and
86
+ not packaged): gate log, audit, artifact manifest/checksum, fresh-install report and five
87
+ actual UI screenshots. The npm manifest includes all 11 UI assets, AI runtime modules,
88
+ Full/Compact/Hybrid schemas and the AI provider guide; development docs, conversations,
89
+ state databases, media/model files and credentials are absent.
90
+
91
+ No live provider or external ChatGPT acceptance is reported as MANUAL_PASS. No publish,
92
+ global reinstall, existing-server restart or tunnel/DNS change is part of this work.
93
+
94
+ ## Baseline gates before AI Providers / Multi-project
95
+
96
+
97
+ ```bash
98
+ npm run build
99
+ npm run typecheck
100
+ npm run lint
101
+ npm run test:all
102
+ npm audit --omit=dev
103
+ npm pack
104
+ ```
105
+
106
+ ผล local gate วันที่ 2026-09-14 (macOS, source checkout):
107
+
108
+ - build: PASS — full 121, compact 19, hybrid 49 และ config schemas ถูกสร้างสำเร็จ
109
+ - typecheck: PASS
110
+ - lint: PASS
111
+ - core/integration/security/compatibility: 84 files PASS, 2 files platform-skipped; 605 tests PASS, 31 tests platform/prerequisite-skipped
112
+ - packaging: 16 tests PASS
113
+ - `npm audit --omit=dev`: 0 vulnerabilities (0 low/moderate/high/critical)
114
+ - `npm pack`: PASS — required runtime/schemas/docs present and forbidden private state/development artifacts absent; exact final artifact metadata is reported separately so the packaged report does not contain a self-referential checksum
115
+ - fresh exact-tarball install: PASS — `dodo --version` = `1.0.0`, Full = 121,
116
+ Compact = 19 และ installed Compact `dodo_assist_read → memory_status`,
117
+ `dodo_assist_change → runtime_session_open` และ `agent_run_open` คืน schemaVersion 1
118
+ จาก fresh state สำเร็จ โดย agent run มี `authority=coordination_only`
119
+
120
+ macOS owner-flow verification เพิ่มเติมหลังเปลี่ยน Tunnel lifecycle:
121
+
122
+ - headless Chromium แสดง Local Config จริงที่ 1440px และ 390px; temporary token
123
+ เป็น masked input, ไม่มี external asset และ state มาจาก runtime
124
+ - pseudo-terminal fixture เรียก CLI จริงและพิสูจน์ hidden prompt → child environment,
125
+ token ไม่อยู่ใน terminal output/argv/config และ `SIGINT` ปิด owned child พร้อม DODO
126
+ - exact tarball fresh install และ global reinstall รายงาน `dodo 1.0.0`; package 408 files
127
+ ไม่มี development docs, state DB, `.env`, model หรือ release evidence
128
+ - `dodo setup --check --components all` บน macOS arm64: Git, ripgrep,
129
+ cloudflared, ffmpeg, Whisper/model, Chromium, LSP, speech และ sandbox พร้อม;
130
+ Desktop permission และ outbound web consent ยังไม่เปิดตาม security default
131
+
132
+ ชุดทดสอบครอบคลุม transport, OAuth, Local Config, workspace switching, ACL, stale context, path/secret guards, changes, jobs, Git, semantic tools, assistance, multimodal, browser, workflow, surface catalog และ packaging
133
+
134
+ Native candidate regression เพิ่ม lossless NTFS file IDs ผ่าน JSON/SQLite และ
135
+ replaced-root checks, LSP drive/URI normalization, portable mid-write rollback,
136
+ Windows private-fixture ACL และ writable CAS flush handle ผล local ข้างต้นไม่ใช้
137
+ แทนผล native Windows CI; ต้องตรวจ Node 22/24 บน runner `windows-ci 02` แยกกัน
138
+
139
+ IPC shutdown regression จำลอง endpoint ที่หายไประหว่างตรวจ identity และยืนยันว่า
140
+ descriptor ปลอมหรือ ACL ที่เปิดกว้างซึ่งยังอยู่ยังถูกปฏิเสธ Packaging ล้างเฉพาะ
141
+ temporary directory ของ suite หลังจบ รวมถึงกรณี test fail เพื่อไม่สะสม native
142
+ dependencies และ private fixture state บนเครื่องที่รันทดสอบซ้ำ
143
+
144
+ Fresh-install smoke รัน installed package ใน process ลูก และให้ parent ลบ fixture
145
+ หลังลูก exit เพื่อให้ Windows ปลด native DLL ก่อน cleanup รายงาน `PASS` ถูกเขียน
146
+ หลัง verification และ cleanup สำเร็จทั้งคู่เท่านั้น
147
+
148
+ Setup foundation tests เพิ่มหลักฐานว่า setup plan/check ไม่เขียน state, installer ไม่เริ่มหากไม่มี `--yes`, setup receipt มี schema/kind ที่กำหนด, state import ใช้ allowlist, ตรวจ source hash ซ้ำ, ไม่ merge target เดิม และไม่คัดลอก DB/keys/OAuth/ACL/trust/permission state รวมถึง fail closed ต่อ malformed/unknown config, links และ live IPC markers
149
+
150
+ Tunnel tests ใช้ fake `cloudflared` และ loopback readiness fixture พิสูจน์ว่า run-scoped token จาก runtime ไม่อยู่ใน config/argv/log/status, child รับผ่าน dedicated environment, job environment ไม่ inherit tunnel variables, owner IPC เป็น singleton ที่ authenticated, readiness มาจาก `/ready`, restart มีเพดาน และ runtime close หยุดเฉพาะ live owned child ไม่มีการใช้ Cloudflare credential, API, DNS หรือ public network จริง
151
+
152
+ Global launcher และ interactive CLI tests พิสูจน์ว่า `dodo --cli` แสดง/เลือก/เพิ่ม
153
+ โปรเจกต์ได้, setup menu ระบุ cloudflared, launcher ไม่ใช้ invocation CWD หรือเผย
154
+ private inert root, anonymous MCP ยังได้ 401, OAuth installation login และ authenticated
155
+ catalog ใช้ได้ก่อนเลือก target แต่ tool invocation ไม่มี ACL, invalid target ไม่เปิดสิทธิ์
156
+ และ successful switch ใช้ real canonical root พร้อมบันทึก registry
157
+ preference Local Config Tunnel fixture พิสูจน์ซ้ำว่า unauthenticated request ถูกปฏิเสธ,
158
+ config endpoint ปฏิเสธ raw token, session endpoint ตอบ `tokenStored:false`, raw token
159
+ ไม่อยู่ใน response/config/audit และ owner เริ่ม/หยุด process-owned runtime ได้
160
+
161
+ Project Registry tests ครอบคลุม schema migration, Unicode/spaced canonical paths,
162
+ duplicate และ concurrent add, stable project ID, directory relocation, missing/
163
+ symlink/replaced readiness, corrupt metadata recovery, transactional audit, reviewed
164
+ soft removal, Local Config authentication/XSS boundary, ACL/trust isolation, runtime
165
+ workspace switch, Linux inode reuse, fail-closed v1 birth-time migration และ fresh
166
+ tarball CLI
167
+
168
+ Multi-project federation tests ใช้ HTTP + OAuth fixture จริงกับ Project A/B และ
169
+ พิสูจน์ concurrent overview/read/search โดย active root/epoch ไม่เปลี่ยน, target
170
+ identity/source hash, target-scoped audit, bounded partial failure, installation
171
+ identity + per-project ACL, live ACL revocation, stale active epoch, legacy grant
172
+ refusal, secret/traversal/replaced-root guards และ strict rejection เมื่อพยายามส่ง
173
+ `projectId` เข้า write operation Universal Resource, Project Brain และ Context Engine
174
+ operations และ Advanced Agent Runtime ทำให้ complete catalog เป็น 125; live default
175
+ เป็น Full 121 / Compact 19 / Hybrid 49 เพราะซ่อน Sub-agent operations จนกว่า owner จะเปิด
176
+
177
+ Universal Resource tests ใช้ HTTP + OAuth และ Compact gateway จริง ครอบคลุม text,
178
+ binary range/resume, image/audio MCP blocks, raster transform, PDF/ZIP metadata,
179
+ content hash dedup, concurrent ingest, restart persistence, expired-reference GC,
180
+ old crash-object recovery, disk/reference quotas, expected hash/MIME, corrupt
181
+ decoder input/CAS bytes, anonymous/read-only/revoked ACL, principal ownership,
182
+ stale epoch, private config state, secret/traversal/symlink/hardlink และ target-specific
183
+ inspect approval รวมถึง SQLite aggregate-quota trigger และ orphan grace ที่กัน GC
184
+ ชนกับการสร้าง reference
185
+
186
+ Project Brain tests ใช้ HTTP + OAuth, Full และ Compact gateway จริง ครอบคลุม bundled
187
+ TypeScript AST parser, symbols/references/imports/routes/tests/dependencies, incremental
188
+ one-file parse, affected relations, exact-content move ที่รักษา `symbol://` identity,
189
+ syntax error, deleted/generated/secret/private files, pagination, cancel/concurrent run,
190
+ restart/corruption recovery, source-hash freshness, anonymous/read-only/revoked ACL,
191
+ workspace epoch, traversal/symlink/hardlink, principal-bound cursor และ target-specific
192
+ inspect approval โดยไม่ execute source หรือ repository plugin
193
+
194
+ Context Engine tests ใช้ HTTP + OAuth, direct Full และ Compact gateway จริง ครอบคลุม
195
+ goal/Thai+identifier terms, deterministic ranking/evidence IDs, byte budget, cursor,
196
+ L0–L6 cache hit/metrics, source-hash freshness transition, evidence recheck, active และ
197
+ federated A/B retrieval by ID/name, unavailable target partial result, anonymous/live
198
+ ACL/revocation, principal/workspace/cursor binding, secret/private-state/symlink guards,
199
+ repository instruction เป็น untrusted content, canonical signed cursor, cache corruption
200
+ recovery, Memory dependency freshness และ Runtime dependency freshness Fixture
201
+ baseline มี precision=1 และ recall=1 สำหรับ source/test/docs ที่กำหนด พร้อม term
202
+ coverage=1 และ latency ต่ำกว่า 5 วินาทีใน isolated local fixture (ไม่ใช่ production SLA)
203
+
204
+ Memory tests ใช้ HTTP + OAuth, Full/Compact assistance gateways และ authenticated
205
+ private owner IPC จริง ครอบคลุม evidence-bound proposal, exact digest approval,
206
+ CURRENT/STALE retrieval, Context `MEMORY` evidence, source change ก่อน/หลัง approval,
207
+ cross-client evidence isolation, live per-project ACL, explicit cross-project visibility,
208
+ duplicate/conflict review, credential-shaped text, repository prompt injection,
209
+ principal/workspace-bound canonical cursor, retention/prune ที่ไม่ลบ current record หรือ
210
+ project file, learning proposal จาก current reviewed memory, non-executable owner review
211
+ และ scrubbed owner audit
212
+
213
+ Runtime Intelligence tests ใช้ HTTP + OAuth และ Compact gateways จริง ครอบคลุม
214
+ durable session, nonblocking task start, completed-task reconnect หลัง server restart,
215
+ idempotent retry ที่ไม่สร้าง job ซ้ำ, cancel, wall timeout, close refusal ขณะ running,
216
+ process/test aggregate evidence, raw-output non-retention, guarded test-report counts,
217
+ snapshot staleness, Context `OBSERVATION`, deterministic diagnosis, anonymous/read-only/
218
+ revoked ACL, principal isolation, stale epoch, secret/traversal report path และ quota
219
+ Headless Chromium fixture พิสูจน์ existing-session-only collection, MCP image passthrough
220
+ persisted hashes/counts/bounded navigation timing, WebSocket-blocked policy และการ mark
221
+ หลักฐานเดิมเป็น stale หลังหน้าเปลี่ยน โดยไม่มี DOM/console/password/header text
222
+
223
+ Advanced Agent Runtime tests ใช้ HTTP + OAuth และ Compact gateways จริง ครอบคลุม
224
+ immutable plan revision, bounded hypotheses, overlapping intent refusal, managed
225
+ write/exec/read, metadata snapshot compare + original-journal rollback, current Runtime
226
+ evidence judgement, exact completion criteria, durable restart recovery และ private
227
+ owner skill review Security fixtures ครอบคลุม anonymous/read-only, principal isolation,
228
+ live ACL revoke, stale epoch, path capability + intent, secret/traversal/nested context,
229
+ program allowlist, target-bound inspect approval, hostile skill rejection และยืนยันว่า
230
+ cancel coordinator ไม่ kill owned job
231
+
232
+ Resource และ Project Brain cursor tests ตรวจ canonical Base64URL + HMAC ซ้ำ โดย token
233
+ ที่เปลี่ยนอักขระท้ายต้องได้ `INVALID_INPUT` แม้ decoder จะถอด non-canonical text เป็น
234
+ byte sequence เดียวกันได้
235
+
236
+ Headless Chromium fixture เปิด Local Config จริงที่ ephemeral loopback ports เพิ่ม
237
+ Project B ผ่าน UI, แสดงผลที่ desktop และ 390px, กดเปิดรายการ และตรวจว่า active
238
+ workspace เปลี่ยนเป็น canonical root B สำเร็จ ภาพอยู่ใน local ignored artifacts และ
239
+ ไม่ถูก pack การตรวจบน owner browser/config จริงยังคง `MANUAL_NOT_RUN`
240
+
241
+ ## Surface evidence
242
+
243
+ - Complete Full capability schema: 125 tools
244
+ - Full live default: 121 tools; owner opt-in Sub-agent exposure: 125
245
+ - Compact surface: 19 tools
246
+ - Hybrid surface: 49 tools
247
+ - generated schema metric: Full 443,030; Compact 52,317; Hybrid 124,657 bytes
248
+ - Compact schema เป็น catalog แยกและลด schema load ตอนเชื่อมต่อ
249
+ - Full schema อยู่ใน `schemas/tools.json`
250
+ - Compact schema อยู่ใน `schemas/tools.compact.json`
251
+ - Hybrid schema อยู่ใน `schemas/tools.hybrid.json`
252
+
253
+ ## DodoBench / release gate
254
+
255
+ DodoBench core v1 ใช้ isolated real HTTP + OAuth fixtures ประเมิน 7 เคสบนเครื่องที่มี
256
+ Chromium: retrieval A/B, safe edit, runtime diagnosis, image resource, restart recovery,
257
+ security boundaries และ browser image block ผลแต่ละรอบบันทึก revision/lock/config/OS,
258
+ tool calls, serialized bytes, p50/p95, precision/recall, wrong-file rate, cache hit และ
259
+ security violations โดย `modelTokens=null` เพราะไม่มี model call
260
+
261
+ Fresh release smoke ติดตั้ง exact tarball ใน temporary prefix เปิด Sub-agent exposure
262
+ แบบ explicit แล้วตรวจ CLI 1.0.0, STDIO Full 125, HTTP Streamable + OAuth Compact 19,
263
+ write/edit read-back และ Sub-agent receipt จริง ค่า default-off ถูกตรวจแยกใน STDIO/HTTP/
264
+ packaging regressions
265
+ Release policy ใช้ macOS local และ Linux Docker โดย report ต้องมี revision/lock digest
266
+ ตรงกันก่อน strict gate จะผ่าน Linux Docker image ติดตั้ง Playwright Chromium
267
+ Dedicated self-hosted GitHub Actions รัน Linux X64 Docker และ Windows X64 native
268
+ candidate บน Node 22/24 โดยไม่รับ untrusted pull requests Windows manual acceptance
269
+ ยังคง `MANUAL_NOT_RUN`
270
+
271
+ ## Required security scenarios
272
+
273
+ - anonymous HTTP request ได้ 401
274
+ - read-only scope เรียก write/exec ไม่ได้
275
+ - managed mode: token ที่ไม่มี workspace ACL ถูกปฏิเสธ; personal mode ยังต้องมี owner-registered target และ live scope
276
+ - workspace mismatch และ stale epoch ถูกปฏิเสธ
277
+ - secret, traversal, symlink และ hardlink guard fail closed
278
+ - inspect mode ยังคง target approval
279
+ - expected hash conflict ไม่ overwrite ไฟล์
280
+ - running jobs block workspace switch
281
+ - switch failure ทำให้ workspace เดิมใช้งานต่อได้
282
+ - gateway ไม่เรียก gateway อื่นหรือ owner controls
283
+ - federated target ที่ไม่มี ACL/installation identity ถูกปฏิเสธโดยไม่เผย path
284
+ - federated secret/traversal/replaced root fail closed และ write/exec federation ยังปิด
285
+ - memory proposal ใช้ evidence ID ข้าม client ไม่ได้และ source-changed proposal fail closed
286
+ - AI ไม่มี MCP operation สำหรับ memory approval/prune/learning review; owner action ใช้ private authenticated IPC + digest
287
+ - current memory ไม่ถูก prune และ learning approval ไม่ติดตั้ง/execute หรือ grant authority
288
+ - runtime handle ข้าม principal/workspace ไม่ได้, revoke มีผลทันที และ inspect exec ยังต้อง target-bound approval
289
+ - runtime evidence ไม่เก็บ raw process/browser secret และ changed source ถูก mark stale
290
+ - agent run ไม่เพิ่ม authority, managed target ตรวจ live ACL/epoch/scope/policy ซ้ำ และ path write ต้องมี capability + intent
291
+ - agent skill ที่ยังไม่ผ่าน exact private owner review ถูกซ่อนและไม่ executable
292
+ - agent coordinator cancel/pause ไม่ kill job และ restart ไม่ replay action
293
+
294
+ ## Packaging
295
+
296
+ ตรวจว่า tarball มี `dist`, `schemas`, `docs`, `README.md`, setup scripts และ native sources ตาม package policy และไม่มี state DB, OAuth credentials, tokens, models หรือ release temp files
297
+
298
+ ## Manual gates
299
+
300
+ การทดสอบผ่าน ChatGPT, Claude หรือเครื่อง Windows จริงต้องทำใน environment ของผู้ใช้และรายงานแยกเป็น `MANUAL_PASS` หรือ `MANUAL_NOT_RUN` ห้ามสรุปจาก catalog, macOS หรือ Linux Docker เพียงอย่างเดียว
301
+
302
+ สถานะ manual setup/import บน owner state จริง: `MANUAL_NOT_RUN` การตรวจรับใช้ isolated fixtures และ temporary package เท่านั้น ไม่มีการเปลี่ยน owner config, OAuth state, tunnel, DNS หรือ global installation
303
+
304
+ สถานะ real Cloudflare Tunnel บน macOS/Windows/Linux: `MANUAL_NOT_RUN`
305
+
306
+ สถานะ multi-project federation ผ่าน external AI และ owner project จริง: `MANUAL_NOT_RUN`
307
+
308
+ สถานะ owner-reviewed Memory ผ่าน external AI และ owner repository จริง: `MANUAL_NOT_RUN`
309
+
310
+ สถานะ Runtime Intelligence ผ่าน external AI และ owner repository จริง: `MANUAL_NOT_RUN`
311
+
312
+ สถานะ Advanced Agent Runtime ผ่าน external AI และ owner repository จริง: `MANUAL_NOT_RUN`