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