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