@xdxer/dingtalk-agent 0.1.5-beta.1 → 0.1.5-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.
Files changed (175) hide show
  1. package/CHANGELOG.md +201 -0
  2. package/README.en.md +99 -66
  3. package/README.md +99 -66
  4. package/dist/bin/dingtalk-agent.js +735 -149
  5. package/dist/bin/dingtalk-agent.js.map +1 -1
  6. package/dist/src/actions.js +3 -2
  7. package/dist/src/actions.js.map +1 -1
  8. package/dist/src/agent-audit.js +202 -85
  9. package/dist/src/agent-audit.js.map +1 -1
  10. package/dist/src/agent-definition.js +7 -3
  11. package/dist/src/agent-definition.js.map +1 -1
  12. package/dist/src/agent-enhance.js +51 -32
  13. package/dist/src/agent-enhance.js.map +1 -1
  14. package/dist/src/agent-platform.js +3 -3
  15. package/dist/src/agent-platform.js.map +1 -1
  16. package/dist/src/bootstrap.js +6 -2
  17. package/dist/src/bootstrap.js.map +1 -1
  18. package/dist/src/development-workspace.js +210 -34
  19. package/dist/src/development-workspace.js.map +1 -1
  20. package/dist/src/doctor.js +65 -9
  21. package/dist/src/doctor.js.map +1 -1
  22. package/dist/src/dws.js +67 -3
  23. package/dist/src/dws.js.map +1 -1
  24. package/dist/src/init.js +2 -1
  25. package/dist/src/init.js.map +1 -1
  26. package/dist/src/memory/noop-receipt.js +306 -0
  27. package/dist/src/memory/noop-receipt.js.map +1 -0
  28. package/dist/src/memory/operational.js +27 -3
  29. package/dist/src/memory/operational.js.map +1 -1
  30. package/dist/src/memory/remote-state.js +2 -1
  31. package/dist/src/memory/remote-state.js.map +1 -1
  32. package/dist/src/multica-deploy.js +692 -125
  33. package/dist/src/multica-deploy.js.map +1 -1
  34. package/dist/src/multica-provider.js +303 -25
  35. package/dist/src/multica-provider.js.map +1 -1
  36. package/dist/src/multica-runtime-vocabulary.js +110 -0
  37. package/dist/src/multica-runtime-vocabulary.js.map +1 -0
  38. package/dist/src/opencode-evals.js +6 -6
  39. package/dist/src/opencode-evals.js.map +1 -1
  40. package/dist/src/opencode-provider.js +21 -7
  41. package/dist/src/opencode-provider.js.map +1 -1
  42. package/dist/src/opencode-workspace.js +3 -3
  43. package/dist/src/opencode-workspace.js.map +1 -1
  44. package/dist/src/personal-event-evals.js +4 -2
  45. package/dist/src/personal-event-evals.js.map +1 -1
  46. package/dist/src/promotion.js +2 -1
  47. package/dist/src/promotion.js.map +1 -1
  48. package/dist/src/remote-semantic-state-live-evals.js +14 -8
  49. package/dist/src/remote-semantic-state-live-evals.js.map +1 -1
  50. package/dist/src/remote-state-evals.js +2 -2
  51. package/dist/src/remote-state-evals.js.map +1 -1
  52. package/dist/src/robot-evals.js +3 -3
  53. package/dist/src/robot-evals.js.map +1 -1
  54. package/dist/src/schedule-plan.js +380 -0
  55. package/dist/src/schedule-plan.js.map +1 -0
  56. package/dist/src/sessions.js +1 -1
  57. package/dist/src/sessions.js.map +1 -1
  58. package/dist/src/skill-manager.js +145 -13
  59. package/dist/src/skill-manager.js.map +1 -1
  60. package/dist/src/skills.js +2 -0
  61. package/dist/src/skills.js.map +1 -1
  62. package/dist/src/tui.js +369 -0
  63. package/dist/src/tui.js.map +1 -0
  64. package/dist/src/upgrade.js +113 -33
  65. package/dist/src/upgrade.js.map +1 -1
  66. package/dist/src/waits.js +2 -1
  67. package/dist/src/waits.js.map +1 -1
  68. package/dist/src/workspace.js +12 -7
  69. package/dist/src/workspace.js.map +1 -1
  70. package/docs/AGENT-IN-PRODUCTION.md +255 -0
  71. package/docs/ARCHITECTURE.md +165 -31
  72. package/docs/INSTALLATION.md +7 -7
  73. package/docs/PLATFORM-GUARDRAILS.md +188 -0
  74. package/docs/PRIOR-ART.md +4 -0
  75. package/docs/SELF-TEST.md +4 -4
  76. package/docs/architecture/agent-platform-connection-layer.svg +120 -0
  77. package/docs/architecture/digital-employee-composition.svg +92 -0
  78. package/docs/architecture/dingtalk-agent-architecture.svg +125 -0
  79. package/docs/assets/digital-employee-at-work.svg +77 -0
  80. package/docs/schemas/multica-deployment-plan.schema.json +3 -1
  81. package/docs/schemas/multica-deployment-receipt.schema.json +17 -3
  82. package/docs/schemas/multica-deployment-status.schema.json +6 -2
  83. package/docs/schemas/multica-workspace-inspection.schema.json +16 -0
  84. package/docs/schemas/multica-workspace-run-plan.schema.json +31 -0
  85. package/docs/schemas/multica-workspace-run.schema.json +161 -0
  86. package/docs/schemas/multica-workspace-status.schema.json +2 -0
  87. package/docs/schemas/project.schema.json +54 -3
  88. package/docs/schemas/workspace-scaffold.schema.json +38 -0
  89. package/examples/agents/README.md +10 -8
  90. package/examples/agents/fde-coach/AGENTS.md +2 -34
  91. package/examples/agents/fde-coach/agent/AGENTS.md +35 -0
  92. package/examples/agents/fde-coach/agent.bindings.json +10 -0
  93. package/examples/agents/release-manager/AGENTS.md +2 -34
  94. package/examples/agents/release-manager/agent/AGENTS.md +35 -0
  95. package/examples/agents/release-manager/agent.bindings.json +10 -0
  96. package/lab/agent-eval/catalog.json +5 -5
  97. package/lab/agent-eval/classic-failures.json +4 -4
  98. package/lab/agent-eval/completion-gate-regression.json +9 -9
  99. package/lab/agent-eval/personal-event-live.example.json +3 -3
  100. package/lab/agent-eval/remote-semantic-state-live.example.json +1 -1
  101. package/lab/agent-eval/workspace/opencode.json +2 -2
  102. package/lab/project-workspace/fake-multica-provider.mjs +171 -17
  103. package/lab/project-workspace/multica-deploy.fixture.json +2 -2
  104. package/lab/project-workspace/multica-readonly.fixture.json +4 -16
  105. package/lab/project-workspace/opencode-provider-suite.json +3 -3
  106. package/lab/project-workspace/project.fixture.json +2 -6
  107. package/lab/robot-eval/suite.json +1 -1
  108. package/lab/robot-eval/workspace/AGENTS.md +1 -1
  109. package/lab/robot-eval/workspace/opencode.json +2 -2
  110. package/lab/schemas/personal-event-eval.schema.json +1 -1
  111. package/package.json +12 -9
  112. package/skills/README.md +10 -8
  113. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/SKILL.md +48 -23
  114. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/AGENTS.template.md +1 -1
  115. package/skills/core/dta-agent-compose/assets/REPOSITORY.template.md +10 -0
  116. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/agent.bindings.dingtalk-doc.template.json +2 -2
  117. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/agent.bindings.local.template.json +2 -2
  118. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/hosts/opencode/opencode.template.json +3 -2
  119. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/evals/evals.json +4 -4
  120. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/agent-definition-contract.md +7 -7
  121. package/skills/core/dta-agent-compose/references/drive-and-schedules.md +166 -0
  122. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/host-loading-contract.md +11 -13
  123. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/hosts/claude-code.md +13 -12
  124. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/hosts/opencode.md +14 -13
  125. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/SKILL.md +2 -2
  126. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/assets/eval-catalog.template.json +1 -1
  127. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/evals/evals.json +1 -1
  128. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/eval-topology.md +3 -3
  129. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/interactive-debug-channels.md +10 -4
  130. package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/SKILL.md +21 -5
  131. package/skills/core/dta-basic-behavior/references/event-to-behavior.md +38 -0
  132. package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/memory-and-evolution.md +3 -1
  133. package/skills/core/dta-basic-behavior/references/perception-and-gates.md +87 -0
  134. package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/risk-authority-and-privacy.md +12 -0
  135. package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/truth-and-recovery.md +4 -2
  136. package/skills/core/dta-people-group-memory/COMPLETENESS.md +36 -0
  137. package/skills/core/dta-people-group-memory/SKILL.md +69 -0
  138. package/skills/core/dta-people-group-memory/references/adapters.md +273 -0
  139. package/skills/core/dta-people-group-memory/references/assembly-guidance.md +40 -0
  140. package/skills/core/dta-people-group-memory/references/binding.md +110 -0
  141. package/skills/core/dta-people-group-memory/references/cold-start.md +70 -0
  142. package/skills/core/dta-people-group-memory/references/config-binding.md +89 -0
  143. package/skills/core/dta-people-group-memory/references/consent-and-visibility.md +83 -0
  144. package/skills/core/dta-people-group-memory/references/consolidation.md +162 -0
  145. package/skills/core/dta-people-group-memory/references/event-ingest.md +103 -0
  146. package/skills/core/dta-people-group-memory/references/guided-setup.md +70 -0
  147. package/skills/core/dta-people-group-memory/references/model.md +148 -0
  148. package/skills/core/dta-people-group-memory/references/storage-port.md +107 -0
  149. package/skills/platforms/deap/PLATFORM.md +30 -1
  150. package/skills/platforms/multica-dingtalk/PLATFORM.md +34 -8
  151. package/skills/platforms/multica-dingtalk/{dingtalk-agent-deploy-multica → dta-deploy-multica}/SKILL.md +10 -8
  152. package/skills/platforms/multica-dingtalk/dta-deploy-multica/references/multica-deployment-contract.md +67 -0
  153. package/skills/platforms/multica-dingtalk/{multica-external → dta-ops-multica}/SKILL.md +81 -11
  154. package/skills/platforms/multica-dingtalk/{multica-external → dta-ops-multica}/scripts/bootstrap.sh +2 -2
  155. package/skills/platforms/multica-dingtalk/{multica-external → dta-ops-multica}/scripts/multica_ext.py +264 -16
  156. package/docs/assets/agent-delivery-lifecycle.svg +0 -103
  157. package/skills/core/dingtalk-basic-behavior/references/event-to-behavior.md +0 -24
  158. package/skills/core/dingtalk-basic-behavior/references/perception-and-gates.md +0 -28
  159. package/skills/platforms/multica-dingtalk/dingtalk-agent-boot-multica/SKILL.md +0 -40
  160. package/skills/platforms/multica-dingtalk/dingtalk-agent-deploy-multica/references/multica-deployment-contract.md +0 -49
  161. /package/examples/agents/fde-coach/{skills → agent/skills}/fde-coach/SKILL.md +0 -0
  162. /package/examples/agents/release-manager/{skills → agent/skills}/release-manager/SKILL.md +0 -0
  163. /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/role-skill.template.md +0 -0
  164. /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/storage-routing.md +0 -0
  165. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/evidence-contract.md +0 -0
  166. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/failure-to-case.md +0 -0
  167. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/local-connector-smoke.md +0 -0
  168. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/scenario-taxonomy.md +0 -0
  169. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/storage-modes.md +0 -0
  170. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/assets/memory-candidate-proposal.json +0 -0
  171. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/assets/task-checkpoint.json +0 -0
  172. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/action-contract.md +0 -0
  173. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/runtime-modes.md +0 -0
  174. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/task-lifecycle.md +0 -0
  175. /package/skills/platforms/multica-dingtalk/{dingtalk-agent-deploy-multica → dta-deploy-multica}/references/promotion-observation-contract.md +0 -0
@@ -2,10 +2,11 @@ import { createHash, randomUUID } from 'node:crypto';
2
2
  import { cpSync, existsSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, realpathSync, renameSync, rmdirSync, rmSync, writeFileSync, } from 'node:fs';
3
3
  import { tmpdir } from 'node:os';
4
4
  import { dirname, join, relative, resolve } from 'node:path';
5
- import { CURRENT_WORKSPACE_FILE, WORKSPACE_STATE_ROOT, inspectAgentProject, showDevelopmentWorkspace, } from './development-workspace.js';
5
+ import { CURRENT_WORKSPACE_FILE, WORKSPACE_STATE_ROOT, inspectAgentProject, projectSkillRef, showDevelopmentWorkspace, } from './development-workspace.js';
6
6
  import { digest, stableStringify } from './events.js';
7
7
  import { prepareOpenCodeEvalAgent, runOpenCodeEvaluation, runOpenCodePrompt, } from './opencode-evals.js';
8
8
  import { bindRequiredBasicSkill, verifyRequiredBasicSkill, } from './opencode-workspace.js';
9
+ import { instructionTargetsPath } from './instruction-path.js';
9
10
  export const OPENCODE_WORKSPACE_ROOT = '.dingtalk-agent/development-workspaces';
10
11
  export const OPENCODE_EVIDENCE_ROOT = '.dingtalk-agent/development-workspace-evidence';
11
12
  export function planOpenCodeWorkspace(start, name, cliVersion = '') {
@@ -196,7 +197,7 @@ export function runOpenCodeWorkspace(start, name, prompt, options = {}) {
196
197
  try {
197
198
  cpSync(managed, sandbox, { recursive: true });
198
199
  const probe = randomUUID();
199
- const skillPath = join(sandbox, '.agents', 'skills', 'dingtalk-basic-behavior', 'SKILL.md');
200
+ const skillPath = join(sandbox, '.agents', 'skills', 'dta-basic-behavior', 'SKILL.md');
200
201
  const skillBody = readFileSync(skillPath, 'utf8');
201
202
  writeFileSync(skillPath, `${skillBody.trimEnd()}\n\n<!-- dta-load-probe:${probe} -->\n`);
202
203
  const preflight = verifyRequiredBasicSkill(bindRequiredBasicSkill(sandbox), command);
@@ -311,17 +312,30 @@ function materializeProject(root, target, workspace) {
311
312
  if (existsSync(join(root, 'opencode.json')))
312
313
  copyProjectEntry(root, target, 'opencode.json');
313
314
  for (const name of info.project.skills) {
314
- const source = `skills/${name}`;
315
- if (existsSync(join(root, source)))
316
- copyProjectEntry(root, target, source);
317
- copyProjectEntry(root, target, `.agents/skills/${name}`);
315
+ const source = projectSkillRef(info.project, name);
316
+ copyProjectEntry(root, target, source);
317
+ const destination = join(target, '.agents', 'skills', name);
318
+ mkdirSync(dirname(destination), { recursive: true });
319
+ cpSync(safeProjectPath(root, source, true), destination, { recursive: true });
318
320
  }
319
321
  for (const route of [workspace.storage.memory, workspace.storage.knowledge]) {
322
+ if (!route)
323
+ continue;
320
324
  if (!route.startsWith('local-md:'))
321
325
  continue;
322
326
  copyProjectEntry(root, target, route.slice('local-md:'.length));
323
327
  }
324
328
  bindDefinitionInstruction(target, info.project.definition);
329
+ removePackagedBasicInstruction(target, projectSkillRef(info.project, 'dta-basic-behavior'));
330
+ }
331
+ function removePackagedBasicInstruction(target, basicRoot) {
332
+ const path = join(target, 'opencode.json');
333
+ const config = existsSync(path) ? JSON.parse(readFileSync(path, 'utf8')) : {};
334
+ const instructions = Array.isArray(config.instructions)
335
+ ? config.instructions.filter((item) => typeof item === 'string') : [];
336
+ const packaged = `${basicRoot}/SKILL.md`;
337
+ config.instructions = instructions.filter((item) => !instructionTargetsPath(target, item, packaged));
338
+ atomicJson(path, config);
325
339
  }
326
340
  function bindDefinitionInstruction(target, definition) {
327
341
  const path = join(target, 'opencode.json');
@@ -436,7 +450,7 @@ function managedWorkspacePath(root, name) {
436
450
  }
437
451
  function artifactStoragePath(root, workspace) {
438
452
  const route = workspace.storage.artifacts;
439
- if (!route.startsWith('local-dir:')) {
453
+ if (!route || !route.startsWith('local-dir:')) {
440
454
  throw new Error(`Workspace ${workspace.name} Artifact route 必须是 local-dir`);
441
455
  }
442
456
  return safeProjectPath(root, route.slice('local-dir:'.length), false);
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-provider.js","sourceRoot":"","sources":["../../src/opencode-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomUUID } from 'node:crypto'\nimport {\n cpSync, existsSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, readdirSync,\n realpathSync, renameSync, rmdirSync, rmSync, writeFileSync,\n} from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { dirname, join, relative, resolve } from 'node:path'\nimport {\n CURRENT_WORKSPACE_FILE, WORKSPACE_STATE_ROOT,\n inspectAgentProject, showDevelopmentWorkspace,\n type DevelopmentWorkspaceState, type DevelopmentWorkspaceView,\n} from './development-workspace.js'\nimport { digest, stableStringify } from './events.js'\nimport {\n prepareOpenCodeEvalAgent, runOpenCodeEvaluation, runOpenCodePrompt,\n type OpenCodeEvalOptions, type OpenCodeExecution,\n} from './opencode-evals.js'\nimport {\n bindRequiredBasicSkill, verifyRequiredBasicSkill, type OpenCodeSkillPreflight,\n} from './opencode-workspace.js'\n\nexport const OPENCODE_WORKSPACE_ROOT = '.dingtalk-agent/development-workspaces'\nexport const OPENCODE_EVIDENCE_ROOT = '.dingtalk-agent/development-workspace-evidence'\n\nexport interface OpenCodeWorkspacePlan {\n $schema: 'dingtalk-agent/opencode-workspace-plan@1'\n planId: string\n workspace: string\n provider: 'opencode'\n model: string\n action: 'create' | 'rebuild' | 'noop'\n root: string\n managedPath: string\n sourceHash: string\n desiredHash: string\n observedHash: string\n currentState: string\n writes: string[]\n sideEffect: false\n dingtalkSideEffect: false\n}\n\nexport interface OpenCodeWorkspaceApplyResult extends Omit<OpenCodeWorkspacePlan, '$schema' | 'sideEffect'> {\n $schema: 'dingtalk-agent/opencode-workspace-apply@1'\n applied: boolean\n idempotent: boolean\n status: 'verifying' | 'ready'\n observedHash: string\n binding: Record<string, string>\n sideEffect: 'local-managed-workspace'\n dingtalkSideEffect: false\n}\n\nexport interface OpenCodeWorkspaceRunOptions {\n execute?: boolean\n yes?: boolean\n command?: string\n timeoutMs?: number\n out?: string\n}\n\nexport interface OpenCodeWorkspaceEvalOptions extends OpenCodeEvalOptions {}\n\nexport function planOpenCodeWorkspace(\n start: string, name: string, cliVersion = '',\n): OpenCodeWorkspacePlan {\n const info = inspectAgentProject(start, cliVersion)\n const workspace = requireOpenCodeWorkspace(info.root, name, cliVersion)\n const target = managedWorkspacePath(info.root, name)\n const artifactPath = artifactStoragePath(info.root, workspace)\n const observedHash = existsSync(target) ? hashTree(target) : ''\n const state = workspace.state\n const intact = Boolean(state && state.provider === 'opencode' &&\n state.desiredHash === workspace.desiredHash && state.observedHash === observedHash &&\n state.binding.managedPath === relative(info.root, target) &&\n existsSync(artifactPath) && lstatSync(artifactPath).isDirectory())\n const action = !existsSync(target) ? 'create' : intact ? 'noop' : 'rebuild'\n const planId = `opencode_plan_${digest(stableStringify({\n workspace: name, desiredHash: workspace.desiredHash, observedHash, action,\n })).slice(0, 24)}`\n return {\n $schema: 'dingtalk-agent/opencode-workspace-plan@1',\n planId,\n workspace: name,\n provider: 'opencode',\n model: workspace.provider.model,\n action,\n root: info.root,\n managedPath: relative(info.root, target),\n sourceHash: workspace.sourceHash,\n desiredHash: workspace.desiredHash,\n observedHash,\n currentState: workspace.status,\n writes: action === 'noop' ? [] : [\n relative(info.root, target),\n relative(info.root, artifactPath),\n join(WORKSPACE_STATE_ROOT, `${name}.json`),\n ],\n sideEffect: false,\n dingtalkSideEffect: false,\n }\n}\n\nexport function applyOpenCodeWorkspace(\n start: string,\n name: string,\n options: { yes?: boolean; command?: string; cliVersion?: string } = {},\n): OpenCodeWorkspaceApplyResult {\n if (!options.yes) throw new Error('workspace create 会写本地 managed Workspace;必须显式传 --yes')\n const cliVersion = options.cliVersion || ''\n const plan = planOpenCodeWorkspace(start, name, cliVersion)\n const workspace = requireOpenCodeWorkspace(plan.root, name, cliVersion)\n const target = resolve(plan.root, plan.managedPath)\n const artifactPath = artifactStoragePath(plan.root, workspace)\n const artifactExisted = existsSync(artifactPath)\n const command = options.command || process.env.DTA_OPENCODE_BIN || 'opencode'\n if (plan.action === 'noop') {\n const binding = workspace.state?.binding || {}\n const stateStatus = workspace.state?.status === 'ready' ? 'ready' : 'verifying'\n return {\n ...plan,\n $schema: 'dingtalk-agent/opencode-workspace-apply@1',\n applied: false,\n idempotent: true,\n status: stateStatus,\n binding,\n sideEffect: 'local-managed-workspace',\n dingtalkSideEffect: false,\n }\n }\n\n mkdirSync(dirname(target), { recursive: true })\n const staging = `${target}.tmp-${process.pid}-${randomUUID().slice(0, 8)}`\n const backup = `${target}.backup-${process.pid}-${randomUUID().slice(0, 8)}`\n const preflightSandbox = mkdtempSync(join(\n tmpdir(), `dta-opencode-workspace-preflight-${safeName(name)}-`,\n ))\n let preflight: OpenCodeSkillPreflight | null = null\n try {\n mkdirSync(staging, { recursive: false })\n materializeProject(plan.root, staging, workspace)\n prepareOpenCodeEvalAgent(staging, 'none')\n bindRequiredBasicSkill(staging)\n cpSync(staging, preflightSandbox, { recursive: true })\n preflight = verifyRequiredBasicSkill(bindRequiredBasicSkill(preflightSandbox), command)\n if (existsSync(target)) renameSync(target, backup)\n renameSync(staging, target)\n mkdirSync(artifactPath, { recursive: true })\n if (existsSync(backup)) rmSync(backup, { recursive: true, force: true })\n } catch (error) {\n rmSync(staging, { recursive: true, force: true })\n if (existsSync(backup)) {\n rmSync(target, { recursive: true, force: true })\n renameSync(backup, target)\n } else if (existsSync(target) && plan.action === 'create') {\n rmSync(target, { recursive: true, force: true })\n }\n if (!artifactExisted && existsSync(artifactPath)) {\n try { rmdirSync(artifactPath) } catch { /* preserve non-empty concurrent writes */ }\n }\n throw error\n } finally {\n rmSync(preflightSandbox, { recursive: true, force: true })\n }\n\n const observedHash = hashTree(target)\n const binding = {\n managedPath: relative(plan.root, target),\n model: workspace.provider.model,\n sourceHash: workspace.sourceHash,\n basicHash: String(preflight?.skill.hash || ''),\n basicVersion: String(preflight?.skill.version || ''),\n configHash: String(preflight?.configHash || ''),\n openCodeVersion: String(preflight?.openCodeVersion || ''),\n }\n writeWorkspaceState(plan.root, {\n $schema: 'dingtalk-agent/workspace-state@1',\n workspace: name,\n provider: 'opencode',\n status: 'verifying',\n binding,\n desiredHash: workspace.desiredHash,\n observedHash,\n lastPlanId: plan.planId,\n lastReceiptId: '',\n lastEvalId: '',\n })\n return {\n ...plan,\n $schema: 'dingtalk-agent/opencode-workspace-apply@1',\n applied: true,\n idempotent: false,\n status: 'verifying',\n observedHash,\n binding,\n sideEffect: 'local-managed-workspace',\n dingtalkSideEffect: false,\n }\n}\n\nexport function useOpenCodeWorkspace(start: string, name: string, cliVersion = ''): Record<string, unknown> {\n const info = inspectAgentProject(start, cliVersion)\n const workspace = requireOpenCodeWorkspace(info.root, name, cliVersion)\n assertManagedWorkspaceIntact(info.root, workspace)\n const path = join(info.root, CURRENT_WORKSPACE_FILE)\n atomicText(path, `${name}\\n`)\n const readback = readFileSync(path, 'utf8').trim()\n if (readback !== name) throw new Error('current-workspace 写后回读不一致')\n return {\n $schema: 'dingtalk-agent/workspace-selection@1',\n workspace: name,\n provider: 'opencode',\n previous: info.currentWorkspace,\n current: readback,\n sideEffect: 'local-selection',\n dingtalkSideEffect: false,\n }\n}\n\nexport function runOpenCodeWorkspace(\n start: string,\n name: string,\n prompt: string,\n options: OpenCodeWorkspaceRunOptions = {},\n): Record<string, any> {\n if (!prompt.trim()) throw new Error('workspace run prompt 不能为空')\n const info = inspectAgentProject(start)\n const workspace = requireOpenCodeWorkspace(info.root, name)\n const managed = assertManagedWorkspaceIntact(info.root, workspace)\n const timeoutMs = options.timeoutMs ?? 120_000\n if (!Number.isInteger(timeoutMs) || timeoutMs < 10_000 || timeoutMs > 300_000) {\n throw new Error('workspace run timeoutMs 必须为 10000..300000')\n }\n const plan = {\n $schema: 'dingtalk-agent/opencode-workspace-run-plan@1',\n workspace: name,\n provider: 'opencode',\n model: workspace.provider.model,\n desiredHash: workspace.desiredHash,\n observedHash: workspace.observedHash,\n promptHash: sha256(prompt),\n loadProbe: 'random-per-run',\n tools: 'none',\n sideEffect: 'model-only',\n dingtalkSideEffect: false,\n }\n if (!options.execute) return { ...plan, ready: true, executeRequired: true }\n if (!options.yes) throw new Error('workspace run 会调用 OpenCode 模型;必须同时传 --execute --yes')\n\n const runId = `opencode_workspace_run_${Date.now()}_${randomUUID().slice(0, 8)}`\n const evidence = safeProjectPath(info.root, options.out || join(\n OPENCODE_EVIDENCE_ROOT, name, 'runs', runId), false)\n const sandbox = mkdtempSync(join(tmpdir(), `dta-opencode-workspace-${safeName(name)}-`))\n const command = options.command || process.env.DTA_OPENCODE_BIN || 'opencode'\n let report: Record<string, any>\n try {\n cpSync(managed, sandbox, { recursive: true })\n const probe = randomUUID()\n const skillPath = join(sandbox, '.agents', 'skills', 'dingtalk-basic-behavior', 'SKILL.md')\n const skillBody = readFileSync(skillPath, 'utf8')\n writeFileSync(skillPath, `${skillBody.trimEnd()}\\n\\n<!-- dta-load-probe:${probe} -->\\n`)\n const preflight = verifyRequiredBasicSkill(bindRequiredBasicSkill(sandbox), command)\n const probePrompt =\n '这是加载链路探针。只依据 Basic Skill 正文末尾注释回答;严格输出 `dta-load-probe=<值>`;' +\n '若看不到则输出 `dta-load-probe=not-loaded`。禁止调用工具或解释。'\n const probeExecution = runOpenCodePrompt(\n command, sandbox, workspace.provider.model, probePrompt,\n `DTA Workspace ${name} load probe`, timeoutMs,\n )\n const exactProbe = `dta-load-probe=${probe}`\n const loadPassed = probeExecution.exitCode === 0 && probeExecution.answer.trim() === exactProbe &&\n probeExecution.toolCalls === 0 && probeExecution.directoryMatched\n const marker = `[DTA-WORKSPACE-RUN-${safeName(name)}-${randomUUID()}]`\n const execution = loadPassed ? runOpenCodePrompt(\n command, sandbox, workspace.provider.model,\n `${marker}\\n执行协议:第一行逐字符原样输出 ${marker};从第二行回答用户任务;禁止调用任何工具。\\n${prompt}`,\n `DTA Workspace ${name} run`, timeoutMs,\n ) : emptyExecution('load-probe-failed')\n const exactAttributed = execution.answer.startsWith(marker)\n const answer = exactAttributed ? execution.answer.slice(marker.length).trim() : execution.answer\n const passed = loadPassed && execution.exitCode === 0 && execution.toolCalls === 0 &&\n execution.directoryMatched && exactAttributed\n report = {\n $schema: 'dingtalk-agent/opencode-workspace-run@1',\n passed,\n runId,\n workspace: name,\n provider: 'opencode',\n model: workspace.provider.model,\n sourceHash: workspace.sourceHash,\n desiredHash: workspace.desiredHash,\n observedHash: workspace.observedHash,\n evidencePath: relative(info.root, evidence),\n basic: {\n version: preflight.skill.version,\n sourceHash: workspace.state?.binding.basicHash || '',\n instrumentedHash: preflight.skill.hash,\n },\n loadProbe: executionSummary(probeExecution, {\n expected: exactProbe, exactLoaded: probeExecution.answer.trim() === exactProbe,\n }),\n execution: executionSummary(execution, { marker, exactAttributed, answer }),\n sideEffect: 'model-only',\n dingtalkSideEffect: false,\n }\n mkdirSync(evidence, { recursive: true })\n writeFileSync(join(evidence, 'prompt.txt'), prompt)\n writeFileSync(join(evidence, 'load-probe.stdout.ndjson'), probeExecution.stdout)\n writeFileSync(join(evidence, 'run.stdout.ndjson'), execution.stdout)\n atomicJson(join(evidence, 'report.json'), report)\n writeProviderOutcome(info.root, workspace, passed ? 'ready' : 'failed', {\n lastReceiptId: runId,\n })\n } catch (error) {\n report = {\n ...plan,\n $schema: 'dingtalk-agent/opencode-workspace-run@1',\n passed: false,\n runId,\n evidencePath: relative(info.root, evidence),\n failure: error.message,\n }\n mkdirSync(evidence, { recursive: true })\n atomicJson(join(evidence, 'report.json'), report)\n writeProviderOutcome(info.root, workspace, 'failed', { lastReceiptId: runId })\n } finally {\n rmSync(sandbox, { recursive: true, force: true })\n }\n return report\n}\n\nexport function evalOpenCodeWorkspace(\n start: string,\n name: string,\n suite: string,\n options: OpenCodeWorkspaceEvalOptions = {},\n): Record<string, any> {\n const info = inspectAgentProject(start)\n const workspace = requireOpenCodeWorkspace(info.root, name)\n const managed = assertManagedWorkspaceIntact(info.root, workspace)\n const selectedOut = options.out || join(\n OPENCODE_EVIDENCE_ROOT, name, 'evals',\n `opencode_eval_${Date.now()}_${randomUUID().slice(0, 8)}`,\n )\n const report = runOpenCodeEvaluation(info.root, relative(info.root, managed), suite, {\n ...options,\n model: workspace.provider.model,\n out: selectedOut,\n })\n if (!options.execute) {\n return {\n $schema: 'dingtalk-agent/opencode-workspace-eval-plan@1',\n workspace: name,\n provider: 'opencode',\n sourceHash: workspace.sourceHash,\n desiredHash: workspace.desiredHash,\n observedHash: workspace.observedHash,\n report,\n sideEffect: report.sideEffect,\n dingtalkSideEffect: false,\n }\n }\n const passed = report.passed === true && report.summary?.loadGate === true &&\n report.summary?.hardGate === true\n const evalBinding = bindEvalEvidence(info.root, workspace, report)\n writeProviderOutcome(info.root, workspace, passed ? 'ready' : 'failed', {\n lastEvalId: String(report.runId || ''),\n binding: evalBinding,\n })\n return {\n $schema: 'dingtalk-agent/opencode-workspace-eval@1',\n workspace: name,\n provider: 'opencode',\n sourceHash: workspace.sourceHash,\n desiredHash: workspace.desiredHash,\n observedHash: workspace.observedHash,\n passed,\n report,\n sideEffect: report.sideEffect,\n dingtalkSideEffect: false,\n }\n}\n\nfunction materializeProject(\n root: string, target: string, workspace: DevelopmentWorkspaceView,\n): void {\n const info = inspectAgentProject(root)\n copyProjectEntry(root, target, info.project.definition)\n if (existsSync(join(root, 'opencode.json'))) copyProjectEntry(root, target, 'opencode.json')\n for (const name of info.project.skills) {\n const source = `skills/${name}`\n if (existsSync(join(root, source))) copyProjectEntry(root, target, source)\n copyProjectEntry(root, target, `.agents/skills/${name}`)\n }\n for (const route of [workspace.storage.memory, workspace.storage.knowledge]) {\n if (!route.startsWith('local-md:')) continue\n copyProjectEntry(root, target, route.slice('local-md:'.length))\n }\n bindDefinitionInstruction(target, info.project.definition)\n}\n\nfunction bindDefinitionInstruction(target: string, definition: string): void {\n const path = join(target, 'opencode.json')\n const config = existsSync(path) ? JSON.parse(readFileSync(path, 'utf8')) : {}\n if (!config || typeof config !== 'object' || Array.isArray(config)) {\n throw new Error('opencode.json 必须是 JSON object')\n }\n const instructions = Array.isArray(config.instructions)\n ? config.instructions.filter((item: unknown): item is string => typeof item === 'string') : []\n config.instructions = [definition, ...instructions.filter((item: string) => item !== definition)]\n atomicJson(path, config)\n}\n\nfunction copyProjectEntry(root: string, target: string, ref: string): void {\n const source = safeProjectPath(root, ref, true)\n const destination = safeTargetPath(target, ref)\n if (lstatSync(source).isSymbolicLink()) throw new Error(`Project source 不允许符号链接: ${ref}`)\n mkdirSync(dirname(destination), { recursive: true })\n cpSync(source, destination, {\n recursive: true,\n filter: (path) => !lstatSync(path).isSymbolicLink(),\n })\n}\n\nfunction requireOpenCodeWorkspace(\n start: string, name: string, cliVersion = '',\n): DevelopmentWorkspaceView {\n const workspace = showDevelopmentWorkspace(start, name, cliVersion)\n if (workspace.provider.kind !== 'opencode' || workspace.legacy) {\n throw new Error(`Workspace ${name} 不是 opencode Provider;W2 不执行 ${workspace.provider.kind}`)\n }\n return workspace\n}\n\nfunction assertManagedWorkspaceIntact(root: string, workspace: DevelopmentWorkspaceView): string {\n const target = managedWorkspacePath(root, workspace.name)\n if (!existsSync(target) || !workspace.state) {\n throw new Error(`Workspace ${workspace.name} 尚未 materialize;先执行 workspace create ${workspace.name} --yes`)\n }\n const expectedRelative = relative(root, target)\n const actualHash = hashTree(target)\n const failures: string[] = []\n if (workspace.state.provider !== 'opencode') failures.push('provider')\n if (workspace.state.binding.managedPath !== expectedRelative) failures.push('managedPath')\n if (workspace.state.binding.sourceHash !== workspace.sourceHash) failures.push('sourceHash')\n if (workspace.state.desiredHash !== workspace.desiredHash) failures.push('desiredHash')\n if (workspace.state.observedHash !== actualHash) failures.push('observedHash')\n if (failures.length) {\n throw new Error(`Workspace ${workspace.name} managed state 漂移: ${failures.join(', ')}`)\n }\n return target\n}\n\nfunction writeProviderOutcome(\n root: string,\n workspace: DevelopmentWorkspaceView,\n status: 'ready' | 'failed',\n patch: {\n lastReceiptId?: string\n lastEvalId?: string\n binding?: Record<string, string>\n },\n): void {\n if (!workspace.state) throw new Error('Provider outcome 缺少 Workspace state')\n const target = assertManagedWorkspaceIntact(root, workspace)\n writeWorkspaceState(root, {\n ...workspace.state,\n status,\n binding: { ...workspace.state.binding, ...(patch.binding || {}) },\n observedHash: hashTree(target),\n lastReceiptId: patch.lastReceiptId ?? workspace.state.lastReceiptId,\n lastEvalId: patch.lastEvalId ?? workspace.state.lastEvalId,\n })\n}\n\nfunction bindEvalEvidence(\n root: string,\n workspace: DevelopmentWorkspaceView,\n report: Record<string, any>,\n): Record<string, string> {\n const runId = String(report.runId || '')\n const evidencePath = String(report.evidencePath || '')\n if (!runId || !evidencePath || report.$schema !== 'dingtalk-agent/opencode-eval-report@1') {\n throw new Error('OpenCode Eval report 缺少可绑定的 runId/evidencePath/schema')\n }\n const evidenceRoot = safeProjectPath(root, evidencePath, true)\n if (!lstatSync(evidenceRoot).isDirectory() || lstatSync(evidenceRoot).isSymbolicLink()) {\n throw new Error('OpenCode Eval evidence root 必须是 Project 内真实目录')\n }\n const planPath = safeProjectPath(root, join(evidencePath, 'plan.json'), true)\n const suitePath = safeProjectPath(root, join(evidencePath, 'suite.json'), true)\n const reportPath = safeProjectPath(root, join(evidencePath, 'report.json'), true)\n const plan = JSON.parse(readFileSync(planPath, 'utf8')) as Record<string, any>\n const suite = JSON.parse(readFileSync(suitePath, 'utf8')) as Record<string, any>\n const persistedReport = JSON.parse(readFileSync(reportPath, 'utf8')) as Record<string, any>\n if (stableStringify(persistedReport) !== stableStringify(report) ||\n String(persistedReport.runId || '') !== runId ||\n String(plan.suite || '') !== String(suite.id || '')) {\n throw new Error('OpenCode Eval evidence 写后回读与内存 report/suite 不一致')\n }\n const target = assertManagedWorkspaceIntact(root, workspace)\n return {\n evalRunId: runId,\n evalEvidencePath: evidencePath,\n evalPlanHash: sha256(readFileSync(planPath)),\n evalSuiteHash: digest(stableStringify(suite)),\n evalReportHash: sha256(readFileSync(reportPath)),\n evalSuiteId: String(suite.id || ''),\n evalModel: String(report.engine?.model || ''),\n evalSourceHash: workspace.sourceHash,\n evalDesiredHash: workspace.desiredHash,\n evalObservedHash: hashTree(target),\n }\n}\n\nfunction writeWorkspaceState(root: string, state: DevelopmentWorkspaceState): void {\n const path = join(root, WORKSPACE_STATE_ROOT, `${state.workspace}.json`)\n atomicJson(path, state)\n const readback = JSON.parse(readFileSync(path, 'utf8'))\n if (stableStringify(readback) !== stableStringify(state)) {\n throw new Error(`Workspace state 写后回读不一致: ${state.workspace}`)\n }\n}\n\nfunction managedWorkspacePath(root: string, name: string): string {\n return safeProjectPath(root, join(OPENCODE_WORKSPACE_ROOT, safeName(name)), false)\n}\n\nfunction artifactStoragePath(root: string, workspace: DevelopmentWorkspaceView): string {\n const route = workspace.storage.artifacts\n if (!route.startsWith('local-dir:')) {\n throw new Error(`Workspace ${workspace.name} Artifact route 必须是 local-dir`)\n }\n return safeProjectPath(root, route.slice('local-dir:'.length), false)\n}\n\nfunction hashTree(root: string): string {\n const rootReal = realpathSync(resolve(root))\n const entries: Array<{ path: string; hash: string }> = []\n const visit = (directory: string, prefix = ''): void => {\n for (const entry of readdirSync(directory, { withFileTypes: true })\n .sort((a, b) => a.name.localeCompare(b.name))) {\n const path = join(directory, entry.name)\n const rel = prefix ? `${prefix}/${entry.name}` : entry.name\n if (entry.isSymbolicLink()) throw new Error(`Managed Workspace 不允许符号链接: ${rel}`)\n if (entry.isDirectory()) visit(path, rel)\n else if (entry.isFile()) entries.push({ path: rel, hash: sha256(readFileSync(path)) })\n else throw new Error(`Managed Workspace 包含特殊文件: ${rel}`)\n }\n }\n visit(rootReal)\n return digest(stableStringify(entries))\n}\n\nfunction safeProjectPath(root: string, ref: string, mustExist: boolean): string {\n const rootReal = realpathSync(resolve(root))\n const candidate = resolve(rootReal, ref)\n const rel = relative(rootReal, candidate)\n if (rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`)) {\n throw new Error(`OpenCode Provider 路径必须位于 Project 内: ${ref}`)\n }\n if (mustExist && !existsSync(candidate)) throw new Error(`Project source 不存在: ${ref}`)\n if (mustExist && realpathSync(candidate) !== candidate && !isInside(rootReal, realpathSync(candidate))) {\n throw new Error(`Project source 真实路径越界: ${ref}`)\n }\n return candidate\n}\n\nfunction safeTargetPath(target: string, ref: string): string {\n const candidate = resolve(target, ref)\n if (!isInside(resolve(target), candidate) || candidate === resolve(target)) {\n throw new Error(`Materialized path 必须位于 Workspace 内: ${ref}`)\n }\n return candidate\n}\n\nfunction executionSummary(execution: OpenCodeExecution, extra: Record<string, unknown>): Record<string, unknown> {\n return {\n answer: execution.answer,\n rawAnswer: execution.answer,\n ...extra,\n exitCode: execution.exitCode,\n sessionId: execution.sessionId,\n sessionDirectory: execution.sessionDirectory,\n directoryMatched: execution.directoryMatched,\n toolCalls: execution.toolCalls,\n toolNames: execution.toolNames,\n tokens: execution.tokens,\n cost: execution.cost,\n durationMs: execution.durationMs,\n }\n}\n\nfunction emptyExecution(reason: string): OpenCodeExecution {\n return {\n exitCode: null, stdout: '', stderr: reason, answer: '', sessionId: '', toolCalls: 0,\n toolNames: [], toolPaths: [], toolTrace: [], tokens: null, cost: null, durationMs: 0,\n directoryMatched: false, sessionDirectory: '',\n sessionExport: { exitCode: null, stdout: '', stderr: '' },\n }\n}\n\nfunction atomicJson(path: string, value: unknown): void {\n atomicText(path, JSON.stringify(value, null, 2) + '\\n')\n}\n\nfunction atomicText(path: string, body: string): void {\n mkdirSync(dirname(path), { recursive: true })\n const temporary = `${path}.${process.pid}.${randomUUID().slice(0, 8)}.tmp`\n writeFileSync(temporary, body, { flag: 'wx' })\n renameSync(temporary, path)\n}\n\nfunction sha256(value: string | Buffer): string {\n return createHash('sha256').update(value).digest('hex')\n}\n\nfunction safeName(value: string): string {\n if (!/^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$/.test(value)) {\n throw new Error(`Workspace name 非法: ${value}`)\n }\n return value\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"]}
1
+ {"version":3,"file":"opencode-provider.js","sourceRoot":"","sources":["../../src/opencode-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomUUID } from 'node:crypto'\nimport {\n cpSync, existsSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, readdirSync,\n realpathSync, renameSync, rmdirSync, rmSync, writeFileSync,\n} from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { dirname, join, relative, resolve } from 'node:path'\nimport {\n CURRENT_WORKSPACE_FILE, WORKSPACE_STATE_ROOT,\n inspectAgentProject, projectSkillRef, showDevelopmentWorkspace,\n type DevelopmentWorkspaceState, type DevelopmentWorkspaceView,\n} from './development-workspace.js'\nimport { digest, stableStringify } from './events.js'\nimport {\n prepareOpenCodeEvalAgent, runOpenCodeEvaluation, runOpenCodePrompt,\n type OpenCodeEvalOptions, type OpenCodeExecution,\n} from './opencode-evals.js'\nimport {\n bindRequiredBasicSkill, verifyRequiredBasicSkill, type OpenCodeSkillPreflight,\n} from './opencode-workspace.js'\nimport { instructionTargetsPath } from './instruction-path.js'\n\nexport const OPENCODE_WORKSPACE_ROOT = '.dingtalk-agent/development-workspaces'\nexport const OPENCODE_EVIDENCE_ROOT = '.dingtalk-agent/development-workspace-evidence'\n\nexport interface OpenCodeWorkspacePlan {\n $schema: 'dingtalk-agent/opencode-workspace-plan@1'\n planId: string\n workspace: string\n provider: 'opencode'\n model: string\n action: 'create' | 'rebuild' | 'noop'\n root: string\n managedPath: string\n sourceHash: string\n desiredHash: string\n observedHash: string\n currentState: string\n writes: string[]\n sideEffect: false\n dingtalkSideEffect: false\n}\n\nexport interface OpenCodeWorkspaceApplyResult extends Omit<OpenCodeWorkspacePlan, '$schema' | 'sideEffect'> {\n $schema: 'dingtalk-agent/opencode-workspace-apply@1'\n applied: boolean\n idempotent: boolean\n status: 'verifying' | 'ready'\n observedHash: string\n binding: Record<string, string>\n sideEffect: 'local-managed-workspace'\n dingtalkSideEffect: false\n}\n\nexport interface OpenCodeWorkspaceRunOptions {\n execute?: boolean\n yes?: boolean\n command?: string\n timeoutMs?: number\n out?: string\n}\n\nexport interface OpenCodeWorkspaceEvalOptions extends OpenCodeEvalOptions {}\n\nexport function planOpenCodeWorkspace(\n start: string, name: string, cliVersion = '',\n): OpenCodeWorkspacePlan {\n const info = inspectAgentProject(start, cliVersion)\n const workspace = requireOpenCodeWorkspace(info.root, name, cliVersion)\n const target = managedWorkspacePath(info.root, name)\n const artifactPath = artifactStoragePath(info.root, workspace)\n const observedHash = existsSync(target) ? hashTree(target) : ''\n const state = workspace.state\n const intact = Boolean(state && state.provider === 'opencode' &&\n state.desiredHash === workspace.desiredHash && state.observedHash === observedHash &&\n state.binding.managedPath === relative(info.root, target) &&\n existsSync(artifactPath) && lstatSync(artifactPath).isDirectory())\n const action = !existsSync(target) ? 'create' : intact ? 'noop' : 'rebuild'\n const planId = `opencode_plan_${digest(stableStringify({\n workspace: name, desiredHash: workspace.desiredHash, observedHash, action,\n })).slice(0, 24)}`\n return {\n $schema: 'dingtalk-agent/opencode-workspace-plan@1',\n planId,\n workspace: name,\n provider: 'opencode',\n model: workspace.provider.model,\n action,\n root: info.root,\n managedPath: relative(info.root, target),\n sourceHash: workspace.sourceHash,\n desiredHash: workspace.desiredHash,\n observedHash,\n currentState: workspace.status,\n writes: action === 'noop' ? [] : [\n relative(info.root, target),\n relative(info.root, artifactPath),\n join(WORKSPACE_STATE_ROOT, `${name}.json`),\n ],\n sideEffect: false,\n dingtalkSideEffect: false,\n }\n}\n\nexport function applyOpenCodeWorkspace(\n start: string,\n name: string,\n options: { yes?: boolean; command?: string; cliVersion?: string } = {},\n): OpenCodeWorkspaceApplyResult {\n if (!options.yes) throw new Error('workspace create 会写本地 managed Workspace;必须显式传 --yes')\n const cliVersion = options.cliVersion || ''\n const plan = planOpenCodeWorkspace(start, name, cliVersion)\n const workspace = requireOpenCodeWorkspace(plan.root, name, cliVersion)\n const target = resolve(plan.root, plan.managedPath)\n const artifactPath = artifactStoragePath(plan.root, workspace)\n const artifactExisted = existsSync(artifactPath)\n const command = options.command || process.env.DTA_OPENCODE_BIN || 'opencode'\n if (plan.action === 'noop') {\n const binding = workspace.state?.binding || {}\n const stateStatus = workspace.state?.status === 'ready' ? 'ready' : 'verifying'\n return {\n ...plan,\n $schema: 'dingtalk-agent/opencode-workspace-apply@1',\n applied: false,\n idempotent: true,\n status: stateStatus,\n binding,\n sideEffect: 'local-managed-workspace',\n dingtalkSideEffect: false,\n }\n }\n\n mkdirSync(dirname(target), { recursive: true })\n const staging = `${target}.tmp-${process.pid}-${randomUUID().slice(0, 8)}`\n const backup = `${target}.backup-${process.pid}-${randomUUID().slice(0, 8)}`\n const preflightSandbox = mkdtempSync(join(\n tmpdir(), `dta-opencode-workspace-preflight-${safeName(name)}-`,\n ))\n let preflight: OpenCodeSkillPreflight | null = null\n try {\n mkdirSync(staging, { recursive: false })\n materializeProject(plan.root, staging, workspace)\n prepareOpenCodeEvalAgent(staging, 'none')\n bindRequiredBasicSkill(staging)\n cpSync(staging, preflightSandbox, { recursive: true })\n preflight = verifyRequiredBasicSkill(bindRequiredBasicSkill(preflightSandbox), command)\n if (existsSync(target)) renameSync(target, backup)\n renameSync(staging, target)\n mkdirSync(artifactPath, { recursive: true })\n if (existsSync(backup)) rmSync(backup, { recursive: true, force: true })\n } catch (error) {\n rmSync(staging, { recursive: true, force: true })\n if (existsSync(backup)) {\n rmSync(target, { recursive: true, force: true })\n renameSync(backup, target)\n } else if (existsSync(target) && plan.action === 'create') {\n rmSync(target, { recursive: true, force: true })\n }\n if (!artifactExisted && existsSync(artifactPath)) {\n try { rmdirSync(artifactPath) } catch { /* preserve non-empty concurrent writes */ }\n }\n throw error\n } finally {\n rmSync(preflightSandbox, { recursive: true, force: true })\n }\n\n const observedHash = hashTree(target)\n const binding = {\n managedPath: relative(plan.root, target),\n model: workspace.provider.model,\n sourceHash: workspace.sourceHash,\n basicHash: String(preflight?.skill.hash || ''),\n basicVersion: String(preflight?.skill.version || ''),\n configHash: String(preflight?.configHash || ''),\n openCodeVersion: String(preflight?.openCodeVersion || ''),\n }\n writeWorkspaceState(plan.root, {\n $schema: 'dingtalk-agent/workspace-state@1',\n workspace: name,\n provider: 'opencode',\n status: 'verifying',\n binding,\n desiredHash: workspace.desiredHash,\n observedHash,\n lastPlanId: plan.planId,\n lastReceiptId: '',\n lastEvalId: '',\n })\n return {\n ...plan,\n $schema: 'dingtalk-agent/opencode-workspace-apply@1',\n applied: true,\n idempotent: false,\n status: 'verifying',\n observedHash,\n binding,\n sideEffect: 'local-managed-workspace',\n dingtalkSideEffect: false,\n }\n}\n\nexport function useOpenCodeWorkspace(start: string, name: string, cliVersion = ''): Record<string, unknown> {\n const info = inspectAgentProject(start, cliVersion)\n const workspace = requireOpenCodeWorkspace(info.root, name, cliVersion)\n assertManagedWorkspaceIntact(info.root, workspace)\n const path = join(info.root, CURRENT_WORKSPACE_FILE)\n atomicText(path, `${name}\\n`)\n const readback = readFileSync(path, 'utf8').trim()\n if (readback !== name) throw new Error('current-workspace 写后回读不一致')\n return {\n $schema: 'dingtalk-agent/workspace-selection@1',\n workspace: name,\n provider: 'opencode',\n previous: info.currentWorkspace,\n current: readback,\n sideEffect: 'local-selection',\n dingtalkSideEffect: false,\n }\n}\n\nexport function runOpenCodeWorkspace(\n start: string,\n name: string,\n prompt: string,\n options: OpenCodeWorkspaceRunOptions = {},\n): Record<string, any> {\n if (!prompt.trim()) throw new Error('workspace run prompt 不能为空')\n const info = inspectAgentProject(start)\n const workspace = requireOpenCodeWorkspace(info.root, name)\n const managed = assertManagedWorkspaceIntact(info.root, workspace)\n const timeoutMs = options.timeoutMs ?? 120_000\n if (!Number.isInteger(timeoutMs) || timeoutMs < 10_000 || timeoutMs > 300_000) {\n throw new Error('workspace run timeoutMs 必须为 10000..300000')\n }\n const plan = {\n $schema: 'dingtalk-agent/opencode-workspace-run-plan@1',\n workspace: name,\n provider: 'opencode',\n model: workspace.provider.model,\n desiredHash: workspace.desiredHash,\n observedHash: workspace.observedHash,\n promptHash: sha256(prompt),\n loadProbe: 'random-per-run',\n tools: 'none',\n sideEffect: 'model-only',\n dingtalkSideEffect: false,\n }\n if (!options.execute) return { ...plan, ready: true, executeRequired: true }\n if (!options.yes) throw new Error('workspace run 会调用 OpenCode 模型;必须同时传 --execute --yes')\n\n const runId = `opencode_workspace_run_${Date.now()}_${randomUUID().slice(0, 8)}`\n const evidence = safeProjectPath(info.root, options.out || join(\n OPENCODE_EVIDENCE_ROOT, name, 'runs', runId), false)\n const sandbox = mkdtempSync(join(tmpdir(), `dta-opencode-workspace-${safeName(name)}-`))\n const command = options.command || process.env.DTA_OPENCODE_BIN || 'opencode'\n let report: Record<string, any>\n try {\n cpSync(managed, sandbox, { recursive: true })\n const probe = randomUUID()\n const skillPath = join(sandbox, '.agents', 'skills', 'dta-basic-behavior', 'SKILL.md')\n const skillBody = readFileSync(skillPath, 'utf8')\n writeFileSync(skillPath, `${skillBody.trimEnd()}\\n\\n<!-- dta-load-probe:${probe} -->\\n`)\n const preflight = verifyRequiredBasicSkill(bindRequiredBasicSkill(sandbox), command)\n const probePrompt =\n '这是加载链路探针。只依据 Basic Skill 正文末尾注释回答;严格输出 `dta-load-probe=<值>`;' +\n '若看不到则输出 `dta-load-probe=not-loaded`。禁止调用工具或解释。'\n const probeExecution = runOpenCodePrompt(\n command, sandbox, workspace.provider.model, probePrompt,\n `DTA Workspace ${name} load probe`, timeoutMs,\n )\n const exactProbe = `dta-load-probe=${probe}`\n const loadPassed = probeExecution.exitCode === 0 && probeExecution.answer.trim() === exactProbe &&\n probeExecution.toolCalls === 0 && probeExecution.directoryMatched\n const marker = `[DTA-WORKSPACE-RUN-${safeName(name)}-${randomUUID()}]`\n const execution = loadPassed ? runOpenCodePrompt(\n command, sandbox, workspace.provider.model,\n `${marker}\\n执行协议:第一行逐字符原样输出 ${marker};从第二行回答用户任务;禁止调用任何工具。\\n${prompt}`,\n `DTA Workspace ${name} run`, timeoutMs,\n ) : emptyExecution('load-probe-failed')\n const exactAttributed = execution.answer.startsWith(marker)\n const answer = exactAttributed ? execution.answer.slice(marker.length).trim() : execution.answer\n const passed = loadPassed && execution.exitCode === 0 && execution.toolCalls === 0 &&\n execution.directoryMatched && exactAttributed\n report = {\n $schema: 'dingtalk-agent/opencode-workspace-run@1',\n passed,\n runId,\n workspace: name,\n provider: 'opencode',\n model: workspace.provider.model,\n sourceHash: workspace.sourceHash,\n desiredHash: workspace.desiredHash,\n observedHash: workspace.observedHash,\n evidencePath: relative(info.root, evidence),\n basic: {\n version: preflight.skill.version,\n sourceHash: workspace.state?.binding.basicHash || '',\n instrumentedHash: preflight.skill.hash,\n },\n loadProbe: executionSummary(probeExecution, {\n expected: exactProbe, exactLoaded: probeExecution.answer.trim() === exactProbe,\n }),\n execution: executionSummary(execution, { marker, exactAttributed, answer }),\n sideEffect: 'model-only',\n dingtalkSideEffect: false,\n }\n mkdirSync(evidence, { recursive: true })\n writeFileSync(join(evidence, 'prompt.txt'), prompt)\n writeFileSync(join(evidence, 'load-probe.stdout.ndjson'), probeExecution.stdout)\n writeFileSync(join(evidence, 'run.stdout.ndjson'), execution.stdout)\n atomicJson(join(evidence, 'report.json'), report)\n writeProviderOutcome(info.root, workspace, passed ? 'ready' : 'failed', {\n lastReceiptId: runId,\n })\n } catch (error) {\n report = {\n ...plan,\n $schema: 'dingtalk-agent/opencode-workspace-run@1',\n passed: false,\n runId,\n evidencePath: relative(info.root, evidence),\n failure: error.message,\n }\n mkdirSync(evidence, { recursive: true })\n atomicJson(join(evidence, 'report.json'), report)\n writeProviderOutcome(info.root, workspace, 'failed', { lastReceiptId: runId })\n } finally {\n rmSync(sandbox, { recursive: true, force: true })\n }\n return report\n}\n\nexport function evalOpenCodeWorkspace(\n start: string,\n name: string,\n suite: string,\n options: OpenCodeWorkspaceEvalOptions = {},\n): Record<string, any> {\n const info = inspectAgentProject(start)\n const workspace = requireOpenCodeWorkspace(info.root, name)\n const managed = assertManagedWorkspaceIntact(info.root, workspace)\n const selectedOut = options.out || join(\n OPENCODE_EVIDENCE_ROOT, name, 'evals',\n `opencode_eval_${Date.now()}_${randomUUID().slice(0, 8)}`,\n )\n const report = runOpenCodeEvaluation(info.root, relative(info.root, managed), suite, {\n ...options,\n model: workspace.provider.model,\n out: selectedOut,\n })\n if (!options.execute) {\n return {\n $schema: 'dingtalk-agent/opencode-workspace-eval-plan@1',\n workspace: name,\n provider: 'opencode',\n sourceHash: workspace.sourceHash,\n desiredHash: workspace.desiredHash,\n observedHash: workspace.observedHash,\n report,\n sideEffect: report.sideEffect,\n dingtalkSideEffect: false,\n }\n }\n const passed = report.passed === true && report.summary?.loadGate === true &&\n report.summary?.hardGate === true\n const evalBinding = bindEvalEvidence(info.root, workspace, report)\n writeProviderOutcome(info.root, workspace, passed ? 'ready' : 'failed', {\n lastEvalId: String(report.runId || ''),\n binding: evalBinding,\n })\n return {\n $schema: 'dingtalk-agent/opencode-workspace-eval@1',\n workspace: name,\n provider: 'opencode',\n sourceHash: workspace.sourceHash,\n desiredHash: workspace.desiredHash,\n observedHash: workspace.observedHash,\n passed,\n report,\n sideEffect: report.sideEffect,\n dingtalkSideEffect: false,\n }\n}\n\nfunction materializeProject(\n root: string, target: string, workspace: DevelopmentWorkspaceView,\n): void {\n const info = inspectAgentProject(root)\n copyProjectEntry(root, target, info.project.definition)\n if (existsSync(join(root, 'opencode.json'))) copyProjectEntry(root, target, 'opencode.json')\n for (const name of info.project.skills) {\n const source = projectSkillRef(info.project, name)\n copyProjectEntry(root, target, source)\n const destination = join(target, '.agents', 'skills', name)\n mkdirSync(dirname(destination), { recursive: true })\n cpSync(safeProjectPath(root, source, true), destination, { recursive: true })\n }\n for (const route of [workspace.storage.memory, workspace.storage.knowledge]) {\n if (!route) continue\n if (!route.startsWith('local-md:')) continue\n copyProjectEntry(root, target, route.slice('local-md:'.length))\n }\n bindDefinitionInstruction(target, info.project.definition)\n removePackagedBasicInstruction(target, projectSkillRef(\n info.project, 'dta-basic-behavior'))\n}\n\nfunction removePackagedBasicInstruction(target: string, basicRoot: string): void {\n const path = join(target, 'opencode.json')\n const config = existsSync(path) ? JSON.parse(readFileSync(path, 'utf8')) : {}\n const instructions = Array.isArray(config.instructions)\n ? config.instructions.filter((item: unknown): item is string => typeof item === 'string') : []\n const packaged = `${basicRoot}/SKILL.md`\n config.instructions = instructions.filter((item: string) =>\n !instructionTargetsPath(target, item, packaged))\n atomicJson(path, config)\n}\n\nfunction bindDefinitionInstruction(target: string, definition: string): void {\n const path = join(target, 'opencode.json')\n const config = existsSync(path) ? JSON.parse(readFileSync(path, 'utf8')) : {}\n if (!config || typeof config !== 'object' || Array.isArray(config)) {\n throw new Error('opencode.json 必须是 JSON object')\n }\n const instructions = Array.isArray(config.instructions)\n ? config.instructions.filter((item: unknown): item is string => typeof item === 'string') : []\n config.instructions = [definition, ...instructions.filter((item: string) => item !== definition)]\n atomicJson(path, config)\n}\n\nfunction copyProjectEntry(root: string, target: string, ref: string): void {\n const source = safeProjectPath(root, ref, true)\n const destination = safeTargetPath(target, ref)\n if (lstatSync(source).isSymbolicLink()) throw new Error(`Project source 不允许符号链接: ${ref}`)\n mkdirSync(dirname(destination), { recursive: true })\n cpSync(source, destination, {\n recursive: true,\n filter: (path) => !lstatSync(path).isSymbolicLink(),\n })\n}\n\nfunction requireOpenCodeWorkspace(\n start: string, name: string, cliVersion = '',\n): DevelopmentWorkspaceView {\n const workspace = showDevelopmentWorkspace(start, name, cliVersion)\n if (workspace.provider.kind !== 'opencode' || workspace.legacy) {\n throw new Error(`Workspace ${name} 不是 opencode Provider;W2 不执行 ${workspace.provider.kind}`)\n }\n return workspace\n}\n\nfunction assertManagedWorkspaceIntact(root: string, workspace: DevelopmentWorkspaceView): string {\n const target = managedWorkspacePath(root, workspace.name)\n if (!existsSync(target) || !workspace.state) {\n throw new Error(`Workspace ${workspace.name} 尚未 materialize;先执行 workspace create ${workspace.name} --yes`)\n }\n const expectedRelative = relative(root, target)\n const actualHash = hashTree(target)\n const failures: string[] = []\n if (workspace.state.provider !== 'opencode') failures.push('provider')\n if (workspace.state.binding.managedPath !== expectedRelative) failures.push('managedPath')\n if (workspace.state.binding.sourceHash !== workspace.sourceHash) failures.push('sourceHash')\n if (workspace.state.desiredHash !== workspace.desiredHash) failures.push('desiredHash')\n if (workspace.state.observedHash !== actualHash) failures.push('observedHash')\n if (failures.length) {\n throw new Error(`Workspace ${workspace.name} managed state 漂移: ${failures.join(', ')}`)\n }\n return target\n}\n\nfunction writeProviderOutcome(\n root: string,\n workspace: DevelopmentWorkspaceView,\n status: 'ready' | 'failed',\n patch: {\n lastReceiptId?: string\n lastEvalId?: string\n binding?: Record<string, string>\n },\n): void {\n if (!workspace.state) throw new Error('Provider outcome 缺少 Workspace state')\n const target = assertManagedWorkspaceIntact(root, workspace)\n writeWorkspaceState(root, {\n ...workspace.state,\n status,\n binding: { ...workspace.state.binding, ...(patch.binding || {}) },\n observedHash: hashTree(target),\n lastReceiptId: patch.lastReceiptId ?? workspace.state.lastReceiptId,\n lastEvalId: patch.lastEvalId ?? workspace.state.lastEvalId,\n })\n}\n\nfunction bindEvalEvidence(\n root: string,\n workspace: DevelopmentWorkspaceView,\n report: Record<string, any>,\n): Record<string, string> {\n const runId = String(report.runId || '')\n const evidencePath = String(report.evidencePath || '')\n if (!runId || !evidencePath || report.$schema !== 'dingtalk-agent/opencode-eval-report@1') {\n throw new Error('OpenCode Eval report 缺少可绑定的 runId/evidencePath/schema')\n }\n const evidenceRoot = safeProjectPath(root, evidencePath, true)\n if (!lstatSync(evidenceRoot).isDirectory() || lstatSync(evidenceRoot).isSymbolicLink()) {\n throw new Error('OpenCode Eval evidence root 必须是 Project 内真实目录')\n }\n const planPath = safeProjectPath(root, join(evidencePath, 'plan.json'), true)\n const suitePath = safeProjectPath(root, join(evidencePath, 'suite.json'), true)\n const reportPath = safeProjectPath(root, join(evidencePath, 'report.json'), true)\n const plan = JSON.parse(readFileSync(planPath, 'utf8')) as Record<string, any>\n const suite = JSON.parse(readFileSync(suitePath, 'utf8')) as Record<string, any>\n const persistedReport = JSON.parse(readFileSync(reportPath, 'utf8')) as Record<string, any>\n if (stableStringify(persistedReport) !== stableStringify(report) ||\n String(persistedReport.runId || '') !== runId ||\n String(plan.suite || '') !== String(suite.id || '')) {\n throw new Error('OpenCode Eval evidence 写后回读与内存 report/suite 不一致')\n }\n const target = assertManagedWorkspaceIntact(root, workspace)\n return {\n evalRunId: runId,\n evalEvidencePath: evidencePath,\n evalPlanHash: sha256(readFileSync(planPath)),\n evalSuiteHash: digest(stableStringify(suite)),\n evalReportHash: sha256(readFileSync(reportPath)),\n evalSuiteId: String(suite.id || ''),\n evalModel: String(report.engine?.model || ''),\n evalSourceHash: workspace.sourceHash,\n evalDesiredHash: workspace.desiredHash,\n evalObservedHash: hashTree(target),\n }\n}\n\nfunction writeWorkspaceState(root: string, state: DevelopmentWorkspaceState): void {\n const path = join(root, WORKSPACE_STATE_ROOT, `${state.workspace}.json`)\n atomicJson(path, state)\n const readback = JSON.parse(readFileSync(path, 'utf8'))\n if (stableStringify(readback) !== stableStringify(state)) {\n throw new Error(`Workspace state 写后回读不一致: ${state.workspace}`)\n }\n}\n\nfunction managedWorkspacePath(root: string, name: string): string {\n return safeProjectPath(root, join(OPENCODE_WORKSPACE_ROOT, safeName(name)), false)\n}\n\nfunction artifactStoragePath(root: string, workspace: DevelopmentWorkspaceView): string {\n const route = workspace.storage.artifacts\n if (!route || !route.startsWith('local-dir:')) {\n throw new Error(`Workspace ${workspace.name} Artifact route 必须是 local-dir`)\n }\n return safeProjectPath(root, route.slice('local-dir:'.length), false)\n}\n\nfunction hashTree(root: string): string {\n const rootReal = realpathSync(resolve(root))\n const entries: Array<{ path: string; hash: string }> = []\n const visit = (directory: string, prefix = ''): void => {\n for (const entry of readdirSync(directory, { withFileTypes: true })\n .sort((a, b) => a.name.localeCompare(b.name))) {\n const path = join(directory, entry.name)\n const rel = prefix ? `${prefix}/${entry.name}` : entry.name\n if (entry.isSymbolicLink()) throw new Error(`Managed Workspace 不允许符号链接: ${rel}`)\n if (entry.isDirectory()) visit(path, rel)\n else if (entry.isFile()) entries.push({ path: rel, hash: sha256(readFileSync(path)) })\n else throw new Error(`Managed Workspace 包含特殊文件: ${rel}`)\n }\n }\n visit(rootReal)\n return digest(stableStringify(entries))\n}\n\nfunction safeProjectPath(root: string, ref: string, mustExist: boolean): string {\n const rootReal = realpathSync(resolve(root))\n const candidate = resolve(rootReal, ref)\n const rel = relative(rootReal, candidate)\n if (rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`)) {\n throw new Error(`OpenCode Provider 路径必须位于 Project 内: ${ref}`)\n }\n if (mustExist && !existsSync(candidate)) throw new Error(`Project source 不存在: ${ref}`)\n if (mustExist && realpathSync(candidate) !== candidate && !isInside(rootReal, realpathSync(candidate))) {\n throw new Error(`Project source 真实路径越界: ${ref}`)\n }\n return candidate\n}\n\nfunction safeTargetPath(target: string, ref: string): string {\n const candidate = resolve(target, ref)\n if (!isInside(resolve(target), candidate) || candidate === resolve(target)) {\n throw new Error(`Materialized path 必须位于 Workspace 内: ${ref}`)\n }\n return candidate\n}\n\nfunction executionSummary(execution: OpenCodeExecution, extra: Record<string, unknown>): Record<string, unknown> {\n return {\n answer: execution.answer,\n rawAnswer: execution.answer,\n ...extra,\n exitCode: execution.exitCode,\n sessionId: execution.sessionId,\n sessionDirectory: execution.sessionDirectory,\n directoryMatched: execution.directoryMatched,\n toolCalls: execution.toolCalls,\n toolNames: execution.toolNames,\n tokens: execution.tokens,\n cost: execution.cost,\n durationMs: execution.durationMs,\n }\n}\n\nfunction emptyExecution(reason: string): OpenCodeExecution {\n return {\n exitCode: null, stdout: '', stderr: reason, answer: '', sessionId: '', toolCalls: 0,\n toolNames: [], toolPaths: [], toolTrace: [], tokens: null, cost: null, durationMs: 0,\n directoryMatched: false, sessionDirectory: '',\n sessionExport: { exitCode: null, stdout: '', stderr: '' },\n }\n}\n\nfunction atomicJson(path: string, value: unknown): void {\n atomicText(path, JSON.stringify(value, null, 2) + '\\n')\n}\n\nfunction atomicText(path: string, body: string): void {\n mkdirSync(dirname(path), { recursive: true })\n const temporary = `${path}.${process.pid}.${randomUUID().slice(0, 8)}.tmp`\n writeFileSync(temporary, body, { flag: 'wx' })\n renameSync(temporary, path)\n}\n\nfunction sha256(value: string | Buffer): string {\n return createHash('sha256').update(value).digest('hex')\n}\n\nfunction safeName(value: string): string {\n if (!/^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$/.test(value)) {\n throw new Error(`Workspace name 非法: ${value}`)\n }\n return value\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"]}
@@ -4,8 +4,8 @@ import { spawnSync } from 'node:child_process';
4
4
  import { join, relative, resolve } from 'node:path';
5
5
  import { tmpdir } from 'node:os';
6
6
  import { countInstructionsForPath, instructionTargetsPath, instructionUsesGlob, } from './instruction-path.js';
7
- export const REQUIRED_BASIC_SKILL = 'dingtalk-basic-behavior';
8
- export const REQUIRED_BASIC_SKILL_INSTRUCTION = '.agents/skills/dingtalk-basic-behavior/SKILL.md';
7
+ export const REQUIRED_BASIC_SKILL = 'dta-basic-behavior';
8
+ export const REQUIRED_BASIC_SKILL_INSTRUCTION = '.agents/skills/dta-basic-behavior/SKILL.md';
9
9
  /**
10
10
  * OpenCode only discovers project Skills by default; it does not load their body.
11
11
  * This binding makes the Basic Skill an unconditional instruction while retaining
@@ -76,7 +76,7 @@ export function verifyRequiredBasicSkill(binding, command = process.env.DTA_OPEN
76
76
  const resolved = parseObject(configRun, 'opencode debug config');
77
77
  const resolvedInstructions = stringArray(resolved.instructions || [], 'opencode resolved instructions');
78
78
  if (countInstructionsForPath(binding.workspace, resolvedInstructions, REQUIRED_BASIC_SKILL_INSTRUCTION) !== 1) {
79
- throw new Error('OpenCode resolved config 未唯一加载 dingtalk-basic-behavior');
79
+ throw new Error('OpenCode resolved config 未唯一加载 dta-basic-behavior');
80
80
  }
81
81
  const isolatedHome = mkdtempSync(join(tmpdir(), 'dta-opencode-preflight-'));
82
82
  let skillsRun = '';
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-workspace.js","sourceRoot":"","sources":["../../src/opencode-workspace.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto'\nimport {\n existsSync, mkdtempSync, readFileSync, realpathSync, renameSync, rmSync, writeFileSync,\n} from 'node:fs'\nimport { spawnSync } from 'node:child_process'\nimport { join, relative, resolve } from 'node:path'\nimport { tmpdir } from 'node:os'\nimport {\n countInstructionsForPath, instructionTargetsPath, instructionUsesGlob,\n} from './instruction-path.js'\n\nexport const REQUIRED_BASIC_SKILL = 'dingtalk-basic-behavior'\nexport const REQUIRED_BASIC_SKILL_INSTRUCTION =\n '.agents/skills/dingtalk-basic-behavior/SKILL.md'\n\nexport interface OpenCodeSkillBinding {\n $schema: 'dingtalk-agent/opencode-skill-binding@1'\n host: 'opencode'\n required: true\n strategy: 'instructions'\n workspace: string\n configPath: string\n instruction: string\n skill: {\n name: string\n version: string\n path: string\n hash: string\n }\n configHash: string\n}\n\nexport interface OpenCodeSkillPreflight extends OpenCodeSkillBinding {\n verified: true\n openCodeVersion: string\n resolvedInstruction: true\n resolvedInstructions: string[]\n discoveredProjectSkill: true\n}\n\n/**\n * OpenCode only discovers project Skills by default; it does not load their body.\n * This binding makes the Basic Skill an unconditional instruction while retaining\n * the native project Skill for discovery and explicit inspection.\n */\nexport function bindRequiredBasicSkill(workspace: string): OpenCodeSkillBinding {\n const workspaceReal = realpathSync(resolve(workspace))\n const skillPath = join(workspaceReal, REQUIRED_BASIC_SKILL_INSTRUCTION)\n if (!existsSync(skillPath)) {\n throw new Error(`OpenCode 必需 Basic Skill 不存在: ${skillPath}`)\n }\n const skillBody = readFileSync(skillPath, 'utf8')\n const name = frontmatterValue(skillBody, 'name')\n const version = metadataVersion(skillBody)\n if (name !== REQUIRED_BASIC_SKILL || !version) {\n throw new Error(`OpenCode Basic Skill 元数据非法: name=${name || 'missing'} version=${version || 'missing'}`)\n }\n\n const configPath = join(workspaceReal, 'opencode.json')\n const config = existsSync(configPath)\n ? parseObject(readFileSync(configPath, 'utf8'), 'opencode.json')\n : {}\n const instructions = config.instructions === undefined\n ? []\n : stringArray(config.instructions, 'opencode.json#instructions')\n const conflictingGlob = instructions.find((item) =>\n instructionUsesGlob(item) && instructionTargetsPath(\n workspaceReal, item, REQUIRED_BASIC_SKILL_INSTRUCTION))\n if (conflictingGlob) {\n throw new Error(\n `OpenCode instruction glob 命中 Basic Skill,无法安全去重: ${conflictingGlob}`)\n }\n config.$schema ||= 'https://opencode.ai/config.json'\n config.instructions = [\n REQUIRED_BASIC_SKILL_INSTRUCTION,\n ...instructions.filter((item) => !instructionTargetsPath(\n workspaceReal, item, REQUIRED_BASIC_SKILL_INSTRUCTION)),\n ]\n\n const permission = config.permission === undefined\n ? {}\n : objectValue(config.permission, 'opencode.json#permission')\n const skillPermission = permission.skill === undefined\n ? {}\n : objectValue(permission.skill, 'opencode.json#permission.skill')\n skillPermission[REQUIRED_BASIC_SKILL] = 'allow'\n permission.skill = skillPermission\n config.permission = permission\n atomicJson(configPath, config)\n\n return {\n $schema: 'dingtalk-agent/opencode-skill-binding@1',\n host: 'opencode',\n required: true,\n strategy: 'instructions',\n workspace: workspaceReal,\n configPath,\n instruction: REQUIRED_BASIC_SKILL_INSTRUCTION,\n skill: {\n name,\n version,\n path: realpathSync(skillPath),\n hash: sha256(skillBody),\n },\n configHash: sha256(readFileSync(configPath, 'utf8')),\n }\n}\n\nexport function verifyRequiredBasicSkill(\n binding: OpenCodeSkillBinding,\n command = process.env.DTA_OPENCODE_BIN || 'opencode',\n environment?: NodeJS.ProcessEnv,\n): OpenCodeSkillPreflight {\n const current = bindRequiredBasicSkill(binding.workspace)\n if (current.skill.hash !== binding.skill.hash || current.configHash !== binding.configHash) {\n throw new Error('OpenCode Basic Skill 或配置在 preflight 前发生漂移')\n }\n\n const versionRun = runOpenCode(command, ['--version'], binding.workspace, undefined, environment)\n const configRun = runOpenCode(\n command, ['debug', 'config', '--pure'], binding.workspace, undefined, environment)\n const resolved = parseObject(configRun, 'opencode debug config')\n const resolvedInstructions = stringArray(\n resolved.instructions || [], 'opencode resolved instructions')\n if (countInstructionsForPath(\n binding.workspace, resolvedInstructions, REQUIRED_BASIC_SKILL_INSTRUCTION,\n ) !== 1) {\n throw new Error('OpenCode resolved config 未唯一加载 dingtalk-basic-behavior')\n }\n\n const isolatedHome = mkdtempSync(join(tmpdir(), 'dta-opencode-preflight-'))\n let skillsRun = ''\n try {\n skillsRun = runOpenCode(\n command, ['debug', 'skill', '--pure'], binding.workspace, 4 * 1024 * 1024, {\n ...(environment || process.env),\n HOME: isolatedHome,\n XDG_CONFIG_HOME: join(isolatedHome, 'config'),\n XDG_DATA_HOME: join(isolatedHome, 'data'),\n XDG_CACHE_HOME: join(isolatedHome, 'cache'),\n XDG_STATE_HOME: join(isolatedHome, 'state'),\n })\n } finally {\n rmSync(isolatedHome, { recursive: true, force: true })\n }\n const discoveredLocation = skillsRun.match(\n new RegExp(`\"name\":\\\\s*\"${REQUIRED_BASIC_SKILL}\"[\\\\s\\\\S]{0,4000}?\"location\":\\\\s*\"([^\"]+)\"`),\n )?.[1]\n let discovered = false\n if (discoveredLocation) {\n try {\n const decoded = JSON.parse(`\"${discoveredLocation}\"`)\n discovered = existsSync(decoded) && realpathSync(decoded) === binding.skill.path\n } catch { /* malformed or truncated debug output */ }\n }\n if (!discovered) {\n const marker = skillsRun.indexOf(REQUIRED_BASIC_SKILL)\n const nearby = marker >= 0\n ? skillsRun.slice(Math.max(0, marker - 160), marker + 600).replace(/\\s+/g, ' ')\n : `debug skill bytes=${Buffer.byteLength(skillsRun)}`\n throw new Error(`OpenCode 未从当前项目发现 Basic Skill: ${binding.skill.path}; ${nearby}`)\n }\n\n return {\n ...binding,\n verified: true,\n openCodeVersion: versionRun.trim(),\n resolvedInstruction: true,\n resolvedInstructions,\n discoveredProjectSkill: true,\n }\n}\n\nexport function removeRequiredBasicSkillInstruction(workspace: string): void {\n const workspaceReal = realpathSync(resolve(workspace))\n const configPath = join(workspaceReal, 'opencode.json')\n const config = existsSync(configPath)\n ? parseObject(readFileSync(configPath, 'utf8'), 'opencode.json')\n : {}\n const instructions = config.instructions === undefined\n ? []\n : stringArray(config.instructions, 'opencode.json#instructions')\n const conflictingGlob = instructions.find((item) =>\n instructionUsesGlob(item) && instructionTargetsPath(\n workspaceReal, item, REQUIRED_BASIC_SKILL_INSTRUCTION))\n if (conflictingGlob) {\n throw new Error(\n `OpenCode instruction glob 命中 Basic Skill,无法生成可信 without-skill baseline: ${conflictingGlob}`)\n }\n config.instructions = instructions.filter((item) => !instructionTargetsPath(\n workspaceReal, item, REQUIRED_BASIC_SKILL_INSTRUCTION))\n const permission = config.permission === undefined\n ? {}\n : objectValue(config.permission, 'opencode.json#permission')\n const skillPermission = permission.skill === undefined\n ? {}\n : objectValue(permission.skill, 'opencode.json#permission.skill')\n skillPermission[REQUIRED_BASIC_SKILL] = 'deny'\n permission.skill = skillPermission\n config.permission = permission\n atomicJson(configPath, config)\n}\n\nfunction runOpenCode(\n command: string,\n args: string[],\n cwd: string,\n maxBuffer = 4 * 1024 * 1024,\n environment?: NodeJS.ProcessEnv,\n): string {\n const child = spawnSync(command, args, {\n cwd,\n encoding: 'utf8',\n timeout: 30_000,\n maxBuffer,\n env: environment || process.env,\n })\n if (child.error || child.status !== 0) {\n throw new Error(`OpenCode preflight 失败 (${args.join(' ')}): ${\n child.error?.message || String(child.stderr || child.stdout || `exit=${child.status}`).trim()}`)\n }\n return String(child.stdout || '')\n}\n\nfunction frontmatterValue(body: string, key: string): string {\n const frontmatter = body.match(/^---\\s*\\n([\\s\\S]*?)\\n---/)?.[1] || ''\n return frontmatter.match(new RegExp(`^${key}:\\\\s*[\"']?([^\"'\\\\n]+)[\"']?\\\\s*$`, 'm'))?.[1]?.trim() || ''\n}\n\nfunction metadataVersion(body: string): string {\n const frontmatter = body.match(/^---\\s*\\n([\\s\\S]*?)\\n---/)?.[1] || ''\n return frontmatter.match(/^metadata:\\s*\\n(?:^[ \\t]+.*\\n)*?^[ \\t]+version:\\s*[\"']?([^\"'\\n]+)[\"']?\\s*$/m)?.[1]?.trim() || ''\n}\n\nfunction parseObject(text: string, label: string): Record<string, any> {\n let value: unknown\n try { value = JSON.parse(text) }\n catch (error) { throw new Error(`${label} 不是合法 JSON: ${(error as Error).message}`) }\n return objectValue(value, label)\n}\n\nfunction objectValue(value: unknown, label: string): Record<string, any> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`${label} 必须是 JSON object`)\n }\n return value as Record<string, any>\n}\n\nfunction stringArray(value: unknown, label: string): string[] {\n if (!Array.isArray(value) || value.some((item) => typeof item !== 'string')) {\n throw new Error(`${label} 必须是 string[]`)\n }\n return value as string[]\n}\n\nfunction sha256(value: string): string {\n return createHash('sha256').update(value).digest('hex')\n}\n\nfunction atomicJson(path: string, value: unknown): void {\n const body = JSON.stringify(value, null, 2) + '\\n'\n const temporary = `${path}.${process.pid}.${Date.now()}.tmp`\n writeFileSync(temporary, body, { flag: 'wx' })\n renameSync(temporary, path)\n}\n\nexport function relativeBinding(binding: OpenCodeSkillBinding): Record<string, unknown> {\n return {\n ...binding,\n configPath: relative(binding.workspace, binding.configPath),\n skill: {\n ...binding.skill,\n path: relative(binding.workspace, binding.skill.path),\n },\n }\n}\n"]}
1
+ {"version":3,"file":"opencode-workspace.js","sourceRoot":"","sources":["../../src/opencode-workspace.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto'\nimport {\n existsSync, mkdtempSync, readFileSync, realpathSync, renameSync, rmSync, writeFileSync,\n} from 'node:fs'\nimport { spawnSync } from 'node:child_process'\nimport { join, relative, resolve } from 'node:path'\nimport { tmpdir } from 'node:os'\nimport {\n countInstructionsForPath, instructionTargetsPath, instructionUsesGlob,\n} from './instruction-path.js'\n\nexport const REQUIRED_BASIC_SKILL = 'dta-basic-behavior'\nexport const REQUIRED_BASIC_SKILL_INSTRUCTION =\n '.agents/skills/dta-basic-behavior/SKILL.md'\n\nexport interface OpenCodeSkillBinding {\n $schema: 'dingtalk-agent/opencode-skill-binding@1'\n host: 'opencode'\n required: true\n strategy: 'instructions'\n workspace: string\n configPath: string\n instruction: string\n skill: {\n name: string\n version: string\n path: string\n hash: string\n }\n configHash: string\n}\n\nexport interface OpenCodeSkillPreflight extends OpenCodeSkillBinding {\n verified: true\n openCodeVersion: string\n resolvedInstruction: true\n resolvedInstructions: string[]\n discoveredProjectSkill: true\n}\n\n/**\n * OpenCode only discovers project Skills by default; it does not load their body.\n * This binding makes the Basic Skill an unconditional instruction while retaining\n * the native project Skill for discovery and explicit inspection.\n */\nexport function bindRequiredBasicSkill(workspace: string): OpenCodeSkillBinding {\n const workspaceReal = realpathSync(resolve(workspace))\n const skillPath = join(workspaceReal, REQUIRED_BASIC_SKILL_INSTRUCTION)\n if (!existsSync(skillPath)) {\n throw new Error(`OpenCode 必需 Basic Skill 不存在: ${skillPath}`)\n }\n const skillBody = readFileSync(skillPath, 'utf8')\n const name = frontmatterValue(skillBody, 'name')\n const version = metadataVersion(skillBody)\n if (name !== REQUIRED_BASIC_SKILL || !version) {\n throw new Error(`OpenCode Basic Skill 元数据非法: name=${name || 'missing'} version=${version || 'missing'}`)\n }\n\n const configPath = join(workspaceReal, 'opencode.json')\n const config = existsSync(configPath)\n ? parseObject(readFileSync(configPath, 'utf8'), 'opencode.json')\n : {}\n const instructions = config.instructions === undefined\n ? []\n : stringArray(config.instructions, 'opencode.json#instructions')\n const conflictingGlob = instructions.find((item) =>\n instructionUsesGlob(item) && instructionTargetsPath(\n workspaceReal, item, REQUIRED_BASIC_SKILL_INSTRUCTION))\n if (conflictingGlob) {\n throw new Error(\n `OpenCode instruction glob 命中 Basic Skill,无法安全去重: ${conflictingGlob}`)\n }\n config.$schema ||= 'https://opencode.ai/config.json'\n config.instructions = [\n REQUIRED_BASIC_SKILL_INSTRUCTION,\n ...instructions.filter((item) => !instructionTargetsPath(\n workspaceReal, item, REQUIRED_BASIC_SKILL_INSTRUCTION)),\n ]\n\n const permission = config.permission === undefined\n ? {}\n : objectValue(config.permission, 'opencode.json#permission')\n const skillPermission = permission.skill === undefined\n ? {}\n : objectValue(permission.skill, 'opencode.json#permission.skill')\n skillPermission[REQUIRED_BASIC_SKILL] = 'allow'\n permission.skill = skillPermission\n config.permission = permission\n atomicJson(configPath, config)\n\n return {\n $schema: 'dingtalk-agent/opencode-skill-binding@1',\n host: 'opencode',\n required: true,\n strategy: 'instructions',\n workspace: workspaceReal,\n configPath,\n instruction: REQUIRED_BASIC_SKILL_INSTRUCTION,\n skill: {\n name,\n version,\n path: realpathSync(skillPath),\n hash: sha256(skillBody),\n },\n configHash: sha256(readFileSync(configPath, 'utf8')),\n }\n}\n\nexport function verifyRequiredBasicSkill(\n binding: OpenCodeSkillBinding,\n command = process.env.DTA_OPENCODE_BIN || 'opencode',\n environment?: NodeJS.ProcessEnv,\n): OpenCodeSkillPreflight {\n const current = bindRequiredBasicSkill(binding.workspace)\n if (current.skill.hash !== binding.skill.hash || current.configHash !== binding.configHash) {\n throw new Error('OpenCode Basic Skill 或配置在 preflight 前发生漂移')\n }\n\n const versionRun = runOpenCode(command, ['--version'], binding.workspace, undefined, environment)\n const configRun = runOpenCode(\n command, ['debug', 'config', '--pure'], binding.workspace, undefined, environment)\n const resolved = parseObject(configRun, 'opencode debug config')\n const resolvedInstructions = stringArray(\n resolved.instructions || [], 'opencode resolved instructions')\n if (countInstructionsForPath(\n binding.workspace, resolvedInstructions, REQUIRED_BASIC_SKILL_INSTRUCTION,\n ) !== 1) {\n throw new Error('OpenCode resolved config 未唯一加载 dta-basic-behavior')\n }\n\n const isolatedHome = mkdtempSync(join(tmpdir(), 'dta-opencode-preflight-'))\n let skillsRun = ''\n try {\n skillsRun = runOpenCode(\n command, ['debug', 'skill', '--pure'], binding.workspace, 4 * 1024 * 1024, {\n ...(environment || process.env),\n HOME: isolatedHome,\n XDG_CONFIG_HOME: join(isolatedHome, 'config'),\n XDG_DATA_HOME: join(isolatedHome, 'data'),\n XDG_CACHE_HOME: join(isolatedHome, 'cache'),\n XDG_STATE_HOME: join(isolatedHome, 'state'),\n })\n } finally {\n rmSync(isolatedHome, { recursive: true, force: true })\n }\n const discoveredLocation = skillsRun.match(\n new RegExp(`\"name\":\\\\s*\"${REQUIRED_BASIC_SKILL}\"[\\\\s\\\\S]{0,4000}?\"location\":\\\\s*\"([^\"]+)\"`),\n )?.[1]\n let discovered = false\n if (discoveredLocation) {\n try {\n const decoded = JSON.parse(`\"${discoveredLocation}\"`)\n discovered = existsSync(decoded) && realpathSync(decoded) === binding.skill.path\n } catch { /* malformed or truncated debug output */ }\n }\n if (!discovered) {\n const marker = skillsRun.indexOf(REQUIRED_BASIC_SKILL)\n const nearby = marker >= 0\n ? skillsRun.slice(Math.max(0, marker - 160), marker + 600).replace(/\\s+/g, ' ')\n : `debug skill bytes=${Buffer.byteLength(skillsRun)}`\n throw new Error(`OpenCode 未从当前项目发现 Basic Skill: ${binding.skill.path}; ${nearby}`)\n }\n\n return {\n ...binding,\n verified: true,\n openCodeVersion: versionRun.trim(),\n resolvedInstruction: true,\n resolvedInstructions,\n discoveredProjectSkill: true,\n }\n}\n\nexport function removeRequiredBasicSkillInstruction(workspace: string): void {\n const workspaceReal = realpathSync(resolve(workspace))\n const configPath = join(workspaceReal, 'opencode.json')\n const config = existsSync(configPath)\n ? parseObject(readFileSync(configPath, 'utf8'), 'opencode.json')\n : {}\n const instructions = config.instructions === undefined\n ? []\n : stringArray(config.instructions, 'opencode.json#instructions')\n const conflictingGlob = instructions.find((item) =>\n instructionUsesGlob(item) && instructionTargetsPath(\n workspaceReal, item, REQUIRED_BASIC_SKILL_INSTRUCTION))\n if (conflictingGlob) {\n throw new Error(\n `OpenCode instruction glob 命中 Basic Skill,无法生成可信 without-skill baseline: ${conflictingGlob}`)\n }\n config.instructions = instructions.filter((item) => !instructionTargetsPath(\n workspaceReal, item, REQUIRED_BASIC_SKILL_INSTRUCTION))\n const permission = config.permission === undefined\n ? {}\n : objectValue(config.permission, 'opencode.json#permission')\n const skillPermission = permission.skill === undefined\n ? {}\n : objectValue(permission.skill, 'opencode.json#permission.skill')\n skillPermission[REQUIRED_BASIC_SKILL] = 'deny'\n permission.skill = skillPermission\n config.permission = permission\n atomicJson(configPath, config)\n}\n\nfunction runOpenCode(\n command: string,\n args: string[],\n cwd: string,\n maxBuffer = 4 * 1024 * 1024,\n environment?: NodeJS.ProcessEnv,\n): string {\n const child = spawnSync(command, args, {\n cwd,\n encoding: 'utf8',\n timeout: 30_000,\n maxBuffer,\n env: environment || process.env,\n })\n if (child.error || child.status !== 0) {\n throw new Error(`OpenCode preflight 失败 (${args.join(' ')}): ${\n child.error?.message || String(child.stderr || child.stdout || `exit=${child.status}`).trim()}`)\n }\n return String(child.stdout || '')\n}\n\nfunction frontmatterValue(body: string, key: string): string {\n const frontmatter = body.match(/^---\\s*\\n([\\s\\S]*?)\\n---/)?.[1] || ''\n return frontmatter.match(new RegExp(`^${key}:\\\\s*[\"']?([^\"'\\\\n]+)[\"']?\\\\s*$`, 'm'))?.[1]?.trim() || ''\n}\n\nfunction metadataVersion(body: string): string {\n const frontmatter = body.match(/^---\\s*\\n([\\s\\S]*?)\\n---/)?.[1] || ''\n return frontmatter.match(/^metadata:\\s*\\n(?:^[ \\t]+.*\\n)*?^[ \\t]+version:\\s*[\"']?([^\"'\\n]+)[\"']?\\s*$/m)?.[1]?.trim() || ''\n}\n\nfunction parseObject(text: string, label: string): Record<string, any> {\n let value: unknown\n try { value = JSON.parse(text) }\n catch (error) { throw new Error(`${label} 不是合法 JSON: ${(error as Error).message}`) }\n return objectValue(value, label)\n}\n\nfunction objectValue(value: unknown, label: string): Record<string, any> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`${label} 必须是 JSON object`)\n }\n return value as Record<string, any>\n}\n\nfunction stringArray(value: unknown, label: string): string[] {\n if (!Array.isArray(value) || value.some((item) => typeof item !== 'string')) {\n throw new Error(`${label} 必须是 string[]`)\n }\n return value as string[]\n}\n\nfunction sha256(value: string): string {\n return createHash('sha256').update(value).digest('hex')\n}\n\nfunction atomicJson(path: string, value: unknown): void {\n const body = JSON.stringify(value, null, 2) + '\\n'\n const temporary = `${path}.${process.pid}.${Date.now()}.tmp`\n writeFileSync(temporary, body, { flag: 'wx' })\n renameSync(temporary, path)\n}\n\nexport function relativeBinding(binding: OpenCodeSkillBinding): Record<string, unknown> {\n return {\n ...binding,\n configPath: relative(binding.workspace, binding.configPath),\n skill: {\n ...binding.skill,\n path: relative(binding.workspace, binding.skill.path),\n },\n }\n}\n"]}
@@ -4,6 +4,7 @@ import { dirname, join, relative, resolve } from 'node:path';
4
4
  import { must as loadConfig } from './config.js';
5
5
  import { digest, normalizeEvent, stableStringify } from './events.js';
6
6
  import { doctorLab, loadLabManifest, runLab, teardownLab, verifyLab, } from './lab.js';
7
+ import { GLOBAL_SKILL_NAME, isBasicSkillName } from './skill-manager.js';
7
8
  import { isCancelCommand } from './waits.js';
8
9
  import { readJson } from './sessions.js';
9
10
  import * as dws from './dws.js';
@@ -393,10 +394,11 @@ function validateSuite(value) {
393
394
  if (!['yes', 'no'].includes(suite.liveAuthorized)) {
394
395
  throw new Error('personal-event suite liveAuthorized 必须是 yes 或 no');
395
396
  }
396
- if (!Array.isArray(suite.requiredSkills) || !suite.requiredSkills.includes('dingtalk-basic-behavior') ||
397
+ if (!Array.isArray(suite.requiredSkills) ||
398
+ !suite.requiredSkills.some((item) => isBasicSkillName(String(item || '').trim())) ||
397
399
  suite.requiredSkills.some((item) => !String(item || '').trim()) ||
398
400
  new Set(suite.requiredSkills).size !== suite.requiredSkills.length) {
399
- throw new Error('personal-event suite requiredSkills 必须包含 dingtalk-basic-behavior');
401
+ throw new Error(`personal-event suite requiredSkills 必须包含 ${GLOBAL_SKILL_NAME}`);
400
402
  }
401
403
  if (!Number.isInteger(suite.maxOutwardActions) || suite.maxOutwardActions < 1 ||
402
404
  suite.maxOutwardActions > 20) {