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

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 (36) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/dist/bin/dingtalk-agent.js +339 -124
  3. package/dist/bin/dingtalk-agent.js.map +1 -1
  4. package/dist/src/actions.js +3 -2
  5. package/dist/src/actions.js.map +1 -1
  6. package/dist/src/doctor.js +1 -1
  7. package/dist/src/doctor.js.map +1 -1
  8. package/dist/src/dws.js +2 -1
  9. package/dist/src/dws.js.map +1 -1
  10. package/dist/src/init.js +2 -1
  11. package/dist/src/init.js.map +1 -1
  12. package/dist/src/map.js +157 -0
  13. package/dist/src/map.js.map +1 -0
  14. package/dist/src/skill-manager.js +5 -0
  15. package/dist/src/skill-manager.js.map +1 -1
  16. package/dist/src/tui.js +369 -0
  17. package/dist/src/tui.js.map +1 -0
  18. package/dist/src/upgrade.js +113 -33
  19. package/dist/src/upgrade.js.map +1 -1
  20. package/dist/src/waits.js +2 -1
  21. package/dist/src/waits.js.map +1 -1
  22. package/package.json +3 -2
  23. package/skills/core/dingtalk-agent-compose/SKILL.md +19 -1
  24. package/skills/core/dingtalk-people-group-memory/COMPLETENESS.md +36 -0
  25. package/skills/core/dingtalk-people-group-memory/SKILL.md +69 -0
  26. package/skills/core/dingtalk-people-group-memory/references/adapters.md +273 -0
  27. package/skills/core/dingtalk-people-group-memory/references/assembly-guidance.md +40 -0
  28. package/skills/core/dingtalk-people-group-memory/references/binding.md +110 -0
  29. package/skills/core/dingtalk-people-group-memory/references/cold-start.md +70 -0
  30. package/skills/core/dingtalk-people-group-memory/references/config-binding.md +89 -0
  31. package/skills/core/dingtalk-people-group-memory/references/consent-and-visibility.md +83 -0
  32. package/skills/core/dingtalk-people-group-memory/references/consolidation.md +162 -0
  33. package/skills/core/dingtalk-people-group-memory/references/event-ingest.md +103 -0
  34. package/skills/core/dingtalk-people-group-memory/references/guided-setup.md +70 -0
  35. package/skills/core/dingtalk-people-group-memory/references/model.md +148 -0
  36. package/skills/core/dingtalk-people-group-memory/references/storage-port.md +107 -0
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/upgrade.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { delimiter, join } from 'node:path'\nimport { spawnSync } from 'node:child_process'\nimport { cleanVersion, compareVersions } from './version.js'\nimport { skillSuiteStatus } from './skill-manager.js'\n\nconst PACKAGE_NAME = '@xdxer/dingtalk-agent'\nconst REGISTRY = 'https://registry.npmjs.org'\n\nexport interface UpgradeOptions {\n home?: string\n env?: NodeJS.ProcessEnv\n prefix?: string\n channel?: 'beta' | 'latest'\n version?: string\n dryRun?: boolean\n force?: boolean\n}\n\nexport interface UpgradeResult {\n $schema: 'dingtalk-agent/upgrade@1'\n currentVersion: string\n targetVersion: string\n target: string\n prefix: string\n executable: string\n changed: boolean\n dryRun: boolean\n ready: boolean\n setup: Record<string, any> | null\n skills: UpgradeSkillReport[]\n commands: { install: string; verify: string }\n}\n\n/** 升级前后各 Skill 的版本核对;`after` 为 null 表示 dry-run 尚未执行。 */\nexport interface UpgradeSkillReport {\n name: string\n before: string\n after: string | null\n bundled: string\n state: string\n changed: boolean\n}\n\nexport function upgradeAgent(packageRoot: string, options: UpgradeOptions = {}): UpgradeResult {\n const home = options.home || homedir()\n const env = { ...process.env, ...(options.env || {}) }\n const pkg = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'))\n const currentVersion = String(pkg.version || '')\n const prefix = options.prefix || join(home, '.local')\n const binDir = process.platform === 'win32' ? prefix : join(prefix, 'bin')\n const executable = join(binDir, process.platform === 'win32' ? 'dta.cmd' : 'dta')\n // 升级前先冻结本机 Skill 版本,否则重装之后无从核对到底动了什么。\n const skillsBefore = skillSuiteStatus(packageRoot, { home }).skills\n\n if (options.channel && options.version) {\n throw new Error('upgrade 的 --channel 与 --version 不能同时使用')\n }\n const channel = options.channel || (currentVersion.includes('-') ? 'beta' : 'latest')\n if (!['beta', 'latest'].includes(channel)) {\n throw new Error(`不支持的升级通道: ${channel};只能是 beta 或 latest`)\n }\n const requested = cleanVersion(options.version) || channel\n const packageSource = env.DTA_UPGRADE_PACKAGE_SOURCE || `${PACKAGE_NAME}@${requested}`\n const targetVersion = env.DTA_UPGRADE_TARGET_VERSION || resolveTargetVersion(packageSource, env)\n if (compareVersions(targetVersion, currentVersion) < 0 && !(options.version && options.force)) {\n throw new Error(\n `升级目标 ${targetVersion} 低于当前版本 ${currentVersion},拒绝自动降级;` +\n '如确需降级,请同时使用 --version 与 --force',\n )\n }\n const installArgs = [\n 'install', '--global', '--prefix', prefix, '--registry', REGISTRY, packageSource,\n ]\n const installCommand = ['npm', ...installArgs].map(shellQuote).join(' ')\n const verifyCommand = `${shellQuote(executable)} setup --skip-cli-install`\n const changed = options.force || targetVersion !== currentVersion\n\n if (options.dryRun) {\n return {\n $schema: 'dingtalk-agent/upgrade@1', currentVersion, targetVersion,\n target: packageSource, prefix, executable, changed, dryRun: true,\n ready: false, setup: null,\n skills: skillsBefore.map((item) => ({\n name: item.name,\n before: item.canonical.installedVersion,\n after: null,\n bundled: item.bundled.skillVersion,\n state: item.canonical.state,\n changed: item.canonical.state !== 'current',\n })),\n commands: { install: installCommand, verify: verifyCommand },\n }\n }\n\n if (changed) {\n const install = spawnSync('npm', installArgs, { encoding: 'utf8', env, timeout: 120_000 })\n const output = [install.stdout, install.stderr].filter(Boolean).join('\\n').trim()\n if (install.error || install.status !== 0) {\n throw new Error(\n `CLI 升级失败: ${install.error?.message || output || `退出码 ${install.status}`}\\n` +\n `可手动执行: ${installCommand}`,\n )\n }\n }\n if (!existsSync(executable)) {\n throw new Error(`npm 升级完成但找不到新 CLI: ${executable}\\n可手动执行: ${installCommand}`)\n }\n const effectiveEnv = {\n ...env,\n HOME: home,\n PATH: [binDir, env.PATH || ''].filter(Boolean).join(delimiter),\n }\n const versionRun = spawnSync(executable, ['--version'], {\n encoding: 'utf8', env: effectiveEnv, timeout: 8_000,\n })\n const installedVersion = String(versionRun.stdout || '').trim()\n if (versionRun.status !== 0 || installedVersion !== targetVersion) {\n throw new Error(\n `新 CLI 版本校验失败: expected=${targetVersion}, actual=${installedVersion || 'unknown'}\\n` +\n `可重试: ${installCommand}`,\n )\n }\n const setupRun = spawnSync(executable, ['setup', '--skip-cli-install', '--json'], {\n encoding: 'utf8', env: effectiveEnv, timeout: 180_000,\n })\n let setup: Record<string, any> | null = null\n try { setup = setupRun.stdout ? JSON.parse(setupRun.stdout) : null } catch { /* reported below */ }\n if (!setup) {\n throw new Error(\n `CLI 已升级到 ${installedVersion},但 setup 输出无法解析: ` +\n `${String(setupRun.stderr || setupRun.stdout).trim() || `退出码 ${setupRun.status}`}\\n` +\n `可手动执行: ${verifyCommand}`,\n )\n }\n return {\n $schema: 'dingtalk-agent/upgrade@1', currentVersion, targetVersion,\n target: packageSource, prefix, executable, changed, dryRun: false,\n ready: setupRun.status === 0 && setup.doctor?.ready === true,\n setup,\n skills: skillsBefore.map((item) => {\n const after = (setup?.skills || []).find((entry: any) => entry?.name === item.name)\n return {\n name: item.name,\n before: item.canonical.installedVersion,\n after: after?.canonical?.installedVersion ?? null,\n bundled: after?.bundled?.skillVersion ?? item.bundled.skillVersion,\n state: after?.canonical?.state ?? 'unknown',\n changed: (after?.canonical?.installedVersion ?? '') !== item.canonical.installedVersion,\n }\n }),\n commands: { install: installCommand, verify: verifyCommand },\n }\n}\n\nfunction resolveTargetVersion(packageSource: string, env: NodeJS.ProcessEnv): string {\n const run = spawnSync('npm', ['view', packageSource, 'version', '--json', '--registry', REGISTRY], {\n encoding: 'utf8', env, timeout: 30_000,\n })\n const output = String(run.stdout || '').trim()\n if (run.error || run.status !== 0) {\n throw new Error(\n `无法解析升级目标 ${packageSource}: ` +\n `${run.error?.message || String(run.stderr || '').trim() || `退出码 ${run.status}`}`,\n )\n }\n try {\n const value = JSON.parse(output)\n if (typeof value === 'string' && value) return value\n } catch { /* fall through */ }\n if (output) return output.replace(/^['\"]|['\"]$/g, '')\n throw new Error(`npm view 没有返回 ${packageSource} 的版本`)\n}\n\nfunction shellQuote(value: string): string {\n return /^[A-Za-z0-9_./:=@\"$-]+$/.test(value) ? value : `'${value.replace(/'/g, `'\"'\"'`)}'`\n}\n"]}
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/upgrade.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { delimiter, join } from 'node:path'\nimport { spawnSync } from 'node:child_process'\nimport { cleanVersion, compareVersions } from './version.js'\nimport { skillSuiteStatus } from './skill-manager.js'\n\nconst PACKAGE_NAME = '@xdxer/dingtalk-agent'\nconst REGISTRY = 'https://registry.npmjs.org'\n\nexport interface UpgradeOptions {\n home?: string\n env?: NodeJS.ProcessEnv\n prefix?: string\n channel?: 'beta' | 'latest'\n version?: string\n dryRun?: boolean\n force?: boolean\n /** 人类通道的进度回调;不传时行为与不带该参数时逐字节相同。--json 分支不得传。 */\n onEvent?: (event: UpgradeEvent) => void\n}\n\n/** 升级过程中的阶段事件。业务逻辑不依赖它,渲染层也不回写它。 */\nexport interface UpgradeEvent {\n /** 第几步,从 1 起 */\n step: number\n /** 总步数:dry-run 3 步,实跑 7 步 */\n total: number\n id: 'freeze' | 'resolve' | 'guard' | 'install' | 'locate' | 'verify-cli' | 'verify-env'\n label: string\n phase: 'begin' | 'end'\n ok?: boolean\n /** 终态附注,例如 '未变更,跳过' */\n meta?: string\n}\n\n/** `dta upgrade --check` 的结果;与 upgrade@1 分开,避免动既有 Schema。 */\nexport interface UpgradeCheckResult {\n $schema: 'dingtalk-agent/upgrade-check@1'\n currentVersion: string\n targetVersion: string\n /** 解析用的来源,可能是可变 tag(`pkg@latest`) */\n target: string\n /**\n * 钉死到精确版本的安装源。**安装必须用它而不是 target**:\n * 从解析到用户按下 y 之间,registry 的 tag 可能已经指向别的版本,\n * 那样会装进 Y 却按 X 校验,机器已经被改了才发现不一致。\n */\n pinnedSource: string\n channel: 'beta' | 'latest'\n /**\n * 目标相对当前版本的关系。**不能只给 outdated 布尔量**:\n * `--version <旧版> --force` 时 outdated=false,界面会显示\"已是最新\",\n * 用户确认之后却真的降级了——在不可逆动作前给了反的信息。\n */\n relation: 'upgrade' | 'same' | 'downgrade'\n}\n\nexport interface UpgradeResult {\n $schema: 'dingtalk-agent/upgrade@1'\n currentVersion: string\n targetVersion: string\n target: string\n prefix: string\n executable: string\n changed: boolean\n dryRun: boolean\n ready: boolean\n setup: Record<string, any> | null\n skills: UpgradeSkillReport[]\n commands: { install: string; verify: string }\n}\n\n/** 升级前后各 Skill 的版本核对;`after` 为 null 表示 dry-run 尚未执行。 */\nexport interface UpgradeSkillReport {\n name: string\n before: string\n after: string | null\n bundled: string\n state: string\n changed: boolean\n}\n\nexport function upgradeAgent(packageRoot: string, options: UpgradeOptions = {}): UpgradeResult {\n const home = options.home || homedir()\n const env = { ...process.env, ...(options.env || {}) }\n const pkg = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'))\n const currentVersion = String(pkg.version || '')\n const prefix = options.prefix || join(home, '.local')\n const binDir = process.platform === 'win32' ? prefix : join(prefix, 'bin')\n const executable = join(binDir, process.platform === 'win32' ? 'dta.cmd' : 'dta')\n\n // 阶段追踪:只发事件,不改任何返回值。不传 onEvent 时整段是纯开销为零的空转。\n let step = 0\n const total = options.dryRun ? 3 : 7\n // 观察者抛错不得影响升级:begin 抛错会挡住业务,end 抛错会把已经成功的\n // 安装变成失败抛出,可能诱导用户重试一次真实安装。一律隔离并就地禁用。\n let observer = options.onEvent\n const track = <T>(\n id: UpgradeEvent['id'], label: string, run: () => T,\n meta?: (value: T) => string,\n /** 不给时\"没抛错就算成功\";verify-env 这种要看内容才知道成没成的必须自定 */\n okOf?: (value: T) => boolean,\n ): T => {\n step += 1\n const emit = (phase: 'begin' | 'end', ok?: boolean, note?: string) => {\n if (!observer) return\n try { observer({ step, total, id, label, phase, ok, meta: note }) }\n catch { observer = undefined }\n }\n emit('begin')\n try {\n const value = run()\n emit('end', okOf ? okOf(value) : true, meta?.(value))\n return value\n } catch (error) {\n emit('end', false)\n throw error\n }\n }\n\n // 升级前先冻结本机 Skill 版本,否则重装之后无从核对到底动了什么。\n const skillsBefore = track(\n 'freeze', '冻结当前 Skill 版本',\n () => skillSuiteStatus(packageRoot, { home }).skills,\n (skills) => `${skills.length} 个 Skill`,\n )\n\n if (options.channel && options.version) {\n throw new Error('upgrade 的 --channel 与 --version 不能同时使用')\n }\n const channel = options.channel || (currentVersion.includes('-') ? 'beta' : 'latest')\n if (!['beta', 'latest'].includes(channel)) {\n throw new Error(`不支持的升级通道: ${channel};只能是 beta 或 latest`)\n }\n const requested = cleanVersion(options.version) || channel\n const packageSource = env.DTA_UPGRADE_PACKAGE_SOURCE || `${PACKAGE_NAME}@${requested}`\n const targetVersion = track(\n 'resolve', '解析升级目标',\n () => env.DTA_UPGRADE_TARGET_VERSION || resolveTargetVersion(packageSource, env),\n (version) => version,\n )\n track('guard', '检查版本关系', () => {\n if (compareVersions(targetVersion, currentVersion) < 0 && !(options.version && options.force)) {\n throw new Error(\n `升级目标 ${targetVersion} 低于当前版本 ${currentVersion},拒绝自动降级;` +\n '如确需降级,请同时使用 --version 与 --force',\n )\n }\n }, () => `${currentVersion} → ${targetVersion}`)\n const installArgs = [\n 'install', '--global', '--prefix', prefix, '--registry', REGISTRY, packageSource,\n ]\n const installCommand = ['npm', ...installArgs].map(shellQuote).join(' ')\n const verifyCommand = `${shellQuote(executable)} setup --skip-cli-install`\n const changed = options.force || targetVersion !== currentVersion\n\n if (options.dryRun) {\n return {\n $schema: 'dingtalk-agent/upgrade@1', currentVersion, targetVersion,\n target: packageSource, prefix, executable, changed, dryRun: true,\n ready: false, setup: null,\n skills: skillsBefore.map((item) => ({\n name: item.name,\n before: item.canonical.installedVersion,\n after: null,\n bundled: item.bundled.skillVersion,\n state: item.canonical.state,\n changed: item.canonical.state !== 'current',\n })),\n commands: { install: installCommand, verify: verifyCommand },\n }\n }\n\n track('install', `安装 ${packageSource}`, () => {\n if (!changed) return\n const install = spawnSync('npm', installArgs, { encoding: 'utf8', env, timeout: 120_000 })\n const output = [install.stdout, install.stderr].filter(Boolean).join('\\n').trim()\n if (install.error || install.status !== 0) {\n throw new Error(\n `CLI 升级失败: ${install.error?.message || output || `退出码 ${install.status}`}\\n` +\n `可手动执行: ${installCommand}`,\n )\n }\n }, () => changed ? targetVersion : '未变更,跳过')\n track('locate', '定位新 CLI', () => {\n if (!existsSync(executable)) {\n throw new Error(`npm 升级完成但找不到新 CLI: ${executable}\\n可手动执行: ${installCommand}`)\n }\n }, () => executable)\n const effectiveEnv = {\n ...env,\n HOME: home,\n PATH: [binDir, env.PATH || ''].filter(Boolean).join(delimiter),\n }\n const installedVersion = track('verify-cli', '校验新 CLI 版本', () => {\n const versionRun = spawnSync(executable, ['--version'], {\n encoding: 'utf8', env: effectiveEnv, timeout: 8_000,\n })\n const actual = String(versionRun.stdout || '').trim()\n if (versionRun.status !== 0 || actual !== targetVersion) {\n throw new Error(\n `新 CLI 版本校验失败: expected=${targetVersion}, actual=${actual || 'unknown'}\\n` +\n `可重试: ${installCommand}`,\n )\n }\n return actual\n }, (version) => version)\n // spawn 必须在 track 内部:这是整条链路最长的一步(180 秒预算),\n // 放到外面等于最该有进度的地方反而静默。\n let setupStatus = 0\n const setup = track('verify-env', '复核环境', () => {\n const setupRun = spawnSync(executable, ['setup', '--skip-cli-install', '--json'], {\n encoding: 'utf8', env: effectiveEnv, timeout: 180_000,\n })\n setupStatus = setupRun.status ?? 1\n let parsed: Record<string, any> | null = null\n try { parsed = setupRun.stdout ? JSON.parse(setupRun.stdout) : null } catch { /* reported below */ }\n if (!parsed) {\n throw new Error(\n `CLI 已升级到 ${installedVersion},但 setup 输出无法解析: ` +\n `${String(setupRun.stderr || setupRun.stdout).trim() || `退出码 ${setupRun.status}`}\\n` +\n `可手动执行: ${verifyCommand}`,\n )\n }\n return parsed\n },\n (parsed) => parsed?.doctor?.ready === true ? '全部 ready' : '部分未 ready',\n // 不能只看\"JSON 解析出来了\"就打 ✔:那会渲染成自相矛盾的 \"✔ 部分未 ready\"\n (parsed) => setupStatus === 0 && parsed?.doctor?.ready === true)\n return {\n $schema: 'dingtalk-agent/upgrade@1', currentVersion, targetVersion,\n target: packageSource, prefix, executable, changed, dryRun: false,\n ready: setupStatus === 0 && setup.doctor?.ready === true,\n setup,\n skills: skillsBefore.map((item) => {\n const after = (setup?.skills || []).find((entry: any) => entry?.name === item.name)\n return {\n name: item.name,\n before: item.canonical.installedVersion,\n after: after?.canonical?.installedVersion ?? null,\n bundled: after?.bundled?.skillVersion ?? item.bundled.skillVersion,\n state: after?.canonical?.state ?? 'unknown',\n changed: (after?.canonical?.installedVersion ?? '') !== item.canonical.installedVersion,\n }\n }),\n commands: { install: installCommand, verify: verifyCommand },\n }\n}\n\n/**\n * 只解析升级目标,不碰磁盘、不装任何东西。\n *\n * 独立于 upgradeAgent 的 Schema:`upgrade@1` 是 release-readiness 和契约\n * eval 的解析对象,不能为了一个只读命令给它加字段。\n */\nexport function checkUpgrade(packageRoot: string, options: UpgradeOptions = {}): UpgradeCheckResult {\n const env = { ...process.env, ...(options.env || {}) }\n const pkg = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'))\n const currentVersion = String(pkg.version || '')\n if (options.channel && options.version) {\n throw new Error('upgrade 的 --channel 与 --version 不能同时使用')\n }\n const channel = options.channel || (currentVersion.includes('-') ? 'beta' : 'latest')\n if (!['beta', 'latest'].includes(channel)) {\n throw new Error(`不支持的升级通道: ${channel};只能是 beta 或 latest`)\n }\n const requested = cleanVersion(options.version) || channel\n const packageSource = env.DTA_UPGRADE_PACKAGE_SOURCE || `${PACKAGE_NAME}@${requested}`\n const targetVersion = env.DTA_UPGRADE_TARGET_VERSION || resolveTargetVersion(packageSource, env)\n const order = compareVersions(targetVersion, currentVersion)\n return {\n $schema: 'dingtalk-agent/upgrade-check@1',\n currentVersion, targetVersion, target: packageSource,\n // 用户显式给过 source(本地路径、tarball 等)就原样保留,只有默认的\n // `pkg@tag` 这种可变来源才需要钉死。\n pinnedSource: env.DTA_UPGRADE_PACKAGE_SOURCE || `${PACKAGE_NAME}@${targetVersion}`,\n channel: channel as 'beta' | 'latest',\n relation: order > 0 ? 'upgrade' : order < 0 ? 'downgrade' : 'same',\n }\n}\n\nfunction resolveTargetVersion(packageSource: string, env: NodeJS.ProcessEnv): string {\n const run = spawnSync('npm', ['view', packageSource, 'version', '--json', '--registry', REGISTRY], {\n encoding: 'utf8', env, timeout: 30_000,\n })\n const output = String(run.stdout || '').trim()\n if (run.error || run.status !== 0) {\n throw new Error(\n `无法解析升级目标 ${packageSource}: ` +\n `${run.error?.message || String(run.stderr || '').trim() || `退出码 ${run.status}`}`,\n )\n }\n try {\n const value = JSON.parse(output)\n if (typeof value === 'string' && value) return value\n } catch { /* fall through */ }\n if (output) return output.replace(/^['\"]|['\"]$/g, '')\n throw new Error(`npm view 没有返回 ${packageSource} 的版本`)\n}\n\nfunction shellQuote(value: string): string {\n return /^[A-Za-z0-9_./:=@\"$-]+$/.test(value) ? value : `'${value.replace(/'/g, `'\"'\"'`)}'`\n}\n"]}
package/dist/src/waits.js CHANGED
@@ -7,6 +7,7 @@ import { dirname, resolve, join } from 'node:path';
7
7
  import { hostname } from 'node:os';
8
8
  import { randomUUID } from 'node:crypto';
9
9
  import { digest, stableStringify } from './events.js';
10
+ import { err } from './tui.js';
10
11
  const OPEN_CHAIN = new Set([
11
12
  'arming', 'active', 'uncertain', 'claimed', 'cancel-pending',
12
13
  ]);
@@ -841,7 +842,7 @@ function mirror(record) {
841
842
  persist(join(dir, `${record.id}.json`), record);
842
843
  }
843
844
  catch (e) {
844
- console.error(` ⚠️ Wait 审计镜像写入失败(waitRoot 权威真值已保留): ${e.message}`);
845
+ console.error(err().theme.warn(` ⚠️ Wait 审计镜像写入失败(waitRoot 权威真值已保留): ${e.message}`));
845
846
  }
846
847
  }
847
848
  function readJson(path) {
@@ -1 +1 @@
1
- {"version":3,"file":"waits.js","sourceRoot":"","sources":["../../src/waits.ts"],"names":[],"mappings":"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","sourcesContent":["// 单链 Durable Wait(TypeScript source)。\n//\n// v1 只解决一件事:ask 之后,下一条来自同一 Field/tenant/conversation/actor\n// 的 DM 或直接 @,恢复原 Session 并创建新 Run。这里不实现通用 workflow/stack。\n\nimport {\n existsSync, linkSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync,\n writeFileSync,\n} from 'node:fs'\nimport { dirname, resolve, join } from 'node:path'\nimport { hostname } from 'node:os'\nimport { randomUUID } from 'node:crypto'\nimport { digest, stableStringify } from './events.js'\n\nconst OPEN_CHAIN = new Set([\n 'arming', 'active', 'uncertain', 'claimed', 'cancel-pending',\n])\nconst RESUMABLE = new Set(['active', 'uncertain'])\nconst DEFAULT_TTL_MS = 7 * 24 * 60 * 60 * 1000\n\nexport function armWait(root, cfg, input) {\n const scope = scopeFromTarget(input.fieldId, input.event, input.target)\n if (!scope) {\n throw new Error('ask 无法建立 Wait:必须有 tenant、conversation、actor,且事件是 DM 或直接 @')\n }\n const rootPath = waitRoot(root, cfg)\n const scopeHash = digest(stableStringify(scope))\n const path = join(rootPath, `${scopeHash}.json`)\n const waitId = `wait_${digest(`${input.sessionId}\\0${input.actionId}`).slice(0, 20)}`\n const history = join(rootPath, 'history', `${waitId}.json`)\n mkdirSync(rootPath, { recursive: true })\n // 旧 ask 的 Receipt 可能在同一 scope 已进入下一轮 Wait 后重放;历史记录存在时\n // 只返回原 Wait,不能用旧 Receipt 覆盖当前正在等待的新问题。\n if (existsSync(history)) {\n const recorded = readJson(history)\n assertScope(recorded, scope, scopeHash)\n if (recorded.id === waitId && recorded.actionId === input.actionId &&\n recorded.sessionId === input.sessionId) return recorded\n }\n return withLock(path, () => {\n let existing = existsSync(path) ? readJson(path) : null\n if (existing) {\n assertScope(existing, scope, scopeHash)\n existing = repairFromReceipt(root, cfg, path, existing)\n }\n if (existing?.id === waitId && existing.actionId === input.actionId) return existing\n const ownedClaim = existing?.status === 'claimed' &&\n existing.sessionId === input.sessionId &&\n existing.claim?.runId === input.sourceRunId\n if (existing && OPEN_CHAIN.has(existing.status) && !expired(existing) &&\n !ownedClaim) {\n throw new Error(\n `同一人员/会话已有未完成 Wait ${existing.id}(Session ${existing.sessionId});` +\n '单链 v1 拒绝并行追问')\n }\n if (ownedClaim) {\n persistHistory(path, {\n ...existing, status: 'continued', continuedAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n })\n }\n const now = new Date().toISOString()\n const ttl = positiveNumber(cfg.runtime?.waitTtlMs, DEFAULT_TTL_MS)\n const record = {\n $schema: 'dingtalk-agent/wait@1',\n id: waitId,\n scopeHash,\n scope,\n fieldId: input.fieldId,\n sessionId: input.sessionId,\n sessionPath: resolve(input.sessionPath),\n sourceRunId: input.sourceRunId,\n actionId: input.actionId,\n questionText: String(input.questionText || ''),\n status: 'arming',\n version: Number(existing?.version || 0) + 1,\n createdAt: now,\n updatedAt: now,\n expiresAt: new Date(Date.now() + ttl).toISOString(),\n delivery: null,\n claim: null,\n }\n persistWait(path, record)\n return record\n })\n}\n\n/** Receipt 是真值;重放 Receipt 也能幂等补齐 active/uncertain Wait。 */\nexport function reconcileWaitFromReceipt(root, cfg, wait, receipt) {\n if (!wait) return null\n if (wait.actionId !== receipt.actionId) {\n throw new Error(`Wait/Receipt actionId 不一致: ${wait.actionId}/${receipt.actionId}`)\n }\n if (wait.lastAppliedReceiptActionId === receipt.actionId) return wait\n const path = join(waitRoot(root, cfg), `${wait.scopeHash}.json`)\n return withLock(path, () => {\n if (!existsSync(path)) throw new Error(`Wait 索引丢失: ${wait.id}`)\n const current = readJson(path)\n if (current.id === wait.id && current.actionId === receipt.actionId) {\n if (current.lastAppliedReceiptActionId === receipt.actionId) return current\n const next = applyReceipt(current, receipt)\n persistWait(path, next)\n return next\n }\n // 该链可能已经进入下一轮 Wait;旧 Receipt 只补自己的历史,不得覆盖 scope head。\n const history = join(waitRoot(root, cfg), 'history', `${wait.id}.json`)\n if (!existsSync(history)) {\n throw new Error(`Wait/Receipt 身份冲突: wait=${current.id}, action=${receipt.actionId}`)\n }\n const recorded = readJson(history)\n if (recorded.id !== wait.id || recorded.actionId !== receipt.actionId) {\n throw new Error(`Wait 历史与 Receipt 身份冲突: wait=${wait.id}, action=${receipt.actionId}`)\n }\n if (recorded.lastAppliedReceiptActionId === receipt.actionId) return recorded\n const next = applyReceipt(recorded, receipt)\n persistHistory(path, next)\n return next\n })\n}\n\n/** DWS 已返回可查询结果后立即开放 Wait;平台回读可以随后完成。 */\nexport function markWaitTransportAccepted(root, cfg, wait, result) {\n if (!wait) return null\n const path = join(waitRoot(root, cfg), `${wait.scopeHash}.json`)\n return withLock(path, () => {\n if (!existsSync(path)) throw new Error(`Wait 索引丢失: ${wait.id}`)\n const current = readJson(path)\n if (current.id === wait.id) {\n const next = applyTransportResult(current, result)\n persistWait(path, next)\n return next\n }\n const history = join(waitRoot(root, cfg), 'history', `${wait.id}.json`)\n if (!existsSync(history)) throw new Error(`Wait 已被其他链替换: ${wait.id}`)\n const recorded = readJson(history)\n if (recorded.id !== wait.id || recorded.actionId !== wait.actionId) {\n throw new Error(`Wait 历史与 transport-result 身份冲突: ${wait.id}`)\n }\n const next = applyTransportResult(recorded, result)\n persistHistory(path, next)\n return next\n })\n}\n\n/** resumed Run 给出最终 reply/silence 后,释放单链 scope。 */\nexport function completeWaitFromReceipt(root, cfg, resume, receipt) {\n if (resume?.mode !== 'resume' || !resume.waitId) return null\n const rootPath = waitRoot(root, cfg)\n const historyPath = join(rootPath, 'history', `${resume.waitId}.json`)\n let recorded = existsSync(historyPath) ? readJson(historyPath) : null\n let scopeHash = recorded?.scopeHash || resume.waitScopeHash || ''\n if (!scopeHash && existsSync(rootPath)) {\n const matches = readdirSync(rootPath)\n .filter((name) => name.endsWith('.json'))\n .map((name) => readJson(join(rootPath, name)))\n .filter((candidate) => candidate.id === resume.waitId)\n if (matches.length === 1) {\n recorded = matches[0]\n scopeHash = recorded.scopeHash\n }\n }\n if (!scopeHash) throw new Error(`Wait 历史丢失且无法从 scope head 修复: ${resume.waitId}`)\n const path = join(rootPath, `${scopeHash}.json`)\n return withLock(path, () => {\n if (!recorded) {\n const current = existsSync(path) ? readJson(path) : null\n if (!current || current.id !== resume.waitId) {\n throw new Error(`Wait 历史丢失且 scope head 不匹配: ${resume.waitId}`)\n }\n recorded = current\n persistHistory(path, recorded)\n }\n const now = new Date().toISOString()\n const current = existsSync(path) ? readJson(path) : null\n if (current?.id === recorded.id) {\n if (current.status === 'cancelled') {\n persistHistory(path, current)\n return current\n }\n const next = {\n ...current,\n status: current.status === 'cancel-pending' ? 'cancel-pending' : 'completed',\n updatedAt: now, completedAt: now,\n completedByReceiptActionId: receipt.actionId,\n }\n persistWait(path, next)\n return next\n }\n const next = {\n ...recorded, status: recorded.status === 'cancelled' ? 'cancelled' : 'completed',\n updatedAt: now, completedAt: now, completedByReceiptActionId: receipt.actionId,\n }\n persistHistory(path, next)\n return next\n })\n}\n\n/**\n * 显式 /stop、/cancel 是宿主控制面:不依赖当前 Field/Behavior/Skill。\n * 先写 cancel-pending,再在线性化锁内提升 Session generation,最后写 cancelled。\n */\nexport function cancelWaitForEvent(root, cfg, event) {\n if (!isCancelCommand(event.message?.text)) return null\n const eventScope = scopeWithoutField(event)\n if (!eventScope) return null\n const rootPath = waitRoot(root, cfg)\n const replay = readEventBinding(rootPath, event.id)\n if (replay) {\n assertEventBinding(replay, event, 'cancel', eventScope)\n if (replay.outcome === 'no-match') return null\n if (replay.outcome === 'ambiguous') {\n throw new Error(`取消命中多个 Wait,已固化为 ambiguous: ${(replay.candidates || []).join(', ')}`)\n }\n return cancelBoundWait(root, cfg, event, replay)\n }\n if (!existsSync(rootPath)) {\n createNoMatchBinding(rootPath, event, 'cancel', eventScope)\n return null\n }\n const candidates: Array<{ path: string; record: Record<string, any> }> = []\n for (const name of readdirSync(rootPath)) {\n if (!name.endsWith('.json')) continue\n const path = join(rootPath, name)\n const record = readJson(path)\n const sameCancel = record.claim?.eventId === event.id &&\n record.claim?.cancelRequested === true\n if (sameEventScope(record.scope, eventScope) &&\n (OPEN_CHAIN.has(record.status) || sameCancel ||\n (record.status === 'cancelled' && record.claim?.eventId === event.id))) {\n candidates.push({ path, record })\n }\n }\n if (candidates.length > 1) {\n createNoMatchBinding(rootPath, event, 'cancel', eventScope, {\n outcome: 'ambiguous', candidates: candidates.map((x) => x.record.id).sort(),\n })\n throw new Error(`取消命中多个 Wait,拒绝猜测: ${candidates.map((x) => x.record.id).join(', ')}`)\n }\n if (!candidates.length) {\n createNoMatchBinding(rootPath, event, 'cancel', eventScope)\n return null\n }\n const { path } = candidates[0]\n const bound = withLock(path, () => {\n let current = readJson(path)\n if (!sameEventScope(current.scope, eventScope)) {\n throw new Error(`取消 Wait 作用域漂移: ${current.id}`)\n }\n current = repairFromReceipt(root, cfg, path, current)\n if (current.status === 'cancelled' && current.claim?.eventId === event.id) {\n return createEventBinding(rootPath, event, 'cancel', current)\n }\n if (!OPEN_CHAIN.has(current.status)) {\n createNoMatchBinding(rootPath, event, 'cancel', eventScope)\n return null\n }\n // 先把 head 置为 pending,再写 ledger。两者之间即使 SIGKILL,重放也会从\n // pending 的 eventId 恢复;Action 无法趁 binding→effect-lock 窗口建立 W2。\n const now = new Date().toISOString()\n const sameCancel = current.claim?.eventId === event.id &&\n current.claim?.cancelRequested === true\n ensureClaimBinding(rootPath, current)\n const pending = {\n ...current,\n status: 'cancel-pending',\n updatedAt: now,\n previousClaim: sameCancel ? current.previousClaim || null : current.claim || null,\n claim: {\n eventId: event.id, eventKind: event.kind, claimedAt: now,\n runId: '', cancelRequested: true,\n },\n }\n persistWait(path, pending)\n const binding = createEventBinding(rootPath, event, 'cancel', pending)\n return binding\n })\n return bound ? cancelBoundWait(root, cfg, event, bound) : null\n}\n\n/** Action 与 cancel 共用这一把锁;先拿到锁的一方定义副作用先后。 */\nexport function acquireSessionEffectLock(root, sessionPath) {\n const dir = resolve(root, '.dingtalk-agent/session-effect-locks')\n mkdirSync(dir, { recursive: true })\n return acquireLock(\n join(dir, `${digest(resolve(sessionPath))}.lock`), 30 * 60_000, 3 * 60_000)\n}\n\n/**\n * incoming Event 在创建新 Session 前调用。显式 sessionKey/correlation 由调用方优先处理。\n * claimed/cancelled + 同 eventId 可重入,覆盖 materialize 过程中崩溃后的恢复窗口。\n */\nexport function claimWait(root, cfg, fieldId, event) {\n const scope = scopeFromEvent(fieldId, event)\n if (!scope) return null\n const rootPath = waitRoot(root, cfg)\n const scopeHash = digest(stableStringify(scope))\n const path = join(rootPath, `${scopeHash}.json`)\n const replay = readEventBinding(rootPath, event.id)\n if (replay) {\n assertEventBinding(replay, event, 'claim', scope)\n if (replay.outcome === 'no-match') return null\n return claimBoundWait(root, cfg, event, replay)\n }\n return withLock(path, () => {\n if (!existsSync(path)) {\n createNoMatchBinding(rootPath, event, 'claim', scope)\n return null\n }\n let current = readJson(path)\n assertScope(current, scope, scopeHash)\n current = repairFromReceipt(root, cfg, path, current)\n if (current.status === 'claimed' && current.claim?.eventId === event.id &&\n current.claim?.cancelRequested !== true) {\n createEventBinding(rootPath, event, 'claim', current)\n return current\n }\n if (expired(current)) {\n ensureClaimBinding(rootPath, current)\n if (OPEN_CHAIN.has(current.status)) {\n const next = { ...current, status: 'expired', updatedAt: new Date().toISOString() }\n persistWait(path, next)\n }\n createNoMatchBinding(rootPath, event, 'claim', scope)\n return null\n }\n if (!RESUMABLE.has(current.status)) {\n createNoMatchBinding(rootPath, event, 'claim', scope)\n return null\n }\n const now = new Date().toISOString()\n const next = {\n ...current,\n status: 'claimed',\n updatedAt: now,\n claim: {\n eventId: event.id,\n eventKind: event.kind,\n claimedAt: now,\n runId: '',\n cancelRequested: false,\n },\n }\n persistWait(path, next)\n createEventBinding(rootPath, event, 'claim', next)\n return next\n })\n}\n\nexport function attachClaimedRun(root, cfg, wait, eventId, runId) {\n if (!wait) return null\n const path = join(waitRoot(root, cfg), `${wait.scopeHash}.json`)\n return withLock(path, () => {\n const loaded = readBoundWait(path, wait.id)\n if (!loaded || loaded.record.claim?.eventId !== eventId) {\n throw new Error(`Wait claim 身份冲突: wait=${wait.id}, event=${eventId}`)\n }\n const current = loaded.record\n if (current.claim.runId && current.claim.runId !== runId) {\n throw new Error(`Wait ${wait.id} 已绑定其他 Run: ${current.claim.runId}`)\n }\n if (current.claim.runId === runId) {\n // head 已写而 history 未写时,幂等重试必须顺手补齐历史真值。\n persistBoundWait(path, current, loaded.isHead)\n return current\n }\n const next = {\n ...current,\n updatedAt: new Date().toISOString(),\n claim: { ...current.claim, runId },\n }\n persistBoundWait(path, next, loaded.isHead)\n return next\n })\n}\n\nexport function waitRoot(root, cfg) {\n return resolve(root, cfg.runtime?.waitRoot || '.dingtalk-agent/waits')\n}\n\nexport function readWaitForEvent(root, cfg, fieldId, event) {\n const scope = scopeFromEvent(fieldId, event)\n if (!scope) return null\n const path = join(waitRoot(root, cfg), `${digest(stableStringify(scope))}.json`)\n return existsSync(path) ? readJson(path) : null\n}\n\nexport function isCancelCommand(text) {\n // Live canary 的合成入站必须保留唯一 marker;marker 只是证据,不应阻断\n // 随后的显式取消命令。生产消息不带 marker 时仍保持原有严格匹配。\n const value = String(text || '').trim()\n .replace(/^\\[DTA-LAB-[^\\]\\n]+\\]\\s*/u, '')\n return /^\\/(?:stop|cancel|停止|取消)$/i.test(value)\n}\n\n/** eventId 一旦绑定 Wait,重放永远解析原 Wait,不能重新扫描当前 scope head。 */\nfunction createEventBinding(rootPath, event, operation, wait) {\n const path = eventBindingPath(rootPath, event.id)\n const binding = {\n $schema: 'dingtalk-agent/wait-event-binding@1',\n eventId: event.id,\n eventKind: event.kind,\n operation,\n outcome: 'matched',\n waitId: wait.id,\n scopeHash: wait.scopeHash,\n scope: wait.scope,\n fieldId: wait.fieldId,\n sessionId: wait.sessionId,\n sessionPath: wait.sessionPath,\n sourceRunId: wait.sourceRunId,\n actionId: wait.actionId,\n boundAt: new Date().toISOString(),\n }\n if (!writeJsonCreateAtomic(path, binding)) {\n const existing = readJson(path)\n if (stableStringify(bindingIdentity(existing)) !== stableStringify(bindingIdentity(binding))) {\n throw new Error(`Event ${event.id} 已绑定其他 Wait,拒绝 ABA 重解释`)\n }\n return existing\n }\n return binding\n}\n\nfunction createNoMatchBinding(\n rootPath,\n event,\n operation,\n scope,\n options: Record<string, any> = {},\n) {\n const path = eventBindingPath(rootPath, event.id)\n const binding = {\n $schema: 'dingtalk-agent/wait-event-binding@1',\n eventId: event.id,\n eventKind: event.kind,\n operation,\n outcome: options.outcome || 'no-match',\n candidates: options.candidates || [],\n waitId: '',\n scopeHash: digest(stableStringify(scope)),\n scope,\n fieldId: '',\n sessionId: '',\n sessionPath: '',\n sourceRunId: '',\n actionId: '',\n boundAt: new Date().toISOString(),\n }\n if (!writeJsonCreateAtomic(path, binding)) {\n const existing = readJson(path)\n if (stableStringify(bindingIdentity(existing)) !== stableStringify(bindingIdentity(binding))) {\n throw new Error(`Event ${event.id} 的 Wait 路由决策已固化,拒绝重新解释`)\n }\n return existing\n }\n return binding\n}\n\nfunction readEventBinding(rootPath, eventId) {\n const path = eventBindingPath(rootPath, eventId)\n return existsSync(path) ? readJson(path) : null\n}\n\nfunction eventBindingPath(rootPath, eventId) {\n return join(rootPath, 'events', `${digest(eventId)}.json`)\n}\n\nfunction bindingIdentity(value) {\n return {\n eventId: value.eventId,\n eventKind: value.eventKind,\n operation: value.operation,\n outcome: value.outcome,\n candidates: value.candidates || [],\n waitId: value.waitId,\n scopeHash: value.scopeHash,\n scope: value.scope,\n fieldId: value.fieldId,\n sessionId: value.sessionId,\n sessionPath: value.sessionPath,\n sourceRunId: value.sourceRunId,\n actionId: value.actionId,\n }\n}\n\nfunction assertEventBinding(binding, event, operation, expectedScope) {\n if (binding.eventId !== event.id || binding.eventKind !== event.kind ||\n binding.operation !== operation) {\n throw new Error(`Event ${event.id} 的 Wait binding 类型冲突`)\n }\n const scopeMatches = operation === 'cancel'\n ? sameEventScope(binding.scope, expectedScope)\n : stableStringify(binding.scope) === stableStringify(expectedScope)\n if (!scopeMatches || binding.scopeHash !== digest(stableStringify(binding.scope))) {\n throw new Error(`Event ${event.id} 的 Wait binding 作用域漂移`)\n }\n}\n\nfunction assertWaitBinding(record, binding) {\n const actual = {\n waitId: record.id,\n scopeHash: record.scopeHash,\n fieldId: record.fieldId,\n sessionId: record.sessionId,\n sessionPath: record.sessionPath,\n sourceRunId: record.sourceRunId,\n actionId: record.actionId,\n }\n const expected = {\n waitId: binding.waitId,\n scopeHash: binding.scopeHash,\n fieldId: binding.fieldId,\n sessionId: binding.sessionId,\n sessionPath: binding.sessionPath,\n sourceRunId: binding.sourceRunId,\n actionId: binding.actionId,\n }\n if (stableStringify(actual) !== stableStringify(expected)) {\n throw new Error(`Wait event binding 身份漂移: ${binding.waitId}`)\n }\n}\n\nfunction cancelBoundWait(root, cfg, event, binding) {\n const path = join(waitRoot(root, cfg), `${binding.scopeHash}.json`)\n let pending = withLock(path, () => {\n const loaded = readBoundWait(path, binding.waitId)\n if (!loaded) throw new Error(`取消绑定的 Wait 不存在: ${binding.waitId}`)\n let current = loaded.record\n assertWaitBinding(current, binding)\n if (loaded.isHead) current = repairFromReceipt(root, cfg, path, current)\n if (current.status === 'cancelled' && current.claim?.eventId === event.id) return current\n if (['cancel-pending', 'cancelled'].includes(current.status) &&\n current.claim?.cancelRequested === true && current.claim?.eventId !== event.id) {\n // 两个 stop 同时到达时只让先行者提升 generation;后来者成为同 Session 的安全 no-op。\n return suppressedClaim(current, event.id)\n }\n const sameCancel = current.claim?.eventId === event.id &&\n current.claim?.cancelRequested === true\n if (!OPEN_CHAIN.has(current.status) && !sameCancel) {\n throw new Error(`取消绑定的 Wait 已进入 ${current.status}: ${binding.waitId}`)\n }\n const now = new Date().toISOString()\n ensureClaimBinding(waitRoot(root, cfg), current)\n const next = {\n ...current,\n status: 'cancel-pending',\n updatedAt: now,\n previousClaim: sameCancel ? current.previousClaim || null : current.claim || null,\n claim: {\n eventId: event.id, eventKind: event.kind, claimedAt: now,\n runId: '', cancelRequested: true,\n },\n }\n persistBoundWait(path, next, loaded.isHead)\n return next\n })\n\n if (pending.suppressed) return pending\n applyCancelFence(root, pending, event.id)\n pending = withLock(path, () => {\n const loaded = readBoundWait(path, binding.waitId)\n if (!loaded) throw new Error(`取消完成时 Wait 丢失: ${binding.waitId}`)\n const current = loaded.record\n assertWaitBinding(current, binding)\n if (current.claim?.eventId !== event.id) {\n throw new Error(`取消 Wait 身份漂移: ${binding.waitId}`)\n }\n if (current.status === 'cancelled') {\n persistBoundWait(path, current, loaded.isHead)\n return current\n }\n const next = { ...current, status: 'cancelled', updatedAt: new Date().toISOString() }\n persistBoundWait(path, next, loaded.isHead)\n return next\n })\n return pending\n}\n\nfunction claimBoundWait(root, cfg, event, binding) {\n const path = join(waitRoot(root, cfg), `${binding.scopeHash}.json`)\n return withLock(path, () => {\n const loaded = readBoundWait(path, binding.waitId)\n if (!loaded) throw new Error(`回复绑定的 Wait 不存在: ${binding.waitId}`)\n let current = loaded.record\n assertWaitBinding(current, binding)\n if (loaded.isHead) current = repairFromReceipt(root, cfg, path, current)\n if (current.status === 'claimed' && current.claim?.eventId === event.id) {\n if (!loaded.isHead) throw new Error(`已 claim 的 Wait 不再是 scope head: ${binding.waitId}`)\n return current\n }\n if (['cancel-pending', 'cancelled'].includes(current.status) &&\n current.claim?.cancelRequested === true) {\n return suppressedClaim(current, event.id)\n }\n if (!loaded.isHead || !RESUMABLE.has(current.status) || expired(current)) {\n throw new Error(`回复事件已绑定 Wait ${binding.waitId},但当前状态为 ${current.status};拒绝回退成新事项`)\n }\n const now = new Date().toISOString()\n const next = {\n ...current,\n status: 'claimed',\n updatedAt: now,\n claim: {\n eventId: event.id, eventKind: event.kind, claimedAt: now,\n runId: '', cancelRequested: false,\n },\n }\n persistWait(path, next)\n return next\n })\n}\n\nfunction suppressedClaim(record, eventId) {\n const cancelEventId = record.claim?.eventId || ''\n return {\n ...record,\n suppressed: true,\n cancelEventId,\n claim: {\n eventId,\n claimedAt: new Date().toISOString(),\n runId: '',\n cancelRequested: true,\n supersededByEventId: cancelEventId,\n },\n }\n}\n\nfunction ensureClaimBinding(rootPath, record) {\n const claim = record.claim?.cancelRequested !== true\n ? record.claim\n : record.previousClaim?.cancelRequested !== true ? record.previousClaim : null\n if (!claim?.eventId) return null\n if (!claim.eventKind) {\n throw new Error(`Wait ${record.id} 的 claim 缺少 eventKind,无法安全修复 event ledger`)\n }\n return createEventBinding(rootPath, {\n id: claim.eventId,\n kind: claim.eventKind,\n }, 'claim', record)\n}\n\nfunction readBoundWait(scopePath, waitId) {\n if (existsSync(scopePath)) {\n const current = readJson(scopePath)\n if (current.id === waitId) return { record: current, isHead: true }\n }\n const history = join(dirname(scopePath), 'history', `${waitId}.json`)\n return existsSync(history) ? { record: readJson(history), isHead: false } : null\n}\n\nfunction persistBoundWait(scopePath, record, isHead) {\n if (isHead) persistWait(scopePath, record)\n else persistHistory(scopePath, record)\n}\n\nfunction scopeFromTarget(fieldId, event, target) {\n if (!['im.message.dm', 'im.message.mentioned'].includes(event.kind)) return null\n return completeScope({\n fieldId,\n tenantId: target?.tenantId || event.tenant?.id,\n conversationId: target?.conversationId || event.conversation?.id,\n actorId: target?.senderOpenDingTalkId || event.actor?.openDingTalkId,\n })\n}\n\nfunction scopeFromEvent(fieldId, event) {\n if (!['im.message.dm', 'im.message.mentioned'].includes(event.kind)) return null\n return completeScope({\n fieldId,\n tenantId: event.tenant?.id,\n conversationId: event.conversation?.id,\n actorId: event.actor?.openDingTalkId,\n })\n}\n\nfunction scopeWithoutField(event) {\n if (!['im.message.dm', 'im.message.mentioned'].includes(event.kind)) return null\n return completeScope({\n tenantId: event.tenant?.id,\n conversationId: event.conversation?.id,\n actorId: event.actor?.openDingTalkId,\n })\n}\n\nfunction sameEventScope(scope, expected) {\n return scope?.tenantId === expected.tenantId &&\n scope?.conversationId === expected.conversationId &&\n scope?.actorId === expected.actorId\n}\n\nfunction completeScope(value) {\n const scope = Object.fromEntries(Object.entries(value).map(([k, v]) => [k, String(v || '').trim()]))\n return Object.values(scope).every(Boolean) ? scope : null\n}\n\nfunction assertScope(record, scope, scopeHash) {\n if (record.scopeHash !== scopeHash || stableStringify(record.scope) !== stableStringify(scope)) {\n throw new Error(`Wait scope hash 碰撞或内容漂移: ${scopeHash}`)\n }\n}\n\nfunction expired(record) {\n const deadline = Date.parse(record.expiresAt || '')\n return Number.isFinite(deadline) && deadline <= Date.now()\n}\n\nfunction positiveNumber(value, fallback) {\n const n = Number(value)\n return Number.isFinite(n) && n > 0 ? n : fallback\n}\n\nfunction applyReceipt(record, receipt) {\n const keepLifecycle = new Set([\n 'claimed', 'cancel-pending', 'cancelled', 'completed', 'continued', 'expired',\n ]).has(record.status)\n const transportAccepted = Boolean(record.delivery?.transportAccepted)\n return {\n ...record,\n status: keepLifecycle\n ? record.status\n : (receipt.outcome === 'uncertain' && !transportAccepted ? 'uncertain' : 'active'),\n updatedAt: new Date().toISOString(),\n lastAppliedReceiptActionId: receipt.actionId,\n delivery: {\n ...(record.delivery || {}),\n outcome: receipt.outcome,\n verified: Boolean(receipt.verified),\n verification: receipt.verification || '',\n questionMessageId: findValue(\n receipt, ['openMessageId', 'openMsgId', 'open_message_id']) ||\n record.delivery?.questionMessageId || '',\n },\n }\n}\n\nfunction applyTransportResult(record, result) {\n return {\n ...record,\n status: record.status === 'arming' || record.status === 'uncertain'\n ? 'active' : record.status,\n updatedAt: new Date().toISOString(),\n delivery: {\n ...(record.delivery || {}),\n transportAccepted: true,\n questionMessageId: findValue(result,\n ['openMessageId', 'openMsgId', 'open_message_id']) ||\n record.delivery?.questionMessageId || '',\n },\n }\n}\n\n/** 在 incoming Event 路由时修复 Receipt/transport-result 已落盘但 Wait 仍 arming 的窗口。 */\nfunction repairFromReceipt(root, cfg, path, record) {\n if (record.status !== 'arming') return record\n const actionPath = join(\n resolve(root, cfg.runtime?.eventIndexRoot || '.dingtalk-agent/event-index'),\n 'actions', record.sourceRunId, record.actionId)\n const receiptPath = join(actionPath, 'receipt.json')\n const resultPath = join(actionPath, 'transport-result.json')\n if (!existsSync(receiptPath) && !existsSync(resultPath)) return record\n\n const receipt = existsSync(receiptPath) ? readJson(receiptPath) : null\n const result = existsSync(resultPath) ? readJson(resultPath) : null\n const next = {\n ...record,\n status: (result || receipt?.outcome !== 'uncertain') ? 'active' : 'uncertain',\n updatedAt: new Date().toISOString(),\n lastAppliedReceiptActionId: receipt?.actionId || record.lastAppliedReceiptActionId,\n delivery: {\n ...(record.delivery || {}),\n transportAccepted: Boolean(result),\n outcome: receipt?.outcome || 'transport-accepted',\n verified: Boolean(receipt?.verified),\n verification: receipt?.verification || '',\n questionMessageId: findValue(receipt,\n ['openMessageId', 'openMsgId', 'open_message_id']) ||\n findValue(result, ['openMessageId', 'openMsgId', 'open_message_id']) ||\n record.delivery?.questionMessageId || '',\n },\n }\n persistWait(path, next)\n return next\n}\n\nfunction applyCancelFence(root, wait, eventId) {\n const releaseEffect = acquireSessionEffectLock(root, wait.sessionPath)\n try {\n const lockRoot = resolve(root, '.dingtalk-agent/session-locks')\n mkdirSync(lockRoot, { recursive: true })\n const releaseState = acquireLock(\n join(lockRoot, `${digest(resolve(wait.sessionPath))}.lock`), 2 * 60_000)\n try {\n const sessionPath = join(resolve(wait.sessionPath), 'session.json')\n if (!existsSync(sessionPath)) throw new Error(`取消目标 Session 不存在: ${wait.sessionId}`)\n const session = readJson(sessionPath)\n if (session.id !== wait.sessionId || session.fieldId !== wait.fieldId) {\n throw new Error(`取消目标 Session 身份不一致: ${wait.sessionId}`)\n }\n if (session.lastCancelEventId === eventId) return\n const generation = validGeneration(session.generation)\n persist(sessionPath, {\n ...session,\n generation: generation + 1,\n lastCancelEventId: eventId,\n cancelledAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n })\n } finally {\n releaseState()\n }\n } finally {\n releaseEffect()\n }\n}\n\nfunction validGeneration(value) {\n const n = Number(value ?? 1)\n if (!Number.isInteger(n) || n < 1) throw new Error('Session generation 非法,拒绝取消')\n return n\n}\n\nfunction persist(path, value) {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.${process.pid}.${Date.now()}.${randomUUID()}.tmp`\n writeFileSync(temp, JSON.stringify(value, null, 2) + '\\n', { flag: 'wx' })\n renameSync(temp, path)\n}\n\nfunction writeJsonCreateAtomic(path, value) {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.${process.pid}.${Date.now()}.${randomUUID()}.tmp`\n writeFileSync(temp, JSON.stringify(value, null, 2) + '\\n', { flag: 'wx' })\n try {\n linkSync(temp, path)\n return true\n } catch (e) {\n if (e.code === 'EEXIST') return false\n throw e\n } finally {\n rmSync(temp, { force: true })\n }\n}\n\nfunction persistWait(scopePath, record) {\n persist(scopePath, record)\n persistHistory(scopePath, record)\n}\n\nfunction persistHistory(scopePath, record) {\n persist(join(dirname(scopePath), 'history', `${record.id}.json`), record)\n mirror(record)\n}\n\nfunction mirror(record) {\n try {\n const dir = join(record.sessionPath, 'waits')\n mkdirSync(dir, { recursive: true })\n persist(join(dir, `${record.id}.json`), record)\n } catch (e) {\n console.error(` ⚠️ Wait 审计镜像写入失败(waitRoot 权威真值已保留): ${e.message}`)\n }\n}\n\nfunction readJson(path) {\n return JSON.parse(readFileSync(path, 'utf8'))\n}\n\nconst LOCK_HOST = hostname()\nconst sleep = (ms) => Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms)\n\nfunction withLock(path, fn) {\n const lockPath = `${path}.lock`\n mkdirSync(dirname(path), { recursive: true })\n const release = acquireLock(lockPath)\n try { return fn() } finally { release() }\n}\n\nfunction acquireLock(path, staleAfterMs = 60_000, waitMs = 5_000) {\n const token = randomUUID()\n const deadline = Date.now() + waitMs\n while (true) {\n try {\n mkdirSync(path)\n try {\n persist(join(path, 'owner.json'), {\n token, pid: process.pid, host: LOCK_HOST, acquiredAt: new Date().toISOString(),\n })\n } catch (e) {\n rmSync(path, { recursive: true, force: true })\n throw e\n }\n return () => {\n try {\n const owner = readJson(join(path, 'owner.json'))\n if (owner.token === token) rmSync(path, { recursive: true, force: true })\n } catch {}\n }\n } catch (e) {\n if (e.code !== 'EEXIST') throw e\n if (staleLock(path, staleAfterMs)) {\n const tomb = `${path}.stale.${process.pid}.${randomUUID()}`\n try {\n renameSync(path, tomb)\n rmSync(tomb, { recursive: true, force: true })\n continue\n } catch (moveError) {\n if (moveError.code === 'ENOENT' || moveError.code === 'EEXIST') continue\n throw moveError\n }\n }\n if (Date.now() >= deadline) throw new Error(`Wait 正在被其他事件更新: ${path}`)\n sleep(50)\n }\n }\n}\n\nfunction staleLock(path, staleAfterMs) {\n let age\n try { age = Date.now() - statSync(path).mtimeMs } catch { return true }\n let owner\n try { owner = readJson(join(path, 'owner.json')) } catch {}\n if (!owner) return age >= 2_000\n if (owner.host === LOCK_HOST && Number.isInteger(Number(owner.pid))) {\n try { process.kill(Number(owner.pid), 0); return false }\n catch (e) { if (e.code === 'ESRCH') return true }\n }\n return age >= staleAfterMs\n}\n\nfunction findValue(value, keys) {\n if (!value || typeof value !== 'object') return ''\n for (const key of keys) if (value[key]) return String(value[key])\n for (const child of Object.values(value)) {\n const found = findValue(child, keys)\n if (found) return found\n }\n return ''\n}\n"]}
1
+ {"version":3,"file":"waits.js","sourceRoot":"","sources":["../../src/waits.ts"],"names":[],"mappings":"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","sourcesContent":["// 单链 Durable Wait(TypeScript source)。\n//\n// v1 只解决一件事:ask 之后,下一条来自同一 Field/tenant/conversation/actor\n// 的 DM 或直接 @,恢复原 Session 并创建新 Run。这里不实现通用 workflow/stack。\n\nimport {\n existsSync, linkSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync,\n writeFileSync,\n} from 'node:fs'\nimport { dirname, resolve, join } from 'node:path'\nimport { hostname } from 'node:os'\nimport { randomUUID } from 'node:crypto'\nimport { digest, stableStringify } from './events.js'\nimport { err } from './tui.js'\n\nconst OPEN_CHAIN = new Set([\n 'arming', 'active', 'uncertain', 'claimed', 'cancel-pending',\n])\nconst RESUMABLE = new Set(['active', 'uncertain'])\nconst DEFAULT_TTL_MS = 7 * 24 * 60 * 60 * 1000\n\nexport function armWait(root, cfg, input) {\n const scope = scopeFromTarget(input.fieldId, input.event, input.target)\n if (!scope) {\n throw new Error('ask 无法建立 Wait:必须有 tenant、conversation、actor,且事件是 DM 或直接 @')\n }\n const rootPath = waitRoot(root, cfg)\n const scopeHash = digest(stableStringify(scope))\n const path = join(rootPath, `${scopeHash}.json`)\n const waitId = `wait_${digest(`${input.sessionId}\\0${input.actionId}`).slice(0, 20)}`\n const history = join(rootPath, 'history', `${waitId}.json`)\n mkdirSync(rootPath, { recursive: true })\n // 旧 ask 的 Receipt 可能在同一 scope 已进入下一轮 Wait 后重放;历史记录存在时\n // 只返回原 Wait,不能用旧 Receipt 覆盖当前正在等待的新问题。\n if (existsSync(history)) {\n const recorded = readJson(history)\n assertScope(recorded, scope, scopeHash)\n if (recorded.id === waitId && recorded.actionId === input.actionId &&\n recorded.sessionId === input.sessionId) return recorded\n }\n return withLock(path, () => {\n let existing = existsSync(path) ? readJson(path) : null\n if (existing) {\n assertScope(existing, scope, scopeHash)\n existing = repairFromReceipt(root, cfg, path, existing)\n }\n if (existing?.id === waitId && existing.actionId === input.actionId) return existing\n const ownedClaim = existing?.status === 'claimed' &&\n existing.sessionId === input.sessionId &&\n existing.claim?.runId === input.sourceRunId\n if (existing && OPEN_CHAIN.has(existing.status) && !expired(existing) &&\n !ownedClaim) {\n throw new Error(\n `同一人员/会话已有未完成 Wait ${existing.id}(Session ${existing.sessionId});` +\n '单链 v1 拒绝并行追问')\n }\n if (ownedClaim) {\n persistHistory(path, {\n ...existing, status: 'continued', continuedAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n })\n }\n const now = new Date().toISOString()\n const ttl = positiveNumber(cfg.runtime?.waitTtlMs, DEFAULT_TTL_MS)\n const record = {\n $schema: 'dingtalk-agent/wait@1',\n id: waitId,\n scopeHash,\n scope,\n fieldId: input.fieldId,\n sessionId: input.sessionId,\n sessionPath: resolve(input.sessionPath),\n sourceRunId: input.sourceRunId,\n actionId: input.actionId,\n questionText: String(input.questionText || ''),\n status: 'arming',\n version: Number(existing?.version || 0) + 1,\n createdAt: now,\n updatedAt: now,\n expiresAt: new Date(Date.now() + ttl).toISOString(),\n delivery: null,\n claim: null,\n }\n persistWait(path, record)\n return record\n })\n}\n\n/** Receipt 是真值;重放 Receipt 也能幂等补齐 active/uncertain Wait。 */\nexport function reconcileWaitFromReceipt(root, cfg, wait, receipt) {\n if (!wait) return null\n if (wait.actionId !== receipt.actionId) {\n throw new Error(`Wait/Receipt actionId 不一致: ${wait.actionId}/${receipt.actionId}`)\n }\n if (wait.lastAppliedReceiptActionId === receipt.actionId) return wait\n const path = join(waitRoot(root, cfg), `${wait.scopeHash}.json`)\n return withLock(path, () => {\n if (!existsSync(path)) throw new Error(`Wait 索引丢失: ${wait.id}`)\n const current = readJson(path)\n if (current.id === wait.id && current.actionId === receipt.actionId) {\n if (current.lastAppliedReceiptActionId === receipt.actionId) return current\n const next = applyReceipt(current, receipt)\n persistWait(path, next)\n return next\n }\n // 该链可能已经进入下一轮 Wait;旧 Receipt 只补自己的历史,不得覆盖 scope head。\n const history = join(waitRoot(root, cfg), 'history', `${wait.id}.json`)\n if (!existsSync(history)) {\n throw new Error(`Wait/Receipt 身份冲突: wait=${current.id}, action=${receipt.actionId}`)\n }\n const recorded = readJson(history)\n if (recorded.id !== wait.id || recorded.actionId !== receipt.actionId) {\n throw new Error(`Wait 历史与 Receipt 身份冲突: wait=${wait.id}, action=${receipt.actionId}`)\n }\n if (recorded.lastAppliedReceiptActionId === receipt.actionId) return recorded\n const next = applyReceipt(recorded, receipt)\n persistHistory(path, next)\n return next\n })\n}\n\n/** DWS 已返回可查询结果后立即开放 Wait;平台回读可以随后完成。 */\nexport function markWaitTransportAccepted(root, cfg, wait, result) {\n if (!wait) return null\n const path = join(waitRoot(root, cfg), `${wait.scopeHash}.json`)\n return withLock(path, () => {\n if (!existsSync(path)) throw new Error(`Wait 索引丢失: ${wait.id}`)\n const current = readJson(path)\n if (current.id === wait.id) {\n const next = applyTransportResult(current, result)\n persistWait(path, next)\n return next\n }\n const history = join(waitRoot(root, cfg), 'history', `${wait.id}.json`)\n if (!existsSync(history)) throw new Error(`Wait 已被其他链替换: ${wait.id}`)\n const recorded = readJson(history)\n if (recorded.id !== wait.id || recorded.actionId !== wait.actionId) {\n throw new Error(`Wait 历史与 transport-result 身份冲突: ${wait.id}`)\n }\n const next = applyTransportResult(recorded, result)\n persistHistory(path, next)\n return next\n })\n}\n\n/** resumed Run 给出最终 reply/silence 后,释放单链 scope。 */\nexport function completeWaitFromReceipt(root, cfg, resume, receipt) {\n if (resume?.mode !== 'resume' || !resume.waitId) return null\n const rootPath = waitRoot(root, cfg)\n const historyPath = join(rootPath, 'history', `${resume.waitId}.json`)\n let recorded = existsSync(historyPath) ? readJson(historyPath) : null\n let scopeHash = recorded?.scopeHash || resume.waitScopeHash || ''\n if (!scopeHash && existsSync(rootPath)) {\n const matches = readdirSync(rootPath)\n .filter((name) => name.endsWith('.json'))\n .map((name) => readJson(join(rootPath, name)))\n .filter((candidate) => candidate.id === resume.waitId)\n if (matches.length === 1) {\n recorded = matches[0]\n scopeHash = recorded.scopeHash\n }\n }\n if (!scopeHash) throw new Error(`Wait 历史丢失且无法从 scope head 修复: ${resume.waitId}`)\n const path = join(rootPath, `${scopeHash}.json`)\n return withLock(path, () => {\n if (!recorded) {\n const current = existsSync(path) ? readJson(path) : null\n if (!current || current.id !== resume.waitId) {\n throw new Error(`Wait 历史丢失且 scope head 不匹配: ${resume.waitId}`)\n }\n recorded = current\n persistHistory(path, recorded)\n }\n const now = new Date().toISOString()\n const current = existsSync(path) ? readJson(path) : null\n if (current?.id === recorded.id) {\n if (current.status === 'cancelled') {\n persistHistory(path, current)\n return current\n }\n const next = {\n ...current,\n status: current.status === 'cancel-pending' ? 'cancel-pending' : 'completed',\n updatedAt: now, completedAt: now,\n completedByReceiptActionId: receipt.actionId,\n }\n persistWait(path, next)\n return next\n }\n const next = {\n ...recorded, status: recorded.status === 'cancelled' ? 'cancelled' : 'completed',\n updatedAt: now, completedAt: now, completedByReceiptActionId: receipt.actionId,\n }\n persistHistory(path, next)\n return next\n })\n}\n\n/**\n * 显式 /stop、/cancel 是宿主控制面:不依赖当前 Field/Behavior/Skill。\n * 先写 cancel-pending,再在线性化锁内提升 Session generation,最后写 cancelled。\n */\nexport function cancelWaitForEvent(root, cfg, event) {\n if (!isCancelCommand(event.message?.text)) return null\n const eventScope = scopeWithoutField(event)\n if (!eventScope) return null\n const rootPath = waitRoot(root, cfg)\n const replay = readEventBinding(rootPath, event.id)\n if (replay) {\n assertEventBinding(replay, event, 'cancel', eventScope)\n if (replay.outcome === 'no-match') return null\n if (replay.outcome === 'ambiguous') {\n throw new Error(`取消命中多个 Wait,已固化为 ambiguous: ${(replay.candidates || []).join(', ')}`)\n }\n return cancelBoundWait(root, cfg, event, replay)\n }\n if (!existsSync(rootPath)) {\n createNoMatchBinding(rootPath, event, 'cancel', eventScope)\n return null\n }\n const candidates: Array<{ path: string; record: Record<string, any> }> = []\n for (const name of readdirSync(rootPath)) {\n if (!name.endsWith('.json')) continue\n const path = join(rootPath, name)\n const record = readJson(path)\n const sameCancel = record.claim?.eventId === event.id &&\n record.claim?.cancelRequested === true\n if (sameEventScope(record.scope, eventScope) &&\n (OPEN_CHAIN.has(record.status) || sameCancel ||\n (record.status === 'cancelled' && record.claim?.eventId === event.id))) {\n candidates.push({ path, record })\n }\n }\n if (candidates.length > 1) {\n createNoMatchBinding(rootPath, event, 'cancel', eventScope, {\n outcome: 'ambiguous', candidates: candidates.map((x) => x.record.id).sort(),\n })\n throw new Error(`取消命中多个 Wait,拒绝猜测: ${candidates.map((x) => x.record.id).join(', ')}`)\n }\n if (!candidates.length) {\n createNoMatchBinding(rootPath, event, 'cancel', eventScope)\n return null\n }\n const { path } = candidates[0]\n const bound = withLock(path, () => {\n let current = readJson(path)\n if (!sameEventScope(current.scope, eventScope)) {\n throw new Error(`取消 Wait 作用域漂移: ${current.id}`)\n }\n current = repairFromReceipt(root, cfg, path, current)\n if (current.status === 'cancelled' && current.claim?.eventId === event.id) {\n return createEventBinding(rootPath, event, 'cancel', current)\n }\n if (!OPEN_CHAIN.has(current.status)) {\n createNoMatchBinding(rootPath, event, 'cancel', eventScope)\n return null\n }\n // 先把 head 置为 pending,再写 ledger。两者之间即使 SIGKILL,重放也会从\n // pending 的 eventId 恢复;Action 无法趁 binding→effect-lock 窗口建立 W2。\n const now = new Date().toISOString()\n const sameCancel = current.claim?.eventId === event.id &&\n current.claim?.cancelRequested === true\n ensureClaimBinding(rootPath, current)\n const pending = {\n ...current,\n status: 'cancel-pending',\n updatedAt: now,\n previousClaim: sameCancel ? current.previousClaim || null : current.claim || null,\n claim: {\n eventId: event.id, eventKind: event.kind, claimedAt: now,\n runId: '', cancelRequested: true,\n },\n }\n persistWait(path, pending)\n const binding = createEventBinding(rootPath, event, 'cancel', pending)\n return binding\n })\n return bound ? cancelBoundWait(root, cfg, event, bound) : null\n}\n\n/** Action 与 cancel 共用这一把锁;先拿到锁的一方定义副作用先后。 */\nexport function acquireSessionEffectLock(root, sessionPath) {\n const dir = resolve(root, '.dingtalk-agent/session-effect-locks')\n mkdirSync(dir, { recursive: true })\n return acquireLock(\n join(dir, `${digest(resolve(sessionPath))}.lock`), 30 * 60_000, 3 * 60_000)\n}\n\n/**\n * incoming Event 在创建新 Session 前调用。显式 sessionKey/correlation 由调用方优先处理。\n * claimed/cancelled + 同 eventId 可重入,覆盖 materialize 过程中崩溃后的恢复窗口。\n */\nexport function claimWait(root, cfg, fieldId, event) {\n const scope = scopeFromEvent(fieldId, event)\n if (!scope) return null\n const rootPath = waitRoot(root, cfg)\n const scopeHash = digest(stableStringify(scope))\n const path = join(rootPath, `${scopeHash}.json`)\n const replay = readEventBinding(rootPath, event.id)\n if (replay) {\n assertEventBinding(replay, event, 'claim', scope)\n if (replay.outcome === 'no-match') return null\n return claimBoundWait(root, cfg, event, replay)\n }\n return withLock(path, () => {\n if (!existsSync(path)) {\n createNoMatchBinding(rootPath, event, 'claim', scope)\n return null\n }\n let current = readJson(path)\n assertScope(current, scope, scopeHash)\n current = repairFromReceipt(root, cfg, path, current)\n if (current.status === 'claimed' && current.claim?.eventId === event.id &&\n current.claim?.cancelRequested !== true) {\n createEventBinding(rootPath, event, 'claim', current)\n return current\n }\n if (expired(current)) {\n ensureClaimBinding(rootPath, current)\n if (OPEN_CHAIN.has(current.status)) {\n const next = { ...current, status: 'expired', updatedAt: new Date().toISOString() }\n persistWait(path, next)\n }\n createNoMatchBinding(rootPath, event, 'claim', scope)\n return null\n }\n if (!RESUMABLE.has(current.status)) {\n createNoMatchBinding(rootPath, event, 'claim', scope)\n return null\n }\n const now = new Date().toISOString()\n const next = {\n ...current,\n status: 'claimed',\n updatedAt: now,\n claim: {\n eventId: event.id,\n eventKind: event.kind,\n claimedAt: now,\n runId: '',\n cancelRequested: false,\n },\n }\n persistWait(path, next)\n createEventBinding(rootPath, event, 'claim', next)\n return next\n })\n}\n\nexport function attachClaimedRun(root, cfg, wait, eventId, runId) {\n if (!wait) return null\n const path = join(waitRoot(root, cfg), `${wait.scopeHash}.json`)\n return withLock(path, () => {\n const loaded = readBoundWait(path, wait.id)\n if (!loaded || loaded.record.claim?.eventId !== eventId) {\n throw new Error(`Wait claim 身份冲突: wait=${wait.id}, event=${eventId}`)\n }\n const current = loaded.record\n if (current.claim.runId && current.claim.runId !== runId) {\n throw new Error(`Wait ${wait.id} 已绑定其他 Run: ${current.claim.runId}`)\n }\n if (current.claim.runId === runId) {\n // head 已写而 history 未写时,幂等重试必须顺手补齐历史真值。\n persistBoundWait(path, current, loaded.isHead)\n return current\n }\n const next = {\n ...current,\n updatedAt: new Date().toISOString(),\n claim: { ...current.claim, runId },\n }\n persistBoundWait(path, next, loaded.isHead)\n return next\n })\n}\n\nexport function waitRoot(root, cfg) {\n return resolve(root, cfg.runtime?.waitRoot || '.dingtalk-agent/waits')\n}\n\nexport function readWaitForEvent(root, cfg, fieldId, event) {\n const scope = scopeFromEvent(fieldId, event)\n if (!scope) return null\n const path = join(waitRoot(root, cfg), `${digest(stableStringify(scope))}.json`)\n return existsSync(path) ? readJson(path) : null\n}\n\nexport function isCancelCommand(text) {\n // Live canary 的合成入站必须保留唯一 marker;marker 只是证据,不应阻断\n // 随后的显式取消命令。生产消息不带 marker 时仍保持原有严格匹配。\n const value = String(text || '').trim()\n .replace(/^\\[DTA-LAB-[^\\]\\n]+\\]\\s*/u, '')\n return /^\\/(?:stop|cancel|停止|取消)$/i.test(value)\n}\n\n/** eventId 一旦绑定 Wait,重放永远解析原 Wait,不能重新扫描当前 scope head。 */\nfunction createEventBinding(rootPath, event, operation, wait) {\n const path = eventBindingPath(rootPath, event.id)\n const binding = {\n $schema: 'dingtalk-agent/wait-event-binding@1',\n eventId: event.id,\n eventKind: event.kind,\n operation,\n outcome: 'matched',\n waitId: wait.id,\n scopeHash: wait.scopeHash,\n scope: wait.scope,\n fieldId: wait.fieldId,\n sessionId: wait.sessionId,\n sessionPath: wait.sessionPath,\n sourceRunId: wait.sourceRunId,\n actionId: wait.actionId,\n boundAt: new Date().toISOString(),\n }\n if (!writeJsonCreateAtomic(path, binding)) {\n const existing = readJson(path)\n if (stableStringify(bindingIdentity(existing)) !== stableStringify(bindingIdentity(binding))) {\n throw new Error(`Event ${event.id} 已绑定其他 Wait,拒绝 ABA 重解释`)\n }\n return existing\n }\n return binding\n}\n\nfunction createNoMatchBinding(\n rootPath,\n event,\n operation,\n scope,\n options: Record<string, any> = {},\n) {\n const path = eventBindingPath(rootPath, event.id)\n const binding = {\n $schema: 'dingtalk-agent/wait-event-binding@1',\n eventId: event.id,\n eventKind: event.kind,\n operation,\n outcome: options.outcome || 'no-match',\n candidates: options.candidates || [],\n waitId: '',\n scopeHash: digest(stableStringify(scope)),\n scope,\n fieldId: '',\n sessionId: '',\n sessionPath: '',\n sourceRunId: '',\n actionId: '',\n boundAt: new Date().toISOString(),\n }\n if (!writeJsonCreateAtomic(path, binding)) {\n const existing = readJson(path)\n if (stableStringify(bindingIdentity(existing)) !== stableStringify(bindingIdentity(binding))) {\n throw new Error(`Event ${event.id} 的 Wait 路由决策已固化,拒绝重新解释`)\n }\n return existing\n }\n return binding\n}\n\nfunction readEventBinding(rootPath, eventId) {\n const path = eventBindingPath(rootPath, eventId)\n return existsSync(path) ? readJson(path) : null\n}\n\nfunction eventBindingPath(rootPath, eventId) {\n return join(rootPath, 'events', `${digest(eventId)}.json`)\n}\n\nfunction bindingIdentity(value) {\n return {\n eventId: value.eventId,\n eventKind: value.eventKind,\n operation: value.operation,\n outcome: value.outcome,\n candidates: value.candidates || [],\n waitId: value.waitId,\n scopeHash: value.scopeHash,\n scope: value.scope,\n fieldId: value.fieldId,\n sessionId: value.sessionId,\n sessionPath: value.sessionPath,\n sourceRunId: value.sourceRunId,\n actionId: value.actionId,\n }\n}\n\nfunction assertEventBinding(binding, event, operation, expectedScope) {\n if (binding.eventId !== event.id || binding.eventKind !== event.kind ||\n binding.operation !== operation) {\n throw new Error(`Event ${event.id} 的 Wait binding 类型冲突`)\n }\n const scopeMatches = operation === 'cancel'\n ? sameEventScope(binding.scope, expectedScope)\n : stableStringify(binding.scope) === stableStringify(expectedScope)\n if (!scopeMatches || binding.scopeHash !== digest(stableStringify(binding.scope))) {\n throw new Error(`Event ${event.id} 的 Wait binding 作用域漂移`)\n }\n}\n\nfunction assertWaitBinding(record, binding) {\n const actual = {\n waitId: record.id,\n scopeHash: record.scopeHash,\n fieldId: record.fieldId,\n sessionId: record.sessionId,\n sessionPath: record.sessionPath,\n sourceRunId: record.sourceRunId,\n actionId: record.actionId,\n }\n const expected = {\n waitId: binding.waitId,\n scopeHash: binding.scopeHash,\n fieldId: binding.fieldId,\n sessionId: binding.sessionId,\n sessionPath: binding.sessionPath,\n sourceRunId: binding.sourceRunId,\n actionId: binding.actionId,\n }\n if (stableStringify(actual) !== stableStringify(expected)) {\n throw new Error(`Wait event binding 身份漂移: ${binding.waitId}`)\n }\n}\n\nfunction cancelBoundWait(root, cfg, event, binding) {\n const path = join(waitRoot(root, cfg), `${binding.scopeHash}.json`)\n let pending = withLock(path, () => {\n const loaded = readBoundWait(path, binding.waitId)\n if (!loaded) throw new Error(`取消绑定的 Wait 不存在: ${binding.waitId}`)\n let current = loaded.record\n assertWaitBinding(current, binding)\n if (loaded.isHead) current = repairFromReceipt(root, cfg, path, current)\n if (current.status === 'cancelled' && current.claim?.eventId === event.id) return current\n if (['cancel-pending', 'cancelled'].includes(current.status) &&\n current.claim?.cancelRequested === true && current.claim?.eventId !== event.id) {\n // 两个 stop 同时到达时只让先行者提升 generation;后来者成为同 Session 的安全 no-op。\n return suppressedClaim(current, event.id)\n }\n const sameCancel = current.claim?.eventId === event.id &&\n current.claim?.cancelRequested === true\n if (!OPEN_CHAIN.has(current.status) && !sameCancel) {\n throw new Error(`取消绑定的 Wait 已进入 ${current.status}: ${binding.waitId}`)\n }\n const now = new Date().toISOString()\n ensureClaimBinding(waitRoot(root, cfg), current)\n const next = {\n ...current,\n status: 'cancel-pending',\n updatedAt: now,\n previousClaim: sameCancel ? current.previousClaim || null : current.claim || null,\n claim: {\n eventId: event.id, eventKind: event.kind, claimedAt: now,\n runId: '', cancelRequested: true,\n },\n }\n persistBoundWait(path, next, loaded.isHead)\n return next\n })\n\n if (pending.suppressed) return pending\n applyCancelFence(root, pending, event.id)\n pending = withLock(path, () => {\n const loaded = readBoundWait(path, binding.waitId)\n if (!loaded) throw new Error(`取消完成时 Wait 丢失: ${binding.waitId}`)\n const current = loaded.record\n assertWaitBinding(current, binding)\n if (current.claim?.eventId !== event.id) {\n throw new Error(`取消 Wait 身份漂移: ${binding.waitId}`)\n }\n if (current.status === 'cancelled') {\n persistBoundWait(path, current, loaded.isHead)\n return current\n }\n const next = { ...current, status: 'cancelled', updatedAt: new Date().toISOString() }\n persistBoundWait(path, next, loaded.isHead)\n return next\n })\n return pending\n}\n\nfunction claimBoundWait(root, cfg, event, binding) {\n const path = join(waitRoot(root, cfg), `${binding.scopeHash}.json`)\n return withLock(path, () => {\n const loaded = readBoundWait(path, binding.waitId)\n if (!loaded) throw new Error(`回复绑定的 Wait 不存在: ${binding.waitId}`)\n let current = loaded.record\n assertWaitBinding(current, binding)\n if (loaded.isHead) current = repairFromReceipt(root, cfg, path, current)\n if (current.status === 'claimed' && current.claim?.eventId === event.id) {\n if (!loaded.isHead) throw new Error(`已 claim 的 Wait 不再是 scope head: ${binding.waitId}`)\n return current\n }\n if (['cancel-pending', 'cancelled'].includes(current.status) &&\n current.claim?.cancelRequested === true) {\n return suppressedClaim(current, event.id)\n }\n if (!loaded.isHead || !RESUMABLE.has(current.status) || expired(current)) {\n throw new Error(`回复事件已绑定 Wait ${binding.waitId},但当前状态为 ${current.status};拒绝回退成新事项`)\n }\n const now = new Date().toISOString()\n const next = {\n ...current,\n status: 'claimed',\n updatedAt: now,\n claim: {\n eventId: event.id, eventKind: event.kind, claimedAt: now,\n runId: '', cancelRequested: false,\n },\n }\n persistWait(path, next)\n return next\n })\n}\n\nfunction suppressedClaim(record, eventId) {\n const cancelEventId = record.claim?.eventId || ''\n return {\n ...record,\n suppressed: true,\n cancelEventId,\n claim: {\n eventId,\n claimedAt: new Date().toISOString(),\n runId: '',\n cancelRequested: true,\n supersededByEventId: cancelEventId,\n },\n }\n}\n\nfunction ensureClaimBinding(rootPath, record) {\n const claim = record.claim?.cancelRequested !== true\n ? record.claim\n : record.previousClaim?.cancelRequested !== true ? record.previousClaim : null\n if (!claim?.eventId) return null\n if (!claim.eventKind) {\n throw new Error(`Wait ${record.id} 的 claim 缺少 eventKind,无法安全修复 event ledger`)\n }\n return createEventBinding(rootPath, {\n id: claim.eventId,\n kind: claim.eventKind,\n }, 'claim', record)\n}\n\nfunction readBoundWait(scopePath, waitId) {\n if (existsSync(scopePath)) {\n const current = readJson(scopePath)\n if (current.id === waitId) return { record: current, isHead: true }\n }\n const history = join(dirname(scopePath), 'history', `${waitId}.json`)\n return existsSync(history) ? { record: readJson(history), isHead: false } : null\n}\n\nfunction persistBoundWait(scopePath, record, isHead) {\n if (isHead) persistWait(scopePath, record)\n else persistHistory(scopePath, record)\n}\n\nfunction scopeFromTarget(fieldId, event, target) {\n if (!['im.message.dm', 'im.message.mentioned'].includes(event.kind)) return null\n return completeScope({\n fieldId,\n tenantId: target?.tenantId || event.tenant?.id,\n conversationId: target?.conversationId || event.conversation?.id,\n actorId: target?.senderOpenDingTalkId || event.actor?.openDingTalkId,\n })\n}\n\nfunction scopeFromEvent(fieldId, event) {\n if (!['im.message.dm', 'im.message.mentioned'].includes(event.kind)) return null\n return completeScope({\n fieldId,\n tenantId: event.tenant?.id,\n conversationId: event.conversation?.id,\n actorId: event.actor?.openDingTalkId,\n })\n}\n\nfunction scopeWithoutField(event) {\n if (!['im.message.dm', 'im.message.mentioned'].includes(event.kind)) return null\n return completeScope({\n tenantId: event.tenant?.id,\n conversationId: event.conversation?.id,\n actorId: event.actor?.openDingTalkId,\n })\n}\n\nfunction sameEventScope(scope, expected) {\n return scope?.tenantId === expected.tenantId &&\n scope?.conversationId === expected.conversationId &&\n scope?.actorId === expected.actorId\n}\n\nfunction completeScope(value) {\n const scope = Object.fromEntries(Object.entries(value).map(([k, v]) => [k, String(v || '').trim()]))\n return Object.values(scope).every(Boolean) ? scope : null\n}\n\nfunction assertScope(record, scope, scopeHash) {\n if (record.scopeHash !== scopeHash || stableStringify(record.scope) !== stableStringify(scope)) {\n throw new Error(`Wait scope hash 碰撞或内容漂移: ${scopeHash}`)\n }\n}\n\nfunction expired(record) {\n const deadline = Date.parse(record.expiresAt || '')\n return Number.isFinite(deadline) && deadline <= Date.now()\n}\n\nfunction positiveNumber(value, fallback) {\n const n = Number(value)\n return Number.isFinite(n) && n > 0 ? n : fallback\n}\n\nfunction applyReceipt(record, receipt) {\n const keepLifecycle = new Set([\n 'claimed', 'cancel-pending', 'cancelled', 'completed', 'continued', 'expired',\n ]).has(record.status)\n const transportAccepted = Boolean(record.delivery?.transportAccepted)\n return {\n ...record,\n status: keepLifecycle\n ? record.status\n : (receipt.outcome === 'uncertain' && !transportAccepted ? 'uncertain' : 'active'),\n updatedAt: new Date().toISOString(),\n lastAppliedReceiptActionId: receipt.actionId,\n delivery: {\n ...(record.delivery || {}),\n outcome: receipt.outcome,\n verified: Boolean(receipt.verified),\n verification: receipt.verification || '',\n questionMessageId: findValue(\n receipt, ['openMessageId', 'openMsgId', 'open_message_id']) ||\n record.delivery?.questionMessageId || '',\n },\n }\n}\n\nfunction applyTransportResult(record, result) {\n return {\n ...record,\n status: record.status === 'arming' || record.status === 'uncertain'\n ? 'active' : record.status,\n updatedAt: new Date().toISOString(),\n delivery: {\n ...(record.delivery || {}),\n transportAccepted: true,\n questionMessageId: findValue(result,\n ['openMessageId', 'openMsgId', 'open_message_id']) ||\n record.delivery?.questionMessageId || '',\n },\n }\n}\n\n/** 在 incoming Event 路由时修复 Receipt/transport-result 已落盘但 Wait 仍 arming 的窗口。 */\nfunction repairFromReceipt(root, cfg, path, record) {\n if (record.status !== 'arming') return record\n const actionPath = join(\n resolve(root, cfg.runtime?.eventIndexRoot || '.dingtalk-agent/event-index'),\n 'actions', record.sourceRunId, record.actionId)\n const receiptPath = join(actionPath, 'receipt.json')\n const resultPath = join(actionPath, 'transport-result.json')\n if (!existsSync(receiptPath) && !existsSync(resultPath)) return record\n\n const receipt = existsSync(receiptPath) ? readJson(receiptPath) : null\n const result = existsSync(resultPath) ? readJson(resultPath) : null\n const next = {\n ...record,\n status: (result || receipt?.outcome !== 'uncertain') ? 'active' : 'uncertain',\n updatedAt: new Date().toISOString(),\n lastAppliedReceiptActionId: receipt?.actionId || record.lastAppliedReceiptActionId,\n delivery: {\n ...(record.delivery || {}),\n transportAccepted: Boolean(result),\n outcome: receipt?.outcome || 'transport-accepted',\n verified: Boolean(receipt?.verified),\n verification: receipt?.verification || '',\n questionMessageId: findValue(receipt,\n ['openMessageId', 'openMsgId', 'open_message_id']) ||\n findValue(result, ['openMessageId', 'openMsgId', 'open_message_id']) ||\n record.delivery?.questionMessageId || '',\n },\n }\n persistWait(path, next)\n return next\n}\n\nfunction applyCancelFence(root, wait, eventId) {\n const releaseEffect = acquireSessionEffectLock(root, wait.sessionPath)\n try {\n const lockRoot = resolve(root, '.dingtalk-agent/session-locks')\n mkdirSync(lockRoot, { recursive: true })\n const releaseState = acquireLock(\n join(lockRoot, `${digest(resolve(wait.sessionPath))}.lock`), 2 * 60_000)\n try {\n const sessionPath = join(resolve(wait.sessionPath), 'session.json')\n if (!existsSync(sessionPath)) throw new Error(`取消目标 Session 不存在: ${wait.sessionId}`)\n const session = readJson(sessionPath)\n if (session.id !== wait.sessionId || session.fieldId !== wait.fieldId) {\n throw new Error(`取消目标 Session 身份不一致: ${wait.sessionId}`)\n }\n if (session.lastCancelEventId === eventId) return\n const generation = validGeneration(session.generation)\n persist(sessionPath, {\n ...session,\n generation: generation + 1,\n lastCancelEventId: eventId,\n cancelledAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n })\n } finally {\n releaseState()\n }\n } finally {\n releaseEffect()\n }\n}\n\nfunction validGeneration(value) {\n const n = Number(value ?? 1)\n if (!Number.isInteger(n) || n < 1) throw new Error('Session generation 非法,拒绝取消')\n return n\n}\n\nfunction persist(path, value) {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.${process.pid}.${Date.now()}.${randomUUID()}.tmp`\n writeFileSync(temp, JSON.stringify(value, null, 2) + '\\n', { flag: 'wx' })\n renameSync(temp, path)\n}\n\nfunction writeJsonCreateAtomic(path, value) {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.${process.pid}.${Date.now()}.${randomUUID()}.tmp`\n writeFileSync(temp, JSON.stringify(value, null, 2) + '\\n', { flag: 'wx' })\n try {\n linkSync(temp, path)\n return true\n } catch (e) {\n if (e.code === 'EEXIST') return false\n throw e\n } finally {\n rmSync(temp, { force: true })\n }\n}\n\nfunction persistWait(scopePath, record) {\n persist(scopePath, record)\n persistHistory(scopePath, record)\n}\n\nfunction persistHistory(scopePath, record) {\n persist(join(dirname(scopePath), 'history', `${record.id}.json`), record)\n mirror(record)\n}\n\nfunction mirror(record) {\n try {\n const dir = join(record.sessionPath, 'waits')\n mkdirSync(dir, { recursive: true })\n persist(join(dir, `${record.id}.json`), record)\n } catch (e) {\n console.error(err().theme.warn(` ⚠️ Wait 审计镜像写入失败(waitRoot 权威真值已保留): ${e.message}`))\n }\n}\n\nfunction readJson(path) {\n return JSON.parse(readFileSync(path, 'utf8'))\n}\n\nconst LOCK_HOST = hostname()\nconst sleep = (ms) => Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms)\n\nfunction withLock(path, fn) {\n const lockPath = `${path}.lock`\n mkdirSync(dirname(path), { recursive: true })\n const release = acquireLock(lockPath)\n try { return fn() } finally { release() }\n}\n\nfunction acquireLock(path, staleAfterMs = 60_000, waitMs = 5_000) {\n const token = randomUUID()\n const deadline = Date.now() + waitMs\n while (true) {\n try {\n mkdirSync(path)\n try {\n persist(join(path, 'owner.json'), {\n token, pid: process.pid, host: LOCK_HOST, acquiredAt: new Date().toISOString(),\n })\n } catch (e) {\n rmSync(path, { recursive: true, force: true })\n throw e\n }\n return () => {\n try {\n const owner = readJson(join(path, 'owner.json'))\n if (owner.token === token) rmSync(path, { recursive: true, force: true })\n } catch {}\n }\n } catch (e) {\n if (e.code !== 'EEXIST') throw e\n if (staleLock(path, staleAfterMs)) {\n const tomb = `${path}.stale.${process.pid}.${randomUUID()}`\n try {\n renameSync(path, tomb)\n rmSync(tomb, { recursive: true, force: true })\n continue\n } catch (moveError) {\n if (moveError.code === 'ENOENT' || moveError.code === 'EEXIST') continue\n throw moveError\n }\n }\n if (Date.now() >= deadline) throw new Error(`Wait 正在被其他事件更新: ${path}`)\n sleep(50)\n }\n }\n}\n\nfunction staleLock(path, staleAfterMs) {\n let age\n try { age = Date.now() - statSync(path).mtimeMs } catch { return true }\n let owner\n try { owner = readJson(join(path, 'owner.json')) } catch {}\n if (!owner) return age >= 2_000\n if (owner.host === LOCK_HOST && Number.isInteger(Number(owner.pid))) {\n try { process.kill(Number(owner.pid), 0); return false }\n catch (e) { if (e.code === 'ESRCH') return true }\n }\n return age >= staleAfterMs\n}\n\nfunction findValue(value, keys) {\n if (!value || typeof value !== 'object') return ''\n for (const key of keys) if (value[key]) return String(value[key])\n for (const child of Object.values(value)) {\n const found = findValue(child, keys)\n if (found) return found\n }\n return ''\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xdxer/dingtalk-agent",
3
- "version": "0.1.5-beta.4",
3
+ "version": "0.1.5-beta.6",
4
4
  "description": "把 Agent 装配成钉钉数字员工:Skill 决策,CLI 固定事务边界,Agent 本体运行在哪个 Managed Agent Platform 上是可替换的。",
5
5
  "keywords": [
6
6
  "dingtalk",
@@ -19,6 +19,7 @@
19
19
  "dist/src",
20
20
  "skills/core/dingtalk-basic-behavior",
21
21
  "skills/core/dingtalk-agent-compose",
22
+ "skills/core/dingtalk-people-group-memory",
22
23
  "skills/platforms/multica-dingtalk/dingtalk-agent-deploy-multica",
23
24
  "skills/core/dingtalk-agent-eval",
24
25
  "skills/platforms/multica-dingtalk/multica-external",
@@ -58,7 +59,7 @@
58
59
  "eval:behavior": "npm run build && node evals/run-shadow-evals.mjs",
59
60
  "eval:opencode": "npm run build && node dist/bin/dingtalk-agent.js lab eval --engine opencode --workspace lab/robot-eval/workspace --suite lab/robot-eval/suite.json --lanes stateless --execute --yes --json",
60
61
  "prepack": "npm run build",
61
- "release:check": "node scripts/check-skill-versions.mjs && node scripts/check-docs.mjs && node evals/run-contract-evals.mjs --full && node scripts/release-readiness.mjs --json",
62
+ "release:check": "npm run build && node scripts/check-skill-versions.mjs && node scripts/check-docs.mjs && node evals/run-contract-evals.mjs --full && node scripts/release-readiness.mjs --json",
62
63
  "check:skill-versions": "node scripts/check-skill-versions.mjs",
63
64
  "check:docs": "node scripts/check-docs.mjs",
64
65
  "eval:contract:full": "npm run build && node evals/run-contract-evals.mjs --full"
@@ -21,7 +21,24 @@ metadata:
21
21
  7. 审核能力:Basic Behavior 是所有钉钉员工共享且**每个 Session 必须加载**的协议;岗位知识和流程拆到独立 Role/Workflow Skill。目录可发现不等于正文已加载,必须为目标 Agent Host 生成可验证的加载合同。不要把 FDE、招聘、事故处理等岗位方法写回 Basic Skill。
22
22
  8. 审核存储:明确工作记忆、业务事实、长期知识、产物和宿主私有控制状态分别去哪。介质可以换,语义层与控制状态不能混。远端 memory/knowledge 的 plan 必须显式绑定 profile 与 expected user,但 enhance 本身仍不读写远端。
23
23
  9. **审核驱动:这个员工由谁叫醒。** 只会被 @ 唤醒的 Agent 不是同事,是查询接口——巡检、补数据、到点交付都发生在没人说话的时候。把每件周期性的事分成三类(人在钉钉设的时间点 / 岗位的常驻节律 / Agent 自主定时),为每条节律写清节律、作用域、完成判据、失败可见性,并交由目标平台校验能力。**dta 声明节律但不创建触发器**;`dta deploy` 不会创建也不会修改任何 schedule。完整判据、三条与平台无关的硬约束(定时不可靠是常态、外发类节律没有锁、Agent 不自建定时器)和装配自检清单见 [drive-and-schedules.md](references/drive-and-schedules.md);具体平台提供什么能力以该平台 `PLATFORM.md` 为准,**平台之间能力不同是常态**,不支持就记为缺口,不静默降级成“那就不定时了”。
24
- 10. 运行 `dta bootstrap --bindings agent.bindings.json --json` 和 `dta agent audit --bindings agent.bindings.json --require-skill <role> --json`。静态配置和真实语义通过后再加 `--verify-load --yes`;不能把“写出了文件”或“目录存在”当成装配完成。
24
+ 10. 长期记忆能力(见下节)随默认套装装上,装配时**不用问、不用选、不用绑**;只在该 Agent 已经绑定过存储时,把绑定档案的定位符作为 seed 写进本体。
25
+ 11. 运行 `dta bootstrap --bindings agent.bindings.json --json` 和 `dta agent audit --bindings agent.bindings.json --require-skill <role> --json`。静态配置和真实语义通过后再加 `--verify-load --yes`;不能把“写出了文件”或“目录存在”当成装配完成。
26
+
27
+ ## 长期记忆能力(标准装配,装配时几乎不用做什么)
28
+
29
+ `dingtalk-people-group-memory` 属于**默认套装**,`dta setup` 就装上了。它让 Agent 能为长期打交道的**同事**和**会话(群/单聊)**各自维护档案。
30
+
31
+ 装配时**不需要**判适用性、不需要选落点、不需要问用户要不要开——因为:
32
+
33
+ - 它在**绑定存储之前完全惰性**:零写入、零探测、零副作用,也不许说“我记住了”。所以人人都装不会有后果。
34
+ - 绑定推迟到**用户主动要求**时(“记住这个人”“沉淀一下这次聊天”“以后记得我的偏好”)。
35
+ - 🔴 更重要的原因:装配跑在**开发者身份**上,真正要写入的是**运行时身份**,两者常常不同。实测存在“知识库属于运行时身份、开发者只是节点级协作者”的真实拓扑。**绑定必须发生在要写入的那个身份上、在真正要写的那一刻**,装配时绑出来的落点运行时经常写不进去。
36
+
37
+ 装配时唯一要做的:**如果这个 Agent 已经绑定过**,把绑定档案的定位符作为 seed 写进本体 `AGENTS.md`(让 Boot 能一跳拿到,否则每次要付全量兜底代价)。没绑定过就什么都不写。
38
+
39
+ 改造已有 Agent 时检查两件事:① 本体里的 seed 还能不能一跳解析,解析不到就删掉这一行让它回到未绑定态,不要留死指针;② **运行时身份变过没有**——变过就是身份漂移,档案是旧身份建的,要告诉用户重新绑定或先处理所有权。
40
+
41
+ 细节见该 Skill 的 `references/binding.md` 与 `references/assembly-guidance.md`。
25
42
 
26
43
  ## 本体、Skill 与 Gate 怎么分
27
44
 
@@ -146,6 +163,7 @@ my-agent/
146
163
  状态:ready / partial
147
164
  本体:来源、缺口、建议改动
148
165
  能力:`agent/skills` 中单一版本的 Basic Skill + Role Skills(可叠加项)
166
+ 长期记忆:本体里有没有绑定 seed;没有就写「未绑定(用户主动要求时由 Agent 自行绑定)」
149
167
  Host:用户选定的 Host 与 adapter 状态;临时 exposure(不进入仓库)
150
168
  存储:memory / knowledge / artifacts / private state
151
169
  权限:DWS profile、expected user、写入 allowlist(若有)
@@ -0,0 +1,36 @@
1
+ # 完成度(给 dta 用户判断"现在能交付到什么程度")
2
+
3
+ 口径:**done** = 在生产 dws 上真实跑通过;**partial** = 部分真实、部分只有契约/prose 或未自主执行;**missing** = 只有契约/prose,无实现、无 CI/chaos 验证。
4
+
5
+ ## 六环 × 三场景矩阵
6
+
7
+ | 环 \ 场景 | A. 自带地址 | B. 让 Agent 自建 | C. 团队共享/换身份 |
8
+ |---|---|---|---|
9
+ | **装配** | done | done | done |
10
+ | **配置粘合** | partial | missing | partial |
11
+ | **部署** | done | done | partial |
12
+ | **首次绑定** | guided | guided | guided-partial |
13
+ | **运行时读写** | partial | partial | partial |
14
+ | **长期维护** | missing | missing | missing |
15
+
16
+ > **guided** = 引导式创建可走通(`guided-setup.md`):用户在环里逐步确认,七步都是真实 dws 动作,产物是实测可解析的合法 adoc 绑定档案。区别于 done(无需人介入)与 missing(无路径)。C 场景 guided-partial:引导能建单份绑定,但多 Agent/换身份的隔离与漂移仲裁仍缺。
17
+
18
+ - **装配**:Skill 进默认套装、`dta skill status` 可解析——生产验证过,三场景都 done。
19
+ - **配置粘合**:`bootstrap select()` 链 + 白名单校验是真代码;但 §五 粘合 gate 是 prose,compose 未实现(配错在装配期没人拦)。B 还缺"运行时身份把 locator 回填进 bindings/env"的路径(架构上运行时身份写不回 git 配置)。
20
+ - **部署**:inspect→dry-run→apply→smoke 生产用过。C partial 因为部署管线不校验运行时身份可达、不感知身份漂移/共享。
21
+ - **首次绑定**:曾是三场景的墙,**引导式创建(`guided-setup.md`)把它迈过去了**——用户逐步确认、七步真实 dws 动作,产物是实测可解析的合法 adoc 绑定档案(生产已验证)。仍非全自动:第 7 步 memory ref 回填需人接(运行时身份写不回 git 配置,架构使然),第 4–6 步全自动还需"Agent 自主触发"(路线 1)。用户明确"引导也行"时这一环即闭环。C 仍 guided-partial:多 Agent/换身份隔离与漂移仲裁缺。
22
+ - **运行时读写**:三场景 partial,都卡在"Agent 按 SKILL.md 在真实对话里自主读写没连通"(现在都是脚本/人扮 Agent),加行为层(未绑定零写/audience 拒答/知情提议)无回归。
23
+ - **长期维护**:三场景全 missing。consolidation 全套、local-md + --chaos、Boot 预算、身份漂移检测——全是契约。
24
+
25
+ ## 最诚实的一句话
26
+
27
+ **今天一个 dta 用户拿这套东西,能交付的是**:**引导用户逐步创建**(`guided-setup.md` 七步,或复用生产脚本)在真实 dws 上建好合法 adoc 绑定档案 + aitable registry 三表、用户把 `memory: dingtalk-doc:<adoc节点>` 接进 bindings,此后**单 Agent、单写者**在 doc+aitable 上的画像读写闭环与幂等是真实证过的;**不能交付的是**:"填个文件夹地址即用"(memory 须是 adoc 不是文件夹)、"Agent 全自主决定建档/自绑定/自持"(引导可达、全自主未连通)、"多 Agent 共享或换身份不踩踏"、"跑一年自动压缩不腐坏"——后三件还是契约,没有回归/chaos 兜底。
28
+
29
+ ## 补齐路线(按解锁场景数排序)
30
+
31
+ 1. **打通 Agent 自主触发**(真实对话里自建档/探落点/确认/拒答/提议,替换"人扮 Agent + autobuild.py")。解锁最多:B 首次绑定 partial→done、三场景运行时读写从"脚本驱动"升到"Agent 驱动"。**是不是产品的分水岭。**
32
+ 2. **compose 实现 §五 粘合 gate**(memref 合法/运行时身份可回读/seed==memory 一致/registry baseId 可回读/多 Agent memref 碰撞)。解锁:A、C 配置粘合 partial→done,把配错从运行期提前到装配期。
33
+ 3. **registry base 加 typed 绑定槽 + 实现 locator 回填闭环**。解锁:B 配置粘合 missing→partial/done(自建节点下 Session 找得回)、C 隔离/共享有可校验载体。
34
+ 4. **补行为层回归到 `dingtalk-agent-eval`**(未绑定零写、audience 拒答、知情提议)。解锁:三场景运行时读写的行为侧。
35
+ 5. **实现 Boot 期 boundIdentity 漂移检测 + per-subject 单写者租约**。解锁:C 首次绑定/多写者仲裁/部署身份漂移感知。
36
+ 6. **实现 consolidation 全套 + local-md 适配器 + --chaos 档**。解锁:三场景长期维护 missing→partial/done。