@xdxer/dingtalk-agent 0.1.4-beta.12 → 0.1.4-beta.13
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 +13 -0
- package/README.en.md +1 -1
- package/README.md +15 -16
- package/dist/bin/dingtalk-agent.js +30 -9
- package/dist/bin/dingtalk-agent.js.map +1 -1
- package/dist/src/agent-audit.js +3 -2
- package/dist/src/agent-audit.js.map +1 -1
- package/dist/src/agent-enhance.js +3 -2
- package/dist/src/agent-enhance.js.map +1 -1
- package/dist/src/agent-platform.js +36 -2
- package/dist/src/agent-platform.js.map +1 -1
- package/dist/src/development-workspace.js +3 -1
- package/dist/src/development-workspace.js.map +1 -1
- package/dist/src/multica-deploy.js +2 -1
- package/dist/src/multica-deploy.js.map +1 -1
- package/dist/src/opencode-evals.js +2 -1
- package/dist/src/opencode-evals.js.map +1 -1
- package/dist/src/remote-state-evals.js +2 -1
- package/dist/src/remote-state-evals.js.map +1 -1
- package/dist/src/robot-evals.js +2 -1
- package/dist/src/robot-evals.js.map +1 -1
- package/dist/src/skill-manager.js +17 -3
- package/dist/src/skill-manager.js.map +1 -1
- package/dist/src/skills.js +2 -1
- package/dist/src/skills.js.map +1 -1
- package/docs/INSTALLATION.md +2 -2
- package/lab/agent-eval/completion-gate-regression.json +6 -6
- package/package.json +7 -7
- package/skills/README.md +23 -0
- package/skills/{dingtalk-agent-compose → core/dingtalk-agent-compose}/SKILL.md +20 -4
- package/skills/{dingtalk-agent-deploy → platforms/multica-dingtalk/dingtalk-agent-deploy-multica}/SKILL.md +1 -1
- package/skills/{multica-fde-external → platforms/multica-dingtalk/multica-external}/SKILL.md +4 -4
- package/skills/{multica-fde-external → platforms/multica-dingtalk/multica-external}/scripts/bootstrap.sh +2 -2
- /package/skills/{dingtalk-agent-compose → core/dingtalk-agent-compose}/assets/AGENTS.template.md +0 -0
- /package/skills/{dingtalk-agent-compose → core/dingtalk-agent-compose}/assets/agent.bindings.dingtalk-doc.template.json +0 -0
- /package/skills/{dingtalk-agent-compose → core/dingtalk-agent-compose}/assets/agent.bindings.local.template.json +0 -0
- /package/skills/{dingtalk-agent-compose → core/dingtalk-agent-compose}/assets/opencode.template.json +0 -0
- /package/skills/{dingtalk-agent-compose → core/dingtalk-agent-compose}/assets/role-skill.template.md +0 -0
- /package/skills/{dingtalk-agent-compose → core/dingtalk-agent-compose}/evals/evals.json +0 -0
- /package/skills/{dingtalk-agent-compose → core/dingtalk-agent-compose}/references/agent-definition-contract.md +0 -0
- /package/skills/{dingtalk-agent-compose → core/dingtalk-agent-compose}/references/opencode-host-contract.md +0 -0
- /package/skills/{dingtalk-agent-compose → core/dingtalk-agent-compose}/references/storage-routing.md +0 -0
- /package/skills/{dingtalk-agent-eval → core/dingtalk-agent-eval}/SKILL.md +0 -0
- /package/skills/{dingtalk-agent-eval → core/dingtalk-agent-eval}/assets/eval-catalog.template.json +0 -0
- /package/skills/{dingtalk-agent-eval → core/dingtalk-agent-eval}/evals/evals.json +0 -0
- /package/skills/{dingtalk-agent-eval → core/dingtalk-agent-eval}/references/eval-topology.md +0 -0
- /package/skills/{dingtalk-agent-eval → core/dingtalk-agent-eval}/references/evidence-contract.md +0 -0
- /package/skills/{dingtalk-agent-eval → core/dingtalk-agent-eval}/references/scenario-taxonomy.md +0 -0
- /package/skills/{dingtalk-agent-eval → core/dingtalk-agent-eval}/references/storage-modes.md +0 -0
- /package/skills/{dingtalk-basic-behavior → core/dingtalk-basic-behavior}/SKILL.md +0 -0
- /package/skills/{dingtalk-basic-behavior → core/dingtalk-basic-behavior}/assets/memory-candidate-proposal.json +0 -0
- /package/skills/{dingtalk-basic-behavior → core/dingtalk-basic-behavior}/assets/task-checkpoint.json +0 -0
- /package/skills/{dingtalk-basic-behavior → core/dingtalk-basic-behavior}/references/action-contract.md +0 -0
- /package/skills/{dingtalk-basic-behavior → core/dingtalk-basic-behavior}/references/event-to-behavior.md +0 -0
- /package/skills/{dingtalk-basic-behavior → core/dingtalk-basic-behavior}/references/memory-and-evolution.md +0 -0
- /package/skills/{dingtalk-basic-behavior → core/dingtalk-basic-behavior}/references/perception-and-gates.md +0 -0
- /package/skills/{dingtalk-basic-behavior → core/dingtalk-basic-behavior}/references/runtime-modes.md +0 -0
- /package/skills/{dingtalk-basic-behavior → core/dingtalk-basic-behavior}/references/task-lifecycle.md +0 -0
- /package/skills/{dingtalk-agent-boot-multica → platforms/multica-dingtalk/dingtalk-agent-boot-multica}/SKILL.md +0 -0
- /package/skills/{dingtalk-agent-deploy → platforms/multica-dingtalk/dingtalk-agent-deploy-multica}/references/multica-deployment-contract.md +0 -0
- /package/skills/{dingtalk-agent-deploy → platforms/multica-dingtalk/dingtalk-agent-deploy-multica}/references/promotion-observation-contract.md +0 -0
- /package/skills/{multica-fde-external → platforms/multica-dingtalk/multica-external}/scripts/multica_ext.py +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"robot-evals.js","sourceRoot":"","sources":["../../src/robot-evals.ts"],"names":[],"mappings":"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","sourcesContent":["// 可复用机器人评测:机器人是稳定资源,connector/workspace/run 是一次性测试实例。\n// 所有真实钉钉动作仍只走 dws;本模块固定前缀、身份、模型、预算、marker、回读与 teardown。\n\nimport {\n cpSync, existsSync, mkdirSync, readFileSync, realpathSync, renameSync, writeFileSync,\n} from 'node:fs'\nimport { createHash, randomUUID } from 'node:crypto'\nimport { dirname, join, relative, resolve } from 'node:path'\nimport { resolvePackageRoot } from './package-root.js'\nimport * as dws from './dws.js'\nimport {\n bindRequiredBasicSkill, relativeBinding, verifyRequiredBasicSkill,\n type OpenCodeSkillBinding,\n} from './opencode-workspace.js'\nimport type { EvalEvidenceExpectation } from './eval-evidence.js'\n\nexport type RobotEvalLane = 'stateless' | 'stateful' | 'role'\n\nexport interface RobotPoolSlot {\n id: string\n appName: string\n name: string\n lane: RobotEvalLane\n unifiedAppId: string\n creationTaskId?: string\n robotClientId: string\n botOpenDingTalkId: string\n workspaceTemplate: string\n channel: 'opencode'\n model: string\n agentMemory: boolean\n}\n\nexport interface RobotPoolSpec {\n $schema: 'dingtalk-agent/robot-pool@1'\n prefix: string\n dws: { profile: string; expectedUserId: string }\n budgets: {\n maxRobots: number\n maxCases: number\n maxTextCharacters: number\n maxWaitSeconds: number\n }\n slots: RobotPoolSlot[]\n}\n\ntype TextExpectation = {\n id: string\n type: 'includesAny' | 'includesAll' | 'excludesAll'\n values: string[]\n gate?: 'safety' | 'quality'\n}\ntype ExactExpectation = {\n id: string; type: 'equals'; value: string; gate?: 'safety' | 'quality'\n}\ntype QuestionExpectation = {\n id: string; type: 'maxQuestions'; max: number; gate?: 'safety' | 'quality'\n}\ntype RegexExpectation = {\n id: string\n type: 'matches' | 'notMatches'\n pattern: string\n flags?: string\n gate?: 'safety' | 'quality'\n}\nexport type RobotEvalExpectation = TextExpectation | ExactExpectation |\n QuestionExpectation | RegexExpectation\n\nexport type AgentEvalScenario = 'host-loading' | 'conversation-contract' |\n 'authority-and-egress' | 'task-lifecycle' | 'memory-and-storage' |\n 'workspace-and-artifacts' | 'platform-reliability'\n\nexport interface RobotEvalComparisonPolicy {\n minimumRunsPerConfiguration: number\n minimumOverallPassRateDelta: number\n minimumImprovedCases: number\n maximumRegressedCases: number\n}\n\nexport interface RobotEvalCase {\n id: string\n category: string\n scenario?: AgentEvalScenario\n risk?: 'safety' | 'reliability' | 'quality'\n lane: RobotEvalLane\n kind?: 'load-probe' | 'behavior'\n capability?: 'agent-body' | 'basic-skill' | 'role-skill' | 'session-memory' |\n 'knowledge' | 'workspace' | 'artifact' | 'platform'\n completionClaim?: 'forbidden' | 'permitted'\n continuationOf?: string\n prompt: string\n expectations: RobotEvalExpectation[]\n execution?: {\n host: 'opencode-only'\n tools: 'none' | 'workspace-read' | 'workspace-write' | 'workspace-write-verify'\n }\n postconditions?: EvalEvidenceExpectation[]\n sourceRefs?: string[]\n manualChecks: string[]\n}\n\nexport interface RobotEvalSuite {\n $schema: 'dingtalk-agent/robot-eval-suite@1'\n id: string\n markerPrefix: string\n evidenceRoot: string\n comparisonPolicy?: RobotEvalComparisonPolicy\n cases: RobotEvalCase[]\n}\n\nexport interface RobotEvalOptions {\n lanes?: RobotEvalLane[]\n live?: boolean\n yes?: boolean\n}\n\ninterface EvalSelection {\n cases: RobotEvalCase[]\n slots: RobotPoolSlot[]\n assignments: Map<string, RobotPoolSlot>\n}\n\ninterface MaterializedRobotWorkspace {\n path: string\n binding: OpenCodeSkillBinding\n packageSourceHash: string\n}\n\nconst sleep = (ms: number) => Atomics.wait(\n new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms,\n)\n\nexport function runRobotEvaluation(\n root: string,\n poolFile: string,\n suiteFile: string,\n options: RobotEvalOptions = {},\n): Record<string, any> {\n const pool = loadRobotPool(root, poolFile)\n const suite = loadRobotEvalSuite(root, suiteFile)\n const selection = selectEvaluation(pool, suite, options.lanes || [])\n const plan = {\n suite: suite.id,\n prefix: pool.prefix,\n lanes: [...new Set(selection.cases.map((item) => item.lane))],\n robots: selection.slots.map((slot) => ({\n id: slot.id, name: slot.name, lane: slot.lane,\n appName: slot.appName,\n channel: slot.channel, model: slot.model, agentMemory: slot.agentMemory,\n workspaceTemplate: slot.workspaceTemplate,\n })),\n cases: selection.cases.map((item) => ({\n id: item.id, category: item.category, lane: item.lane,\n scenario: item.scenario || null, risk: item.risk || null,\n kind: item.kind || 'behavior', capability: item.capability || 'unspecified',\n robot: selection.assignments.get(item.id)!.name,\n continuationOf: item.continuationOf || null,\n })),\n hostContract: {\n host: 'opencode',\n requiredSkill: 'dingtalk-basic-behavior',\n loadStrategy: 'opencode.json#instructions',\n preflightBeforeMessage: true,\n },\n }\n if (!options.live) {\n return {\n $schema: 'dingtalk-agent/robot-eval-plan@1', ready: true,\n sideEffect: false, liveRequired: true, plan,\n }\n }\n if (!options.yes) {\n throw new Error('Robot Eval 会启动 connector 并以当前用户身份真实发消息;必须同时传 --live --yes')\n }\n\n const runId = `robot_eval_${Date.now()}_${randomUUID().slice(0, 8)}`\n const evidencePath = safeInside(root, join(suite.evidenceRoot, runId), false)\n mkdirSync(evidencePath, { recursive: true })\n writeJson(join(evidencePath, 'suite.json'), suite)\n writeJson(join(evidencePath, 'pool.redacted.json'), redactPool(pool))\n writeJson(join(evidencePath, 'plan.json'), plan)\n\n const workspaces = new Map<string, MaterializedRobotWorkspace>()\n const connectorReports: Record<string, any>[] = []\n const teardownReports: Record<string, any>[] = []\n const started: RobotPoolSlot[] = []\n const results: Record<string, any>[] = []\n let fatal: Error | null = null\n\n try {\n // 所有需要的 connector 先启动完成,最多 3 个可同时保持在线;随后才开始发送题目。\n for (const slot of selection.slots) {\n const workspace = materializeWorkspace(root, runId, slot)\n workspaces.set(slot.id, workspace)\n const preflight = process.env.DTA_LAB_FAKE_DWS === '1'\n ? {\n ...relativeBinding(workspace.binding),\n verification: 'static-contract',\n packageSourceHash: workspace.packageSourceHash,\n }\n : {\n ...relativeBinding(verifyRequiredBasicSkill(workspace.binding)),\n verification: 'opencode-resolved',\n packageSourceHash: workspace.packageSourceHash,\n }\n writeJson(join(evidencePath, 'workspaces', `${safeName(slot.id)}.json`), preflight)\n const report = startConnector(pool, slot, workspace.path, preflight)\n connectorReports.push(report)\n started.push(slot)\n }\n writeJson(join(evidencePath, 'connectors.json'), connectorReports)\n\n const orderedCases = [\n ...selection.cases.filter((item) => item.kind === 'load-probe'),\n ...selection.cases.filter((item) => item.kind !== 'load-probe'),\n ]\n for (const testCase of orderedCases) {\n const slot = selection.assignments.get(testCase.id)!\n const result = runCase(pool, suite, testCase, slot, evidencePath)\n results.push(result)\n if (testCase.kind === 'load-probe' && !result.passed) {\n throw new Error(`Basic Skill load probe 失败: case=${testCase.id};后续行为题已中止`)\n }\n }\n } catch (error) {\n fatal = error as Error\n writeJson(join(evidencePath, 'fatal.json'), {\n message: fatal.message, at: new Date().toISOString(),\n })\n } finally {\n for (const slot of [...started].reverse()) {\n teardownReports.push(stopConnector(pool, slot))\n }\n writeJson(join(evidencePath, 'teardown.json'), {\n status: 'complete', connectors: teardownReports,\n stoppedOnly: started.map((slot) => slot.name), completedAt: new Date().toISOString(),\n })\n }\n\n const passedCases = results.filter((item) => item.passed).length\n const selectedLoadProbes = selection.cases.filter((item) => item.kind === 'load-probe')\n const evaluatedLoadProbes = results.filter((item) => item.kind === 'load-probe')\n const loadGate = evaluatedLoadProbes.length === selectedLoadProbes.length &&\n evaluatedLoadProbes.every((item) => item.passed)\n const capabilitySummary = Object.fromEntries(\n [...new Set(results.map((item) => item.capability))].map((capability) => {\n const capabilityResults = results.filter((item) => item.capability === capability)\n return [capability, {\n total: capabilityResults.length,\n passed: capabilityResults.filter((item) => item.passed).length,\n }]\n }),\n )\n const report = {\n $schema: 'dingtalk-agent/robot-eval-report@1',\n passed: !fatal && passedCases === selection.cases.length,\n sideEffect: true,\n runId,\n evidencePath: relative(root, evidencePath).split('\\\\').join('/'),\n plan,\n summary: {\n total: selection.cases.length,\n passed: passedCases,\n failed: selection.cases.length - passedCases,\n platformVisible: results.filter((item) => item.platformVisible).length,\n exactAttributed: results.filter((item) => item.exactAttributed).length,\n loadGate,\n capabilities: capabilitySummary,\n manualReview: 'not-collected',\n },\n results,\n fatal: fatal?.message || null,\n teardown: teardownReports.map((item) => ({ slot: item.slot, stopped: item.stopped })),\n }\n writeJson(join(evidencePath, 'report.json'), report)\n return report\n}\n\nexport function loadRobotPool(root: string, file: string): RobotPoolSpec {\n const value = readJsonFile(safeInside(root, file, true), 'Robot Pool')\n return validatePool(root, value)\n}\n\nexport function loadRobotEvalSuite(root: string, file: string): RobotEvalSuite {\n const value = readJsonFile(safeInside(root, file, true), 'Robot Eval Suite')\n return validateSuite(root, value)\n}\n\nfunction selectEvaluation(\n pool: RobotPoolSpec,\n suite: RobotEvalSuite,\n lanes: RobotEvalLane[],\n): EvalSelection {\n const requested = lanes.length ? new Set(lanes) : new Set(suite.cases.map((item) => item.lane))\n const cases = suite.cases.filter((item) => requested.has(item.lane))\n if (!cases.length) throw new Error('Robot Eval 选择后没有 case')\n const localOnly = cases.filter((item) => item.execution?.host === 'opencode-only')\n if (localOnly.length) {\n throw new Error(`Robot Eval 不执行 opencode-only case: ${localOnly.map((item) => item.id).join(',')}`)\n }\n if (cases.length > pool.budgets.maxCases) {\n throw new Error(`Robot Eval case 超过预算: ${cases.length}/${pool.budgets.maxCases}`)\n }\n const assignments = new Map<string, RobotPoolSlot>()\n const selected = new Map<string, RobotPoolSlot>()\n for (const testCase of cases) {\n const matches = pool.slots.filter((slot) => slot.lane === testCase.lane)\n if (matches.length !== 1) {\n throw new Error(`lane=${testCase.lane} 必须恰好绑定一个机器人,当前 ${matches.length} 个`)\n }\n assignments.set(testCase.id, matches[0])\n selected.set(matches[0].id, matches[0])\n }\n const slots = [...selected.values()]\n if (slots.length > pool.budgets.maxRobots || slots.length > 3) {\n throw new Error(`Robot Eval 同时机器人超过上限: ${slots.length}`)\n }\n return { cases, slots, assignments }\n}\n\nfunction startConnector(\n pool: RobotPoolSpec,\n slot: RobotPoolSlot,\n workspace: string,\n basicSkillLoad: Record<string, unknown>,\n): Record<string, any> {\n const app = dws.run([\n 'dev', 'app', 'get', '--unified-app-id', slot.unifiedAppId,\n ...profileArgs(pool.dws.profile),\n ], { retries: 0 })\n const appJson = JSON.stringify(app)\n if (!appJson.includes(slot.unifiedAppId) || !appJson.includes(slot.appName)) {\n throw new Error(`机器人 ${slot.name} 的 unifiedAppId 无法按应用详情回读`)\n }\n const bot = dws.run([\n 'chat', 'bot', 'find', '--query', slot.name, '--limit', '20',\n ...profileArgs(pool.dws.profile),\n ], { retries: 0 })\n const botJson = JSON.stringify(bot)\n if (!botJson.includes(slot.name) || !botJson.includes(slot.botOpenDingTalkId)) {\n throw new Error(`机器人 ${slot.name} 的 openDingTalkId 无法按名称回读`)\n }\n const before = dws.run([\n 'dev', 'connect', 'status', '--robot-client-id', slot.robotClientId, '--json',\n ...profileArgs(pool.dws.profile),\n ], { allowFail: true, retries: 0 })\n if (connectorHealthy(before)) {\n throw new Error(`机器人 ${slot.name} 已有未知配置的 healthy connector;先显式停止,避免复用错误模型/工作区`)\n }\n let owned = false\n try {\n const start = dws.startConnectDaemon([\n 'dev', 'connect', '--unified-app-id', slot.unifiedAppId,\n '--channel', slot.channel,\n '--agent-model', slot.model,\n '--agent-workdir', workspace,\n '--allowed-users', pool.dws.expectedUserId,\n '--agent-permission-mode', 'ask',\n '--agent-approval-mode', 'ask',\n `--agent-memory=${String(slot.agentMemory)}`,\n '--reply-card=false',\n '--user-rate-limit', '10',\n '--agent-timeout', String(pool.budgets.maxWaitSeconds),\n '--daemon', '--yes',\n ...profileArgs(pool.dws.profile),\n ], { timeout: 60_000 })\n owned = true\n\n const deadline = Date.now() + 30_000\n let status: unknown = null\n while (Date.now() < deadline) {\n status = dws.run([\n 'dev', 'connect', 'status', '--robot-client-id', slot.robotClientId, '--json',\n ...profileArgs(pool.dws.profile),\n ], { allowFail: true, retries: 0 })\n if (connectorHealthy(status)) break\n sleep(1000)\n }\n if (!connectorHealthy(status)) throw new Error(`机器人 ${slot.name} connector 未进入 healthy`)\n return {\n slot: slot.name, lane: slot.lane, channel: slot.channel, model: slot.model,\n agentMemory: slot.agentMemory, workspace, started: Boolean(start), healthy: true,\n basicSkillLoad,\n }\n } catch (error) {\n // daemon 进程一旦由本次 Run 创建,就归本次 Run 所有;即使健康检查失败也要精确回收。\n if (owned) {\n stopConnector(pool, slot)\n }\n throw error\n }\n}\n\nfunction stopConnector(pool: RobotPoolSpec, slot: RobotPoolSlot): Record<string, any> {\n let command: unknown = null\n let error = ''\n try {\n command = dws.stopConnectDaemon([\n 'dev', 'connect', 'stop', '--robot-client-id', slot.robotClientId,\n '--yes', ...profileArgs(pool.dws.profile),\n ])\n } catch (caught) {\n error = String((caught as Error).message || caught)\n }\n const deadline = Date.now() + 10_000\n let status: unknown = null\n while (Date.now() < deadline) {\n status = dws.run([\n 'dev', 'connect', 'status', '--robot-client-id', slot.robotClientId, '--json',\n ...profileArgs(pool.dws.profile),\n ], { allowFail: true, retries: 0 })\n if (connectorNotRunning(status)) break\n sleep(500)\n }\n return {\n slot: slot.name,\n stopped: connectorNotRunning(status),\n commandAccepted: Boolean(command),\n status,\n error: error || null,\n }\n}\n\nfunction runCase(\n pool: RobotPoolSpec,\n suite: RobotEvalSuite,\n testCase: RobotEvalCase,\n slot: RobotPoolSlot,\n evidenceRoot: string,\n): Record<string, any> {\n const uuid = randomUUID()\n const marker = `${suite.markerPrefix}${safeName(suite.id)}-${safeName(testCase.id)}-${uuid}]`\n const outbound = `${marker}\\n评测协议:回复第一行原样保留上面的 marker,不要解释评测协议。\\n${testCase.prompt}`\n if (outbound.length > pool.budgets.maxTextCharacters) {\n throw new Error(`case=${testCase.id} 超过文本预算 ${pool.budgets.maxTextCharacters}`)\n }\n const casePath = join(evidenceRoot, 'cases', safeName(testCase.id))\n mkdirSync(casePath, { recursive: true })\n const startedAt = Date.now()\n writeJson(join(casePath, 'request.json'), {\n case: testCase, robot: slot.name, marker, outbound, uuid, startedAt: new Date(startedAt).toISOString(),\n })\n let send: unknown = null\n let readback: unknown = null\n let reply = ''\n let candidateReply = ''\n let error = ''\n try {\n send = dws.run([\n 'chat', 'message', 'send', '--open-dingtalk-id', slot.botOpenDingTalkId,\n '--text', outbound, '--uuid', uuid, '--yes', ...profileArgs(pool.dws.profile),\n ], { retries: 0 })\n const deadline = Date.now() + pool.budgets.maxWaitSeconds * 1000\n while (Date.now() < deadline) {\n readback = dws.run([\n 'chat', 'message', 'list', '--open-dingtalk-id', slot.botOpenDingTalkId,\n '--time', formatLocalTime(new Date(startedAt - 10_000)),\n '--direction', 'newer', '--limit', '100', ...profileArgs(pool.dws.profile),\n ], { retries: 0 })\n reply = extractReply(readback, marker, outbound)\n if (reply) break\n candidateReply = extractCandidateReply(readback, uuid, outbound)\n if (candidateReply) {\n error = '平台已回收到同 UUID 回复,但 marker 被改写,不能作为本 case 的精确归因证据'\n break\n }\n sleep(3000)\n }\n if (!reply && !candidateReply) {\n error = `等待 ${pool.budgets.maxWaitSeconds}s 未回收到带 marker 的机器人回复`\n }\n } catch (caught) {\n error = String((caught as Error).message || caught)\n }\n const answer = reply\n ? reply.replace(marker, '').trim()\n : stripEvalMarker(candidateReply)\n const grading = gradeAnswer(answer, testCase.expectations)\n const platformVisible = Boolean(reply || candidateReply)\n const exactAttributed = Boolean(reply)\n const attribution = exactAttributed ? 'exact-marker' : candidateReply ? 'marker-mismatch' : 'missing'\n const passed = exactAttributed && grading.every((item) => item.passed)\n const result = {\n id: testCase.id,\n category: testCase.category,\n lane: testCase.lane,\n kind: testCase.kind || 'behavior',\n capability: testCase.capability || 'unspecified',\n robot: slot.name,\n marker,\n platformVisible,\n exactAttributed,\n attribution,\n passed,\n reply: answer,\n grading,\n manualReview: testCase.manualChecks.map((text) => ({ text, status: 'not-collected' })),\n error: error || null,\n durationMs: Date.now() - startedAt,\n }\n writeJson(join(casePath, 'send.json'), send || { status: 'not-sent', error })\n writeJson(join(casePath, 'platform-readback.json'), readback || { status: 'unverified', error })\n writeJson(join(casePath, 'result.json'), result)\n return result\n}\n\nexport function gradeAnswer(\n answer: string,\n expectations: RobotEvalExpectation[],\n): Array<{ id: string; passed: boolean; detail: string }> {\n const normalized = answer.toLocaleLowerCase()\n return expectations.map((expectation) => {\n if (expectation.type === 'equals') {\n return {\n id: expectation.id,\n passed: answer.trim() === expectation.value,\n detail: `equals: actual=${JSON.stringify(answer.trim())}, expected=${JSON.stringify(expectation.value)}`,\n }\n }\n if (expectation.type === 'maxQuestions') {\n const count = (answer.match(/[??]/g) || []).length\n return {\n id: expectation.id, passed: count <= expectation.max,\n detail: `questions=${count}, max=${expectation.max}`,\n }\n }\n if (expectation.type === 'matches' || expectation.type === 'notMatches') {\n const regex = new RegExp(expectation.pattern, expectation.flags || 'u')\n const matched = regex.test(answer)\n return {\n id: expectation.id,\n passed: expectation.type === 'matches' ? matched : !matched,\n detail: `${expectation.type}: pattern=${JSON.stringify(expectation.pattern)}, matched=${matched}`,\n }\n }\n const textExpectation = expectation as TextExpectation\n const values = textExpectation.values.map((value) => value.toLocaleLowerCase())\n const hits = values.filter((value) => normalized.includes(value))\n const passed = textExpectation.type === 'includesAny'\n ? hits.length > 0\n : textExpectation.type === 'includesAll'\n ? hits.length === values.length\n : hits.length === 0\n return {\n id: textExpectation.id, passed,\n detail: `${textExpectation.type}: hits=${JSON.stringify(hits)}, expected=${JSON.stringify(textExpectation.values)}`,\n }\n })\n}\n\nfunction materializeWorkspace(\n root: string,\n runId: string,\n slot: RobotPoolSlot,\n): MaterializedRobotWorkspace {\n const source = safeInside(root, slot.workspaceTemplate, true)\n const destination = safeInside(root,\n join('.dingtalk-agent', 'robot-eval-workspaces', runId, safeName(slot.id)), false)\n mkdirSync(dirname(destination), { recursive: true })\n cpSync(source, destination, { recursive: true, errorOnExist: true })\n const packageRoot = resolvePackageRoot(import.meta.url)\n const basicSource = join(packageRoot, 'skills', 'dingtalk-basic-behavior')\n const basicTarget = join(destination, '.agents', 'skills', 'dingtalk-basic-behavior')\n mkdirSync(dirname(basicTarget), { recursive: true })\n cpSync(basicSource, basicTarget, { recursive: true, errorOnExist: true })\n const binding = bindRequiredBasicSkill(destination)\n const packageSourceHash = createHash('sha256')\n .update(readFileSync(join(basicSource, 'SKILL.md'), 'utf8')).digest('hex')\n if (packageSourceHash !== binding.skill.hash) {\n throw new Error('Robot Eval 物化后的 Basic Skill 与当前 package source hash 不一致')\n }\n return { path: destination, binding, packageSourceHash }\n}\n\nfunction validatePool(root: string, value: unknown): RobotPoolSpec {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('Robot Pool 必须是 JSON object')\n }\n const input = value as Record<string, any>\n if (input.$schema !== 'dingtalk-agent/robot-pool@1') throw new Error('Robot Pool schema 非法')\n if (!String(input.prefix || '').trim()) throw new Error('Robot Pool 缺少 prefix')\n if (!input.dws || typeof input.dws.profile !== 'string' || !String(input.dws.expectedUserId || '').trim()) {\n throw new Error('Robot Pool dws 必须固定 profile 与 expectedUserId')\n }\n const budget = input.budgets || {}\n if (!Number.isInteger(budget.maxRobots) || budget.maxRobots < 1 || budget.maxRobots > 3 ||\n !Number.isInteger(budget.maxCases) || budget.maxCases < 1 || budget.maxCases > 30 ||\n !Number.isInteger(budget.maxTextCharacters) || budget.maxTextCharacters < 1 || budget.maxTextCharacters > 4000 ||\n !Number.isInteger(budget.maxWaitSeconds) || budget.maxWaitSeconds < 10 || budget.maxWaitSeconds > 300) {\n throw new Error('Robot Pool budgets 非法(robots 1..3 / cases 1..30 / text 1..4000 / wait 10..300)')\n }\n if (!Array.isArray(input.slots) || input.slots.length < 1 || input.slots.length > 3) {\n throw new Error('Robot Pool slots 必须为 1..3 个')\n }\n const seen = {\n id: new Set(), name: new Set(), app: new Set(), task: new Set(),\n client: new Set(), bot: new Set(), lane: new Set(),\n }\n for (const slot of input.slots) {\n for (const key of ['id', 'appName', 'name', 'lane', 'unifiedAppId', 'robotClientId', 'botOpenDingTalkId', 'workspaceTemplate', 'channel', 'model']) {\n if (!String(slot?.[key] || '').trim()) throw new Error(`Robot Pool slot 缺少 ${key}`)\n }\n if (!slot.name.startsWith(input.prefix)) throw new Error(`机器人名不符合 prefix: ${slot.name}`)\n if (!['stateless', 'stateful', 'role'].includes(slot.lane)) throw new Error(`机器人 lane 非法: ${slot.lane}`)\n if (slot.channel !== 'opencode') throw new Error(`Robot Eval 只允许 opencode: ${slot.channel}`)\n if (!slot.model.startsWith('deepseek/')) throw new Error(`Robot Eval 模型必须是 deepseek/*: ${slot.model}`)\n if (typeof slot.agentMemory !== 'boolean') throw new Error(`机器人 ${slot.name} 缺少 agentMemory boolean`)\n if (slot.lane === 'stateful' && slot.agentMemory !== true) throw new Error('stateful lane 必须 agentMemory=true')\n if (slot.lane === 'stateless' && slot.agentMemory !== false) throw new Error('stateless lane 必须 agentMemory=false')\n const uniqueKeys = [\n ['id', slot.id], ['name', slot.name],\n ['app', slot.unifiedAppId],\n ...(slot.creationTaskId ? [['task', slot.creationTaskId]] : []),\n ['client', slot.robotClientId], ['bot', slot.botOpenDingTalkId], ['lane', slot.lane],\n ] as Array<[keyof typeof seen, string]>\n for (const [kind, key] of uniqueKeys) {\n if (seen[kind].has(key)) throw new Error(`Robot Pool ${kind} 重复: ${key}`)\n seen[kind].add(key)\n }\n safeInside(root, slot.workspaceTemplate, true)\n }\n return input as RobotPoolSpec\n}\n\nfunction validateSuite(root: string, value: unknown): RobotEvalSuite {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('Robot Eval Suite 必须是 JSON object')\n }\n const input = value as Record<string, any>\n if (input.$schema !== 'dingtalk-agent/robot-eval-suite@1') throw new Error('Robot Eval Suite schema 非法')\n if (!String(input.id || '').trim() || !String(input.markerPrefix || '').startsWith('[DTA-EVAL-')) {\n throw new Error('Robot Eval Suite 缺少 id 或合法 markerPrefix')\n }\n if (!String(input.evidenceRoot || '').trim()) throw new Error('Robot Eval Suite 缺少 evidenceRoot')\n safeInside(root, input.evidenceRoot, false)\n if (input.comparisonPolicy !== undefined) {\n const policy = input.comparisonPolicy\n const keys = policy && typeof policy === 'object' && !Array.isArray(policy)\n ? Object.keys(policy).sort()\n : []\n const expectedKeys = [\n 'maximumRegressedCases', 'minimumImprovedCases',\n 'minimumOverallPassRateDelta', 'minimumRunsPerConfiguration',\n ]\n if (JSON.stringify(keys) !== JSON.stringify(expectedKeys) ||\n !Number.isInteger(policy.minimumRunsPerConfiguration) ||\n policy.minimumRunsPerConfiguration < 3 || policy.minimumRunsPerConfiguration > 10 ||\n typeof policy.minimumOverallPassRateDelta !== 'number' ||\n policy.minimumOverallPassRateDelta <= 0 || policy.minimumOverallPassRateDelta > 1 ||\n !Number.isInteger(policy.minimumImprovedCases) || policy.minimumImprovedCases < 1 ||\n !Number.isInteger(policy.maximumRegressedCases) || policy.maximumRegressedCases < 0) {\n throw new Error('Robot Eval Suite comparisonPolicy 非法')\n }\n }\n if (!Array.isArray(input.cases) || input.cases.length < 1 || input.cases.length > 30) {\n throw new Error('Robot Eval Suite cases 必须为 1..30 个')\n }\n const ids = new Set<string>()\n for (const testCase of input.cases) {\n if (!/^[a-z0-9][a-z0-9._-]*$/.test(testCase?.id || '')) throw new Error(`case id 非法: ${testCase?.id}`)\n if (ids.has(testCase.id)) throw new Error(`case id 重复: ${testCase.id}`)\n ids.add(testCase.id)\n if (!['stateless', 'stateful', 'role'].includes(testCase.lane) || !String(testCase.prompt || '').trim()) {\n throw new Error(`case=${testCase.id} 缺少合法 lane/prompt`)\n }\n if (testCase.kind !== undefined && !['load-probe', 'behavior'].includes(testCase.kind)) {\n throw new Error(`case=${testCase.id} kind 非法`)\n }\n if (testCase.capability !== undefined &&\n !['agent-body', 'basic-skill', 'role-skill', 'session-memory', 'knowledge',\n 'workspace', 'artifact', 'platform'].includes(testCase.capability)) {\n throw new Error(`case=${testCase.id} capability 非法`)\n }\n if (testCase.completionClaim !== undefined &&\n !['forbidden', 'permitted'].includes(testCase.completionClaim)) {\n throw new Error(`case=${testCase.id} completionClaim 非法`)\n }\n if (testCase.scenario !== undefined &&\n !['host-loading', 'conversation-contract', 'authority-and-egress',\n 'task-lifecycle', 'memory-and-storage', 'workspace-and-artifacts',\n 'platform-reliability'].includes(testCase.scenario)) {\n throw new Error(`case=${testCase.id} scenario 非法`)\n }\n if (testCase.risk !== undefined && !['safety', 'reliability', 'quality'].includes(testCase.risk)) {\n throw new Error(`case=${testCase.id} risk 非法`)\n }\n if (testCase.kind === 'load-probe' && testCase.capability !== 'basic-skill') {\n throw new Error(`case=${testCase.id} load-probe 必须归类为 basic-skill`)\n }\n if (!Array.isArray(testCase.expectations) || !testCase.expectations.length ||\n !Array.isArray(testCase.manualChecks)) {\n throw new Error(`case=${testCase.id} 缺少 expectations/manualChecks`)\n }\n if (testCase.execution !== undefined &&\n (testCase.execution.host !== 'opencode-only' ||\n !['none', 'workspace-read', 'workspace-write',\n 'workspace-write-verify'].includes(testCase.execution.tools))) {\n throw new Error(`case=${testCase.id} execution 非法`)\n }\n if (testCase.execution?.tools !== undefined && testCase.execution.tools !== 'none' &&\n (!Array.isArray(testCase.postconditions) || !testCase.postconditions.length)) {\n throw new Error(`case=${testCase.id} 文件工具模式必须声明 postconditions`)\n }\n if (testCase.postconditions !== undefined) {\n if (!Array.isArray(testCase.postconditions) || !testCase.postconditions.length) {\n throw new Error(`case=${testCase.id} postconditions 非法`)\n }\n for (const expectation of testCase.postconditions) {\n validateEvidenceExpectation(testCase.id, expectation)\n }\n }\n if (testCase.sourceRefs !== undefined &&\n (!Array.isArray(testCase.sourceRefs) ||\n testCase.sourceRefs.some((item: unknown) => !String(item || '').trim()))) {\n throw new Error(`case=${testCase.id} sourceRefs 非法`)\n }\n for (const expectation of testCase.expectations) validateExpectation(testCase.id, expectation)\n }\n for (const testCase of input.cases) {\n if (testCase.continuationOf) {\n const parent = input.cases.find((item) => item.id === testCase.continuationOf)\n if (!parent || parent.lane !== testCase.lane || testCase.lane !== 'stateful') {\n throw new Error(`case=${testCase.id} continuationOf 必须指向同一 stateful lane 的已有 case`)\n }\n if (input.cases.indexOf(parent) >= input.cases.indexOf(testCase)) {\n throw new Error(`case=${testCase.id} continuationOf 必须位于当前 case 之前`)\n }\n }\n }\n return input as RobotEvalSuite\n}\n\nfunction validateEvidenceExpectation(caseId: string, expectation: Record<string, any>): void {\n if (!String(expectation?.id || '').trim() ||\n !['filesystem', 'workspace', 'artifact'].includes(expectation?.surface) ||\n !['pathExists', 'pathAbsent', 'textIncludesAll', 'textExcludesAll',\n 'jsonEquals', 'agentDefinition'].includes(expectation?.type)) {\n throw new Error(`case=${caseId} postcondition 非法`)\n }\n if (expectation.type === 'agentDefinition') {\n if (expectation.surface !== 'workspace' || !['ready', 'partial'].includes(expectation.status) ||\n !Array.isArray(expectation.requiredSkills)) {\n throw new Error(`case=${caseId} agentDefinition postcondition 非法`)\n }\n return\n }\n const path = String(expectation.path || '')\n if (!path || resolve('/', path) === path || path.split(/[\\\\/]/).includes('..')) {\n throw new Error(`case=${caseId} postcondition path 必须是安全相对路径`)\n }\n if (expectation.type === 'pathExists') {\n if (expectation.kind !== undefined && !['file', 'directory'].includes(expectation.kind)) {\n throw new Error(`case=${caseId} pathExists.kind 非法`)\n }\n if (expectation.minBytes !== undefined &&\n (!Number.isInteger(expectation.minBytes) || expectation.minBytes < 0)) {\n throw new Error(`case=${caseId} pathExists.minBytes 非法`)\n }\n }\n if (['textIncludesAll', 'textExcludesAll'].includes(expectation.type) &&\n (!Array.isArray(expectation.values) || !expectation.values.length ||\n expectation.values.some((item: unknown) => !String(item || '').trim()))) {\n throw new Error(`case=${caseId} text postcondition values 非法`)\n }\n if (expectation.type === 'jsonEquals' &&\n (typeof expectation.pointer !== 'string' || !expectation.pointer.startsWith('/'))) {\n throw new Error(`case=${caseId} jsonEquals.pointer 非法`)\n }\n}\n\nfunction validateExpectation(caseId: string, expectation: Record<string, any>): void {\n if (!String(expectation?.id || '').trim() ||\n !['includesAny', 'includesAll', 'excludesAll', 'equals', 'maxQuestions',\n 'matches', 'notMatches'].includes(expectation?.type)) {\n throw new Error(`case=${caseId} expectation 非法`)\n }\n if (expectation.gate !== undefined && !['safety', 'quality'].includes(expectation.gate)) {\n throw new Error(`case=${caseId} expectation.gate 非法`)\n }\n if (expectation.type === 'maxQuestions') {\n if (!Number.isInteger(expectation.max) || expectation.max < 0 || expectation.max > 3) {\n throw new Error(`case=${caseId} maxQuestions 非法`)\n }\n } else if (expectation.type === 'equals') {\n if (!String(expectation.value || '').trim()) throw new Error(`case=${caseId} equals.value 非法`)\n } else if (expectation.type === 'matches' || expectation.type === 'notMatches') {\n if (!String(expectation.pattern || '').trim() || expectation.pattern.length > 500 ||\n (expectation.flags !== undefined && !/^(?=[imu]*$)(?!.*(.).*\\1)[imu]*$/.test(expectation.flags))) {\n throw new Error(`case=${caseId} regex expectation 非法`)\n }\n try { new RegExp(expectation.pattern, expectation.flags || 'u') }\n catch { throw new Error(`case=${caseId} regex pattern 无法编译`) }\n } else if (!Array.isArray(expectation.values) || !expectation.values.length ||\n expectation.values.some((item: unknown) => !String(item || '').trim())) {\n throw new Error(`case=${caseId} expectation.values 非法`)\n }\n}\n\nfunction connectorHealthy(value: unknown): boolean {\n return /\"(?:state|status)\"\\s*:\\s*\"healthy\"/i.test(JSON.stringify(value || {}))\n}\n\nfunction connectorNotRunning(value: unknown): boolean {\n return /\"(?:state|status)\"\\s*:\\s*\"not_running\"/i.test(JSON.stringify(value || {}))\n}\n\nfunction extractReply(value: unknown, marker: string, outbound: string): string {\n const strings: string[] = []\n collectStrings(value, strings, 0)\n const unique = [...new Set(strings.map((item) => item.trim()).filter(Boolean))]\n const candidates = unique.filter((item) =>\n item.includes(marker) && item !== outbound && !item.includes('评测协议:') &&\n item.length > marker.length + 1,\n )\n const preferred = candidates.filter((item) => item.startsWith(marker) && !item.startsWith('{'))\n return (preferred.length ? preferred : candidates)\n .sort((a, b) => a.length - b.length)[0] || ''\n}\n\nfunction extractCandidateReply(value: unknown, uuid: string, outbound: string): string {\n const strings: string[] = []\n collectStrings(value, strings, 0)\n const unique = [...new Set(strings.map((item) => item.trim()).filter(Boolean))]\n const candidates = unique.filter((item) =>\n item.includes(uuid) && item !== outbound && !item.includes('评测协议:') &&\n item.length > uuid.length + 1,\n )\n const preferred = candidates.filter((item) => item.startsWith('[DTA-EVAL-') && !item.startsWith('{'))\n return (preferred.length ? preferred : candidates)\n .sort((a, b) => a.length - b.length)[0] || ''\n}\n\nfunction stripEvalMarker(value: string): string {\n return value.replace(/^\\[DTA-EVAL-[^\\]\\n]+\\]\\s*/, '').trim()\n}\n\nfunction collectStrings(value: unknown, output: string[], depth: number): void {\n if (depth > 8 || value === null || value === undefined) return\n if (typeof value === 'string') {\n output.push(value)\n if (depth < 4 && /^[\\s]*[{[]/.test(value)) {\n try { collectStrings(JSON.parse(value), output, depth + 1) } catch { /* plain text */ }\n }\n return\n }\n if (Array.isArray(value)) {\n for (const item of value) collectStrings(item, output, depth + 1)\n return\n }\n if (typeof value === 'object') {\n for (const item of Object.values(value as Record<string, unknown>)) {\n collectStrings(item, output, depth + 1)\n }\n }\n}\n\nfunction formatLocalTime(date: Date): string {\n return new Intl.DateTimeFormat('sv-SE', {\n year: 'numeric', month: '2-digit', day: '2-digit',\n hour: '2-digit', minute: '2-digit', second: '2-digit', hourCycle: 'h23',\n }).format(date)\n}\n\nfunction redactPool(pool: RobotPoolSpec): Record<string, unknown> {\n return {\n ...pool,\n dws: {\n profile: redact(pool.dws.profile),\n expectedUserId: redact(pool.dws.expectedUserId),\n },\n slots: pool.slots.map((slot) => ({\n ...slot,\n unifiedAppId: redact(slot.unifiedAppId),\n creationTaskId: redact(slot.creationTaskId || ''),\n robotClientId: redact(slot.robotClientId),\n botOpenDingTalkId: redact(slot.botOpenDingTalkId),\n })),\n }\n}\n\nfunction redact(value: string): string {\n return value ? `<redacted:${createHash('sha256').update(value).digest('hex').slice(0, 10)}>` : ''\n}\n\nfunction profileArgs(profile: string): string[] {\n return profile ? ['--profile', profile] : []\n}\n\nfunction readJsonFile(path: string, label: string): unknown {\n try { return JSON.parse(readFileSync(path, 'utf8')) }\n catch (error) { throw new Error(`${label} 不是合法 JSON: ${(error as Error).message}`) }\n}\n\nfunction writeJson(path: string, value: unknown): void {\n mkdirSync(dirname(path), { recursive: true })\n const temporary = `${path}.${process.pid}.${Date.now()}.tmp`\n writeFileSync(temporary, JSON.stringify(value, null, 2) + '\\n', { flag: 'wx' })\n renameSync(temporary, path)\n}\n\nfunction safeInside(root: string, path: string, mustExist: boolean): string {\n const rootReal = realpathSync(resolve(root))\n const candidate = resolve(rootReal, path)\n const rel = relative(rootReal, candidate)\n if (rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`)) {\n throw new Error(`Robot Eval 路径必须位于当前目录内: ${path}`)\n }\n if (mustExist && !existsSync(candidate)) throw new Error(`Robot Eval 路径不存在: ${path}`)\n return candidate\n}\n\nfunction safeName(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, '-').replace(/^-+|-+$/g, '') || 'case'\n}\n"]}
|
|
1
|
+
{"version":3,"file":"robot-evals.js","sourceRoot":"","sources":["../../src/robot-evals.ts"],"names":[],"mappings":"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","sourcesContent":["// 可复用机器人评测:机器人是稳定资源,connector/workspace/run 是一次性测试实例。\n// 所有真实钉钉动作仍只走 dws;本模块固定前缀、身份、模型、预算、marker、回读与 teardown。\n\nimport {\n cpSync, existsSync, mkdirSync, readFileSync, realpathSync, renameSync, writeFileSync,\n} from 'node:fs'\nimport { createHash, randomUUID } from 'node:crypto'\nimport { dirname, join, relative, resolve } from 'node:path'\nimport { resolvePackageRoot } from './package-root.js'\nimport * as dws from './dws.js'\nimport {\n bindRequiredBasicSkill, relativeBinding, verifyRequiredBasicSkill,\n type OpenCodeSkillBinding,\n} from './opencode-workspace.js'\nimport type { EvalEvidenceExpectation } from './eval-evidence.js'\nimport { bundledSkillPath } from './skill-manager.js'\n\nexport type RobotEvalLane = 'stateless' | 'stateful' | 'role'\n\nexport interface RobotPoolSlot {\n id: string\n appName: string\n name: string\n lane: RobotEvalLane\n unifiedAppId: string\n creationTaskId?: string\n robotClientId: string\n botOpenDingTalkId: string\n workspaceTemplate: string\n channel: 'opencode'\n model: string\n agentMemory: boolean\n}\n\nexport interface RobotPoolSpec {\n $schema: 'dingtalk-agent/robot-pool@1'\n prefix: string\n dws: { profile: string; expectedUserId: string }\n budgets: {\n maxRobots: number\n maxCases: number\n maxTextCharacters: number\n maxWaitSeconds: number\n }\n slots: RobotPoolSlot[]\n}\n\ntype TextExpectation = {\n id: string\n type: 'includesAny' | 'includesAll' | 'excludesAll'\n values: string[]\n gate?: 'safety' | 'quality'\n}\ntype ExactExpectation = {\n id: string; type: 'equals'; value: string; gate?: 'safety' | 'quality'\n}\ntype QuestionExpectation = {\n id: string; type: 'maxQuestions'; max: number; gate?: 'safety' | 'quality'\n}\ntype RegexExpectation = {\n id: string\n type: 'matches' | 'notMatches'\n pattern: string\n flags?: string\n gate?: 'safety' | 'quality'\n}\nexport type RobotEvalExpectation = TextExpectation | ExactExpectation |\n QuestionExpectation | RegexExpectation\n\nexport type AgentEvalScenario = 'host-loading' | 'conversation-contract' |\n 'authority-and-egress' | 'task-lifecycle' | 'memory-and-storage' |\n 'workspace-and-artifacts' | 'platform-reliability'\n\nexport interface RobotEvalComparisonPolicy {\n minimumRunsPerConfiguration: number\n minimumOverallPassRateDelta: number\n minimumImprovedCases: number\n maximumRegressedCases: number\n}\n\nexport interface RobotEvalCase {\n id: string\n category: string\n scenario?: AgentEvalScenario\n risk?: 'safety' | 'reliability' | 'quality'\n lane: RobotEvalLane\n kind?: 'load-probe' | 'behavior'\n capability?: 'agent-body' | 'basic-skill' | 'role-skill' | 'session-memory' |\n 'knowledge' | 'workspace' | 'artifact' | 'platform'\n completionClaim?: 'forbidden' | 'permitted'\n continuationOf?: string\n prompt: string\n expectations: RobotEvalExpectation[]\n execution?: {\n host: 'opencode-only'\n tools: 'none' | 'workspace-read' | 'workspace-write' | 'workspace-write-verify'\n }\n postconditions?: EvalEvidenceExpectation[]\n sourceRefs?: string[]\n manualChecks: string[]\n}\n\nexport interface RobotEvalSuite {\n $schema: 'dingtalk-agent/robot-eval-suite@1'\n id: string\n markerPrefix: string\n evidenceRoot: string\n comparisonPolicy?: RobotEvalComparisonPolicy\n cases: RobotEvalCase[]\n}\n\nexport interface RobotEvalOptions {\n lanes?: RobotEvalLane[]\n live?: boolean\n yes?: boolean\n}\n\ninterface EvalSelection {\n cases: RobotEvalCase[]\n slots: RobotPoolSlot[]\n assignments: Map<string, RobotPoolSlot>\n}\n\ninterface MaterializedRobotWorkspace {\n path: string\n binding: OpenCodeSkillBinding\n packageSourceHash: string\n}\n\nconst sleep = (ms: number) => Atomics.wait(\n new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms,\n)\n\nexport function runRobotEvaluation(\n root: string,\n poolFile: string,\n suiteFile: string,\n options: RobotEvalOptions = {},\n): Record<string, any> {\n const pool = loadRobotPool(root, poolFile)\n const suite = loadRobotEvalSuite(root, suiteFile)\n const selection = selectEvaluation(pool, suite, options.lanes || [])\n const plan = {\n suite: suite.id,\n prefix: pool.prefix,\n lanes: [...new Set(selection.cases.map((item) => item.lane))],\n robots: selection.slots.map((slot) => ({\n id: slot.id, name: slot.name, lane: slot.lane,\n appName: slot.appName,\n channel: slot.channel, model: slot.model, agentMemory: slot.agentMemory,\n workspaceTemplate: slot.workspaceTemplate,\n })),\n cases: selection.cases.map((item) => ({\n id: item.id, category: item.category, lane: item.lane,\n scenario: item.scenario || null, risk: item.risk || null,\n kind: item.kind || 'behavior', capability: item.capability || 'unspecified',\n robot: selection.assignments.get(item.id)!.name,\n continuationOf: item.continuationOf || null,\n })),\n hostContract: {\n host: 'opencode',\n requiredSkill: 'dingtalk-basic-behavior',\n loadStrategy: 'opencode.json#instructions',\n preflightBeforeMessage: true,\n },\n }\n if (!options.live) {\n return {\n $schema: 'dingtalk-agent/robot-eval-plan@1', ready: true,\n sideEffect: false, liveRequired: true, plan,\n }\n }\n if (!options.yes) {\n throw new Error('Robot Eval 会启动 connector 并以当前用户身份真实发消息;必须同时传 --live --yes')\n }\n\n const runId = `robot_eval_${Date.now()}_${randomUUID().slice(0, 8)}`\n const evidencePath = safeInside(root, join(suite.evidenceRoot, runId), false)\n mkdirSync(evidencePath, { recursive: true })\n writeJson(join(evidencePath, 'suite.json'), suite)\n writeJson(join(evidencePath, 'pool.redacted.json'), redactPool(pool))\n writeJson(join(evidencePath, 'plan.json'), plan)\n\n const workspaces = new Map<string, MaterializedRobotWorkspace>()\n const connectorReports: Record<string, any>[] = []\n const teardownReports: Record<string, any>[] = []\n const started: RobotPoolSlot[] = []\n const results: Record<string, any>[] = []\n let fatal: Error | null = null\n\n try {\n // 所有需要的 connector 先启动完成,最多 3 个可同时保持在线;随后才开始发送题目。\n for (const slot of selection.slots) {\n const workspace = materializeWorkspace(root, runId, slot)\n workspaces.set(slot.id, workspace)\n const preflight = process.env.DTA_LAB_FAKE_DWS === '1'\n ? {\n ...relativeBinding(workspace.binding),\n verification: 'static-contract',\n packageSourceHash: workspace.packageSourceHash,\n }\n : {\n ...relativeBinding(verifyRequiredBasicSkill(workspace.binding)),\n verification: 'opencode-resolved',\n packageSourceHash: workspace.packageSourceHash,\n }\n writeJson(join(evidencePath, 'workspaces', `${safeName(slot.id)}.json`), preflight)\n const report = startConnector(pool, slot, workspace.path, preflight)\n connectorReports.push(report)\n started.push(slot)\n }\n writeJson(join(evidencePath, 'connectors.json'), connectorReports)\n\n const orderedCases = [\n ...selection.cases.filter((item) => item.kind === 'load-probe'),\n ...selection.cases.filter((item) => item.kind !== 'load-probe'),\n ]\n for (const testCase of orderedCases) {\n const slot = selection.assignments.get(testCase.id)!\n const result = runCase(pool, suite, testCase, slot, evidencePath)\n results.push(result)\n if (testCase.kind === 'load-probe' && !result.passed) {\n throw new Error(`Basic Skill load probe 失败: case=${testCase.id};后续行为题已中止`)\n }\n }\n } catch (error) {\n fatal = error as Error\n writeJson(join(evidencePath, 'fatal.json'), {\n message: fatal.message, at: new Date().toISOString(),\n })\n } finally {\n for (const slot of [...started].reverse()) {\n teardownReports.push(stopConnector(pool, slot))\n }\n writeJson(join(evidencePath, 'teardown.json'), {\n status: 'complete', connectors: teardownReports,\n stoppedOnly: started.map((slot) => slot.name), completedAt: new Date().toISOString(),\n })\n }\n\n const passedCases = results.filter((item) => item.passed).length\n const selectedLoadProbes = selection.cases.filter((item) => item.kind === 'load-probe')\n const evaluatedLoadProbes = results.filter((item) => item.kind === 'load-probe')\n const loadGate = evaluatedLoadProbes.length === selectedLoadProbes.length &&\n evaluatedLoadProbes.every((item) => item.passed)\n const capabilitySummary = Object.fromEntries(\n [...new Set(results.map((item) => item.capability))].map((capability) => {\n const capabilityResults = results.filter((item) => item.capability === capability)\n return [capability, {\n total: capabilityResults.length,\n passed: capabilityResults.filter((item) => item.passed).length,\n }]\n }),\n )\n const report = {\n $schema: 'dingtalk-agent/robot-eval-report@1',\n passed: !fatal && passedCases === selection.cases.length,\n sideEffect: true,\n runId,\n evidencePath: relative(root, evidencePath).split('\\\\').join('/'),\n plan,\n summary: {\n total: selection.cases.length,\n passed: passedCases,\n failed: selection.cases.length - passedCases,\n platformVisible: results.filter((item) => item.platformVisible).length,\n exactAttributed: results.filter((item) => item.exactAttributed).length,\n loadGate,\n capabilities: capabilitySummary,\n manualReview: 'not-collected',\n },\n results,\n fatal: fatal?.message || null,\n teardown: teardownReports.map((item) => ({ slot: item.slot, stopped: item.stopped })),\n }\n writeJson(join(evidencePath, 'report.json'), report)\n return report\n}\n\nexport function loadRobotPool(root: string, file: string): RobotPoolSpec {\n const value = readJsonFile(safeInside(root, file, true), 'Robot Pool')\n return validatePool(root, value)\n}\n\nexport function loadRobotEvalSuite(root: string, file: string): RobotEvalSuite {\n const value = readJsonFile(safeInside(root, file, true), 'Robot Eval Suite')\n return validateSuite(root, value)\n}\n\nfunction selectEvaluation(\n pool: RobotPoolSpec,\n suite: RobotEvalSuite,\n lanes: RobotEvalLane[],\n): EvalSelection {\n const requested = lanes.length ? new Set(lanes) : new Set(suite.cases.map((item) => item.lane))\n const cases = suite.cases.filter((item) => requested.has(item.lane))\n if (!cases.length) throw new Error('Robot Eval 选择后没有 case')\n const localOnly = cases.filter((item) => item.execution?.host === 'opencode-only')\n if (localOnly.length) {\n throw new Error(`Robot Eval 不执行 opencode-only case: ${localOnly.map((item) => item.id).join(',')}`)\n }\n if (cases.length > pool.budgets.maxCases) {\n throw new Error(`Robot Eval case 超过预算: ${cases.length}/${pool.budgets.maxCases}`)\n }\n const assignments = new Map<string, RobotPoolSlot>()\n const selected = new Map<string, RobotPoolSlot>()\n for (const testCase of cases) {\n const matches = pool.slots.filter((slot) => slot.lane === testCase.lane)\n if (matches.length !== 1) {\n throw new Error(`lane=${testCase.lane} 必须恰好绑定一个机器人,当前 ${matches.length} 个`)\n }\n assignments.set(testCase.id, matches[0])\n selected.set(matches[0].id, matches[0])\n }\n const slots = [...selected.values()]\n if (slots.length > pool.budgets.maxRobots || slots.length > 3) {\n throw new Error(`Robot Eval 同时机器人超过上限: ${slots.length}`)\n }\n return { cases, slots, assignments }\n}\n\nfunction startConnector(\n pool: RobotPoolSpec,\n slot: RobotPoolSlot,\n workspace: string,\n basicSkillLoad: Record<string, unknown>,\n): Record<string, any> {\n const app = dws.run([\n 'dev', 'app', 'get', '--unified-app-id', slot.unifiedAppId,\n ...profileArgs(pool.dws.profile),\n ], { retries: 0 })\n const appJson = JSON.stringify(app)\n if (!appJson.includes(slot.unifiedAppId) || !appJson.includes(slot.appName)) {\n throw new Error(`机器人 ${slot.name} 的 unifiedAppId 无法按应用详情回读`)\n }\n const bot = dws.run([\n 'chat', 'bot', 'find', '--query', slot.name, '--limit', '20',\n ...profileArgs(pool.dws.profile),\n ], { retries: 0 })\n const botJson = JSON.stringify(bot)\n if (!botJson.includes(slot.name) || !botJson.includes(slot.botOpenDingTalkId)) {\n throw new Error(`机器人 ${slot.name} 的 openDingTalkId 无法按名称回读`)\n }\n const before = dws.run([\n 'dev', 'connect', 'status', '--robot-client-id', slot.robotClientId, '--json',\n ...profileArgs(pool.dws.profile),\n ], { allowFail: true, retries: 0 })\n if (connectorHealthy(before)) {\n throw new Error(`机器人 ${slot.name} 已有未知配置的 healthy connector;先显式停止,避免复用错误模型/工作区`)\n }\n let owned = false\n try {\n const start = dws.startConnectDaemon([\n 'dev', 'connect', '--unified-app-id', slot.unifiedAppId,\n '--channel', slot.channel,\n '--agent-model', slot.model,\n '--agent-workdir', workspace,\n '--allowed-users', pool.dws.expectedUserId,\n '--agent-permission-mode', 'ask',\n '--agent-approval-mode', 'ask',\n `--agent-memory=${String(slot.agentMemory)}`,\n '--reply-card=false',\n '--user-rate-limit', '10',\n '--agent-timeout', String(pool.budgets.maxWaitSeconds),\n '--daemon', '--yes',\n ...profileArgs(pool.dws.profile),\n ], { timeout: 60_000 })\n owned = true\n\n const deadline = Date.now() + 30_000\n let status: unknown = null\n while (Date.now() < deadline) {\n status = dws.run([\n 'dev', 'connect', 'status', '--robot-client-id', slot.robotClientId, '--json',\n ...profileArgs(pool.dws.profile),\n ], { allowFail: true, retries: 0 })\n if (connectorHealthy(status)) break\n sleep(1000)\n }\n if (!connectorHealthy(status)) throw new Error(`机器人 ${slot.name} connector 未进入 healthy`)\n return {\n slot: slot.name, lane: slot.lane, channel: slot.channel, model: slot.model,\n agentMemory: slot.agentMemory, workspace, started: Boolean(start), healthy: true,\n basicSkillLoad,\n }\n } catch (error) {\n // daemon 进程一旦由本次 Run 创建,就归本次 Run 所有;即使健康检查失败也要精确回收。\n if (owned) {\n stopConnector(pool, slot)\n }\n throw error\n }\n}\n\nfunction stopConnector(pool: RobotPoolSpec, slot: RobotPoolSlot): Record<string, any> {\n let command: unknown = null\n let error = ''\n try {\n command = dws.stopConnectDaemon([\n 'dev', 'connect', 'stop', '--robot-client-id', slot.robotClientId,\n '--yes', ...profileArgs(pool.dws.profile),\n ])\n } catch (caught) {\n error = String((caught as Error).message || caught)\n }\n const deadline = Date.now() + 10_000\n let status: unknown = null\n while (Date.now() < deadline) {\n status = dws.run([\n 'dev', 'connect', 'status', '--robot-client-id', slot.robotClientId, '--json',\n ...profileArgs(pool.dws.profile),\n ], { allowFail: true, retries: 0 })\n if (connectorNotRunning(status)) break\n sleep(500)\n }\n return {\n slot: slot.name,\n stopped: connectorNotRunning(status),\n commandAccepted: Boolean(command),\n status,\n error: error || null,\n }\n}\n\nfunction runCase(\n pool: RobotPoolSpec,\n suite: RobotEvalSuite,\n testCase: RobotEvalCase,\n slot: RobotPoolSlot,\n evidenceRoot: string,\n): Record<string, any> {\n const uuid = randomUUID()\n const marker = `${suite.markerPrefix}${safeName(suite.id)}-${safeName(testCase.id)}-${uuid}]`\n const outbound = `${marker}\\n评测协议:回复第一行原样保留上面的 marker,不要解释评测协议。\\n${testCase.prompt}`\n if (outbound.length > pool.budgets.maxTextCharacters) {\n throw new Error(`case=${testCase.id} 超过文本预算 ${pool.budgets.maxTextCharacters}`)\n }\n const casePath = join(evidenceRoot, 'cases', safeName(testCase.id))\n mkdirSync(casePath, { recursive: true })\n const startedAt = Date.now()\n writeJson(join(casePath, 'request.json'), {\n case: testCase, robot: slot.name, marker, outbound, uuid, startedAt: new Date(startedAt).toISOString(),\n })\n let send: unknown = null\n let readback: unknown = null\n let reply = ''\n let candidateReply = ''\n let error = ''\n try {\n send = dws.run([\n 'chat', 'message', 'send', '--open-dingtalk-id', slot.botOpenDingTalkId,\n '--text', outbound, '--uuid', uuid, '--yes', ...profileArgs(pool.dws.profile),\n ], { retries: 0 })\n const deadline = Date.now() + pool.budgets.maxWaitSeconds * 1000\n while (Date.now() < deadline) {\n readback = dws.run([\n 'chat', 'message', 'list', '--open-dingtalk-id', slot.botOpenDingTalkId,\n '--time', formatLocalTime(new Date(startedAt - 10_000)),\n '--direction', 'newer', '--limit', '100', ...profileArgs(pool.dws.profile),\n ], { retries: 0 })\n reply = extractReply(readback, marker, outbound)\n if (reply) break\n candidateReply = extractCandidateReply(readback, uuid, outbound)\n if (candidateReply) {\n error = '平台已回收到同 UUID 回复,但 marker 被改写,不能作为本 case 的精确归因证据'\n break\n }\n sleep(3000)\n }\n if (!reply && !candidateReply) {\n error = `等待 ${pool.budgets.maxWaitSeconds}s 未回收到带 marker 的机器人回复`\n }\n } catch (caught) {\n error = String((caught as Error).message || caught)\n }\n const answer = reply\n ? reply.replace(marker, '').trim()\n : stripEvalMarker(candidateReply)\n const grading = gradeAnswer(answer, testCase.expectations)\n const platformVisible = Boolean(reply || candidateReply)\n const exactAttributed = Boolean(reply)\n const attribution = exactAttributed ? 'exact-marker' : candidateReply ? 'marker-mismatch' : 'missing'\n const passed = exactAttributed && grading.every((item) => item.passed)\n const result = {\n id: testCase.id,\n category: testCase.category,\n lane: testCase.lane,\n kind: testCase.kind || 'behavior',\n capability: testCase.capability || 'unspecified',\n robot: slot.name,\n marker,\n platformVisible,\n exactAttributed,\n attribution,\n passed,\n reply: answer,\n grading,\n manualReview: testCase.manualChecks.map((text) => ({ text, status: 'not-collected' })),\n error: error || null,\n durationMs: Date.now() - startedAt,\n }\n writeJson(join(casePath, 'send.json'), send || { status: 'not-sent', error })\n writeJson(join(casePath, 'platform-readback.json'), readback || { status: 'unverified', error })\n writeJson(join(casePath, 'result.json'), result)\n return result\n}\n\nexport function gradeAnswer(\n answer: string,\n expectations: RobotEvalExpectation[],\n): Array<{ id: string; passed: boolean; detail: string }> {\n const normalized = answer.toLocaleLowerCase()\n return expectations.map((expectation) => {\n if (expectation.type === 'equals') {\n return {\n id: expectation.id,\n passed: answer.trim() === expectation.value,\n detail: `equals: actual=${JSON.stringify(answer.trim())}, expected=${JSON.stringify(expectation.value)}`,\n }\n }\n if (expectation.type === 'maxQuestions') {\n const count = (answer.match(/[??]/g) || []).length\n return {\n id: expectation.id, passed: count <= expectation.max,\n detail: `questions=${count}, max=${expectation.max}`,\n }\n }\n if (expectation.type === 'matches' || expectation.type === 'notMatches') {\n const regex = new RegExp(expectation.pattern, expectation.flags || 'u')\n const matched = regex.test(answer)\n return {\n id: expectation.id,\n passed: expectation.type === 'matches' ? matched : !matched,\n detail: `${expectation.type}: pattern=${JSON.stringify(expectation.pattern)}, matched=${matched}`,\n }\n }\n const textExpectation = expectation as TextExpectation\n const values = textExpectation.values.map((value) => value.toLocaleLowerCase())\n const hits = values.filter((value) => normalized.includes(value))\n const passed = textExpectation.type === 'includesAny'\n ? hits.length > 0\n : textExpectation.type === 'includesAll'\n ? hits.length === values.length\n : hits.length === 0\n return {\n id: textExpectation.id, passed,\n detail: `${textExpectation.type}: hits=${JSON.stringify(hits)}, expected=${JSON.stringify(textExpectation.values)}`,\n }\n })\n}\n\nfunction materializeWorkspace(\n root: string,\n runId: string,\n slot: RobotPoolSlot,\n): MaterializedRobotWorkspace {\n const source = safeInside(root, slot.workspaceTemplate, true)\n const destination = safeInside(root,\n join('.dingtalk-agent', 'robot-eval-workspaces', runId, safeName(slot.id)), false)\n mkdirSync(dirname(destination), { recursive: true })\n cpSync(source, destination, { recursive: true, errorOnExist: true })\n const packageRoot = resolvePackageRoot(import.meta.url)\n const basicSource = bundledSkillPath(packageRoot, 'dingtalk-basic-behavior')\n const basicTarget = join(destination, '.agents', 'skills', 'dingtalk-basic-behavior')\n mkdirSync(dirname(basicTarget), { recursive: true })\n cpSync(basicSource, basicTarget, { recursive: true, errorOnExist: true })\n const binding = bindRequiredBasicSkill(destination)\n const packageSourceHash = createHash('sha256')\n .update(readFileSync(join(basicSource, 'SKILL.md'), 'utf8')).digest('hex')\n if (packageSourceHash !== binding.skill.hash) {\n throw new Error('Robot Eval 物化后的 Basic Skill 与当前 package source hash 不一致')\n }\n return { path: destination, binding, packageSourceHash }\n}\n\nfunction validatePool(root: string, value: unknown): RobotPoolSpec {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('Robot Pool 必须是 JSON object')\n }\n const input = value as Record<string, any>\n if (input.$schema !== 'dingtalk-agent/robot-pool@1') throw new Error('Robot Pool schema 非法')\n if (!String(input.prefix || '').trim()) throw new Error('Robot Pool 缺少 prefix')\n if (!input.dws || typeof input.dws.profile !== 'string' || !String(input.dws.expectedUserId || '').trim()) {\n throw new Error('Robot Pool dws 必须固定 profile 与 expectedUserId')\n }\n const budget = input.budgets || {}\n if (!Number.isInteger(budget.maxRobots) || budget.maxRobots < 1 || budget.maxRobots > 3 ||\n !Number.isInteger(budget.maxCases) || budget.maxCases < 1 || budget.maxCases > 30 ||\n !Number.isInteger(budget.maxTextCharacters) || budget.maxTextCharacters < 1 || budget.maxTextCharacters > 4000 ||\n !Number.isInteger(budget.maxWaitSeconds) || budget.maxWaitSeconds < 10 || budget.maxWaitSeconds > 300) {\n throw new Error('Robot Pool budgets 非法(robots 1..3 / cases 1..30 / text 1..4000 / wait 10..300)')\n }\n if (!Array.isArray(input.slots) || input.slots.length < 1 || input.slots.length > 3) {\n throw new Error('Robot Pool slots 必须为 1..3 个')\n }\n const seen = {\n id: new Set(), name: new Set(), app: new Set(), task: new Set(),\n client: new Set(), bot: new Set(), lane: new Set(),\n }\n for (const slot of input.slots) {\n for (const key of ['id', 'appName', 'name', 'lane', 'unifiedAppId', 'robotClientId', 'botOpenDingTalkId', 'workspaceTemplate', 'channel', 'model']) {\n if (!String(slot?.[key] || '').trim()) throw new Error(`Robot Pool slot 缺少 ${key}`)\n }\n if (!slot.name.startsWith(input.prefix)) throw new Error(`机器人名不符合 prefix: ${slot.name}`)\n if (!['stateless', 'stateful', 'role'].includes(slot.lane)) throw new Error(`机器人 lane 非法: ${slot.lane}`)\n if (slot.channel !== 'opencode') throw new Error(`Robot Eval 只允许 opencode: ${slot.channel}`)\n if (!slot.model.startsWith('deepseek/')) throw new Error(`Robot Eval 模型必须是 deepseek/*: ${slot.model}`)\n if (typeof slot.agentMemory !== 'boolean') throw new Error(`机器人 ${slot.name} 缺少 agentMemory boolean`)\n if (slot.lane === 'stateful' && slot.agentMemory !== true) throw new Error('stateful lane 必须 agentMemory=true')\n if (slot.lane === 'stateless' && slot.agentMemory !== false) throw new Error('stateless lane 必须 agentMemory=false')\n const uniqueKeys = [\n ['id', slot.id], ['name', slot.name],\n ['app', slot.unifiedAppId],\n ...(slot.creationTaskId ? [['task', slot.creationTaskId]] : []),\n ['client', slot.robotClientId], ['bot', slot.botOpenDingTalkId], ['lane', slot.lane],\n ] as Array<[keyof typeof seen, string]>\n for (const [kind, key] of uniqueKeys) {\n if (seen[kind].has(key)) throw new Error(`Robot Pool ${kind} 重复: ${key}`)\n seen[kind].add(key)\n }\n safeInside(root, slot.workspaceTemplate, true)\n }\n return input as RobotPoolSpec\n}\n\nfunction validateSuite(root: string, value: unknown): RobotEvalSuite {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('Robot Eval Suite 必须是 JSON object')\n }\n const input = value as Record<string, any>\n if (input.$schema !== 'dingtalk-agent/robot-eval-suite@1') throw new Error('Robot Eval Suite schema 非法')\n if (!String(input.id || '').trim() || !String(input.markerPrefix || '').startsWith('[DTA-EVAL-')) {\n throw new Error('Robot Eval Suite 缺少 id 或合法 markerPrefix')\n }\n if (!String(input.evidenceRoot || '').trim()) throw new Error('Robot Eval Suite 缺少 evidenceRoot')\n safeInside(root, input.evidenceRoot, false)\n if (input.comparisonPolicy !== undefined) {\n const policy = input.comparisonPolicy\n const keys = policy && typeof policy === 'object' && !Array.isArray(policy)\n ? Object.keys(policy).sort()\n : []\n const expectedKeys = [\n 'maximumRegressedCases', 'minimumImprovedCases',\n 'minimumOverallPassRateDelta', 'minimumRunsPerConfiguration',\n ]\n if (JSON.stringify(keys) !== JSON.stringify(expectedKeys) ||\n !Number.isInteger(policy.minimumRunsPerConfiguration) ||\n policy.minimumRunsPerConfiguration < 3 || policy.minimumRunsPerConfiguration > 10 ||\n typeof policy.minimumOverallPassRateDelta !== 'number' ||\n policy.minimumOverallPassRateDelta <= 0 || policy.minimumOverallPassRateDelta > 1 ||\n !Number.isInteger(policy.minimumImprovedCases) || policy.minimumImprovedCases < 1 ||\n !Number.isInteger(policy.maximumRegressedCases) || policy.maximumRegressedCases < 0) {\n throw new Error('Robot Eval Suite comparisonPolicy 非法')\n }\n }\n if (!Array.isArray(input.cases) || input.cases.length < 1 || input.cases.length > 30) {\n throw new Error('Robot Eval Suite cases 必须为 1..30 个')\n }\n const ids = new Set<string>()\n for (const testCase of input.cases) {\n if (!/^[a-z0-9][a-z0-9._-]*$/.test(testCase?.id || '')) throw new Error(`case id 非法: ${testCase?.id}`)\n if (ids.has(testCase.id)) throw new Error(`case id 重复: ${testCase.id}`)\n ids.add(testCase.id)\n if (!['stateless', 'stateful', 'role'].includes(testCase.lane) || !String(testCase.prompt || '').trim()) {\n throw new Error(`case=${testCase.id} 缺少合法 lane/prompt`)\n }\n if (testCase.kind !== undefined && !['load-probe', 'behavior'].includes(testCase.kind)) {\n throw new Error(`case=${testCase.id} kind 非法`)\n }\n if (testCase.capability !== undefined &&\n !['agent-body', 'basic-skill', 'role-skill', 'session-memory', 'knowledge',\n 'workspace', 'artifact', 'platform'].includes(testCase.capability)) {\n throw new Error(`case=${testCase.id} capability 非法`)\n }\n if (testCase.completionClaim !== undefined &&\n !['forbidden', 'permitted'].includes(testCase.completionClaim)) {\n throw new Error(`case=${testCase.id} completionClaim 非法`)\n }\n if (testCase.scenario !== undefined &&\n !['host-loading', 'conversation-contract', 'authority-and-egress',\n 'task-lifecycle', 'memory-and-storage', 'workspace-and-artifacts',\n 'platform-reliability'].includes(testCase.scenario)) {\n throw new Error(`case=${testCase.id} scenario 非法`)\n }\n if (testCase.risk !== undefined && !['safety', 'reliability', 'quality'].includes(testCase.risk)) {\n throw new Error(`case=${testCase.id} risk 非法`)\n }\n if (testCase.kind === 'load-probe' && testCase.capability !== 'basic-skill') {\n throw new Error(`case=${testCase.id} load-probe 必须归类为 basic-skill`)\n }\n if (!Array.isArray(testCase.expectations) || !testCase.expectations.length ||\n !Array.isArray(testCase.manualChecks)) {\n throw new Error(`case=${testCase.id} 缺少 expectations/manualChecks`)\n }\n if (testCase.execution !== undefined &&\n (testCase.execution.host !== 'opencode-only' ||\n !['none', 'workspace-read', 'workspace-write',\n 'workspace-write-verify'].includes(testCase.execution.tools))) {\n throw new Error(`case=${testCase.id} execution 非法`)\n }\n if (testCase.execution?.tools !== undefined && testCase.execution.tools !== 'none' &&\n (!Array.isArray(testCase.postconditions) || !testCase.postconditions.length)) {\n throw new Error(`case=${testCase.id} 文件工具模式必须声明 postconditions`)\n }\n if (testCase.postconditions !== undefined) {\n if (!Array.isArray(testCase.postconditions) || !testCase.postconditions.length) {\n throw new Error(`case=${testCase.id} postconditions 非法`)\n }\n for (const expectation of testCase.postconditions) {\n validateEvidenceExpectation(testCase.id, expectation)\n }\n }\n if (testCase.sourceRefs !== undefined &&\n (!Array.isArray(testCase.sourceRefs) ||\n testCase.sourceRefs.some((item: unknown) => !String(item || '').trim()))) {\n throw new Error(`case=${testCase.id} sourceRefs 非法`)\n }\n for (const expectation of testCase.expectations) validateExpectation(testCase.id, expectation)\n }\n for (const testCase of input.cases) {\n if (testCase.continuationOf) {\n const parent = input.cases.find((item) => item.id === testCase.continuationOf)\n if (!parent || parent.lane !== testCase.lane || testCase.lane !== 'stateful') {\n throw new Error(`case=${testCase.id} continuationOf 必须指向同一 stateful lane 的已有 case`)\n }\n if (input.cases.indexOf(parent) >= input.cases.indexOf(testCase)) {\n throw new Error(`case=${testCase.id} continuationOf 必须位于当前 case 之前`)\n }\n }\n }\n return input as RobotEvalSuite\n}\n\nfunction validateEvidenceExpectation(caseId: string, expectation: Record<string, any>): void {\n if (!String(expectation?.id || '').trim() ||\n !['filesystem', 'workspace', 'artifact'].includes(expectation?.surface) ||\n !['pathExists', 'pathAbsent', 'textIncludesAll', 'textExcludesAll',\n 'jsonEquals', 'agentDefinition'].includes(expectation?.type)) {\n throw new Error(`case=${caseId} postcondition 非法`)\n }\n if (expectation.type === 'agentDefinition') {\n if (expectation.surface !== 'workspace' || !['ready', 'partial'].includes(expectation.status) ||\n !Array.isArray(expectation.requiredSkills)) {\n throw new Error(`case=${caseId} agentDefinition postcondition 非法`)\n }\n return\n }\n const path = String(expectation.path || '')\n if (!path || resolve('/', path) === path || path.split(/[\\\\/]/).includes('..')) {\n throw new Error(`case=${caseId} postcondition path 必须是安全相对路径`)\n }\n if (expectation.type === 'pathExists') {\n if (expectation.kind !== undefined && !['file', 'directory'].includes(expectation.kind)) {\n throw new Error(`case=${caseId} pathExists.kind 非法`)\n }\n if (expectation.minBytes !== undefined &&\n (!Number.isInteger(expectation.minBytes) || expectation.minBytes < 0)) {\n throw new Error(`case=${caseId} pathExists.minBytes 非法`)\n }\n }\n if (['textIncludesAll', 'textExcludesAll'].includes(expectation.type) &&\n (!Array.isArray(expectation.values) || !expectation.values.length ||\n expectation.values.some((item: unknown) => !String(item || '').trim()))) {\n throw new Error(`case=${caseId} text postcondition values 非法`)\n }\n if (expectation.type === 'jsonEquals' &&\n (typeof expectation.pointer !== 'string' || !expectation.pointer.startsWith('/'))) {\n throw new Error(`case=${caseId} jsonEquals.pointer 非法`)\n }\n}\n\nfunction validateExpectation(caseId: string, expectation: Record<string, any>): void {\n if (!String(expectation?.id || '').trim() ||\n !['includesAny', 'includesAll', 'excludesAll', 'equals', 'maxQuestions',\n 'matches', 'notMatches'].includes(expectation?.type)) {\n throw new Error(`case=${caseId} expectation 非法`)\n }\n if (expectation.gate !== undefined && !['safety', 'quality'].includes(expectation.gate)) {\n throw new Error(`case=${caseId} expectation.gate 非法`)\n }\n if (expectation.type === 'maxQuestions') {\n if (!Number.isInteger(expectation.max) || expectation.max < 0 || expectation.max > 3) {\n throw new Error(`case=${caseId} maxQuestions 非法`)\n }\n } else if (expectation.type === 'equals') {\n if (!String(expectation.value || '').trim()) throw new Error(`case=${caseId} equals.value 非法`)\n } else if (expectation.type === 'matches' || expectation.type === 'notMatches') {\n if (!String(expectation.pattern || '').trim() || expectation.pattern.length > 500 ||\n (expectation.flags !== undefined && !/^(?=[imu]*$)(?!.*(.).*\\1)[imu]*$/.test(expectation.flags))) {\n throw new Error(`case=${caseId} regex expectation 非法`)\n }\n try { new RegExp(expectation.pattern, expectation.flags || 'u') }\n catch { throw new Error(`case=${caseId} regex pattern 无法编译`) }\n } else if (!Array.isArray(expectation.values) || !expectation.values.length ||\n expectation.values.some((item: unknown) => !String(item || '').trim())) {\n throw new Error(`case=${caseId} expectation.values 非法`)\n }\n}\n\nfunction connectorHealthy(value: unknown): boolean {\n return /\"(?:state|status)\"\\s*:\\s*\"healthy\"/i.test(JSON.stringify(value || {}))\n}\n\nfunction connectorNotRunning(value: unknown): boolean {\n return /\"(?:state|status)\"\\s*:\\s*\"not_running\"/i.test(JSON.stringify(value || {}))\n}\n\nfunction extractReply(value: unknown, marker: string, outbound: string): string {\n const strings: string[] = []\n collectStrings(value, strings, 0)\n const unique = [...new Set(strings.map((item) => item.trim()).filter(Boolean))]\n const candidates = unique.filter((item) =>\n item.includes(marker) && item !== outbound && !item.includes('评测协议:') &&\n item.length > marker.length + 1,\n )\n const preferred = candidates.filter((item) => item.startsWith(marker) && !item.startsWith('{'))\n return (preferred.length ? preferred : candidates)\n .sort((a, b) => a.length - b.length)[0] || ''\n}\n\nfunction extractCandidateReply(value: unknown, uuid: string, outbound: string): string {\n const strings: string[] = []\n collectStrings(value, strings, 0)\n const unique = [...new Set(strings.map((item) => item.trim()).filter(Boolean))]\n const candidates = unique.filter((item) =>\n item.includes(uuid) && item !== outbound && !item.includes('评测协议:') &&\n item.length > uuid.length + 1,\n )\n const preferred = candidates.filter((item) => item.startsWith('[DTA-EVAL-') && !item.startsWith('{'))\n return (preferred.length ? preferred : candidates)\n .sort((a, b) => a.length - b.length)[0] || ''\n}\n\nfunction stripEvalMarker(value: string): string {\n return value.replace(/^\\[DTA-EVAL-[^\\]\\n]+\\]\\s*/, '').trim()\n}\n\nfunction collectStrings(value: unknown, output: string[], depth: number): void {\n if (depth > 8 || value === null || value === undefined) return\n if (typeof value === 'string') {\n output.push(value)\n if (depth < 4 && /^[\\s]*[{[]/.test(value)) {\n try { collectStrings(JSON.parse(value), output, depth + 1) } catch { /* plain text */ }\n }\n return\n }\n if (Array.isArray(value)) {\n for (const item of value) collectStrings(item, output, depth + 1)\n return\n }\n if (typeof value === 'object') {\n for (const item of Object.values(value as Record<string, unknown>)) {\n collectStrings(item, output, depth + 1)\n }\n }\n}\n\nfunction formatLocalTime(date: Date): string {\n return new Intl.DateTimeFormat('sv-SE', {\n year: 'numeric', month: '2-digit', day: '2-digit',\n hour: '2-digit', minute: '2-digit', second: '2-digit', hourCycle: 'h23',\n }).format(date)\n}\n\nfunction redactPool(pool: RobotPoolSpec): Record<string, unknown> {\n return {\n ...pool,\n dws: {\n profile: redact(pool.dws.profile),\n expectedUserId: redact(pool.dws.expectedUserId),\n },\n slots: pool.slots.map((slot) => ({\n ...slot,\n unifiedAppId: redact(slot.unifiedAppId),\n creationTaskId: redact(slot.creationTaskId || ''),\n robotClientId: redact(slot.robotClientId),\n botOpenDingTalkId: redact(slot.botOpenDingTalkId),\n })),\n }\n}\n\nfunction redact(value: string): string {\n return value ? `<redacted:${createHash('sha256').update(value).digest('hex').slice(0, 10)}>` : ''\n}\n\nfunction profileArgs(profile: string): string[] {\n return profile ? ['--profile', profile] : []\n}\n\nfunction readJsonFile(path: string, label: string): unknown {\n try { return JSON.parse(readFileSync(path, 'utf8')) }\n catch (error) { throw new Error(`${label} 不是合法 JSON: ${(error as Error).message}`) }\n}\n\nfunction writeJson(path: string, value: unknown): void {\n mkdirSync(dirname(path), { recursive: true })\n const temporary = `${path}.${process.pid}.${Date.now()}.tmp`\n writeFileSync(temporary, JSON.stringify(value, null, 2) + '\\n', { flag: 'wx' })\n renameSync(temporary, path)\n}\n\nfunction safeInside(root: string, path: string, mustExist: boolean): string {\n const rootReal = realpathSync(resolve(root))\n const candidate = resolve(rootReal, path)\n const rel = relative(rootReal, candidate)\n if (rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`)) {\n throw new Error(`Robot Eval 路径必须位于当前目录内: ${path}`)\n }\n if (mustExist && !existsSync(candidate)) throw new Error(`Robot Eval 路径不存在: ${path}`)\n return candidate\n}\n\nfunction safeName(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, '-').replace(/^-+|-+$/g, '') || 'case'\n}\n"]}
|
|
@@ -7,12 +7,26 @@ import { dirname, join, resolve } from 'node:path';
|
|
|
7
7
|
import { spawnSync } from 'node:child_process';
|
|
8
8
|
export const GLOBAL_SKILL_NAME = 'dingtalk-basic-behavior';
|
|
9
9
|
// 默认套装:所有机器都装的通用 Skill。平台 Skill(deploy/boot-multica 等)不在默认套装内,
|
|
10
|
-
// 只有工作区通过 `dta
|
|
10
|
+
// 只有工作区通过 `dta agent-platform use` 选择对应 managed agent platform 时才按名安装。
|
|
11
11
|
export const BUNDLED_SKILL_NAMES = [GLOBAL_SKILL_NAME, 'dingtalk-agent-compose'];
|
|
12
12
|
export const INSTALLABLE_SKILL_NAMES = [
|
|
13
13
|
...BUNDLED_SKILL_NAMES,
|
|
14
|
-
'dingtalk-agent-deploy', 'dingtalk-agent-boot-multica', 'multica-
|
|
14
|
+
'dingtalk-agent-deploy-multica', 'dingtalk-agent-boot-multica', 'multica-external',
|
|
15
15
|
];
|
|
16
|
+
// 仓库/包内的 Skill 源码路径注册表:core 为通用套装,platforms/<platform> 按平台装填。
|
|
17
|
+
// 安装后的 canonical 布局仍是扁平的 ~/.agents/skills/<name>;分层只存在于包内。
|
|
18
|
+
const BUNDLED_SKILL_DIRS = {
|
|
19
|
+
'dingtalk-basic-behavior': 'skills/core/dingtalk-basic-behavior',
|
|
20
|
+
'dingtalk-agent-compose': 'skills/core/dingtalk-agent-compose',
|
|
21
|
+
'dingtalk-agent-eval': 'skills/core/dingtalk-agent-eval',
|
|
22
|
+
'dingtalk-agent-deploy-multica': 'skills/platforms/multica-dingtalk/dingtalk-agent-deploy-multica',
|
|
23
|
+
'dingtalk-agent-boot-multica': 'skills/platforms/multica-dingtalk/dingtalk-agent-boot-multica',
|
|
24
|
+
'multica-external': 'skills/platforms/multica-dingtalk/multica-external',
|
|
25
|
+
};
|
|
26
|
+
/** 解析包内 Skill 源码目录;未注册的名字回退到历史扁平布局。 */
|
|
27
|
+
export function bundledSkillPath(packageRoot, name) {
|
|
28
|
+
return join(packageRoot, BUNDLED_SKILL_DIRS[name] || join('skills', name));
|
|
29
|
+
}
|
|
16
30
|
const SKILLS_PACKAGE = 'skills@latest';
|
|
17
31
|
const REGISTRY = 'https://registry.npmjs.org';
|
|
18
32
|
const AGENTS = ['claude-code', 'codex', 'opencode'];
|
|
@@ -128,7 +142,7 @@ function runSkills(packageRoot, action, args, options) {
|
|
|
128
142
|
}
|
|
129
143
|
function globalPaths(packageRoot, home = homedir(), name = GLOBAL_SKILL_NAME) {
|
|
130
144
|
return {
|
|
131
|
-
source:
|
|
145
|
+
source: bundledSkillPath(packageRoot, name),
|
|
132
146
|
canonical: join(home, '.agents', 'skills', name),
|
|
133
147
|
claude: join(home, '.claude', 'skills', name),
|
|
134
148
|
};
|
|
@@ -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 map use` 选择对应 managed agents 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', 'dingtalk-agent-boot-multica', 'multica-fde-external',\n] as const\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: join(packageRoot, 'skills', 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, 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"]}
|
package/dist/src/skills.js
CHANGED
|
@@ -5,6 +5,7 @@ import { homedir } from 'node:os';
|
|
|
5
5
|
import { basename, dirname, join, relative, resolve } from 'node:path';
|
|
6
6
|
import { digest, stableStringify } from './events.js';
|
|
7
7
|
import { resolvePackageRoot } from './package-root.js';
|
|
8
|
+
import { bundledSkillPath } from './skill-manager.js';
|
|
8
9
|
const PACKAGE_ROOT = resolvePackageRoot(import.meta.url);
|
|
9
10
|
const INSTALL_MARKER = '.dingtalk-agent-install.json';
|
|
10
11
|
export function snapshotSkills(root, runPath, sources, sessionPath) {
|
|
@@ -163,7 +164,7 @@ function resolveSkillSource(rootReal, sourceSpec) {
|
|
|
163
164
|
[`global:${spec}`, join(homedir(), '.agents', 'skills', spec)],
|
|
164
165
|
[`claude:${spec}`, join(homedir(), '.claude', 'skills', spec)],
|
|
165
166
|
[`legacy-codex:${spec}`, join(homedir(), '.codex', 'skills', spec)],
|
|
166
|
-
[`bundled:${spec}`,
|
|
167
|
+
[`bundled:${spec}`, bundledSkillPath(PACKAGE_ROOT, spec)],
|
|
167
168
|
];
|
|
168
169
|
for (const [label, candidate] of candidates) {
|
|
169
170
|
if (!existsSync(candidate) || !lstatSync(candidate).isDirectory())
|