@xdxer/dingtalk-agent 0.1.5-beta.2 → 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.
- package/CHANGELOG.md +15 -0
- package/README.en.md +6 -4
- package/README.md +6 -4
- package/dist/src/agent-audit.js +69 -55
- package/dist/src/agent-audit.js.map +1 -1
- package/dist/src/agent-enhance.js +49 -30
- package/dist/src/agent-enhance.js.map +1 -1
- package/dist/src/bootstrap.js +6 -2
- package/dist/src/bootstrap.js.map +1 -1
- package/dist/src/development-workspace.js +42 -15
- package/dist/src/development-workspace.js.map +1 -1
- package/dist/src/multica-deploy.js +27 -9
- package/dist/src/multica-deploy.js.map +1 -1
- package/dist/src/opencode-provider.js +17 -5
- package/dist/src/opencode-provider.js.map +1 -1
- package/dist/src/skills.js +2 -0
- package/dist/src/skills.js.map +1 -1
- package/dist/src/workspace.js +11 -6
- package/dist/src/workspace.js.map +1 -1
- package/docs/ARCHITECTURE.md +10 -7
- package/docs/INSTALLATION.md +1 -1
- package/docs/schemas/project.schema.json +5 -0
- package/examples/agents/README.md +8 -6
- package/examples/agents/fde-coach/AGENTS.md +2 -34
- package/examples/agents/fde-coach/agent/AGENTS.md +35 -0
- package/examples/agents/fde-coach/agent.bindings.json +10 -0
- package/examples/agents/release-manager/AGENTS.md +2 -34
- package/examples/agents/release-manager/agent/AGENTS.md +35 -0
- package/examples/agents/release-manager/agent.bindings.json +10 -0
- package/lab/project-workspace/fake-multica-provider.mjs +26 -7
- package/lab/robot-eval/suite.json +1 -1
- package/package.json +1 -1
- package/skills/core/dingtalk-agent-compose/SKILL.md +21 -15
- package/skills/core/dingtalk-agent-compose/assets/REPOSITORY.template.md +10 -0
- package/skills/core/dingtalk-agent-compose/assets/agent.bindings.dingtalk-doc.template.json +2 -2
- package/skills/core/dingtalk-agent-compose/assets/agent.bindings.local.template.json +2 -2
- package/skills/core/dingtalk-agent-compose/assets/hosts/opencode/opencode.template.json +2 -1
- package/skills/core/dingtalk-agent-compose/evals/evals.json +1 -1
- package/skills/core/dingtalk-agent-compose/references/agent-definition-contract.md +6 -6
- package/skills/core/dingtalk-agent-compose/references/host-loading-contract.md +10 -12
- package/skills/core/dingtalk-agent-compose/references/hosts/claude-code.md +13 -12
- package/skills/core/dingtalk-agent-compose/references/hosts/opencode.md +13 -12
- package/skills/core/dingtalk-basic-behavior/SKILL.md +9 -6
- package/skills/core/dingtalk-basic-behavior/references/perception-and-gates.md +2 -0
- /package/examples/agents/fde-coach/{skills → agent/skills}/fde-coach/SKILL.md +0 -0
- /package/examples/agents/release-manager/{skills → agent/skills}/release-manager/SKILL.md +0 -0
|
@@ -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,9 +238,37 @@ 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: {
|
|
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}`);
|
|
@@ -389,11 +421,8 @@ function projectSourceHash(root, manifest) {
|
|
|
389
421
|
opencode: localContentHash(root, 'opencode.json'),
|
|
390
422
|
};
|
|
391
423
|
for (const name of manifest.agent.skills) {
|
|
392
|
-
const ref = name
|
|
393
|
-
? `.agents/skills/${name}` : `skills/${name}`;
|
|
424
|
+
const ref = manifestSkillRef(manifest, name);
|
|
394
425
|
sources[`skill:${name}`] = localContentHash(root, ref);
|
|
395
|
-
const exposure = `.agents/skills/${name}`;
|
|
396
|
-
sources[`exposure:${name}`] = localContentHash(root, exposure);
|
|
397
426
|
}
|
|
398
427
|
return digest(stableStringify(sources));
|
|
399
428
|
}
|
|
@@ -480,13 +509,13 @@ function inspectOpenCodeWorkspace(info, workspace, env, add) {
|
|
|
480
509
|
const executable = findExecutable('opencode', env);
|
|
481
510
|
add('provider.opencode-cli', 'provider', executable ? 'pass' : 'fail', true, executable ? 'OpenCode CLI 可执行' : 'PATH 找不到 opencode', { executable: executable || '' }, '安装 OpenCode,并确认 opencode --version 可执行');
|
|
482
511
|
add('provider.opencode-model', 'provider', workspace.provider.model ? 'pass' : 'fail', true, workspace.provider.model ? 'OpenCode model 已显式声明' : 'OpenCode model 缺失', { model: workspace.provider.model || '' });
|
|
483
|
-
const basicPath = '
|
|
512
|
+
const basicPath = `${projectSkillRef(info.project, 'dingtalk-basic-behavior')}/SKILL.md`;
|
|
484
513
|
const basic = inspectLocalFile(info.root, basicPath);
|
|
485
514
|
const canonicalPackageRoot = resolvePackageRoot(import.meta.url);
|
|
486
515
|
const canonicalBasic = inspectLocalFile(canonicalPackageRoot, relative(canonicalPackageRoot, join(bundledSkillPath(canonicalPackageRoot, 'dingtalk-basic-behavior'), 'SKILL.md')));
|
|
487
516
|
const basicMatched = basic.valid && canonicalBasic.valid && basic.hash === canonicalBasic.hash;
|
|
488
|
-
add('skills.basic-exposure', 'skills', basicMatched ? 'pass' : 'fail', true, basicMatched ? 'Basic Skill
|
|
489
|
-
: 'Basic Skill
|
|
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}`);
|
|
490
519
|
const configPath = join(info.root, 'opencode.json');
|
|
491
520
|
const configFile = inspectLocalFile(info.root, 'opencode.json');
|
|
492
521
|
let configError = '';
|
|
@@ -514,12 +543,10 @@ function inspectOpenCodeWorkspace(info, workspace, env, add) {
|
|
|
514
543
|
const configValid = !configError && instructionCount === 1 && permission === 'allow';
|
|
515
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');
|
|
516
545
|
for (const name of info.project.skills.filter((item) => item !== 'dingtalk-basic-behavior')) {
|
|
517
|
-
const source = inspectLocalFile(info.root,
|
|
518
|
-
const
|
|
519
|
-
|
|
520
|
-
permissions[name]
|
|
521
|
-
add(`skills.role.${name}`, 'skills', matched ? 'pass' : 'fail', true, matched ? `Role Skill ${name} source/exposure hash 与 permission 一致`
|
|
522
|
-
: `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}`);
|
|
523
550
|
}
|
|
524
551
|
const managedRef = workspace.state?.binding.managedPath || '';
|
|
525
552
|
if (managedRef) {
|