@xdxer/dingtalk-agent 0.1.4-beta.15 → 0.1.4-beta.16

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 (39) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.en.md +97 -328
  3. package/README.md +94 -676
  4. package/dist/src/agent-audit.js +1005 -88
  5. package/dist/src/agent-audit.js.map +1 -1
  6. package/dist/src/agent-enhance.js +38 -6
  7. package/dist/src/agent-enhance.js.map +1 -1
  8. package/dist/src/instruction-path.js +270 -0
  9. package/dist/src/instruction-path.js.map +1 -0
  10. package/dist/src/opencode-evals.js +708 -224
  11. package/dist/src/opencode-evals.js.map +1 -1
  12. package/dist/src/opencode-isolation.js +124 -0
  13. package/dist/src/opencode-isolation.js.map +1 -0
  14. package/dist/src/opencode-provider.js +1 -0
  15. package/dist/src/opencode-provider.js.map +1 -1
  16. package/dist/src/opencode-workspace.js +21 -10
  17. package/dist/src/opencode-workspace.js.map +1 -1
  18. package/docs/assets/agent-delivery-lifecycle.svg +103 -0
  19. package/evals/README.md +17 -0
  20. package/lab/README.md +3 -3
  21. package/lab/agent-eval/classic-failures.json +7 -7
  22. package/lab/agent-eval/remote-state-workspace/opencode.json +1 -1
  23. package/lab/agent-eval/workspace/AGENTS.md +1 -1
  24. package/lab/robot-eval/suite.json +1 -1
  25. package/lab/robot-eval/workspace/AGENTS.md +1 -1
  26. package/package.json +2 -2
  27. package/skills/core/dingtalk-agent-compose/SKILL.md +19 -8
  28. package/skills/core/dingtalk-agent-compose/assets/AGENTS.template.md +24 -15
  29. package/skills/core/dingtalk-agent-compose/assets/role-skill.template.md +14 -6
  30. package/skills/core/dingtalk-agent-compose/evals/evals.json +17 -5
  31. package/skills/core/dingtalk-agent-compose/references/agent-definition-contract.md +3 -3
  32. package/skills/core/dingtalk-agent-compose/references/opencode-host-contract.md +17 -9
  33. package/skills/core/dingtalk-basic-behavior/SKILL.md +52 -111
  34. package/skills/core/dingtalk-basic-behavior/references/memory-and-evolution.md +12 -0
  35. package/skills/core/dingtalk-basic-behavior/references/risk-authority-and-privacy.md +62 -0
  36. package/skills/core/dingtalk-basic-behavior/references/task-lifecycle.md +15 -3
  37. package/skills/core/dingtalk-basic-behavior/references/truth-and-recovery.md +65 -0
  38. package/dist/src/map.js +0 -157
  39. package/dist/src/map.js.map +0 -1
@@ -0,0 +1,124 @@
1
+ import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync } from 'node:fs';
2
+ import { homedir, tmpdir, userInfo } from 'node:os';
3
+ import { join } from 'node:path';
4
+ /**
5
+ * Build a complete child-process environment for one OpenCode probe. The caller
6
+ * must pass this same object to version/config/run/export so config and sessions
7
+ * cannot fall back to the developer's real HOME or XDG state.
8
+ */
9
+ export function createIsolatedOpenCodeHost(provider, base = process.env) {
10
+ assertNoManagedPreferences();
11
+ const root = mkdtempSync(join(tmpdir(), 'dta-opencode-host-'));
12
+ const selectedAuth = selectProviderAuth(provider, base);
13
+ const environment = isolatedBaseEnvironment(provider, base);
14
+ const paths = {
15
+ config: join(root, 'config'),
16
+ data: join(root, 'data'),
17
+ cache: join(root, 'cache'),
18
+ state: join(root, 'state'),
19
+ managed: join(root, 'managed'),
20
+ };
21
+ for (const path of Object.values(paths))
22
+ mkdirSync(path, { recursive: true });
23
+ Object.assign(environment, {
24
+ HOME: root,
25
+ XDG_CONFIG_HOME: paths.config,
26
+ XDG_DATA_HOME: paths.data,
27
+ XDG_CACHE_HOME: paths.cache,
28
+ XDG_STATE_HOME: paths.state,
29
+ OPENCODE_AUTH_CONTENT: JSON.stringify(selectedAuth),
30
+ OPENCODE_PURE: '1',
31
+ OPENCODE_DISABLE_DEFAULT_PLUGINS: '1',
32
+ OPENCODE_DISABLE_CLAUDE_CODE: '1',
33
+ OPENCODE_AUTO_SHARE: 'false',
34
+ OPENCODE_DISABLE_AUTOUPDATE: '1',
35
+ OPENCODE_DISABLE_LSP_DOWNLOAD: '1',
36
+ OPENCODE_TEST_MANAGED_CONFIG_DIR: paths.managed,
37
+ });
38
+ return {
39
+ environment,
40
+ root,
41
+ dispose: () => rmSync(root, { recursive: true, force: true }),
42
+ };
43
+ }
44
+ function isolatedBaseEnvironment(provider, base) {
45
+ const environment = {};
46
+ const safeKeys = new Set([
47
+ 'PATH', 'TMPDIR', 'TMP', 'TEMP', 'LANG', 'LC_ALL', 'LC_CTYPE', 'TZ',
48
+ 'TERM', 'NO_COLOR', 'FORCE_COLOR', 'SSL_CERT_FILE', 'SSL_CERT_DIR',
49
+ 'NODE_EXTRA_CA_CERTS', 'SystemRoot', 'SYSTEMROOT', 'WINDIR', 'COMSPEC', 'PATHEXT',
50
+ ]);
51
+ const providerKeys = {
52
+ deepseek: ['DEEPSEEK_API_KEY'],
53
+ openai: ['OPENAI_API_KEY'],
54
+ anthropic: ['ANTHROPIC_API_KEY'],
55
+ google: ['GEMINI_API_KEY', 'GOOGLE_GENERATIVE_AI_API_KEY'],
56
+ };
57
+ for (const [key, value] of Object.entries(base)) {
58
+ if (value === undefined)
59
+ continue;
60
+ if (safeKeys.has(key) || key.startsWith('DTA_CONTRACT_') ||
61
+ (providerKeys[provider] || []).includes(key))
62
+ environment[key] = value;
63
+ }
64
+ return environment;
65
+ }
66
+ function selectProviderAuth(provider, environment) {
67
+ let source = {};
68
+ const injected = environment.OPENCODE_AUTH_CONTENT;
69
+ if (injected) {
70
+ try {
71
+ source = parseObject(injected);
72
+ }
73
+ catch {
74
+ throw new Error('OPENCODE_AUTH_CONTENT 不是合法 JSON object');
75
+ }
76
+ }
77
+ else {
78
+ const home = environment.HOME || homedir();
79
+ const data = environment.XDG_DATA_HOME || join(home, '.local', 'share');
80
+ const path = join(data, 'opencode', 'auth.json');
81
+ if (existsSync(path)) {
82
+ try {
83
+ source = parseObject(readFileSync(path, 'utf8'));
84
+ }
85
+ catch {
86
+ throw new Error('OpenCode auth.json 不是合法 JSON object');
87
+ }
88
+ }
89
+ }
90
+ const selected = source[provider];
91
+ if (!selected)
92
+ return {};
93
+ if (!selected || typeof selected !== 'object' || Array.isArray(selected)) {
94
+ throw new Error(`OpenCode ${provider} auth 结构非法`);
95
+ }
96
+ if (selected.type === 'wellknown') {
97
+ throw new Error(`OpenCode ${provider} auth 为 wellknown;隔离评测拒绝远端配置入口`);
98
+ }
99
+ return { [provider]: selected };
100
+ }
101
+ function parseObject(value) {
102
+ const parsed = JSON.parse(value);
103
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
104
+ throw new Error('not object');
105
+ return parsed;
106
+ }
107
+ function assertNoManagedPreferences() {
108
+ if (process.platform !== 'darwin')
109
+ return;
110
+ let user = '';
111
+ try {
112
+ user = userInfo().username;
113
+ }
114
+ catch { /* checked through system-wide path */ }
115
+ const paths = [
116
+ ...(user ? [join('/Library/Managed Preferences', user, 'ai.opencode.managed.plist')] : []),
117
+ '/Library/Managed Preferences/ai.opencode.managed.plist',
118
+ ];
119
+ const found = paths.find((path) => existsSync(path));
120
+ if (found) {
121
+ throw new Error(`检测到无法隔离的 OpenCode macOS managed preference: ${found}`);
122
+ }
123
+ }
124
+ //# sourceMappingURL=opencode-isolation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-isolation.js","sourceRoot":"","sources":["../../src/opencode-isolation.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync } from 'node:fs'\nimport { homedir, tmpdir, userInfo } from 'node:os'\nimport { join } from 'node:path'\n\nexport interface OpenCodeHostContext {\n environment: NodeJS.ProcessEnv\n root: string\n dispose: () => void\n}\n\n/**\n * Build a complete child-process environment for one OpenCode probe. The caller\n * must pass this same object to version/config/run/export so config and sessions\n * cannot fall back to the developer's real HOME or XDG state.\n */\nexport function createIsolatedOpenCodeHost(\n provider: string,\n base: NodeJS.ProcessEnv = process.env,\n): OpenCodeHostContext {\n assertNoManagedPreferences()\n const root = mkdtempSync(join(tmpdir(), 'dta-opencode-host-'))\n const selectedAuth = selectProviderAuth(provider, base)\n const environment = isolatedBaseEnvironment(provider, base)\n const paths = {\n config: join(root, 'config'),\n data: join(root, 'data'),\n cache: join(root, 'cache'),\n state: join(root, 'state'),\n managed: join(root, 'managed'),\n }\n for (const path of Object.values(paths)) mkdirSync(path, { recursive: true })\n Object.assign(environment, {\n HOME: root,\n XDG_CONFIG_HOME: paths.config,\n XDG_DATA_HOME: paths.data,\n XDG_CACHE_HOME: paths.cache,\n XDG_STATE_HOME: paths.state,\n OPENCODE_AUTH_CONTENT: JSON.stringify(selectedAuth),\n OPENCODE_PURE: '1',\n OPENCODE_DISABLE_DEFAULT_PLUGINS: '1',\n OPENCODE_DISABLE_CLAUDE_CODE: '1',\n OPENCODE_AUTO_SHARE: 'false',\n OPENCODE_DISABLE_AUTOUPDATE: '1',\n OPENCODE_DISABLE_LSP_DOWNLOAD: '1',\n OPENCODE_TEST_MANAGED_CONFIG_DIR: paths.managed,\n })\n return {\n environment,\n root,\n dispose: () => rmSync(root, { recursive: true, force: true }),\n }\n}\n\nfunction isolatedBaseEnvironment(\n provider: string, base: NodeJS.ProcessEnv,\n): NodeJS.ProcessEnv {\n const environment: NodeJS.ProcessEnv = {}\n const safeKeys = new Set([\n 'PATH', 'TMPDIR', 'TMP', 'TEMP', 'LANG', 'LC_ALL', 'LC_CTYPE', 'TZ',\n 'TERM', 'NO_COLOR', 'FORCE_COLOR', 'SSL_CERT_FILE', 'SSL_CERT_DIR',\n 'NODE_EXTRA_CA_CERTS', 'SystemRoot', 'SYSTEMROOT', 'WINDIR', 'COMSPEC', 'PATHEXT',\n ])\n const providerKeys: Record<string, string[]> = {\n deepseek: ['DEEPSEEK_API_KEY'],\n openai: ['OPENAI_API_KEY'],\n anthropic: ['ANTHROPIC_API_KEY'],\n google: ['GEMINI_API_KEY', 'GOOGLE_GENERATIVE_AI_API_KEY'],\n }\n for (const [key, value] of Object.entries(base)) {\n if (value === undefined) continue\n if (safeKeys.has(key) || key.startsWith('DTA_CONTRACT_') ||\n (providerKeys[provider] || []).includes(key)) environment[key] = value\n }\n return environment\n}\n\nfunction selectProviderAuth(\n provider: string, environment: NodeJS.ProcessEnv,\n): Record<string, unknown> {\n let source: Record<string, any> = {}\n const injected = environment.OPENCODE_AUTH_CONTENT\n if (injected) {\n try { source = parseObject(injected) }\n catch { throw new Error('OPENCODE_AUTH_CONTENT 不是合法 JSON object') }\n } else {\n const home = environment.HOME || homedir()\n const data = environment.XDG_DATA_HOME || join(home, '.local', 'share')\n const path = join(data, 'opencode', 'auth.json')\n if (existsSync(path)) {\n try { source = parseObject(readFileSync(path, 'utf8')) }\n catch { throw new Error('OpenCode auth.json 不是合法 JSON object') }\n }\n }\n const selected = source[provider]\n if (!selected) return {}\n if (!selected || typeof selected !== 'object' || Array.isArray(selected)) {\n throw new Error(`OpenCode ${provider} auth 结构非法`)\n }\n if (selected.type === 'wellknown') {\n throw new Error(`OpenCode ${provider} auth 为 wellknown;隔离评测拒绝远端配置入口`)\n }\n return { [provider]: selected }\n}\n\nfunction parseObject(value: string): Record<string, any> {\n const parsed = JSON.parse(value)\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) throw new Error('not object')\n return parsed\n}\n\nfunction assertNoManagedPreferences(): void {\n if (process.platform !== 'darwin') return\n let user = ''\n try { user = userInfo().username } catch { /* checked through system-wide path */ }\n const paths = [\n ...(user ? [join('/Library/Managed Preferences', user, 'ai.opencode.managed.plist')] : []),\n '/Library/Managed Preferences/ai.opencode.managed.plist',\n ]\n const found = paths.find((path) => existsSync(path))\n if (found) {\n throw new Error(`检测到无法隔离的 OpenCode macOS managed preference: ${found}`)\n }\n}\n"]}
@@ -504,6 +504,7 @@ function emptyExecution(reason) {
504
504
  exitCode: null, stdout: '', stderr: reason, answer: '', sessionId: '', toolCalls: 0,
505
505
  toolNames: [], toolPaths: [], toolTrace: [], tokens: null, cost: null, durationMs: 0,
506
506
  directoryMatched: false, sessionDirectory: '',
507
+ sessionExport: { exitCode: null, stdout: '', stderr: '' },
507
508
  };
508
509
  }
509
510
  function atomicJson(path, value) {
@@ -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 }\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, 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"]}
@@ -3,6 +3,7 @@ import { existsSync, mkdtempSync, readFileSync, realpathSync, renameSync, rmSync
3
3
  import { spawnSync } from 'node:child_process';
4
4
  import { join, relative, resolve } from 'node:path';
5
5
  import { tmpdir } from 'node:os';
6
+ import { countInstructionsForPath, instructionTargetsPath, instructionUsesGlob, } from './instruction-path.js';
6
7
  export const REQUIRED_BASIC_SKILL = 'dingtalk-basic-behavior';
7
8
  export const REQUIRED_BASIC_SKILL_INSTRUCTION = '.agents/skills/dingtalk-basic-behavior/SKILL.md';
8
9
  /**
@@ -29,10 +30,14 @@ export function bindRequiredBasicSkill(workspace) {
29
30
  const instructions = config.instructions === undefined
30
31
  ? []
31
32
  : stringArray(config.instructions, 'opencode.json#instructions');
33
+ const conflictingGlob = instructions.find((item) => instructionUsesGlob(item) && instructionTargetsPath(workspaceReal, item, REQUIRED_BASIC_SKILL_INSTRUCTION));
34
+ if (conflictingGlob) {
35
+ throw new Error(`OpenCode instruction glob 命中 Basic Skill,无法安全去重: ${conflictingGlob}`);
36
+ }
32
37
  config.$schema ||= 'https://opencode.ai/config.json';
33
38
  config.instructions = [
34
39
  REQUIRED_BASIC_SKILL_INSTRUCTION,
35
- ...instructions.filter((item) => item !== REQUIRED_BASIC_SKILL_INSTRUCTION),
40
+ ...instructions.filter((item) => !instructionTargetsPath(workspaceReal, item, REQUIRED_BASIC_SKILL_INSTRUCTION)),
36
41
  ];
37
42
  const permission = config.permission === undefined
38
43
  ? {}
@@ -61,22 +66,23 @@ export function bindRequiredBasicSkill(workspace) {
61
66
  configHash: sha256(readFileSync(configPath, 'utf8')),
62
67
  };
63
68
  }
64
- export function verifyRequiredBasicSkill(binding, command = process.env.DTA_OPENCODE_BIN || 'opencode') {
69
+ export function verifyRequiredBasicSkill(binding, command = process.env.DTA_OPENCODE_BIN || 'opencode', environment) {
65
70
  const current = bindRequiredBasicSkill(binding.workspace);
66
71
  if (current.skill.hash !== binding.skill.hash || current.configHash !== binding.configHash) {
67
72
  throw new Error('OpenCode Basic Skill 或配置在 preflight 前发生漂移');
68
73
  }
69
- const versionRun = runOpenCode(command, ['--version'], binding.workspace);
70
- const configRun = runOpenCode(command, ['debug', 'config'], binding.workspace);
74
+ const versionRun = runOpenCode(command, ['--version'], binding.workspace, undefined, environment);
75
+ const configRun = runOpenCode(command, ['debug', 'config', '--pure'], binding.workspace, undefined, environment);
71
76
  const resolved = parseObject(configRun, 'opencode debug config');
72
77
  const resolvedInstructions = stringArray(resolved.instructions || [], 'opencode resolved instructions');
73
- if (!resolvedInstructions.includes(REQUIRED_BASIC_SKILL_INSTRUCTION)) {
74
- throw new Error('OpenCode resolved config 未强制加载 dingtalk-basic-behavior');
78
+ if (countInstructionsForPath(binding.workspace, resolvedInstructions, REQUIRED_BASIC_SKILL_INSTRUCTION) !== 1) {
79
+ throw new Error('OpenCode resolved config 未唯一加载 dingtalk-basic-behavior');
75
80
  }
76
81
  const isolatedHome = mkdtempSync(join(tmpdir(), 'dta-opencode-preflight-'));
77
82
  let skillsRun = '';
78
83
  try {
79
- skillsRun = runOpenCode(command, ['debug', 'skill'], binding.workspace, 4 * 1024 * 1024, {
84
+ skillsRun = runOpenCode(command, ['debug', 'skill', '--pure'], binding.workspace, 4 * 1024 * 1024, {
85
+ ...(environment || process.env),
80
86
  HOME: isolatedHome,
81
87
  XDG_CONFIG_HOME: join(isolatedHome, 'config'),
82
88
  XDG_DATA_HOME: join(isolatedHome, 'data'),
@@ -108,6 +114,7 @@ export function verifyRequiredBasicSkill(binding, command = process.env.DTA_OPEN
108
114
  verified: true,
109
115
  openCodeVersion: versionRun.trim(),
110
116
  resolvedInstruction: true,
117
+ resolvedInstructions,
111
118
  discoveredProjectSkill: true,
112
119
  };
113
120
  }
@@ -120,7 +127,11 @@ export function removeRequiredBasicSkillInstruction(workspace) {
120
127
  const instructions = config.instructions === undefined
121
128
  ? []
122
129
  : stringArray(config.instructions, 'opencode.json#instructions');
123
- config.instructions = instructions.filter((item) => item !== REQUIRED_BASIC_SKILL_INSTRUCTION);
130
+ const conflictingGlob = instructions.find((item) => instructionUsesGlob(item) && instructionTargetsPath(workspaceReal, item, REQUIRED_BASIC_SKILL_INSTRUCTION));
131
+ if (conflictingGlob) {
132
+ throw new Error(`OpenCode instruction glob 命中 Basic Skill,无法生成可信 without-skill baseline: ${conflictingGlob}`);
133
+ }
134
+ config.instructions = instructions.filter((item) => !instructionTargetsPath(workspaceReal, item, REQUIRED_BASIC_SKILL_INSTRUCTION));
124
135
  const permission = config.permission === undefined
125
136
  ? {}
126
137
  : objectValue(config.permission, 'opencode.json#permission');
@@ -132,13 +143,13 @@ export function removeRequiredBasicSkillInstruction(workspace) {
132
143
  config.permission = permission;
133
144
  atomicJson(configPath, config);
134
145
  }
135
- function runOpenCode(command, args, cwd, maxBuffer = 4 * 1024 * 1024, environment = {}) {
146
+ function runOpenCode(command, args, cwd, maxBuffer = 4 * 1024 * 1024, environment) {
136
147
  const child = spawnSync(command, args, {
137
148
  cwd,
138
149
  encoding: 'utf8',
139
150
  timeout: 30_000,
140
151
  maxBuffer,
141
- env: { ...process.env, ...environment },
152
+ env: environment || process.env,
142
153
  });
143
154
  if (child.error || child.status !== 0) {
144
155
  throw new Error(`OpenCode preflight 失败 (${args.join(' ')}): ${child.error?.message || String(child.stderr || child.stdout || `exit=${child.status}`).trim()}`);
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-workspace.js","sourceRoot":"","sources":["../../src/opencode-workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EACL,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,GACvF,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAEhC,MAAM,CAAC,MAAM,oBAAoB,GAAG,yBAAyB,CAAA;AAC7D,MAAM,CAAC,MAAM,gCAAgC,GAC3C,iDAAiD,CAAA;AA0BnD;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAiB;IACtD,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAA;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,gCAAgC,CAAC,CAAA;IACvE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,gCAAgC,SAAS,EAAE,CAAC,CAAA;IAC9D,CAAC;IACD,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IACjD,MAAM,IAAI,GAAG,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IAChD,MAAM,OAAO,GAAG,eAAe,CAAC,SAAS,CAAC,CAAA;IAC1C,IAAI,IAAI,KAAK,oBAAoB,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,IAAI,SAAS,YAAY,OAAO,IAAI,SAAS,EAAE,CAAC,CAAA;IAC1G,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC,CAAA;IACvD,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC;QACnC,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,eAAe,CAAC;QAChE,CAAC,CAAC,EAAE,CAAA;IACN,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,KAAK,SAAS;QACpD,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,EAAE,4BAA4B,CAAC,CAAA;IAClE,MAAM,CAAC,OAAO,KAAK,iCAAiC,CAAA;IACpD,MAAM,CAAC,YAAY,GAAG;QACpB,gCAAgC;QAChC,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,gCAAgC,CAAC;KAC5E,CAAA;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,KAAK,SAAS;QAChD,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,0BAA0B,CAAC,CAAA;IAC9D,MAAM,eAAe,GAAG,UAAU,CAAC,KAAK,KAAK,SAAS;QACpD,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,EAAE,gCAAgC,CAAC,CAAA;IACnE,eAAe,CAAC,oBAAoB,CAAC,GAAG,OAAO,CAAA;IAC/C,UAAU,CAAC,KAAK,GAAG,eAAe,CAAA;IAClC,MAAM,CAAC,UAAU,GAAG,UAAU,CAAA;IAC9B,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;IAE9B,OAAO;QACL,OAAO,EAAE,yCAAyC;QAClD,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,cAAc;QACxB,SAAS,EAAE,aAAa;QACxB,UAAU;QACV,WAAW,EAAE,gCAAgC;QAC7C,KAAK,EAAE;YACL,IAAI;YACJ,OAAO;YACP,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC;YAC7B,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC;SACxB;QACD,UAAU,EAAE,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;KACrD,CAAA;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,OAA6B,EAC7B,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,UAAU;IAEpD,MAAM,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACzD,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3F,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;IAC9D,CAAC;IAED,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;IACzE,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;IAC9E,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAA;IAChE,MAAM,oBAAoB,GAAG,WAAW,CACtC,QAAQ,CAAC,YAAY,IAAI,EAAE,EAAE,gCAAgC,CAAC,CAAA;IAChE,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;IAC3E,CAAC;IAED,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAC,CAAA;IAC3E,IAAI,SAAS,GAAG,EAAE,CAAA;IAClB,IAAI,CAAC;QACH,SAAS,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE;YACvF,IAAI,EAAE,YAAY;YAClB,eAAe,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC;YAC7C,aAAa,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC;YACzC,cAAc,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC;YAC3C,cAAc,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC;SAC5C,CAAC,CAAA;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACxD,CAAC;IACD,MAAM,kBAAkB,GAAG,SAAS,CAAC,KAAK,CACxC,IAAI,MAAM,CAAC,eAAe,oBAAoB,4CAA4C,CAAC,CAC5F,EAAE,CAAC,CAAC,CAAC,CAAA;IACN,IAAI,UAAU,GAAG,KAAK,CAAA;IACtB,IAAI,kBAAkB,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,kBAAkB,GAAG,CAAC,CAAA;YACrD,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,IAAI,CAAA;QAClF,CAAC;QAAC,MAAM,CAAC,CAAC,yCAAyC,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAA;QACtD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC;YACxB,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;YAC/E,CAAC,CAAC,qBAAqB,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAA;QACvD,MAAM,IAAI,KAAK,CAAC,kCAAkC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC,CAAA;IACpF,CAAC;IAED,OAAO;QACL,GAAG,OAAO;QACV,QAAQ,EAAE,IAAI;QACd,eAAe,EAAE,UAAU,CAAC,IAAI,EAAE;QAClC,mBAAmB,EAAE,IAAI;QACzB,sBAAsB,EAAE,IAAI;KAC7B,CAAA;AACH,CAAC;AAED,MAAM,UAAU,mCAAmC,CAAC,SAAiB;IACnE,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAA;IACtD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC,CAAA;IACvD,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC;QACnC,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,eAAe,CAAC;QAChE,CAAC,CAAC,EAAE,CAAA;IACN,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,KAAK,SAAS;QACpD,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,EAAE,4BAA4B,CAAC,CAAA;IAClE,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,gCAAgC,CAAC,CAAA;IAC9F,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,KAAK,SAAS;QAChD,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,0BAA0B,CAAC,CAAA;IAC9D,MAAM,eAAe,GAAG,UAAU,CAAC,KAAK,KAAK,SAAS;QACpD,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,EAAE,gCAAgC,CAAC,CAAA;IACnE,eAAe,CAAC,oBAAoB,CAAC,GAAG,MAAM,CAAA;IAC9C,UAAU,CAAC,KAAK,GAAG,eAAe,CAAA;IAClC,MAAM,CAAC,UAAU,GAAG,UAAU,CAAA;IAC9B,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;AAChC,CAAC;AAED,SAAS,WAAW,CAClB,OAAe,EACf,IAAc,EACd,GAAW,EACX,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,EAC3B,cAAsC,EAAE;IAExC,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE;QACrC,GAAG;QACH,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,MAAM;QACf,SAAS;QACT,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,WAAW,EAAE;KACxC,CAAC,CAAA;IACF,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MACtD,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IACpG,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;AACnC,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY,EAAE,GAAW;IACjD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IACrE,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,iCAAiC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;AACxG,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IACrE,OAAO,WAAW,CAAC,KAAK,CAAC,6EAA6E,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;AAC5H,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,KAAa;IAC9C,IAAI,KAAc,CAAA;IAClB,IAAI,CAAC;QAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAAC,CAAC;IAChC,OAAO,KAAK,EAAE,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,eAAgB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAA;IAAC,CAAC;IACpF,OAAO,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;AAClC,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,KAAa;IAChD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,kBAAkB,CAAC,CAAA;IAC7C,CAAC;IACD,OAAO,KAA4B,CAAA;AACrC,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,KAAa;IAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,eAAe,CAAC,CAAA;IAC1C,CAAC;IACD,OAAO,KAAiB,CAAA;AAC1B,CAAC;AAED,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACzD,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,KAAc;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAA;IAClD,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAA;IAC5D,aAAa,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IAC9C,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;AAC7B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAA6B;IAC3D,OAAO;QACL,GAAG,OAAO;QACV,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC;QAC3D,KAAK,EAAE;YACL,GAAG,OAAO,CAAC,KAAK;YAChB,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;SACtD;KACF,CAAA;AACH,CAAC","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'\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 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 config.$schema ||= 'https://opencode.ai/config.json'\n config.instructions = [\n REQUIRED_BASIC_SKILL_INSTRUCTION,\n ...instructions.filter((item) => 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): 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)\n const configRun = runOpenCode(command, ['debug', 'config'], binding.workspace)\n const resolved = parseObject(configRun, 'opencode debug config')\n const resolvedInstructions = stringArray(\n resolved.instructions || [], 'opencode resolved instructions')\n if (!resolvedInstructions.includes(REQUIRED_BASIC_SKILL_INSTRUCTION)) {\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(command, ['debug', 'skill'], binding.workspace, 4 * 1024 * 1024, {\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 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 config.instructions = instructions.filter((item) => 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: Record<string, string> = {},\n): string {\n const child = spawnSync(command, args, {\n cwd,\n encoding: 'utf8',\n timeout: 30_000,\n maxBuffer,\n env: { ...process.env, ...environment },\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 = '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"]}