@xdxer/dingtalk-agent 0.1.5-beta.3 → 0.1.5-beta.4

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 (42) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.en.md +92 -65
  3. package/README.md +92 -65
  4. package/dist/bin/dingtalk-agent.js +142 -15
  5. package/dist/bin/dingtalk-agent.js.map +1 -1
  6. package/dist/src/agent-platform.js +1 -0
  7. package/dist/src/agent-platform.js.map +1 -1
  8. package/dist/src/development-workspace.js +66 -3
  9. package/dist/src/development-workspace.js.map +1 -1
  10. package/dist/src/multica-deploy.js +101 -9
  11. package/dist/src/multica-deploy.js.map +1 -1
  12. package/dist/src/multica-provider.js +157 -2
  13. package/dist/src/multica-provider.js.map +1 -1
  14. package/dist/src/schedule-plan.js +105 -0
  15. package/dist/src/schedule-plan.js.map +1 -0
  16. package/docs/ARCHITECTURE.md +133 -18
  17. package/docs/PRIOR-ART.md +4 -0
  18. package/docs/SELF-TEST.md +1 -1
  19. package/docs/architecture/agent-platform-connection-layer.svg +120 -0
  20. package/docs/architecture/digital-employee-composition.svg +92 -0
  21. package/docs/architecture/dingtalk-agent-architecture.svg +125 -0
  22. package/docs/assets/digital-employee-at-work.svg +77 -0
  23. package/docs/schemas/multica-workspace-run.schema.json +150 -33
  24. package/docs/schemas/project.schema.json +22 -0
  25. package/docs/schemas/workspace-scaffold.schema.json +37 -0
  26. package/examples/agents/README.md +1 -1
  27. package/lab/project-workspace/fake-multica-provider.mjs +18 -2
  28. package/lab/project-workspace/opencode-provider-suite.json +1 -1
  29. package/lab/robot-eval/suite.json +1 -1
  30. package/package.json +2 -2
  31. package/skills/core/dingtalk-agent-compose/SKILL.md +4 -3
  32. package/skills/core/dingtalk-agent-compose/assets/AGENTS.template.md +1 -1
  33. package/skills/core/dingtalk-agent-compose/references/drive-and-schedules.md +124 -0
  34. package/skills/core/dingtalk-basic-behavior/SKILL.md +5 -4
  35. package/skills/core/dingtalk-basic-behavior/references/event-to-behavior.md +15 -1
  36. package/skills/core/dingtalk-basic-behavior/references/perception-and-gates.md +3 -0
  37. package/skills/core/dingtalk-basic-behavior/references/risk-authority-and-privacy.md +12 -0
  38. package/skills/platforms/deap/PLATFORM.md +30 -1
  39. package/skills/platforms/multica-dingtalk/PLATFORM.md +25 -0
  40. package/skills/platforms/multica-dingtalk/dingtalk-agent-deploy-multica/SKILL.md +3 -2
  41. package/skills/platforms/multica-dingtalk/multica-external/SKILL.md +15 -0
  42. package/docs/assets/agent-delivery-lifecycle.svg +0 -103
@@ -71,6 +71,156 @@ export function planMulticaWorkspace(start, name, options = {}) {
71
71
  dingtalkSideEffect: false,
72
72
  };
73
73
  }
74
+ const SCAFFOLD_STAGES = new Set(['dev', 'test', 'staging', 'prod']);
75
+ const SCAFFOLD_NAME = /^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$/;
76
+ /**
77
+ * Author a multica-provider Workspace entry into dingtalk-agent.json so callers never hand-copy
78
+ * the schema. Env-referenced IDs are namespaced by Workspace name; authority is filled in and
79
+ * `agentIdFrom` deliberately omitted (first deploy creates the Agent and saves its ID). The
80
+ * written manifest is re-parsed to fail closed on any invalid result.
81
+ */
82
+ export function scaffoldMulticaWorkspace(start, name, options = {}) {
83
+ const cliVersion = options.cliVersion || '';
84
+ if (!SCAFFOLD_NAME.test(name))
85
+ throw new Error(`Workspace 名不合法: ${name}`);
86
+ if (options.stage !== undefined && !SCAFFOLD_STAGES.has(options.stage)) {
87
+ throw new Error(`--stage 只支持 dev/test/staging/prod,收到 ${options.stage}`);
88
+ }
89
+ const info = inspectAgentProject(start, cliVersion);
90
+ const existing = info.workspaces.find((item) => item.name === name);
91
+ if (existing && existing.provider.kind !== 'multica') {
92
+ throw new Error(`Workspace ${name} 已声明为 ${existing.provider.kind},不能改写成 multica`);
93
+ }
94
+ const alreadyDeclared = Boolean(existing);
95
+ let stage;
96
+ let profile;
97
+ let envRefs;
98
+ let block;
99
+ if (existing) {
100
+ // Report the REAL declared config, not this call's args: a manually-authored Workspace or one
101
+ // using non-default env names must not be misrepresented (nor its --profile/--stage silently
102
+ // "changed" in the output while nothing is written).
103
+ const stripEnv = (ref) => (ref.startsWith('env:') ? ref.slice(4) : ref);
104
+ stage = existing.stage;
105
+ profile = existing.provider.profile || '';
106
+ envRefs = {
107
+ workspaceId: stripEnv(existing.provider.workspaceIdFrom || ''),
108
+ runtimeId: stripEnv(existing.provider.runtimeIdFrom || ''),
109
+ dwsProfile: stripEnv(existing.authority?.dwsProfileFrom || ''),
110
+ expectedUserId: stripEnv(existing.authority?.expectedUserIdFrom || ''),
111
+ };
112
+ block = {
113
+ stage: existing.stage,
114
+ provider: { ...existing.provider },
115
+ ...(existing.authority ? { authority: { ...existing.authority } } : {}),
116
+ storage: { ...existing.storage },
117
+ };
118
+ }
119
+ else {
120
+ stage = options.stage || 'test';
121
+ profile = String(options.profile || '').trim();
122
+ if (!profile) {
123
+ throw new Error('multica Workspace 需要 --profile <multica CLI profile>(profile 不接受 env 引用)');
124
+ }
125
+ // Namespace env refs by Workspace name AND a stable hash of the raw name so names differing
126
+ // only in separators (foo-bar / foo_bar / foo.bar) never collapse to the same env variables.
127
+ const sanitized = name.replace(/[^a-zA-Z0-9]+/g, '_').toUpperCase();
128
+ const envPrefix = `DTA_${sanitized}_${digest(name).slice(0, 6).toUpperCase()}`;
129
+ envRefs = {
130
+ workspaceId: `${envPrefix}_WORKSPACE_ID`,
131
+ runtimeId: `${envPrefix}_RUNTIME_ID`,
132
+ dwsProfile: `${envPrefix}_DWS_PROFILE`,
133
+ expectedUserId: `${envPrefix}_EXPECTED_USER_ID`,
134
+ };
135
+ block = {
136
+ stage,
137
+ provider: {
138
+ kind: 'multica',
139
+ profile,
140
+ workspaceIdFrom: `env:${envRefs.workspaceId}`,
141
+ runtimeIdFrom: `env:${envRefs.runtimeId}`,
142
+ },
143
+ authority: {
144
+ dwsProfileFrom: `env:${envRefs.dwsProfile}`,
145
+ expectedUserIdFrom: `env:${envRefs.expectedUserId}`,
146
+ },
147
+ storage: {
148
+ memory: 'local-md:MEMORY.md',
149
+ knowledge: 'local-md:knowledge/INDEX.md',
150
+ artifacts: `local-dir:.dingtalk-agent/artifacts/${name}`,
151
+ },
152
+ };
153
+ }
154
+ const result = (applied) => ({
155
+ $schema: 'dingtalk-agent/workspace-scaffold@1',
156
+ workspace: name,
157
+ provider: 'multica',
158
+ stage,
159
+ profile,
160
+ applied,
161
+ alreadyDeclared,
162
+ manifest: 'dingtalk-agent.json',
163
+ block,
164
+ envRefs,
165
+ nextSteps: alreadyDeclared
166
+ ? [
167
+ `Workspace ${name} 已声明(未改写);以下是它当前真实的配置`,
168
+ ...(options.profile && options.profile.trim() && options.profile.trim() !== profile
169
+ ? [`注意:本次 --profile=${options.profile.trim()} 与已声明 profile=${profile} 不同,未生效;要改请手动编辑 dingtalk-agent.json`]
170
+ : []),
171
+ ...(options.stage && options.stage !== stage
172
+ ? [`注意:本次 --stage=${options.stage} 与已声明 stage=${stage} 不同,未生效`]
173
+ : []),
174
+ `设置 4 个 env 后运行 dta workspace doctor ${name}`,
175
+ `export ${envRefs.workspaceId}=<multica workspace uuid>`,
176
+ `export ${envRefs.runtimeId}=<multica runtime uuid>`,
177
+ `export ${envRefs.dwsProfile}=<dws profile 或 corpId>`,
178
+ `export ${envRefs.expectedUserId}=<dws user id>`,
179
+ ]
180
+ : [
181
+ applied ? '已写入 dingtalk-agent.json' : '预览(加 --yes 落盘)',
182
+ `export ${envRefs.workspaceId}=<multica workspace uuid>`,
183
+ `export ${envRefs.runtimeId}=<multica runtime uuid>`,
184
+ `export ${envRefs.dwsProfile}=<dws profile 或 corpId>`,
185
+ `export ${envRefs.expectedUserId}=<dws user id>`,
186
+ `dta workspace doctor ${name}`,
187
+ `dta workspace plan ${name} --json`,
188
+ `dta workspace inspect ${name} --execute --yes --json # 代理环境先套 env -u ...PROXY`,
189
+ `dta deploy --workspace ${name} --dry-run --json`,
190
+ ],
191
+ sideEffect: applied ? 'local-manifest' : false,
192
+ dingtalkSideEffect: false,
193
+ });
194
+ if (alreadyDeclared || !options.apply)
195
+ return result(false);
196
+ const manifestPath = join(info.root, 'dingtalk-agent.json');
197
+ if (!existsSync(manifestPath) || lstatSync(manifestPath).isSymbolicLink()) {
198
+ throw new Error('未找到可写的 dingtalk-agent.json(或它是 symlink);无法脚手架 Workspace');
199
+ }
200
+ const raw = readFileSync(manifestPath, 'utf8');
201
+ const manifest = JSON.parse(raw);
202
+ if (!manifest.workspaces || typeof manifest.workspaces !== 'object')
203
+ manifest.workspaces = {};
204
+ if (name in manifest.workspaces)
205
+ return result(false);
206
+ manifest.workspaces[name] = block;
207
+ const stamp = `${process.pid}-${digest(raw).slice(0, 8)}`;
208
+ const staging = `${manifestPath}.tmp-${stamp}`;
209
+ writeFileSync(staging, `${JSON.stringify(manifest, null, 2)}\n`);
210
+ renameSync(staging, manifestPath);
211
+ try {
212
+ showDevelopmentWorkspace(info.root, name, cliVersion);
213
+ }
214
+ catch (error) {
215
+ // Restore the exact original bytes atomically (staging + rename), never a partial write:
216
+ // a kill mid-restore must not leave a truncated shared manifest.
217
+ const restore = `${manifestPath}.restore-${stamp}`;
218
+ writeFileSync(restore, raw);
219
+ renameSync(restore, manifestPath);
220
+ throw error;
221
+ }
222
+ return result(true);
223
+ }
74
224
  export function inspectMulticaWorkspace(start, name, options = {}) {
75
225
  const plan = planMulticaWorkspace(start, name, options);
76
226
  if (!options.execute)
@@ -407,8 +557,13 @@ function resolveMulticaTarget(start, name, env, cliVersion, agentIdOverride = ''
407
557
  blocking.push('agent-id-override.invalid');
408
558
  }
409
559
  }
410
- else if (provider.agentIdFrom)
411
- agentId = resolveRef(provider.agentIdFrom, 'agent-id');
560
+ else if (provider.agentIdFrom) {
561
+ // A declared-but-empty agentIdFrom means "not yet bound" on a workspace whose Agent
562
+ // has not been created. Treat it like an omitted agentIdFrom (createable, no blocker):
563
+ // the deploy W4 create path saves the real ID to state, and the run/retire paths add
564
+ // their own `agent-id.missing` blocker. A malformed (non-empty, invalid) value still blocks.
565
+ agentId = resolveRef(provider.agentIdFrom, 'agent-id', true);
566
+ }
412
567
  else if (workspace.state?.binding.agentId) {
413
568
  try {
414
569
  agentId = resourceId(workspace.state.binding.agentId, 'state.agent-id');
@@ -1 +1 @@
1
- {"version":3,"file":"multica-provider.js","sourceRoot":"","sources":["../../src/multica-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto'\nimport { spawnSync } from 'node:child_process'\nimport {\n existsSync, lstatSync, mkdirSync, readFileSync, realpathSync, renameSync, writeFileSync,\n} from 'node:fs'\nimport { dirname, join, relative, resolve } from 'node:path'\nimport {\n WORKSPACE_STATE_ROOT, inspectAgentProject, showDevelopmentWorkspace,\n type DevelopmentWorkspaceState, type DevelopmentWorkspaceView,\n} from './development-workspace.js'\nimport { digest, stableStringify } from './events.js'\n\nexport const MULTICA_EVIDENCE_ROOT = '.dingtalk-agent/development-workspace-evidence'\n\nexport interface MulticaWorkspacePlan {\n $schema: 'dingtalk-agent/multica-workspace-plan@1'\n planId: string\n workspace: string\n provider: 'multica'\n profile: string\n desiredHash: string\n currentState: string\n expected: {\n workspaceId: string\n runtimeId: string\n agentId: string\n skills: string[]\n }\n observed: {\n workspaceId: string\n runtimeId: string\n agentId: string\n skillSetHash: string\n }\n diff: string[]\n blocking: string[]\n operations: Array<{ id: string; argv: string[] }>\n writes: []\n remoteRead: false\n remoteWrite: false\n sideEffect: false\n dingtalkSideEffect: false\n}\n\nexport interface MulticaReadCall {\n id: string\n argv: string[]\n exitCode: number\n stdoutHash: string\n stderrHash: string\n passed: boolean\n}\n\nexport interface MulticaResourceSummary {\n workspace: { id: string; name: string; slug: string } | null\n runtime: {\n id: string; workspaceId: string; name: string; provider: string; status: string\n } | null\n agent: {\n id: string; workspaceId: string; runtimeId: string; name: string; status: string; archived: boolean\n } | null\n agentCandidates: Array<{ id: string; name: string; archived: boolean }>\n catalogSkills: Array<{ id: string; workspaceId: string; name: string }>\n assignedSkills: Array<{ id: string; name: string; enabled: boolean }>\n}\n\nexport interface MulticaWorkspaceInspection {\n $schema: 'dingtalk-agent/multica-workspace-inspection@1'\n passed: boolean\n readyForApply: boolean\n providerReady: false\n inspectionId: string\n workspace: string\n provider: 'multica'\n profile: string\n cliVersion: string\n desiredHash: string\n observedHash: string\n expected: MulticaWorkspacePlan['expected']\n auth: { authenticated: boolean; principalHash: string; serverHash: string }\n resources: MulticaResourceSummary\n diff: string[]\n failures: string[]\n calls: MulticaReadCall[]\n evidencePath: string\n remoteRead: true\n remoteWrite: false\n sideEffect: 'remote-read'\n dingtalkSideEffect: false\n}\n\nexport interface MulticaWorkspaceStatus {\n $schema: 'dingtalk-agent/multica-workspace-status@1'\n workspace: string\n provider: 'multica'\n available: boolean\n inspectionId: string\n passed: boolean\n readyForApply: boolean\n providerReady: false\n evidencePath: string\n evidenceIntegrity: boolean\n stateMatched: boolean\n desiredHash: string\n observedHash: string\n diff: string[]\n failures: string[]\n remoteRead: false\n remoteWrite: false\n sideEffect: false\n dingtalkSideEffect: false\n}\n\nexport interface MulticaResourceList {\n $schema: 'dingtalk-agent/multica-workspace-resource-list@1'\n passed: boolean\n workspace: string\n provider: 'multica'\n profile: string\n inspectionId: string\n resources: MulticaResourceSummary\n failures: string[]\n calls: MulticaReadCall[]\n remoteRead: true\n remoteWrite: false\n sideEffect: 'remote-read'\n dingtalkSideEffect: false\n}\n\nexport interface MulticaReadOptions {\n execute?: boolean\n yes?: boolean\n command?: string\n env?: NodeJS.ProcessEnv\n timeoutMs?: number\n out?: string\n cliVersion?: string\n /** Internal composition hook: W4 reuses W3 readback without clobbering ready state. */\n persist?: boolean\n /** Internal composition hook for the first readback after an Agent create. */\n agentIdOverride?: string\n}\n\ninterface ResolvedMulticaTarget {\n root: string\n projectName: string\n skills: string[]\n workspace: DevelopmentWorkspaceView\n profile: string\n workspaceId: string\n runtimeId: string\n agentId: string\n blocking: string[]\n}\n\ninterface ReadResult {\n stdout: string\n stderr: string\n}\n\nclass MulticaReadFailure extends Error {\n constructor(readonly category: string) {\n super(category)\n }\n}\n\nexport function planMulticaWorkspace(\n start: string, name: string, options: MulticaReadOptions = {},\n): MulticaWorkspacePlan {\n const target = resolveMulticaTarget(\n start, name, options.env || process.env, options.cliVersion || '', options.agentIdOverride,\n )\n const state = target.workspace.state\n const expected = {\n workspaceId: target.workspaceId,\n runtimeId: target.runtimeId,\n agentId: target.agentId,\n skills: [...target.skills].sort(),\n }\n const observed = {\n workspaceId: state?.binding.remoteWorkspaceId || '',\n runtimeId: state?.binding.runtimeId || '',\n agentId: state?.binding.agentId || '',\n skillSetHash: state?.binding.observedSkillSetHash || '',\n }\n const expectedSkillSetHash = digest(stableStringify(expected.skills))\n const diff: string[] = []\n if (observed.workspaceId !== expected.workspaceId) diff.push('workspace.scope')\n if (observed.runtimeId !== expected.runtimeId) diff.push('runtime.binding')\n if (expected.agentId) {\n if (observed.agentId !== expected.agentId) diff.push('agent.binding')\n } else if (!observed.agentId) diff.push('agent.create')\n if (observed.skillSetHash !== expectedSkillSetHash) diff.push('skills.assignments')\n const operations = readOperations(target)\n const planId = `multica_plan_${digest(stableStringify({\n workspace: name,\n desiredHash: target.workspace.desiredHash,\n expected,\n observed,\n diff: [...diff].sort(),\n blocking: [...target.blocking].sort(),\n operations,\n })).slice(0, 24)}`\n return {\n $schema: 'dingtalk-agent/multica-workspace-plan@1',\n planId,\n workspace: name,\n provider: 'multica',\n profile: target.profile,\n desiredHash: target.workspace.desiredHash,\n currentState: target.workspace.status,\n expected,\n observed,\n diff: [...diff].sort(),\n blocking: [...target.blocking].sort(),\n operations,\n writes: [],\n remoteRead: false,\n remoteWrite: false,\n sideEffect: false,\n dingtalkSideEffect: false,\n }\n}\n\nexport function inspectMulticaWorkspace(\n start: string, name: string, options: MulticaReadOptions = {},\n): MulticaWorkspacePlan | MulticaWorkspaceInspection {\n const plan = planMulticaWorkspace(start, name, options)\n if (!options.execute) return plan\n requireReadConfirmation(options, 'workspace inspect')\n if (plan.blocking.length) {\n throw new Error(`Multica inspect 前置条件不完整: ${plan.blocking.join(', ')}`)\n }\n return executeInspection(start, name, plan, options, options.persist !== false)\n}\n\nexport function listMulticaWorkspaceResources(\n start: string, name: string, options: MulticaReadOptions = {},\n): MulticaWorkspacePlan | MulticaResourceList {\n const plan = planMulticaWorkspace(start, name, options)\n if (!options.execute) return plan\n requireReadConfirmation(options, 'workspace remote-list')\n if (plan.blocking.length) {\n throw new Error(`Multica remote-list 前置条件不完整: ${plan.blocking.join(', ')}`)\n }\n const inspection = executeInspection(start, name, plan, options, false)\n return {\n $schema: 'dingtalk-agent/multica-workspace-resource-list@1',\n passed: inspection.passed,\n workspace: inspection.workspace,\n provider: 'multica',\n profile: inspection.profile,\n inspectionId: inspection.inspectionId,\n resources: inspection.resources,\n failures: inspection.failures,\n calls: inspection.calls,\n remoteRead: true,\n remoteWrite: false,\n sideEffect: 'remote-read',\n dingtalkSideEffect: false,\n }\n}\n\nexport function statusMulticaWorkspace(\n start: string, name: string, cliVersion = '',\n): MulticaWorkspaceStatus {\n const info = inspectAgentProject(start, cliVersion)\n const workspace = requireMulticaWorkspace(info.root, name, cliVersion)\n const latestPath = latestPointerPath(info.root, name)\n if (!existsSync(latestPath)) return emptyStatus(workspace)\n const pointer = readJsonObject(latestPath, 'Multica inspection latest pointer')\n if (pointer.$schema !== 'dingtalk-agent/multica-inspection-pointer@1') {\n throw new Error('Multica inspection latest pointer schema 非法')\n }\n const evidencePath = stringField(pointer.evidencePath, 'pointer.evidencePath')\n const reportPath = safeProjectPath(info.root, evidencePath, true)\n const reportSource = readFileSync(reportPath, 'utf8')\n const evidenceIntegrity = sha256(reportSource) === stringField(pointer.reportHash, 'pointer.reportHash')\n const report = JSON.parse(reportSource) as MulticaWorkspaceInspection\n if (report.$schema !== 'dingtalk-agent/multica-workspace-inspection@1' || report.workspace !== name) {\n throw new Error('Multica inspection report 与 Workspace 不匹配')\n }\n assertRedacted(report)\n const state = workspace.state\n const stateMatched = Boolean(evidenceIntegrity && report.passed && state &&\n state.provider === 'multica' && ['verifying', 'ready'].includes(state.status) &&\n state.desiredHash === workspace.desiredHash && state.observedHash === report.observedHash &&\n state.binding.inspectionId === report.inspectionId &&\n state.binding.evidencePath === evidencePath)\n return {\n $schema: 'dingtalk-agent/multica-workspace-status@1',\n workspace: name,\n provider: 'multica',\n available: true,\n inspectionId: report.inspectionId,\n passed: report.passed,\n readyForApply: report.readyForApply && stateMatched,\n providerReady: false,\n evidencePath,\n evidenceIntegrity,\n stateMatched,\n desiredHash: workspace.desiredHash,\n observedHash: report.observedHash,\n diff: [...report.diff],\n failures: [...report.failures],\n remoteRead: false,\n remoteWrite: false,\n sideEffect: false,\n dingtalkSideEffect: false,\n }\n}\n\nfunction executeInspection(\n start: string,\n name: string,\n plan: MulticaWorkspacePlan,\n options: MulticaReadOptions,\n persist: boolean,\n): MulticaWorkspaceInspection {\n const env = options.env || process.env\n const target = resolveMulticaTarget(\n start, name, env, options.cliVersion || '', options.agentIdOverride,\n )\n const command = options.command || env.DTA_MULTICA_BIN || 'multica'\n const timeoutMs = positiveTimeout(options.timeoutMs)\n if (persist) {\n const plannedEvidence = options.out || join(\n MULTICA_EVIDENCE_ROOT, safeName(name), 'multica-inspections', 'planned.json',\n )\n safeProjectPath(target.root, plannedEvidence, false)\n latestPointerPath(target.root, name)\n safeProjectPath(target.root, join(WORKSPACE_STATE_ROOT, `${name}.json`), false)\n }\n const calls: MulticaReadCall[] = []\n const failures: string[] = []\n const diff: string[] = []\n let cliVersion = ''\n let principalHash = ''\n let serverHash = ''\n let resources = emptyResources()\n\n try {\n const version = runRead(command, ['--version'], 'cli.version', target.root, env, timeoutMs, calls)\n cliVersion = parseMulticaVersion(version.stdout || version.stderr)\n\n const config = runRead(command, profileArgs(target, ['config', 'show']),\n 'profile.config', target.root, env, timeoutMs, calls)\n const parsedConfig = parseConfig(config.stdout, target.profile)\n serverHash = parsedConfig.server ? digest(parsedConfig.server) : ''\n if (parsedConfig.workspaceId && parsedConfig.workspaceId !== target.workspaceId) {\n throw new MulticaReadFailure('scope.profile-workspace-mismatch')\n }\n\n const auth = runRead(command, profileArgs(target, ['auth', 'status']),\n 'auth.status', target.root, env, timeoutMs, calls)\n const principal = parseAuth(auth.stdout + '\\n' + auth.stderr)\n if (!principal) throw new MulticaReadFailure('auth.not-authenticated')\n principalHash = digest(principal)\n\n const workspaceList = jsonArray(runRead(command,\n profileArgs(target, ['workspace', 'list', '--output', 'json']),\n 'workspace.list', target.root, env, timeoutMs, calls).stdout, 'workspace list')\n const workspaceMatches = workspaceList.filter((item) => idOf(item) === target.workspaceId)\n if (workspaceMatches.length !== 1) throw new MulticaReadFailure('scope.workspace-list-mismatch')\n\n const workspaceGet = jsonObject(runRead(command,\n profileArgs(target, ['workspace', 'get', target.workspaceId, '--output', 'json']),\n 'workspace.get', target.root, env, timeoutMs, calls).stdout, 'workspace get')\n if (idOf(workspaceGet) !== target.workspaceId) {\n throw new MulticaReadFailure('scope.workspace-get-mismatch')\n }\n resources.workspace = {\n id: resourceId(idOf(workspaceGet), 'workspace.id'),\n name: safeDisplay(workspaceGet.name),\n slug: safeDisplay(workspaceGet.slug),\n }\n\n const runtimes = jsonArray(runRead(command,\n scopedArgs(target, ['runtime', 'list', '--output', 'json']),\n 'runtime.list', target.root, env, timeoutMs, calls).stdout, 'runtime list')\n const runtimeMatches = runtimes.filter((item) => idOf(item) === target.runtimeId)\n if (runtimeMatches.length !== 1) throw new MulticaReadFailure('scope.runtime-mismatch')\n const runtime = runtimeMatches[0]\n const runtimeWorkspace = optionalField(runtime.workspace_id)\n if (runtimeWorkspace && runtimeWorkspace !== target.workspaceId) {\n throw new MulticaReadFailure('scope.runtime-workspace-mismatch')\n }\n resources.runtime = {\n id: resourceId(idOf(runtime), 'runtime.id'),\n workspaceId: runtimeWorkspace || target.workspaceId,\n name: safeDisplay(runtime.name),\n provider: safeDisplay(runtime.provider),\n status: safeDisplay(runtime.status),\n }\n\n const agents = jsonArray(runRead(command,\n scopedArgs(target, ['agent', 'list', '--include-archived', '--output', 'json']),\n 'agent.list', target.root, env, timeoutMs, calls).stdout, 'agent list')\n resources.agentCandidates = agents\n .filter((item) => optionalField(item.name) === target.projectName)\n .map((item) => ({\n id: resourceId(idOf(item), 'agent candidate.id'),\n name: safeDisplay(item.name),\n archived: Boolean(optionalField(item.archived_at)),\n }))\n .sort((a, b) => a.id.localeCompare(b.id))\n\n const catalog = jsonArray(runRead(command,\n scopedArgs(target, ['skill', 'list', '--output', 'json']),\n 'skill.list', target.root, env, timeoutMs, calls).stdout, 'skill list')\n resources.catalogSkills = catalog.map((item) => ({\n id: resourceId(idOf(item), 'skill.id'),\n workspaceId: optionalField(item.workspace_id) || target.workspaceId,\n name: safeDisplay(item.name),\n })).sort(compareNamedResource)\n if (resources.catalogSkills.some((item) => item.workspaceId !== target.workspaceId)) {\n throw new MulticaReadFailure('scope.skill-workspace-mismatch')\n }\n\n if (target.agentId) {\n const agentMatches = agents.filter((item) => idOf(item) === target.agentId)\n if (agentMatches.length !== 1) throw new MulticaReadFailure('scope.agent-list-mismatch')\n const agent = jsonObject(runRead(command,\n scopedArgs(target, ['agent', 'get', target.agentId, '--output', 'json']),\n 'agent.get', target.root, env, timeoutMs, calls).stdout, 'agent get')\n const agentWorkspace = optionalField(agent.workspace_id)\n const agentRuntime = optionalField(agent.runtime_id)\n if (idOf(agent) !== target.agentId || agentWorkspace !== target.workspaceId ||\n agentRuntime !== target.runtimeId) {\n throw new MulticaReadFailure('scope.agent-binding-mismatch')\n }\n resources.agent = {\n id: target.agentId,\n workspaceId: agentWorkspace,\n runtimeId: agentRuntime,\n name: safeDisplay(agent.name),\n status: safeDisplay(agent.status),\n archived: Boolean(optionalField(agent.archived_at)),\n }\n const assigned = jsonArray(runRead(command,\n scopedArgs(target, ['agent', 'skills', 'list', target.agentId, '--output', 'json']),\n 'agent.skills', target.root, env, timeoutMs, calls).stdout, 'agent skills list')\n resources.assignedSkills = assigned.map((item) => ({\n id: resourceId(idOf(item), 'assigned skill.id'),\n name: safeDisplay(item.name),\n enabled: item.enabled === undefined ? true : Boolean(item.enabled),\n })).sort(compareNamedResource)\n } else if (resources.agentCandidates.length > 0) {\n throw new MulticaReadFailure('agent.unbound-name-candidates')\n } else {\n diff.push('agent.create')\n }\n\n for (const name of target.skills) {\n const candidates = resources.catalogSkills.filter((item) => item.name === name)\n if (candidates.length > 1) throw new MulticaReadFailure(`skills.duplicate:${name}`)\n if (candidates.length === 0) {\n diff.push(`skill.create:${name}`)\n continue\n }\n if (target.agentId && !resources.assignedSkills.some((item) =>\n item.id === candidates[0].id && item.enabled)) {\n diff.push(`skill.assign:${name}`)\n }\n }\n } catch (error) {\n failures.push(error instanceof MulticaReadFailure ? error.category : 'provider.read-failed')\n }\n\n const canonical = {\n cliVersion,\n profile: target.profile,\n principalHash,\n serverHash,\n expected: plan.expected,\n resources,\n }\n const observedHash = digest(stableStringify(canonical))\n const passed = failures.length === 0\n const inspectionId = `multica_inspect_${digest(stableStringify({\n desiredHash: target.workspace.desiredHash,\n observedHash,\n passed,\n diff: [...diff].sort(),\n failures,\n })).slice(0, 24)}`\n const defaultEvidencePath = join(\n MULTICA_EVIDENCE_ROOT, safeName(name), 'multica-inspections', `${inspectionId}.json`,\n )\n const evidencePath = options.out\n ? relative(target.root, safeProjectPath(target.root, options.out, false))\n : defaultEvidencePath\n const report: MulticaWorkspaceInspection = {\n $schema: 'dingtalk-agent/multica-workspace-inspection@1',\n passed,\n readyForApply: passed,\n providerReady: false,\n inspectionId,\n workspace: name,\n provider: 'multica',\n profile: target.profile,\n cliVersion,\n desiredHash: target.workspace.desiredHash,\n observedHash,\n expected: plan.expected,\n auth: { authenticated: Boolean(principalHash), principalHash, serverHash },\n resources,\n diff: [...diff].sort(),\n failures: [...failures].sort(),\n calls,\n evidencePath,\n remoteRead: true,\n remoteWrite: false,\n sideEffect: 'remote-read',\n dingtalkSideEffect: false,\n }\n assertRedacted(report)\n if (persist) persistInspection(target, plan, report)\n return report\n}\n\nfunction persistInspection(\n target: ResolvedMulticaTarget,\n plan: MulticaWorkspacePlan,\n report: MulticaWorkspaceInspection,\n): void {\n const reportPath = safeProjectPath(target.root, report.evidencePath, false)\n atomicJson(reportPath, report)\n const reportSource = readFileSync(reportPath, 'utf8')\n const pointer = {\n $schema: 'dingtalk-agent/multica-inspection-pointer@1',\n inspectionId: report.inspectionId,\n evidencePath: report.evidencePath,\n reportHash: sha256(reportSource),\n }\n atomicJson(latestPointerPath(target.root, target.workspace.name), pointer)\n if (!report.passed) return\n const expectedSkillSetHash = digest(stableStringify([...target.skills].sort()))\n const observedSkillSetHash = digest(stableStringify(report.resources.assignedSkills\n .filter((item) => item.enabled).map((item) => item.name).sort()))\n const state: DevelopmentWorkspaceState = {\n $schema: 'dingtalk-agent/workspace-state@1',\n workspace: target.workspace.name,\n provider: 'multica',\n status: 'verifying',\n binding: {\n profile: target.profile,\n remoteWorkspaceId: target.workspaceId,\n runtimeId: target.runtimeId,\n agentId: target.agentId,\n cliVersion: report.cliVersion,\n principalHash: report.auth.principalHash,\n serverHash: report.auth.serverHash,\n inspectionId: report.inspectionId,\n evidencePath: report.evidencePath,\n sourceHash: target.workspace.sourceHash,\n expectedSkillSetHash,\n observedSkillSetHash,\n },\n desiredHash: target.workspace.desiredHash,\n observedHash: report.observedHash,\n lastPlanId: plan.planId,\n lastReceiptId: '',\n lastEvalId: '',\n }\n atomicJson(safeProjectPath(\n target.root, join(WORKSPACE_STATE_ROOT, `${target.workspace.name}.json`), false,\n ), state)\n}\n\nfunction resolveMulticaTarget(\n start: string, name: string, env: NodeJS.ProcessEnv, cliVersion: string,\n agentIdOverride = '',\n): ResolvedMulticaTarget {\n const info = inspectAgentProject(start, cliVersion)\n const workspace = requireMulticaWorkspace(info.root, name, cliVersion)\n const provider = workspace.provider\n const blocking: string[] = []\n const resolveRef = (ref: string, label: string, optional = false): string => {\n if (!ref) return ''\n const variable = ref.startsWith('env:') ? ref.slice(4) : ''\n const value = variable ? String(env[variable] || '').trim() : ''\n if (!value) {\n if (!optional) blocking.push(label)\n return ''\n }\n try { return resourceId(value, label) } catch { blocking.push(`${label}.invalid`); return '' }\n }\n const workspaceId = resolveRef(provider.workspaceIdFrom, 'workspace-id')\n const runtimeId = resolveRef(provider.runtimeIdFrom, 'runtime-id')\n let agentId = ''\n if (agentIdOverride) {\n try { agentId = resourceId(agentIdOverride, 'agent-id-override') }\n catch { blocking.push('agent-id-override.invalid') }\n } else if (provider.agentIdFrom) agentId = resolveRef(provider.agentIdFrom, 'agent-id')\n else if (workspace.state?.binding.agentId) {\n try { agentId = resourceId(workspace.state.binding.agentId, 'state.agent-id') }\n catch { blocking.push('state.agent-id.invalid') }\n }\n return {\n root: info.root,\n projectName: info.project.displayName,\n skills: [...new Set(info.project.skills)].sort(),\n workspace,\n profile: provider.profile,\n workspaceId,\n runtimeId,\n agentId,\n blocking,\n }\n}\n\nfunction requireMulticaWorkspace(start: string, name: string, cliVersion: string): DevelopmentWorkspaceView {\n const workspace = showDevelopmentWorkspace(start, name, cliVersion)\n if (workspace.provider.kind !== 'multica' || workspace.legacy) {\n throw new Error(`Workspace ${name} 不是 multica Provider;W3 不执行 ${workspace.provider.kind}`)\n }\n return workspace\n}\n\nfunction readOperations(target: ResolvedMulticaTarget): Array<{ id: string; argv: string[] }> {\n const operations = [\n { id: 'cli.version', argv: ['--version'] },\n { id: 'profile.config', argv: profileArgs(target, ['config', 'show']) },\n { id: 'auth.status', argv: profileArgs(target, ['auth', 'status']) },\n { id: 'workspace.list', argv: profileArgs(target, ['workspace', 'list', '--output', 'json']) },\n { id: 'workspace.get', argv: profileArgs(target,\n ['workspace', 'get', target.workspaceId || '<workspace-id>', '--output', 'json']) },\n { id: 'runtime.list', argv: scopedArgs(target, ['runtime', 'list', '--output', 'json']) },\n { id: 'agent.list', argv: scopedArgs(target,\n ['agent', 'list', '--include-archived', '--output', 'json']) },\n { id: 'skill.list', argv: scopedArgs(target, ['skill', 'list', '--output', 'json']) },\n ]\n if (target.agentId) operations.push(\n { id: 'agent.get', argv: scopedArgs(target,\n ['agent', 'get', target.agentId, '--output', 'json']) },\n { id: 'agent.skills', argv: scopedArgs(target,\n ['agent', 'skills', 'list', target.agentId, '--output', 'json']) },\n )\n return operations\n}\n\nfunction profileArgs(target: ResolvedMulticaTarget, args: string[]): string[] {\n return ['--profile', target.profile, ...args]\n}\n\nfunction scopedArgs(target: ResolvedMulticaTarget, args: string[]): string[] {\n return ['--profile', target.profile, '--workspace-id', target.workspaceId || '<workspace-id>', ...args]\n}\n\nfunction runRead(\n command: string,\n argv: string[],\n id: string,\n cwd: string,\n env: NodeJS.ProcessEnv,\n timeoutMs: number,\n calls: MulticaReadCall[],\n): ReadResult {\n const run = spawnSync(command, argv, {\n cwd,\n env,\n encoding: 'utf8',\n timeout: timeoutMs,\n maxBuffer: 16 * 1024 * 1024,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n const stdout = String(run.stdout || '')\n const stderr = String(run.stderr || '')\n const exitCode = typeof run.status === 'number' ? run.status : 1\n const passed = !run.error && exitCode === 0\n calls.push({\n id,\n argv: argv.map(safeArg),\n exitCode,\n stdoutHash: sha256(stdout),\n stderrHash: sha256(stderr),\n passed,\n })\n if (!passed) throw new MulticaReadFailure(`command.${id}`)\n return { stdout, stderr }\n}\n\nfunction parseMulticaVersion(value: string): string {\n const match = value.match(/\\bmultica\\s+([0-9]+\\.[0-9]+\\.[0-9]+(?:[-+][A-Za-z0-9.-]+)?)/i)\n if (!match) throw new MulticaReadFailure('cli.version-invalid')\n return match[1]\n}\n\nfunction parseConfig(value: string, profile: string): { server: string; workspaceId: string } {\n const fields = new Map<string, string>()\n for (const line of value.split(/\\r?\\n/)) {\n const match = line.match(/^([^:]+):\\s*(.*)$/)\n if (match) fields.set(match[1].trim().toLowerCase(), match[2].trim())\n }\n if ((fields.get('profile') || '') !== profile) throw new MulticaReadFailure('profile.mismatch')\n const normalize = (item: string | undefined): string => item && item !== '(not set)' ? item : ''\n return {\n server: normalize(fields.get('server_url')),\n workspaceId: normalize(fields.get('workspace_id')),\n }\n}\n\nfunction parseAuth(value: string): string {\n if (/not authenticated|invalid or expired/i.test(value)) return ''\n const user = value.split(/\\r?\\n/).find((line) => /^User:\\s+/i.test(line.trim())) || ''\n const server = value.split(/\\r?\\n/).find((line) => /^Server:\\s+/i.test(line.trim())) || ''\n const token = value.split(/\\r?\\n/).find((line) => /^Token:\\s+/i.test(line.trim())) || ''\n return user && server && token ? `${user.trim()}|${server.trim()}` : ''\n}\n\nfunction jsonArray(value: string, label: string): Record<string, unknown>[] {\n let parsed: unknown\n try { parsed = JSON.parse(value) } catch { throw new MulticaReadFailure(`json.${label}`) }\n if (!Array.isArray(parsed) || parsed.some((item) => !item || typeof item !== 'object' || Array.isArray(item))) {\n throw new MulticaReadFailure(`shape.${label}`)\n }\n return parsed as Record<string, unknown>[]\n}\n\nfunction jsonObject(value: string, label: string): Record<string, unknown> {\n let parsed: unknown\n try { parsed = JSON.parse(value) } catch { throw new MulticaReadFailure(`json.${label}`) }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new MulticaReadFailure(`shape.${label}`)\n }\n return parsed as Record<string, unknown>\n}\n\nfunction readJsonObject(path: string, label: string): Record<string, unknown> {\n if (lstatSync(path).isSymbolicLink()) throw new Error(`${label} 不能是符号链接`)\n return jsonObject(readFileSync(path, 'utf8'), label)\n}\n\nfunction idOf(value: Record<string, unknown>): string {\n return optionalField(value.id)\n}\n\nfunction stringField(value: unknown, label: string): string {\n if (typeof value !== 'string' || !value) throw new Error(`${label} 必须是非空字符串`)\n return value\n}\n\nfunction optionalField(value: unknown): string {\n return typeof value === 'string' ? value : ''\n}\n\nfunction resourceId(value: string, label: string): string {\n if (!/^[A-Za-z0-9][A-Za-z0-9._:-]{1,127}$/.test(value) ||\n /^(?:mul_|mcn_|sk-|bearer)/i.test(value)) {\n throw new Error(`${label} 不是安全的稳定资源 ID`)\n }\n return value\n}\n\nfunction safeDisplay(value: unknown): string {\n const text = typeof value === 'string' ? value : ''\n if (!text) return ''\n if (/(?:mul_|mcn_|sk-[A-Za-z0-9]|bearer\\s|access[_-]?token|client[_-]?secret|password)/i.test(text)) {\n return `[redacted:${digest(text).slice(0, 12)}]`\n }\n return text.length > 160 ? `${text.slice(0, 157)}...` : text\n}\n\nfunction safeArg(value: string): string {\n return safeDisplay(value)\n}\n\nfunction compareNamedResource(\n a: { name: string; id: string }, b: { name: string; id: string },\n): number {\n return a.name.localeCompare(b.name) || a.id.localeCompare(b.id)\n}\n\nfunction emptyResources(): MulticaResourceSummary {\n return {\n workspace: null,\n runtime: null,\n agent: null,\n agentCandidates: [],\n catalogSkills: [],\n assignedSkills: [],\n }\n}\n\nfunction emptyStatus(workspace: DevelopmentWorkspaceView): MulticaWorkspaceStatus {\n return {\n $schema: 'dingtalk-agent/multica-workspace-status@1',\n workspace: workspace.name,\n provider: 'multica',\n available: false,\n inspectionId: '',\n passed: false,\n readyForApply: false,\n providerReady: false,\n evidencePath: '',\n evidenceIntegrity: false,\n stateMatched: false,\n desiredHash: workspace.desiredHash,\n observedHash: workspace.observedHash,\n diff: [],\n failures: ['inspection.missing'],\n remoteRead: false,\n remoteWrite: false,\n sideEffect: false,\n dingtalkSideEffect: false,\n }\n}\n\nfunction latestPointerPath(root: string, name: string): string {\n return safeProjectPath(root, join(\n MULTICA_EVIDENCE_ROOT, safeName(name), 'multica-inspections', 'latest.json',\n ), false)\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 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(`Multica Provider 路径必须位于 Project 内: ${ref}`)\n }\n if (mustExist && !existsSync(candidate)) throw new Error(`Multica evidence 不存在: ${ref}`)\n if (existsSync(candidate)) {\n if (lstatSync(candidate).isSymbolicLink()) {\n throw new Error(`Multica Provider 路径不能是符号链接: ${ref}`)\n }\n if (!isInside(rootReal, realpathSync(candidate))) {\n throw new Error(`Multica Provider 真实路径越出 Project: ${ref}`)\n }\n }\n let ancestor = dirname(candidate)\n while (!existsSync(ancestor)) {\n const parent = dirname(ancestor)\n if (parent === ancestor) break\n ancestor = parent\n }\n if (!existsSync(ancestor) || !isInside(rootReal, realpathSync(ancestor))) {\n throw new Error(`Multica Provider 父目录真实路径越出 Project: ${ref}`)\n }\n return candidate\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\nfunction atomicJson(path: string, value: unknown): void {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.tmp-${process.pid}`\n const source = `${JSON.stringify(value, null, 2)}\\n`\n writeFileSync(temp, source, { mode: 0o600 })\n renameSync(temp, path)\n if (readFileSync(path, 'utf8') !== source) throw new Error(`原子写后回读不一致: ${path}`)\n}\n\nfunction assertRedacted(value: unknown): void {\n const source = JSON.stringify(value)\n if (/(?:mul_|mcn_|sk-[A-Za-z0-9]|bearer\\s|access[_-]?token|client[_-]?secret|password)/i.test(source)) {\n throw new Error('Multica inspection 脱敏失败:检测到疑似凭据')\n }\n}\n\nfunction positiveTimeout(value: number | undefined): number {\n if (value === undefined) return 30_000\n if (!Number.isFinite(value) || value < 100 || value > 300_000) {\n throw new Error('Multica read timeout 必须在 100..300000 ms')\n }\n return Math.floor(value)\n}\n\nfunction requireReadConfirmation(options: MulticaReadOptions, command: string): void {\n if (!options.execute || !options.yes) {\n throw new Error(`${command} 会读取当前 Multica 身份和远端 scope;必须同时传 --execute --yes`)\n }\n}\n\nfunction sha256(value: string | Buffer): string {\n return createHash('sha256').update(value).digest('hex')\n}\n"]}
1
+ {"version":3,"file":"multica-provider.js","sourceRoot":"","sources":["../../src/multica-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto'\nimport { spawnSync } from 'node:child_process'\nimport {\n existsSync, lstatSync, mkdirSync, readFileSync, realpathSync, renameSync, writeFileSync,\n} from 'node:fs'\nimport { dirname, join, relative, resolve } from 'node:path'\nimport {\n WORKSPACE_STATE_ROOT, inspectAgentProject, showDevelopmentWorkspace,\n type DevelopmentWorkspaceState, type DevelopmentWorkspaceView,\n} from './development-workspace.js'\nimport { digest, stableStringify } from './events.js'\n\nexport const MULTICA_EVIDENCE_ROOT = '.dingtalk-agent/development-workspace-evidence'\n\nexport interface MulticaWorkspacePlan {\n $schema: 'dingtalk-agent/multica-workspace-plan@1'\n planId: string\n workspace: string\n provider: 'multica'\n profile: string\n desiredHash: string\n currentState: string\n expected: {\n workspaceId: string\n runtimeId: string\n agentId: string\n skills: string[]\n }\n observed: {\n workspaceId: string\n runtimeId: string\n agentId: string\n skillSetHash: string\n }\n diff: string[]\n blocking: string[]\n operations: Array<{ id: string; argv: string[] }>\n writes: []\n remoteRead: false\n remoteWrite: false\n sideEffect: false\n dingtalkSideEffect: false\n}\n\nexport interface MulticaReadCall {\n id: string\n argv: string[]\n exitCode: number\n stdoutHash: string\n stderrHash: string\n passed: boolean\n}\n\nexport interface MulticaResourceSummary {\n workspace: { id: string; name: string; slug: string } | null\n runtime: {\n id: string; workspaceId: string; name: string; provider: string; status: string\n } | null\n agent: {\n id: string; workspaceId: string; runtimeId: string; name: string; status: string; archived: boolean\n } | null\n agentCandidates: Array<{ id: string; name: string; archived: boolean }>\n catalogSkills: Array<{ id: string; workspaceId: string; name: string }>\n assignedSkills: Array<{ id: string; name: string; enabled: boolean }>\n}\n\nexport interface MulticaWorkspaceInspection {\n $schema: 'dingtalk-agent/multica-workspace-inspection@1'\n passed: boolean\n readyForApply: boolean\n providerReady: false\n inspectionId: string\n workspace: string\n provider: 'multica'\n profile: string\n cliVersion: string\n desiredHash: string\n observedHash: string\n expected: MulticaWorkspacePlan['expected']\n auth: { authenticated: boolean; principalHash: string; serverHash: string }\n resources: MulticaResourceSummary\n diff: string[]\n failures: string[]\n calls: MulticaReadCall[]\n evidencePath: string\n remoteRead: true\n remoteWrite: false\n sideEffect: 'remote-read'\n dingtalkSideEffect: false\n}\n\nexport interface MulticaWorkspaceStatus {\n $schema: 'dingtalk-agent/multica-workspace-status@1'\n workspace: string\n provider: 'multica'\n available: boolean\n inspectionId: string\n passed: boolean\n readyForApply: boolean\n providerReady: false\n evidencePath: string\n evidenceIntegrity: boolean\n stateMatched: boolean\n desiredHash: string\n observedHash: string\n diff: string[]\n failures: string[]\n remoteRead: false\n remoteWrite: false\n sideEffect: false\n dingtalkSideEffect: false\n}\n\nexport interface MulticaResourceList {\n $schema: 'dingtalk-agent/multica-workspace-resource-list@1'\n passed: boolean\n workspace: string\n provider: 'multica'\n profile: string\n inspectionId: string\n resources: MulticaResourceSummary\n failures: string[]\n calls: MulticaReadCall[]\n remoteRead: true\n remoteWrite: false\n sideEffect: 'remote-read'\n dingtalkSideEffect: false\n}\n\nexport interface MulticaReadOptions {\n execute?: boolean\n yes?: boolean\n command?: string\n env?: NodeJS.ProcessEnv\n timeoutMs?: number\n out?: string\n cliVersion?: string\n /** Internal composition hook: W4 reuses W3 readback without clobbering ready state. */\n persist?: boolean\n /** Internal composition hook for the first readback after an Agent create. */\n agentIdOverride?: string\n}\n\ninterface ResolvedMulticaTarget {\n root: string\n projectName: string\n skills: string[]\n workspace: DevelopmentWorkspaceView\n profile: string\n workspaceId: string\n runtimeId: string\n agentId: string\n blocking: string[]\n}\n\ninterface ReadResult {\n stdout: string\n stderr: string\n}\n\nclass MulticaReadFailure extends Error {\n constructor(readonly category: string) {\n super(category)\n }\n}\n\nexport function planMulticaWorkspace(\n start: string, name: string, options: MulticaReadOptions = {},\n): MulticaWorkspacePlan {\n const target = resolveMulticaTarget(\n start, name, options.env || process.env, options.cliVersion || '', options.agentIdOverride,\n )\n const state = target.workspace.state\n const expected = {\n workspaceId: target.workspaceId,\n runtimeId: target.runtimeId,\n agentId: target.agentId,\n skills: [...target.skills].sort(),\n }\n const observed = {\n workspaceId: state?.binding.remoteWorkspaceId || '',\n runtimeId: state?.binding.runtimeId || '',\n agentId: state?.binding.agentId || '',\n skillSetHash: state?.binding.observedSkillSetHash || '',\n }\n const expectedSkillSetHash = digest(stableStringify(expected.skills))\n const diff: string[] = []\n if (observed.workspaceId !== expected.workspaceId) diff.push('workspace.scope')\n if (observed.runtimeId !== expected.runtimeId) diff.push('runtime.binding')\n if (expected.agentId) {\n if (observed.agentId !== expected.agentId) diff.push('agent.binding')\n } else if (!observed.agentId) diff.push('agent.create')\n if (observed.skillSetHash !== expectedSkillSetHash) diff.push('skills.assignments')\n const operations = readOperations(target)\n const planId = `multica_plan_${digest(stableStringify({\n workspace: name,\n desiredHash: target.workspace.desiredHash,\n expected,\n observed,\n diff: [...diff].sort(),\n blocking: [...target.blocking].sort(),\n operations,\n })).slice(0, 24)}`\n return {\n $schema: 'dingtalk-agent/multica-workspace-plan@1',\n planId,\n workspace: name,\n provider: 'multica',\n profile: target.profile,\n desiredHash: target.workspace.desiredHash,\n currentState: target.workspace.status,\n expected,\n observed,\n diff: [...diff].sort(),\n blocking: [...target.blocking].sort(),\n operations,\n writes: [],\n remoteRead: false,\n remoteWrite: false,\n sideEffect: false,\n dingtalkSideEffect: false,\n }\n}\n\nexport interface MulticaWorkspaceScaffold {\n $schema: 'dingtalk-agent/workspace-scaffold@1'\n workspace: string\n provider: 'multica'\n stage: string\n profile: string\n applied: boolean\n alreadyDeclared: boolean\n manifest: string\n block: Record<string, unknown>\n envRefs: { workspaceId: string; runtimeId: string; dwsProfile: string; expectedUserId: string }\n nextSteps: string[]\n sideEffect: 'local-manifest' | false\n dingtalkSideEffect: false\n}\n\nconst SCAFFOLD_STAGES = new Set(['dev', 'test', 'staging', 'prod'])\nconst SCAFFOLD_NAME = /^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$/\n\n/**\n * Author a multica-provider Workspace entry into dingtalk-agent.json so callers never hand-copy\n * the schema. Env-referenced IDs are namespaced by Workspace name; authority is filled in and\n * `agentIdFrom` deliberately omitted (first deploy creates the Agent and saves its ID). The\n * written manifest is re-parsed to fail closed on any invalid result.\n */\nexport function scaffoldMulticaWorkspace(\n start: string,\n name: string,\n options: { stage?: string; profile?: string; apply?: boolean; cliVersion?: string } = {},\n): MulticaWorkspaceScaffold {\n const cliVersion = options.cliVersion || ''\n if (!SCAFFOLD_NAME.test(name)) throw new Error(`Workspace 名不合法: ${name}`)\n if (options.stage !== undefined && !SCAFFOLD_STAGES.has(options.stage)) {\n throw new Error(`--stage 只支持 dev/test/staging/prod,收到 ${options.stage}`)\n }\n const info = inspectAgentProject(start, cliVersion)\n const existing = info.workspaces.find((item) => item.name === name)\n if (existing && existing.provider.kind !== 'multica') {\n throw new Error(`Workspace ${name} 已声明为 ${existing.provider.kind},不能改写成 multica`)\n }\n const alreadyDeclared = Boolean(existing)\n\n let stage: string\n let profile: string\n let envRefs: { workspaceId: string; runtimeId: string; dwsProfile: string; expectedUserId: string }\n let block: Record<string, unknown>\n if (existing) {\n // Report the REAL declared config, not this call's args: a manually-authored Workspace or one\n // using non-default env names must not be misrepresented (nor its --profile/--stage silently\n // \"changed\" in the output while nothing is written).\n const stripEnv = (ref: string) => (ref.startsWith('env:') ? ref.slice(4) : ref)\n stage = existing.stage\n profile = existing.provider.profile || ''\n envRefs = {\n workspaceId: stripEnv(existing.provider.workspaceIdFrom || ''),\n runtimeId: stripEnv(existing.provider.runtimeIdFrom || ''),\n dwsProfile: stripEnv(existing.authority?.dwsProfileFrom || ''),\n expectedUserId: stripEnv(existing.authority?.expectedUserIdFrom || ''),\n }\n block = {\n stage: existing.stage,\n provider: { ...existing.provider },\n ...(existing.authority ? { authority: { ...existing.authority } } : {}),\n storage: { ...existing.storage },\n }\n } else {\n stage = options.stage || 'test'\n profile = String(options.profile || '').trim()\n if (!profile) {\n throw new Error('multica Workspace 需要 --profile <multica CLI profile>(profile 不接受 env 引用)')\n }\n // Namespace env refs by Workspace name AND a stable hash of the raw name so names differing\n // only in separators (foo-bar / foo_bar / foo.bar) never collapse to the same env variables.\n const sanitized = name.replace(/[^a-zA-Z0-9]+/g, '_').toUpperCase()\n const envPrefix = `DTA_${sanitized}_${digest(name).slice(0, 6).toUpperCase()}`\n envRefs = {\n workspaceId: `${envPrefix}_WORKSPACE_ID`,\n runtimeId: `${envPrefix}_RUNTIME_ID`,\n dwsProfile: `${envPrefix}_DWS_PROFILE`,\n expectedUserId: `${envPrefix}_EXPECTED_USER_ID`,\n }\n block = {\n stage,\n provider: {\n kind: 'multica',\n profile,\n workspaceIdFrom: `env:${envRefs.workspaceId}`,\n runtimeIdFrom: `env:${envRefs.runtimeId}`,\n },\n authority: {\n dwsProfileFrom: `env:${envRefs.dwsProfile}`,\n expectedUserIdFrom: `env:${envRefs.expectedUserId}`,\n },\n storage: {\n memory: 'local-md:MEMORY.md',\n knowledge: 'local-md:knowledge/INDEX.md',\n artifacts: `local-dir:.dingtalk-agent/artifacts/${name}`,\n },\n }\n }\n const result = (applied: boolean): MulticaWorkspaceScaffold => ({\n $schema: 'dingtalk-agent/workspace-scaffold@1',\n workspace: name,\n provider: 'multica',\n stage,\n profile,\n applied,\n alreadyDeclared,\n manifest: 'dingtalk-agent.json',\n block,\n envRefs,\n nextSteps: alreadyDeclared\n ? [\n `Workspace ${name} 已声明(未改写);以下是它当前真实的配置`,\n ...(options.profile && options.profile.trim() && options.profile.trim() !== profile\n ? [`注意:本次 --profile=${options.profile.trim()} 与已声明 profile=${profile} 不同,未生效;要改请手动编辑 dingtalk-agent.json`]\n : []),\n ...(options.stage && options.stage !== stage\n ? [`注意:本次 --stage=${options.stage} 与已声明 stage=${stage} 不同,未生效`]\n : []),\n `设置 4 个 env 后运行 dta workspace doctor ${name}`,\n `export ${envRefs.workspaceId}=<multica workspace uuid>`,\n `export ${envRefs.runtimeId}=<multica runtime uuid>`,\n `export ${envRefs.dwsProfile}=<dws profile 或 corpId>`,\n `export ${envRefs.expectedUserId}=<dws user id>`,\n ]\n : [\n applied ? '已写入 dingtalk-agent.json' : '预览(加 --yes 落盘)',\n `export ${envRefs.workspaceId}=<multica workspace uuid>`,\n `export ${envRefs.runtimeId}=<multica runtime uuid>`,\n `export ${envRefs.dwsProfile}=<dws profile 或 corpId>`,\n `export ${envRefs.expectedUserId}=<dws user id>`,\n `dta workspace doctor ${name}`,\n `dta workspace plan ${name} --json`,\n `dta workspace inspect ${name} --execute --yes --json # 代理环境先套 env -u ...PROXY`,\n `dta deploy --workspace ${name} --dry-run --json`,\n ],\n sideEffect: applied ? 'local-manifest' : false,\n dingtalkSideEffect: false,\n })\n if (alreadyDeclared || !options.apply) return result(false)\n\n const manifestPath = join(info.root, 'dingtalk-agent.json')\n if (!existsSync(manifestPath) || lstatSync(manifestPath).isSymbolicLink()) {\n throw new Error('未找到可写的 dingtalk-agent.json(或它是 symlink);无法脚手架 Workspace')\n }\n const raw = readFileSync(manifestPath, 'utf8')\n const manifest = JSON.parse(raw) as Record<string, any>\n if (!manifest.workspaces || typeof manifest.workspaces !== 'object') manifest.workspaces = {}\n if (name in manifest.workspaces) return result(false)\n manifest.workspaces[name] = block\n const stamp = `${process.pid}-${digest(raw).slice(0, 8)}`\n const staging = `${manifestPath}.tmp-${stamp}`\n writeFileSync(staging, `${JSON.stringify(manifest, null, 2)}\\n`)\n renameSync(staging, manifestPath)\n try {\n showDevelopmentWorkspace(info.root, name, cliVersion)\n } catch (error) {\n // Restore the exact original bytes atomically (staging + rename), never a partial write:\n // a kill mid-restore must not leave a truncated shared manifest.\n const restore = `${manifestPath}.restore-${stamp}`\n writeFileSync(restore, raw)\n renameSync(restore, manifestPath)\n throw error\n }\n return result(true)\n}\n\nexport function inspectMulticaWorkspace(\n start: string, name: string, options: MulticaReadOptions = {},\n): MulticaWorkspacePlan | MulticaWorkspaceInspection {\n const plan = planMulticaWorkspace(start, name, options)\n if (!options.execute) return plan\n requireReadConfirmation(options, 'workspace inspect')\n if (plan.blocking.length) {\n throw new Error(`Multica inspect 前置条件不完整: ${plan.blocking.join(', ')}`)\n }\n return executeInspection(start, name, plan, options, options.persist !== false)\n}\n\nexport function listMulticaWorkspaceResources(\n start: string, name: string, options: MulticaReadOptions = {},\n): MulticaWorkspacePlan | MulticaResourceList {\n const plan = planMulticaWorkspace(start, name, options)\n if (!options.execute) return plan\n requireReadConfirmation(options, 'workspace remote-list')\n if (plan.blocking.length) {\n throw new Error(`Multica remote-list 前置条件不完整: ${plan.blocking.join(', ')}`)\n }\n const inspection = executeInspection(start, name, plan, options, false)\n return {\n $schema: 'dingtalk-agent/multica-workspace-resource-list@1',\n passed: inspection.passed,\n workspace: inspection.workspace,\n provider: 'multica',\n profile: inspection.profile,\n inspectionId: inspection.inspectionId,\n resources: inspection.resources,\n failures: inspection.failures,\n calls: inspection.calls,\n remoteRead: true,\n remoteWrite: false,\n sideEffect: 'remote-read',\n dingtalkSideEffect: false,\n }\n}\n\nexport function statusMulticaWorkspace(\n start: string, name: string, cliVersion = '',\n): MulticaWorkspaceStatus {\n const info = inspectAgentProject(start, cliVersion)\n const workspace = requireMulticaWorkspace(info.root, name, cliVersion)\n const latestPath = latestPointerPath(info.root, name)\n if (!existsSync(latestPath)) return emptyStatus(workspace)\n const pointer = readJsonObject(latestPath, 'Multica inspection latest pointer')\n if (pointer.$schema !== 'dingtalk-agent/multica-inspection-pointer@1') {\n throw new Error('Multica inspection latest pointer schema 非法')\n }\n const evidencePath = stringField(pointer.evidencePath, 'pointer.evidencePath')\n const reportPath = safeProjectPath(info.root, evidencePath, true)\n const reportSource = readFileSync(reportPath, 'utf8')\n const evidenceIntegrity = sha256(reportSource) === stringField(pointer.reportHash, 'pointer.reportHash')\n const report = JSON.parse(reportSource) as MulticaWorkspaceInspection\n if (report.$schema !== 'dingtalk-agent/multica-workspace-inspection@1' || report.workspace !== name) {\n throw new Error('Multica inspection report 与 Workspace 不匹配')\n }\n assertRedacted(report)\n const state = workspace.state\n const stateMatched = Boolean(evidenceIntegrity && report.passed && state &&\n state.provider === 'multica' && ['verifying', 'ready'].includes(state.status) &&\n state.desiredHash === workspace.desiredHash && state.observedHash === report.observedHash &&\n state.binding.inspectionId === report.inspectionId &&\n state.binding.evidencePath === evidencePath)\n return {\n $schema: 'dingtalk-agent/multica-workspace-status@1',\n workspace: name,\n provider: 'multica',\n available: true,\n inspectionId: report.inspectionId,\n passed: report.passed,\n readyForApply: report.readyForApply && stateMatched,\n providerReady: false,\n evidencePath,\n evidenceIntegrity,\n stateMatched,\n desiredHash: workspace.desiredHash,\n observedHash: report.observedHash,\n diff: [...report.diff],\n failures: [...report.failures],\n remoteRead: false,\n remoteWrite: false,\n sideEffect: false,\n dingtalkSideEffect: false,\n }\n}\n\nfunction executeInspection(\n start: string,\n name: string,\n plan: MulticaWorkspacePlan,\n options: MulticaReadOptions,\n persist: boolean,\n): MulticaWorkspaceInspection {\n const env = options.env || process.env\n const target = resolveMulticaTarget(\n start, name, env, options.cliVersion || '', options.agentIdOverride,\n )\n const command = options.command || env.DTA_MULTICA_BIN || 'multica'\n const timeoutMs = positiveTimeout(options.timeoutMs)\n if (persist) {\n const plannedEvidence = options.out || join(\n MULTICA_EVIDENCE_ROOT, safeName(name), 'multica-inspections', 'planned.json',\n )\n safeProjectPath(target.root, plannedEvidence, false)\n latestPointerPath(target.root, name)\n safeProjectPath(target.root, join(WORKSPACE_STATE_ROOT, `${name}.json`), false)\n }\n const calls: MulticaReadCall[] = []\n const failures: string[] = []\n const diff: string[] = []\n let cliVersion = ''\n let principalHash = ''\n let serverHash = ''\n let resources = emptyResources()\n\n try {\n const version = runRead(command, ['--version'], 'cli.version', target.root, env, timeoutMs, calls)\n cliVersion = parseMulticaVersion(version.stdout || version.stderr)\n\n const config = runRead(command, profileArgs(target, ['config', 'show']),\n 'profile.config', target.root, env, timeoutMs, calls)\n const parsedConfig = parseConfig(config.stdout, target.profile)\n serverHash = parsedConfig.server ? digest(parsedConfig.server) : ''\n if (parsedConfig.workspaceId && parsedConfig.workspaceId !== target.workspaceId) {\n throw new MulticaReadFailure('scope.profile-workspace-mismatch')\n }\n\n const auth = runRead(command, profileArgs(target, ['auth', 'status']),\n 'auth.status', target.root, env, timeoutMs, calls)\n const principal = parseAuth(auth.stdout + '\\n' + auth.stderr)\n if (!principal) throw new MulticaReadFailure('auth.not-authenticated')\n principalHash = digest(principal)\n\n const workspaceList = jsonArray(runRead(command,\n profileArgs(target, ['workspace', 'list', '--output', 'json']),\n 'workspace.list', target.root, env, timeoutMs, calls).stdout, 'workspace list')\n const workspaceMatches = workspaceList.filter((item) => idOf(item) === target.workspaceId)\n if (workspaceMatches.length !== 1) throw new MulticaReadFailure('scope.workspace-list-mismatch')\n\n const workspaceGet = jsonObject(runRead(command,\n profileArgs(target, ['workspace', 'get', target.workspaceId, '--output', 'json']),\n 'workspace.get', target.root, env, timeoutMs, calls).stdout, 'workspace get')\n if (idOf(workspaceGet) !== target.workspaceId) {\n throw new MulticaReadFailure('scope.workspace-get-mismatch')\n }\n resources.workspace = {\n id: resourceId(idOf(workspaceGet), 'workspace.id'),\n name: safeDisplay(workspaceGet.name),\n slug: safeDisplay(workspaceGet.slug),\n }\n\n const runtimes = jsonArray(runRead(command,\n scopedArgs(target, ['runtime', 'list', '--output', 'json']),\n 'runtime.list', target.root, env, timeoutMs, calls).stdout, 'runtime list')\n const runtimeMatches = runtimes.filter((item) => idOf(item) === target.runtimeId)\n if (runtimeMatches.length !== 1) throw new MulticaReadFailure('scope.runtime-mismatch')\n const runtime = runtimeMatches[0]\n const runtimeWorkspace = optionalField(runtime.workspace_id)\n if (runtimeWorkspace && runtimeWorkspace !== target.workspaceId) {\n throw new MulticaReadFailure('scope.runtime-workspace-mismatch')\n }\n resources.runtime = {\n id: resourceId(idOf(runtime), 'runtime.id'),\n workspaceId: runtimeWorkspace || target.workspaceId,\n name: safeDisplay(runtime.name),\n provider: safeDisplay(runtime.provider),\n status: safeDisplay(runtime.status),\n }\n\n const agents = jsonArray(runRead(command,\n scopedArgs(target, ['agent', 'list', '--include-archived', '--output', 'json']),\n 'agent.list', target.root, env, timeoutMs, calls).stdout, 'agent list')\n resources.agentCandidates = agents\n .filter((item) => optionalField(item.name) === target.projectName)\n .map((item) => ({\n id: resourceId(idOf(item), 'agent candidate.id'),\n name: safeDisplay(item.name),\n archived: Boolean(optionalField(item.archived_at)),\n }))\n .sort((a, b) => a.id.localeCompare(b.id))\n\n const catalog = jsonArray(runRead(command,\n scopedArgs(target, ['skill', 'list', '--output', 'json']),\n 'skill.list', target.root, env, timeoutMs, calls).stdout, 'skill list')\n resources.catalogSkills = catalog.map((item) => ({\n id: resourceId(idOf(item), 'skill.id'),\n workspaceId: optionalField(item.workspace_id) || target.workspaceId,\n name: safeDisplay(item.name),\n })).sort(compareNamedResource)\n if (resources.catalogSkills.some((item) => item.workspaceId !== target.workspaceId)) {\n throw new MulticaReadFailure('scope.skill-workspace-mismatch')\n }\n\n if (target.agentId) {\n const agentMatches = agents.filter((item) => idOf(item) === target.agentId)\n if (agentMatches.length !== 1) throw new MulticaReadFailure('scope.agent-list-mismatch')\n const agent = jsonObject(runRead(command,\n scopedArgs(target, ['agent', 'get', target.agentId, '--output', 'json']),\n 'agent.get', target.root, env, timeoutMs, calls).stdout, 'agent get')\n const agentWorkspace = optionalField(agent.workspace_id)\n const agentRuntime = optionalField(agent.runtime_id)\n if (idOf(agent) !== target.agentId || agentWorkspace !== target.workspaceId ||\n agentRuntime !== target.runtimeId) {\n throw new MulticaReadFailure('scope.agent-binding-mismatch')\n }\n resources.agent = {\n id: target.agentId,\n workspaceId: agentWorkspace,\n runtimeId: agentRuntime,\n name: safeDisplay(agent.name),\n status: safeDisplay(agent.status),\n archived: Boolean(optionalField(agent.archived_at)),\n }\n const assigned = jsonArray(runRead(command,\n scopedArgs(target, ['agent', 'skills', 'list', target.agentId, '--output', 'json']),\n 'agent.skills', target.root, env, timeoutMs, calls).stdout, 'agent skills list')\n resources.assignedSkills = assigned.map((item) => ({\n id: resourceId(idOf(item), 'assigned skill.id'),\n name: safeDisplay(item.name),\n enabled: item.enabled === undefined ? true : Boolean(item.enabled),\n })).sort(compareNamedResource)\n } else if (resources.agentCandidates.length > 0) {\n throw new MulticaReadFailure('agent.unbound-name-candidates')\n } else {\n diff.push('agent.create')\n }\n\n for (const name of target.skills) {\n const candidates = resources.catalogSkills.filter((item) => item.name === name)\n if (candidates.length > 1) throw new MulticaReadFailure(`skills.duplicate:${name}`)\n if (candidates.length === 0) {\n diff.push(`skill.create:${name}`)\n continue\n }\n if (target.agentId && !resources.assignedSkills.some((item) =>\n item.id === candidates[0].id && item.enabled)) {\n diff.push(`skill.assign:${name}`)\n }\n }\n } catch (error) {\n failures.push(error instanceof MulticaReadFailure ? error.category : 'provider.read-failed')\n }\n\n const canonical = {\n cliVersion,\n profile: target.profile,\n principalHash,\n serverHash,\n expected: plan.expected,\n resources,\n }\n const observedHash = digest(stableStringify(canonical))\n const passed = failures.length === 0\n const inspectionId = `multica_inspect_${digest(stableStringify({\n desiredHash: target.workspace.desiredHash,\n observedHash,\n passed,\n diff: [...diff].sort(),\n failures,\n })).slice(0, 24)}`\n const defaultEvidencePath = join(\n MULTICA_EVIDENCE_ROOT, safeName(name), 'multica-inspections', `${inspectionId}.json`,\n )\n const evidencePath = options.out\n ? relative(target.root, safeProjectPath(target.root, options.out, false))\n : defaultEvidencePath\n const report: MulticaWorkspaceInspection = {\n $schema: 'dingtalk-agent/multica-workspace-inspection@1',\n passed,\n readyForApply: passed,\n providerReady: false,\n inspectionId,\n workspace: name,\n provider: 'multica',\n profile: target.profile,\n cliVersion,\n desiredHash: target.workspace.desiredHash,\n observedHash,\n expected: plan.expected,\n auth: { authenticated: Boolean(principalHash), principalHash, serverHash },\n resources,\n diff: [...diff].sort(),\n failures: [...failures].sort(),\n calls,\n evidencePath,\n remoteRead: true,\n remoteWrite: false,\n sideEffect: 'remote-read',\n dingtalkSideEffect: false,\n }\n assertRedacted(report)\n if (persist) persistInspection(target, plan, report)\n return report\n}\n\nfunction persistInspection(\n target: ResolvedMulticaTarget,\n plan: MulticaWorkspacePlan,\n report: MulticaWorkspaceInspection,\n): void {\n const reportPath = safeProjectPath(target.root, report.evidencePath, false)\n atomicJson(reportPath, report)\n const reportSource = readFileSync(reportPath, 'utf8')\n const pointer = {\n $schema: 'dingtalk-agent/multica-inspection-pointer@1',\n inspectionId: report.inspectionId,\n evidencePath: report.evidencePath,\n reportHash: sha256(reportSource),\n }\n atomicJson(latestPointerPath(target.root, target.workspace.name), pointer)\n if (!report.passed) return\n const expectedSkillSetHash = digest(stableStringify([...target.skills].sort()))\n const observedSkillSetHash = digest(stableStringify(report.resources.assignedSkills\n .filter((item) => item.enabled).map((item) => item.name).sort()))\n const state: DevelopmentWorkspaceState = {\n $schema: 'dingtalk-agent/workspace-state@1',\n workspace: target.workspace.name,\n provider: 'multica',\n status: 'verifying',\n binding: {\n profile: target.profile,\n remoteWorkspaceId: target.workspaceId,\n runtimeId: target.runtimeId,\n agentId: target.agentId,\n cliVersion: report.cliVersion,\n principalHash: report.auth.principalHash,\n serverHash: report.auth.serverHash,\n inspectionId: report.inspectionId,\n evidencePath: report.evidencePath,\n sourceHash: target.workspace.sourceHash,\n expectedSkillSetHash,\n observedSkillSetHash,\n },\n desiredHash: target.workspace.desiredHash,\n observedHash: report.observedHash,\n lastPlanId: plan.planId,\n lastReceiptId: '',\n lastEvalId: '',\n }\n atomicJson(safeProjectPath(\n target.root, join(WORKSPACE_STATE_ROOT, `${target.workspace.name}.json`), false,\n ), state)\n}\n\nfunction resolveMulticaTarget(\n start: string, name: string, env: NodeJS.ProcessEnv, cliVersion: string,\n agentIdOverride = '',\n): ResolvedMulticaTarget {\n const info = inspectAgentProject(start, cliVersion)\n const workspace = requireMulticaWorkspace(info.root, name, cliVersion)\n const provider = workspace.provider\n const blocking: string[] = []\n const resolveRef = (ref: string, label: string, optional = false): string => {\n if (!ref) return ''\n const variable = ref.startsWith('env:') ? ref.slice(4) : ''\n const value = variable ? String(env[variable] || '').trim() : ''\n if (!value) {\n if (!optional) blocking.push(label)\n return ''\n }\n try { return resourceId(value, label) } catch { blocking.push(`${label}.invalid`); return '' }\n }\n const workspaceId = resolveRef(provider.workspaceIdFrom, 'workspace-id')\n const runtimeId = resolveRef(provider.runtimeIdFrom, 'runtime-id')\n let agentId = ''\n if (agentIdOverride) {\n try { agentId = resourceId(agentIdOverride, 'agent-id-override') }\n catch { blocking.push('agent-id-override.invalid') }\n } else if (provider.agentIdFrom) {\n // A declared-but-empty agentIdFrom means \"not yet bound\" on a workspace whose Agent\n // has not been created. Treat it like an omitted agentIdFrom (createable, no blocker):\n // the deploy W4 create path saves the real ID to state, and the run/retire paths add\n // their own `agent-id.missing` blocker. A malformed (non-empty, invalid) value still blocks.\n agentId = resolveRef(provider.agentIdFrom, 'agent-id', true)\n }\n else if (workspace.state?.binding.agentId) {\n try { agentId = resourceId(workspace.state.binding.agentId, 'state.agent-id') }\n catch { blocking.push('state.agent-id.invalid') }\n }\n return {\n root: info.root,\n projectName: info.project.displayName,\n skills: [...new Set(info.project.skills)].sort(),\n workspace,\n profile: provider.profile,\n workspaceId,\n runtimeId,\n agentId,\n blocking,\n }\n}\n\nfunction requireMulticaWorkspace(start: string, name: string, cliVersion: string): DevelopmentWorkspaceView {\n const workspace = showDevelopmentWorkspace(start, name, cliVersion)\n if (workspace.provider.kind !== 'multica' || workspace.legacy) {\n throw new Error(`Workspace ${name} 不是 multica Provider;W3 不执行 ${workspace.provider.kind}`)\n }\n return workspace\n}\n\nfunction readOperations(target: ResolvedMulticaTarget): Array<{ id: string; argv: string[] }> {\n const operations = [\n { id: 'cli.version', argv: ['--version'] },\n { id: 'profile.config', argv: profileArgs(target, ['config', 'show']) },\n { id: 'auth.status', argv: profileArgs(target, ['auth', 'status']) },\n { id: 'workspace.list', argv: profileArgs(target, ['workspace', 'list', '--output', 'json']) },\n { id: 'workspace.get', argv: profileArgs(target,\n ['workspace', 'get', target.workspaceId || '<workspace-id>', '--output', 'json']) },\n { id: 'runtime.list', argv: scopedArgs(target, ['runtime', 'list', '--output', 'json']) },\n { id: 'agent.list', argv: scopedArgs(target,\n ['agent', 'list', '--include-archived', '--output', 'json']) },\n { id: 'skill.list', argv: scopedArgs(target, ['skill', 'list', '--output', 'json']) },\n ]\n if (target.agentId) operations.push(\n { id: 'agent.get', argv: scopedArgs(target,\n ['agent', 'get', target.agentId, '--output', 'json']) },\n { id: 'agent.skills', argv: scopedArgs(target,\n ['agent', 'skills', 'list', target.agentId, '--output', 'json']) },\n )\n return operations\n}\n\nfunction profileArgs(target: ResolvedMulticaTarget, args: string[]): string[] {\n return ['--profile', target.profile, ...args]\n}\n\nfunction scopedArgs(target: ResolvedMulticaTarget, args: string[]): string[] {\n return ['--profile', target.profile, '--workspace-id', target.workspaceId || '<workspace-id>', ...args]\n}\n\nfunction runRead(\n command: string,\n argv: string[],\n id: string,\n cwd: string,\n env: NodeJS.ProcessEnv,\n timeoutMs: number,\n calls: MulticaReadCall[],\n): ReadResult {\n const run = spawnSync(command, argv, {\n cwd,\n env,\n encoding: 'utf8',\n timeout: timeoutMs,\n maxBuffer: 16 * 1024 * 1024,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n const stdout = String(run.stdout || '')\n const stderr = String(run.stderr || '')\n const exitCode = typeof run.status === 'number' ? run.status : 1\n const passed = !run.error && exitCode === 0\n calls.push({\n id,\n argv: argv.map(safeArg),\n exitCode,\n stdoutHash: sha256(stdout),\n stderrHash: sha256(stderr),\n passed,\n })\n if (!passed) throw new MulticaReadFailure(`command.${id}`)\n return { stdout, stderr }\n}\n\nfunction parseMulticaVersion(value: string): string {\n const match = value.match(/\\bmultica\\s+([0-9]+\\.[0-9]+\\.[0-9]+(?:[-+][A-Za-z0-9.-]+)?)/i)\n if (!match) throw new MulticaReadFailure('cli.version-invalid')\n return match[1]\n}\n\nfunction parseConfig(value: string, profile: string): { server: string; workspaceId: string } {\n const fields = new Map<string, string>()\n for (const line of value.split(/\\r?\\n/)) {\n const match = line.match(/^([^:]+):\\s*(.*)$/)\n if (match) fields.set(match[1].trim().toLowerCase(), match[2].trim())\n }\n if ((fields.get('profile') || '') !== profile) throw new MulticaReadFailure('profile.mismatch')\n const normalize = (item: string | undefined): string => item && item !== '(not set)' ? item : ''\n return {\n server: normalize(fields.get('server_url')),\n workspaceId: normalize(fields.get('workspace_id')),\n }\n}\n\nfunction parseAuth(value: string): string {\n if (/not authenticated|invalid or expired/i.test(value)) return ''\n const user = value.split(/\\r?\\n/).find((line) => /^User:\\s+/i.test(line.trim())) || ''\n const server = value.split(/\\r?\\n/).find((line) => /^Server:\\s+/i.test(line.trim())) || ''\n const token = value.split(/\\r?\\n/).find((line) => /^Token:\\s+/i.test(line.trim())) || ''\n return user && server && token ? `${user.trim()}|${server.trim()}` : ''\n}\n\nfunction jsonArray(value: string, label: string): Record<string, unknown>[] {\n let parsed: unknown\n try { parsed = JSON.parse(value) } catch { throw new MulticaReadFailure(`json.${label}`) }\n if (!Array.isArray(parsed) || parsed.some((item) => !item || typeof item !== 'object' || Array.isArray(item))) {\n throw new MulticaReadFailure(`shape.${label}`)\n }\n return parsed as Record<string, unknown>[]\n}\n\nfunction jsonObject(value: string, label: string): Record<string, unknown> {\n let parsed: unknown\n try { parsed = JSON.parse(value) } catch { throw new MulticaReadFailure(`json.${label}`) }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new MulticaReadFailure(`shape.${label}`)\n }\n return parsed as Record<string, unknown>\n}\n\nfunction readJsonObject(path: string, label: string): Record<string, unknown> {\n if (lstatSync(path).isSymbolicLink()) throw new Error(`${label} 不能是符号链接`)\n return jsonObject(readFileSync(path, 'utf8'), label)\n}\n\nfunction idOf(value: Record<string, unknown>): string {\n return optionalField(value.id)\n}\n\nfunction stringField(value: unknown, label: string): string {\n if (typeof value !== 'string' || !value) throw new Error(`${label} 必须是非空字符串`)\n return value\n}\n\nfunction optionalField(value: unknown): string {\n return typeof value === 'string' ? value : ''\n}\n\nfunction resourceId(value: string, label: string): string {\n if (!/^[A-Za-z0-9][A-Za-z0-9._:-]{1,127}$/.test(value) ||\n /^(?:mul_|mcn_|sk-|bearer)/i.test(value)) {\n throw new Error(`${label} 不是安全的稳定资源 ID`)\n }\n return value\n}\n\nfunction safeDisplay(value: unknown): string {\n const text = typeof value === 'string' ? value : ''\n if (!text) return ''\n if (/(?:mul_|mcn_|sk-[A-Za-z0-9]|bearer\\s|access[_-]?token|client[_-]?secret|password)/i.test(text)) {\n return `[redacted:${digest(text).slice(0, 12)}]`\n }\n return text.length > 160 ? `${text.slice(0, 157)}...` : text\n}\n\nfunction safeArg(value: string): string {\n return safeDisplay(value)\n}\n\nfunction compareNamedResource(\n a: { name: string; id: string }, b: { name: string; id: string },\n): number {\n return a.name.localeCompare(b.name) || a.id.localeCompare(b.id)\n}\n\nfunction emptyResources(): MulticaResourceSummary {\n return {\n workspace: null,\n runtime: null,\n agent: null,\n agentCandidates: [],\n catalogSkills: [],\n assignedSkills: [],\n }\n}\n\nfunction emptyStatus(workspace: DevelopmentWorkspaceView): MulticaWorkspaceStatus {\n return {\n $schema: 'dingtalk-agent/multica-workspace-status@1',\n workspace: workspace.name,\n provider: 'multica',\n available: false,\n inspectionId: '',\n passed: false,\n readyForApply: false,\n providerReady: false,\n evidencePath: '',\n evidenceIntegrity: false,\n stateMatched: false,\n desiredHash: workspace.desiredHash,\n observedHash: workspace.observedHash,\n diff: [],\n failures: ['inspection.missing'],\n remoteRead: false,\n remoteWrite: false,\n sideEffect: false,\n dingtalkSideEffect: false,\n }\n}\n\nfunction latestPointerPath(root: string, name: string): string {\n return safeProjectPath(root, join(\n MULTICA_EVIDENCE_ROOT, safeName(name), 'multica-inspections', 'latest.json',\n ), false)\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 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(`Multica Provider 路径必须位于 Project 内: ${ref}`)\n }\n if (mustExist && !existsSync(candidate)) throw new Error(`Multica evidence 不存在: ${ref}`)\n if (existsSync(candidate)) {\n if (lstatSync(candidate).isSymbolicLink()) {\n throw new Error(`Multica Provider 路径不能是符号链接: ${ref}`)\n }\n if (!isInside(rootReal, realpathSync(candidate))) {\n throw new Error(`Multica Provider 真实路径越出 Project: ${ref}`)\n }\n }\n let ancestor = dirname(candidate)\n while (!existsSync(ancestor)) {\n const parent = dirname(ancestor)\n if (parent === ancestor) break\n ancestor = parent\n }\n if (!existsSync(ancestor) || !isInside(rootReal, realpathSync(ancestor))) {\n throw new Error(`Multica Provider 父目录真实路径越出 Project: ${ref}`)\n }\n return candidate\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\nfunction atomicJson(path: string, value: unknown): void {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.tmp-${process.pid}`\n const source = `${JSON.stringify(value, null, 2)}\\n`\n writeFileSync(temp, source, { mode: 0o600 })\n renameSync(temp, path)\n if (readFileSync(path, 'utf8') !== source) throw new Error(`原子写后回读不一致: ${path}`)\n}\n\nfunction assertRedacted(value: unknown): void {\n const source = JSON.stringify(value)\n if (/(?:mul_|mcn_|sk-[A-Za-z0-9]|bearer\\s|access[_-]?token|client[_-]?secret|password)/i.test(source)) {\n throw new Error('Multica inspection 脱敏失败:检测到疑似凭据')\n }\n}\n\nfunction positiveTimeout(value: number | undefined): number {\n if (value === undefined) return 30_000\n if (!Number.isFinite(value) || value < 100 || value > 300_000) {\n throw new Error('Multica read timeout 必须在 100..300000 ms')\n }\n return Math.floor(value)\n}\n\nfunction requireReadConfirmation(options: MulticaReadOptions, command: string): void {\n if (!options.execute || !options.yes) {\n throw new Error(`${command} 会读取当前 Multica 身份和远端 scope;必须同时传 --execute --yes`)\n }\n}\n\nfunction sha256(value: string | Buffer): string {\n return createHash('sha256').update(value).digest('hex')\n}\n"]}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Schedule reconcile plan — dta's half of the driving contract.
3
+ *
4
+ * dta owns: read the declared schedules (dingtalk-agent.json#schedules), validate
5
+ * them, and map them to a provider-specific reconcile plan. dta does NOT fire or
6
+ * live-write triggers — that stays with the platform ops path (see ARCHITECTURE
7
+ * §3.1, "触发器不属于 dingtalk-agent 核心执行"). The plan is the authoritative,
8
+ * provider-mapped desired state the ops skill reconciles against live.
9
+ *
10
+ * Pure: no network, no side effects — safe to run in CI and fully testable.
11
+ */
12
+ import { inspectAgentProject } from './development-workspace.js';
13
+ // ephemeral = run-only (no work item); work-item = one work item per fire.
14
+ const MULTICA_MODE = {
15
+ ephemeral: 'run_only',
16
+ 'work-item': 'create_issue',
17
+ };
18
+ function shellQuote(value) {
19
+ return `"${value.replace(/(["\\$`])/g, '\\$1')}"`;
20
+ }
21
+ function envVar(ref) {
22
+ // "env:MULTICA_FDE_AGENT_ID" -> "$MULTICA_FDE_AGENT_ID"
23
+ return ref.startsWith('env:') ? `$${ref.slice(4)}` : ref;
24
+ }
25
+ function multicaApplyCommand(schedule, profile, agentIdFrom) {
26
+ const parts = [
27
+ 'python3 "$MULTICA_EXT" autopilot-create',
28
+ `--profile ${profile}`,
29
+ `--agent ${envVar(agentIdFrom)}`,
30
+ `--title ${shellQuote(schedule.name)}`,
31
+ `--mode ${MULTICA_MODE[schedule.mode]}`,
32
+ `--cron ${shellQuote(schedule.cron)}`,
33
+ `--timezone ${schedule.timezone}`,
34
+ `--description ${shellQuote(schedule.wake || schedule.name)}`,
35
+ ];
36
+ return parts.join(' ');
37
+ }
38
+ /**
39
+ * Build the reconcile plan for one workspace's provider. Returns supported:false
40
+ * (with a reason) when the target platform does not offer schedules yet — the
41
+ * declared rhythms are then a recorded gap, never a silent downgrade.
42
+ */
43
+ export function buildSchedulePlan(info, workspaceName) {
44
+ const workspace = info.workspaces.find((item) => item.name === workspaceName);
45
+ if (!workspace)
46
+ throw new Error(`Project 未声明 Workspace: ${workspaceName}`);
47
+ const declared = info.project.schedules;
48
+ const provider = workspace.provider.kind;
49
+ if (provider === 'multica') {
50
+ const profile = workspace.provider.profile || '';
51
+ const agentIdFrom = workspace.provider.agentIdFrom || '';
52
+ if (!profile || !agentIdFrom) {
53
+ throw new Error(`Workspace ${workspaceName} 的 multica provider 缺 profile/agentIdFrom`);
54
+ }
55
+ const schedules = declared.map((schedule) => ({
56
+ ...schedule,
57
+ applyCommand: multicaApplyCommand(schedule, profile, agentIdFrom),
58
+ }));
59
+ return {
60
+ $schema: 'dingtalk-agent/schedule-plan@1',
61
+ workspace: workspaceName, provider, supported: true, count: schedules.length, schedules,
62
+ reconcile: '由 multica-external 技能执行:先 autopilot-list 读线上,按 title 匹配,' +
63
+ '只建缺的、改漂移的、删多余的;$MULTICA_EXT 指向 multica_ext.py,$…_AGENT_ID 由受信环境注入。' +
64
+ 'autopilot-create 非幂等,务必先 list 再建,别盲建(会造重复→重复外发)。',
65
+ sideEffect: false, dingtalkSideEffect: false,
66
+ };
67
+ }
68
+ // opencode / local dev / not-yet-supported platforms: no schedule capability.
69
+ const reason = provider === 'opencode'
70
+ ? 'opencode 是本地开发运行时,不承载常驻节律;节律需部署到托管平台'
71
+ : `provider ${provider} 尚未提供 schedule 能力`;
72
+ return {
73
+ $schema: 'dingtalk-agent/schedule-plan@1',
74
+ workspace: workspaceName, provider, supported: false, reason,
75
+ count: declared.length, schedules: [],
76
+ reconcile: `记为缺口:声明了 ${declared.length} 条节律,但目标 provider 不支持——` +
77
+ '别静默降级成"那就不定时了"。',
78
+ sideEffect: false, dingtalkSideEffect: false,
79
+ };
80
+ }
81
+ /**
82
+ * Declared schedules + the one platform-independent invariant dta can check
83
+ * statically: ticks must not share a minute. Outward-effect ticks have no lock on
84
+ * their delivery receipt, so two firing in the same minute double-send to third
85
+ * parties. Reports any minute field claimed by more than one schedule.
86
+ */
87
+ export function buildScheduleShow(start, cliVersion = '') {
88
+ const info = inspectAgentProject(start, cliVersion);
89
+ const declared = info.project.schedules;
90
+ const seen = new Map();
91
+ for (const schedule of declared) {
92
+ const minute = schedule.cron.trim().split(/\s+/)[0];
93
+ seen.set(minute, (seen.get(minute) || 0) + 1);
94
+ }
95
+ const collidingMinutes = [...seen.entries()].filter(([, n]) => n > 1).map(([m]) => m);
96
+ return {
97
+ $schema: 'dingtalk-agent/schedule-show@1',
98
+ count: declared.length,
99
+ schedules: declared,
100
+ minutesDistinct: collidingMinutes.length === 0,
101
+ collidingMinutes,
102
+ sideEffect: false, dingtalkSideEffect: false,
103
+ };
104
+ }
105
+ //# sourceMappingURL=schedule-plan.js.map