@xdxer/dingtalk-agent 0.1.4-beta.7 → 0.1.4-beta.9

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 (265) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.en.md +395 -0
  3. package/README.md +466 -36
  4. package/dist/bin/dingtalk-agent.js +1071 -340
  5. package/dist/bin/dingtalk-agent.js.map +1 -1
  6. package/dist/src/actions.js +98 -14
  7. package/dist/src/actions.js.map +1 -1
  8. package/dist/src/agent-audit.js +460 -0
  9. package/dist/src/agent-audit.js.map +1 -0
  10. package/dist/src/agent-bindings.js +132 -0
  11. package/dist/src/agent-bindings.js.map +1 -0
  12. package/dist/src/agent-definition.js +182 -0
  13. package/dist/src/agent-definition.js.map +1 -0
  14. package/dist/src/agent-enhance.js +678 -0
  15. package/dist/src/agent-enhance.js.map +1 -0
  16. package/dist/src/bootstrap.js +125 -17
  17. package/dist/src/bootstrap.js.map +1 -1
  18. package/dist/src/development-workspace.js +729 -0
  19. package/dist/src/development-workspace.js.map +1 -0
  20. package/dist/src/dws.js +145 -0
  21. package/dist/src/dws.js.map +1 -1
  22. package/dist/src/eval-evidence.js +193 -0
  23. package/dist/src/eval-evidence.js.map +1 -0
  24. package/dist/src/init.js +1 -1
  25. package/dist/src/init.js.map +1 -1
  26. package/dist/src/invocation.js +36 -0
  27. package/dist/src/invocation.js.map +1 -0
  28. package/dist/src/lab.js +679 -0
  29. package/dist/src/lab.js.map +1 -0
  30. package/dist/src/lease.js +100 -0
  31. package/dist/src/lease.js.map +1 -0
  32. package/dist/src/memory/candidates.js +451 -0
  33. package/dist/src/memory/candidates.js.map +1 -0
  34. package/dist/src/memory/completion-evidence.js +536 -0
  35. package/dist/src/memory/completion-evidence.js.map +1 -0
  36. package/dist/src/memory/operational.js +263 -0
  37. package/dist/src/memory/operational.js.map +1 -0
  38. package/dist/src/memory/remote-state.js +478 -0
  39. package/dist/src/memory/remote-state.js.map +1 -0
  40. package/dist/src/memory/task-checkpoints.js +204 -0
  41. package/dist/src/memory/task-checkpoints.js.map +1 -0
  42. package/dist/src/multica-deploy.js +1480 -0
  43. package/dist/src/multica-deploy.js.map +1 -0
  44. package/dist/src/multica-provider.js +685 -0
  45. package/dist/src/multica-provider.js.map +1 -0
  46. package/dist/src/opencode-evals.js +1062 -0
  47. package/dist/src/opencode-evals.js.map +1 -0
  48. package/dist/src/opencode-provider.js +531 -0
  49. package/dist/src/opencode-provider.js.map +1 -0
  50. package/dist/src/opencode-workspace.js +197 -0
  51. package/dist/src/opencode-workspace.js.map +1 -0
  52. package/dist/src/perception.js +225 -0
  53. package/dist/src/perception.js.map +1 -0
  54. package/dist/src/personal-event-evals.js +595 -0
  55. package/dist/src/personal-event-evals.js.map +1 -0
  56. package/dist/src/promotion.js +786 -0
  57. package/dist/src/promotion.js.map +1 -0
  58. package/dist/src/remote-semantic-state-live-evals.js +888 -0
  59. package/dist/src/remote-semantic-state-live-evals.js.map +1 -0
  60. package/dist/src/remote-semantic-state-worker.js +38 -0
  61. package/dist/src/remote-semantic-state-worker.js.map +1 -0
  62. package/dist/src/remote-state-evals.js +501 -0
  63. package/dist/src/remote-state-evals.js.map +1 -0
  64. package/dist/src/response-gate.js +51 -0
  65. package/dist/src/response-gate.js.map +1 -0
  66. package/dist/src/robot-evals.js +770 -0
  67. package/dist/src/robot-evals.js.map +1 -0
  68. package/dist/src/sessions.js +66 -105
  69. package/dist/src/sessions.js.map +1 -1
  70. package/dist/src/skill-manager.js +25 -16
  71. package/dist/src/skill-manager.js.map +1 -1
  72. package/dist/src/skills.js.map +1 -1
  73. package/dist/src/storage-evals.js +26 -0
  74. package/dist/src/storage-evals.js.map +1 -0
  75. package/dist/src/types.js.map +1 -1
  76. package/dist/src/waits.js +5 -1
  77. package/dist/src/waits.js.map +1 -1
  78. package/dist/src/workspace.js +28 -3
  79. package/dist/src/workspace.js.map +1 -1
  80. package/docs/INSTALLATION.md +47 -0
  81. package/docs/SECOND-AGENT-ACCEPTANCE.md +62 -0
  82. package/docs/architecture/agent-memory-topology.png +0 -0
  83. package/docs/architecture/agent-memory-topology.svg +132 -0
  84. package/docs/architecture/general-agent-kernel-topology.png +0 -0
  85. package/docs/architecture/general-agent-kernel-topology.svg +149 -0
  86. package/docs/architecture/provider-bound-development-workspace.png +0 -0
  87. package/docs/architecture/provider-bound-development-workspace.svg +141 -0
  88. package/docs/architecture/task-completion-gate.png +0 -0
  89. package/docs/architecture/task-completion-gate.svg +191 -0
  90. package/docs/schemas/agent-audit-load-evidence.schema.json +14 -0
  91. package/docs/schemas/agent-audit.schema.json +92 -0
  92. package/docs/schemas/agent-bindings.schema.json +54 -0
  93. package/docs/schemas/agent-definition.schema.json +78 -0
  94. package/docs/schemas/agent-enhancement-plan.schema.json +88 -0
  95. package/docs/schemas/agent-enhancement-receipt.schema.json +37 -0
  96. package/docs/schemas/enriched-invocation.schema.json +46 -0
  97. package/docs/schemas/eval-candidate-plan.schema.json +28 -0
  98. package/docs/schemas/eval-candidate-result.schema.json +20 -0
  99. package/docs/schemas/eval-candidate.schema.json +30 -0
  100. package/docs/schemas/invocation.schema.json +19 -0
  101. package/docs/schemas/memory-candidate-proposal.schema.json +18 -0
  102. package/docs/schemas/memory-candidate.schema.json +76 -0
  103. package/docs/schemas/memory-publish-target.schema.json +25 -0
  104. package/docs/schemas/multica-deployment-list.schema.json +29 -0
  105. package/docs/schemas/multica-deployment-operation.schema.json +51 -0
  106. package/docs/schemas/multica-deployment-plan.schema.json +70 -0
  107. package/docs/schemas/multica-deployment-receipt.schema.json +87 -0
  108. package/docs/schemas/multica-deployment-status.schema.json +23 -0
  109. package/docs/schemas/multica-workspace-inspection.schema.json +77 -0
  110. package/docs/schemas/multica-workspace-plan.schema.json +68 -0
  111. package/docs/schemas/multica-workspace-resource-list.schema.json +27 -0
  112. package/docs/schemas/multica-workspace-status.schema.json +34 -0
  113. package/docs/schemas/observation.schema.json +21 -0
  114. package/docs/schemas/operational-memory-provider.schema.json +36 -0
  115. package/docs/schemas/operational-memory-record.schema.json +24 -0
  116. package/docs/schemas/perception-input.schema.json +56 -0
  117. package/docs/schemas/project.schema.json +112 -0
  118. package/docs/schemas/promotion-list.schema.json +36 -0
  119. package/docs/schemas/promotion-plan.schema.json +60 -0
  120. package/docs/schemas/promotion-policy.schema.json +29 -0
  121. package/docs/schemas/promotion-receipt.schema.json +43 -0
  122. package/docs/schemas/promotion-status.schema.json +23 -0
  123. package/docs/schemas/release-readiness.schema.json +65 -0
  124. package/docs/schemas/remote-semantic-state-live-eval.schema.json +60 -0
  125. package/docs/schemas/remote-semantic-state-manifest.schema.json +79 -0
  126. package/docs/schemas/remote-semantic-state-provider.schema.json +98 -0
  127. package/docs/schemas/response-gate.schema.json +20 -0
  128. package/docs/schemas/task-checkpoint.schema.json +71 -0
  129. package/docs/schemas/task-completion-evidence.schema.json +154 -0
  130. package/docs/schemas/workspace-doctor.schema.json +56 -0
  131. package/docs/schemas/workspace-state.schema.json +39 -0
  132. package/evals/baselines/2026-07-16/opencode-basic-010-completion-summary.json +123 -0
  133. package/evals/baselines/2026-07-16/opencode-basic-skill-required-summary.json +69 -0
  134. package/evals/baselines/2026-07-16/opencode-multi-surface-summary.json +63 -0
  135. package/evals/baselines/2026-07-16/remote-state-live-summary.json +70 -0
  136. package/evals/baselines/2026-07-17/agent-enhance-opencode-dogfood-summary.json +98 -0
  137. package/evals/baselines/2026-07-17/personal-event-live-readiness-summary.json +68 -0
  138. package/examples/agents/fde-coach/AGENTS.md +26 -0
  139. package/examples/agents/fde-coach/MEMORY.md +3 -0
  140. package/examples/agents/fde-coach/fields/default/field.json +24 -0
  141. package/examples/agents/fde-coach/knowledge/INDEX.md +4 -0
  142. package/examples/agents/fde-coach/skills/fde-coach/SKILL.md +13 -0
  143. package/examples/agents/release-manager/AGENTS.md +26 -0
  144. package/examples/agents/release-manager/MEMORY.md +3 -0
  145. package/examples/agents/release-manager/fields/default/field.json +24 -0
  146. package/examples/agents/release-manager/knowledge/INDEX.md +4 -0
  147. package/examples/agents/release-manager/skills/release-manager/SKILL.md +13 -0
  148. package/lab/README.md +109 -0
  149. package/lab/agent-eval/catalog.json +91 -0
  150. package/lab/agent-eval/classic-failures.json +177 -0
  151. package/lab/agent-eval/completion-gate-regression.json +99 -0
  152. package/lab/agent-eval/personal-event-live.example.json +94 -0
  153. package/lab/agent-eval/remote-semantic-state-live.example.json +70 -0
  154. package/lab/agent-eval/remote-semantic-state-provider.fixture.json +47 -0
  155. package/lab/agent-eval/remote-state-workspace/AGENTS.md +8 -0
  156. package/lab/agent-eval/remote-state-workspace/opencode.json +7 -0
  157. package/lab/agent-eval/remote-state-workspace/skills/remote-state-operator/SKILL.md +13 -0
  158. package/lab/agent-eval/remote-state.example.json +31 -0
  159. package/lab/agent-eval/workspace/AGENTS.md +7 -0
  160. package/lab/agent-eval/workspace/MEMORY.md +4 -0
  161. package/lab/agent-eval/workspace/artifacts/pending-review.md +3 -0
  162. package/lab/agent-eval/workspace/knowledge/INDEX.md +4 -0
  163. package/lab/agent-eval/workspace/opencode.json +20 -0
  164. package/lab/manifest.example.json +27 -0
  165. package/lab/manifest.personal-event.example.json +27 -0
  166. package/lab/project-workspace/README.md +11 -0
  167. package/lab/project-workspace/fake-multica-provider.mjs +266 -0
  168. package/lab/project-workspace/multica-deploy.fixture.json +29 -0
  169. package/lab/project-workspace/multica-readonly.fixture.json +69 -0
  170. package/lab/project-workspace/observation.fixture.json +14 -0
  171. package/lab/project-workspace/opencode-provider-suite.json +65 -0
  172. package/lab/project-workspace/project.fixture.json +44 -0
  173. package/lab/project-workspace/promotion-policy.fixture.json +15 -0
  174. package/lab/robot-eval/pool.example.json +30 -0
  175. package/lab/robot-eval/suite.json +123 -0
  176. package/lab/robot-eval/workspace/AGENTS.md +21 -0
  177. package/lab/robot-eval/workspace/MEMORY.md +3 -0
  178. package/lab/robot-eval/workspace/knowledge/INDEX.md +5 -0
  179. package/lab/robot-eval/workspace/opencode.json +22 -0
  180. package/lab/schemas/agent-eval-catalog.schema.json +47 -0
  181. package/lab/schemas/lab-manifest.schema.json +70 -0
  182. package/lab/schemas/personal-event-eval.schema.json +91 -0
  183. package/lab/schemas/remote-state-eval.schema.json +66 -0
  184. package/lab/schemas/robot-eval-suite.schema.json +184 -0
  185. package/lab/schemas/robot-pool.schema.json +56 -0
  186. package/package.json +30 -14
  187. package/skills/dingtalk-agent-boot-multica/SKILL.md +40 -0
  188. package/skills/dingtalk-agent-compose/SKILL.md +110 -0
  189. package/skills/dingtalk-agent-compose/assets/AGENTS.template.md +26 -0
  190. package/skills/dingtalk-agent-compose/assets/agent.bindings.dingtalk-doc.template.json +13 -0
  191. package/skills/dingtalk-agent-compose/assets/agent.bindings.local.template.json +13 -0
  192. package/skills/dingtalk-agent-compose/assets/opencode.template.json +12 -0
  193. package/skills/dingtalk-agent-compose/assets/role-skill.template.md +24 -0
  194. package/skills/dingtalk-agent-compose/evals/evals.json +94 -0
  195. package/skills/dingtalk-agent-compose/references/agent-definition-contract.md +55 -0
  196. package/skills/dingtalk-agent-compose/references/opencode-host-contract.md +65 -0
  197. package/skills/dingtalk-agent-compose/references/storage-routing.md +20 -0
  198. package/skills/dingtalk-agent-deploy/SKILL.md +60 -0
  199. package/skills/dingtalk-agent-deploy/references/multica-deployment-contract.md +49 -0
  200. package/skills/dingtalk-agent-deploy/references/promotion-observation-contract.md +49 -0
  201. package/skills/dingtalk-agent-eval/SKILL.md +116 -0
  202. package/skills/dingtalk-agent-eval/assets/eval-catalog.template.json +18 -0
  203. package/skills/dingtalk-agent-eval/evals/evals.json +61 -0
  204. package/skills/dingtalk-agent-eval/references/eval-topology.md +34 -0
  205. package/skills/dingtalk-agent-eval/references/evidence-contract.md +31 -0
  206. package/skills/dingtalk-agent-eval/references/scenario-taxonomy.md +25 -0
  207. package/skills/dingtalk-agent-eval/references/storage-modes.md +75 -0
  208. package/skills/dingtalk-basic-behavior/SKILL.md +63 -3
  209. package/skills/dingtalk-basic-behavior/assets/memory-candidate-proposal.json +10 -0
  210. package/skills/dingtalk-basic-behavior/assets/{task-checkpoint.md → task-checkpoint.json} +2 -21
  211. package/skills/dingtalk-basic-behavior/references/action-contract.md +2 -0
  212. package/skills/dingtalk-basic-behavior/references/memory-and-evolution.md +15 -1
  213. package/skills/dingtalk-basic-behavior/references/perception-and-gates.md +28 -0
  214. package/skills/dingtalk-basic-behavior/references/task-lifecycle.md +32 -7
  215. package/dist/src/boot.js +0 -70
  216. package/dist/src/boot.js.map +0 -1
  217. package/dist/src/duty.js +0 -74
  218. package/dist/src/duty.js.map +0 -1
  219. package/dist/src/kb.js +0 -240
  220. package/dist/src/kb.js.map +0 -1
  221. package/dist/src/runs.js +0 -79
  222. package/dist/src/runs.js.map +0 -1
  223. package/docs/ARCHITECTURE.md +0 -219
  224. package/docs/MINIMAL-WORKSPACE-V1.md +0 -172
  225. package/docs/OPEN-SOURCE-REFERENCES.md +0 -107
  226. package/docs/SELF-TEST.md +0 -252
  227. package/docs//345/206/205/347/275/221/345/256/236/347/233/270.md +0 -77
  228. package/evals/baselines/2026-07-14/behavior-summary.json +0 -28
  229. package/evals/baselines/2026-07-14/contract-summary.json +0 -18
  230. package/evals/baselines/2026-07-14/live-canary-summary.json +0 -25
  231. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/SKILL.md +0 -72
  232. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/action-contract.md +0 -31
  233. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/event-to-behavior.md +0 -22
  234. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/memory-and-evolution.md +0 -25
  235. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/runtime-modes.md +0 -34
  236. package/evals/baselines/2026-07-15/task-lifecycle-summary.json +0 -50
  237. package/evals/evals.json +0 -339
  238. package/evals/fixtures/dm-ambiguous-send.json +0 -4
  239. package/evals/fixtures/dm-blocked.json +0 -4
  240. package/evals/fixtures/dm-clear.json +0 -4
  241. package/evals/fixtures/dm-discussion.json +0 -4
  242. package/evals/fixtures/dm-doc-write-no-tool.json +0 -4
  243. package/evals/fixtures/dm-long-task-ack.json +0 -4
  244. package/evals/fixtures/dm-nonblocking-gap.json +0 -4
  245. package/evals/fixtures/dm-structured-task.json +0 -4
  246. package/evals/fixtures/group.json +0 -10
  247. package/evals/fixtures/mentioned.json +0 -3
  248. package/evals/run-contract-evals.mjs +0 -1169
  249. package/evals/run-shadow-evals.mjs +0 -267
  250. package/evals/runners/README.md +0 -66
  251. package/evals/runners/claude-shadow.mjs +0 -533
  252. package/evals/schemas/action-request.schema.json +0 -77
  253. package/evals/shadow-evals.json +0 -133
  254. package/skills/AGENTS.md +0 -104
  255. package/skills//344/273/273/345/212/241.md +0 -48
  256. package/skills//345/237/272/347/241/200/350/241/214/344/270/272.md +0 -44
  257. package/skills//345/277/203/350/267/263.md +0 -79
  258. package/skills//346/266/210/346/201/257.md +0 -50
  259. package/skills//347/237/245/350/257/206.md +0 -55
  260. package/skills//350/257/204/346/265/213.md +0 -62
  261. package/skills//351/222/211/351/222/211.md +0 -64
  262. package/templates/ontology/index.md +0 -24
  263. package/templates/ontology/self/access.md +0 -38
  264. package/templates/ontology/self/role-spec.md +0 -34
  265. package/templates/ontology/self/workspace.md +0 -41
@@ -0,0 +1 @@
1
+ {"version":3,"file":"development-workspace.js","sourceRoot":"","sources":["../../src/development-workspace.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto'\nimport {\n existsSync, lstatSync, readFileSync, readdirSync, realpathSync, statSync,\n} from 'node:fs'\nimport { basename, dirname, join, parse, relative, resolve } from 'node:path'\nimport { findExecutable } from './doctor.js'\nimport { digest, stableStringify } from './events.js'\nimport { resolvePackageRoot } from './package-root.js'\nimport { loadWorkspace, workspacePath, type WorkspaceSpec } from './workspace.js'\n\nexport const PROJECT_FILE = 'dingtalk-agent.json'\nexport const CURRENT_WORKSPACE_FILE = '.dingtalk-agent/current-workspace'\nexport const WORKSPACE_STATE_ROOT = '.dingtalk-agent/state/workspaces'\nexport const LEGACY_WORKSPACE_NAME = 'legacy-prepared'\n\nexport type DevelopmentStage = 'dev' | 'test' | 'staging' | 'prod'\nexport type DeclaredProviderKind = 'opencode' | 'multica'\nexport type DevelopmentProviderKind = DeclaredProviderKind | 'local-prepared'\nexport type DevelopmentWorkspaceStatus =\n | 'declared' | 'resolving' | 'planned' | 'applying' | 'verifying'\n | 'ready' | 'drifted' | 'failed' | 'retired'\n\nexport interface OpenCodeProvider {\n kind: 'opencode'\n model: string\n}\n\nexport interface MulticaProvider {\n kind: 'multica'\n profile: string\n workspaceIdFrom: string\n runtimeIdFrom: string\n agentIdFrom?: string\n}\n\nexport interface WorkspaceStorage {\n memory: string\n knowledge: string\n artifacts?: string\n}\n\nexport interface WorkspaceAuthority {\n dwsProfileFrom: string\n expectedUserIdFrom: string\n}\n\nexport interface DeclaredWorkspace {\n stage: DevelopmentStage\n provider: OpenCodeProvider | MulticaProvider\n storage: WorkspaceStorage\n authority?: WorkspaceAuthority\n}\n\nexport interface AgentProjectManifest {\n $schema: 'dingtalk-agent/project@1'\n name: string\n dtaVersion: string\n agent: {\n definition: string\n skills: string[]\n }\n workspaces: Record<string, DeclaredWorkspace>\n}\n\nexport interface DevelopmentWorkspaceState {\n $schema: 'dingtalk-agent/workspace-state@1'\n workspace: string\n provider: DeclaredProviderKind\n status: DevelopmentWorkspaceStatus\n binding: Record<string, string>\n desiredHash: string\n observedHash: string\n lastPlanId: string\n lastReceiptId: string\n lastEvalId: string\n}\n\nexport interface DevelopmentWorkspaceView {\n name: string\n stage: DevelopmentStage\n provider: { kind: DevelopmentProviderKind } & Record<string, string>\n storage: Required<WorkspaceStorage>\n authority: WorkspaceAuthority | null\n sourceHash: string\n desiredHash: string\n observedHash: string\n status: DevelopmentWorkspaceStatus\n current: boolean\n legacy: boolean\n statePath: string\n state: DevelopmentWorkspaceState | null\n drift: string[]\n configSources: string[]\n}\n\nexport interface AgentProjectInfo {\n $schema: 'dingtalk-agent/info@1'\n root: string\n source: 'manifest' | 'legacy'\n manifest: string\n manifestHash: string\n project: {\n name: string\n dtaVersion: string\n compatibleWithCli: boolean\n definition: string\n skills: string[]\n }\n currentWorkspace: string\n workspaces: DevelopmentWorkspaceView[]\n sideEffect: false\n dingtalkSideEffect: false\n}\n\nexport interface DevelopmentWorkspaceCheck {\n id: string\n surface: 'project' | 'provider' | 'definition' | 'skills' | 'storage' | 'authority' | 'state'\n level: 'pass' | 'warn' | 'fail'\n blocking: boolean\n summary: string\n evidence: Record<string, unknown>\n fix?: string\n}\n\nexport interface DevelopmentWorkspaceDoctorReport {\n $schema: 'dingtalk-agent/workspace-doctor@1'\n ready: boolean\n workspace: string\n provider: DevelopmentProviderKind\n desiredHash: string\n observedHash: string\n status: DevelopmentWorkspaceStatus\n checks: DevelopmentWorkspaceCheck[]\n missing: string[]\n configSources: string[]\n sideEffect: false\n dingtalkSideEffect: false\n}\n\ninterface LoadedProject {\n root: string\n source: 'manifest' | 'legacy'\n manifestPath: string\n manifestHash: string\n manifest: AgentProjectManifest\n legacy: WorkspaceSpec | null\n}\n\nconst PROJECT_KEYS = new Set(['$schema', 'name', 'dtaVersion', 'agent', 'workspaces'])\nconst AGENT_KEYS = new Set(['definition', 'skills'])\nconst WORKSPACE_KEYS = new Set(['stage', 'provider', 'storage', 'authority'])\nconst OPENCODE_KEYS = new Set(['kind', 'model'])\nconst MULTICA_KEYS = new Set([\n 'kind', 'profile', 'workspaceIdFrom', 'runtimeIdFrom', 'agentIdFrom',\n])\nconst STORAGE_KEYS = new Set(['memory', 'knowledge', 'artifacts'])\nconst AUTHORITY_KEYS = new Set(['dwsProfileFrom', 'expectedUserIdFrom'])\nconst STATE_KEYS = new Set([\n '$schema', 'workspace', 'provider', 'status', 'binding', 'desiredHash', 'observedHash',\n 'lastPlanId', 'lastReceiptId', 'lastEvalId',\n])\nconst STATE_STATUSES = new Set<DevelopmentWorkspaceStatus>([\n 'declared', 'resolving', 'planned', 'applying', 'verifying',\n 'ready', 'drifted', 'failed', 'retired',\n])\nconst SECRET_KEY = /(?:secret|token|cookie|password|credentials?)$/i\nconst NAME = /^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$/\nconst ENV_REF = /^env:[A-Z_][A-Z0-9_]*$/\n\nexport function findAgentProjectRoot(start = process.cwd()): string | null {\n let directory = resolve(start)\n if (existsSync(directory) && !statSync(directory).isDirectory()) directory = dirname(directory)\n while (true) {\n if (existsSync(join(directory, PROJECT_FILE)) || existsSync(workspacePath(directory))) {\n return realpathSync(directory)\n }\n const parent = dirname(directory)\n if (parent === directory || directory === parse(directory).root) return null\n directory = parent\n }\n}\n\nexport function inspectAgentProject(\n start = process.cwd(), cliVersion = '',\n): AgentProjectInfo {\n const loaded = loadAgentProject(start)\n const currentWorkspace = readCurrentWorkspace(loaded.root)\n const declared = Object.entries(loaded.manifest.workspaces)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([name, workspace]) => declaredView(loaded, name, workspace, currentWorkspace))\n if (loaded.legacy && !(LEGACY_WORKSPACE_NAME in loaded.manifest.workspaces)) {\n declared.push(legacyView(loaded, loaded.legacy, currentWorkspace))\n }\n if (currentWorkspace && !declared.some((item) => item.name === currentWorkspace)) {\n throw new Error(`current-workspace 指向未知 Workspace: ${currentWorkspace}`)\n }\n return {\n $schema: 'dingtalk-agent/info@1',\n root: loaded.root,\n source: loaded.source,\n manifest: loaded.manifestPath ? relative(loaded.root, loaded.manifestPath) : '',\n manifestHash: loaded.manifestHash,\n project: {\n name: loaded.manifest.name,\n dtaVersion: loaded.manifest.dtaVersion,\n compatibleWithCli: !cliVersion || versionSatisfies(cliVersion, loaded.manifest.dtaVersion),\n definition: loaded.manifest.agent.definition,\n skills: [...loaded.manifest.agent.skills],\n },\n currentWorkspace,\n workspaces: declared,\n sideEffect: false,\n dingtalkSideEffect: false,\n }\n}\n\nexport function showDevelopmentWorkspace(\n start: string, name: string, cliVersion = '',\n): DevelopmentWorkspaceView {\n const info = inspectAgentProject(start, cliVersion)\n const workspace = info.workspaces.find((item) => item.name === name)\n if (!workspace) throw new Error(`Project 未声明 Workspace: ${name}`)\n return workspace\n}\n\nexport function doctorDevelopmentWorkspace(\n start: string,\n name: string,\n options: { cliVersion?: string; env?: NodeJS.ProcessEnv } = {},\n): DevelopmentWorkspaceDoctorReport {\n const cliVersion = options.cliVersion || ''\n const env = options.env || process.env\n const info = inspectAgentProject(start, cliVersion)\n const workspace = info.workspaces.find((item) => item.name === name)\n if (!workspace) throw new Error(`Project 未声明 Workspace: ${name}`)\n const checks: DevelopmentWorkspaceCheck[] = []\n const add = (\n id: string, surface: DevelopmentWorkspaceCheck['surface'], level: DevelopmentWorkspaceCheck['level'],\n blocking: boolean, summary: string, evidence: Record<string, unknown> = {}, fix?: string,\n ) => checks.push({ id, surface, level, blocking, summary, evidence, ...(fix ? { fix } : {}) })\n\n add('project.schema', 'project', 'pass', true, 'Project manifest/schema 可解析', {\n source: info.source, manifestHash: info.manifestHash,\n })\n add('project.version', 'project', info.project.compatibleWithCli ? 'pass' : 'fail', true,\n info.project.compatibleWithCli ? 'Project 声明兼容当前 dta 版本' : 'Project dtaVersion 与当前 CLI 不兼容',\n { required: info.project.dtaVersion, actual: cliVersion || 'unknown' },\n '升级 CLI,或在审阅兼容性后更新 dingtalk-agent.json#dtaVersion')\n\n const definition = inspectLocalFile(info.root, info.project.definition)\n add('definition.file', 'definition', definition.valid ? 'pass' : 'fail', true,\n definition.valid ? 'Agent Definition 位于 Project 内且可读' : 'Agent Definition 缺失、越界或不是文件',\n definition, `修复 ${info.project.definition}`)\n\n for (const [slot, uri] of Object.entries(workspace.storage)) {\n const local = inspectStorageRoute(info.root, uri)\n const blocking = !uri.startsWith('dingtalk-doc:') && !(workspace.legacy && slot === 'artifacts')\n add(`storage.${slot}`, 'storage', local.valid ? 'pass' : blocking ? 'fail' : 'warn', blocking,\n local.valid ? `${slot} Storage route 可解析`\n : uri.startsWith('dingtalk-doc:') ? `${slot} 是远端语义路由,W1 不执行 DWS 回读`\n : `${slot} 本地 Storage route 缺失或越界`,\n { route: uri, ...local }, local.fix)\n }\n\n if (workspace.state) {\n add('state.provider', 'state', workspace.drift.includes('provider') ? 'fail' : 'pass', true,\n workspace.drift.includes('provider') ? 'State Provider 与声明不一致' : 'State Provider 与声明一致',\n { declared: workspace.provider.kind, observed: workspace.state.provider })\n add('state.desired-hash', 'state', workspace.drift.includes('desiredHash') ? 'fail' : 'pass', true,\n workspace.drift.includes('desiredHash') ? 'State desiredHash 已漂移' : 'State desiredHash 与声明一致',\n { desiredHash: workspace.desiredHash, stateDesiredHash: workspace.state.desiredHash })\n add('state.status', 'state', workspace.state.status === 'ready' ? 'pass' : 'fail', true,\n workspace.state.status === 'ready' ? 'Provider state 已回读为 ready'\n : `Provider state 尚未 ready: ${workspace.state.status}`,\n { status: workspace.state.status })\n const observedHashValid = /^[a-f0-9]{64}$/.test(workspace.state.observedHash)\n add('state.observed-hash', 'state', observedHashValid ? 'pass' : 'fail', true,\n observedHashValid ? 'Provider observedHash 是稳定 sha256' : 'ready state 缺少有效 observedHash',\n { configured: Boolean(workspace.state.observedHash) })\n } else {\n const required = !workspace.legacy\n add('state.present', 'state', required ? 'fail' : 'warn', required,\n required ? '尚无 Provider 回读 state;Workspace 只完成声明,尚未就绪'\n : 'Legacy adapter 不要求新的 Provider state', {\n expectedPath: workspace.statePath,\n })\n }\n\n if (workspace.provider.kind === 'opencode') {\n inspectOpenCodeWorkspace(info, workspace, env, add)\n } else if (workspace.provider.kind === 'multica') {\n inspectDeclaredMulticaWorkspace(workspace, env, add)\n } else {\n add('provider.legacy', 'provider', 'pass', true,\n 'Legacy Prepared Workspace 已通过 workspace@1 parser 只读加载', {\n provider: workspace.provider.kind, state: 'adapter-only',\n })\n }\n\n const missing = checks.filter((check) => check.blocking && check.level !== 'pass')\n .map((check) => check.id)\n return {\n $schema: 'dingtalk-agent/workspace-doctor@1',\n ready: missing.length === 0,\n workspace: workspace.name,\n provider: workspace.provider.kind,\n desiredHash: workspace.desiredHash,\n observedHash: workspace.observedHash,\n status: workspace.status,\n checks,\n missing,\n configSources: workspace.configSources,\n sideEffect: false,\n dingtalkSideEffect: false,\n }\n}\n\nfunction loadAgentProject(start: string): LoadedProject {\n const root = findAgentProjectRoot(start)\n if (!root) {\n throw new Error(`找不到 ${PROJECT_FILE} 或 ${workspacePath('<project>')};请在 Agent Project 内运行`)\n }\n const manifestPath = join(root, PROJECT_FILE)\n const legacyPath = workspacePath(root)\n if (existsSync(legacyPath) && (\n lstatSync(legacyPath).isSymbolicLink() || !isInside(root, realpathSync(legacyPath))\n )) {\n throw new Error('Legacy workspace manifest 不能是越界符号链接')\n }\n const legacy = existsSync(legacyPath) ? loadWorkspace(root) : null\n if (!existsSync(manifestPath)) {\n if (!legacy) throw new Error(`找不到 ${PROJECT_FILE}`)\n const manifest = syntheticLegacyProject(root, legacy)\n return {\n root, source: 'legacy', manifestPath: '', manifest,\n manifestHash: digest(stableStringify(manifest)), legacy,\n }\n }\n if (lstatSync(manifestPath).isSymbolicLink()) {\n throw new Error(`${PROJECT_FILE} 不能是符号链接`)\n }\n let raw: unknown\n let source = ''\n try {\n source = readFileSync(manifestPath, 'utf8')\n raw = JSON.parse(source)\n } catch (error) {\n throw new Error(`${PROJECT_FILE} 不是合法 JSON: ${error.message}`)\n }\n rejectSecretLikeKeys(raw, PROJECT_FILE)\n const manifest = validateProjectManifest(raw, root)\n return {\n root, source: 'manifest', manifestPath: realpathSync(manifestPath), manifest,\n manifestHash: digest(stableStringify(manifest)), legacy,\n }\n}\n\nfunction validateProjectManifest(value: unknown, root: string): AgentProjectManifest {\n const input = objectValue(value, 'Project manifest')\n assertExactKeys(input, PROJECT_KEYS, 'Project manifest')\n if (input.$schema !== 'dingtalk-agent/project@1') {\n throw new Error('Project manifest 缺少 dingtalk-agent/project@1 schema')\n }\n const name = stableName(input.name, 'Project name')\n const dtaVersion = requiredString(input.dtaVersion, 'dtaVersion')\n const agentInput = objectValue(input.agent, 'Project agent')\n assertExactKeys(agentInput, AGENT_KEYS, 'Project agent')\n const definition = safeRelativePath(root, requiredString(agentInput.definition, 'agent.definition'),\n 'agent.definition', false)\n if (!Array.isArray(agentInput.skills) || agentInput.skills.length === 0) {\n throw new Error('agent.skills 必须是非空 string[]')\n }\n const skills = agentInput.skills.map((item, index) => stableName(item, `agent.skills[${index}]`))\n if (new Set(skills).size !== skills.length) throw new Error('agent.skills 不能包含重复项')\n if (!skills.includes('dingtalk-basic-behavior')) {\n throw new Error('agent.skills 必须显式包含 dingtalk-basic-behavior')\n }\n const workspaceInput = objectValue(input.workspaces, 'Project workspaces')\n const workspaces: Record<string, DeclaredWorkspace> = {}\n for (const [workspaceName, rawWorkspace] of Object.entries(workspaceInput)) {\n stableName(workspaceName, `Workspace name ${workspaceName}`)\n if (workspaceName === LEGACY_WORKSPACE_NAME) {\n throw new Error(`${LEGACY_WORKSPACE_NAME} 是 legacy adapter 保留名称`)\n }\n workspaces[workspaceName] = validateDeclaredWorkspace(rawWorkspace, root, workspaceName)\n }\n return {\n $schema: 'dingtalk-agent/project@1', name, dtaVersion,\n agent: { definition, skills }, workspaces,\n }\n}\n\nfunction validateDeclaredWorkspace(value: unknown, root: string, name: string): DeclaredWorkspace {\n const input = objectValue(value, `Workspace ${name}`)\n assertAllowedKeys(input, WORKSPACE_KEYS, `Workspace ${name}`)\n for (const required of ['stage', 'provider', 'storage']) {\n if (!(required in input)) throw new Error(`Workspace ${name} 缺少字段: ${required}`)\n }\n const stage = requiredString(input.stage, `Workspace ${name}.stage`) as DevelopmentStage\n if (!['dev', 'test', 'staging', 'prod'].includes(stage)) {\n throw new Error(`Workspace ${name}.stage 非法: ${stage}`)\n }\n const providerInput = objectValue(input.provider, `Workspace ${name}.provider`)\n const kind = requiredString(providerInput.kind, `Workspace ${name}.provider.kind`)\n let provider: OpenCodeProvider | MulticaProvider\n if (kind === 'opencode') {\n assertExactKeys(providerInput, OPENCODE_KEYS, `Workspace ${name}.provider`)\n provider = { kind, model: requiredString(providerInput.model, `Workspace ${name}.provider.model`) }\n } else if (kind === 'multica') {\n assertAllowedKeys(providerInput, MULTICA_KEYS, `Workspace ${name}.provider`)\n for (const required of ['kind', 'profile', 'workspaceIdFrom', 'runtimeIdFrom']) {\n if (!(required in providerInput)) {\n throw new Error(`Workspace ${name}.provider 缺少字段: ${required}`)\n }\n }\n provider = {\n kind,\n profile: requiredString(providerInput.profile, `Workspace ${name}.provider.profile`),\n workspaceIdFrom: envReference(providerInput.workspaceIdFrom, `${name}.workspaceIdFrom`),\n runtimeIdFrom: envReference(providerInput.runtimeIdFrom, `${name}.runtimeIdFrom`),\n ...(providerInput.agentIdFrom === undefined ? {} : {\n agentIdFrom: envReference(providerInput.agentIdFrom, `${name}.agentIdFrom`),\n }),\n }\n } else {\n throw new Error(`Workspace ${name}.provider.kind 只支持 opencode / multica`)\n }\n const storageInput = objectValue(input.storage, `Workspace ${name}.storage`)\n assertAllowedKeys(storageInput, STORAGE_KEYS, `Workspace ${name}.storage`)\n const memory = storageRoute(storageInput.memory, ['local-md', 'dingtalk-doc'], `${name}.memory`, root)\n const knowledge = storageRoute(\n storageInput.knowledge, ['local-md', 'dingtalk-doc'], `${name}.knowledge`, root,\n )\n const artifacts = storageInput.artifacts === undefined ? undefined\n : storageRoute(storageInput.artifacts, ['local-dir'], `${name}.artifacts`, root)\n let authority: WorkspaceAuthority | undefined\n if (input.authority !== undefined) {\n const authorityInput = objectValue(input.authority, `Workspace ${name}.authority`)\n assertExactKeys(authorityInput, AUTHORITY_KEYS, `Workspace ${name}.authority`)\n authority = {\n dwsProfileFrom: envReference(authorityInput.dwsProfileFrom, `${name}.dwsProfileFrom`),\n expectedUserIdFrom: envReference(\n authorityInput.expectedUserIdFrom, `${name}.expectedUserIdFrom`,\n ),\n }\n }\n if (provider.kind === 'multica' && !authority) {\n throw new Error(`Workspace ${name} 的 multica Provider 必须声明 authority env 来源`)\n }\n return { stage, provider, storage: { memory, knowledge, ...(artifacts ? { artifacts } : {}) },\n ...(authority ? { authority } : {}) }\n}\n\nfunction declaredView(\n loaded: LoadedProject,\n name: string,\n workspace: DeclaredWorkspace,\n currentWorkspace: string,\n): DevelopmentWorkspaceView {\n const artifacts = workspace.storage.artifacts ||\n `local-dir:.dingtalk-agent/artifacts/${name}`\n const storage: Required<WorkspaceStorage> = { ...workspace.storage, artifacts }\n const sourceHash = projectSourceHash(loaded.root, loaded.manifest)\n const desiredHash = digest(stableStringify({\n project: loaded.manifest.name,\n agent: loaded.manifest.agent,\n workspace: name,\n stage: workspace.stage,\n provider: workspace.provider,\n storage,\n authority: workspace.authority || null,\n sourceHash,\n }))\n const statePath = join(loaded.root, WORKSPACE_STATE_ROOT, `${name}.json`)\n const state = existsSync(statePath)\n ? loadDevelopmentWorkspaceState(statePath, name, loaded.root) : null\n const drift: string[] = []\n if (state && state.provider !== workspace.provider.kind) drift.push('provider')\n if (state && state.desiredHash !== desiredHash) drift.push('desiredHash')\n const status: DevelopmentWorkspaceStatus = drift.length ? 'drifted' : state?.status || 'declared'\n return {\n name,\n stage: workspace.stage,\n provider: { ...workspace.provider },\n storage,\n authority: workspace.authority || null,\n sourceHash,\n desiredHash,\n observedHash: state?.observedHash || '',\n status,\n current: currentWorkspace === name,\n legacy: false,\n statePath: relative(loaded.root, statePath),\n state,\n drift,\n configSources: collectConfigSources(workspace),\n }\n}\n\nfunction legacyView(\n loaded: LoadedProject, spec: WorkspaceSpec, currentWorkspace: string,\n): DevelopmentWorkspaceView {\n const storage: Required<WorkspaceStorage> = {\n memory: spec.mounts.memory,\n knowledge: spec.mounts.knowledge,\n artifacts: 'local-dir:.dingtalk-agent/artifacts/legacy-prepared',\n }\n const desiredHash = digest(stableStringify({ provider: 'local-prepared', workspace: spec }))\n return {\n name: LEGACY_WORKSPACE_NAME,\n stage: 'dev',\n provider: { kind: 'local-prepared', contextId: spec.contextId, fieldId: spec.fieldId },\n storage,\n authority: spec.dws.profile || spec.dws.expectedUserId ? {\n dwsProfileFrom: 'legacy:workspace.dws.profile',\n expectedUserIdFrom: 'legacy:workspace.dws.expectedUserId',\n } : null,\n sourceHash: digest(stableStringify({ definition: spec.mounts.profile, skills: spec.skills })),\n desiredHash,\n observedHash: desiredHash,\n status: 'ready',\n current: currentWorkspace === LEGACY_WORKSPACE_NAME,\n legacy: true,\n statePath: relative(loaded.root, workspacePath(loaded.root)),\n state: null,\n drift: [],\n configSources: ['legacy:.dingtalk-agent/workspace.json'],\n }\n}\n\nfunction projectSourceHash(root: string, manifest: AgentProjectManifest): string {\n const sources: Record<string, string> = {\n definition: localContentHash(root, manifest.agent.definition),\n opencode: localContentHash(root, 'opencode.json'),\n }\n for (const name of manifest.agent.skills) {\n const ref = name === 'dingtalk-basic-behavior'\n ? `.agents/skills/${name}` : `skills/${name}`\n sources[`skill:${name}`] = localContentHash(root, ref)\n const exposure = `.agents/skills/${name}`\n sources[`exposure:${name}`] = localContentHash(root, exposure)\n }\n return digest(stableStringify(sources))\n}\n\nfunction localContentHash(root: string, ref: string): string {\n const candidate = resolve(root, ref)\n if (!isInside(root, candidate) || !existsSync(candidate)) return ''\n const actual = realpathSync(candidate)\n if (!isInside(root, actual)) throw new Error(`Project source 真实路径越界: ${ref}`)\n const stat = lstatSync(actual)\n if (stat.isSymbolicLink()) throw new Error(`Project source 不允许符号链接: ${ref}`)\n if (stat.isFile()) return sha256(readFileSync(actual))\n if (!stat.isDirectory()) throw new Error(`Project source 类型非法: ${ref}`)\n const entries: Array<{ path: string; hash: string }> = []\n const visit = (directory: string, prefix = ''): void => {\n for (const entry of readdirSorted(directory)) {\n const path = join(directory, entry.name)\n const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name\n if (entry.isSymbolicLink()) throw new Error(`Project source 不允许符号链接: ${ref}/${relativePath}`)\n if (entry.isDirectory()) visit(path, relativePath)\n else if (entry.isFile()) entries.push({ path: relativePath, hash: sha256(readFileSync(path)) })\n else throw new Error(`Project source 类型非法: ${ref}/${relativePath}`)\n }\n }\n visit(actual)\n return digest(stableStringify(entries))\n}\n\nfunction readdirSorted(directory: string): import('node:fs').Dirent[] {\n return readdirSync(directory, { withFileTypes: true })\n .sort((a, b) => a.name.localeCompare(b.name))\n}\n\nfunction sha256(value: string | Buffer): string {\n return createHash('sha256').update(value).digest('hex')\n}\n\nfunction loadDevelopmentWorkspaceState(\n path: string, workspace: string, root: string,\n): DevelopmentWorkspaceState {\n if (lstatSync(path).isSymbolicLink()) throw new Error(`Workspace state 不能是符号链接: ${path}`)\n if (!isInside(root, realpathSync(path))) throw new Error(`Workspace state 真实路径越出 Project: ${path}`)\n let raw: unknown\n try { raw = JSON.parse(readFileSync(path, 'utf8')) }\n catch (error) { throw new Error(`Workspace state 不是合法 JSON: ${error.message}`) }\n rejectSecretLikeKeys(raw, 'Workspace state')\n const input = objectValue(raw, 'Workspace state')\n assertExactKeys(input, STATE_KEYS, 'Workspace state')\n if (input.$schema !== 'dingtalk-agent/workspace-state@1') {\n throw new Error('Workspace state 缺少 dingtalk-agent/workspace-state@1 schema')\n }\n if (input.workspace !== workspace) {\n throw new Error(`Workspace state 名称不一致: ${String(input.workspace)} != ${workspace}`)\n }\n const provider = requiredString(input.provider, 'Workspace state provider') as DeclaredProviderKind\n if (!['opencode', 'multica'].includes(provider)) throw new Error(`Workspace state provider 非法: ${provider}`)\n const status = requiredString(input.status, 'Workspace state status') as DevelopmentWorkspaceStatus\n if (!STATE_STATUSES.has(status)) throw new Error(`Workspace state status 非法: ${status}`)\n const bindingInput = objectValue(input.binding, 'Workspace state binding')\n const binding = Object.fromEntries(Object.entries(bindingInput).map(([key, item]) => [\n key, optionalString(item, `Workspace state binding.${key}`),\n ]))\n return {\n $schema: 'dingtalk-agent/workspace-state@1', workspace, provider, status, binding,\n desiredHash: requiredString(input.desiredHash, 'Workspace state desiredHash'),\n observedHash: optionalString(input.observedHash, 'Workspace state observedHash'),\n lastPlanId: optionalString(input.lastPlanId, 'Workspace state lastPlanId'),\n lastReceiptId: optionalString(input.lastReceiptId, 'Workspace state lastReceiptId'),\n lastEvalId: optionalString(input.lastEvalId, 'Workspace state lastEvalId'),\n }\n}\n\nfunction inspectOpenCodeWorkspace(\n info: AgentProjectInfo,\n workspace: DevelopmentWorkspaceView,\n env: NodeJS.ProcessEnv,\n add: (\n id: string, surface: DevelopmentWorkspaceCheck['surface'], level: DevelopmentWorkspaceCheck['level'],\n blocking: boolean, summary: string, evidence?: Record<string, unknown>, fix?: string,\n ) => void,\n): void {\n const executable = findExecutable('opencode', env)\n add('provider.opencode-cli', 'provider', executable ? 'pass' : 'fail', true,\n executable ? 'OpenCode CLI 可执行' : 'PATH 找不到 opencode',\n { executable: executable || '' }, '安装 OpenCode,并确认 opencode --version 可执行')\n add('provider.opencode-model', 'provider', workspace.provider.model ? 'pass' : 'fail', true,\n workspace.provider.model ? 'OpenCode model 已显式声明' : 'OpenCode model 缺失',\n { model: workspace.provider.model || '' })\n\n const basicPath = '.agents/skills/dingtalk-basic-behavior/SKILL.md'\n const basic = inspectLocalFile(info.root, basicPath)\n const canonicalBasic = inspectLocalFile(\n resolvePackageRoot(import.meta.url), 'skills/dingtalk-basic-behavior/SKILL.md',\n )\n const basicMatched = basic.valid && canonicalBasic.valid && basic.hash === canonicalBasic.hash\n add('skills.basic-exposure', 'skills', basicMatched ? 'pass' : 'fail', true,\n basicMatched ? 'Basic Skill exposure 与当前 canonical source 一致'\n : 'Basic Skill exposure 缺失、越界或 hash 漂移',\n { exposure: basic, canonicalHash: canonicalBasic.hash || '' }, `重新物化 ${basicPath}`)\n const configPath = join(info.root, 'opencode.json')\n const configFile = inspectLocalFile(info.root, 'opencode.json')\n let configError = ''\n let instructionCount = 0\n let permission = ''\n let permissions: Record<string, string> = {}\n if (configFile.valid) {\n try {\n const config = JSON.parse(readFileSync(configPath, 'utf8')) as Record<string, any>\n const instructions = Array.isArray(config.instructions) ? config.instructions : []\n instructionCount = instructions.filter((item) => item === basicPath).length\n const skillPermissions = config.permission?.skill\n permissions = skillPermissions && typeof skillPermissions === 'object' &&\n !Array.isArray(skillPermissions)\n ? Object.fromEntries(Object.entries(skillPermissions).map(([key, value]) => [key, String(value)]))\n : {}\n permission = permissions['dingtalk-basic-behavior'] || ''\n } catch (error) { configError = error.message }\n } else configError = configFile.exists ? 'outside-or-not-file' : 'missing'\n const configValid = !configError && instructionCount === 1 && permission === 'allow'\n add('skills.basic-instruction', 'skills', configValid ? 'pass' : 'fail', true,\n configValid ? 'OpenCode config 强制加载且允许 Basic Skill' : 'OpenCode Basic instruction/permission 合同不完整',\n { path: 'opencode.json', error: configError, instructionCount, permission },\n '运行 compose/bind 流程生成唯一 Basic instruction 与 allow permission')\n\n for (const name of info.project.skills.filter((item) => item !== 'dingtalk-basic-behavior')) {\n const source = inspectLocalFile(info.root, `skills/${name}/SKILL.md`)\n const exposure = inspectLocalFile(info.root, `.agents/skills/${name}/SKILL.md`)\n const matched = source.valid && exposure.valid && source.hash === exposure.hash &&\n permissions[name] === 'allow'\n add(`skills.role.${name}`, 'skills', matched ? 'pass' : 'fail', true,\n matched ? `Role Skill ${name} source/exposure hash 与 permission 一致`\n : `Role Skill ${name} source、exposure hash 或 permission 不一致`,\n { source, exposure, permission: permissions[name] || '' }, `运行 compose/bind 流程物化 ${name}`)\n }\n const managedRef = workspace.state?.binding.managedPath || ''\n if (managedRef) {\n const managedHash = localContentHash(info.root, managedRef)\n const matched = Boolean(managedHash && managedHash === workspace.state?.observedHash &&\n workspace.state?.binding.sourceHash === workspace.sourceHash &&\n workspace.state?.binding.model === workspace.provider.model)\n add('provider.managed-integrity', 'provider', matched ? 'pass' : 'fail', true,\n matched ? 'Managed Workspace、source/model 与 observed hash 一致'\n : 'Managed Workspace 缺失或 source/model/observed hash 漂移', {\n path: managedRef,\n actualHash: managedHash,\n expectedHash: workspace.state?.observedHash || '',\n sourceMatched: workspace.state?.binding.sourceHash === workspace.sourceHash,\n modelMatched: workspace.state?.binding.model === workspace.provider.model,\n }, `重新执行 dta workspace create ${workspace.name} --yes`)\n }\n const loadVerified = workspace.state?.status === 'ready' && Boolean(\n workspace.state.lastReceiptId || workspace.state.lastEvalId)\n add('provider.load-proof', 'provider', loadVerified ? 'pass' : 'warn', false,\n loadVerified\n ? 'Provider state 已绑定通过的随机 load/eval 证据;详情见 lastReceiptId/lastEvalId'\n : '尚未取得随机 load probe;先执行 workspace run/eval', {\n executed: Boolean(workspace.state?.lastReceiptId || workspace.state?.lastEvalId),\n lastReceiptId: workspace.state?.lastReceiptId || '',\n lastEvalId: workspace.state?.lastEvalId || '',\n })\n}\n\nfunction inspectDeclaredMulticaWorkspace(\n workspace: DevelopmentWorkspaceView,\n env: NodeJS.ProcessEnv,\n add: (\n id: string, surface: DevelopmentWorkspaceCheck['surface'], level: DevelopmentWorkspaceCheck['level'],\n blocking: boolean, summary: string, evidence?: Record<string, unknown>, fix?: string,\n ) => void,\n): void {\n const executable = findExecutable('multica', env)\n add('provider.multica-cli', 'provider', executable ? 'pass' : 'fail', true,\n executable ? 'Multica CLI 可执行' : 'PATH 找不到 multica;仅当前 Multica Workspace 不就绪',\n { executable: executable || '' }, '安装 Multica CLI;其他 Provider Workspace 不受影响')\n const refs = [\n ['workspace-id', workspace.provider.workspaceIdFrom],\n ['runtime-id', workspace.provider.runtimeIdFrom],\n ['dws-profile', workspace.authority?.dwsProfileFrom || ''],\n ['expected-user-id', workspace.authority?.expectedUserIdFrom || ''],\n ] as const\n for (const [id, ref] of refs) {\n const variable = ref.startsWith('env:') ? ref.slice(4) : ''\n const configured = Boolean(variable && env[variable])\n add(`authority.${id}`, 'authority', configured ? 'pass' : 'fail', true,\n configured ? `${id} 来源已解析` : `${id} 环境来源未设置`,\n { source: ref, configured }, `设置 ${ref || '<missing-env-ref>'}`)\n }\n const agentRef = workspace.provider.agentIdFrom || ''\n const agentVariable = agentRef.startsWith('env:') ? agentRef.slice(4) : ''\n const agentConfigured = Boolean(agentVariable && env[agentVariable])\n add('authority.agent-id', 'authority', agentRef && agentConfigured ? 'pass' : 'warn', false,\n agentRef\n ? agentConfigured ? 'agent-id 可信来源已解析' : 'agent-id 来源未设置;只允许列候选,不按名称绑定'\n : '未声明 agent-id;W3 只列候选,W4 create 后必须保存稳定 ID',\n { source: agentRef, configured: agentConfigured },\n agentRef ? `设置 ${agentRef}` : '已有 Agent 时声明 provider.agentIdFrom;新 Agent 由 W4 apply 保存 ID')\n const inspectionId = workspace.state?.binding.inspectionId || ''\n add('provider.remote-inspect', 'provider', 'warn', false,\n inspectionId\n ? '已有脱敏 Multica 只读 inspection;W4 load/smoke 前仍不能 ready'\n : '尚未运行 Multica 只读 inspection;不会创建或更新远端资源', {\n executed: Boolean(inspectionId), inspectionId, remoteWrite: false,\n })\n}\n\nfunction inspectStorageRoute(root: string, uri: string): Record<string, any> {\n if (uri.startsWith('dingtalk-doc:')) {\n return { valid: false, provider: 'dingtalk-doc', local: false, checked: false }\n }\n const separator = uri.indexOf(':')\n const provider = uri.slice(0, separator)\n const ref = uri.slice(separator + 1)\n const inspected = provider === 'local-md'\n ? inspectLocalFile(root, ref)\n : inspectLocalDirectory(root, ref)\n return { ...inspected, provider, local: true, checked: true }\n}\n\nfunction inspectLocalFile(root: string, ref: string): Record<string, any> {\n const inspected = inspectLocalPath(root, ref)\n const valid = inspected.inside && inspected.exists && inspected.type === 'file'\n return { ...inspected, valid, fix: valid ? undefined : `创建 Project 内文件 ${ref}` }\n}\n\nfunction inspectLocalDirectory(root: string, ref: string): Record<string, any> {\n const inspected = inspectLocalPath(root, ref)\n const valid = inspected.inside && inspected.exists && inspected.type === 'directory'\n return { ...inspected, valid, fix: valid ? undefined : `创建 Project 内目录 ${ref}` }\n}\n\nfunction inspectLocalPath(root: string, ref: string): Record<string, unknown> {\n const candidate = resolve(root, ref)\n const inside = isInside(root, candidate)\n if (!inside || !existsSync(candidate)) {\n return { path: ref, inside, exists: false, type: 'missing' }\n }\n const actual = realpathSync(candidate)\n const actualInside = isInside(root, actual)\n const stat = statSync(actual)\n return {\n path: relative(root, actual), inside: actualInside, exists: true,\n type: stat.isFile() ? 'file' : stat.isDirectory() ? 'directory' : 'other',\n ...(stat.isFile() && actualInside ? { hash: digest(readFileSync(actual, 'utf8')) } : {}),\n }\n}\n\nfunction syntheticLegacyProject(root: string, workspace: WorkspaceSpec): AgentProjectManifest {\n const definition = workspace.mounts.profile.startsWith('local-md:')\n ? workspace.mounts.profile.slice('local-md:'.length) : 'WORKSPACE.md'\n return {\n $schema: 'dingtalk-agent/project@1',\n name: stableName(basename(root) || 'legacy-agent', 'Legacy Project name'),\n dtaVersion: '*',\n agent: { definition, skills: [...workspace.skills] },\n workspaces: {},\n }\n}\n\nfunction readCurrentWorkspace(root: string): string {\n const path = join(root, CURRENT_WORKSPACE_FILE)\n if (!existsSync(path)) return ''\n if (lstatSync(path).isSymbolicLink()) throw new Error('current-workspace 不能是符号链接')\n if (!isInside(root, realpathSync(path))) throw new Error('current-workspace 真实路径越出 Project')\n const value = readFileSync(path, 'utf8').trim()\n return value ? stableName(value, 'current-workspace') : ''\n}\n\nfunction collectConfigSources(workspace: DeclaredWorkspace): string[] {\n const sources = [\n `manifest:provider.kind=${workspace.provider.kind}`,\n `manifest:stage=${workspace.stage}`,\n ]\n if (workspace.provider.kind === 'opencode') sources.push('manifest:provider.model')\n else sources.push(\n 'manifest:provider.profile', workspace.provider.workspaceIdFrom, workspace.provider.runtimeIdFrom,\n ...(workspace.provider.agentIdFrom ? [workspace.provider.agentIdFrom] : []),\n )\n if (workspace.authority) sources.push(\n workspace.authority.dwsProfileFrom, workspace.authority.expectedUserIdFrom,\n )\n return [...new Set(sources)]\n}\n\nfunction storageRoute(\n value: unknown, providers: string[], label: string, root: string,\n): string {\n const text = requiredString(value, label)\n const separator = text.indexOf(':')\n const provider = separator < 0 ? '' : text.slice(0, separator)\n const ref = separator < 0 ? '' : text.slice(separator + 1).trim()\n if (!providers.includes(provider) || !ref) {\n throw new Error(`${label} Storage 非法;允许 ${providers.map((item) => `${item}:<ref>`).join(' / ')}`)\n }\n if (provider.startsWith('local-')) safeRelativePath(root, ref, label, true)\n return `${provider}:${ref}`\n}\n\nfunction safeRelativePath(root: string, input: string, label: string, allowMissing: boolean): string {\n if (input.includes('\\0')) throw new Error(`${label} 包含 NUL`) // defensive for non-POSIX callers\n const candidate = resolve(root, input)\n if (!isInside(root, candidate) || candidate === root) throw new Error(`${label} 必须位于 Project 内: ${input}`)\n if (existsSync(candidate)) {\n const actual = realpathSync(candidate)\n if (!isInside(root, actual)) throw new Error(`${label} 真实路径越出 Project: ${input}`)\n } else if (!allowMissing && !isInside(root, candidate)) {\n throw new Error(`${label} 越出 Project: ${input}`)\n }\n return relative(root, candidate).split('\\\\').join('/')\n}\n\nfunction envReference(value: unknown, label: string): string {\n const text = requiredString(value, label)\n if (!ENV_REF.test(text)) throw new Error(`${label} 必须是 env:UPPER_CASE_VAR 引用`)\n return text\n}\n\nfunction stableName(value: unknown, label: string): string {\n const text = requiredString(value, label)\n if (!NAME.test(text)) throw new Error(`${label} 非法: ${text}`)\n return text\n}\n\nfunction requiredString(value: unknown, label: string): string {\n if (typeof value !== 'string' || !value.trim()) throw new Error(`${label} 必须是非空字符串`)\n return value.trim()\n}\n\nfunction optionalString(value: unknown, label: string): string {\n if (typeof value !== 'string') throw new Error(`${label} 必须是字符串`)\n return value.trim()\n}\n\nfunction objectValue(value: unknown, label: string): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`${label} 必须是 JSON object`)\n }\n return value as Record<string, unknown>\n}\n\nfunction assertExactKeys(value: Record<string, unknown>, allowed: Set<string>, label: string): void {\n assertAllowedKeys(value, allowed, label)\n const missing = [...allowed].filter((key) => !(key in value))\n if (missing.length) throw new Error(`${label} 缺少字段: ${missing.join(', ')}`)\n}\n\nfunction assertAllowedKeys(value: Record<string, unknown>, allowed: Set<string>, label: string): void {\n const unknown = Object.keys(value).filter((key) => !allowed.has(key))\n if (unknown.length) throw new Error(`${label} 包含未知字段: ${unknown.join(', ')}`)\n}\n\nfunction rejectSecretLikeKeys(value: unknown, label: string, path: string[] = []): void {\n if (Array.isArray(value)) {\n value.forEach((item, index) => rejectSecretLikeKeys(item, label, [...path, String(index)]))\n return\n }\n if (!value || typeof value !== 'object') return\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n const next = [...path, key]\n if (SECRET_KEY.test(key)) {\n throw new Error(`${label} 禁止凭据字段: ${next.join('.')}`)\n }\n rejectSecretLikeKeys(item, label, next)\n }\n}\n\nfunction versionSatisfies(actualInput: string, rangeInput: string): boolean {\n const actual = parseVersion(actualInput)\n const range = rangeInput.trim()\n if (range === '*' || range === 'latest') return true\n const operator = range.startsWith('^') ? '^' : range.startsWith('~') ? '~' : '='\n const expected = parseVersion(operator === '=' ? range : range.slice(1))\n if (!actual || !expected) return false\n if (operator === '=') return actual.join('.') === expected.join('.')\n if (compareVersion(actual, expected) < 0) return false\n if (operator === '~') return actual[0] === expected[0] && actual[1] === expected[1]\n if (expected[0] > 0) return actual[0] === expected[0]\n if (expected[1] > 0) return actual[0] === 0 && actual[1] === expected[1]\n return actual[0] === 0 && actual[1] === 0 && actual[2] === expected[2]\n}\n\nfunction parseVersion(value: string): [number, number, number] | null {\n const match = value.trim().replace(/^v/, '').match(/^(\\d+)\\.(\\d+)\\.(\\d+)/)\n return match ? [Number(match[1]), Number(match[2]), Number(match[3])] : null\n}\n\nfunction compareVersion(a: number[], b: number[]): number {\n for (let index = 0; index < 3; index += 1) {\n if (a[index] !== b[index]) return a[index] - b[index]\n }\n return 0\n}\n\nfunction isInside(root: string, candidate: string): boolean {\n const rel = relative(root, candidate)\n return rel === '' || (rel !== '..' && !rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`))\n}\n"]}
package/dist/src/dws.js CHANGED
@@ -90,6 +90,100 @@ export function run(args, { allowFail = false, timeout = 180_000, retries = 2 }
90
90
  return null;
91
91
  die(`dws 无响应(重试 ${retries} 次) ${args.slice(0, 4).join(' ')}\n ${last}`);
92
92
  }
93
+ /**
94
+ * 启动 dev connect daemon。
95
+ *
96
+ * dws 当前即使收到 `--format json`,成功时仍可能只输出:
97
+ * `connect daemon started (pid=..., log=...)`。这不是通用 JSON 契约,只有这个
98
+ * 已知启动动作允许接受;健康与否仍必须由调用方随后执行 status 回读确认。
99
+ */
100
+ export function startConnectDaemon(args, { timeout = 60_000 } = {}) {
101
+ if (args[0] !== 'dev' || args[1] !== 'connect' || !args.includes('--daemon')) {
102
+ die('startConnectDaemon 只允许执行 dev connect --daemon');
103
+ }
104
+ if (!args.includes('--unified-app-id') && !args.includes('--robot-client-id')) {
105
+ die('dev connect daemon 必须固定 unified-app-id 或 robot-client-id');
106
+ }
107
+ if (args.includes('--robot-client-secret')) {
108
+ die('dev connect daemon 禁止通过命令行传机器人 Secret');
109
+ }
110
+ const p = spawnSync('dws', [...args, '--format', 'json'], {
111
+ encoding: 'utf8', timeout, maxBuffer: 64 * 1024 * 1024,
112
+ });
113
+ if (p.error) {
114
+ if (p.error.code === 'ENOENT') {
115
+ die('dws 跑不起来 —— 先 export PATH="$HOME/.local/bin:$PATH"');
116
+ }
117
+ die(`dws dev connect daemon 启动失败: ${String(p.error)}`);
118
+ }
119
+ const out = p.stdout || p.stderr || '';
120
+ const i = out.indexOf('{');
121
+ if (i >= 0) {
122
+ try {
123
+ const data = JSON.parse(out.slice(i, lastBrace(out) + 1));
124
+ const err = data?.error || {};
125
+ if (err.code || err.message) {
126
+ die(`dws 失败 dev connect daemon\n ${JSON.stringify(err).slice(0, 300)}`);
127
+ }
128
+ if (p.status !== 0) {
129
+ die(`dws dev connect daemon 以退出码 ${p.status} 结束`);
130
+ }
131
+ return data;
132
+ }
133
+ catch (error) {
134
+ if (error instanceof Blocked)
135
+ throw error;
136
+ die('dws dev connect daemon 返回了无法解析的 JSON');
137
+ }
138
+ }
139
+ if (p.status === 0 && /connect daemon started\s*\(pid\s*=?\s*\d+\)/i.test(out)) {
140
+ const pid = Number(out.match(/pid\s*=?\s*(\d+)/i)?.[1] || 0);
141
+ return { data: { started: true, pid, responseMode: 'daemon-text' } };
142
+ }
143
+ const summary = out.trim().replace(/\s+/g, ' ').slice(0, 300);
144
+ die(`dws dev connect daemon 未返回已知成功响应${p.status === null ? '' : ` (exit=${p.status})`}: ${summary}`);
145
+ }
146
+ /** 停止已知 connector;命令回包只说明“已受理”,调用方仍须 status 回读。 */
147
+ export function stopConnectDaemon(args, { timeout = 30_000 } = {}) {
148
+ if (args[0] !== 'dev' || args[1] !== 'connect' || args[2] !== 'stop') {
149
+ die('stopConnectDaemon 只允许执行 dev connect stop');
150
+ }
151
+ if (!args.includes('--robot-client-id') && !args.includes('--unified-app-id')) {
152
+ die('dev connect stop 必须固定 robot-client-id 或 unified-app-id');
153
+ }
154
+ if (args.includes('--robot-client-secret')) {
155
+ die('dev connect stop 禁止通过命令行传机器人 Secret');
156
+ }
157
+ const p = spawnSync('dws', [...args, '--format', 'json'], {
158
+ encoding: 'utf8', timeout, maxBuffer: 64 * 1024 * 1024,
159
+ });
160
+ if (p.error)
161
+ die(`dws dev connect stop 执行失败: ${String(p.error)}`);
162
+ const out = p.stdout || p.stderr || '';
163
+ const i = out.indexOf('{');
164
+ if (i >= 0) {
165
+ try {
166
+ const data = JSON.parse(out.slice(i, lastBrace(out) + 1));
167
+ const err = data?.error || {};
168
+ if (err.code || err.message) {
169
+ die(`dws 失败 dev connect stop\n ${JSON.stringify(err).slice(0, 300)}`);
170
+ }
171
+ if (p.status !== 0)
172
+ die(`dws dev connect stop 以退出码 ${p.status} 结束`);
173
+ return data;
174
+ }
175
+ catch (error) {
176
+ if (error instanceof Blocked)
177
+ throw error;
178
+ die('dws dev connect stop 返回了无法解析的 JSON');
179
+ }
180
+ }
181
+ if (p.status === 0 && /(connect daemon stopped|connector (?:is )?not running|no connector heartbeat)/i.test(out)) {
182
+ return { data: { stopAccepted: true, responseMode: 'daemon-text' } };
183
+ }
184
+ const summary = out.trim().replace(/\s+/g, ' ').slice(0, 300);
185
+ die(`dws dev connect stop 未返回已知响应${p.status === null ? '' : ` (exit=${p.status})`}: ${summary}`);
186
+ }
93
187
  function lastBrace(s) {
94
188
  // dws 有时在 JSON 后面粘一行 WARN / INFO —— 从最后一个 } 截断
95
189
  for (let i = s.length - 1; i >= 0; i--)
@@ -172,6 +266,9 @@ export function createDoc(folder, name, file) {
172
266
  }
173
267
  export const updateDoc = (node, file) => run(['doc', 'update', '--node', node, '--content-file', file,
174
268
  '--content-format', 'markdown', '--mode', 'overwrite', '--yes']);
269
+ /** 候选发布只追加唯一 marker;写错误不重试,调用方必须全文回读。 */
270
+ export const appendDoc = (node, file, profile = '') => run(['doc', 'update', '--node', node, '--content-file', file,
271
+ '--content-format', 'markdown', '--mode', 'append', ...profileArgs(profile), '--yes'], { allowFail: true, retries: 0 });
175
272
  export const readDoc = (node, profile = '') => markdown(run([
176
273
  'doc', 'read', '--node', node, ...profileArgs(profile),
177
274
  ]));
@@ -267,4 +364,52 @@ export function getSelf(profile = '') {
267
364
  'contact', 'user', 'get-self', ...profileArgs(profile),
268
365
  ], { retries: 1 });
269
366
  }
367
+ // ──────────────── Operational Memory:AI 表格宽表原子能力 ────────────────
368
+ export function queryAiTableRecords({ baseId, tableId, filters = null, recordIds = [], profile = '', }) {
369
+ const args = [
370
+ 'aitable', 'record', 'query', '--base-id', baseId, '--table-id', tableId,
371
+ ];
372
+ if (recordIds.length)
373
+ args.push('--record-ids', recordIds.join(','));
374
+ else if (filters)
375
+ args.push('--filters', JSON.stringify(filters), '--limit', '100');
376
+ args.push(...profileArgs(profile));
377
+ return records(run(args, { retries: 1 }));
378
+ }
379
+ /** AI 表格 Base 目录回读;调用方仍需继续核对固定 tableId。 */
380
+ export function getAiTableBase(baseId, profile = '') {
381
+ return inner(run([
382
+ 'aitable', 'base', 'get', '--base-id', baseId, ...profileArgs(profile),
383
+ ], { retries: 1 }));
384
+ }
385
+ /** AI 表格表结构回读;写入前用它确认固定 tableId 与 fieldId。 */
386
+ export function getAiTableTables(baseId, tableIds, profile = '') {
387
+ if (!tableIds.length)
388
+ die('AI 表格结构回读必须固定至少一个 tableId');
389
+ return inner(run([
390
+ 'aitable', 'table', 'get', '--base-id', baseId,
391
+ '--table-ids', tableIds.join(','), ...profileArgs(profile),
392
+ ], { retries: 1 }));
393
+ }
394
+ /** 写错误可能实际成功,因此不重试、不直接下结论;调用方必须按 key/recordId 回读。 */
395
+ export function createAiTableRecord(baseId, tableId, cells, profile = '') {
396
+ const data = run([
397
+ 'aitable', 'record', 'create', '--base-id', baseId, '--table-id', tableId,
398
+ '--records', JSON.stringify([{ cells }]), ...profileArgs(profile), '--yes',
399
+ ], { allowFail: true, retries: 0 });
400
+ const ids = data ? inner(data).newRecordIds : [];
401
+ return {
402
+ accepted: Boolean(data),
403
+ recordIds: Array.isArray(ids) ? ids.map(String).filter(Boolean) : [],
404
+ data,
405
+ };
406
+ }
407
+ /** 写错误可能实际成功,因此不重试;调用方必须按 recordId 回读。 */
408
+ export function updateAiTableRecord(baseId, tableId, recordId, cells, profile = '') {
409
+ const data = run([
410
+ 'aitable', 'record', 'update', '--base-id', baseId, '--table-id', tableId,
411
+ '--records', JSON.stringify([{ recordId, cells }]), ...profileArgs(profile), '--yes',
412
+ ], { allowFail: true, retries: 0 });
413
+ return { accepted: Boolean(data), data };
414
+ }
270
415
  //# sourceMappingURL=dws.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dws.js","sourceRoot":"","sources":["../../src/dws.ts"],"names":[],"mappings":"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","sourcesContent":["// dws 硬化包装 —— 这一层是「拦」(TypeScript source)。\n//\n// **上面的每个模块都必须走它,不许自己 spawn dws。**\n//\n// ════════════════════════════════════════════════════════════════\n// 【六条工程纪律】—— 每一条都是踩出来的,违反必出错,而且是【静默】出错\n// ════════════════════════════════════════════════════════════════\n//\n// 1. **拿不到就响亮地死,绝不当成\"是空的\"。**\n// 不同接口把数据藏在不同层级。读错层级 → 拿到 undefined → 当成\"表是空的\"\n// → **一整天的数据可以这么无声丢掉,而且不报错。**\n// 「查到 0 条」和「读错地方了」**必须分得开**。分不开就 die。\n//\n// 2. **分页会静默截断。** 默认页大小有上限,超了就悄悄少给你,\n// **而且不一定有信号告诉你被截断了。**\n// **拿不到分页信号 ≠ 没有下一页,那叫「没有信号」。**\n// **半张表算出来的结果是错的,不是\"差不多\"。**\n//\n// 3. **创建类:报错了也可能其实建成功了。**\n// **绝不看返回信封** —— 按名回查 + 内容回读定成败。\n// 推论:**创建类永不盲重试**(会造重复件),失败先按幂等键回查。\n//\n// 4. **写操作报错 ≠ 失败。** 回读实态才定成败。返回 success 也不算验收。\n//\n// 5. **字段读写不对称。** 写进去的形状 ≠ 读回来的形状。**写完必回读。**\n//\n// 6. **markdown 会被重排版。重排版不是漂移。**\n// 判漂移必须剥掉 markdown 符号只看文字流 —— 用行级 diff 会每次都误报,\n// **然后你就会开始无脑 --force,真漂移也一起覆盖掉。**\n//\n// 一句话:**所有这些坑的形状都一样 —— 它不报错,它给你一个看起来很正常的答案。**\n// 这一层做的就是:**把「看起来正常」和「真的正常」分开。**\n\nimport { spawnSync } from 'node:child_process'\n\nexport class Blocked extends Error {}\n\nexport function die(msg): never {\n console.error('[FAIL] ' + msg)\n throw new Blocked(msg)\n}\n\nconst sleep = (ms) => Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms)\n\n/** 跑一条 dws。限流退避;超时不当成\"空\";坏响应响亮地死。 */\nexport function run(args, { allowFail = false, timeout = 180_000, retries = 2 } = {}) {\n let last = ''\n for (let attempt = 0; attempt <= retries; attempt++) {\n const p = spawnSync('dws', [...args, '--format', 'json'],\n { encoding: 'utf8', timeout, maxBuffer: 64 * 1024 * 1024 })\n if (p.error) {\n if ((p.error as NodeJS.ErrnoException).code === 'ENOENT') {\n if (allowFail) return null\n die('dws 跑不起来 —— 先 export PATH=\"$HOME/.local/bin:$PATH\"')\n }\n last = String(p.error); sleep(2000 * (attempt + 1)); continue\n }\n const out = p.stdout || p.stderr || ''\n last = out.slice(0, 300)\n const i = out.indexOf('{')\n if (i < 0) { sleep(2000 * (attempt + 1)); continue }\n let d\n try { d = JSON.parse(out.slice(i, lastBrace(out) + 1)) }\n catch { sleep(2000 * (attempt + 1)); continue }\n const err = d.error || {}\n if (err && (err.code || err.message)) {\n const s = JSON.stringify(err).toLowerCase()\n if (s.includes('limit') || s.includes('frequen') || s.includes('flow')) {\n sleep(3000 * (attempt + 1)); continue // 限流 → 退避\n }\n if (allowFail) return null\n die(`dws 失败 ${args.slice(0, 4).join(' ')}\\n ${JSON.stringify(err).slice(0, 300)}`)\n }\n if (p.status !== 0) {\n if (allowFail) return null\n die(`dws 以退出码 ${p.status} 结束,但没有结构化 error: ${args.slice(0, 4).join(' ')}\\n ${last}`)\n }\n return d\n }\n if (allowFail) return null\n die(`dws 无响应(重试 ${retries} 次) ${args.slice(0, 4).join(' ')}\\n ${last}`)\n}\n\nfunction lastBrace(s) {\n // dws 有时在 JSON 后面粘一行 WARN / INFO —— 从最后一个 } 截断\n for (let i = s.length - 1; i >= 0; i--) if (s[i] === '}') return i\n return s.length - 1\n}\n\n// ──────────────── 三个层级,各读各的 ────────────────\nconst inner = (d) => (d && typeof d.data === 'object' && d.data !== null ? d.data : d)\n\n/** 列表类查询的记录。拿不到就 die —— 绝不当成\"表是空的\"。 */\nexport function records(d) {\n const x = inner(d)\n if (!('records' in x)) {\n die(`返回里没有 records(顶层键=${Object.keys(d)}) —— 接口形状可能变了。` +\n `**绝不把它当成【表是空的】。**`)\n }\n if (x.hasMore || x.partial) {\n die('分页未收敛 —— **部分结果不许当完整结果用。** 半张表算出来的是错的。')\n }\n return x.records || []\n}\n\n/** 文档正文。**层级和列表类查询不一样** —— 两种形状都兜住,拿不到就 die。 */\nexport function markdown(d) {\n const md = inner(d).markdown ?? d.markdown\n if (md === undefined || md === null) {\n die(`拿不到文档正文(顶层键=${Object.keys(d)}) —— **绝不当成【这篇是空的】。**`)\n }\n return md\n}\n\n/** 目录节点。 */\nexport const nodes = (d) => inner(d).nodes || []\n\n/**\n * 待办翻页 —— **这是唯一有分页信号的读法。**\n *\n * ⚠️ **不要把页开大**。超过这个大小,分页信号会消失,\n * 你拿到 undefined、当成 false,然后**静默漏掉剩下的**。\n * 心跳的收件靠它 —— 漏了循环件就是「静默收工且不自知」。\n */\nexport function todosPage(status = 'false', page = 1) {\n const d = run(['todo', 'task', 'list', '--status', status, '--size', '20', '--page', String(page)])\n const r = d.result || {}\n if (!('todoCards' in r)) {\n die(`待办返回里没有 todoCards(result 键=${Object.keys(r)}) —— 绝不当成【没有待办】。`)\n }\n return { cards: r.todoCards || [], more: Boolean(r.hasMore) }\n}\n\n/** 把待办【拉全】。只看第一页会漏掉循环件。 */\nexport function todosAll(status = 'false', maxPages = 20) {\n const out: any[] = []\n for (let page = 1; page <= maxPages; page++) {\n const { cards, more } = todosPage(status, page)\n out.push(...cards)\n if (!more) return out\n }\n die(`待办翻页超过 ${maxPages} 页还没收敛 —— 不许把部分结果当完整。`)\n}\n\n// ──────────────── 创建类:报错也可能成功 → 按名回查 ────────────────\n/** 目录列表可能把扩展名单列,比对时要拼回去。 */\nexport function findChild(folder, name) {\n for (const n of nodes(run(['doc', 'list', '--folder', folder, '--page-size', '50']))) {\n const nm = n.name || '', ext = n.extension || ''\n if (nm === name || (ext && `${nm}.${ext}` === name)) return n.nodeId\n }\n return null\n}\n\n/** 建文档。**不看返回信封** —— 一律按名回查定成败。 */\nexport function createDoc(folder, name, file) {\n const exist = findChild(folder, name)\n if (exist) return exist\n run(['doc', 'create', '--name', name, '--folder', folder,\n '--content-file', file, '--content-format', 'markdown', '--yes'],\n { allowFail: true }) // ← **报错也可能其实成功了**\n sleep(1200)\n const nid = findChild(folder, name)\n if (!nid) die(`建不出文档 ${name} —— 别把它当成【建成功了】。`)\n return nid\n}\n\nexport const updateDoc = (node, file) =>\n run(['doc', 'update', '--node', node, '--content-file', file,\n '--content-format', 'markdown', '--mode', 'overwrite', '--yes'])\n\nexport const readDoc = (node, profile = '') => markdown(run([\n 'doc', 'read', '--node', node, ...profileArgs(profile),\n]))\nexport const docInfo = (node, profile = '') => inner(run([\n 'doc', 'info', '--node', node, ...profileArgs(profile),\n]))\n\n// ──────────────── 漂移判定:重排版【不是】漂移 ────────────────\n/**\n * 剥掉 markdown 语法和转义装饰,只留【文字本身】。\n *\n * 钉钉会重排版你推上去的 markdown。**重排版不是漂移。**\n * 用行级 diff 判漂移 → 每次 sync 都误报 →\n * **然后你就会开始无脑 --force,真正的漂移也一起覆盖掉了。**\n */\nexport function words(s) {\n let t = String(s ?? '')\n for (let i = 0; i < 3; i++) t = unescapeHtml(t) // 可能被多次转义\n t = t.replace(/&#(\\d+);/g, (_, n) => String.fromCharCode(+n))\n t = t.replace(/\\[打开\\]\\([^)]*\\)/g, '') // 钉钉自动加的链接装饰\n return t.replace(/[`*_>#|\\\\~\\-\\s]+/g, '')\n}\n\nfunction unescapeHtml(s) {\n return s.replace(/&(amp|lt|gt|quot|#39);/g, (m, e) =>\n ({ amp: '&', lt: '<', gt: '>', quot: '\"', '#39': \"'\" })[e])\n}\n\nexport const same = (a, b) => words(a) === words(b)\n\n// ──────────────── 数字员工的消息原子动作(typed,目标不可自由拼装) ────────────────\nfunction profileArgs(profile) {\n return profile ? ['--profile', profile] : []\n}\n\nfunction assertReplyTarget(target) {\n const missing: string[] = []\n if (!target?.conversationId) missing.push('conversationId')\n if (!target?.messageId) missing.push('messageId')\n if (!target?.senderOpenDingTalkId) missing.push('senderOpenDingTalkId')\n if (missing.length) die(`固定回复目标缺少 ${missing.join(' / ')}`)\n}\n\n/** ack 没有服务端 UUID,因此绝不自动重试。 */\nexport function ackMessage(target, { emoji = '收到', profile = '' } = {}) {\n assertReplyTarget(target)\n return run([\n 'chat', 'message', 'add-emoji',\n '--conversation-id', target.conversationId,\n '--msg-id', target.messageId,\n '--emoji', emoji,\n ...profileArgs(profile),\n ], { retries: 0 })\n}\n\n/** reply/ask 共用同一传输;uuid 在调用前已持久化,重试也必须复用。 */\nexport function replyMessage(\n target,\n text,\n { uuid = '', profile = '' }: { uuid?: string; profile?: string } = {},\n) {\n assertReplyTarget(target)\n if (!String(text || '').trim()) die('回复正文不能为空')\n if (!uuid) die('回复前必须先持久化 uuid 幂等键')\n return run([\n 'chat', 'message', 'reply',\n '--conversation-id', target.conversationId,\n '--ref-msg-id', target.messageId,\n '--ref-sender', target.senderOpenDingTalkId,\n '--text', text,\n '--uuid', uuid,\n '--ai-tag=true',\n ...profileArgs(profile),\n '--yes',\n ], { retries: 1 })\n}\n\nexport function readMessageEmotions(messageId, profile = '') {\n return run([\n 'chat', 'message', 'list-emotion-replies', '--msg-ids', messageId,\n ...profileArgs(profile),\n ], { allowFail: true, retries: 0 })\n}\n\nexport function querySendStatus(openTaskId, profile = '') {\n return run([\n 'chat', 'message', 'query-send-status', '--open-task-id', openTaskId,\n ...profileArgs(profile),\n ], { allowFail: true, retries: 1 })\n}\n\nexport function readMessagesByIds(messageId, profile = '') {\n return run([\n 'chat', 'message', 'list-by-ids', '--msg-ids', messageId,\n ...profileArgs(profile),\n ], { allowFail: true, retries: 1 })\n}\n\n/** 外发前核对 profile 对应的真实执行身份。 */\nexport function getSelf(profile = '') {\n return run([\n 'contact', 'user', 'get-self', ...profileArgs(profile),\n ], { retries: 1 })\n}\n"]}
1
+ {"version":3,"file":"dws.js","sourceRoot":"","sources":["../../src/dws.ts"],"names":[],"mappings":"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","sourcesContent":["// dws 硬化包装 —— 这一层是「拦」(TypeScript source)。\n//\n// **上面的每个模块都必须走它,不许自己 spawn dws。**\n//\n// ════════════════════════════════════════════════════════════════\n// 【六条工程纪律】—— 每一条都是踩出来的,违反必出错,而且是【静默】出错\n// ════════════════════════════════════════════════════════════════\n//\n// 1. **拿不到就响亮地死,绝不当成\"是空的\"。**\n// 不同接口把数据藏在不同层级。读错层级 → 拿到 undefined → 当成\"表是空的\"\n// → **一整天的数据可以这么无声丢掉,而且不报错。**\n// 「查到 0 条」和「读错地方了」**必须分得开**。分不开就 die。\n//\n// 2. **分页会静默截断。** 默认页大小有上限,超了就悄悄少给你,\n// **而且不一定有信号告诉你被截断了。**\n// **拿不到分页信号 ≠ 没有下一页,那叫「没有信号」。**\n// **半张表算出来的结果是错的,不是\"差不多\"。**\n//\n// 3. **创建类:报错了也可能其实建成功了。**\n// **绝不看返回信封** —— 按名回查 + 内容回读定成败。\n// 推论:**创建类永不盲重试**(会造重复件),失败先按幂等键回查。\n//\n// 4. **写操作报错 ≠ 失败。** 回读实态才定成败。返回 success 也不算验收。\n//\n// 5. **字段读写不对称。** 写进去的形状 ≠ 读回来的形状。**写完必回读。**\n//\n// 6. **markdown 会被重排版。重排版不是漂移。**\n// 判漂移必须剥掉 markdown 符号只看文字流 —— 用行级 diff 会每次都误报,\n// **然后你就会开始无脑 --force,真漂移也一起覆盖掉。**\n//\n// 一句话:**所有这些坑的形状都一样 —— 它不报错,它给你一个看起来很正常的答案。**\n// 这一层做的就是:**把「看起来正常」和「真的正常」分开。**\n\nimport { spawnSync } from 'node:child_process'\n\nexport class Blocked extends Error {}\n\nexport function die(msg): never {\n console.error('[FAIL] ' + msg)\n throw new Blocked(msg)\n}\n\nconst sleep = (ms) => Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms)\n\n/** 跑一条 dws。限流退避;超时不当成\"空\";坏响应响亮地死。 */\nexport function run(args, { allowFail = false, timeout = 180_000, retries = 2 } = {}) {\n let last = ''\n for (let attempt = 0; attempt <= retries; attempt++) {\n const p = spawnSync('dws', [...args, '--format', 'json'],\n { encoding: 'utf8', timeout, maxBuffer: 64 * 1024 * 1024 })\n if (p.error) {\n if ((p.error as NodeJS.ErrnoException).code === 'ENOENT') {\n if (allowFail) return null\n die('dws 跑不起来 —— 先 export PATH=\"$HOME/.local/bin:$PATH\"')\n }\n last = String(p.error); sleep(2000 * (attempt + 1)); continue\n }\n const out = p.stdout || p.stderr || ''\n last = out.slice(0, 300)\n const i = out.indexOf('{')\n if (i < 0) { sleep(2000 * (attempt + 1)); continue }\n let d\n try { d = JSON.parse(out.slice(i, lastBrace(out) + 1)) }\n catch { sleep(2000 * (attempt + 1)); continue }\n const err = d.error || {}\n if (err && (err.code || err.message)) {\n const s = JSON.stringify(err).toLowerCase()\n if (s.includes('limit') || s.includes('frequen') || s.includes('flow')) {\n sleep(3000 * (attempt + 1)); continue // 限流 → 退避\n }\n if (allowFail) return null\n die(`dws 失败 ${args.slice(0, 4).join(' ')}\\n ${JSON.stringify(err).slice(0, 300)}`)\n }\n if (p.status !== 0) {\n if (allowFail) return null\n die(`dws 以退出码 ${p.status} 结束,但没有结构化 error: ${args.slice(0, 4).join(' ')}\\n ${last}`)\n }\n return d\n }\n if (allowFail) return null\n die(`dws 无响应(重试 ${retries} 次) ${args.slice(0, 4).join(' ')}\\n ${last}`)\n}\n\n/**\n * 启动 dev connect daemon。\n *\n * dws 当前即使收到 `--format json`,成功时仍可能只输出:\n * `connect daemon started (pid=..., log=...)`。这不是通用 JSON 契约,只有这个\n * 已知启动动作允许接受;健康与否仍必须由调用方随后执行 status 回读确认。\n */\nexport function startConnectDaemon(\n args: string[],\n { timeout = 60_000 } = {},\n): Record<string, any> {\n if (args[0] !== 'dev' || args[1] !== 'connect' || !args.includes('--daemon')) {\n die('startConnectDaemon 只允许执行 dev connect --daemon')\n }\n if (!args.includes('--unified-app-id') && !args.includes('--robot-client-id')) {\n die('dev connect daemon 必须固定 unified-app-id 或 robot-client-id')\n }\n if (args.includes('--robot-client-secret')) {\n die('dev connect daemon 禁止通过命令行传机器人 Secret')\n }\n\n const p = spawnSync('dws', [...args, '--format', 'json'], {\n encoding: 'utf8', timeout, maxBuffer: 64 * 1024 * 1024,\n })\n if (p.error) {\n if ((p.error as NodeJS.ErrnoException).code === 'ENOENT') {\n die('dws 跑不起来 —— 先 export PATH=\"$HOME/.local/bin:$PATH\"')\n }\n die(`dws dev connect daemon 启动失败: ${String(p.error)}`)\n }\n const out = p.stdout || p.stderr || ''\n const i = out.indexOf('{')\n if (i >= 0) {\n try {\n const data = JSON.parse(out.slice(i, lastBrace(out) + 1))\n const err = data?.error || {}\n if (err.code || err.message) {\n die(`dws 失败 dev connect daemon\\n ${JSON.stringify(err).slice(0, 300)}`)\n }\n if (p.status !== 0) {\n die(`dws dev connect daemon 以退出码 ${p.status} 结束`)\n }\n return data\n } catch (error) {\n if (error instanceof Blocked) throw error\n die('dws dev connect daemon 返回了无法解析的 JSON')\n }\n }\n if (p.status === 0 && /connect daemon started\\s*\\(pid\\s*=?\\s*\\d+\\)/i.test(out)) {\n const pid = Number(out.match(/pid\\s*=?\\s*(\\d+)/i)?.[1] || 0)\n return { data: { started: true, pid, responseMode: 'daemon-text' } }\n }\n const summary = out.trim().replace(/\\s+/g, ' ').slice(0, 300)\n die(`dws dev connect daemon 未返回已知成功响应${p.status === null ? '' : ` (exit=${p.status})`}: ${summary}`)\n}\n\n/** 停止已知 connector;命令回包只说明“已受理”,调用方仍须 status 回读。 */\nexport function stopConnectDaemon(\n args: string[],\n { timeout = 30_000 } = {},\n): Record<string, any> {\n if (args[0] !== 'dev' || args[1] !== 'connect' || args[2] !== 'stop') {\n die('stopConnectDaemon 只允许执行 dev connect stop')\n }\n if (!args.includes('--robot-client-id') && !args.includes('--unified-app-id')) {\n die('dev connect stop 必须固定 robot-client-id 或 unified-app-id')\n }\n if (args.includes('--robot-client-secret')) {\n die('dev connect stop 禁止通过命令行传机器人 Secret')\n }\n const p = spawnSync('dws', [...args, '--format', 'json'], {\n encoding: 'utf8', timeout, maxBuffer: 64 * 1024 * 1024,\n })\n if (p.error) die(`dws dev connect stop 执行失败: ${String(p.error)}`)\n const out = p.stdout || p.stderr || ''\n const i = out.indexOf('{')\n if (i >= 0) {\n try {\n const data = JSON.parse(out.slice(i, lastBrace(out) + 1))\n const err = data?.error || {}\n if (err.code || err.message) {\n die(`dws 失败 dev connect stop\\n ${JSON.stringify(err).slice(0, 300)}`)\n }\n if (p.status !== 0) die(`dws dev connect stop 以退出码 ${p.status} 结束`)\n return data\n } catch (error) {\n if (error instanceof Blocked) throw error\n die('dws dev connect stop 返回了无法解析的 JSON')\n }\n }\n if (p.status === 0 && /(connect daemon stopped|connector (?:is )?not running|no connector heartbeat)/i.test(out)) {\n return { data: { stopAccepted: true, responseMode: 'daemon-text' } }\n }\n const summary = out.trim().replace(/\\s+/g, ' ').slice(0, 300)\n die(`dws dev connect stop 未返回已知响应${p.status === null ? '' : ` (exit=${p.status})`}: ${summary}`)\n}\n\nfunction lastBrace(s) {\n // dws 有时在 JSON 后面粘一行 WARN / INFO —— 从最后一个 } 截断\n for (let i = s.length - 1; i >= 0; i--) if (s[i] === '}') return i\n return s.length - 1\n}\n\n// ──────────────── 三个层级,各读各的 ────────────────\nconst inner = (d) => (d && typeof d.data === 'object' && d.data !== null ? d.data : d)\n\n/** 列表类查询的记录。拿不到就 die —— 绝不当成\"表是空的\"。 */\nexport function records(d) {\n const x = inner(d)\n if (!('records' in x)) {\n die(`返回里没有 records(顶层键=${Object.keys(d)}) —— 接口形状可能变了。` +\n `**绝不把它当成【表是空的】。**`)\n }\n if (x.hasMore || x.partial) {\n die('分页未收敛 —— **部分结果不许当完整结果用。** 半张表算出来的是错的。')\n }\n return x.records || []\n}\n\n/** 文档正文。**层级和列表类查询不一样** —— 两种形状都兜住,拿不到就 die。 */\nexport function markdown(d) {\n const md = inner(d).markdown ?? d.markdown\n if (md === undefined || md === null) {\n die(`拿不到文档正文(顶层键=${Object.keys(d)}) —— **绝不当成【这篇是空的】。**`)\n }\n return md\n}\n\n/** 目录节点。 */\nexport const nodes = (d) => inner(d).nodes || []\n\n/**\n * 待办翻页 —— **这是唯一有分页信号的读法。**\n *\n * ⚠️ **不要把页开大**。超过这个大小,分页信号会消失,\n * 你拿到 undefined、当成 false,然后**静默漏掉剩下的**。\n * 心跳的收件靠它 —— 漏了循环件就是「静默收工且不自知」。\n */\nexport function todosPage(status = 'false', page = 1) {\n const d = run(['todo', 'task', 'list', '--status', status, '--size', '20', '--page', String(page)])\n const r = d.result || {}\n if (!('todoCards' in r)) {\n die(`待办返回里没有 todoCards(result 键=${Object.keys(r)}) —— 绝不当成【没有待办】。`)\n }\n return { cards: r.todoCards || [], more: Boolean(r.hasMore) }\n}\n\n/** 把待办【拉全】。只看第一页会漏掉循环件。 */\nexport function todosAll(status = 'false', maxPages = 20) {\n const out: any[] = []\n for (let page = 1; page <= maxPages; page++) {\n const { cards, more } = todosPage(status, page)\n out.push(...cards)\n if (!more) return out\n }\n die(`待办翻页超过 ${maxPages} 页还没收敛 —— 不许把部分结果当完整。`)\n}\n\n// ──────────────── 创建类:报错也可能成功 → 按名回查 ────────────────\n/** 目录列表可能把扩展名单列,比对时要拼回去。 */\nexport function findChild(folder, name) {\n for (const n of nodes(run(['doc', 'list', '--folder', folder, '--page-size', '50']))) {\n const nm = n.name || '', ext = n.extension || ''\n if (nm === name || (ext && `${nm}.${ext}` === name)) return n.nodeId\n }\n return null\n}\n\n/** 建文档。**不看返回信封** —— 一律按名回查定成败。 */\nexport function createDoc(folder, name, file) {\n const exist = findChild(folder, name)\n if (exist) return exist\n run(['doc', 'create', '--name', name, '--folder', folder,\n '--content-file', file, '--content-format', 'markdown', '--yes'],\n { allowFail: true }) // ← **报错也可能其实成功了**\n sleep(1200)\n const nid = findChild(folder, name)\n if (!nid) die(`建不出文档 ${name} —— 别把它当成【建成功了】。`)\n return nid\n}\n\nexport const updateDoc = (node, file) =>\n run(['doc', 'update', '--node', node, '--content-file', file,\n '--content-format', 'markdown', '--mode', 'overwrite', '--yes'])\n\n/** 候选发布只追加唯一 marker;写错误不重试,调用方必须全文回读。 */\nexport const appendDoc = (node: string, file: string, profile = '') =>\n run(['doc', 'update', '--node', node, '--content-file', file,\n '--content-format', 'markdown', '--mode', 'append', ...profileArgs(profile), '--yes'],\n { allowFail: true, retries: 0 })\n\nexport const readDoc = (node, profile = '') => markdown(run([\n 'doc', 'read', '--node', node, ...profileArgs(profile),\n]))\nexport const docInfo = (node, profile = '') => inner(run([\n 'doc', 'info', '--node', node, ...profileArgs(profile),\n]))\n\n// ──────────────── 漂移判定:重排版【不是】漂移 ────────────────\n/**\n * 剥掉 markdown 语法和转义装饰,只留【文字本身】。\n *\n * 钉钉会重排版你推上去的 markdown。**重排版不是漂移。**\n * 用行级 diff 判漂移 → 每次 sync 都误报 →\n * **然后你就会开始无脑 --force,真正的漂移也一起覆盖掉了。**\n */\nexport function words(s) {\n let t = String(s ?? '')\n for (let i = 0; i < 3; i++) t = unescapeHtml(t) // 可能被多次转义\n t = t.replace(/&#(\\d+);/g, (_, n) => String.fromCharCode(+n))\n t = t.replace(/\\[打开\\]\\([^)]*\\)/g, '') // 钉钉自动加的链接装饰\n return t.replace(/[`*_>#|\\\\~\\-\\s]+/g, '')\n}\n\nfunction unescapeHtml(s) {\n return s.replace(/&(amp|lt|gt|quot|#39);/g, (m, e) =>\n ({ amp: '&', lt: '<', gt: '>', quot: '\"', '#39': \"'\" })[e])\n}\n\nexport const same = (a, b) => words(a) === words(b)\n\n// ──────────────── 数字员工的消息原子动作(typed,目标不可自由拼装) ────────────────\nfunction profileArgs(profile) {\n return profile ? ['--profile', profile] : []\n}\n\nfunction assertReplyTarget(target) {\n const missing: string[] = []\n if (!target?.conversationId) missing.push('conversationId')\n if (!target?.messageId) missing.push('messageId')\n if (!target?.senderOpenDingTalkId) missing.push('senderOpenDingTalkId')\n if (missing.length) die(`固定回复目标缺少 ${missing.join(' / ')}`)\n}\n\n/** ack 没有服务端 UUID,因此绝不自动重试。 */\nexport function ackMessage(target, { emoji = '收到', profile = '' } = {}) {\n assertReplyTarget(target)\n return run([\n 'chat', 'message', 'add-emoji',\n '--conversation-id', target.conversationId,\n '--msg-id', target.messageId,\n '--emoji', emoji,\n ...profileArgs(profile),\n ], { retries: 0 })\n}\n\n/** reply/ask 共用同一传输;uuid 在调用前已持久化,重试也必须复用。 */\nexport function replyMessage(\n target,\n text,\n { uuid = '', profile = '' }: { uuid?: string; profile?: string } = {},\n) {\n assertReplyTarget(target)\n if (!String(text || '').trim()) die('回复正文不能为空')\n if (!uuid) die('回复前必须先持久化 uuid 幂等键')\n return run([\n 'chat', 'message', 'reply',\n '--conversation-id', target.conversationId,\n '--ref-msg-id', target.messageId,\n '--ref-sender', target.senderOpenDingTalkId,\n '--text', text,\n '--uuid', uuid,\n '--ai-tag=true',\n ...profileArgs(profile),\n '--yes',\n ], { retries: 1 })\n}\n\nexport function readMessageEmotions(messageId, profile = '') {\n return run([\n 'chat', 'message', 'list-emotion-replies', '--msg-ids', messageId,\n ...profileArgs(profile),\n ], { allowFail: true, retries: 0 })\n}\n\nexport function querySendStatus(openTaskId, profile = '') {\n return run([\n 'chat', 'message', 'query-send-status', '--open-task-id', openTaskId,\n ...profileArgs(profile),\n ], { allowFail: true, retries: 1 })\n}\n\nexport function readMessagesByIds(messageId, profile = '') {\n return run([\n 'chat', 'message', 'list-by-ids', '--msg-ids', messageId,\n ...profileArgs(profile),\n ], { allowFail: true, retries: 1 })\n}\n\n/** 外发前核对 profile 对应的真实执行身份。 */\nexport function getSelf(profile = '') {\n return run([\n 'contact', 'user', 'get-self', ...profileArgs(profile),\n ], { retries: 1 })\n}\n\n// ──────────────── Operational Memory:AI 表格宽表原子能力 ────────────────\nexport function queryAiTableRecords({\n baseId, tableId, filters = null, recordIds = [], profile = '',\n}: {\n baseId: string\n tableId: string\n filters?: Record<string, unknown> | null\n recordIds?: string[]\n profile?: string\n}) {\n const args = [\n 'aitable', 'record', 'query', '--base-id', baseId, '--table-id', tableId,\n ]\n if (recordIds.length) args.push('--record-ids', recordIds.join(','))\n else if (filters) args.push('--filters', JSON.stringify(filters), '--limit', '100')\n args.push(...profileArgs(profile))\n return records(run(args, { retries: 1 }))\n}\n\n/** AI 表格 Base 目录回读;调用方仍需继续核对固定 tableId。 */\nexport function getAiTableBase(baseId: string, profile = ''): Record<string, any> {\n return inner(run([\n 'aitable', 'base', 'get', '--base-id', baseId, ...profileArgs(profile),\n ], { retries: 1 }))\n}\n\n/** AI 表格表结构回读;写入前用它确认固定 tableId 与 fieldId。 */\nexport function getAiTableTables(\n baseId: string,\n tableIds: string[],\n profile = '',\n): Record<string, any> {\n if (!tableIds.length) die('AI 表格结构回读必须固定至少一个 tableId')\n return inner(run([\n 'aitable', 'table', 'get', '--base-id', baseId,\n '--table-ids', tableIds.join(','), ...profileArgs(profile),\n ], { retries: 1 }))\n}\n\n/** 写错误可能实际成功,因此不重试、不直接下结论;调用方必须按 key/recordId 回读。 */\nexport function createAiTableRecord(\n baseId: string,\n tableId: string,\n cells: Record<string, unknown>,\n profile = '',\n): { accepted: boolean; recordIds: string[]; data: unknown } {\n const data = run([\n 'aitable', 'record', 'create', '--base-id', baseId, '--table-id', tableId,\n '--records', JSON.stringify([{ cells }]), ...profileArgs(profile), '--yes',\n ], { allowFail: true, retries: 0 })\n const ids = data ? inner(data).newRecordIds : []\n return {\n accepted: Boolean(data),\n recordIds: Array.isArray(ids) ? ids.map(String).filter(Boolean) : [],\n data,\n }\n}\n\n/** 写错误可能实际成功,因此不重试;调用方必须按 recordId 回读。 */\nexport function updateAiTableRecord(\n baseId: string,\n tableId: string,\n recordId: string,\n cells: Record<string, unknown>,\n profile = '',\n): { accepted: boolean; data: unknown } {\n const data = run([\n 'aitable', 'record', 'update', '--base-id', baseId, '--table-id', tableId,\n '--records', JSON.stringify([{ recordId, cells }]), ...profileArgs(profile), '--yes',\n ], { allowFail: true, retries: 0 })\n return { accepted: Boolean(data), data }\n}\n"]}