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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/README.en.md +10 -5
  3. package/README.md +10 -5
  4. package/dist/bin/dingtalk-agent.js +16 -5
  5. package/dist/bin/dingtalk-agent.js.map +1 -1
  6. package/dist/src/agent-audit.js +69 -55
  7. package/dist/src/agent-audit.js.map +1 -1
  8. package/dist/src/agent-enhance.js +49 -30
  9. package/dist/src/agent-enhance.js.map +1 -1
  10. package/dist/src/agent-platform.js +0 -1
  11. package/dist/src/agent-platform.js.map +1 -1
  12. package/dist/src/bootstrap.js +6 -2
  13. package/dist/src/bootstrap.js.map +1 -1
  14. package/dist/src/development-workspace.js +67 -23
  15. package/dist/src/development-workspace.js.map +1 -1
  16. package/dist/src/doctor.js +6 -1
  17. package/dist/src/doctor.js.map +1 -1
  18. package/dist/src/multica-deploy.js +287 -54
  19. package/dist/src/multica-deploy.js.map +1 -1
  20. package/dist/src/multica-provider.js +1 -2
  21. package/dist/src/multica-provider.js.map +1 -1
  22. package/dist/src/opencode-provider.js +20 -6
  23. package/dist/src/opencode-provider.js.map +1 -1
  24. package/dist/src/skill-manager.js +2 -3
  25. package/dist/src/skill-manager.js.map +1 -1
  26. package/dist/src/skills.js +2 -0
  27. package/dist/src/skills.js.map +1 -1
  28. package/dist/src/workspace.js +11 -6
  29. package/dist/src/workspace.js.map +1 -1
  30. package/docs/ARCHITECTURE.md +22 -7
  31. package/docs/INSTALLATION.md +1 -1
  32. package/docs/schemas/multica-deployment-receipt.schema.json +2 -2
  33. package/docs/schemas/multica-workspace-run-plan.schema.json +31 -0
  34. package/docs/schemas/multica-workspace-run.schema.json +44 -0
  35. package/docs/schemas/project.schema.json +15 -2
  36. package/examples/agents/README.md +8 -6
  37. package/examples/agents/fde-coach/AGENTS.md +2 -34
  38. package/examples/agents/fde-coach/agent/AGENTS.md +35 -0
  39. package/examples/agents/fde-coach/agent.bindings.json +10 -0
  40. package/examples/agents/release-manager/AGENTS.md +2 -34
  41. package/examples/agents/release-manager/agent/AGENTS.md +35 -0
  42. package/examples/agents/release-manager/agent.bindings.json +10 -0
  43. package/lab/project-workspace/fake-multica-provider.mjs +62 -14
  44. package/lab/project-workspace/multica-readonly.fixture.json +0 -12
  45. package/lab/project-workspace/project.fixture.json +0 -4
  46. package/lab/robot-eval/suite.json +1 -1
  47. package/package.json +1 -2
  48. package/skills/README.md +0 -1
  49. package/skills/core/dingtalk-agent-compose/SKILL.md +23 -17
  50. package/skills/core/dingtalk-agent-compose/assets/AGENTS.template.md +1 -1
  51. package/skills/core/dingtalk-agent-compose/assets/REPOSITORY.template.md +10 -0
  52. package/skills/core/dingtalk-agent-compose/assets/agent.bindings.dingtalk-doc.template.json +2 -2
  53. package/skills/core/dingtalk-agent-compose/assets/agent.bindings.local.template.json +2 -2
  54. package/skills/core/dingtalk-agent-compose/assets/hosts/opencode/opencode.template.json +2 -1
  55. package/skills/core/dingtalk-agent-compose/evals/evals.json +1 -1
  56. package/skills/core/dingtalk-agent-compose/references/agent-definition-contract.md +7 -7
  57. package/skills/core/dingtalk-agent-compose/references/host-loading-contract.md +10 -12
  58. package/skills/core/dingtalk-agent-compose/references/hosts/claude-code.md +13 -12
  59. package/skills/core/dingtalk-agent-compose/references/hosts/opencode.md +13 -12
  60. package/skills/core/dingtalk-agent-eval/SKILL.md +1 -1
  61. package/skills/core/dingtalk-agent-eval/references/interactive-debug-channels.md +9 -3
  62. package/skills/core/dingtalk-basic-behavior/SKILL.md +18 -3
  63. package/skills/core/dingtalk-basic-behavior/references/perception-and-gates.md +56 -0
  64. package/skills/core/dingtalk-basic-behavior/references/truth-and-recovery.md +4 -2
  65. package/skills/platforms/multica-dingtalk/PLATFORM.md +6 -5
  66. package/skills/platforms/multica-dingtalk/dingtalk-agent-deploy-multica/SKILL.md +4 -4
  67. package/skills/platforms/multica-dingtalk/dingtalk-agent-deploy-multica/references/multica-deployment-contract.md +14 -6
  68. package/skills/platforms/multica-dingtalk/dingtalk-agent-boot-multica/SKILL.md +0 -40
  69. /package/examples/agents/fde-coach/{skills → agent/skills}/fde-coach/SKILL.md +0 -0
  70. /package/examples/agents/release-manager/{skills → agent/skills}/release-manager/SKILL.md +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"agent-platform.js","sourceRoot":"","sources":["../../src/agent-platform.ts"],"names":[],"mappings":"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","sourcesContent":["// Managed Agent Platform 注册表与工作区归属解析。\n//\n// 一个 Agent 工作区归属于至多一个托管平台;归属解析顺序固定:\n// DTA_AGENT_PLATFORM 环境变量 > dingtalk-agent.json#agentPlatform\n// > .dingtalk-agent/agent-platform.json > 按 Provider 声明推断。\n// 平台相关的方法学不写进 CLI——它们随对应平台的 Skill 包分发,只在用户选择该平台时安装。\n// 平台命令(如 deploy/promote/observe)必须先通过归属门禁;coming-soon 平台一律 fail-closed。\n\nimport { existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { dirname, join, parse, resolve } from 'node:path'\n\nimport { findAgentProjectRoot } from './development-workspace.js'\nimport { findExecutable } from './doctor.js'\nimport { installGlobalSkill, type GlobalSkillStatus } from './skill-manager.js'\n\nexport type AgentPlatformStatus = 'supported' | 'coming-soon'\n\nexport interface AgentPlatformSkillBinding {\n role: string\n name: string\n purpose: string\n}\n\nexport interface AgentPlatformDefinition {\n name: string\n label: string\n status: AgentPlatformStatus\n description: string\n skills: AgentPlatformSkillBinding[]\n commands: string[]\n // 建议 endpoint(不是静默默认直连:真实执行仍 fail-closed,见 resolveEndpoint)。\n // 已指向线上正式域名——正因为是生产环境,resolveEndpoint 仍返回 confirmed: false,用前必须显式确认。\n // 可被 MULTICA_SERVER_URL 环境变量 / 项目 config / 已登录 profile 覆盖。\n suggestedEndpoint?: string\n endpointEnv?: string\n}\n\nexport const MANAGED_AGENT_PLATFORMS: AgentPlatformDefinition[] = [\n {\n name: 'multica-dingtalk',\n label: 'Multica (DingTalk)',\n status: 'supported',\n description: '钉钉 Multica 托管平台:供给、部署、钉钉机器人绑定、观测与调度。',\n skills: [\n { role: 'deploy', name: 'dingtalk-agent-deploy-multica', purpose: '经 dta 稳定 CLI 受控部署/晋级/观测到 Multica' },\n { role: 'boot', name: 'dingtalk-agent-boot-multica', purpose: '部署产物在 Multica Host 内每次任务的启动协议' },\n { role: 'ops', name: 'multica-external', purpose: '平台运维执行体:供给/绑定机器人/观测/调度(纯 HTTPS)' },\n ],\n commands: ['deploy', 'promote', 'observe'],\n suggestedEndpoint: 'https://fde-workbench.dingtalk.com',\n endpointEnv: 'MULTICA_SERVER_URL',\n },\n {\n name: 'deap',\n label: 'DEAP',\n status: 'coming-soon',\n description: '敬请期待。',\n skills: [],\n commands: [],\n },\n]\n\nexport const AGENT_PLATFORM_FILE = '.dingtalk-agent/agent-platform.json'\nconst PROJECT_FILE = 'dingtalk-agent.json'\n\nexport type AgentPlatformSource = 'env' | 'project-manifest' | 'platform-file' | 'inferred' | 'none'\n\nexport interface AgentPlatformResolution {\n $schema: 'dingtalk-agent/agent-platform-resolution@1'\n platform: string | null\n source: AgentPlatformSource\n file: string\n definition: AgentPlatformDefinition | null\n platforms: AgentPlatformDefinition[]\n}\n\nexport interface AgentPlatformUseResult extends AgentPlatformResolution {\n written: string\n skillInstalls: GlobalSkillStatus[]\n}\n\nexport function agentPlatformDefinition(name: string): AgentPlatformDefinition | null {\n return MANAGED_AGENT_PLATFORMS.find((item) => item.name === name) || null\n}\n\nexport function resolveAgentPlatform(\n start = process.cwd(), env: NodeJS.ProcessEnv = process.env,\n): AgentPlatformResolution {\n const fromEnv = String(env.DTA_AGENT_PLATFORM || '').trim()\n if (fromEnv) return resolution(fromEnv, 'env', '')\n\n const projectRoot = findAgentProjectRoot(start)\n if (projectRoot) {\n const manifestPath = join(projectRoot, PROJECT_FILE)\n if (existsSync(manifestPath) && !lstatSync(manifestPath).isSymbolicLink()) {\n const manifest = readJsonOrNull(manifestPath)\n const declared = typeof manifest?.agentPlatform === 'string' ? manifest.agentPlatform.trim() : ''\n if (declared) return resolution(declared, 'project-manifest', manifestPath)\n }\n }\n\n const platformPath = findUp(start, AGENT_PLATFORM_FILE)\n if (platformPath) {\n const stored = readJsonOrNull(platformPath)\n const declared = typeof stored?.agentPlatform === 'string' ? stored.agentPlatform.trim() : ''\n if (declared) return resolution(declared, 'platform-file', platformPath)\n }\n\n if (projectRoot) {\n const manifest = readJsonOrNull(join(projectRoot, PROJECT_FILE))\n const providers = Object.values(manifest?.workspaces || {})\n .map((workspace: any) => workspace?.provider?.kind)\n if (providers.includes('multica')) {\n return resolution('multica-dingtalk', 'inferred', join(projectRoot, PROJECT_FILE))\n }\n }\n\n return resolution(null, 'none', '')\n}\n\nexport interface AgentPlatformUseOptions {\n packageRoot: string\n home?: string\n env?: NodeJS.ProcessEnv\n installSkills?: boolean\n}\n\nexport function useAgentPlatform(\n start: string, name: string, options: AgentPlatformUseOptions,\n): AgentPlatformUseResult {\n const definition = agentPlatformDefinition(name)\n if (!definition) {\n throw new Error(\n `未知 managed agent platform: ${name}\\n` +\n `可用: ${MANAGED_AGENT_PLATFORMS.map((item) => `${item.name}(${statusLabel(item.status)})`).join('、')}`,\n )\n }\n if (definition.status !== 'supported') {\n throw new Error(`${definition.label} 敬请期待——当前版本尚未开放该平台。`)\n }\n\n const projectRoot = findAgentProjectRoot(start)\n let written: string\n if (projectRoot && existsSync(join(projectRoot, PROJECT_FILE))) {\n const manifestPath = join(projectRoot, PROJECT_FILE)\n if (lstatSync(manifestPath).isSymbolicLink()) {\n throw new Error(`${PROJECT_FILE} 不能是符号链接`)\n }\n const manifest = readJsonOrNull(manifestPath)\n if (!manifest || typeof manifest !== 'object') {\n throw new Error(`${PROJECT_FILE} 不是合法 JSON,无法写入 agentPlatform 归属`)\n }\n manifest.agentPlatform = definition.name\n writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\\n')\n written = manifestPath\n } else {\n const target = join(resolve(start), AGENT_PLATFORM_FILE)\n mkdirSync(dirname(target), { recursive: true })\n writeFileSync(target, JSON.stringify(\n { $schema: 'dingtalk-agent/agent-platform@1', agentPlatform: definition.name }, null, 2,\n ) + '\\n')\n written = target\n }\n\n const skillInstalls: GlobalSkillStatus[] = []\n if (options.installSkills !== false) {\n for (const skill of definition.skills) {\n skillInstalls.push(installGlobalSkill(options.packageRoot, {\n name: skill.name, home: options.home, env: options.env,\n }))\n }\n }\n\n return { ...resolveAgentPlatform(start, options.env || process.env), written, skillInstalls }\n}\n\n/** deploy/promote/observe 等平台命令的归属门禁:未归属、未知或 coming-soon 一律 fail-closed。 */\nexport function requireSupportedAgentPlatform(\n command: string, start = process.cwd(), env: NodeJS.ProcessEnv = process.env,\n): AgentPlatformResolution {\n const resolved = resolveAgentPlatform(start, env)\n if (!resolved.platform) {\n throw new Error(\n `当前工作区未声明 managed agent platform,无法执行 \\`${command}\\`。\\n` +\n '先运行 `dta agent-platform use multica-dingtalk`,或设置 DTA_AGENT_PLATFORM 环境变量。',\n )\n }\n if (!resolved.definition) {\n throw new Error(\n `工作区声明了未知 platform: ${resolved.platform}(来源 ${resolved.source})。\\n` +\n `可用: ${MANAGED_AGENT_PLATFORMS.map((item) => item.name).join('、')}`,\n )\n }\n if (resolved.definition.status !== 'supported') {\n throw new Error(`${resolved.definition.label} 敬请期待——\\`${command}\\` 尚未在该平台开放。`)\n }\n if (!resolved.definition.commands.includes(command)) {\n throw new Error(`${resolved.definition.label} 不承接命令 \\`${command}\\`。`)\n }\n return resolved\n}\n\n/** dta 层的平台命令/角色(deploy、boot、ops…)关联到该平台内确切的 Skill 名。 */\nexport function platformSkillForRole(platformName: string, role: string): string | null {\n const definition = agentPlatformDefinition(platformName)\n return definition?.skills.find((item) => item.role === role)?.name || null\n}\n\nconst PLATFORM_DIRS: Record<string, string> = {\n 'multica-dingtalk': 'skills/platforms/multica-dingtalk',\n deap: 'skills/platforms/deap',\n}\n\n/** 平台说明文档(PLATFORM.md)在包内的路径;切换到该平台时应加载让维护者/Agent 知道各技能用途。 */\nexport function platformDocPath(packageRoot: string, platformName: string): string | null {\n const dir = PLATFORM_DIRS[platformName]\n if (!dir) return null\n const path = join(packageRoot, dir, 'PLATFORM.md')\n return existsSync(path) ? path : null\n}\n\nexport function readPlatformDoc(packageRoot: string, platformName: string): string {\n const path = platformDocPath(packageRoot, platformName)\n return path ? readFileSync(path, 'utf8') : ''\n}\n\nexport function statusLabel(status: AgentPlatformStatus): string {\n return status === 'supported' ? '已支持' : '敬请期待'\n}\n\nexport type EndpointSource = 'env' | 'project-config' | 'profile' | 'suggested' | 'ambiguous' | 'none'\n\nexport interface EndpointResolution {\n endpoint: string\n source: EndpointSource\n // confirmed=true 仅当来自真实来源(env / 项目 config / 恰好一个已登录 profile);\n // suggested(预发建议)与 ambiguous(多目标未选)均为 false —— 发布前仍需用户显式确认,不得据此直连。\n confirmed: boolean\n envVar: string\n candidates: string[]\n}\n\n/**\n * 解析平台 endpoint,与真实执行体(multica_ext.py 读 MULTICA_SERVER_URL/--profile)同源,\n * 不新造命名空间、不静默默认连预发。顺序:\n * MULTICA_SERVER_URL 环境变量 > 项目 config(dingtalk-agent.json#multicaEndpoint /\n * .dingtalk-agent/agent-platform.json.endpoint)> 恰好一个已登录 profile 的 server_url\n * (多个则 ambiguous,不自动挑)> suggestedEndpoint(仅建议,未确认)。\n */\nexport function resolveEndpoint(\n platformName: string, start = process.cwd(),\n env: NodeJS.ProcessEnv = process.env, home = homedir(),\n): EndpointResolution {\n const definition = agentPlatformDefinition(platformName)\n const envVar = definition?.endpointEnv || 'MULTICA_SERVER_URL'\n const base: Omit<EndpointResolution, 'endpoint' | 'source' | 'confirmed'> = { envVar, candidates: [] }\n\n const fromEnv = String(env[envVar] || '').trim()\n if (fromEnv) return { endpoint: fromEnv, source: 'env', confirmed: true, ...base }\n\n const fromConfig = projectEndpoint(start)\n if (fromConfig) return { endpoint: fromConfig, source: 'project-config', confirmed: true, ...base }\n\n const serverUrls = [...new Set(multicaTargets(home)\n .map((target) => target.serverUrl.trim()).filter(Boolean))]\n if (serverUrls.length === 1) {\n return { endpoint: serverUrls[0], source: 'profile', confirmed: true, ...base }\n }\n if (serverUrls.length > 1) {\n return { endpoint: '', source: 'ambiguous', confirmed: false, ...base, candidates: serverUrls }\n }\n\n if (definition?.suggestedEndpoint) {\n return { endpoint: definition.suggestedEndpoint, source: 'suggested', confirmed: false, ...base }\n }\n return { endpoint: '', source: 'none', confirmed: false, ...base }\n}\n\nfunction projectEndpoint(start: string): string {\n const projectRoot = findAgentProjectRoot(start)\n if (!projectRoot) return ''\n const manifest = readJsonOrNull(join(projectRoot, PROJECT_FILE))\n const fromManifest = typeof manifest?.multicaEndpoint === 'string' ? manifest.multicaEndpoint.trim() : ''\n if (fromManifest) return fromManifest\n const platform = readJsonOrNull(join(projectRoot, AGENT_PLATFORM_FILE))\n return typeof platform?.endpoint === 'string' ? platform.endpoint.trim() : ''\n}\n\nexport interface AgentPlatformReadinessCheck {\n id: string\n ok: boolean\n summary: string\n hint?: string\n}\n\n/**\n * 平台工具链就绪检查(只读,不阻断):选择/查看平台归属时提示用户缺什么、怎么补。\n * 强制门禁仍由 requireSupportedAgentPlatform 与各平台命令自身承担。\n */\nexport function agentPlatformReadiness(\n name: string, env: NodeJS.ProcessEnv = process.env, home = homedir(),\n start: string = process.cwd(),\n): AgentPlatformReadinessCheck[] {\n if (name !== 'multica-dingtalk') return []\n const checks: AgentPlatformReadinessCheck[] = []\n const cli = findExecutable('multica', env)\n checks.push(cli\n ? { id: 'multica-cli', ok: true, summary: `multica CLI 已安装(${cli})` }\n : {\n id: 'multica-cli', ok: false, summary: '未找到 multica CLI',\n hint: '安装:curl -fsSL https://raw.githubusercontent.com/multica-ai/multica/main/scripts/install.sh | bash',\n })\n const ep = resolveEndpoint(name, start, env, home)\n const loginTarget = ep.endpoint || '<endpoint>'\n const suffix = ep.confirmed ? '' : '(未确认,请核对是预发还是生产)'\n checks.push(hasMulticaToken(home)\n ? { id: 'multica-login', ok: true, summary: 'Multica 已登录(本地存在 token)' }\n : {\n id: 'multica-login', ok: false, summary: 'Multica 尚未登录',\n hint: `登录:multica login --server-url ${loginTarget} --token <你的 mul_ PAT>` +\n `(endpoint 来源 ${ep.source}${suffix};用 MULTICA_SERVER_URL 或登录别的 profile 可切换)`,\n })\n if (['HTTPS_PROXY', 'https_proxy', 'ALL_PROXY', 'all_proxy'].some((key) => env[key])) {\n checks.push({\n id: 'proxy-env', ok: false, summary: '检测到代理环境变量,可能阻断 Multica 直连',\n hint: '连接失败时用 env -u HTTPS_PROXY -u https_proxy -u ALL_PROXY -u all_proxy 运行 multica 与平台脚本',\n })\n }\n return checks\n}\n\nexport interface MulticaTarget {\n profile: string\n serverUrl: string\n workspaceId: string\n}\n\n/**\n * 本机已登录的 Multica 目标清单(default 配置 + 各 profile)。只暴露 endpoint 与\n * workspace 标识,不读取 token 内容。发布前必须把候选交给用户选择,绝不默默用默认配置。\n */\nexport function multicaTargets(home = homedir()): MulticaTarget[] {\n const targets: MulticaTarget[] = []\n const push = (profile: string, path: string) => {\n const config = readJsonOrNull(path)\n if (typeof config?.token === 'string' && config.token.trim()) {\n targets.push({\n profile,\n serverUrl: String(config.server_url || ''),\n workspaceId: String(config.workspace_id || ''),\n })\n }\n }\n push('default', join(home, '.multica', 'config.json'))\n try {\n for (const entry of readdirSync(join(home, '.multica', 'profiles'))) {\n push(entry, join(home, '.multica', 'profiles', entry, 'config.json'))\n }\n } catch { /* profiles 目录不存在 */ }\n return targets\n}\n\nfunction hasMulticaToken(home: string): boolean {\n const candidates = [join(home, '.multica', 'config.json')]\n try {\n for (const entry of readdirSync(join(home, '.multica', 'profiles'))) {\n candidates.push(join(home, '.multica', 'profiles', entry, 'config.json'))\n }\n } catch { /* profiles 目录不存在 */ }\n return candidates.some((path) => {\n const config = readJsonOrNull(path)\n return typeof config?.token === 'string' && config.token.trim().length > 0\n })\n}\n\nfunction resolution(\n name: string | null, source: AgentPlatformSource, file: string,\n): AgentPlatformResolution {\n return {\n $schema: 'dingtalk-agent/agent-platform-resolution@1',\n platform: name,\n source,\n file,\n definition: name ? agentPlatformDefinition(name) : null,\n platforms: MANAGED_AGENT_PLATFORMS,\n }\n}\n\nfunction readJsonOrNull(path: string): any {\n try { return JSON.parse(readFileSync(path, 'utf8')) } catch { return null }\n}\n\nfunction findUp(start: string, relativePath: string): string | null {\n let dir = resolve(start)\n while (true) {\n const candidate = join(dir, relativePath)\n if (existsSync(candidate) && !lstatSync(candidate).isSymbolicLink()) return candidate\n const parent = dirname(dir)\n if (parent === dir || dir === parse(dir).root) return null\n dir = parent\n }\n}\n"]}
1
+ {"version":3,"file":"agent-platform.js","sourceRoot":"","sources":["../../src/agent-platform.ts"],"names":[],"mappings":"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","sourcesContent":["// Managed Agent Platform 注册表与工作区归属解析。\n//\n// 一个 Agent 工作区归属于至多一个托管平台;归属解析顺序固定:\n// DTA_AGENT_PLATFORM 环境变量 > dingtalk-agent.json#agentPlatform\n// > .dingtalk-agent/agent-platform.json > 按 Provider 声明推断。\n// 平台相关的方法学不写进 CLI——它们随对应平台的 Skill 包分发,只在用户选择该平台时安装。\n// 平台命令(如 deploy/promote/observe)必须先通过归属门禁;coming-soon 平台一律 fail-closed。\n\nimport { existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { dirname, join, parse, resolve } from 'node:path'\n\nimport { findAgentProjectRoot } from './development-workspace.js'\nimport { findExecutable } from './doctor.js'\nimport { installGlobalSkill, type GlobalSkillStatus } from './skill-manager.js'\n\nexport type AgentPlatformStatus = 'supported' | 'coming-soon'\n\nexport interface AgentPlatformSkillBinding {\n role: string\n name: string\n purpose: string\n}\n\nexport interface AgentPlatformDefinition {\n name: string\n label: string\n status: AgentPlatformStatus\n description: string\n skills: AgentPlatformSkillBinding[]\n commands: string[]\n // 建议 endpoint(不是静默默认直连:真实执行仍 fail-closed,见 resolveEndpoint)。\n // 已指向线上正式域名——正因为是生产环境,resolveEndpoint 仍返回 confirmed: false,用前必须显式确认。\n // 可被 MULTICA_SERVER_URL 环境变量 / 项目 config / 已登录 profile 覆盖。\n suggestedEndpoint?: string\n endpointEnv?: string\n}\n\nexport const MANAGED_AGENT_PLATFORMS: AgentPlatformDefinition[] = [\n {\n name: 'multica-dingtalk',\n label: 'Multica (DingTalk)',\n status: 'supported',\n description: '钉钉 Multica 托管平台:供给、部署、钉钉机器人绑定、观测与调度。',\n skills: [\n { role: 'deploy', name: 'dingtalk-agent-deploy-multica', purpose: '经 dta 稳定 CLI 受控部署/晋级/观测到 Multica' },\n { role: 'ops', name: 'multica-external', purpose: '平台运维执行体:供给/绑定机器人/观测/调度(纯 HTTPS)' },\n ],\n commands: ['deploy', 'promote', 'observe'],\n suggestedEndpoint: 'https://fde-workbench.dingtalk.com',\n endpointEnv: 'MULTICA_SERVER_URL',\n },\n {\n name: 'deap',\n label: 'DEAP',\n status: 'coming-soon',\n description: '敬请期待。',\n skills: [],\n commands: [],\n },\n]\n\nexport const AGENT_PLATFORM_FILE = '.dingtalk-agent/agent-platform.json'\nconst PROJECT_FILE = 'dingtalk-agent.json'\n\nexport type AgentPlatformSource = 'env' | 'project-manifest' | 'platform-file' | 'inferred' | 'none'\n\nexport interface AgentPlatformResolution {\n $schema: 'dingtalk-agent/agent-platform-resolution@1'\n platform: string | null\n source: AgentPlatformSource\n file: string\n definition: AgentPlatformDefinition | null\n platforms: AgentPlatformDefinition[]\n}\n\nexport interface AgentPlatformUseResult extends AgentPlatformResolution {\n written: string\n skillInstalls: GlobalSkillStatus[]\n}\n\nexport function agentPlatformDefinition(name: string): AgentPlatformDefinition | null {\n return MANAGED_AGENT_PLATFORMS.find((item) => item.name === name) || null\n}\n\nexport function resolveAgentPlatform(\n start = process.cwd(), env: NodeJS.ProcessEnv = process.env,\n): AgentPlatformResolution {\n const fromEnv = String(env.DTA_AGENT_PLATFORM || '').trim()\n if (fromEnv) return resolution(fromEnv, 'env', '')\n\n const projectRoot = findAgentProjectRoot(start)\n if (projectRoot) {\n const manifestPath = join(projectRoot, PROJECT_FILE)\n if (existsSync(manifestPath) && !lstatSync(manifestPath).isSymbolicLink()) {\n const manifest = readJsonOrNull(manifestPath)\n const declared = typeof manifest?.agentPlatform === 'string' ? manifest.agentPlatform.trim() : ''\n if (declared) return resolution(declared, 'project-manifest', manifestPath)\n }\n }\n\n const platformPath = findUp(start, AGENT_PLATFORM_FILE)\n if (platformPath) {\n const stored = readJsonOrNull(platformPath)\n const declared = typeof stored?.agentPlatform === 'string' ? stored.agentPlatform.trim() : ''\n if (declared) return resolution(declared, 'platform-file', platformPath)\n }\n\n if (projectRoot) {\n const manifest = readJsonOrNull(join(projectRoot, PROJECT_FILE))\n const providers = Object.values(manifest?.workspaces || {})\n .map((workspace: any) => workspace?.provider?.kind)\n if (providers.includes('multica')) {\n return resolution('multica-dingtalk', 'inferred', join(projectRoot, PROJECT_FILE))\n }\n }\n\n return resolution(null, 'none', '')\n}\n\nexport interface AgentPlatformUseOptions {\n packageRoot: string\n home?: string\n env?: NodeJS.ProcessEnv\n installSkills?: boolean\n}\n\nexport function useAgentPlatform(\n start: string, name: string, options: AgentPlatformUseOptions,\n): AgentPlatformUseResult {\n const definition = agentPlatformDefinition(name)\n if (!definition) {\n throw new Error(\n `未知 managed agent platform: ${name}\\n` +\n `可用: ${MANAGED_AGENT_PLATFORMS.map((item) => `${item.name}(${statusLabel(item.status)})`).join('、')}`,\n )\n }\n if (definition.status !== 'supported') {\n throw new Error(`${definition.label} 敬请期待——当前版本尚未开放该平台。`)\n }\n\n const projectRoot = findAgentProjectRoot(start)\n let written: string\n if (projectRoot && existsSync(join(projectRoot, PROJECT_FILE))) {\n const manifestPath = join(projectRoot, PROJECT_FILE)\n if (lstatSync(manifestPath).isSymbolicLink()) {\n throw new Error(`${PROJECT_FILE} 不能是符号链接`)\n }\n const manifest = readJsonOrNull(manifestPath)\n if (!manifest || typeof manifest !== 'object') {\n throw new Error(`${PROJECT_FILE} 不是合法 JSON,无法写入 agentPlatform 归属`)\n }\n manifest.agentPlatform = definition.name\n writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\\n')\n written = manifestPath\n } else {\n const target = join(resolve(start), AGENT_PLATFORM_FILE)\n mkdirSync(dirname(target), { recursive: true })\n writeFileSync(target, JSON.stringify(\n { $schema: 'dingtalk-agent/agent-platform@1', agentPlatform: definition.name }, null, 2,\n ) + '\\n')\n written = target\n }\n\n const skillInstalls: GlobalSkillStatus[] = []\n if (options.installSkills !== false) {\n for (const skill of definition.skills) {\n skillInstalls.push(installGlobalSkill(options.packageRoot, {\n name: skill.name, home: options.home, env: options.env,\n }))\n }\n }\n\n return { ...resolveAgentPlatform(start, options.env || process.env), written, skillInstalls }\n}\n\n/** deploy/promote/observe 等平台命令的归属门禁:未归属、未知或 coming-soon 一律 fail-closed。 */\nexport function requireSupportedAgentPlatform(\n command: string, start = process.cwd(), env: NodeJS.ProcessEnv = process.env,\n): AgentPlatformResolution {\n const resolved = resolveAgentPlatform(start, env)\n if (!resolved.platform) {\n throw new Error(\n `当前工作区未声明 managed agent platform,无法执行 \\`${command}\\`。\\n` +\n '先运行 `dta agent-platform use multica-dingtalk`,或设置 DTA_AGENT_PLATFORM 环境变量。',\n )\n }\n if (!resolved.definition) {\n throw new Error(\n `工作区声明了未知 platform: ${resolved.platform}(来源 ${resolved.source})。\\n` +\n `可用: ${MANAGED_AGENT_PLATFORMS.map((item) => item.name).join('、')}`,\n )\n }\n if (resolved.definition.status !== 'supported') {\n throw new Error(`${resolved.definition.label} 敬请期待——\\`${command}\\` 尚未在该平台开放。`)\n }\n if (!resolved.definition.commands.includes(command)) {\n throw new Error(`${resolved.definition.label} 不承接命令 \\`${command}\\`。`)\n }\n return resolved\n}\n\n/** dta 层的平台命令/角色(deploy、boot、ops…)关联到该平台内确切的 Skill 名。 */\nexport function platformSkillForRole(platformName: string, role: string): string | null {\n const definition = agentPlatformDefinition(platformName)\n return definition?.skills.find((item) => item.role === role)?.name || null\n}\n\nconst PLATFORM_DIRS: Record<string, string> = {\n 'multica-dingtalk': 'skills/platforms/multica-dingtalk',\n deap: 'skills/platforms/deap',\n}\n\n/** 平台说明文档(PLATFORM.md)在包内的路径;切换到该平台时应加载让维护者/Agent 知道各技能用途。 */\nexport function platformDocPath(packageRoot: string, platformName: string): string | null {\n const dir = PLATFORM_DIRS[platformName]\n if (!dir) return null\n const path = join(packageRoot, dir, 'PLATFORM.md')\n return existsSync(path) ? path : null\n}\n\nexport function readPlatformDoc(packageRoot: string, platformName: string): string {\n const path = platformDocPath(packageRoot, platformName)\n return path ? readFileSync(path, 'utf8') : ''\n}\n\nexport function statusLabel(status: AgentPlatformStatus): string {\n return status === 'supported' ? '已支持' : '敬请期待'\n}\n\nexport type EndpointSource = 'env' | 'project-config' | 'profile' | 'suggested' | 'ambiguous' | 'none'\n\nexport interface EndpointResolution {\n endpoint: string\n source: EndpointSource\n // confirmed=true 仅当来自真实来源(env / 项目 config / 恰好一个已登录 profile);\n // suggested(预发建议)与 ambiguous(多目标未选)均为 false —— 发布前仍需用户显式确认,不得据此直连。\n confirmed: boolean\n envVar: string\n candidates: string[]\n}\n\n/**\n * 解析平台 endpoint,与真实执行体(multica_ext.py 读 MULTICA_SERVER_URL/--profile)同源,\n * 不新造命名空间、不静默默认连预发。顺序:\n * MULTICA_SERVER_URL 环境变量 > 项目 config(dingtalk-agent.json#multicaEndpoint /\n * .dingtalk-agent/agent-platform.json.endpoint)> 恰好一个已登录 profile 的 server_url\n * (多个则 ambiguous,不自动挑)> suggestedEndpoint(仅建议,未确认)。\n */\nexport function resolveEndpoint(\n platformName: string, start = process.cwd(),\n env: NodeJS.ProcessEnv = process.env, home = homedir(),\n): EndpointResolution {\n const definition = agentPlatformDefinition(platformName)\n const envVar = definition?.endpointEnv || 'MULTICA_SERVER_URL'\n const base: Omit<EndpointResolution, 'endpoint' | 'source' | 'confirmed'> = { envVar, candidates: [] }\n\n const fromEnv = String(env[envVar] || '').trim()\n if (fromEnv) return { endpoint: fromEnv, source: 'env', confirmed: true, ...base }\n\n const fromConfig = projectEndpoint(start)\n if (fromConfig) return { endpoint: fromConfig, source: 'project-config', confirmed: true, ...base }\n\n const serverUrls = [...new Set(multicaTargets(home)\n .map((target) => target.serverUrl.trim()).filter(Boolean))]\n if (serverUrls.length === 1) {\n return { endpoint: serverUrls[0], source: 'profile', confirmed: true, ...base }\n }\n if (serverUrls.length > 1) {\n return { endpoint: '', source: 'ambiguous', confirmed: false, ...base, candidates: serverUrls }\n }\n\n if (definition?.suggestedEndpoint) {\n return { endpoint: definition.suggestedEndpoint, source: 'suggested', confirmed: false, ...base }\n }\n return { endpoint: '', source: 'none', confirmed: false, ...base }\n}\n\nfunction projectEndpoint(start: string): string {\n const projectRoot = findAgentProjectRoot(start)\n if (!projectRoot) return ''\n const manifest = readJsonOrNull(join(projectRoot, PROJECT_FILE))\n const fromManifest = typeof manifest?.multicaEndpoint === 'string' ? manifest.multicaEndpoint.trim() : ''\n if (fromManifest) return fromManifest\n const platform = readJsonOrNull(join(projectRoot, AGENT_PLATFORM_FILE))\n return typeof platform?.endpoint === 'string' ? platform.endpoint.trim() : ''\n}\n\nexport interface AgentPlatformReadinessCheck {\n id: string\n ok: boolean\n summary: string\n hint?: string\n}\n\n/**\n * 平台工具链就绪检查(只读,不阻断):选择/查看平台归属时提示用户缺什么、怎么补。\n * 强制门禁仍由 requireSupportedAgentPlatform 与各平台命令自身承担。\n */\nexport function agentPlatformReadiness(\n name: string, env: NodeJS.ProcessEnv = process.env, home = homedir(),\n start: string = process.cwd(),\n): AgentPlatformReadinessCheck[] {\n if (name !== 'multica-dingtalk') return []\n const checks: AgentPlatformReadinessCheck[] = []\n const cli = findExecutable('multica', env)\n checks.push(cli\n ? { id: 'multica-cli', ok: true, summary: `multica CLI 已安装(${cli})` }\n : {\n id: 'multica-cli', ok: false, summary: '未找到 multica CLI',\n hint: '安装:curl -fsSL https://raw.githubusercontent.com/multica-ai/multica/main/scripts/install.sh | bash',\n })\n const ep = resolveEndpoint(name, start, env, home)\n const loginTarget = ep.endpoint || '<endpoint>'\n const suffix = ep.confirmed ? '' : '(未确认,请核对是预发还是生产)'\n checks.push(hasMulticaToken(home)\n ? { id: 'multica-login', ok: true, summary: 'Multica 已登录(本地存在 token)' }\n : {\n id: 'multica-login', ok: false, summary: 'Multica 尚未登录',\n hint: `登录:multica login --server-url ${loginTarget} --token <你的 mul_ PAT>` +\n `(endpoint 来源 ${ep.source}${suffix};用 MULTICA_SERVER_URL 或登录别的 profile 可切换)`,\n })\n if (['HTTPS_PROXY', 'https_proxy', 'ALL_PROXY', 'all_proxy'].some((key) => env[key])) {\n checks.push({\n id: 'proxy-env', ok: false, summary: '检测到代理环境变量,可能阻断 Multica 直连',\n hint: '连接失败时用 env -u HTTPS_PROXY -u https_proxy -u ALL_PROXY -u all_proxy 运行 multica 与平台脚本',\n })\n }\n return checks\n}\n\nexport interface MulticaTarget {\n profile: string\n serverUrl: string\n workspaceId: string\n}\n\n/**\n * 本机已登录的 Multica 目标清单(default 配置 + 各 profile)。只暴露 endpoint 与\n * workspace 标识,不读取 token 内容。发布前必须把候选交给用户选择,绝不默默用默认配置。\n */\nexport function multicaTargets(home = homedir()): MulticaTarget[] {\n const targets: MulticaTarget[] = []\n const push = (profile: string, path: string) => {\n const config = readJsonOrNull(path)\n if (typeof config?.token === 'string' && config.token.trim()) {\n targets.push({\n profile,\n serverUrl: String(config.server_url || ''),\n workspaceId: String(config.workspace_id || ''),\n })\n }\n }\n push('default', join(home, '.multica', 'config.json'))\n try {\n for (const entry of readdirSync(join(home, '.multica', 'profiles'))) {\n push(entry, join(home, '.multica', 'profiles', entry, 'config.json'))\n }\n } catch { /* profiles 目录不存在 */ }\n return targets\n}\n\nfunction hasMulticaToken(home: string): boolean {\n const candidates = [join(home, '.multica', 'config.json')]\n try {\n for (const entry of readdirSync(join(home, '.multica', 'profiles'))) {\n candidates.push(join(home, '.multica', 'profiles', entry, 'config.json'))\n }\n } catch { /* profiles 目录不存在 */ }\n return candidates.some((path) => {\n const config = readJsonOrNull(path)\n return typeof config?.token === 'string' && config.token.trim().length > 0\n })\n}\n\nfunction resolution(\n name: string | null, source: AgentPlatformSource, file: string,\n): AgentPlatformResolution {\n return {\n $schema: 'dingtalk-agent/agent-platform-resolution@1',\n platform: name,\n source,\n file,\n definition: name ? agentPlatformDefinition(name) : null,\n platforms: MANAGED_AGENT_PLATFORMS,\n }\n}\n\nfunction readJsonOrNull(path: string): any {\n try { return JSON.parse(readFileSync(path, 'utf8')) } catch { return null }\n}\n\nfunction findUp(start: string, relativePath: string): string | null {\n let dir = resolve(start)\n while (true) {\n const candidate = join(dir, relativePath)\n if (existsSync(candidate) && !lstatSync(candidate).isSymbolicLink()) return candidate\n const parent = dirname(dir)\n if (parent === dir || dir === parse(dir).root) return null\n dir = parent\n }\n}\n"]}
@@ -18,10 +18,14 @@ export function bootstrap(root, options = {}) {
18
18
  const cwd = realpathSync(resolve(root));
19
19
  const hasWorkspace = existsSync(workspacePath(cwd));
20
20
  const workspace = hasWorkspace ? loadWorkspace(cwd) : null;
21
- const agent = select(options.agent || options.storage, options.context?.agent, process.env.DTA_AGENT_SOURCE, workspace ? 'workspace-manifest' : '', `local-dir:${cwd}`);
21
+ const packagedAgentRoot = existsSync(join(cwd, 'agent', 'AGENTS.md'))
22
+ ? join(cwd, 'agent') : cwd;
23
+ const packagedSkillsRef = existsSync(join(cwd, 'agent', 'skills'))
24
+ ? 'agent/skills' : existsSync(join(cwd, 'skills')) ? 'skills' : '';
25
+ const agent = select(options.agent || options.storage, options.context?.agent, process.env.DTA_AGENT_SOURCE, workspace ? 'workspace-manifest' : '', `local-dir:${packagedAgentRoot}`);
22
26
  const memory = select(options.memory, options.context?.memory, process.env.DTA_MEMORY_STORAGE, workspace?.mounts.memory || '', existsSync(join(cwd, 'MEMORY.md')) ? 'local-md:MEMORY.md' : '');
23
27
  const knowledge = select(options.knowledge, options.context?.knowledge, process.env.DTA_KNOWLEDGE_STORAGE, workspace?.mounts.knowledge || '', existsSync(join(cwd, 'knowledge', 'INDEX.md')) ? 'local-md:knowledge/INDEX.md' : '');
24
- const skills = select(options.skills, options.context?.skills, process.env.DTA_SKILLS_SOURCE, workspace?.mounts.skills || '', existsSync(join(cwd, 'skills')) ? 'local-dir:skills' : '');
28
+ const skills = select(options.skills, options.context?.skills, process.env.DTA_SKILLS_SOURCE, workspace?.mounts.skills || '', packagedSkillsRef ? `local-dir:${packagedSkillsRef}` : '');
25
29
  const state = select(options.stateDir, options.context?.stateDir, process.env.DTA_STATE_DIR, '', '.dingtalk-agent');
26
30
  const artifacts = select(options.artifacts, options.context?.artifacts, process.env.DTA_ARTIFACTS_STORAGE, '', `local-dir:${resolve(cwd, state.value, 'artifacts')}`);
27
31
  const dwsProfile = select(options.profile, options.context?.profile, process.env.DTA_DWS_PROFILE, workspace?.dws.profile || '', '');
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/bootstrap.ts"],"names":[],"mappings":"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","sourcesContent":["// Agent Session 的轻量水合入口。\n//\n// 它不要求 init,也不创建项目模板:\n// - local-dir 直接返回可读的 Markdown 挂载;\n// - dingtalk-doc 通过 DWS 拉成隐藏的只读快照;\n// - 已有 workspace@1 时复用其中的 mounts。\n\nimport {\n existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync, renameSync,\n writeFileSync,\n} from 'node:fs'\nimport { basename, dirname, join, relative, resolve } from 'node:path'\nimport { digest } from './events.js'\nimport * as dws from './dws.js'\nimport { buildBootstrapDefinition } from './agent-definition.js'\nimport { directInvocation } from './invocation.js'\nimport type { AgentDefinition, InvocationContext } from './types.js'\nimport { loadWorkspace, workspacePath, type WorkspaceSpec } from './workspace.js'\n\ntype Provider = 'local-dir' | 'local-md' | 'dingtalk-doc'\n\nexport interface BootstrapOptions {\n agent?: string\n storage?: string\n memory?: string\n knowledge?: string\n skills?: string\n artifacts?: string\n stateDir?: string\n profile?: string\n expectedUserId?: string\n /** Inspect bindings without reading a remote provider. Used by the local agent audit. */\n deferRemote?: boolean\n context?: Partial<{\n agent: string\n memory: string\n knowledge: string\n skills: string\n artifacts: string\n stateDir: string\n profile: string\n expectedUserId: string\n }>\n}\n\nexport interface BootstrapMount {\n slot: string\n provider: Provider\n source: string\n path: string\n hash: string\n}\n\nexport interface BootstrapResult {\n $schema: 'dingtalk-agent/bootstrap@1'\n mode: 'direct' | 'workspace'\n initialized: boolean\n scopeId: string\n contextId: string\n storage: string\n stateDir: string\n mounts: BootstrapMount[]\n definition: AgentDefinition\n invocation: InvocationContext\n note: string\n}\n\nexport function bootstrap(root: string, options: BootstrapOptions = {}): BootstrapResult {\n // Canonicalize aliases such as macOS /var -> /private/var so bootstrap,\n // agent audit, evidence fingerprints, and later Session snapshots hash the\n // same Agent root.\n const cwd = realpathSync(resolve(root))\n const hasWorkspace = existsSync(workspacePath(cwd))\n const workspace = hasWorkspace ? loadWorkspace(cwd) : null\n const agent = select(\n options.agent || options.storage, options.context?.agent, process.env.DTA_AGENT_SOURCE,\n workspace ? 'workspace-manifest' : '', `local-dir:${cwd}`,\n )\n const memory = select(\n options.memory, options.context?.memory, process.env.DTA_MEMORY_STORAGE,\n workspace?.mounts.memory || '', existsSync(join(cwd, 'MEMORY.md')) ? 'local-md:MEMORY.md' : '',\n )\n const knowledge = select(\n options.knowledge, options.context?.knowledge, process.env.DTA_KNOWLEDGE_STORAGE,\n workspace?.mounts.knowledge || '',\n existsSync(join(cwd, 'knowledge', 'INDEX.md')) ? 'local-md:knowledge/INDEX.md' : '',\n )\n const skills = select(\n options.skills, options.context?.skills, process.env.DTA_SKILLS_SOURCE,\n workspace?.mounts.skills || '', existsSync(join(cwd, 'skills')) ? 'local-dir:skills' : '',\n )\n const state = select(\n options.stateDir, options.context?.stateDir, process.env.DTA_STATE_DIR,\n '', '.dingtalk-agent',\n )\n const artifacts = select(\n options.artifacts, options.context?.artifacts, process.env.DTA_ARTIFACTS_STORAGE,\n '', `local-dir:${resolve(cwd, state.value, 'artifacts')}`,\n )\n const dwsProfile = select(\n options.profile, options.context?.profile, process.env.DTA_DWS_PROFILE,\n workspace?.dws.profile || '', '',\n )\n const expectedUserId = select(\n options.expectedUserId, options.context?.expectedUserId, process.env.DTA_EXPECTED_USER_ID,\n workspace?.dws.expectedUserId || '', '',\n )\n const storage = agent.value\n const stateDir = resolve(cwd, state.value)\n let mounts = workspace && agent.value === 'workspace-manifest'\n ? hydrateWorkspace(cwd, workspace, stateDir, dwsProfile.value, options.deferRemote)\n : hydrateStorage(cwd, agent.value, stateDir, dwsProfile.value, 'body', options.deferRemote)\n mounts = mergeMounts(mounts, hydrateOptional(\n cwd, memory.value, stateDir, dwsProfile.value, 'memory', options.deferRemote))\n mounts = mergeMounts(mounts, hydrateOptional(\n cwd, knowledge.value, stateDir, dwsProfile.value, 'knowledge', options.deferRemote))\n mounts = mergeMounts(mounts, hydrateOptional(\n cwd, skills.value, stateDir, dwsProfile.value, 'skills', options.deferRemote))\n const contextId = workspace?.contextId || ''\n const scopeSeed = agent.value === 'workspace-manifest' && contextId\n ? contextId : canonicalStorageSeed(storage, cwd)\n const sourcePath = storage.startsWith('local-dir:')\n ? safeLocalPath(cwd, parseStorage(storage).ref, true) : ''\n const origins = {\n agent: agent.origin, memory: memory.origin, knowledge: knowledge.origin,\n skills: skills.origin, artifacts: artifacts.origin, state: state.origin,\n dwsProfile: dwsProfile.origin, expectedUserId: expectedUserId.origin,\n }\n const definition = buildBootstrapDefinition(mounts, {\n source: storage,\n sourcePath,\n memory: memory.value,\n knowledge: knowledge.value,\n artifacts: artifacts.value,\n state: stateDir,\n dwsProfile: dwsProfile.value,\n expectedUserId: expectedUserId.value,\n origins,\n }, agent.value === 'workspace-manifest' ? workspace : null)\n return {\n $schema: 'dingtalk-agent/bootstrap@1',\n mode: workspace ? 'workspace' : 'direct',\n initialized: hasWorkspace,\n scopeId: `scope_${digest(scopeSeed).slice(0, 20)}`,\n contextId,\n storage,\n stateDir: mounts.some((item) => item.provider === 'dingtalk-doc') ? stateDir : '',\n mounts,\n definition,\n invocation: directInvocation(),\n note: hasWorkspace\n ? '已读取现有 Workspace;init 不是每次 Session 的前置动作。'\n : '未初始化 Workspace;已按直接会话模式工作,不会自动修改当前目录。',\n }\n}\n\nfunction hydrateWorkspace(\n root: string,\n workspace: WorkspaceSpec,\n stateDir: string,\n profile = '',\n deferRemote = false,\n): BootstrapMount[] {\n const out: BootstrapMount[] = []\n for (const slot of ['profile', 'memory', 'knowledge'] as const) {\n out.push(...hydrateStorage(\n root,\n workspace.mounts[slot],\n stateDir,\n profile || workspace.dws.profile,\n slot,\n deferRemote,\n ))\n }\n return out\n}\n\nfunction hydrateStorage(\n root: string,\n uri: string,\n stateDir: string,\n profile = '',\n slot = 'workspace',\n deferRemote = false,\n): BootstrapMount[] {\n const mount = parseStorage(uri)\n if (mount.provider === 'local-dir') {\n if (slot === 'skills') {\n return discoverSkillDirectory(root, mount.ref)\n }\n const discovered = discoverLocalDirectory(root, mount.ref)\n return slot === 'body' || slot === 'workspace'\n ? discovered\n : discovered.filter((item) => item.slot === slot)\n }\n if (mount.provider === 'local-md') {\n const path = safeLocalPath(root, mount.ref, false)\n if (!path) return []\n const markdown = readFileSync(path, 'utf8')\n const effectiveSlot = slot === 'skills'\n ? `skill:${readSkillName(markdown) || safeName(path)}` : slot\n return [{ slot: effectiveSlot, provider: mount.provider, source: uri, path, hash: digest(markdown) }]\n }\n\n if (deferRemote) return []\n\n // /i/nodes URL 是多产品统一入口;先 probe,只有在线文档 adoc 才能作为 Markdown Storage。\n const info = dws.docInfo(mount.ref, profile)\n const contentType = String(info?.contentType || '').toUpperCase()\n const extension = String(info?.extension || '').toLowerCase()\n if (contentType !== 'ALIDOC' || extension !== 'adoc') {\n throw new Error(\n `dingtalk-doc 只接受在线文档 adoc;实际 contentType=${contentType || '?'} extension=${extension || '?'}`,\n )\n }\n const markdown = String(dws.readDoc(mount.ref, profile))\n const scope = digest(uri).slice(0, 20)\n const effectiveSlot = slot === 'skills'\n ? `skill:${readSkillName(markdown) || safeName(mount.ref)}` : slot\n // A single remote document may intentionally back more than one semantic slot.\n // Give each slot its own directory so its manifest cannot overwrite another slot.\n const path = join(\n stateDir, 'cache', 'bootstrap', scope, safeName(effectiveSlot), 'snapshot.md')\n // Cache bytes must be identical to the independently read remote bytes. Adding\n // formatting here would make the manifest hash describe data that is not on disk.\n writeAtomic(path, markdown)\n const manifest = join(dirname(path), 'manifest.json')\n writeAtomic(manifest, JSON.stringify({\n $schema: 'dingtalk-agent/bootstrap-cache@1',\n source: uri,\n profile,\n pulledAt: new Date().toISOString(),\n hash: digest(markdown),\n path,\n }, null, 2) + '\\n')\n return [{ slot: effectiveSlot, provider: mount.provider, source: uri, path, hash: digest(markdown) }]\n}\n\nfunction discoverLocalDirectory(root: string, ref: string): BootstrapMount[] {\n const directory = safeLocalPath(root, ref, true)\n if (!directory || !lstatSync(directory).isDirectory()) {\n throw new Error(`local-dir 不是目录: ${ref}`)\n }\n const candidates: Array<[string, string]> = [\n ['body', 'AGENTS.md'],\n ['profile', 'WORKSPACE.md'],\n ['memory', 'MEMORY.md'],\n ['knowledge', join('knowledge', 'INDEX.md')],\n ]\n const out: BootstrapMount[] = []\n for (const [slot, rel] of candidates) {\n const path = resolve(directory, rel)\n if (!existsSync(path) || !lstatSync(path).isFile()) continue\n const markdown = readFileSync(path, 'utf8')\n out.push({\n slot,\n provider: 'local-dir',\n source: `local-dir:${directory}`,\n path,\n hash: digest(markdown),\n })\n }\n out.push(...discoverSkillDirectory(root, join(directory, 'skills'), true))\n return out\n}\n\nfunction discoverSkillDirectory(root: string, ref: string, optional = false): BootstrapMount[] {\n const candidate = resolve(root, ref)\n if (!existsSync(candidate)) {\n if (optional) return []\n throw new Error(`Skill Storage 不存在: ${ref}`)\n }\n const directory = realpathSync(candidate)\n if (!lstatSync(directory).isDirectory()) throw new Error(`Skill Storage 不是目录: ${ref}`)\n const roots = existsSync(join(directory, 'SKILL.md'))\n ? [directory]\n : readdirSync(directory).sort().map((name) => join(directory, name))\n .filter((path) => existsSync(join(path, 'SKILL.md')) && lstatSync(path).isDirectory())\n return roots.map((path) => {\n const markdown = readFileSync(join(path, 'SKILL.md'), 'utf8')\n const name = readSkillName(markdown) || basename(path)\n return {\n slot: `skill:${name}`, provider: 'local-dir' as const,\n source: `local-dir:${directory}`, path: join(path, 'SKILL.md'), hash: digest(markdown),\n }\n })\n}\n\nfunction hydrateOptional(\n root: string, uri: string, stateDir: string, profile: string, slot: string,\n deferRemote = false,\n): BootstrapMount[] {\n return uri ? hydrateStorage(root, uri, stateDir, profile, slot, deferRemote) : []\n}\n\nfunction mergeMounts(current: BootstrapMount[], additions: BootstrapMount[]): BootstrapMount[] {\n const out = [...current]\n for (const addition of additions) {\n const index = out.findIndex((item) => item.slot === addition.slot)\n if (index >= 0) out[index] = addition\n else out.push(addition)\n }\n return out\n}\n\nfunction readSkillName(markdown: string): string {\n const frontmatter = markdown.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/)\n return frontmatter?.[1].match(/^name:\\s*['\"]?([^'\"\\r\\n]+)['\"]?\\s*$/m)?.[1]?.trim() || ''\n}\n\ntype ConfigOrigin = AgentDefinition['configuration'][string]\n\nfunction select(\n explicit: unknown, context: unknown, environment: unknown,\n workspace: unknown, convention: string,\n): { value: string; origin: ConfigOrigin } {\n const choices: Array<[unknown, ConfigOrigin]> = [\n [explicit, 'explicit'], [context, 'context'], [environment, 'environment'],\n [workspace, 'workspace'], [convention, 'convention'],\n ]\n for (const [value, origin] of choices) {\n if (typeof value === 'string' && value.trim()) return { value: value.trim(), origin }\n }\n return { value: '', origin: 'convention' }\n}\n\nfunction parseStorage(uri: string): { provider: Provider; ref: string } {\n const separator = uri.indexOf(':')\n const provider = separator < 0 ? '' : uri.slice(0, separator)\n const ref = separator < 0 ? '' : uri.slice(separator + 1).trim()\n if (!['local-dir', 'local-md', 'dingtalk-doc'].includes(provider) || !ref) {\n throw new Error(\n `Storage URI 不合法: ${uri};使用 local-dir:<path> / local-md:<path> / dingtalk-doc:<node-or-url>`,\n )\n }\n return { provider: provider as Provider, ref }\n}\n\nfunction safeLocalPath(root: string, ref: string, allowAbsolute: boolean): string {\n const rootReal = realpathSync(resolve(root))\n const candidate = resolve(rootReal, ref)\n if (!existsSync(candidate)) {\n if (!allowAbsolute) return ''\n throw new Error(`Storage 不存在: ${ref}`)\n }\n const actual = realpathSync(candidate)\n if (!allowAbsolute) {\n const rel = relative(rootReal, actual)\n if (rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`)) {\n throw new Error(`local-md 必须位于当前 Workspace 内: ${ref}`)\n }\n }\n return actual\n}\n\nfunction canonicalStorageSeed(storage: string, root: string): string {\n const mount = parseStorage(storage)\n return mount.provider === 'local-dir'\n ? `local-dir:${realpathSync(resolve(root, mount.ref))}`\n : storage\n}\n\nfunction writeAtomic(path: string, value: string): void {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.${process.pid}.${Date.now()}.tmp`\n writeFileSync(temp, value, { flag: 'wx' })\n renameSync(temp, path)\n}\n\nfunction safeName(value: string): string {\n return basename(value).replace(/[^a-zA-Z0-9._-]+/g, '-') || 'workspace'\n}\n"]}
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/bootstrap.ts"],"names":[],"mappings":"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","sourcesContent":["// Agent Session 的轻量水合入口。\n//\n// 它不要求 init,也不创建项目模板:\n// - local-dir 直接返回可读的 Markdown 挂载;\n// - dingtalk-doc 通过 DWS 拉成隐藏的只读快照;\n// - 已有 workspace@1 时复用其中的 mounts。\n\nimport {\n existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync, renameSync,\n writeFileSync,\n} from 'node:fs'\nimport { basename, dirname, join, relative, resolve } from 'node:path'\nimport { digest } from './events.js'\nimport * as dws from './dws.js'\nimport { buildBootstrapDefinition } from './agent-definition.js'\nimport { directInvocation } from './invocation.js'\nimport type { AgentDefinition, InvocationContext } from './types.js'\nimport { loadWorkspace, workspacePath, type WorkspaceSpec } from './workspace.js'\n\ntype Provider = 'local-dir' | 'local-md' | 'dingtalk-doc'\n\nexport interface BootstrapOptions {\n agent?: string\n storage?: string\n memory?: string\n knowledge?: string\n skills?: string\n artifacts?: string\n stateDir?: string\n profile?: string\n expectedUserId?: string\n /** Inspect bindings without reading a remote provider. Used by the local agent audit. */\n deferRemote?: boolean\n context?: Partial<{\n agent: string\n memory: string\n knowledge: string\n skills: string\n artifacts: string\n stateDir: string\n profile: string\n expectedUserId: string\n }>\n}\n\nexport interface BootstrapMount {\n slot: string\n provider: Provider\n source: string\n path: string\n hash: string\n}\n\nexport interface BootstrapResult {\n $schema: 'dingtalk-agent/bootstrap@1'\n mode: 'direct' | 'workspace'\n initialized: boolean\n scopeId: string\n contextId: string\n storage: string\n stateDir: string\n mounts: BootstrapMount[]\n definition: AgentDefinition\n invocation: InvocationContext\n note: string\n}\n\nexport function bootstrap(root: string, options: BootstrapOptions = {}): BootstrapResult {\n // Canonicalize aliases such as macOS /var -> /private/var so bootstrap,\n // agent audit, evidence fingerprints, and later Session snapshots hash the\n // same Agent root.\n const cwd = realpathSync(resolve(root))\n const hasWorkspace = existsSync(workspacePath(cwd))\n const workspace = hasWorkspace ? loadWorkspace(cwd) : null\n const packagedAgentRoot = existsSync(join(cwd, 'agent', 'AGENTS.md'))\n ? join(cwd, 'agent') : cwd\n const packagedSkillsRef = existsSync(join(cwd, 'agent', 'skills'))\n ? 'agent/skills' : existsSync(join(cwd, 'skills')) ? 'skills' : ''\n const agent = select(\n options.agent || options.storage, options.context?.agent, process.env.DTA_AGENT_SOURCE,\n workspace ? 'workspace-manifest' : '', `local-dir:${packagedAgentRoot}`,\n )\n const memory = select(\n options.memory, options.context?.memory, process.env.DTA_MEMORY_STORAGE,\n workspace?.mounts.memory || '', existsSync(join(cwd, 'MEMORY.md')) ? 'local-md:MEMORY.md' : '',\n )\n const knowledge = select(\n options.knowledge, options.context?.knowledge, process.env.DTA_KNOWLEDGE_STORAGE,\n workspace?.mounts.knowledge || '',\n existsSync(join(cwd, 'knowledge', 'INDEX.md')) ? 'local-md:knowledge/INDEX.md' : '',\n )\n const skills = select(\n options.skills, options.context?.skills, process.env.DTA_SKILLS_SOURCE,\n workspace?.mounts.skills || '', packagedSkillsRef ? `local-dir:${packagedSkillsRef}` : '',\n )\n const state = select(\n options.stateDir, options.context?.stateDir, process.env.DTA_STATE_DIR,\n '', '.dingtalk-agent',\n )\n const artifacts = select(\n options.artifacts, options.context?.artifacts, process.env.DTA_ARTIFACTS_STORAGE,\n '', `local-dir:${resolve(cwd, state.value, 'artifacts')}`,\n )\n const dwsProfile = select(\n options.profile, options.context?.profile, process.env.DTA_DWS_PROFILE,\n workspace?.dws.profile || '', '',\n )\n const expectedUserId = select(\n options.expectedUserId, options.context?.expectedUserId, process.env.DTA_EXPECTED_USER_ID,\n workspace?.dws.expectedUserId || '', '',\n )\n const storage = agent.value\n const stateDir = resolve(cwd, state.value)\n let mounts = workspace && agent.value === 'workspace-manifest'\n ? hydrateWorkspace(cwd, workspace, stateDir, dwsProfile.value, options.deferRemote)\n : hydrateStorage(cwd, agent.value, stateDir, dwsProfile.value, 'body', options.deferRemote)\n mounts = mergeMounts(mounts, hydrateOptional(\n cwd, memory.value, stateDir, dwsProfile.value, 'memory', options.deferRemote))\n mounts = mergeMounts(mounts, hydrateOptional(\n cwd, knowledge.value, stateDir, dwsProfile.value, 'knowledge', options.deferRemote))\n mounts = mergeMounts(mounts, hydrateOptional(\n cwd, skills.value, stateDir, dwsProfile.value, 'skills', options.deferRemote))\n const contextId = workspace?.contextId || ''\n const scopeSeed = agent.value === 'workspace-manifest' && contextId\n ? contextId : canonicalStorageSeed(storage, cwd)\n const sourcePath = storage.startsWith('local-dir:')\n ? safeLocalPath(cwd, parseStorage(storage).ref, true) : ''\n const origins = {\n agent: agent.origin, memory: memory.origin, knowledge: knowledge.origin,\n skills: skills.origin, artifacts: artifacts.origin, state: state.origin,\n dwsProfile: dwsProfile.origin, expectedUserId: expectedUserId.origin,\n }\n const definition = buildBootstrapDefinition(mounts, {\n source: storage,\n sourcePath,\n memory: memory.value,\n knowledge: knowledge.value,\n artifacts: artifacts.value,\n state: stateDir,\n dwsProfile: dwsProfile.value,\n expectedUserId: expectedUserId.value,\n origins,\n }, agent.value === 'workspace-manifest' ? workspace : null)\n return {\n $schema: 'dingtalk-agent/bootstrap@1',\n mode: workspace ? 'workspace' : 'direct',\n initialized: hasWorkspace,\n scopeId: `scope_${digest(scopeSeed).slice(0, 20)}`,\n contextId,\n storage,\n stateDir: mounts.some((item) => item.provider === 'dingtalk-doc') ? stateDir : '',\n mounts,\n definition,\n invocation: directInvocation(),\n note: hasWorkspace\n ? '已读取现有 Workspace;init 不是每次 Session 的前置动作。'\n : '未初始化 Workspace;已按直接会话模式工作,不会自动修改当前目录。',\n }\n}\n\nfunction hydrateWorkspace(\n root: string,\n workspace: WorkspaceSpec,\n stateDir: string,\n profile = '',\n deferRemote = false,\n): BootstrapMount[] {\n const out: BootstrapMount[] = []\n for (const slot of ['profile', 'memory', 'knowledge'] as const) {\n out.push(...hydrateStorage(\n root,\n workspace.mounts[slot],\n stateDir,\n profile || workspace.dws.profile,\n slot,\n deferRemote,\n ))\n }\n return out\n}\n\nfunction hydrateStorage(\n root: string,\n uri: string,\n stateDir: string,\n profile = '',\n slot = 'workspace',\n deferRemote = false,\n): BootstrapMount[] {\n const mount = parseStorage(uri)\n if (mount.provider === 'local-dir') {\n if (slot === 'skills') {\n return discoverSkillDirectory(root, mount.ref)\n }\n const discovered = discoverLocalDirectory(root, mount.ref)\n return slot === 'body' || slot === 'workspace'\n ? discovered\n : discovered.filter((item) => item.slot === slot)\n }\n if (mount.provider === 'local-md') {\n const path = safeLocalPath(root, mount.ref, false)\n if (!path) return []\n const markdown = readFileSync(path, 'utf8')\n const effectiveSlot = slot === 'skills'\n ? `skill:${readSkillName(markdown) || safeName(path)}` : slot\n return [{ slot: effectiveSlot, provider: mount.provider, source: uri, path, hash: digest(markdown) }]\n }\n\n if (deferRemote) return []\n\n // /i/nodes URL 是多产品统一入口;先 probe,只有在线文档 adoc 才能作为 Markdown Storage。\n const info = dws.docInfo(mount.ref, profile)\n const contentType = String(info?.contentType || '').toUpperCase()\n const extension = String(info?.extension || '').toLowerCase()\n if (contentType !== 'ALIDOC' || extension !== 'adoc') {\n throw new Error(\n `dingtalk-doc 只接受在线文档 adoc;实际 contentType=${contentType || '?'} extension=${extension || '?'}`,\n )\n }\n const markdown = String(dws.readDoc(mount.ref, profile))\n const scope = digest(uri).slice(0, 20)\n const effectiveSlot = slot === 'skills'\n ? `skill:${readSkillName(markdown) || safeName(mount.ref)}` : slot\n // A single remote document may intentionally back more than one semantic slot.\n // Give each slot its own directory so its manifest cannot overwrite another slot.\n const path = join(\n stateDir, 'cache', 'bootstrap', scope, safeName(effectiveSlot), 'snapshot.md')\n // Cache bytes must be identical to the independently read remote bytes. Adding\n // formatting here would make the manifest hash describe data that is not on disk.\n writeAtomic(path, markdown)\n const manifest = join(dirname(path), 'manifest.json')\n writeAtomic(manifest, JSON.stringify({\n $schema: 'dingtalk-agent/bootstrap-cache@1',\n source: uri,\n profile,\n pulledAt: new Date().toISOString(),\n hash: digest(markdown),\n path,\n }, null, 2) + '\\n')\n return [{ slot: effectiveSlot, provider: mount.provider, source: uri, path, hash: digest(markdown) }]\n}\n\nfunction discoverLocalDirectory(root: string, ref: string): BootstrapMount[] {\n const directory = safeLocalPath(root, ref, true)\n if (!directory || !lstatSync(directory).isDirectory()) {\n throw new Error(`local-dir 不是目录: ${ref}`)\n }\n const candidates: Array<[string, string]> = [\n ['body', 'AGENTS.md'],\n ['profile', 'WORKSPACE.md'],\n ['memory', 'MEMORY.md'],\n ['knowledge', join('knowledge', 'INDEX.md')],\n ]\n const out: BootstrapMount[] = []\n for (const [slot, rel] of candidates) {\n const path = resolve(directory, rel)\n if (!existsSync(path) || !lstatSync(path).isFile()) continue\n const markdown = readFileSync(path, 'utf8')\n out.push({\n slot,\n provider: 'local-dir',\n source: `local-dir:${directory}`,\n path,\n hash: digest(markdown),\n })\n }\n out.push(...discoverSkillDirectory(root, join(directory, 'skills'), true))\n return out\n}\n\nfunction discoverSkillDirectory(root: string, ref: string, optional = false): BootstrapMount[] {\n const candidate = resolve(root, ref)\n if (!existsSync(candidate)) {\n if (optional) return []\n throw new Error(`Skill Storage 不存在: ${ref}`)\n }\n const directory = realpathSync(candidate)\n if (!lstatSync(directory).isDirectory()) throw new Error(`Skill Storage 不是目录: ${ref}`)\n const roots = existsSync(join(directory, 'SKILL.md'))\n ? [directory]\n : readdirSync(directory).sort().map((name) => join(directory, name))\n .filter((path) => existsSync(join(path, 'SKILL.md')) && lstatSync(path).isDirectory())\n return roots.map((path) => {\n const markdown = readFileSync(join(path, 'SKILL.md'), 'utf8')\n const name = readSkillName(markdown) || basename(path)\n return {\n slot: `skill:${name}`, provider: 'local-dir' as const,\n source: `local-dir:${directory}`, path: join(path, 'SKILL.md'), hash: digest(markdown),\n }\n })\n}\n\nfunction hydrateOptional(\n root: string, uri: string, stateDir: string, profile: string, slot: string,\n deferRemote = false,\n): BootstrapMount[] {\n return uri ? hydrateStorage(root, uri, stateDir, profile, slot, deferRemote) : []\n}\n\nfunction mergeMounts(current: BootstrapMount[], additions: BootstrapMount[]): BootstrapMount[] {\n const out = [...current]\n for (const addition of additions) {\n const index = out.findIndex((item) => item.slot === addition.slot)\n if (index >= 0) out[index] = addition\n else out.push(addition)\n }\n return out\n}\n\nfunction readSkillName(markdown: string): string {\n const frontmatter = markdown.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/)\n return frontmatter?.[1].match(/^name:\\s*['\"]?([^'\"\\r\\n]+)['\"]?\\s*$/m)?.[1]?.trim() || ''\n}\n\ntype ConfigOrigin = AgentDefinition['configuration'][string]\n\nfunction select(\n explicit: unknown, context: unknown, environment: unknown,\n workspace: unknown, convention: string,\n): { value: string; origin: ConfigOrigin } {\n const choices: Array<[unknown, ConfigOrigin]> = [\n [explicit, 'explicit'], [context, 'context'], [environment, 'environment'],\n [workspace, 'workspace'], [convention, 'convention'],\n ]\n for (const [value, origin] of choices) {\n if (typeof value === 'string' && value.trim()) return { value: value.trim(), origin }\n }\n return { value: '', origin: 'convention' }\n}\n\nfunction parseStorage(uri: string): { provider: Provider; ref: string } {\n const separator = uri.indexOf(':')\n const provider = separator < 0 ? '' : uri.slice(0, separator)\n const ref = separator < 0 ? '' : uri.slice(separator + 1).trim()\n if (!['local-dir', 'local-md', 'dingtalk-doc'].includes(provider) || !ref) {\n throw new Error(\n `Storage URI 不合法: ${uri};使用 local-dir:<path> / local-md:<path> / dingtalk-doc:<node-or-url>`,\n )\n }\n return { provider: provider as Provider, ref }\n}\n\nfunction safeLocalPath(root: string, ref: string, allowAbsolute: boolean): string {\n const rootReal = realpathSync(resolve(root))\n const candidate = resolve(rootReal, ref)\n if (!existsSync(candidate)) {\n if (!allowAbsolute) return ''\n throw new Error(`Storage 不存在: ${ref}`)\n }\n const actual = realpathSync(candidate)\n if (!allowAbsolute) {\n const rel = relative(rootReal, actual)\n if (rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`)) {\n throw new Error(`local-md 必须位于当前 Workspace 内: ${ref}`)\n }\n }\n return actual\n}\n\nfunction canonicalStorageSeed(storage: string, root: string): string {\n const mount = parseStorage(storage)\n return mount.provider === 'local-dir'\n ? `local-dir:${realpathSync(resolve(root, mount.ref))}`\n : storage\n}\n\nfunction writeAtomic(path: string, value: string): void {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.${process.pid}.${Date.now()}.tmp`\n writeFileSync(temp, value, { flag: 'wx' })\n renameSync(temp, path)\n}\n\nfunction safeName(value: string): string {\n return basename(value).replace(/[^a-zA-Z0-9._-]+/g, '-') || 'workspace'\n}\n"]}
@@ -12,7 +12,7 @@ export const WORKSPACE_STATE_ROOT = '.dingtalk-agent/state/workspaces';
12
12
  export const LEGACY_WORKSPACE_NAME = 'legacy-prepared';
13
13
  const PROJECT_KEYS = new Set(['$schema', 'name', 'dtaVersion', 'agent', 'workspaces']);
14
14
  const PROJECT_OPTIONAL_KEYS = new Set([...PROJECT_KEYS, 'agentPlatform', 'multicaEndpoint']);
15
- const AGENT_KEYS = new Set(['definition', 'displayName', 'skills']);
15
+ const AGENT_KEYS = new Set(['definition', 'skillsRoot', 'displayName', 'skills']);
16
16
  const AGENT_REQUIRED_KEYS = new Set(['definition', 'skills']);
17
17
  const WORKSPACE_KEYS = new Set(['stage', 'provider', 'storage', 'authority']);
18
18
  const OPENCODE_KEYS = new Set(['kind', 'model']);
@@ -70,6 +70,7 @@ export function inspectAgentProject(start = process.cwd(), cliVersion = '') {
70
70
  dtaVersion: loaded.manifest.dtaVersion,
71
71
  compatibleWithCli: !cliVersion || versionSatisfies(cliVersion, loaded.manifest.dtaVersion),
72
72
  definition: loaded.manifest.agent.definition,
73
+ skillsRoot: loaded.manifest.agent.skillsRoot || '',
73
74
  skills: [...loaded.manifest.agent.skills],
74
75
  },
75
76
  currentWorkspace,
@@ -210,6 +211,9 @@ function validateProjectManifest(value, root) {
210
211
  if (missingAgent.length)
211
212
  throw new Error(`Project agent 缺少字段: ${missingAgent.join(', ')}`);
212
213
  const definition = safeRelativePath(root, requiredString(agentInput.definition, 'agent.definition'), 'agent.definition', false);
214
+ const skillsRoot = agentInput.skillsRoot === undefined
215
+ ? undefined
216
+ : safeRelativePath(root, requiredString(agentInput.skillsRoot, 'agent.skillsRoot'), 'agent.skillsRoot', false);
213
217
  const displayName = agentInput.displayName === undefined
214
218
  ? undefined : agentDisplayName(agentInput.displayName, 'agent.displayName');
215
219
  if (!Array.isArray(agentInput.skills) || agentInput.skills.length === 0) {
@@ -234,13 +238,41 @@ function validateProjectManifest(value, root) {
234
238
  $schema: 'dingtalk-agent/project@1', name, dtaVersion,
235
239
  ...(agentPlatform === undefined ? {} : { agentPlatform }),
236
240
  ...(multicaEndpoint === undefined ? {} : { multicaEndpoint }),
237
- agent: { definition, ...(displayName === undefined ? {} : { displayName }), skills }, workspaces,
241
+ agent: {
242
+ definition,
243
+ ...(skillsRoot === undefined ? {} : { skillsRoot }),
244
+ ...(displayName === undefined ? {} : { displayName }),
245
+ skills,
246
+ },
247
+ workspaces,
238
248
  };
239
249
  }
250
+ /**
251
+ * Resolve the versioned source of a declared Skill.
252
+ *
253
+ * New projects declare one package root (normally agent/skills). Manifests
254
+ * created before skillsRoot keep their historical split layout so an existing
255
+ * code repository can migrate deliberately instead of being rewritten merely
256
+ * because dta was upgraded.
257
+ */
258
+ export function projectSkillRef(project, name) {
259
+ if (project.skillsRoot)
260
+ return `${project.skillsRoot}/${name}`;
261
+ return name === 'dingtalk-basic-behavior'
262
+ ? `.agents/skills/${name}`
263
+ : `skills/${name}`;
264
+ }
265
+ function manifestSkillRef(manifest, name) {
266
+ if (manifest.agent.skillsRoot)
267
+ return `${manifest.agent.skillsRoot}/${name}`;
268
+ return name === 'dingtalk-basic-behavior'
269
+ ? `.agents/skills/${name}`
270
+ : `skills/${name}`;
271
+ }
240
272
  function validateDeclaredWorkspace(value, root, name) {
241
273
  const input = objectValue(value, `Workspace ${name}`);
242
274
  assertAllowedKeys(input, WORKSPACE_KEYS, `Workspace ${name}`);
243
- for (const required of ['stage', 'provider', 'storage']) {
275
+ for (const required of ['stage', 'provider']) {
244
276
  if (!(required in input))
245
277
  throw new Error(`Workspace ${name} 缺少字段: ${required}`);
246
278
  }
@@ -275,10 +307,20 @@ function validateDeclaredWorkspace(value, root, name) {
275
307
  else {
276
308
  throw new Error(`Workspace ${name}.provider.kind 只支持 opencode / multica`);
277
309
  }
278
- const storageInput = objectValue(input.storage, `Workspace ${name}.storage`);
310
+ const storageInput = input.storage === undefined
311
+ ? {} : objectValue(input.storage, `Workspace ${name}.storage`);
279
312
  assertAllowedKeys(storageInput, STORAGE_KEYS, `Workspace ${name}.storage`);
280
- const memory = storageRoute(storageInput.memory, ['local-md', 'dingtalk-doc'], `${name}.memory`, root);
281
- const knowledge = storageRoute(storageInput.knowledge, ['local-md', 'dingtalk-doc'], `${name}.knowledge`, root);
313
+ if (provider.kind === 'opencode') {
314
+ for (const required of ['memory', 'knowledge']) {
315
+ if (!(required in storageInput)) {
316
+ throw new Error(`Workspace ${name}.storage 缺少字段: ${required}`);
317
+ }
318
+ }
319
+ }
320
+ const memory = storageInput.memory === undefined ? undefined
321
+ : storageRoute(storageInput.memory, ['local-md', 'dingtalk-doc'], `${name}.memory`, root);
322
+ const knowledge = storageInput.knowledge === undefined ? undefined
323
+ : storageRoute(storageInput.knowledge, ['local-md', 'dingtalk-doc'], `${name}.knowledge`, root);
282
324
  const artifacts = storageInput.artifacts === undefined ? undefined
283
325
  : storageRoute(storageInput.artifacts, ['local-dir'], `${name}.artifacts`, root);
284
326
  let authority;
@@ -293,13 +335,20 @@ function validateDeclaredWorkspace(value, root, name) {
293
335
  if (provider.kind === 'multica' && !authority) {
294
336
  throw new Error(`Workspace ${name} 的 multica Provider 必须声明 authority env 来源`);
295
337
  }
296
- return { stage, provider, storage: { memory, knowledge, ...(artifacts ? { artifacts } : {}) },
338
+ return { stage, provider, storage: {
339
+ ...(memory ? { memory } : {}),
340
+ ...(knowledge ? { knowledge } : {}),
341
+ ...(artifacts ? { artifacts } : {}),
342
+ },
297
343
  ...(authority ? { authority } : {}) };
298
344
  }
299
345
  function declaredView(loaded, name, workspace, currentWorkspace) {
300
- const artifacts = workspace.storage.artifacts ||
301
- `local-dir:.dingtalk-agent/artifacts/${name}`;
302
- const storage = { ...workspace.storage, artifacts };
346
+ const artifacts = workspace.storage.artifacts || (workspace.provider.kind === 'opencode'
347
+ ? `local-dir:.dingtalk-agent/artifacts/${name}` : undefined);
348
+ const storage = {
349
+ ...workspace.storage,
350
+ ...(artifacts ? { artifacts } : {}),
351
+ };
303
352
  const sourceHash = projectSourceHash(loaded.root, loaded.manifest);
304
353
  const desiredHash = digest(stableStringify({
305
354
  project: loaded.manifest.name,
@@ -372,11 +421,8 @@ function projectSourceHash(root, manifest) {
372
421
  opencode: localContentHash(root, 'opencode.json'),
373
422
  };
374
423
  for (const name of manifest.agent.skills) {
375
- const ref = name === 'dingtalk-basic-behavior'
376
- ? `.agents/skills/${name}` : `skills/${name}`;
424
+ const ref = manifestSkillRef(manifest, name);
377
425
  sources[`skill:${name}`] = localContentHash(root, ref);
378
- const exposure = `.agents/skills/${name}`;
379
- sources[`exposure:${name}`] = localContentHash(root, exposure);
380
426
  }
381
427
  return digest(stableStringify(sources));
382
428
  }
@@ -463,13 +509,13 @@ function inspectOpenCodeWorkspace(info, workspace, env, add) {
463
509
  const executable = findExecutable('opencode', env);
464
510
  add('provider.opencode-cli', 'provider', executable ? 'pass' : 'fail', true, executable ? 'OpenCode CLI 可执行' : 'PATH 找不到 opencode', { executable: executable || '' }, '安装 OpenCode,并确认 opencode --version 可执行');
465
511
  add('provider.opencode-model', 'provider', workspace.provider.model ? 'pass' : 'fail', true, workspace.provider.model ? 'OpenCode model 已显式声明' : 'OpenCode model 缺失', { model: workspace.provider.model || '' });
466
- const basicPath = '.agents/skills/dingtalk-basic-behavior/SKILL.md';
512
+ const basicPath = `${projectSkillRef(info.project, 'dingtalk-basic-behavior')}/SKILL.md`;
467
513
  const basic = inspectLocalFile(info.root, basicPath);
468
514
  const canonicalPackageRoot = resolvePackageRoot(import.meta.url);
469
515
  const canonicalBasic = inspectLocalFile(canonicalPackageRoot, relative(canonicalPackageRoot, join(bundledSkillPath(canonicalPackageRoot, 'dingtalk-basic-behavior'), 'SKILL.md')));
470
516
  const basicMatched = basic.valid && canonicalBasic.valid && basic.hash === canonicalBasic.hash;
471
- add('skills.basic-exposure', 'skills', basicMatched ? 'pass' : 'fail', true, basicMatched ? 'Basic Skill exposure 与当前 canonical source 一致'
472
- : 'Basic Skill exposure 缺失、越界或 hash 漂移', { exposure: basic, canonicalHash: canonicalBasic.hash || '' }, `重新物化 ${basicPath}`);
517
+ add('skills.basic-exposure', 'skills', basicMatched ? 'pass' : 'fail', true, basicMatched ? 'Agent package 中的 Basic Skill 与当前 canonical source 一致'
518
+ : 'Agent package 的 Basic Skill 缺失、越界或 hash 漂移', { source: basic, canonicalHash: canonicalBasic.hash || '' }, `重新装配 ${basicPath}`);
473
519
  const configPath = join(info.root, 'opencode.json');
474
520
  const configFile = inspectLocalFile(info.root, 'opencode.json');
475
521
  let configError = '';
@@ -497,12 +543,10 @@ function inspectOpenCodeWorkspace(info, workspace, env, add) {
497
543
  const configValid = !configError && instructionCount === 1 && permission === 'allow';
498
544
  add('skills.basic-instruction', 'skills', configValid ? 'pass' : 'fail', true, configValid ? 'OpenCode config 强制加载且允许 Basic Skill' : 'OpenCode Basic instruction/permission 合同不完整', { path: 'opencode.json', error: configError, instructionCount, permission }, '运行 compose/bind 流程生成唯一 Basic instruction 与 allow permission');
499
545
  for (const name of info.project.skills.filter((item) => item !== 'dingtalk-basic-behavior')) {
500
- const source = inspectLocalFile(info.root, `skills/${name}/SKILL.md`);
501
- const exposure = inspectLocalFile(info.root, `.agents/skills/${name}/SKILL.md`);
502
- const matched = source.valid && exposure.valid && source.hash === exposure.hash &&
503
- permissions[name] === 'allow';
504
- add(`skills.role.${name}`, 'skills', matched ? 'pass' : 'fail', true, matched ? `Role Skill ${name} source/exposure hash 与 permission 一致`
505
- : `Role Skill ${name} source、exposure hash 或 permission 不一致`, { source, exposure, permission: permissions[name] || '' }, `运行 compose/bind 流程物化 ${name}`);
546
+ const source = inspectLocalFile(info.root, `${projectSkillRef(info.project, name)}/SKILL.md`);
547
+ const matched = source.valid && permissions[name] === 'allow';
548
+ add(`skills.role.${name}`, 'skills', matched ? 'pass' : 'fail', true, matched ? `Role Skill ${name} 单一发布源与 permission 一致`
549
+ : `Role Skill ${name} 发布源缺失或 permission 不一致`, { source, permission: permissions[name] || '' }, `运行 compose/bind 流程装配 ${name}`);
506
550
  }
507
551
  const managedRef = workspace.state?.binding.managedPath || '';
508
552
  if (managedRef) {