@xdxer/dingtalk-agent 0.1.4-beta.0 → 0.1.4-beta.10
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/CHANGELOG.md +50 -0
- package/README.en.md +397 -0
- package/README.md +497 -46
- package/dist/bin/dingtalk-agent.js +1162 -340
- package/dist/bin/dingtalk-agent.js.map +1 -1
- package/dist/src/actions.js +98 -14
- package/dist/src/actions.js.map +1 -1
- package/dist/src/agent-audit.js +460 -0
- package/dist/src/agent-audit.js.map +1 -0
- package/dist/src/agent-bindings.js +132 -0
- package/dist/src/agent-bindings.js.map +1 -0
- package/dist/src/agent-definition.js +182 -0
- package/dist/src/agent-definition.js.map +1 -0
- package/dist/src/agent-enhance.js +678 -0
- package/dist/src/agent-enhance.js.map +1 -0
- package/dist/src/bootstrap.js +125 -17
- package/dist/src/bootstrap.js.map +1 -1
- package/dist/src/config.js +1 -7
- package/dist/src/config.js.map +1 -1
- package/dist/src/development-workspace.js +729 -0
- package/dist/src/development-workspace.js.map +1 -0
- package/dist/src/doctor.js +20 -9
- package/dist/src/doctor.js.map +1 -1
- package/dist/src/dws.js +145 -0
- package/dist/src/dws.js.map +1 -1
- package/dist/src/eval-evidence.js +193 -0
- package/dist/src/eval-evidence.js.map +1 -0
- package/dist/src/init.js +1 -1
- package/dist/src/init.js.map +1 -1
- package/dist/src/invocation.js +36 -0
- package/dist/src/invocation.js.map +1 -0
- package/dist/src/lab.js +679 -0
- package/dist/src/lab.js.map +1 -0
- package/dist/src/lease.js +100 -0
- package/dist/src/lease.js.map +1 -0
- package/dist/src/memory/candidates.js +451 -0
- package/dist/src/memory/candidates.js.map +1 -0
- package/dist/src/memory/completion-evidence.js +536 -0
- package/dist/src/memory/completion-evidence.js.map +1 -0
- package/dist/src/memory/operational.js +263 -0
- package/dist/src/memory/operational.js.map +1 -0
- package/dist/src/memory/remote-state.js +478 -0
- package/dist/src/memory/remote-state.js.map +1 -0
- package/dist/src/memory/task-checkpoints.js +204 -0
- package/dist/src/memory/task-checkpoints.js.map +1 -0
- package/dist/src/multica-deploy.js +1480 -0
- package/dist/src/multica-deploy.js.map +1 -0
- package/dist/src/multica-provider.js +685 -0
- package/dist/src/multica-provider.js.map +1 -0
- package/dist/src/opencode-evals.js +1062 -0
- package/dist/src/opencode-evals.js.map +1 -0
- package/dist/src/opencode-provider.js +531 -0
- package/dist/src/opencode-provider.js.map +1 -0
- package/dist/src/opencode-workspace.js +197 -0
- package/dist/src/opencode-workspace.js.map +1 -0
- package/dist/src/perception.js +225 -0
- package/dist/src/perception.js.map +1 -0
- package/dist/src/personal-event-evals.js +595 -0
- package/dist/src/personal-event-evals.js.map +1 -0
- package/dist/src/promotion.js +786 -0
- package/dist/src/promotion.js.map +1 -0
- package/dist/src/remote-semantic-state-live-evals.js +888 -0
- package/dist/src/remote-semantic-state-live-evals.js.map +1 -0
- package/dist/src/remote-semantic-state-worker.js +38 -0
- package/dist/src/remote-semantic-state-worker.js.map +1 -0
- package/dist/src/remote-state-evals.js +501 -0
- package/dist/src/remote-state-evals.js.map +1 -0
- package/dist/src/response-gate.js +51 -0
- package/dist/src/response-gate.js.map +1 -0
- package/dist/src/robot-evals.js +770 -0
- package/dist/src/robot-evals.js.map +1 -0
- package/dist/src/sessions.js +66 -105
- package/dist/src/sessions.js.map +1 -1
- package/dist/src/setup.js +10 -9
- package/dist/src/setup.js.map +1 -1
- package/dist/src/skill-manager.js +102 -203
- package/dist/src/skill-manager.js.map +1 -1
- package/dist/src/skills.js.map +1 -1
- package/dist/src/storage-evals.js +26 -0
- package/dist/src/storage-evals.js.map +1 -0
- package/dist/src/types.js.map +1 -1
- package/dist/src/upgrade.js +137 -0
- package/dist/src/upgrade.js.map +1 -0
- package/dist/src/waits.js +5 -1
- package/dist/src/waits.js.map +1 -1
- package/dist/src/workspace.js +28 -3
- package/dist/src/workspace.js.map +1 -1
- package/docs/INSTALLATION.md +118 -13
- package/docs/SECOND-AGENT-ACCEPTANCE.md +62 -0
- package/docs/architecture/agent-memory-topology.png +0 -0
- package/docs/architecture/agent-memory-topology.svg +132 -0
- package/docs/architecture/general-agent-kernel-topology.png +0 -0
- package/docs/architecture/general-agent-kernel-topology.svg +149 -0
- package/docs/architecture/provider-bound-development-workspace.png +0 -0
- package/docs/architecture/provider-bound-development-workspace.svg +141 -0
- package/docs/architecture/task-completion-gate.png +0 -0
- package/docs/architecture/task-completion-gate.svg +191 -0
- package/docs/schemas/agent-audit-load-evidence.schema.json +14 -0
- package/docs/schemas/agent-audit.schema.json +92 -0
- package/docs/schemas/agent-bindings.schema.json +54 -0
- package/docs/schemas/agent-definition.schema.json +78 -0
- package/docs/schemas/agent-enhancement-plan.schema.json +88 -0
- package/docs/schemas/agent-enhancement-receipt.schema.json +37 -0
- package/docs/schemas/enriched-invocation.schema.json +46 -0
- package/docs/schemas/eval-candidate-plan.schema.json +28 -0
- package/docs/schemas/eval-candidate-result.schema.json +20 -0
- package/docs/schemas/eval-candidate.schema.json +30 -0
- package/docs/schemas/invocation.schema.json +19 -0
- package/docs/schemas/memory-candidate-proposal.schema.json +18 -0
- package/docs/schemas/memory-candidate.schema.json +76 -0
- package/docs/schemas/memory-publish-target.schema.json +25 -0
- package/docs/schemas/multica-deployment-list.schema.json +29 -0
- package/docs/schemas/multica-deployment-operation.schema.json +51 -0
- package/docs/schemas/multica-deployment-plan.schema.json +70 -0
- package/docs/schemas/multica-deployment-receipt.schema.json +87 -0
- package/docs/schemas/multica-deployment-status.schema.json +23 -0
- package/docs/schemas/multica-workspace-inspection.schema.json +77 -0
- package/docs/schemas/multica-workspace-plan.schema.json +68 -0
- package/docs/schemas/multica-workspace-resource-list.schema.json +27 -0
- package/docs/schemas/multica-workspace-status.schema.json +34 -0
- package/docs/schemas/observation.schema.json +21 -0
- package/docs/schemas/operational-memory-provider.schema.json +36 -0
- package/docs/schemas/operational-memory-record.schema.json +24 -0
- package/docs/schemas/perception-input.schema.json +56 -0
- package/docs/schemas/project.schema.json +112 -0
- package/docs/schemas/promotion-list.schema.json +36 -0
- package/docs/schemas/promotion-plan.schema.json +60 -0
- package/docs/schemas/promotion-policy.schema.json +29 -0
- package/docs/schemas/promotion-receipt.schema.json +43 -0
- package/docs/schemas/promotion-status.schema.json +23 -0
- package/docs/schemas/release-readiness.schema.json +65 -0
- package/docs/schemas/remote-semantic-state-live-eval.schema.json +60 -0
- package/docs/schemas/remote-semantic-state-manifest.schema.json +79 -0
- package/docs/schemas/remote-semantic-state-provider.schema.json +98 -0
- package/docs/schemas/response-gate.schema.json +20 -0
- package/docs/schemas/task-checkpoint.schema.json +71 -0
- package/docs/schemas/task-completion-evidence.schema.json +154 -0
- package/docs/schemas/workspace-doctor.schema.json +56 -0
- package/docs/schemas/workspace-state.schema.json +39 -0
- package/evals/baselines/2026-07-16/opencode-basic-010-completion-summary.json +123 -0
- package/evals/baselines/2026-07-16/opencode-basic-skill-required-summary.json +69 -0
- package/evals/baselines/2026-07-16/opencode-multi-surface-summary.json +63 -0
- package/evals/baselines/2026-07-16/remote-state-live-summary.json +70 -0
- package/evals/baselines/2026-07-17/agent-enhance-opencode-dogfood-summary.json +98 -0
- package/evals/baselines/2026-07-17/personal-event-live-readiness-summary.json +68 -0
- package/examples/agents/fde-coach/AGENTS.md +26 -0
- package/examples/agents/fde-coach/MEMORY.md +3 -0
- package/examples/agents/fde-coach/fields/default/field.json +24 -0
- package/examples/agents/fde-coach/knowledge/INDEX.md +4 -0
- package/examples/agents/fde-coach/skills/fde-coach/SKILL.md +13 -0
- package/examples/agents/release-manager/AGENTS.md +26 -0
- package/examples/agents/release-manager/MEMORY.md +3 -0
- package/examples/agents/release-manager/fields/default/field.json +24 -0
- package/examples/agents/release-manager/knowledge/INDEX.md +4 -0
- package/examples/agents/release-manager/skills/release-manager/SKILL.md +13 -0
- package/lab/README.md +109 -0
- package/lab/agent-eval/catalog.json +91 -0
- package/lab/agent-eval/classic-failures.json +177 -0
- package/lab/agent-eval/completion-gate-regression.json +99 -0
- package/lab/agent-eval/personal-event-live.example.json +94 -0
- package/lab/agent-eval/remote-semantic-state-live.example.json +70 -0
- package/lab/agent-eval/remote-semantic-state-provider.fixture.json +47 -0
- package/lab/agent-eval/remote-state-workspace/AGENTS.md +8 -0
- package/lab/agent-eval/remote-state-workspace/opencode.json +7 -0
- package/lab/agent-eval/remote-state-workspace/skills/remote-state-operator/SKILL.md +13 -0
- package/lab/agent-eval/remote-state.example.json +31 -0
- package/lab/agent-eval/workspace/AGENTS.md +7 -0
- package/lab/agent-eval/workspace/MEMORY.md +4 -0
- package/lab/agent-eval/workspace/artifacts/pending-review.md +3 -0
- package/lab/agent-eval/workspace/knowledge/INDEX.md +4 -0
- package/lab/agent-eval/workspace/opencode.json +20 -0
- package/lab/manifest.example.json +27 -0
- package/lab/manifest.personal-event.example.json +27 -0
- package/lab/project-workspace/README.md +11 -0
- package/lab/project-workspace/fake-multica-provider.mjs +266 -0
- package/lab/project-workspace/multica-deploy.fixture.json +29 -0
- package/lab/project-workspace/multica-readonly.fixture.json +69 -0
- package/lab/project-workspace/observation.fixture.json +14 -0
- package/lab/project-workspace/opencode-provider-suite.json +65 -0
- package/lab/project-workspace/project.fixture.json +44 -0
- package/lab/project-workspace/promotion-policy.fixture.json +15 -0
- package/lab/robot-eval/pool.example.json +30 -0
- package/lab/robot-eval/suite.json +123 -0
- package/lab/robot-eval/workspace/AGENTS.md +21 -0
- package/lab/robot-eval/workspace/MEMORY.md +3 -0
- package/lab/robot-eval/workspace/knowledge/INDEX.md +5 -0
- package/lab/robot-eval/workspace/opencode.json +22 -0
- package/lab/schemas/agent-eval-catalog.schema.json +47 -0
- package/lab/schemas/lab-manifest.schema.json +70 -0
- package/lab/schemas/personal-event-eval.schema.json +91 -0
- package/lab/schemas/remote-state-eval.schema.json +66 -0
- package/lab/schemas/robot-eval-suite.schema.json +184 -0
- package/lab/schemas/robot-pool.schema.json +56 -0
- package/package.json +26 -14
- package/skills/dingtalk-agent-boot-multica/SKILL.md +40 -0
- package/skills/dingtalk-agent-compose/SKILL.md +110 -0
- package/skills/dingtalk-agent-compose/assets/AGENTS.template.md +26 -0
- package/skills/dingtalk-agent-compose/assets/agent.bindings.dingtalk-doc.template.json +13 -0
- package/skills/dingtalk-agent-compose/assets/agent.bindings.local.template.json +13 -0
- package/skills/dingtalk-agent-compose/assets/opencode.template.json +12 -0
- package/skills/dingtalk-agent-compose/assets/role-skill.template.md +24 -0
- package/skills/dingtalk-agent-compose/evals/evals.json +94 -0
- package/skills/dingtalk-agent-compose/references/agent-definition-contract.md +55 -0
- package/skills/dingtalk-agent-compose/references/opencode-host-contract.md +65 -0
- package/skills/dingtalk-agent-compose/references/storage-routing.md +20 -0
- package/skills/dingtalk-agent-deploy/SKILL.md +60 -0
- package/skills/dingtalk-agent-deploy/references/multica-deployment-contract.md +49 -0
- package/skills/dingtalk-agent-deploy/references/promotion-observation-contract.md +49 -0
- package/skills/dingtalk-agent-eval/SKILL.md +116 -0
- package/skills/dingtalk-agent-eval/assets/eval-catalog.template.json +18 -0
- package/skills/dingtalk-agent-eval/evals/evals.json +61 -0
- package/skills/dingtalk-agent-eval/references/eval-topology.md +34 -0
- package/skills/dingtalk-agent-eval/references/evidence-contract.md +31 -0
- package/skills/dingtalk-agent-eval/references/scenario-taxonomy.md +25 -0
- package/skills/dingtalk-agent-eval/references/storage-modes.md +75 -0
- package/skills/dingtalk-basic-behavior/SKILL.md +63 -3
- package/skills/dingtalk-basic-behavior/assets/memory-candidate-proposal.json +10 -0
- package/skills/dingtalk-basic-behavior/assets/{task-checkpoint.md → task-checkpoint.json} +2 -21
- package/skills/dingtalk-basic-behavior/references/action-contract.md +2 -0
- package/skills/dingtalk-basic-behavior/references/memory-and-evolution.md +15 -1
- package/skills/dingtalk-basic-behavior/references/perception-and-gates.md +28 -0
- package/skills/dingtalk-basic-behavior/references/task-lifecycle.md +32 -7
- package/dist/src/boot.js +0 -70
- package/dist/src/boot.js.map +0 -1
- package/dist/src/duty.js +0 -74
- package/dist/src/duty.js.map +0 -1
- package/dist/src/kb.js +0 -240
- package/dist/src/kb.js.map +0 -1
- package/dist/src/runs.js +0 -79
- package/dist/src/runs.js.map +0 -1
- package/docs/ARCHITECTURE.md +0 -217
- package/docs/MINIMAL-WORKSPACE-V1.md +0 -172
- package/docs/OPEN-SOURCE-REFERENCES.md +0 -107
- package/docs/SELF-TEST.md +0 -252
- package/docs//345/206/205/347/275/221/345/256/236/347/233/270.md +0 -77
- package/evals/baselines/2026-07-14/behavior-summary.json +0 -28
- package/evals/baselines/2026-07-14/contract-summary.json +0 -18
- package/evals/baselines/2026-07-14/live-canary-summary.json +0 -25
- package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/SKILL.md +0 -72
- package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/action-contract.md +0 -31
- package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/event-to-behavior.md +0 -22
- package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/memory-and-evolution.md +0 -25
- package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/runtime-modes.md +0 -34
- package/evals/baselines/2026-07-15/task-lifecycle-summary.json +0 -50
- package/evals/evals.json +0 -316
- package/evals/fixtures/dm-ambiguous-send.json +0 -4
- package/evals/fixtures/dm-blocked.json +0 -4
- package/evals/fixtures/dm-clear.json +0 -4
- package/evals/fixtures/dm-discussion.json +0 -4
- package/evals/fixtures/dm-doc-write-no-tool.json +0 -4
- package/evals/fixtures/dm-long-task-ack.json +0 -4
- package/evals/fixtures/dm-nonblocking-gap.json +0 -4
- package/evals/fixtures/dm-structured-task.json +0 -4
- package/evals/fixtures/group.json +0 -10
- package/evals/fixtures/mentioned.json +0 -3
- package/evals/run-contract-evals.mjs +0 -1106
- package/evals/run-shadow-evals.mjs +0 -267
- package/evals/runners/README.md +0 -66
- package/evals/runners/claude-shadow.mjs +0 -533
- package/evals/schemas/action-request.schema.json +0 -77
- package/evals/shadow-evals.json +0 -133
- package/skills/AGENTS.md +0 -104
- package/skills//344/273/273/345/212/241.md +0 -48
- package/skills//345/237/272/347/241/200/350/241/214/344/270/272.md +0 -44
- package/skills//345/277/203/350/267/263.md +0 -79
- package/skills//346/266/210/346/201/257.md +0 -50
- package/skills//347/237/245/350/257/206.md +0 -55
- package/skills//350/257/204/346/265/213.md +0 -62
- package/skills//351/222/211/351/222/211.md +0 -64
- package/templates/ontology/index.md +0 -24
- package/templates/ontology/self/access.md +0 -38
- package/templates/ontology/self/role-spec.md +0 -34
- package/templates/ontology/self/workspace.md +0 -41
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"development-workspace.js","sourceRoot":"","sources":["../../src/development-workspace.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto'\nimport {\n existsSync, lstatSync, readFileSync, readdirSync, realpathSync, statSync,\n} from 'node:fs'\nimport { basename, dirname, join, parse, relative, resolve } from 'node:path'\nimport { findExecutable } from './doctor.js'\nimport { digest, stableStringify } from './events.js'\nimport { resolvePackageRoot } from './package-root.js'\nimport { loadWorkspace, workspacePath, type WorkspaceSpec } from './workspace.js'\n\nexport const PROJECT_FILE = 'dingtalk-agent.json'\nexport const CURRENT_WORKSPACE_FILE = '.dingtalk-agent/current-workspace'\nexport const WORKSPACE_STATE_ROOT = '.dingtalk-agent/state/workspaces'\nexport const LEGACY_WORKSPACE_NAME = 'legacy-prepared'\n\nexport type DevelopmentStage = 'dev' | 'test' | 'staging' | 'prod'\nexport type DeclaredProviderKind = 'opencode' | 'multica'\nexport type DevelopmentProviderKind = DeclaredProviderKind | 'local-prepared'\nexport type DevelopmentWorkspaceStatus =\n | 'declared' | 'resolving' | 'planned' | 'applying' | 'verifying'\n | 'ready' | 'drifted' | 'failed' | 'retired'\n\nexport interface OpenCodeProvider {\n kind: 'opencode'\n model: string\n}\n\nexport interface MulticaProvider {\n kind: 'multica'\n profile: string\n workspaceIdFrom: string\n runtimeIdFrom: string\n agentIdFrom?: string\n}\n\nexport interface WorkspaceStorage {\n memory: string\n knowledge: string\n artifacts?: string\n}\n\nexport interface WorkspaceAuthority {\n dwsProfileFrom: string\n expectedUserIdFrom: string\n}\n\nexport interface DeclaredWorkspace {\n stage: DevelopmentStage\n provider: OpenCodeProvider | MulticaProvider\n storage: WorkspaceStorage\n authority?: WorkspaceAuthority\n}\n\nexport interface AgentProjectManifest {\n $schema: 'dingtalk-agent/project@1'\n name: string\n dtaVersion: string\n agent: {\n definition: string\n skills: string[]\n }\n workspaces: Record<string, DeclaredWorkspace>\n}\n\nexport interface DevelopmentWorkspaceState {\n $schema: 'dingtalk-agent/workspace-state@1'\n workspace: string\n provider: DeclaredProviderKind\n status: DevelopmentWorkspaceStatus\n binding: Record<string, string>\n desiredHash: string\n observedHash: string\n lastPlanId: string\n lastReceiptId: string\n lastEvalId: string\n}\n\nexport interface DevelopmentWorkspaceView {\n name: string\n stage: DevelopmentStage\n provider: { kind: DevelopmentProviderKind } & Record<string, string>\n storage: Required<WorkspaceStorage>\n authority: WorkspaceAuthority | null\n sourceHash: string\n desiredHash: string\n observedHash: string\n status: DevelopmentWorkspaceStatus\n current: boolean\n legacy: boolean\n statePath: string\n state: DevelopmentWorkspaceState | null\n drift: string[]\n configSources: string[]\n}\n\nexport interface AgentProjectInfo {\n $schema: 'dingtalk-agent/info@1'\n root: string\n source: 'manifest' | 'legacy'\n manifest: string\n manifestHash: string\n project: {\n name: string\n dtaVersion: string\n compatibleWithCli: boolean\n definition: string\n skills: string[]\n }\n currentWorkspace: string\n workspaces: DevelopmentWorkspaceView[]\n sideEffect: false\n dingtalkSideEffect: false\n}\n\nexport interface DevelopmentWorkspaceCheck {\n id: string\n surface: 'project' | 'provider' | 'definition' | 'skills' | 'storage' | 'authority' | 'state'\n level: 'pass' | 'warn' | 'fail'\n blocking: boolean\n summary: string\n evidence: Record<string, unknown>\n fix?: string\n}\n\nexport interface DevelopmentWorkspaceDoctorReport {\n $schema: 'dingtalk-agent/workspace-doctor@1'\n ready: boolean\n workspace: string\n provider: DevelopmentProviderKind\n desiredHash: string\n observedHash: string\n status: DevelopmentWorkspaceStatus\n checks: DevelopmentWorkspaceCheck[]\n missing: string[]\n configSources: string[]\n sideEffect: false\n dingtalkSideEffect: false\n}\n\ninterface LoadedProject {\n root: string\n source: 'manifest' | 'legacy'\n manifestPath: string\n manifestHash: string\n manifest: AgentProjectManifest\n legacy: WorkspaceSpec | null\n}\n\nconst PROJECT_KEYS = new Set(['$schema', 'name', 'dtaVersion', 'agent', 'workspaces'])\nconst AGENT_KEYS = new Set(['definition', 'skills'])\nconst WORKSPACE_KEYS = new Set(['stage', 'provider', 'storage', 'authority'])\nconst OPENCODE_KEYS = new Set(['kind', 'model'])\nconst MULTICA_KEYS = new Set([\n 'kind', 'profile', 'workspaceIdFrom', 'runtimeIdFrom', 'agentIdFrom',\n])\nconst STORAGE_KEYS = new Set(['memory', 'knowledge', 'artifacts'])\nconst AUTHORITY_KEYS = new Set(['dwsProfileFrom', 'expectedUserIdFrom'])\nconst STATE_KEYS = new Set([\n '$schema', 'workspace', 'provider', 'status', 'binding', 'desiredHash', 'observedHash',\n 'lastPlanId', 'lastReceiptId', 'lastEvalId',\n])\nconst STATE_STATUSES = new Set<DevelopmentWorkspaceStatus>([\n 'declared', 'resolving', 'planned', 'applying', 'verifying',\n 'ready', 'drifted', 'failed', 'retired',\n])\nconst SECRET_KEY = /(?:secret|token|cookie|password|credentials?)$/i\nconst NAME = /^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$/\nconst ENV_REF = /^env:[A-Z_][A-Z0-9_]*$/\n\nexport function findAgentProjectRoot(start = process.cwd()): string | null {\n let directory = resolve(start)\n if (existsSync(directory) && !statSync(directory).isDirectory()) directory = dirname(directory)\n while (true) {\n if (existsSync(join(directory, PROJECT_FILE)) || existsSync(workspacePath(directory))) {\n return realpathSync(directory)\n }\n const parent = dirname(directory)\n if (parent === directory || directory === parse(directory).root) return null\n directory = parent\n }\n}\n\nexport function inspectAgentProject(\n start = process.cwd(), cliVersion = '',\n): AgentProjectInfo {\n const loaded = loadAgentProject(start)\n const currentWorkspace = readCurrentWorkspace(loaded.root)\n const declared = Object.entries(loaded.manifest.workspaces)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([name, workspace]) => declaredView(loaded, name, workspace, currentWorkspace))\n if (loaded.legacy && !(LEGACY_WORKSPACE_NAME in loaded.manifest.workspaces)) {\n declared.push(legacyView(loaded, loaded.legacy, currentWorkspace))\n }\n if (currentWorkspace && !declared.some((item) => item.name === currentWorkspace)) {\n throw new Error(`current-workspace 指向未知 Workspace: ${currentWorkspace}`)\n }\n return {\n $schema: 'dingtalk-agent/info@1',\n root: loaded.root,\n source: loaded.source,\n manifest: loaded.manifestPath ? relative(loaded.root, loaded.manifestPath) : '',\n manifestHash: loaded.manifestHash,\n project: {\n name: loaded.manifest.name,\n dtaVersion: loaded.manifest.dtaVersion,\n compatibleWithCli: !cliVersion || versionSatisfies(cliVersion, loaded.manifest.dtaVersion),\n definition: loaded.manifest.agent.definition,\n skills: [...loaded.manifest.agent.skills],\n },\n currentWorkspace,\n workspaces: declared,\n sideEffect: false,\n dingtalkSideEffect: false,\n }\n}\n\nexport function showDevelopmentWorkspace(\n start: string, name: string, cliVersion = '',\n): DevelopmentWorkspaceView {\n const info = inspectAgentProject(start, cliVersion)\n const workspace = info.workspaces.find((item) => item.name === name)\n if (!workspace) throw new Error(`Project 未声明 Workspace: ${name}`)\n return workspace\n}\n\nexport function doctorDevelopmentWorkspace(\n start: string,\n name: string,\n options: { cliVersion?: string; env?: NodeJS.ProcessEnv } = {},\n): DevelopmentWorkspaceDoctorReport {\n const cliVersion = options.cliVersion || ''\n const env = options.env || process.env\n const info = inspectAgentProject(start, cliVersion)\n const workspace = info.workspaces.find((item) => item.name === name)\n if (!workspace) throw new Error(`Project 未声明 Workspace: ${name}`)\n const checks: DevelopmentWorkspaceCheck[] = []\n const add = (\n id: string, surface: DevelopmentWorkspaceCheck['surface'], level: DevelopmentWorkspaceCheck['level'],\n blocking: boolean, summary: string, evidence: Record<string, unknown> = {}, fix?: string,\n ) => checks.push({ id, surface, level, blocking, summary, evidence, ...(fix ? { fix } : {}) })\n\n add('project.schema', 'project', 'pass', true, 'Project manifest/schema 可解析', {\n source: info.source, manifestHash: info.manifestHash,\n })\n add('project.version', 'project', info.project.compatibleWithCli ? 'pass' : 'fail', true,\n info.project.compatibleWithCli ? 'Project 声明兼容当前 dta 版本' : 'Project dtaVersion 与当前 CLI 不兼容',\n { required: info.project.dtaVersion, actual: cliVersion || 'unknown' },\n '升级 CLI,或在审阅兼容性后更新 dingtalk-agent.json#dtaVersion')\n\n const definition = inspectLocalFile(info.root, info.project.definition)\n add('definition.file', 'definition', definition.valid ? 'pass' : 'fail', true,\n definition.valid ? 'Agent Definition 位于 Project 内且可读' : 'Agent Definition 缺失、越界或不是文件',\n definition, `修复 ${info.project.definition}`)\n\n for (const [slot, uri] of Object.entries(workspace.storage)) {\n const local = inspectStorageRoute(info.root, uri)\n const blocking = !uri.startsWith('dingtalk-doc:') && !(workspace.legacy && slot === 'artifacts')\n add(`storage.${slot}`, 'storage', local.valid ? 'pass' : blocking ? 'fail' : 'warn', blocking,\n local.valid ? `${slot} Storage route 可解析`\n : uri.startsWith('dingtalk-doc:') ? `${slot} 是远端语义路由,W1 不执行 DWS 回读`\n : `${slot} 本地 Storage route 缺失或越界`,\n { route: uri, ...local }, local.fix)\n }\n\n if (workspace.state) {\n add('state.provider', 'state', workspace.drift.includes('provider') ? 'fail' : 'pass', true,\n workspace.drift.includes('provider') ? 'State Provider 与声明不一致' : 'State Provider 与声明一致',\n { declared: workspace.provider.kind, observed: workspace.state.provider })\n add('state.desired-hash', 'state', workspace.drift.includes('desiredHash') ? 'fail' : 'pass', true,\n workspace.drift.includes('desiredHash') ? 'State desiredHash 已漂移' : 'State desiredHash 与声明一致',\n { desiredHash: workspace.desiredHash, stateDesiredHash: workspace.state.desiredHash })\n add('state.status', 'state', workspace.state.status === 'ready' ? 'pass' : 'fail', true,\n workspace.state.status === 'ready' ? 'Provider state 已回读为 ready'\n : `Provider state 尚未 ready: ${workspace.state.status}`,\n { status: workspace.state.status })\n const observedHashValid = /^[a-f0-9]{64}$/.test(workspace.state.observedHash)\n add('state.observed-hash', 'state', observedHashValid ? 'pass' : 'fail', true,\n observedHashValid ? 'Provider observedHash 是稳定 sha256' : 'ready state 缺少有效 observedHash',\n { configured: Boolean(workspace.state.observedHash) })\n } else {\n const required = !workspace.legacy\n add('state.present', 'state', required ? 'fail' : 'warn', required,\n required ? '尚无 Provider 回读 state;Workspace 只完成声明,尚未就绪'\n : 'Legacy adapter 不要求新的 Provider state', {\n expectedPath: workspace.statePath,\n })\n }\n\n if (workspace.provider.kind === 'opencode') {\n inspectOpenCodeWorkspace(info, workspace, env, add)\n } else if (workspace.provider.kind === 'multica') {\n inspectDeclaredMulticaWorkspace(workspace, env, add)\n } else {\n add('provider.legacy', 'provider', 'pass', true,\n 'Legacy Prepared Workspace 已通过 workspace@1 parser 只读加载', {\n provider: workspace.provider.kind, state: 'adapter-only',\n })\n }\n\n const missing = checks.filter((check) => check.blocking && check.level !== 'pass')\n .map((check) => check.id)\n return {\n $schema: 'dingtalk-agent/workspace-doctor@1',\n ready: missing.length === 0,\n workspace: workspace.name,\n provider: workspace.provider.kind,\n desiredHash: workspace.desiredHash,\n observedHash: workspace.observedHash,\n status: workspace.status,\n checks,\n missing,\n configSources: workspace.configSources,\n sideEffect: false,\n dingtalkSideEffect: false,\n }\n}\n\nfunction loadAgentProject(start: string): LoadedProject {\n const root = findAgentProjectRoot(start)\n if (!root) {\n throw new Error(`找不到 ${PROJECT_FILE} 或 ${workspacePath('<project>')};请在 Agent Project 内运行`)\n }\n const manifestPath = join(root, PROJECT_FILE)\n const legacyPath = workspacePath(root)\n if (existsSync(legacyPath) && (\n lstatSync(legacyPath).isSymbolicLink() || !isInside(root, realpathSync(legacyPath))\n )) {\n throw new Error('Legacy workspace manifest 不能是越界符号链接')\n }\n const legacy = existsSync(legacyPath) ? loadWorkspace(root) : null\n if (!existsSync(manifestPath)) {\n if (!legacy) throw new Error(`找不到 ${PROJECT_FILE}`)\n const manifest = syntheticLegacyProject(root, legacy)\n return {\n root, source: 'legacy', manifestPath: '', manifest,\n manifestHash: digest(stableStringify(manifest)), legacy,\n }\n }\n if (lstatSync(manifestPath).isSymbolicLink()) {\n throw new Error(`${PROJECT_FILE} 不能是符号链接`)\n }\n let raw: unknown\n let source = ''\n try {\n source = readFileSync(manifestPath, 'utf8')\n raw = JSON.parse(source)\n } catch (error) {\n throw new Error(`${PROJECT_FILE} 不是合法 JSON: ${error.message}`)\n }\n rejectSecretLikeKeys(raw, PROJECT_FILE)\n const manifest = validateProjectManifest(raw, root)\n return {\n root, source: 'manifest', manifestPath: realpathSync(manifestPath), manifest,\n manifestHash: digest(stableStringify(manifest)), legacy,\n }\n}\n\nfunction validateProjectManifest(value: unknown, root: string): AgentProjectManifest {\n const input = objectValue(value, 'Project manifest')\n assertExactKeys(input, PROJECT_KEYS, 'Project manifest')\n if (input.$schema !== 'dingtalk-agent/project@1') {\n throw new Error('Project manifest 缺少 dingtalk-agent/project@1 schema')\n }\n const name = stableName(input.name, 'Project name')\n const dtaVersion = requiredString(input.dtaVersion, 'dtaVersion')\n const agentInput = objectValue(input.agent, 'Project agent')\n assertExactKeys(agentInput, AGENT_KEYS, 'Project agent')\n const definition = safeRelativePath(root, requiredString(agentInput.definition, 'agent.definition'),\n 'agent.definition', false)\n if (!Array.isArray(agentInput.skills) || agentInput.skills.length === 0) {\n throw new Error('agent.skills 必须是非空 string[]')\n }\n const skills = agentInput.skills.map((item, index) => stableName(item, `agent.skills[${index}]`))\n if (new Set(skills).size !== skills.length) throw new Error('agent.skills 不能包含重复项')\n if (!skills.includes('dingtalk-basic-behavior')) {\n throw new Error('agent.skills 必须显式包含 dingtalk-basic-behavior')\n }\n const workspaceInput = objectValue(input.workspaces, 'Project workspaces')\n const workspaces: Record<string, DeclaredWorkspace> = {}\n for (const [workspaceName, rawWorkspace] of Object.entries(workspaceInput)) {\n stableName(workspaceName, `Workspace name ${workspaceName}`)\n if (workspaceName === LEGACY_WORKSPACE_NAME) {\n throw new Error(`${LEGACY_WORKSPACE_NAME} 是 legacy adapter 保留名称`)\n }\n workspaces[workspaceName] = validateDeclaredWorkspace(rawWorkspace, root, workspaceName)\n }\n return {\n $schema: 'dingtalk-agent/project@1', name, dtaVersion,\n agent: { definition, skills }, workspaces,\n }\n}\n\nfunction validateDeclaredWorkspace(value: unknown, root: string, name: string): DeclaredWorkspace {\n const input = objectValue(value, `Workspace ${name}`)\n assertAllowedKeys(input, WORKSPACE_KEYS, `Workspace ${name}`)\n for (const required of ['stage', 'provider', 'storage']) {\n if (!(required in input)) throw new Error(`Workspace ${name} 缺少字段: ${required}`)\n }\n const stage = requiredString(input.stage, `Workspace ${name}.stage`) as DevelopmentStage\n if (!['dev', 'test', 'staging', 'prod'].includes(stage)) {\n throw new Error(`Workspace ${name}.stage 非法: ${stage}`)\n }\n const providerInput = objectValue(input.provider, `Workspace ${name}.provider`)\n const kind = requiredString(providerInput.kind, `Workspace ${name}.provider.kind`)\n let provider: OpenCodeProvider | MulticaProvider\n if (kind === 'opencode') {\n assertExactKeys(providerInput, OPENCODE_KEYS, `Workspace ${name}.provider`)\n provider = { kind, model: requiredString(providerInput.model, `Workspace ${name}.provider.model`) }\n } else if (kind === 'multica') {\n assertAllowedKeys(providerInput, MULTICA_KEYS, `Workspace ${name}.provider`)\n for (const required of ['kind', 'profile', 'workspaceIdFrom', 'runtimeIdFrom']) {\n if (!(required in providerInput)) {\n throw new Error(`Workspace ${name}.provider 缺少字段: ${required}`)\n }\n }\n provider = {\n kind,\n profile: requiredString(providerInput.profile, `Workspace ${name}.provider.profile`),\n workspaceIdFrom: envReference(providerInput.workspaceIdFrom, `${name}.workspaceIdFrom`),\n runtimeIdFrom: envReference(providerInput.runtimeIdFrom, `${name}.runtimeIdFrom`),\n ...(providerInput.agentIdFrom === undefined ? {} : {\n agentIdFrom: envReference(providerInput.agentIdFrom, `${name}.agentIdFrom`),\n }),\n }\n } else {\n throw new Error(`Workspace ${name}.provider.kind 只支持 opencode / multica`)\n }\n const storageInput = objectValue(input.storage, `Workspace ${name}.storage`)\n assertAllowedKeys(storageInput, STORAGE_KEYS, `Workspace ${name}.storage`)\n const memory = storageRoute(storageInput.memory, ['local-md', 'dingtalk-doc'], `${name}.memory`, root)\n const knowledge = storageRoute(\n storageInput.knowledge, ['local-md', 'dingtalk-doc'], `${name}.knowledge`, root,\n )\n const artifacts = storageInput.artifacts === undefined ? undefined\n : storageRoute(storageInput.artifacts, ['local-dir'], `${name}.artifacts`, root)\n let authority: WorkspaceAuthority | undefined\n if (input.authority !== undefined) {\n const authorityInput = objectValue(input.authority, `Workspace ${name}.authority`)\n assertExactKeys(authorityInput, AUTHORITY_KEYS, `Workspace ${name}.authority`)\n authority = {\n dwsProfileFrom: envReference(authorityInput.dwsProfileFrom, `${name}.dwsProfileFrom`),\n expectedUserIdFrom: envReference(\n authorityInput.expectedUserIdFrom, `${name}.expectedUserIdFrom`,\n ),\n }\n }\n if (provider.kind === 'multica' && !authority) {\n throw new Error(`Workspace ${name} 的 multica Provider 必须声明 authority env 来源`)\n }\n return { stage, provider, storage: { memory, knowledge, ...(artifacts ? { artifacts } : {}) },\n ...(authority ? { authority } : {}) }\n}\n\nfunction declaredView(\n loaded: LoadedProject,\n name: string,\n workspace: DeclaredWorkspace,\n currentWorkspace: string,\n): DevelopmentWorkspaceView {\n const artifacts = workspace.storage.artifacts ||\n `local-dir:.dingtalk-agent/artifacts/${name}`\n const storage: Required<WorkspaceStorage> = { ...workspace.storage, artifacts }\n const sourceHash = projectSourceHash(loaded.root, loaded.manifest)\n const desiredHash = digest(stableStringify({\n project: loaded.manifest.name,\n agent: loaded.manifest.agent,\n workspace: name,\n stage: workspace.stage,\n provider: workspace.provider,\n storage,\n authority: workspace.authority || null,\n sourceHash,\n }))\n const statePath = join(loaded.root, WORKSPACE_STATE_ROOT, `${name}.json`)\n const state = existsSync(statePath)\n ? loadDevelopmentWorkspaceState(statePath, name, loaded.root) : null\n const drift: string[] = []\n if (state && state.provider !== workspace.provider.kind) drift.push('provider')\n if (state && state.desiredHash !== desiredHash) drift.push('desiredHash')\n const status: DevelopmentWorkspaceStatus = drift.length ? 'drifted' : state?.status || 'declared'\n return {\n name,\n stage: workspace.stage,\n provider: { ...workspace.provider },\n storage,\n authority: workspace.authority || null,\n sourceHash,\n desiredHash,\n observedHash: state?.observedHash || '',\n status,\n current: currentWorkspace === name,\n legacy: false,\n statePath: relative(loaded.root, statePath),\n state,\n drift,\n configSources: collectConfigSources(workspace),\n }\n}\n\nfunction legacyView(\n loaded: LoadedProject, spec: WorkspaceSpec, currentWorkspace: string,\n): DevelopmentWorkspaceView {\n const storage: Required<WorkspaceStorage> = {\n memory: spec.mounts.memory,\n knowledge: spec.mounts.knowledge,\n artifacts: 'local-dir:.dingtalk-agent/artifacts/legacy-prepared',\n }\n const desiredHash = digest(stableStringify({ provider: 'local-prepared', workspace: spec }))\n return {\n name: LEGACY_WORKSPACE_NAME,\n stage: 'dev',\n provider: { kind: 'local-prepared', contextId: spec.contextId, fieldId: spec.fieldId },\n storage,\n authority: spec.dws.profile || spec.dws.expectedUserId ? {\n dwsProfileFrom: 'legacy:workspace.dws.profile',\n expectedUserIdFrom: 'legacy:workspace.dws.expectedUserId',\n } : null,\n sourceHash: digest(stableStringify({ definition: spec.mounts.profile, skills: spec.skills })),\n desiredHash,\n observedHash: desiredHash,\n status: 'ready',\n current: currentWorkspace === LEGACY_WORKSPACE_NAME,\n legacy: true,\n statePath: relative(loaded.root, workspacePath(loaded.root)),\n state: null,\n drift: [],\n configSources: ['legacy:.dingtalk-agent/workspace.json'],\n }\n}\n\nfunction projectSourceHash(root: string, manifest: AgentProjectManifest): string {\n const sources: Record<string, string> = {\n definition: localContentHash(root, manifest.agent.definition),\n opencode: localContentHash(root, 'opencode.json'),\n }\n for (const name of manifest.agent.skills) {\n const ref = name === 'dingtalk-basic-behavior'\n ? `.agents/skills/${name}` : `skills/${name}`\n sources[`skill:${name}`] = localContentHash(root, ref)\n const exposure = `.agents/skills/${name}`\n sources[`exposure:${name}`] = localContentHash(root, exposure)\n }\n return digest(stableStringify(sources))\n}\n\nfunction localContentHash(root: string, ref: string): string {\n const candidate = resolve(root, ref)\n if (!isInside(root, candidate) || !existsSync(candidate)) return ''\n const actual = realpathSync(candidate)\n if (!isInside(root, actual)) throw new Error(`Project source 真实路径越界: ${ref}`)\n const stat = lstatSync(actual)\n if (stat.isSymbolicLink()) throw new Error(`Project source 不允许符号链接: ${ref}`)\n if (stat.isFile()) return sha256(readFileSync(actual))\n if (!stat.isDirectory()) throw new Error(`Project source 类型非法: ${ref}`)\n const entries: Array<{ path: string; hash: string }> = []\n const visit = (directory: string, prefix = ''): void => {\n for (const entry of readdirSorted(directory)) {\n const path = join(directory, entry.name)\n const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name\n if (entry.isSymbolicLink()) throw new Error(`Project source 不允许符号链接: ${ref}/${relativePath}`)\n if (entry.isDirectory()) visit(path, relativePath)\n else if (entry.isFile()) entries.push({ path: relativePath, hash: sha256(readFileSync(path)) })\n else throw new Error(`Project source 类型非法: ${ref}/${relativePath}`)\n }\n }\n visit(actual)\n return digest(stableStringify(entries))\n}\n\nfunction readdirSorted(directory: string): import('node:fs').Dirent[] {\n return readdirSync(directory, { withFileTypes: true })\n .sort((a, b) => a.name.localeCompare(b.name))\n}\n\nfunction sha256(value: string | Buffer): string {\n return createHash('sha256').update(value).digest('hex')\n}\n\nfunction loadDevelopmentWorkspaceState(\n path: string, workspace: string, root: string,\n): DevelopmentWorkspaceState {\n if (lstatSync(path).isSymbolicLink()) throw new Error(`Workspace state 不能是符号链接: ${path}`)\n if (!isInside(root, realpathSync(path))) throw new Error(`Workspace state 真实路径越出 Project: ${path}`)\n let raw: unknown\n try { raw = JSON.parse(readFileSync(path, 'utf8')) }\n catch (error) { throw new Error(`Workspace state 不是合法 JSON: ${error.message}`) }\n rejectSecretLikeKeys(raw, 'Workspace state')\n const input = objectValue(raw, 'Workspace state')\n assertExactKeys(input, STATE_KEYS, 'Workspace state')\n if (input.$schema !== 'dingtalk-agent/workspace-state@1') {\n throw new Error('Workspace state 缺少 dingtalk-agent/workspace-state@1 schema')\n }\n if (input.workspace !== workspace) {\n throw new Error(`Workspace state 名称不一致: ${String(input.workspace)} != ${workspace}`)\n }\n const provider = requiredString(input.provider, 'Workspace state provider') as DeclaredProviderKind\n if (!['opencode', 'multica'].includes(provider)) throw new Error(`Workspace state provider 非法: ${provider}`)\n const status = requiredString(input.status, 'Workspace state status') as DevelopmentWorkspaceStatus\n if (!STATE_STATUSES.has(status)) throw new Error(`Workspace state status 非法: ${status}`)\n const bindingInput = objectValue(input.binding, 'Workspace state binding')\n const binding = Object.fromEntries(Object.entries(bindingInput).map(([key, item]) => [\n key, optionalString(item, `Workspace state binding.${key}`),\n ]))\n return {\n $schema: 'dingtalk-agent/workspace-state@1', workspace, provider, status, binding,\n desiredHash: requiredString(input.desiredHash, 'Workspace state desiredHash'),\n observedHash: optionalString(input.observedHash, 'Workspace state observedHash'),\n lastPlanId: optionalString(input.lastPlanId, 'Workspace state lastPlanId'),\n lastReceiptId: optionalString(input.lastReceiptId, 'Workspace state lastReceiptId'),\n lastEvalId: optionalString(input.lastEvalId, 'Workspace state lastEvalId'),\n }\n}\n\nfunction inspectOpenCodeWorkspace(\n info: AgentProjectInfo,\n workspace: DevelopmentWorkspaceView,\n env: NodeJS.ProcessEnv,\n add: (\n id: string, surface: DevelopmentWorkspaceCheck['surface'], level: DevelopmentWorkspaceCheck['level'],\n blocking: boolean, summary: string, evidence?: Record<string, unknown>, fix?: string,\n ) => void,\n): void {\n const executable = findExecutable('opencode', env)\n add('provider.opencode-cli', 'provider', executable ? 'pass' : 'fail', true,\n executable ? 'OpenCode CLI 可执行' : 'PATH 找不到 opencode',\n { executable: executable || '' }, '安装 OpenCode,并确认 opencode --version 可执行')\n add('provider.opencode-model', 'provider', workspace.provider.model ? 'pass' : 'fail', true,\n workspace.provider.model ? 'OpenCode model 已显式声明' : 'OpenCode model 缺失',\n { model: workspace.provider.model || '' })\n\n const basicPath = '.agents/skills/dingtalk-basic-behavior/SKILL.md'\n const basic = inspectLocalFile(info.root, basicPath)\n const canonicalBasic = inspectLocalFile(\n resolvePackageRoot(import.meta.url), 'skills/dingtalk-basic-behavior/SKILL.md',\n )\n const basicMatched = basic.valid && canonicalBasic.valid && basic.hash === canonicalBasic.hash\n add('skills.basic-exposure', 'skills', basicMatched ? 'pass' : 'fail', true,\n basicMatched ? 'Basic Skill exposure 与当前 canonical source 一致'\n : 'Basic Skill exposure 缺失、越界或 hash 漂移',\n { exposure: basic, canonicalHash: canonicalBasic.hash || '' }, `重新物化 ${basicPath}`)\n const configPath = join(info.root, 'opencode.json')\n const configFile = inspectLocalFile(info.root, 'opencode.json')\n let configError = ''\n let instructionCount = 0\n let permission = ''\n let permissions: Record<string, string> = {}\n if (configFile.valid) {\n try {\n const config = JSON.parse(readFileSync(configPath, 'utf8')) as Record<string, any>\n const instructions = Array.isArray(config.instructions) ? config.instructions : []\n instructionCount = instructions.filter((item) => item === basicPath).length\n const skillPermissions = config.permission?.skill\n permissions = skillPermissions && typeof skillPermissions === 'object' &&\n !Array.isArray(skillPermissions)\n ? Object.fromEntries(Object.entries(skillPermissions).map(([key, value]) => [key, String(value)]))\n : {}\n permission = permissions['dingtalk-basic-behavior'] || ''\n } catch (error) { configError = error.message }\n } else configError = configFile.exists ? 'outside-or-not-file' : 'missing'\n const configValid = !configError && instructionCount === 1 && permission === 'allow'\n add('skills.basic-instruction', 'skills', configValid ? 'pass' : 'fail', true,\n configValid ? 'OpenCode config 强制加载且允许 Basic Skill' : 'OpenCode Basic instruction/permission 合同不完整',\n { path: 'opencode.json', error: configError, instructionCount, permission },\n '运行 compose/bind 流程生成唯一 Basic instruction 与 allow permission')\n\n for (const name of info.project.skills.filter((item) => item !== 'dingtalk-basic-behavior')) {\n const source = inspectLocalFile(info.root, `skills/${name}/SKILL.md`)\n const exposure = inspectLocalFile(info.root, `.agents/skills/${name}/SKILL.md`)\n const matched = source.valid && exposure.valid && source.hash === exposure.hash &&\n permissions[name] === 'allow'\n add(`skills.role.${name}`, 'skills', matched ? 'pass' : 'fail', true,\n matched ? `Role Skill ${name} source/exposure hash 与 permission 一致`\n : `Role Skill ${name} source、exposure hash 或 permission 不一致`,\n { source, exposure, permission: permissions[name] || '' }, `运行 compose/bind 流程物化 ${name}`)\n }\n const managedRef = workspace.state?.binding.managedPath || ''\n if (managedRef) {\n const managedHash = localContentHash(info.root, managedRef)\n const matched = Boolean(managedHash && managedHash === workspace.state?.observedHash &&\n workspace.state?.binding.sourceHash === workspace.sourceHash &&\n workspace.state?.binding.model === workspace.provider.model)\n add('provider.managed-integrity', 'provider', matched ? 'pass' : 'fail', true,\n matched ? 'Managed Workspace、source/model 与 observed hash 一致'\n : 'Managed Workspace 缺失或 source/model/observed hash 漂移', {\n path: managedRef,\n actualHash: managedHash,\n expectedHash: workspace.state?.observedHash || '',\n sourceMatched: workspace.state?.binding.sourceHash === workspace.sourceHash,\n modelMatched: workspace.state?.binding.model === workspace.provider.model,\n }, `重新执行 dta workspace create ${workspace.name} --yes`)\n }\n const loadVerified = workspace.state?.status === 'ready' && Boolean(\n workspace.state.lastReceiptId || workspace.state.lastEvalId)\n add('provider.load-proof', 'provider', loadVerified ? 'pass' : 'warn', false,\n loadVerified\n ? 'Provider state 已绑定通过的随机 load/eval 证据;详情见 lastReceiptId/lastEvalId'\n : '尚未取得随机 load probe;先执行 workspace run/eval', {\n executed: Boolean(workspace.state?.lastReceiptId || workspace.state?.lastEvalId),\n lastReceiptId: workspace.state?.lastReceiptId || '',\n lastEvalId: workspace.state?.lastEvalId || '',\n })\n}\n\nfunction inspectDeclaredMulticaWorkspace(\n workspace: DevelopmentWorkspaceView,\n env: NodeJS.ProcessEnv,\n add: (\n id: string, surface: DevelopmentWorkspaceCheck['surface'], level: DevelopmentWorkspaceCheck['level'],\n blocking: boolean, summary: string, evidence?: Record<string, unknown>, fix?: string,\n ) => void,\n): void {\n const executable = findExecutable('multica', env)\n add('provider.multica-cli', 'provider', executable ? 'pass' : 'fail', true,\n executable ? 'Multica CLI 可执行' : 'PATH 找不到 multica;仅当前 Multica Workspace 不就绪',\n { executable: executable || '' }, '安装 Multica CLI;其他 Provider Workspace 不受影响')\n const refs = [\n ['workspace-id', workspace.provider.workspaceIdFrom],\n ['runtime-id', workspace.provider.runtimeIdFrom],\n ['dws-profile', workspace.authority?.dwsProfileFrom || ''],\n ['expected-user-id', workspace.authority?.expectedUserIdFrom || ''],\n ] as const\n for (const [id, ref] of refs) {\n const variable = ref.startsWith('env:') ? ref.slice(4) : ''\n const configured = Boolean(variable && env[variable])\n add(`authority.${id}`, 'authority', configured ? 'pass' : 'fail', true,\n configured ? `${id} 来源已解析` : `${id} 环境来源未设置`,\n { source: ref, configured }, `设置 ${ref || '<missing-env-ref>'}`)\n }\n const agentRef = workspace.provider.agentIdFrom || ''\n const agentVariable = agentRef.startsWith('env:') ? agentRef.slice(4) : ''\n const agentConfigured = Boolean(agentVariable && env[agentVariable])\n add('authority.agent-id', 'authority', agentRef && agentConfigured ? 'pass' : 'warn', false,\n agentRef\n ? agentConfigured ? 'agent-id 可信来源已解析' : 'agent-id 来源未设置;只允许列候选,不按名称绑定'\n : '未声明 agent-id;W3 只列候选,W4 create 后必须保存稳定 ID',\n { source: agentRef, configured: agentConfigured },\n agentRef ? `设置 ${agentRef}` : '已有 Agent 时声明 provider.agentIdFrom;新 Agent 由 W4 apply 保存 ID')\n const inspectionId = workspace.state?.binding.inspectionId || ''\n add('provider.remote-inspect', 'provider', 'warn', false,\n inspectionId\n ? '已有脱敏 Multica 只读 inspection;W4 load/smoke 前仍不能 ready'\n : '尚未运行 Multica 只读 inspection;不会创建或更新远端资源', {\n executed: Boolean(inspectionId), inspectionId, remoteWrite: false,\n })\n}\n\nfunction inspectStorageRoute(root: string, uri: string): Record<string, any> {\n if (uri.startsWith('dingtalk-doc:')) {\n return { valid: false, provider: 'dingtalk-doc', local: false, checked: false }\n }\n const separator = uri.indexOf(':')\n const provider = uri.slice(0, separator)\n const ref = uri.slice(separator + 1)\n const inspected = provider === 'local-md'\n ? inspectLocalFile(root, ref)\n : inspectLocalDirectory(root, ref)\n return { ...inspected, provider, local: true, checked: true }\n}\n\nfunction inspectLocalFile(root: string, ref: string): Record<string, any> {\n const inspected = inspectLocalPath(root, ref)\n const valid = inspected.inside && inspected.exists && inspected.type === 'file'\n return { ...inspected, valid, fix: valid ? undefined : `创建 Project 内文件 ${ref}` }\n}\n\nfunction inspectLocalDirectory(root: string, ref: string): Record<string, any> {\n const inspected = inspectLocalPath(root, ref)\n const valid = inspected.inside && inspected.exists && inspected.type === 'directory'\n return { ...inspected, valid, fix: valid ? undefined : `创建 Project 内目录 ${ref}` }\n}\n\nfunction inspectLocalPath(root: string, ref: string): Record<string, unknown> {\n const candidate = resolve(root, ref)\n const inside = isInside(root, candidate)\n if (!inside || !existsSync(candidate)) {\n return { path: ref, inside, exists: false, type: 'missing' }\n }\n const actual = realpathSync(candidate)\n const actualInside = isInside(root, actual)\n const stat = statSync(actual)\n return {\n path: relative(root, actual), inside: actualInside, exists: true,\n type: stat.isFile() ? 'file' : stat.isDirectory() ? 'directory' : 'other',\n ...(stat.isFile() && actualInside ? { hash: digest(readFileSync(actual, 'utf8')) } : {}),\n }\n}\n\nfunction syntheticLegacyProject(root: string, workspace: WorkspaceSpec): AgentProjectManifest {\n const definition = workspace.mounts.profile.startsWith('local-md:')\n ? workspace.mounts.profile.slice('local-md:'.length) : 'WORKSPACE.md'\n return {\n $schema: 'dingtalk-agent/project@1',\n name: stableName(basename(root) || 'legacy-agent', 'Legacy Project name'),\n dtaVersion: '*',\n agent: { definition, skills: [...workspace.skills] },\n workspaces: {},\n }\n}\n\nfunction readCurrentWorkspace(root: string): string {\n const path = join(root, CURRENT_WORKSPACE_FILE)\n if (!existsSync(path)) return ''\n if (lstatSync(path).isSymbolicLink()) throw new Error('current-workspace 不能是符号链接')\n if (!isInside(root, realpathSync(path))) throw new Error('current-workspace 真实路径越出 Project')\n const value = readFileSync(path, 'utf8').trim()\n return value ? stableName(value, 'current-workspace') : ''\n}\n\nfunction collectConfigSources(workspace: DeclaredWorkspace): string[] {\n const sources = [\n `manifest:provider.kind=${workspace.provider.kind}`,\n `manifest:stage=${workspace.stage}`,\n ]\n if (workspace.provider.kind === 'opencode') sources.push('manifest:provider.model')\n else sources.push(\n 'manifest:provider.profile', workspace.provider.workspaceIdFrom, workspace.provider.runtimeIdFrom,\n ...(workspace.provider.agentIdFrom ? [workspace.provider.agentIdFrom] : []),\n )\n if (workspace.authority) sources.push(\n workspace.authority.dwsProfileFrom, workspace.authority.expectedUserIdFrom,\n )\n return [...new Set(sources)]\n}\n\nfunction storageRoute(\n value: unknown, providers: string[], label: string, root: string,\n): string {\n const text = requiredString(value, label)\n const separator = text.indexOf(':')\n const provider = separator < 0 ? '' : text.slice(0, separator)\n const ref = separator < 0 ? '' : text.slice(separator + 1).trim()\n if (!providers.includes(provider) || !ref) {\n throw new Error(`${label} Storage 非法;允许 ${providers.map((item) => `${item}:<ref>`).join(' / ')}`)\n }\n if (provider.startsWith('local-')) safeRelativePath(root, ref, label, true)\n return `${provider}:${ref}`\n}\n\nfunction safeRelativePath(root: string, input: string, label: string, allowMissing: boolean): string {\n if (input.includes('\\0')) throw new Error(`${label} 包含 NUL`) // defensive for non-POSIX callers\n const candidate = resolve(root, input)\n if (!isInside(root, candidate) || candidate === root) throw new Error(`${label} 必须位于 Project 内: ${input}`)\n if (existsSync(candidate)) {\n const actual = realpathSync(candidate)\n if (!isInside(root, actual)) throw new Error(`${label} 真实路径越出 Project: ${input}`)\n } else if (!allowMissing && !isInside(root, candidate)) {\n throw new Error(`${label} 越出 Project: ${input}`)\n }\n return relative(root, candidate).split('\\\\').join('/')\n}\n\nfunction envReference(value: unknown, label: string): string {\n const text = requiredString(value, label)\n if (!ENV_REF.test(text)) throw new Error(`${label} 必须是 env:UPPER_CASE_VAR 引用`)\n return text\n}\n\nfunction stableName(value: unknown, label: string): string {\n const text = requiredString(value, label)\n if (!NAME.test(text)) throw new Error(`${label} 非法: ${text}`)\n return text\n}\n\nfunction requiredString(value: unknown, label: string): string {\n if (typeof value !== 'string' || !value.trim()) throw new Error(`${label} 必须是非空字符串`)\n return value.trim()\n}\n\nfunction optionalString(value: unknown, label: string): string {\n if (typeof value !== 'string') throw new Error(`${label} 必须是字符串`)\n return value.trim()\n}\n\nfunction objectValue(value: unknown, label: string): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`${label} 必须是 JSON object`)\n }\n return value as Record<string, unknown>\n}\n\nfunction assertExactKeys(value: Record<string, unknown>, allowed: Set<string>, label: string): void {\n assertAllowedKeys(value, allowed, label)\n const missing = [...allowed].filter((key) => !(key in value))\n if (missing.length) throw new Error(`${label} 缺少字段: ${missing.join(', ')}`)\n}\n\nfunction assertAllowedKeys(value: Record<string, unknown>, allowed: Set<string>, label: string): void {\n const unknown = Object.keys(value).filter((key) => !allowed.has(key))\n if (unknown.length) throw new Error(`${label} 包含未知字段: ${unknown.join(', ')}`)\n}\n\nfunction rejectSecretLikeKeys(value: unknown, label: string, path: string[] = []): void {\n if (Array.isArray(value)) {\n value.forEach((item, index) => rejectSecretLikeKeys(item, label, [...path, String(index)]))\n return\n }\n if (!value || typeof value !== 'object') return\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n const next = [...path, key]\n if (SECRET_KEY.test(key)) {\n throw new Error(`${label} 禁止凭据字段: ${next.join('.')}`)\n }\n rejectSecretLikeKeys(item, label, next)\n }\n}\n\nfunction versionSatisfies(actualInput: string, rangeInput: string): boolean {\n const actual = parseVersion(actualInput)\n const range = rangeInput.trim()\n if (range === '*' || range === 'latest') return true\n const operator = range.startsWith('^') ? '^' : range.startsWith('~') ? '~' : '='\n const expected = parseVersion(operator === '=' ? range : range.slice(1))\n if (!actual || !expected) return false\n if (operator === '=') return actual.join('.') === expected.join('.')\n if (compareVersion(actual, expected) < 0) return false\n if (operator === '~') return actual[0] === expected[0] && actual[1] === expected[1]\n if (expected[0] > 0) return actual[0] === expected[0]\n if (expected[1] > 0) return actual[0] === 0 && actual[1] === expected[1]\n return actual[0] === 0 && actual[1] === 0 && actual[2] === expected[2]\n}\n\nfunction parseVersion(value: string): [number, number, number] | null {\n const match = value.trim().replace(/^v/, '').match(/^(\\d+)\\.(\\d+)\\.(\\d+)/)\n return match ? [Number(match[1]), Number(match[2]), Number(match[3])] : null\n}\n\nfunction compareVersion(a: number[], b: number[]): number {\n for (let index = 0; index < 3; index += 1) {\n if (a[index] !== b[index]) return a[index] - b[index]\n }\n return 0\n}\n\nfunction isInside(root: string, candidate: string): boolean {\n const rel = relative(root, candidate)\n return rel === '' || (rel !== '..' && !rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`))\n}\n"]}
|
package/dist/src/doctor.js
CHANGED
|
@@ -17,24 +17,35 @@ export function doctor(packageRoot, options = {}) {
|
|
|
17
17
|
fix: '升级到 Node.js 18.3 或更高版本',
|
|
18
18
|
});
|
|
19
19
|
const cli = findExecutable('dingtalk-agent', env);
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const
|
|
20
|
+
const alias = findExecutable('dta', env);
|
|
21
|
+
if (cli && alias) {
|
|
22
|
+
const installed = runText(cli, ['--version'], env);
|
|
23
|
+
const aliasRun = runText(alias, ['--version'], env);
|
|
24
24
|
const installedVersion = installed.ok ? firstLine(installed.stdout) : '';
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
const aliasVersion = aliasRun.ok ? firstLine(aliasRun.stdout) : '';
|
|
26
|
+
checks.push(installedVersion === version && aliasVersion === version
|
|
27
|
+
? {
|
|
28
|
+
id: 'cli', level: 'pass', summary: `CLI ${installedVersion} 已在 PATH 中(dta 可用)`,
|
|
29
|
+
detail: `${cli} · ${alias}`,
|
|
30
|
+
}
|
|
27
31
|
: {
|
|
28
32
|
id: 'cli', level: 'warn', summary: 'PATH 中的 CLI 版本与当前包不一致',
|
|
29
|
-
detail: `${
|
|
30
|
-
fix: `运行 npx --yes @xdxer/dingtalk-agent@${version} setup`,
|
|
33
|
+
detail: `${cli} (${installedVersion || '无法识别版本'}) · ${alias} (${aliasVersion || '无法识别版本'})`,
|
|
34
|
+
fix: `运行 npx --yes --registry=https://registry.npmjs.org @xdxer/dingtalk-agent@${version} setup`,
|
|
31
35
|
});
|
|
32
36
|
}
|
|
37
|
+
else if (cli || alias) {
|
|
38
|
+
checks.push({
|
|
39
|
+
id: 'cli', level: 'fail', summary: 'CLI 入口不完整:dingtalk-agent 与 dta 应同时存在',
|
|
40
|
+
detail: `dingtalk-agent=${cli || 'missing'} · dta=${alias || 'missing'}`,
|
|
41
|
+
fix: `运行 npx --yes --registry=https://registry.npmjs.org @xdxer/dingtalk-agent@${version} setup`,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
33
44
|
else {
|
|
34
45
|
checks.push({
|
|
35
46
|
id: 'cli', level: 'fail', summary: 'PATH 找不到 dingtalk-agent',
|
|
36
47
|
detail: `当前 PATH=${env.PATH || ''}`,
|
|
37
|
-
fix: `运行 npx --yes @xdxer/dingtalk-agent@${version} setup`,
|
|
48
|
+
fix: `运行 npx --yes --registry=https://registry.npmjs.org @xdxer/dingtalk-agent@${version} setup`,
|
|
38
49
|
});
|
|
39
50
|
}
|
|
40
51
|
const dws = findExecutable('dws', env);
|
package/dist/src/doctor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/doctor.ts"],"names":[],"mappings":"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","sourcesContent":["import { accessSync, constants, existsSync, readFileSync } from 'node:fs'\nimport { delimiter, dirname, join, resolve } from 'node:path'\nimport { homedir } from 'node:os'\nimport { spawnSync } from 'node:child_process'\n\nimport { skillStatus, type GlobalSkillStatus } from './skill-manager.js'\n\nexport type CheckLevel = 'pass' | 'warn' | 'fail'\n\nexport interface DoctorCheck {\n id: 'node' | 'cli' | 'dws' | 'dws-auth' | 'skill' | 'claude-code' | 'codex' | 'opencode'\n level: CheckLevel\n summary: string\n detail?: string\n fix?: string\n}\n\nexport interface DoctorReport {\n $schema: 'dingtalk-agent/doctor@1'\n ready: boolean\n checks: DoctorCheck[]\n nextSteps: string[]\n skill: GlobalSkillStatus\n}\n\nexport interface DoctorOptions {\n home?: string\n env?: NodeJS.ProcessEnv\n}\n\nexport function doctor(packageRoot: string, options: DoctorOptions = {}): DoctorReport {\n const home = options.home || homedir()\n const env = options.env || process.env\n const checks: DoctorCheck[] = []\n const pkg = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'))\n const version = String(pkg.version || '')\n\n const nodeVersion = process.versions.node\n checks.push(versionAtLeast(nodeVersion, '18.3.0')\n ? { id: 'node', level: 'pass', summary: `Node.js ${nodeVersion}` }\n : {\n id: 'node', level: 'fail', summary: `Node.js ${nodeVersion} 过旧`,\n fix: '升级到 Node.js 18.3 或更高版本',\n })\n\n const cli = findExecutable('dingtalk-agent', env)\n const dta = findExecutable('dta', env)\n const visible = cli || dta\n if (visible) {\n const installed = runText(visible, ['--version'], env)\n const installedVersion = installed.ok ? firstLine(installed.stdout) : ''\n checks.push(installedVersion === version\n ? { id: 'cli', level: 'pass', summary: `CLI ${installedVersion} 已在 PATH 中`, detail: visible }\n : {\n id: 'cli', level: 'warn', summary: 'PATH 中的 CLI 版本与当前包不一致',\n detail: `${visible} (${installedVersion || '无法识别版本'})`,\n fix: `运行 npx --yes @xdxer/dingtalk-agent@${version} setup`,\n })\n } else {\n checks.push({\n id: 'cli', level: 'fail', summary: 'PATH 找不到 dingtalk-agent',\n detail: `当前 PATH=${env.PATH || ''}`,\n fix: `运行 npx --yes @xdxer/dingtalk-agent@${version} setup`,\n })\n }\n\n const dws = findExecutable('dws', env)\n if (!dws) {\n checks.push({\n id: 'dws', level: 'fail', summary: 'PATH 找不到 dws',\n fix: '安装 DWS,并确认 `dws version --format json` 可以执行',\n })\n checks.push({\n id: 'dws-auth', level: 'fail', summary: '无法检查 DWS 认证',\n fix: 'DWS 可用后运行 `dws auth login`',\n })\n } else {\n const versionRun = runJson(dws, ['version', '--format', 'json'], env)\n const dwsVersion = versionRun.json?.version || firstLine(versionRun.stdout)\n const supported = versionRun.ok && versionAtLeast(String(dwsVersion || '').replace(/^v/, ''), '1.0.15')\n checks.push(supported\n ? { id: 'dws', level: 'pass', summary: `DWS ${dwsVersion || '可执行'}`, detail: dws }\n : {\n id: 'dws', level: 'fail',\n summary: versionRun.ok ? `DWS ${dwsVersion || ''} 低于最低版本 1.0.15` : 'DWS 存在但无法运行',\n detail: versionRun.ok ? dws : versionRun.error,\n fix: versionRun.ok ? '运行 `dws upgrade`' : '运行 `dws doctor` 检查安装',\n })\n\n const authRun = runJson(dws, ['auth', 'status', '--format', 'json'], env)\n const authenticated = authRun.ok && authRun.json?.authenticated === true &&\n authRun.json?.token_valid !== false\n checks.push(authenticated\n ? {\n id: 'dws-auth', level: 'pass', summary: 'DWS 已认证',\n detail: [authRun.json?.corp_name, authRun.json?.user_name].filter(Boolean).join(' · '),\n }\n : {\n id: 'dws-auth', level: 'fail', summary: 'DWS 尚未认证或凭据已失效',\n detail: authRun.error || 'authenticated=false', fix: '运行 `dws auth login`',\n })\n }\n\n const skill = skillStatus(packageRoot, { home })\n checks.push(skill.canonical.current\n ? {\n id: 'skill', level: 'pass',\n summary: `Basic Behavior Skill ${skill.bundled.skillVersion} 已安装`,\n detail: skill.canonical.path,\n }\n : {\n id: 'skill', level: skill.canonical.exists ? 'warn' : 'fail',\n summary: skill.canonical.exists ? 'Basic Behavior Skill 需要升级或存在本地修改' : 'Basic Behavior Skill 未安装',\n detail: skill.canonical.path,\n fix: skill.canonical.exists\n ? '运行 `dingtalk-agent skill status`,确认后执行 `dingtalk-agent skill upgrade`'\n : '运行 `dingtalk-agent skill install`',\n })\n\n for (const client of skill.clients) {\n checks.push({\n id: client.name,\n level: client.state === 'ok' ? 'pass' : client.state === 'conflict' ? 'fail' : 'warn',\n summary: `${client.label}: ${client.state === 'ok' ? '可发现 Skill' : client.state === 'conflict' ? 'Skill 路径冲突' : '尚不可发现 Skill'}`,\n detail: `${client.discovery} · ${client.path}`,\n fix: client.state === 'ok' ? undefined : '运行 `dingtalk-agent skill install`',\n })\n }\n\n const nextSteps = checks\n .filter((check) => check.level !== 'pass' && check.fix)\n .map((check) => check.fix as string)\n .filter((step, index, all) => all.indexOf(step) === index)\n return {\n $schema: 'dingtalk-agent/doctor@1',\n ready: !checks.some((check) => check.level === 'fail'),\n checks,\n nextSteps,\n skill,\n }\n}\n\nexport function findExecutable(command: string, env: NodeJS.ProcessEnv = process.env): string {\n const path = env.PATH || ''\n const extensions = process.platform === 'win32'\n ? (env.PATHEXT || '.EXE;.CMD;.BAT').split(';')\n : ['']\n for (const directory of path.split(delimiter).filter(Boolean)) {\n for (const extension of extensions) {\n const candidate = resolve(directory, command + extension.toLowerCase())\n try {\n accessSync(candidate, process.platform === 'win32' ? constants.F_OK : constants.X_OK)\n return candidate\n } catch { /* continue */ }\n }\n }\n return ''\n}\n\nfunction runJson(command: string, args: string[], env: NodeJS.ProcessEnv) {\n const run = spawnSync(command, args, { encoding: 'utf8', env, timeout: 8_000 })\n const stdout = String(run.stdout || '').trim()\n const stderr = String(run.stderr || '').trim()\n let json: any = null\n try { json = stdout ? JSON.parse(stdout) : null } catch { /* human output is allowed */ }\n return {\n ok: run.status === 0 && !run.error,\n json,\n stdout,\n error: run.error?.message || stderr || (run.signal ? `被 ${run.signal} 终止` : `退出码 ${run.status}`),\n }\n}\n\nfunction runText(command: string, args: string[], env: NodeJS.ProcessEnv) {\n const run = spawnSync(command, args, { encoding: 'utf8', env, timeout: 8_000 })\n return {\n ok: run.status === 0 && !run.error,\n stdout: String(run.stdout || '').trim(),\n }\n}\n\nfunction firstLine(text: string): string {\n return text.split(/\\r?\\n/, 1)[0]?.trim() || ''\n}\n\nfunction versionAtLeast(actual: string, minimum: string): boolean {\n const a = actual.split('.').map((part) => Number.parseInt(part, 10) || 0)\n const b = minimum.split('.').map((part) => Number.parseInt(part, 10) || 0)\n for (let i = 0; i < Math.max(a.length, b.length); i += 1) {\n if ((a[i] || 0) > (b[i] || 0)) return true\n if ((a[i] || 0) < (b[i] || 0)) return false\n }\n return true\n}\n"]}
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/doctor.ts"],"names":[],"mappings":"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","sourcesContent":["import { accessSync, constants, existsSync, readFileSync } from 'node:fs'\nimport { delimiter, dirname, join, resolve } from 'node:path'\nimport { homedir } from 'node:os'\nimport { spawnSync } from 'node:child_process'\n\nimport { skillStatus, type GlobalSkillStatus } from './skill-manager.js'\n\nexport type CheckLevel = 'pass' | 'warn' | 'fail'\n\nexport interface DoctorCheck {\n id: 'node' | 'cli' | 'dws' | 'dws-auth' | 'skill' | 'claude-code' | 'codex' | 'opencode'\n level: CheckLevel\n summary: string\n detail?: string\n fix?: string\n}\n\nexport interface DoctorReport {\n $schema: 'dingtalk-agent/doctor@1'\n ready: boolean\n checks: DoctorCheck[]\n nextSteps: string[]\n skill: GlobalSkillStatus\n}\n\nexport interface DoctorOptions {\n home?: string\n env?: NodeJS.ProcessEnv\n}\n\nexport function doctor(packageRoot: string, options: DoctorOptions = {}): DoctorReport {\n const home = options.home || homedir()\n const env = options.env || process.env\n const checks: DoctorCheck[] = []\n const pkg = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'))\n const version = String(pkg.version || '')\n\n const nodeVersion = process.versions.node\n checks.push(versionAtLeast(nodeVersion, '18.3.0')\n ? { id: 'node', level: 'pass', summary: `Node.js ${nodeVersion}` }\n : {\n id: 'node', level: 'fail', summary: `Node.js ${nodeVersion} 过旧`,\n fix: '升级到 Node.js 18.3 或更高版本',\n })\n\n const cli = findExecutable('dingtalk-agent', env)\n const alias = findExecutable('dta', env)\n if (cli && alias) {\n const installed = runText(cli, ['--version'], env)\n const aliasRun = runText(alias, ['--version'], env)\n const installedVersion = installed.ok ? firstLine(installed.stdout) : ''\n const aliasVersion = aliasRun.ok ? firstLine(aliasRun.stdout) : ''\n checks.push(installedVersion === version && aliasVersion === version\n ? {\n id: 'cli', level: 'pass', summary: `CLI ${installedVersion} 已在 PATH 中(dta 可用)`,\n detail: `${cli} · ${alias}`,\n }\n : {\n id: 'cli', level: 'warn', summary: 'PATH 中的 CLI 版本与当前包不一致',\n detail: `${cli} (${installedVersion || '无法识别版本'}) · ${alias} (${aliasVersion || '无法识别版本'})`,\n fix: `运行 npx --yes --registry=https://registry.npmjs.org @xdxer/dingtalk-agent@${version} setup`,\n })\n } else if (cli || alias) {\n checks.push({\n id: 'cli', level: 'fail', summary: 'CLI 入口不完整:dingtalk-agent 与 dta 应同时存在',\n detail: `dingtalk-agent=${cli || 'missing'} · dta=${alias || 'missing'}`,\n fix: `运行 npx --yes --registry=https://registry.npmjs.org @xdxer/dingtalk-agent@${version} setup`,\n })\n } else {\n checks.push({\n id: 'cli', level: 'fail', summary: 'PATH 找不到 dingtalk-agent',\n detail: `当前 PATH=${env.PATH || ''}`,\n fix: `运行 npx --yes --registry=https://registry.npmjs.org @xdxer/dingtalk-agent@${version} setup`,\n })\n }\n\n const dws = findExecutable('dws', env)\n if (!dws) {\n checks.push({\n id: 'dws', level: 'fail', summary: 'PATH 找不到 dws',\n fix: '安装 DWS,并确认 `dws version --format json` 可以执行',\n })\n checks.push({\n id: 'dws-auth', level: 'fail', summary: '无法检查 DWS 认证',\n fix: 'DWS 可用后运行 `dws auth login`',\n })\n } else {\n const versionRun = runJson(dws, ['version', '--format', 'json'], env)\n const dwsVersion = versionRun.json?.version || firstLine(versionRun.stdout)\n const supported = versionRun.ok && versionAtLeast(String(dwsVersion || '').replace(/^v/, ''), '1.0.15')\n checks.push(supported\n ? { id: 'dws', level: 'pass', summary: `DWS ${dwsVersion || '可执行'}`, detail: dws }\n : {\n id: 'dws', level: 'fail',\n summary: versionRun.ok ? `DWS ${dwsVersion || ''} 低于最低版本 1.0.15` : 'DWS 存在但无法运行',\n detail: versionRun.ok ? dws : versionRun.error,\n fix: versionRun.ok ? '运行 `dws upgrade`' : '运行 `dws doctor` 检查安装',\n })\n\n const authRun = runJson(dws, ['auth', 'status', '--format', 'json'], env)\n const authenticated = authRun.ok && authRun.json?.authenticated === true &&\n authRun.json?.token_valid !== false\n checks.push(authenticated\n ? {\n id: 'dws-auth', level: 'pass', summary: 'DWS 已认证',\n detail: [authRun.json?.corp_name, authRun.json?.user_name].filter(Boolean).join(' · '),\n }\n : {\n id: 'dws-auth', level: 'fail', summary: 'DWS 尚未认证或凭据已失效',\n detail: authRun.error || 'authenticated=false', fix: '运行 `dws auth login`',\n })\n }\n\n const skill = skillStatus(packageRoot, { home })\n checks.push(skill.canonical.current\n ? {\n id: 'skill', level: 'pass',\n summary: `Basic Behavior Skill ${skill.bundled.skillVersion} 已安装`,\n detail: skill.canonical.path,\n }\n : {\n id: 'skill', level: skill.canonical.exists ? 'warn' : 'fail',\n summary: skill.canonical.exists ? 'Basic Behavior Skill 需要升级或存在本地修改' : 'Basic Behavior Skill 未安装',\n detail: skill.canonical.path,\n fix: skill.canonical.exists\n ? '运行 `dingtalk-agent skill status`,确认后执行 `dingtalk-agent skill upgrade`'\n : '运行 `dingtalk-agent skill install`',\n })\n\n for (const client of skill.clients) {\n checks.push({\n id: client.name,\n level: client.state === 'ok' ? 'pass' : client.state === 'conflict' ? 'fail' : 'warn',\n summary: `${client.label}: ${client.state === 'ok' ? '可发现 Skill' : client.state === 'conflict' ? 'Skill 路径冲突' : '尚不可发现 Skill'}`,\n detail: `${client.discovery} · ${client.path}`,\n fix: client.state === 'ok' ? undefined : '运行 `dingtalk-agent skill install`',\n })\n }\n\n const nextSteps = checks\n .filter((check) => check.level !== 'pass' && check.fix)\n .map((check) => check.fix as string)\n .filter((step, index, all) => all.indexOf(step) === index)\n return {\n $schema: 'dingtalk-agent/doctor@1',\n ready: !checks.some((check) => check.level === 'fail'),\n checks,\n nextSteps,\n skill,\n }\n}\n\nexport function findExecutable(command: string, env: NodeJS.ProcessEnv = process.env): string {\n const path = env.PATH || ''\n const extensions = process.platform === 'win32'\n ? (env.PATHEXT || '.EXE;.CMD;.BAT').split(';')\n : ['']\n for (const directory of path.split(delimiter).filter(Boolean)) {\n for (const extension of extensions) {\n const candidate = resolve(directory, command + extension.toLowerCase())\n try {\n accessSync(candidate, process.platform === 'win32' ? constants.F_OK : constants.X_OK)\n return candidate\n } catch { /* continue */ }\n }\n }\n return ''\n}\n\nfunction runJson(command: string, args: string[], env: NodeJS.ProcessEnv) {\n const run = spawnSync(command, args, { encoding: 'utf8', env, timeout: 8_000 })\n const stdout = String(run.stdout || '').trim()\n const stderr = String(run.stderr || '').trim()\n let json: any = null\n try { json = stdout ? JSON.parse(stdout) : null } catch { /* human output is allowed */ }\n return {\n ok: run.status === 0 && !run.error,\n json,\n stdout,\n error: run.error?.message || stderr || (run.signal ? `被 ${run.signal} 终止` : `退出码 ${run.status}`),\n }\n}\n\nfunction runText(command: string, args: string[], env: NodeJS.ProcessEnv) {\n const run = spawnSync(command, args, { encoding: 'utf8', env, timeout: 8_000 })\n return {\n ok: run.status === 0 && !run.error,\n stdout: String(run.stdout || '').trim(),\n }\n}\n\nfunction firstLine(text: string): string {\n return text.split(/\\r?\\n/, 1)[0]?.trim() || ''\n}\n\nfunction versionAtLeast(actual: string, minimum: string): boolean {\n const a = actual.split('.').map((part) => Number.parseInt(part, 10) || 0)\n const b = minimum.split('.').map((part) => Number.parseInt(part, 10) || 0)\n for (let i = 0; i < Math.max(a.length, b.length); i += 1) {\n if ((a[i] || 0) > (b[i] || 0)) return true\n if ((a[i] || 0) < (b[i] || 0)) return false\n }\n return true\n}\n"]}
|
package/dist/src/dws.js
CHANGED
|
@@ -90,6 +90,100 @@ export function run(args, { allowFail = false, timeout = 180_000, retries = 2 }
|
|
|
90
90
|
return null;
|
|
91
91
|
die(`dws 无响应(重试 ${retries} 次) ${args.slice(0, 4).join(' ')}\n ${last}`);
|
|
92
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* 启动 dev connect daemon。
|
|
95
|
+
*
|
|
96
|
+
* dws 当前即使收到 `--format json`,成功时仍可能只输出:
|
|
97
|
+
* `connect daemon started (pid=..., log=...)`。这不是通用 JSON 契约,只有这个
|
|
98
|
+
* 已知启动动作允许接受;健康与否仍必须由调用方随后执行 status 回读确认。
|
|
99
|
+
*/
|
|
100
|
+
export function startConnectDaemon(args, { timeout = 60_000 } = {}) {
|
|
101
|
+
if (args[0] !== 'dev' || args[1] !== 'connect' || !args.includes('--daemon')) {
|
|
102
|
+
die('startConnectDaemon 只允许执行 dev connect --daemon');
|
|
103
|
+
}
|
|
104
|
+
if (!args.includes('--unified-app-id') && !args.includes('--robot-client-id')) {
|
|
105
|
+
die('dev connect daemon 必须固定 unified-app-id 或 robot-client-id');
|
|
106
|
+
}
|
|
107
|
+
if (args.includes('--robot-client-secret')) {
|
|
108
|
+
die('dev connect daemon 禁止通过命令行传机器人 Secret');
|
|
109
|
+
}
|
|
110
|
+
const p = spawnSync('dws', [...args, '--format', 'json'], {
|
|
111
|
+
encoding: 'utf8', timeout, maxBuffer: 64 * 1024 * 1024,
|
|
112
|
+
});
|
|
113
|
+
if (p.error) {
|
|
114
|
+
if (p.error.code === 'ENOENT') {
|
|
115
|
+
die('dws 跑不起来 —— 先 export PATH="$HOME/.local/bin:$PATH"');
|
|
116
|
+
}
|
|
117
|
+
die(`dws dev connect daemon 启动失败: ${String(p.error)}`);
|
|
118
|
+
}
|
|
119
|
+
const out = p.stdout || p.stderr || '';
|
|
120
|
+
const i = out.indexOf('{');
|
|
121
|
+
if (i >= 0) {
|
|
122
|
+
try {
|
|
123
|
+
const data = JSON.parse(out.slice(i, lastBrace(out) + 1));
|
|
124
|
+
const err = data?.error || {};
|
|
125
|
+
if (err.code || err.message) {
|
|
126
|
+
die(`dws 失败 dev connect daemon\n ${JSON.stringify(err).slice(0, 300)}`);
|
|
127
|
+
}
|
|
128
|
+
if (p.status !== 0) {
|
|
129
|
+
die(`dws dev connect daemon 以退出码 ${p.status} 结束`);
|
|
130
|
+
}
|
|
131
|
+
return data;
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
if (error instanceof Blocked)
|
|
135
|
+
throw error;
|
|
136
|
+
die('dws dev connect daemon 返回了无法解析的 JSON');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (p.status === 0 && /connect daemon started\s*\(pid\s*=?\s*\d+\)/i.test(out)) {
|
|
140
|
+
const pid = Number(out.match(/pid\s*=?\s*(\d+)/i)?.[1] || 0);
|
|
141
|
+
return { data: { started: true, pid, responseMode: 'daemon-text' } };
|
|
142
|
+
}
|
|
143
|
+
const summary = out.trim().replace(/\s+/g, ' ').slice(0, 300);
|
|
144
|
+
die(`dws dev connect daemon 未返回已知成功响应${p.status === null ? '' : ` (exit=${p.status})`}: ${summary}`);
|
|
145
|
+
}
|
|
146
|
+
/** 停止已知 connector;命令回包只说明“已受理”,调用方仍须 status 回读。 */
|
|
147
|
+
export function stopConnectDaemon(args, { timeout = 30_000 } = {}) {
|
|
148
|
+
if (args[0] !== 'dev' || args[1] !== 'connect' || args[2] !== 'stop') {
|
|
149
|
+
die('stopConnectDaemon 只允许执行 dev connect stop');
|
|
150
|
+
}
|
|
151
|
+
if (!args.includes('--robot-client-id') && !args.includes('--unified-app-id')) {
|
|
152
|
+
die('dev connect stop 必须固定 robot-client-id 或 unified-app-id');
|
|
153
|
+
}
|
|
154
|
+
if (args.includes('--robot-client-secret')) {
|
|
155
|
+
die('dev connect stop 禁止通过命令行传机器人 Secret');
|
|
156
|
+
}
|
|
157
|
+
const p = spawnSync('dws', [...args, '--format', 'json'], {
|
|
158
|
+
encoding: 'utf8', timeout, maxBuffer: 64 * 1024 * 1024,
|
|
159
|
+
});
|
|
160
|
+
if (p.error)
|
|
161
|
+
die(`dws dev connect stop 执行失败: ${String(p.error)}`);
|
|
162
|
+
const out = p.stdout || p.stderr || '';
|
|
163
|
+
const i = out.indexOf('{');
|
|
164
|
+
if (i >= 0) {
|
|
165
|
+
try {
|
|
166
|
+
const data = JSON.parse(out.slice(i, lastBrace(out) + 1));
|
|
167
|
+
const err = data?.error || {};
|
|
168
|
+
if (err.code || err.message) {
|
|
169
|
+
die(`dws 失败 dev connect stop\n ${JSON.stringify(err).slice(0, 300)}`);
|
|
170
|
+
}
|
|
171
|
+
if (p.status !== 0)
|
|
172
|
+
die(`dws dev connect stop 以退出码 ${p.status} 结束`);
|
|
173
|
+
return data;
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
if (error instanceof Blocked)
|
|
177
|
+
throw error;
|
|
178
|
+
die('dws dev connect stop 返回了无法解析的 JSON');
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (p.status === 0 && /(connect daemon stopped|connector (?:is )?not running|no connector heartbeat)/i.test(out)) {
|
|
182
|
+
return { data: { stopAccepted: true, responseMode: 'daemon-text' } };
|
|
183
|
+
}
|
|
184
|
+
const summary = out.trim().replace(/\s+/g, ' ').slice(0, 300);
|
|
185
|
+
die(`dws dev connect stop 未返回已知响应${p.status === null ? '' : ` (exit=${p.status})`}: ${summary}`);
|
|
186
|
+
}
|
|
93
187
|
function lastBrace(s) {
|
|
94
188
|
// dws 有时在 JSON 后面粘一行 WARN / INFO —— 从最后一个 } 截断
|
|
95
189
|
for (let i = s.length - 1; i >= 0; i--)
|
|
@@ -172,6 +266,9 @@ export function createDoc(folder, name, file) {
|
|
|
172
266
|
}
|
|
173
267
|
export const updateDoc = (node, file) => run(['doc', 'update', '--node', node, '--content-file', file,
|
|
174
268
|
'--content-format', 'markdown', '--mode', 'overwrite', '--yes']);
|
|
269
|
+
/** 候选发布只追加唯一 marker;写错误不重试,调用方必须全文回读。 */
|
|
270
|
+
export const appendDoc = (node, file, profile = '') => run(['doc', 'update', '--node', node, '--content-file', file,
|
|
271
|
+
'--content-format', 'markdown', '--mode', 'append', ...profileArgs(profile), '--yes'], { allowFail: true, retries: 0 });
|
|
175
272
|
export const readDoc = (node, profile = '') => markdown(run([
|
|
176
273
|
'doc', 'read', '--node', node, ...profileArgs(profile),
|
|
177
274
|
]));
|
|
@@ -267,4 +364,52 @@ export function getSelf(profile = '') {
|
|
|
267
364
|
'contact', 'user', 'get-self', ...profileArgs(profile),
|
|
268
365
|
], { retries: 1 });
|
|
269
366
|
}
|
|
367
|
+
// ──────────────── Operational Memory:AI 表格宽表原子能力 ────────────────
|
|
368
|
+
export function queryAiTableRecords({ baseId, tableId, filters = null, recordIds = [], profile = '', }) {
|
|
369
|
+
const args = [
|
|
370
|
+
'aitable', 'record', 'query', '--base-id', baseId, '--table-id', tableId,
|
|
371
|
+
];
|
|
372
|
+
if (recordIds.length)
|
|
373
|
+
args.push('--record-ids', recordIds.join(','));
|
|
374
|
+
else if (filters)
|
|
375
|
+
args.push('--filters', JSON.stringify(filters), '--limit', '100');
|
|
376
|
+
args.push(...profileArgs(profile));
|
|
377
|
+
return records(run(args, { retries: 1 }));
|
|
378
|
+
}
|
|
379
|
+
/** AI 表格 Base 目录回读;调用方仍需继续核对固定 tableId。 */
|
|
380
|
+
export function getAiTableBase(baseId, profile = '') {
|
|
381
|
+
return inner(run([
|
|
382
|
+
'aitable', 'base', 'get', '--base-id', baseId, ...profileArgs(profile),
|
|
383
|
+
], { retries: 1 }));
|
|
384
|
+
}
|
|
385
|
+
/** AI 表格表结构回读;写入前用它确认固定 tableId 与 fieldId。 */
|
|
386
|
+
export function getAiTableTables(baseId, tableIds, profile = '') {
|
|
387
|
+
if (!tableIds.length)
|
|
388
|
+
die('AI 表格结构回读必须固定至少一个 tableId');
|
|
389
|
+
return inner(run([
|
|
390
|
+
'aitable', 'table', 'get', '--base-id', baseId,
|
|
391
|
+
'--table-ids', tableIds.join(','), ...profileArgs(profile),
|
|
392
|
+
], { retries: 1 }));
|
|
393
|
+
}
|
|
394
|
+
/** 写错误可能实际成功,因此不重试、不直接下结论;调用方必须按 key/recordId 回读。 */
|
|
395
|
+
export function createAiTableRecord(baseId, tableId, cells, profile = '') {
|
|
396
|
+
const data = run([
|
|
397
|
+
'aitable', 'record', 'create', '--base-id', baseId, '--table-id', tableId,
|
|
398
|
+
'--records', JSON.stringify([{ cells }]), ...profileArgs(profile), '--yes',
|
|
399
|
+
], { allowFail: true, retries: 0 });
|
|
400
|
+
const ids = data ? inner(data).newRecordIds : [];
|
|
401
|
+
return {
|
|
402
|
+
accepted: Boolean(data),
|
|
403
|
+
recordIds: Array.isArray(ids) ? ids.map(String).filter(Boolean) : [],
|
|
404
|
+
data,
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
/** 写错误可能实际成功,因此不重试;调用方必须按 recordId 回读。 */
|
|
408
|
+
export function updateAiTableRecord(baseId, tableId, recordId, cells, profile = '') {
|
|
409
|
+
const data = run([
|
|
410
|
+
'aitable', 'record', 'update', '--base-id', baseId, '--table-id', tableId,
|
|
411
|
+
'--records', JSON.stringify([{ recordId, cells }]), ...profileArgs(profile), '--yes',
|
|
412
|
+
], { allowFail: true, retries: 0 });
|
|
413
|
+
return { accepted: Boolean(data), data };
|
|
414
|
+
}
|
|
270
415
|
//# sourceMappingURL=dws.js.map
|