@xdxer/dingtalk-agent 0.1.4-beta.16 → 0.1.4-beta.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +42 -0
- package/README.en.md +1 -0
- package/README.md +1 -0
- package/dist/bin/dingtalk-agent.js +15 -8
- package/dist/bin/dingtalk-agent.js.map +1 -1
- package/dist/src/agent-audit.js +12 -5
- package/dist/src/agent-audit.js.map +1 -1
- package/dist/src/development-workspace.js +17 -3
- package/dist/src/development-workspace.js.map +1 -1
- package/dist/src/doctor.js +41 -6
- package/dist/src/doctor.js.map +1 -1
- package/dist/src/map.js +157 -0
- package/dist/src/map.js.map +1 -0
- package/dist/src/multica-deploy.js +76 -19
- package/dist/src/multica-deploy.js.map +1 -1
- package/dist/src/multica-provider.js +1 -1
- package/dist/src/multica-provider.js.map +1 -1
- package/dist/src/skill-manager.js +98 -10
- package/dist/src/skill-manager.js.map +1 -1
- package/dist/src/upgrade.js +23 -27
- package/dist/src/upgrade.js.map +1 -1
- package/dist/src/version.js +73 -0
- package/dist/src/version.js.map +1 -0
- package/docs/schemas/project.schema.json +1 -0
- package/lab/agent-eval/catalog.json +5 -5
- package/lab/agent-eval/classic-failures.json +2 -2
- package/lab/project-workspace/fake-multica-provider.mjs +17 -6
- package/lab/project-workspace/opencode-provider-suite.json +1 -1
- package/lab/schemas/agent-eval-catalog.schema.json +1 -1
- package/package.json +3 -2
- package/skills/core/dingtalk-agent-compose/SKILL.md +6 -3
- package/skills/core/dingtalk-agent-compose/evals/evals.json +11 -0
- package/skills/core/dingtalk-agent-eval/SKILL.md +30 -6
- package/skills/core/dingtalk-agent-eval/assets/eval-catalog.template.json +1 -1
- package/skills/core/dingtalk-agent-eval/evals/evals.json +22 -0
- package/skills/core/dingtalk-agent-eval/references/eval-topology.md +14 -0
- package/skills/core/dingtalk-agent-eval/references/evidence-contract.md +21 -0
- package/skills/core/dingtalk-agent-eval/references/failure-to-case.md +35 -0
- package/skills/core/dingtalk-agent-eval/references/interactive-debug-channels.md +93 -0
- package/skills/core/dingtalk-agent-eval/references/local-connector-smoke.md +75 -0
- package/skills/platforms/multica-dingtalk/PLATFORM.md +4 -2
- package/skills/platforms/multica-dingtalk/dingtalk-agent-boot-multica/SKILL.md +4 -4
- package/skills/platforms/multica-dingtalk/multica-external/SKILL.md +2 -0
|
@@ -420,7 +420,7 @@ function resolveMulticaTarget(start, name, env, cliVersion, agentIdOverride = ''
|
|
|
420
420
|
}
|
|
421
421
|
return {
|
|
422
422
|
root: info.root,
|
|
423
|
-
projectName: info.project.
|
|
423
|
+
projectName: info.project.displayName,
|
|
424
424
|
skills: [...new Set([...info.project.skills, MULTICA_BOOT_SKILL])].sort(),
|
|
425
425
|
workspace,
|
|
426
426
|
profile: provider.profile,
|
|
@@ -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'\nexport const MULTICA_BOOT_SKILL = 'dingtalk-agent-boot-multica'\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.name,\n skills: [...new Set([...info.project.skills, MULTICA_BOOT_SKILL])].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'\nexport const MULTICA_BOOT_SKILL = 'dingtalk-agent-boot-multica'\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, MULTICA_BOOT_SKILL])].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,14 +1,18 @@
|
|
|
1
1
|
// Skill 安装生命周期由开放生态的 `npx skills` 负责。
|
|
2
2
|
// dingtalk-agent 只做两件事:把内置 Skill 目录交给上游 CLI;只读验证客户端能否发现。
|
|
3
|
-
// 默认(不指定 name)对全部内置 Skill 生效:基础行为 + Agent
|
|
4
|
-
import { existsSync, lstatSync, readFileSync, readlinkSync } from 'node:fs';
|
|
3
|
+
// 默认(不指定 name)对全部内置 Skill 生效:基础行为 + Agent 装配 + 交付后评测;指定 name 时只操作该 Skill。
|
|
4
|
+
import { existsSync, lstatSync, readdirSync, readFileSync, readlinkSync } from 'node:fs';
|
|
5
5
|
import { homedir } from 'node:os';
|
|
6
6
|
import { dirname, join, resolve } from 'node:path';
|
|
7
7
|
import { spawnSync } from 'node:child_process';
|
|
8
|
+
import { createHash } from 'node:crypto';
|
|
9
|
+
import { cleanVersion, compareVersions, isValidVersion } from './version.js';
|
|
8
10
|
export const GLOBAL_SKILL_NAME = 'dingtalk-basic-behavior';
|
|
9
11
|
// 默认套装:所有机器都装的通用 Skill。平台 Skill(deploy/boot-multica 等)不在默认套装内,
|
|
10
12
|
// 只有工作区通过 `dta agent-platform use` 选择对应 managed agent platform 时才按名安装。
|
|
11
|
-
export const BUNDLED_SKILL_NAMES = [
|
|
13
|
+
export const BUNDLED_SKILL_NAMES = [
|
|
14
|
+
GLOBAL_SKILL_NAME, 'dingtalk-agent-compose', 'dingtalk-agent-eval',
|
|
15
|
+
];
|
|
12
16
|
export const INSTALLABLE_SKILL_NAMES = [
|
|
13
17
|
...BUNDLED_SKILL_NAMES,
|
|
14
18
|
'dingtalk-agent-deploy-multica', 'dingtalk-agent-boot-multica', 'multica-external',
|
|
@@ -55,9 +59,15 @@ export function skillStatus(packageRoot, options = {}) {
|
|
|
55
59
|
const paths = globalPaths(packageRoot, options.home, name);
|
|
56
60
|
const bundled = bundledInfo(packageRoot, name);
|
|
57
61
|
const canonicalExists = isDirectory(paths.canonical);
|
|
58
|
-
const installedVersion = canonicalExists
|
|
59
|
-
|
|
60
|
-
|
|
62
|
+
const installedVersion = canonicalExists ? readInstalledVersion(paths.canonical) : '';
|
|
63
|
+
const installedHash = canonicalExists ? skillContentHash(paths.canonical) : '';
|
|
64
|
+
const drift = driftOf({
|
|
65
|
+
exists: canonicalExists,
|
|
66
|
+
installedVersion,
|
|
67
|
+
installedHash,
|
|
68
|
+
bundledVersion: bundled.skillVersion,
|
|
69
|
+
bundledHash: bundled.contentHash,
|
|
70
|
+
});
|
|
61
71
|
const claude = inspectExposure(paths.claude, paths.canonical);
|
|
62
72
|
const sharedState = canonicalExists ? 'ok' : 'missing';
|
|
63
73
|
return {
|
|
@@ -69,7 +79,10 @@ export function skillStatus(packageRoot, options = {}) {
|
|
|
69
79
|
path: paths.canonical,
|
|
70
80
|
exists: canonicalExists,
|
|
71
81
|
installedVersion,
|
|
72
|
-
|
|
82
|
+
installedHash,
|
|
83
|
+
state: drift.state,
|
|
84
|
+
comparison: drift.comparison,
|
|
85
|
+
current: drift.state === 'current',
|
|
73
86
|
},
|
|
74
87
|
claude: { path: paths.claude, ...claude },
|
|
75
88
|
clients: [
|
|
@@ -113,12 +126,21 @@ function runSkills(packageRoot, action, args, options) {
|
|
|
113
126
|
];
|
|
114
127
|
const command = ['npx', ...commandArgs].map(shellQuote).join(' ');
|
|
115
128
|
const before = skillStatus(packageRoot, options);
|
|
129
|
+
const beforeState = { installedVersion: before.canonical.installedVersion, state: before.canonical.state };
|
|
116
130
|
if (options.dryRun) {
|
|
117
131
|
return {
|
|
118
132
|
...before,
|
|
119
|
-
operation: {
|
|
133
|
+
operation: {
|
|
134
|
+
action, command, executed: false, exitCode: null, output: '',
|
|
135
|
+
before: beforeState, after: null,
|
|
136
|
+
},
|
|
120
137
|
};
|
|
121
138
|
}
|
|
139
|
+
// 本机比包内新时覆盖就是降级;与 npm 包升级策略一致,默认拒绝。
|
|
140
|
+
if (action !== 'uninstall' && before.canonical.state === 'ahead' && !options.allowDowngrade) {
|
|
141
|
+
throw new Error(`拒绝降级 ${before.name}: 本机 ${before.canonical.installedVersion} 高于包内 ` +
|
|
142
|
+
`${before.bundled.skillVersion};确认要覆盖时加 --allow-downgrade`);
|
|
143
|
+
}
|
|
122
144
|
const env = {
|
|
123
145
|
...process.env,
|
|
124
146
|
...(options.env || {}),
|
|
@@ -135,9 +157,20 @@ function runSkills(packageRoot, action, args, options) {
|
|
|
135
157
|
throw new Error(`skills CLI ${action} 失败: ${reason}\n` +
|
|
136
158
|
`可手动执行: ${command}`);
|
|
137
159
|
}
|
|
160
|
+
// 退出码 0 不等于本机副本已经是目标版本;升级/安装后必须回读确认。
|
|
161
|
+
const after = skillStatus(packageRoot, options);
|
|
162
|
+
if (action !== 'uninstall' && after.canonical.state !== 'current') {
|
|
163
|
+
throw new Error(`skills CLI ${action} 退出码为 0,但回读 ${after.name} 仍为 ${after.canonical.state}` +
|
|
164
|
+
`(本机 ${after.canonical.installedVersion || '未声明'} / 包内 ${after.bundled.skillVersion})\n` +
|
|
165
|
+
`可手动执行: ${command}`);
|
|
166
|
+
}
|
|
138
167
|
return {
|
|
139
|
-
...
|
|
140
|
-
operation: {
|
|
168
|
+
...after,
|
|
169
|
+
operation: {
|
|
170
|
+
action, command, executed: true, exitCode: run.status, output,
|
|
171
|
+
before: beforeState,
|
|
172
|
+
after: { installedVersion: after.canonical.installedVersion, state: after.canonical.state },
|
|
173
|
+
},
|
|
141
174
|
};
|
|
142
175
|
}
|
|
143
176
|
function globalPaths(packageRoot, home = homedir(), name = GLOBAL_SKILL_NAME) {
|
|
@@ -156,6 +189,57 @@ function bundledInfo(packageRoot, name) {
|
|
|
156
189
|
path: source,
|
|
157
190
|
packageVersion: String(pkg.version || ''),
|
|
158
191
|
skillVersion: frontmatter.version,
|
|
192
|
+
contentHash: skillContentHash(source),
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
/** 本机副本的版本号;用户手改坏格式时返回空串并由调用方降级为 unknown,不抛错。 */
|
|
196
|
+
function readInstalledVersion(canonical) {
|
|
197
|
+
try {
|
|
198
|
+
return parseSkillFrontmatter(readFileSync(join(canonical, 'SKILL.md'), 'utf8')).version;
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
return '';
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* 全树内容 hash:按相对路径排序,逐个 update(相对路径 + \0 + 内容)。
|
|
206
|
+
* 它证明 references/assets 完整一致,补上"改了正文但没 bump 版本"这类版本号测不出的漂移。
|
|
207
|
+
*/
|
|
208
|
+
export function skillContentHash(root) {
|
|
209
|
+
const hash = createHash('sha256');
|
|
210
|
+
for (const relative of listSkillFiles(root)) {
|
|
211
|
+
hash.update(relative);
|
|
212
|
+
hash.update('\0');
|
|
213
|
+
hash.update(readFileSync(join(root, relative)));
|
|
214
|
+
}
|
|
215
|
+
return `sha256:${hash.digest('hex').slice(0, 16)}`;
|
|
216
|
+
}
|
|
217
|
+
function listSkillFiles(root, prefix = '') {
|
|
218
|
+
const files = [];
|
|
219
|
+
for (const entry of readdirSync(join(root, prefix), { withFileTypes: true })) {
|
|
220
|
+
if (entry.name === '.DS_Store' || entry.isSymbolicLink())
|
|
221
|
+
continue;
|
|
222
|
+
const relative = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
223
|
+
if (entry.isDirectory())
|
|
224
|
+
files.push(...listSkillFiles(root, relative));
|
|
225
|
+
else if (entry.isFile())
|
|
226
|
+
files.push(relative);
|
|
227
|
+
}
|
|
228
|
+
return files.sort();
|
|
229
|
+
}
|
|
230
|
+
function driftOf(input) {
|
|
231
|
+
if (!input.exists)
|
|
232
|
+
return { state: 'missing', comparison: null };
|
|
233
|
+
if (!isValidVersion(input.installedVersion))
|
|
234
|
+
return { state: 'unknown', comparison: null };
|
|
235
|
+
const comparison = compareVersions(input.installedVersion, input.bundledVersion);
|
|
236
|
+
if (comparison > 0)
|
|
237
|
+
return { state: 'ahead', comparison };
|
|
238
|
+
if (comparison < 0)
|
|
239
|
+
return { state: 'outdated', comparison };
|
|
240
|
+
return {
|
|
241
|
+
state: input.installedHash === input.bundledHash ? 'current' : 'modified',
|
|
242
|
+
comparison,
|
|
159
243
|
};
|
|
160
244
|
}
|
|
161
245
|
function inspectExposure(exposure, canonical) {
|
|
@@ -181,6 +265,10 @@ function validateSkill(root, name) {
|
|
|
181
265
|
}
|
|
182
266
|
if (!metadata.description)
|
|
183
267
|
throw new Error('Skill frontmatter 缺少 description');
|
|
268
|
+
// 包内 Skill 缺版本号是仓库缺陷:没有版本就无法判断本机副本是否过期,直接 fail closed。
|
|
269
|
+
if (!metadata.version)
|
|
270
|
+
throw new Error(`Skill 缺少 metadata.version: ${root}`);
|
|
271
|
+
cleanVersion(metadata.version);
|
|
184
272
|
}
|
|
185
273
|
function bundledSkillName(value = '') {
|
|
186
274
|
const name = value.trim() || GLOBAL_SKILL_NAME;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-manager.js","sourceRoot":"","sources":["../../src/skill-manager.ts"],"names":[],"mappings":"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","sourcesContent":["// Skill 安装生命周期由开放生态的 `npx skills` 负责。\n// dingtalk-agent 只做两件事:把内置 Skill 目录交给上游 CLI;只读验证客户端能否发现。\n// 默认(不指定 name)对全部内置 Skill 生效:基础行为 + Agent 装配;指定 name 时只操作该 Skill。\n\nimport { existsSync, lstatSync, readFileSync, readlinkSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { dirname, join, resolve } from 'node:path'\nimport { spawnSync } from 'node:child_process'\n\nexport const GLOBAL_SKILL_NAME = 'dingtalk-basic-behavior'\n// 默认套装:所有机器都装的通用 Skill。平台 Skill(deploy/boot-multica 等)不在默认套装内,\n// 只有工作区通过 `dta agent-platform use` 选择对应 managed agent platform 时才按名安装。\nexport const BUNDLED_SKILL_NAMES = [GLOBAL_SKILL_NAME, 'dingtalk-agent-compose'] as const\nexport const INSTALLABLE_SKILL_NAMES = [\n ...BUNDLED_SKILL_NAMES,\n 'dingtalk-agent-deploy-multica', 'dingtalk-agent-boot-multica', 'multica-external',\n] as const\n\n// 仓库/包内的 Skill 源码路径注册表:core 为通用套装,platforms/<platform> 按平台装填。\n// 安装后的 canonical 布局仍是扁平的 ~/.agents/skills/<name>;分层只存在于包内。\nconst BUNDLED_SKILL_DIRS: Record<string, string> = {\n 'dingtalk-basic-behavior': 'skills/core/dingtalk-basic-behavior',\n 'dingtalk-agent-compose': 'skills/core/dingtalk-agent-compose',\n 'dingtalk-agent-eval': 'skills/core/dingtalk-agent-eval',\n 'dingtalk-agent-deploy-multica': 'skills/platforms/multica-dingtalk/dingtalk-agent-deploy-multica',\n 'dingtalk-agent-boot-multica': 'skills/platforms/multica-dingtalk/dingtalk-agent-boot-multica',\n 'multica-external': 'skills/platforms/multica-dingtalk/multica-external',\n}\n\n/** 解析包内 Skill 源码目录;未注册的名字回退到历史扁平布局。 */\nexport function bundledSkillPath(packageRoot: string, name: string): string {\n return join(packageRoot, BUNDLED_SKILL_DIRS[name] || join('skills', name))\n}\nconst SKILLS_PACKAGE = 'skills@latest'\nconst REGISTRY = 'https://registry.npmjs.org'\nconst AGENTS = ['claude-code', 'codex', 'opencode']\n\nexport interface SkillManagerOptions {\n home?: string\n dryRun?: boolean\n env?: NodeJS.ProcessEnv\n name?: string\n}\n\nexport interface GlobalSkillStatus {\n $schema: 'dingtalk-agent/skill-status@2'\n name: string\n manager: 'skills-cli'\n bundled: { path: string; packageVersion: string; skillVersion: string }\n canonical: {\n path: string\n exists: boolean\n installedVersion: string\n current: boolean\n }\n claude: { path: string; state: 'ok' | 'missing' | 'conflict'; target: string }\n clients: Array<{\n name: 'claude-code' | 'codex' | 'opencode'\n label: string\n discovery: 'symlink' | 'shared-agent-skills'\n path: string\n state: 'ok' | 'missing' | 'conflict'\n }>\n operation?: {\n action: 'install' | 'upgrade' | 'uninstall'\n command: string\n executed: boolean\n exitCode: number | null\n output: string\n }\n}\n\nexport interface GlobalSkillSuiteStatus {\n $schema: 'dingtalk-agent/skill-status-suite@1'\n manager: 'skills-cli'\n names: string[]\n skills: GlobalSkillStatus[]\n}\n\nexport function skillSuiteStatus(\n packageRoot: string,\n options: Omit<SkillManagerOptions, 'name'> = {},\n): GlobalSkillSuiteStatus {\n return suiteOf(BUNDLED_SKILL_NAMES.map((name) => skillStatus(packageRoot, { ...options, name })))\n}\n\nexport function installBundledSkills(\n packageRoot: string,\n options: Omit<SkillManagerOptions, 'name'> = {},\n): GlobalSkillSuiteStatus {\n return suiteOf(BUNDLED_SKILL_NAMES.map((name) => installGlobalSkill(packageRoot, { ...options, name })))\n}\n\nexport function upgradeBundledSkills(\n packageRoot: string,\n options: Omit<SkillManagerOptions, 'name'> = {},\n): GlobalSkillSuiteStatus {\n return suiteOf(BUNDLED_SKILL_NAMES.map((name) => upgradeGlobalSkill(packageRoot, { ...options, name })))\n}\n\nexport function uninstallBundledSkills(\n packageRoot: string,\n options: Omit<SkillManagerOptions, 'name'> = {},\n): GlobalSkillSuiteStatus {\n return suiteOf(BUNDLED_SKILL_NAMES.map((name) => uninstallGlobalSkill(packageRoot, { ...options, name })))\n}\n\nfunction suiteOf(skills: GlobalSkillStatus[]): GlobalSkillSuiteStatus {\n return {\n $schema: 'dingtalk-agent/skill-status-suite@1',\n manager: 'skills-cli',\n names: skills.map((skill) => skill.name),\n skills,\n }\n}\n\nexport function skillStatus(packageRoot: string, options: SkillManagerOptions = {}): GlobalSkillStatus {\n const name = bundledSkillName(options.name)\n const paths = globalPaths(packageRoot, options.home, name)\n const bundled = bundledInfo(packageRoot, name)\n const canonicalExists = isDirectory(paths.canonical)\n const installedVersion = canonicalExists\n ? parseSkillFrontmatter(readFileSync(join(paths.canonical, 'SKILL.md'), 'utf8')).version\n : ''\n const claude = inspectExposure(paths.claude, paths.canonical)\n const sharedState = canonicalExists ? 'ok' : 'missing'\n return {\n $schema: 'dingtalk-agent/skill-status@2',\n name,\n manager: 'skills-cli',\n bundled,\n canonical: {\n path: paths.canonical,\n exists: canonicalExists,\n installedVersion,\n current: Boolean(canonicalExists && installedVersion === bundled.skillVersion),\n },\n claude: { path: paths.claude, ...claude },\n clients: [\n {\n name: 'claude-code', label: 'Claude Code', discovery: 'symlink',\n path: paths.claude, state: claude.state,\n },\n {\n name: 'codex', label: 'Codex', discovery: 'shared-agent-skills',\n path: paths.canonical, state: sharedState,\n },\n {\n name: 'opencode', label: 'OpenCode', discovery: 'shared-agent-skills',\n path: paths.canonical, state: sharedState,\n },\n ],\n }\n}\n\nexport function installGlobalSkill(\n packageRoot: string,\n options: SkillManagerOptions = {},\n): GlobalSkillStatus {\n return runSkills(packageRoot, 'install', [\n 'add', globalPaths(packageRoot, undefined, bundledSkillName(options.name)).source,\n '--global', '--yes', '--agent', ...AGENTS,\n ], options)\n}\n\nexport function upgradeGlobalSkill(\n packageRoot: string,\n options: SkillManagerOptions = {},\n): GlobalSkillStatus {\n // Skill 随 npm 包发布;重新 add 当前包内目录,让 skills CLI 执行自己的覆盖/链接语义。\n return runSkills(packageRoot, 'upgrade', [\n 'add', globalPaths(packageRoot, undefined, bundledSkillName(options.name)).source,\n '--global', '--yes', '--agent', ...AGENTS,\n ], options)\n}\n\nexport function uninstallGlobalSkill(\n packageRoot: string,\n options: SkillManagerOptions = {},\n): GlobalSkillStatus {\n return runSkills(packageRoot, 'uninstall', [\n 'remove', bundledSkillName(options.name),\n '--global', '--yes', '--agent', ...AGENTS,\n ], options)\n}\n\nfunction runSkills(\n packageRoot: string,\n action: 'install' | 'upgrade' | 'uninstall',\n args: string[],\n options: SkillManagerOptions,\n): GlobalSkillStatus {\n const commandArgs = [\n '--yes', `--registry=${REGISTRY}`, `--package=${SKILLS_PACKAGE}`, '--', 'skills', ...args,\n ]\n const command = ['npx', ...commandArgs].map(shellQuote).join(' ')\n const before = skillStatus(packageRoot, options)\n if (options.dryRun) {\n return {\n ...before,\n operation: { action, command, executed: false, exitCode: null, output: '' },\n }\n }\n\n const env = {\n ...process.env,\n ...(options.env || {}),\n HOME: options.home || options.env?.HOME || process.env.HOME || homedir(),\n }\n const run = spawnSync('npx', commandArgs, {\n encoding: 'utf8', env, timeout: 120_000,\n })\n const output = [run.stdout, run.stderr].filter(Boolean).join('\\n').trim()\n if (run.error || run.status !== 0) {\n const reason = (run.error as NodeJS.ErrnoException | undefined)?.code === 'ENOENT'\n ? 'PATH 找不到 npx;请安装带 npm/npx 的 Node.js 18.3+'\n : run.error?.message || output || `退出码 ${run.status}`\n throw new Error(\n `skills CLI ${action} 失败: ${reason}\\n` +\n `可手动执行: ${command}`,\n )\n }\n return {\n ...skillStatus(packageRoot, options),\n operation: { action, command, executed: true, exitCode: run.status, output },\n }\n}\n\nfunction globalPaths(packageRoot: string, home = homedir(), name = GLOBAL_SKILL_NAME) {\n return {\n source: bundledSkillPath(packageRoot, name),\n canonical: join(home, '.agents', 'skills', name),\n claude: join(home, '.claude', 'skills', name),\n }\n}\n\nfunction bundledInfo(packageRoot: string, name: string) {\n const source = globalPaths(packageRoot, undefined, name).source\n validateSkill(source, name)\n const pkg = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'))\n const frontmatter = parseSkillFrontmatter(readFileSync(join(source, 'SKILL.md'), 'utf8'))\n return {\n path: source,\n packageVersion: String(pkg.version || ''),\n skillVersion: frontmatter.version,\n }\n}\n\nfunction inspectExposure(exposure: string, canonical: string): {\n state: 'ok' | 'missing' | 'conflict'\n target: string\n} {\n if (!pathExists(exposure)) return { state: 'missing', target: '' }\n const stat = lstatSync(exposure)\n if (!stat.isSymbolicLink()) return { state: 'conflict', target: '' }\n const raw = readlinkSync(exposure)\n return resolve(dirname(exposure), raw) === resolve(canonical)\n ? { state: 'ok', target: raw }\n : { state: 'conflict', target: raw }\n}\n\nfunction validateSkill(root: string, name: string): void {\n if (!isDirectory(root)) throw new Error(`内置 Skill 不存在: ${root}`)\n const file = join(root, 'SKILL.md')\n if (!existsSync(file)) throw new Error(`Skill 缺少 SKILL.md: ${root}`)\n const metadata = parseSkillFrontmatter(readFileSync(file, 'utf8'))\n if (metadata.name !== name) {\n throw new Error(`Skill name=${metadata.name} 与目录名 ${name} 不一致`)\n }\n if (!metadata.description) throw new Error('Skill frontmatter 缺少 description')\n}\n\nfunction bundledSkillName(value = ''): string {\n const name = value.trim() || GLOBAL_SKILL_NAME\n if (!(INSTALLABLE_SKILL_NAMES as readonly string[]).includes(name)) {\n throw new Error(`不支持的内置 Skill: ${name};可用: ${INSTALLABLE_SKILL_NAMES.join(', ')}`)\n }\n return name\n}\n\nfunction parseSkillFrontmatter(text: string): { name: string; description: string; version: string } {\n const match = text.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---(?:\\r?\\n|$)/)\n if (!match) throw new Error('SKILL.md 缺少 YAML frontmatter')\n const block = match[1]\n const readScalar = (key: string) => {\n const found = block.match(new RegExp(`^${key}:\\\\s*(.+)$`, 'm'))\n return found ? found[1].trim().replace(/^(['\"])(.*)\\1$/, '$2') : ''\n }\n const nestedVersion = block.match(/^metadata:\\s*\\r?\\n(?:[ \\t]+.*\\r?\\n)*?[ \\t]+version:\\s*['\"]?([^'\"\\r\\n]+)['\"]?\\s*$/m)\n return {\n name: readScalar('name'),\n description: readScalar('description'),\n version: nestedVersion?.[1]?.trim() || readScalar('version'),\n }\n}\n\nfunction isDirectory(path: string): boolean {\n try { return lstatSync(path).isDirectory() } catch { return false }\n}\n\nfunction pathExists(path: string): boolean {\n try { lstatSync(path); return true } catch { return false }\n}\n\nfunction shellQuote(value: string): string {\n return /^[A-Za-z0-9_./:=@-]+$/.test(value) ? value : `'${value.replace(/'/g, `'\"'\"'`)}'`\n}\n"]}
|
|
1
|
+
{"version":3,"file":"skill-manager.js","sourceRoot":"","sources":["../../src/skill-manager.ts"],"names":[],"mappings":"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","sourcesContent":["// Skill 安装生命周期由开放生态的 `npx skills` 负责。\n// dingtalk-agent 只做两件事:把内置 Skill 目录交给上游 CLI;只读验证客户端能否发现。\n// 默认(不指定 name)对全部内置 Skill 生效:基础行为 + Agent 装配 + 交付后评测;指定 name 时只操作该 Skill。\n\nimport { existsSync, lstatSync, readdirSync, readFileSync, readlinkSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { dirname, join, resolve } from 'node:path'\nimport { spawnSync } from 'node:child_process'\nimport { createHash } from 'node:crypto'\nimport { cleanVersion, compareVersions, isValidVersion } from './version.js'\n\nexport const GLOBAL_SKILL_NAME = 'dingtalk-basic-behavior'\n// 默认套装:所有机器都装的通用 Skill。平台 Skill(deploy/boot-multica 等)不在默认套装内,\n// 只有工作区通过 `dta agent-platform use` 选择对应 managed agent platform 时才按名安装。\nexport const BUNDLED_SKILL_NAMES = [\n GLOBAL_SKILL_NAME, 'dingtalk-agent-compose', 'dingtalk-agent-eval',\n] as const\nexport const INSTALLABLE_SKILL_NAMES = [\n ...BUNDLED_SKILL_NAMES,\n 'dingtalk-agent-deploy-multica', 'dingtalk-agent-boot-multica', 'multica-external',\n] as const\n\n// 仓库/包内的 Skill 源码路径注册表:core 为通用套装,platforms/<platform> 按平台装填。\n// 安装后的 canonical 布局仍是扁平的 ~/.agents/skills/<name>;分层只存在于包内。\nconst BUNDLED_SKILL_DIRS: Record<string, string> = {\n 'dingtalk-basic-behavior': 'skills/core/dingtalk-basic-behavior',\n 'dingtalk-agent-compose': 'skills/core/dingtalk-agent-compose',\n 'dingtalk-agent-eval': 'skills/core/dingtalk-agent-eval',\n 'dingtalk-agent-deploy-multica': 'skills/platforms/multica-dingtalk/dingtalk-agent-deploy-multica',\n 'dingtalk-agent-boot-multica': 'skills/platforms/multica-dingtalk/dingtalk-agent-boot-multica',\n 'multica-external': 'skills/platforms/multica-dingtalk/multica-external',\n}\n\n/** 解析包内 Skill 源码目录;未注册的名字回退到历史扁平布局。 */\nexport function bundledSkillPath(packageRoot: string, name: string): string {\n return join(packageRoot, BUNDLED_SKILL_DIRS[name] || join('skills', name))\n}\nconst SKILLS_PACKAGE = 'skills@latest'\nconst REGISTRY = 'https://registry.npmjs.org'\nconst AGENTS = ['claude-code', 'codex', 'opencode']\n\nexport interface SkillManagerOptions {\n home?: string\n dryRun?: boolean\n env?: NodeJS.ProcessEnv\n name?: string\n allowDowngrade?: boolean\n}\n\n/**\n * 本机副本相对包内 Skill 的漂移状态。`current` 是它的派生布尔,保留给既有读者。\n * 版本相等但内容不同(用户手改过)必须与真正一致区分开,否则升级提示会漏掉这类漂移。\n */\nexport type SkillDriftState =\n | 'missing' // canonical 不存在\n | 'current' // 版本相等且内容 hash 相等\n | 'modified' // 版本相等但内容 hash 不等\n | 'outdated' // 已装版本低于包内版本\n | 'ahead' // 已装版本高于包内版本\n | 'unknown' // 已装版本缺失或非法\n\nexport interface GlobalSkillStatus {\n $schema: 'dingtalk-agent/skill-status@2'\n name: string\n manager: 'skills-cli'\n bundled: { path: string; packageVersion: string; skillVersion: string; contentHash: string }\n canonical: {\n path: string\n exists: boolean\n installedVersion: string\n installedHash: string\n state: SkillDriftState\n comparison: number | null\n current: boolean\n }\n claude: { path: string; state: 'ok' | 'missing' | 'conflict'; target: string }\n clients: Array<{\n name: 'claude-code' | 'codex' | 'opencode'\n label: string\n discovery: 'symlink' | 'shared-agent-skills'\n path: string\n state: 'ok' | 'missing' | 'conflict'\n }>\n operation?: {\n action: 'install' | 'upgrade' | 'uninstall'\n command: string\n executed: boolean\n exitCode: number | null\n output: string\n before: { installedVersion: string; state: SkillDriftState }\n after: { installedVersion: string; state: SkillDriftState } | null\n }\n}\n\nexport interface GlobalSkillSuiteStatus {\n $schema: 'dingtalk-agent/skill-status-suite@1'\n manager: 'skills-cli'\n names: string[]\n skills: GlobalSkillStatus[]\n}\n\nexport function skillSuiteStatus(\n packageRoot: string,\n options: Omit<SkillManagerOptions, 'name'> = {},\n): GlobalSkillSuiteStatus {\n return suiteOf(BUNDLED_SKILL_NAMES.map((name) => skillStatus(packageRoot, { ...options, name })))\n}\n\nexport function installBundledSkills(\n packageRoot: string,\n options: Omit<SkillManagerOptions, 'name'> = {},\n): GlobalSkillSuiteStatus {\n return suiteOf(BUNDLED_SKILL_NAMES.map((name) => installGlobalSkill(packageRoot, { ...options, name })))\n}\n\nexport function upgradeBundledSkills(\n packageRoot: string,\n options: Omit<SkillManagerOptions, 'name'> = {},\n): GlobalSkillSuiteStatus {\n return suiteOf(BUNDLED_SKILL_NAMES.map((name) => upgradeGlobalSkill(packageRoot, { ...options, name })))\n}\n\nexport function uninstallBundledSkills(\n packageRoot: string,\n options: Omit<SkillManagerOptions, 'name'> = {},\n): GlobalSkillSuiteStatus {\n return suiteOf(BUNDLED_SKILL_NAMES.map((name) => uninstallGlobalSkill(packageRoot, { ...options, name })))\n}\n\nfunction suiteOf(skills: GlobalSkillStatus[]): GlobalSkillSuiteStatus {\n return {\n $schema: 'dingtalk-agent/skill-status-suite@1',\n manager: 'skills-cli',\n names: skills.map((skill) => skill.name),\n skills,\n }\n}\n\nexport function skillStatus(packageRoot: string, options: SkillManagerOptions = {}): GlobalSkillStatus {\n const name = bundledSkillName(options.name)\n const paths = globalPaths(packageRoot, options.home, name)\n const bundled = bundledInfo(packageRoot, name)\n const canonicalExists = isDirectory(paths.canonical)\n const installedVersion = canonicalExists ? readInstalledVersion(paths.canonical) : ''\n const installedHash = canonicalExists ? skillContentHash(paths.canonical) : ''\n const drift = driftOf({\n exists: canonicalExists,\n installedVersion,\n installedHash,\n bundledVersion: bundled.skillVersion,\n bundledHash: bundled.contentHash,\n })\n const claude = inspectExposure(paths.claude, paths.canonical)\n const sharedState = canonicalExists ? 'ok' : 'missing'\n return {\n $schema: 'dingtalk-agent/skill-status@2',\n name,\n manager: 'skills-cli',\n bundled,\n canonical: {\n path: paths.canonical,\n exists: canonicalExists,\n installedVersion,\n installedHash,\n state: drift.state,\n comparison: drift.comparison,\n current: drift.state === 'current',\n },\n claude: { path: paths.claude, ...claude },\n clients: [\n {\n name: 'claude-code', label: 'Claude Code', discovery: 'symlink',\n path: paths.claude, state: claude.state,\n },\n {\n name: 'codex', label: 'Codex', discovery: 'shared-agent-skills',\n path: paths.canonical, state: sharedState,\n },\n {\n name: 'opencode', label: 'OpenCode', discovery: 'shared-agent-skills',\n path: paths.canonical, state: sharedState,\n },\n ],\n }\n}\n\nexport function installGlobalSkill(\n packageRoot: string,\n options: SkillManagerOptions = {},\n): GlobalSkillStatus {\n return runSkills(packageRoot, 'install', [\n 'add', globalPaths(packageRoot, undefined, bundledSkillName(options.name)).source,\n '--global', '--yes', '--agent', ...AGENTS,\n ], options)\n}\n\nexport function upgradeGlobalSkill(\n packageRoot: string,\n options: SkillManagerOptions = {},\n): GlobalSkillStatus {\n // Skill 随 npm 包发布;重新 add 当前包内目录,让 skills CLI 执行自己的覆盖/链接语义。\n return runSkills(packageRoot, 'upgrade', [\n 'add', globalPaths(packageRoot, undefined, bundledSkillName(options.name)).source,\n '--global', '--yes', '--agent', ...AGENTS,\n ], options)\n}\n\nexport function uninstallGlobalSkill(\n packageRoot: string,\n options: SkillManagerOptions = {},\n): GlobalSkillStatus {\n return runSkills(packageRoot, 'uninstall', [\n 'remove', bundledSkillName(options.name),\n '--global', '--yes', '--agent', ...AGENTS,\n ], options)\n}\n\nfunction runSkills(\n packageRoot: string,\n action: 'install' | 'upgrade' | 'uninstall',\n args: string[],\n options: SkillManagerOptions,\n): GlobalSkillStatus {\n const commandArgs = [\n '--yes', `--registry=${REGISTRY}`, `--package=${SKILLS_PACKAGE}`, '--', 'skills', ...args,\n ]\n const command = ['npx', ...commandArgs].map(shellQuote).join(' ')\n const before = skillStatus(packageRoot, options)\n const beforeState = { installedVersion: before.canonical.installedVersion, state: before.canonical.state }\n if (options.dryRun) {\n return {\n ...before,\n operation: {\n action, command, executed: false, exitCode: null, output: '',\n before: beforeState, after: null,\n },\n }\n }\n // 本机比包内新时覆盖就是降级;与 npm 包升级策略一致,默认拒绝。\n if (action !== 'uninstall' && before.canonical.state === 'ahead' && !options.allowDowngrade) {\n throw new Error(\n `拒绝降级 ${before.name}: 本机 ${before.canonical.installedVersion} 高于包内 ` +\n `${before.bundled.skillVersion};确认要覆盖时加 --allow-downgrade`,\n )\n }\n\n const env = {\n ...process.env,\n ...(options.env || {}),\n HOME: options.home || options.env?.HOME || process.env.HOME || homedir(),\n }\n const run = spawnSync('npx', commandArgs, {\n encoding: 'utf8', env, timeout: 120_000,\n })\n const output = [run.stdout, run.stderr].filter(Boolean).join('\\n').trim()\n if (run.error || run.status !== 0) {\n const reason = (run.error as NodeJS.ErrnoException | undefined)?.code === 'ENOENT'\n ? 'PATH 找不到 npx;请安装带 npm/npx 的 Node.js 18.3+'\n : run.error?.message || output || `退出码 ${run.status}`\n throw new Error(\n `skills CLI ${action} 失败: ${reason}\\n` +\n `可手动执行: ${command}`,\n )\n }\n // 退出码 0 不等于本机副本已经是目标版本;升级/安装后必须回读确认。\n const after = skillStatus(packageRoot, options)\n if (action !== 'uninstall' && after.canonical.state !== 'current') {\n throw new Error(\n `skills CLI ${action} 退出码为 0,但回读 ${after.name} 仍为 ${after.canonical.state}` +\n `(本机 ${after.canonical.installedVersion || '未声明'} / 包内 ${after.bundled.skillVersion})\\n` +\n `可手动执行: ${command}`,\n )\n }\n return {\n ...after,\n operation: {\n action, command, executed: true, exitCode: run.status, output,\n before: beforeState,\n after: { installedVersion: after.canonical.installedVersion, state: after.canonical.state },\n },\n }\n}\n\nfunction globalPaths(packageRoot: string, home = homedir(), name = GLOBAL_SKILL_NAME) {\n return {\n source: bundledSkillPath(packageRoot, name),\n canonical: join(home, '.agents', 'skills', name),\n claude: join(home, '.claude', 'skills', name),\n }\n}\n\nfunction bundledInfo(packageRoot: string, name: string) {\n const source = globalPaths(packageRoot, undefined, name).source\n validateSkill(source, name)\n const pkg = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'))\n const frontmatter = parseSkillFrontmatter(readFileSync(join(source, 'SKILL.md'), 'utf8'))\n return {\n path: source,\n packageVersion: String(pkg.version || ''),\n skillVersion: frontmatter.version,\n contentHash: skillContentHash(source),\n }\n}\n\n/** 本机副本的版本号;用户手改坏格式时返回空串并由调用方降级为 unknown,不抛错。 */\nfunction readInstalledVersion(canonical: string): string {\n try {\n return parseSkillFrontmatter(readFileSync(join(canonical, 'SKILL.md'), 'utf8')).version\n } catch {\n return ''\n }\n}\n\n/**\n * 全树内容 hash:按相对路径排序,逐个 update(相对路径 + \\0 + 内容)。\n * 它证明 references/assets 完整一致,补上\"改了正文但没 bump 版本\"这类版本号测不出的漂移。\n */\nexport function skillContentHash(root: string): string {\n const hash = createHash('sha256')\n for (const relative of listSkillFiles(root)) {\n hash.update(relative)\n hash.update('\\0')\n hash.update(readFileSync(join(root, relative)))\n }\n return `sha256:${hash.digest('hex').slice(0, 16)}`\n}\n\nfunction listSkillFiles(root: string, prefix = ''): string[] {\n const files: string[] = []\n for (const entry of readdirSync(join(root, prefix), { withFileTypes: true })) {\n if (entry.name === '.DS_Store' || entry.isSymbolicLink()) continue\n const relative = prefix ? `${prefix}/${entry.name}` : entry.name\n if (entry.isDirectory()) files.push(...listSkillFiles(root, relative))\n else if (entry.isFile()) files.push(relative)\n }\n return files.sort()\n}\n\nfunction driftOf(input: {\n exists: boolean\n installedVersion: string\n installedHash: string\n bundledVersion: string\n bundledHash: string\n}): { state: SkillDriftState; comparison: number | null } {\n if (!input.exists) return { state: 'missing', comparison: null }\n if (!isValidVersion(input.installedVersion)) return { state: 'unknown', comparison: null }\n const comparison = compareVersions(input.installedVersion, input.bundledVersion)\n if (comparison > 0) return { state: 'ahead', comparison }\n if (comparison < 0) return { state: 'outdated', comparison }\n return {\n state: input.installedHash === input.bundledHash ? 'current' : 'modified',\n comparison,\n }\n}\n\nfunction inspectExposure(exposure: string, canonical: string): {\n state: 'ok' | 'missing' | 'conflict'\n target: string\n} {\n if (!pathExists(exposure)) return { state: 'missing', target: '' }\n const stat = lstatSync(exposure)\n if (!stat.isSymbolicLink()) return { state: 'conflict', target: '' }\n const raw = readlinkSync(exposure)\n return resolve(dirname(exposure), raw) === resolve(canonical)\n ? { state: 'ok', target: raw }\n : { state: 'conflict', target: raw }\n}\n\nfunction validateSkill(root: string, name: string): void {\n if (!isDirectory(root)) throw new Error(`内置 Skill 不存在: ${root}`)\n const file = join(root, 'SKILL.md')\n if (!existsSync(file)) throw new Error(`Skill 缺少 SKILL.md: ${root}`)\n const metadata = parseSkillFrontmatter(readFileSync(file, 'utf8'))\n if (metadata.name !== name) {\n throw new Error(`Skill name=${metadata.name} 与目录名 ${name} 不一致`)\n }\n if (!metadata.description) throw new Error('Skill frontmatter 缺少 description')\n // 包内 Skill 缺版本号是仓库缺陷:没有版本就无法判断本机副本是否过期,直接 fail closed。\n if (!metadata.version) throw new Error(`Skill 缺少 metadata.version: ${root}`)\n cleanVersion(metadata.version)\n}\n\nfunction bundledSkillName(value = ''): string {\n const name = value.trim() || GLOBAL_SKILL_NAME\n if (!(INSTALLABLE_SKILL_NAMES as readonly string[]).includes(name)) {\n throw new Error(`不支持的内置 Skill: ${name};可用: ${INSTALLABLE_SKILL_NAMES.join(', ')}`)\n }\n return name\n}\n\nfunction parseSkillFrontmatter(text: string): { name: string; description: string; version: string } {\n const match = text.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---(?:\\r?\\n|$)/)\n if (!match) throw new Error('SKILL.md 缺少 YAML frontmatter')\n const block = match[1]\n const readScalar = (key: string) => {\n const found = block.match(new RegExp(`^${key}:\\\\s*(.+)$`, 'm'))\n return found ? found[1].trim().replace(/^(['\"])(.*)\\1$/, '$2') : ''\n }\n const nestedVersion = block.match(/^metadata:\\s*\\r?\\n(?:[ \\t]+.*\\r?\\n)*?[ \\t]+version:\\s*['\"]?([^'\"\\r\\n]+)['\"]?\\s*$/m)\n return {\n name: readScalar('name'),\n description: readScalar('description'),\n version: nestedVersion?.[1]?.trim() || readScalar('version'),\n }\n}\n\nfunction isDirectory(path: string): boolean {\n try { return lstatSync(path).isDirectory() } catch { return false }\n}\n\nfunction pathExists(path: string): boolean {\n try { lstatSync(path); return true } catch { return false }\n}\n\nfunction shellQuote(value: string): string {\n return /^[A-Za-z0-9_./:=@-]+$/.test(value) ? value : `'${value.replace(/'/g, `'\"'\"'`)}'`\n}\n"]}
|