@xdxer/dingtalk-agent 0.1.1 → 0.1.4-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +247 -76
- package/dist/bin/dingtalk-agent.js +763 -0
- package/dist/bin/dingtalk-agent.js.map +1 -0
- package/dist/src/actions.js +562 -0
- package/dist/src/actions.js.map +1 -0
- package/dist/src/boot.js +70 -0
- package/dist/src/boot.js.map +1 -0
- package/dist/src/bootstrap.js +144 -0
- package/dist/src/bootstrap.js.map +1 -0
- package/dist/src/config.js +86 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/doctor.js +166 -0
- package/dist/src/doctor.js.map +1 -0
- package/dist/src/driver.js +45 -0
- package/dist/src/driver.js.map +1 -0
- package/{src → dist/src}/duty.js +42 -44
- package/dist/src/duty.js.map +1 -0
- package/dist/src/dws.js +270 -0
- package/dist/src/dws.js.map +1 -0
- package/dist/src/events.js +233 -0
- package/dist/src/events.js.map +1 -0
- package/dist/src/fields.js +132 -0
- package/dist/src/fields.js.map +1 -0
- package/dist/src/init.js +41 -0
- package/dist/src/init.js.map +1 -0
- package/dist/src/kb.js +240 -0
- package/dist/src/kb.js.map +1 -0
- package/dist/src/package-root.js +17 -0
- package/dist/src/package-root.js.map +1 -0
- package/dist/src/runs.js +79 -0
- package/dist/src/runs.js.map +1 -0
- package/dist/src/sessions.js +668 -0
- package/dist/src/sessions.js.map +1 -0
- package/dist/src/setup.js +101 -0
- package/dist/src/setup.js.map +1 -0
- package/dist/src/skill-manager.js +288 -0
- package/dist/src/skill-manager.js.map +1 -0
- package/dist/src/skills.js +200 -0
- package/dist/src/skills.js.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/waits.js +945 -0
- package/dist/src/waits.js.map +1 -0
- package/dist/src/workspace.js +173 -0
- package/dist/src/workspace.js.map +1 -0
- package/docs/ARCHITECTURE.md +217 -0
- package/docs/INSTALLATION.md +135 -0
- package/docs/MINIMAL-WORKSPACE-V1.md +172 -0
- package/docs/OPEN-SOURCE-REFERENCES.md +107 -0
- package/docs/SELF-TEST.md +252 -0
- package/docs/architecture/dingtalk-agent-blueprint.png +0 -0
- package/docs/architecture/dingtalk-agent-blueprint.svg +144 -0
- package/docs/architecture/durable-async-agent-runtime.png +0 -0
- package/docs/architecture/durable-async-agent-runtime.svg +234 -0
- package/docs//345/206/205/347/275/221/345/256/236/347/233/270.md +77 -0
- package/evals/baselines/2026-07-14/behavior-summary.json +28 -0
- package/evals/baselines/2026-07-14/contract-summary.json +18 -0
- package/evals/baselines/2026-07-14/live-canary-summary.json +25 -0
- package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/SKILL.md +72 -0
- package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/action-contract.md +31 -0
- package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/event-to-behavior.md +22 -0
- package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/memory-and-evolution.md +25 -0
- package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/runtime-modes.md +34 -0
- package/evals/baselines/2026-07-15/task-lifecycle-summary.json +50 -0
- package/evals/evals.json +316 -0
- package/evals/fixtures/dm-ambiguous-send.json +4 -0
- package/evals/fixtures/dm-blocked.json +4 -0
- package/evals/fixtures/dm-clear.json +4 -0
- package/evals/fixtures/dm-discussion.json +4 -0
- package/evals/fixtures/dm-doc-write-no-tool.json +4 -0
- package/evals/fixtures/dm-long-task-ack.json +4 -0
- package/evals/fixtures/dm-nonblocking-gap.json +4 -0
- package/evals/fixtures/dm-structured-task.json +4 -0
- package/evals/fixtures/group.json +10 -0
- package/evals/fixtures/mentioned.json +3 -0
- package/evals/run-contract-evals.mjs +1106 -0
- package/evals/run-shadow-evals.mjs +267 -0
- package/evals/runners/README.md +66 -0
- package/evals/runners/claude-shadow.mjs +533 -0
- package/evals/schemas/action-request.schema.json +77 -0
- package/evals/shadow-evals.json +133 -0
- package/package.json +28 -6
- package/skills/AGENTS.md +21 -3
- package/skills/dingtalk-basic-behavior/SKILL.md +86 -0
- package/skills/dingtalk-basic-behavior/assets/task-checkpoint.md +37 -0
- package/skills/dingtalk-basic-behavior/references/action-contract.md +31 -0
- package/skills/dingtalk-basic-behavior/references/event-to-behavior.md +24 -0
- package/skills/dingtalk-basic-behavior/references/memory-and-evolution.md +27 -0
- package/skills/dingtalk-basic-behavior/references/runtime-modes.md +34 -0
- package/skills/dingtalk-basic-behavior/references/task-lifecycle.md +108 -0
- package/skills//345/237/272/347/241/200/350/241/214/344/270/272.md +44 -0
- package/skills//345/277/203/350/267/263.md +11 -0
- package/skills//346/266/210/346/201/257.md +14 -14
- package/skills//350/257/204/346/265/213.md +14 -1
- package/skills//351/222/211/351/222/211.md +3 -2
- package/templates/behaviors/basic.json +68 -0
- package/templates/fields/default/field.json +25 -0
- package/bin/dingtalk-agent.js +0 -289
- package/src/boot.js +0 -65
- package/src/config.js +0 -42
- package/src/dws.js +0 -192
- package/src/init.js +0 -84
- package/src/kb.js +0 -221
- package/src/runs.js +0 -77
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/actions.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,sFAAsF;AAEtF,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAC1E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EACL,kBAAkB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,eAAe,GACpE,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EACL,wBAAwB,EAAE,OAAO,EAAE,uBAAuB,EAC1D,yBAAyB,EAAE,wBAAwB,GACpD,MAAM,YAAY,CAAA;AAEnB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;AAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAA;AACrD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAA;AACzD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,aAAa,EAAE,kBAAkB,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa;IAC7E,gBAAgB;CACjB,CAAC,CAAA;AAEF,MAAM,oBAAqB,SAAQ,KAAK;IACtC,OAAO,CAAqB;IAE5B,YAAY,OAAe,EAAE,OAA4B;QACvD,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAA;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CACF;AAED,MAAM,UAAU,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,GAAG,EAAE;IAC1D,MAAM,MAAM,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,KAAK,CAAA;IACvD,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACzB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YAAE,OAAO,GAAG,CAAA;QACjD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,MAAM,KAAK,GAAG,IAAI,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI;YAAE,MAAK;QACpD,GAAG,GAAG,MAAM,CAAA;IACd,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;AACvE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,EAAE;IACvD,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IACpC,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IAC/D,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IACzC,OAAO;QACL,IAAI,EAAE,+BAA+B;QACrC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE;QACrB,IAAI;QACJ,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK;QAC5B,OAAO,EAAE,SAAS;QAClB,SAAS,EAAE,aAAa,CAAC,IAAI,CAAC;QAC9B,MAAM,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM;QAClD,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE;QACxC,cAAc,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE;QACtD,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE;QACjD,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,IAAI,EAAE;QACtD,OAAO;QACP,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,aAAa;QAC1C,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,KAAK;KAClB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,EAAE;IACvD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC3E,IAAI,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IAClC,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IAC/D,MAAM,QAAQ,GAAG,OAAO,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAA;IACvG,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAA;IAC1D,IAAI,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;IAElD,sDAAsD;IACtD,qEAAqE;IACrE,MAAM,oBAAoB,GAAG,wBAAwB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;IACxF,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QACvD,IAAI,CAAC;YACL,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;YAC9B,iBAAiB,CAAC,OAAO,CAAC,CAAA;YAC1B,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;YAC9B,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAA;YACtD,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;YAC9C,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAA;gBACrC,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBACtC,OAAO,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YACxC,CAAC;YACD,8BAA8B,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;YACjD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;YACzC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;YAClD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;YACpD,IAAI,MAAM,CAAA;YACV,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC3B,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAA;gBAC7B,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;oBACvF,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAA;gBAClD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG;oBACP,OAAO,EAAE,gCAAgC;oBACzC,EAAE,EAAE,QAAQ;oBACZ,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE;oBACrB,IAAI;oBACJ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,SAAS,EAAE,aAAa,CAAC,IAAI,CAAC;oBAC9B,MAAM,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM;oBAClD,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE;oBAC3C,cAAc,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE;oBACtD,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE;oBACjD,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,IAAI,EAAE;oBACtD,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI;oBAC7C,OAAO;oBACP,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,aAAa;iBAC3C,CAAA;gBACD,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC,CAAA;YAC7D,CAAC;YAED,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE;oBACjD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,sBAAsB;iBAC3E,CAAC,CAAA;gBACF,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;gBAC5C,uBAAuB,CACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;gBACvE,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBAChC,OAAO,OAAO,CAAA;YAChB,CAAC;YAED,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;YACpD,MAAM,IAAI,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YAEnF,IAAI,IAAI,KAAK,KAAK,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC9C,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,EAAE,MAAM,EACvC,8CAA8C,CAAC,CAAA;gBACjD,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;gBAC5C,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBAChC,OAAO,OAAO,CAAA;YAChB,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC7B,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE;oBACnD,QAAQ,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBAC9C,CAAC,CAAA;YACJ,CAAC;YAED,IAAI,MAAM,CAAA;YACV,IAAI,OAAO,CAAA;YACX,IAAI,CAAC;gBACH,MAAM,mBAAmB,GAAG,IAAI,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAA;gBACrE,IAAI,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;oBACpC,6CAA6C;oBAC7C,MAAM,GAAG,QAAQ,CAAC,mBAAmB,CAAC,CAAA;gBACxC,CAAC;qBAAM,CAAC;oBACN,MAAM,GAAG,IAAI,KAAK,KAAK;wBACrB,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE;4BAC/B,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU;yBACjD,CAAC;wBACF,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE;4BAC/C,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU;yBAC9C,CAAC,CAAA;oBACJ,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,CAAC,CAAA;gBACvE,CAAC;gBACD,IAAI,IAAI,KAAK,KAAK;oBAAE,yBAAyB,CAC3C,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;gBACxD,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;gBACjE,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC/B,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;gBACzE,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAA;gBAClE,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;gBAC5C,IAAI,IAAI,KAAK,KAAK;oBAAE,wBAAwB,CAC1C,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;gBACzD,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBAChC,MAAM,IAAI,oBAAoB,CAC5B,yBAAyB,QAAQ,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,EACtD,OAAO,CACR,CAAA;YACH,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAA;YAC3D,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA,CAAC,QAAQ;YACrD,IAAI,IAAI,KAAK,KAAK;gBAAE,wBAAwB,CAC1C,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;YACzD,IAAI,IAAI,KAAK,OAAO;gBAAE,uBAAuB,CAC3C,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YACvE,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA,CAAa,qBAAqB;YAClE,OAAO,OAAO,CAAA;QACd,CAAC;gBAAS,CAAC;YACT,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;YAAS,CAAC;QACT,oBAAoB,EAAE,CAAA;IACxB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,OAAO;IAC1B,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;IACpD,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,CAAA;IAC5D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ;QAC/B,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC/B,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAA;IAClC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IAC1E,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC7B,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,cAAc,IAAI,6BAA6B,CAAC,CAAA;IAC7F,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IACvE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;IACpF,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAA;IACjC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO;QAClC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,CAAC,aAAa,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;IAC7C,CAAC;IACD,IAAI,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,aAAa;QAC7C,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,KAAK,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC;QAC7E,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;IACjD,CAAC;IAED,IAAI,eAAe,CAAC,UAAU,CAAC,KAAK,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACnE,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IAC5D,CAAC;IACD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,MAAM,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAA;IACtF,IAAI,eAAe,CAAC,gBAAgB,CAAC,KAAK,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;IACvH,MAAM,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,sBAAsB,CAAC,CAAC,CAAA;IACxF,IAAI,eAAe,CAAC,gBAAgB,CAAC,KAAK,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;IACrH,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAA;IAC9E,IAAI,eAAe,CAAC,eAAe,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACtH,IAAI,eAAe,CAAC,eAAe,CAAC,SAAS,IAAI,EAAE,CAAC,KAAK,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,IAAI,EAAE,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IACxI,MAAM,kBAAkB,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC,CAAA;IACpF,IAAI,kBAAkB,CAAC,IAAI,KAAK,KAAK,CAAC,SAAS,CAAC,YAAY;QAAE,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IACzF,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,CAAA;IACnE,IAAI,MAAM,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACpG,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAA;QAChF,IAAI,eAAe,CAAC,gBAAgB,CAAC,KAAK,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAClF,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC;IACD,IAAI,CAAC;QAAC,mBAAmB,CAAC,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;IAAC,CAAC;IAC7E,OAAO,CAAC,EAAE,CAAC;QAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,OAAO,GAAG,CAAC,CAAA;IAAC,CAAC;IACxD,IAAI,KAAK,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAE9E,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAA;IACjE,MAAM,iBAAiB,GAAG,eAAe,CAAC,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;IAC7E,MAAM,aAAa,GAAG,eAAe,CACnC,KAAK,CAAC,SAAS,CAAC,iBAAiB,IAAI,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAA;IACtF,IAAI,iBAAiB,KAAK,aAAa,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CACb,8BAA8B,aAAa,aAAa,iBAAiB,GAAG;YAC5E,kCAAkC,CAAC,CAAA;IACvC,CAAC;IAED,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;IACjE,SAAS,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACjD,OAAO;QACL,GAAG,EAAE,KAAK,CAAC,OAAO;QAClB,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,IAAI,EAAE,EAAE;QACrF,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM;QAC9B,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW;QACnC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,KAAK;QACL,SAAS;QACT,iBAAiB;QACjB,OAAO,EAAE,aAAa;QACtB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,KAAK,EAAE,eAAe;QACtB,IAAI;KACL,CAAA;AACH,CAAC;AAED,SAAS,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,GAAG,EAAE;IACzD,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACtD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO;QAC5B,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS;QAChC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE;QAC3B,QAAQ;QACR,YAAY;QACZ,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,GAAG,EAAE;IACrE,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAA;IAC3D,OAAO,wBAAwB,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;AACzF,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAO,EAAE,OAAO;IAC5C,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;QACnF,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACnE,OAAO,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,CAAA;IAC1F,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC;QACxD,OAAO,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;QACpC,OAAO,uBAAuB,CAC5B,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACzE,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM;IAC7C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC3E,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IAC1C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,CAAA;QAC1D,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,GAAG,eAAe,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QAC5E,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,CAAA;IACnB,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IAC9C,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,0BAA0B,CAAC,CAAA;IAC7D,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,IAAI,IAAI,CAAC,CAAA;IAC5D,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,MAAM,2BAA2B,GAAG,EAAE,CAAC,CAAA;IACzF,OAAO,EAAE,IAAI,EAAE,CAAA;AACjB,CAAC;AAED,SAAS,QAAQ,CAAC,OAAO,EAAE,IAAI;IAC7B,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IACvC,IAAI,CAAC,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,SAAS,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACpG,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,cAAc,IAAI,CAAC,MAAM,EAAE,SAAS,IAAI,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAAE,CAAC;QAC1G,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;IACxC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,IAAI,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,KAAK,gBAAgB,EAAE,CAAC;YAC7D,MAAM,IAAI,KAAK,CAAC,eAAe,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,IAAI,SAAS,iBAAiB,CAAC,CAAA;QACnG,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAA;QAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAA;QACvD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;QAC1E,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;QAClF,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAC/E,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;IACxE,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,UAAU,IAAI,EAAE,CAAC,CAAA;IACjE,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,IAAI,EAAE,CAAA;IACrC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAA;IAClC,IAAI,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;IACxC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,uBAAuB,IAAI,CAAC,CAAC,EAAE,CAAC;QACpG,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAA;IACnC,CAAC;IACD,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,yBAAyB,IAAI,CAAC,CAAC,EAAE,CAAC;QACxG,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAA;IAClC,CAAC;IACD,OAAO,UAAU,CAAA;AACnB,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU;IAC1D,0DAA0D;IAC1D,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IAC7E,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC1E,IAAI,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,CAAC,cAAc,YAAY,MAAM,EAAE,CAAC,CAAA;IACnF,CAAC;IACD,MAAM,QAAQ,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,CAAA;IACnG,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAA;IAC/D,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,SAAS,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;IAC3C,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,GAAG,CAAC,mBAAmB,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAC/D,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,KAAK;YACtD,YAAY,EAAE,8CAA8C,EAAE,IAAI,EAAE,CAAA;IACxE,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,CAAA;IAChE,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,IAAI,GAAG,GAAG,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACjD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,eAAe,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAA;QACjF,OAAO,MAAM;YACX,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,mBAAmB,EAAE,IAAI,EAAE;YACnF,CAAC,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,KAAK;gBACjD,YAAY,EAAE,sCAAsC,EAAE,IAAI,EAAE,CAAA;IAClE,CAAC;IACD,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,eAAe,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAA;IACtF,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,IAAI,GAAG,GAAG,CAAC,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QACtD,MAAM,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;QACrE,OAAO,IAAI;YACT,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,kBAAkB,EAAE,IAAI,EAAE;YAClF,CAAC,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,KAAK;gBACjD,YAAY,EAAE,uBAAuB,EAAE,IAAI,EAAE,CAAA;IACnD,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,KAAK;QACtD,YAAY,EAAE,kCAAkC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AACpE,CAAC;AAED,SAAS,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO;IACjD,OAAO;QACL,OAAO,EAAE,iCAAiC;QAC1C,QAAQ,EAAE,MAAM,CAAC,EAAE;QACnB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK;QAC5B,OAAO,EAAE,SAAS;QAClB,GAAG,OAAO;KACX,CAAA;AACH,CAAC;AAED,SAAS,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM;IACxC,OAAO,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,sBAAsB,EAAE;QACrD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM;KAC5D,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,OAAO,EAAE,OAAO;IACrC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAChC,OAAO,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;AACxC,CAAC;AAED,SAAS,cAAc,CAAC,OAAO,EAAE,OAAO;IACtC,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACrD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QAC1C,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,MAAM,CAAC,aAAa,EAAE,CAAC;YACvE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;QACpD,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;QAC9B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAA;QACvD,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,CAAA;YACtD,OAAO,CAAC,KAAK,GAAG,MAAM,CAAA;YACtB,OAAO,CAAC,GAAG,GAAG,OAAO,CAAA;YACrB,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,sDAAsD;QACtD,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,EAAE,gBAAgB,EAAE,CAAC,GAAG,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAA;YAC7E,MAAM,OAAO,GAAG,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAA;YACjF,eAAe,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YAC3C,OAAO,CAAC,KAAK,GAAG,OAAO,CAAA;YACvB,OAAO,CAAC,GAAG,GAAG,IAAI,CAAA;YAClB,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,CAAA;YACnD,OAAO,IAAI,CAAA;QACb,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,CAAC,KAAK,aAAa,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;QAC5G,CAAC;QACD,MAAM,IAAI,GAAG;YACX,GAAG,OAAO;YACV,SAAS,EAAE,OAAO,CAAC,WAAW;YAC9B,KAAK,EAAE,OAAO,CAAC,OAAO;YACtB,gBAAgB,EAAE,CAAC,GAAG,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC;SACjD,CAAA;QACD,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;QACxB,IAAI,OAAO,CAAC,OAAO,KAAK,sBAAsB;YAAE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAA;aAClE,IAAI,OAAO,CAAC,OAAO,KAAK,eAAe;YAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,0BAA0B,CAAA;aACtH,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,WAAW,CAAA;aAC5D,IAAI,OAAO,CAAC,OAAO,KAAK,WAAW;YAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,sBAAsB,CAAA;;YAC1G,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAA;QAC3B,MAAM,OAAO,GAAG,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAA;QACjF,eAAe,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAC3C,OAAO,CAAC,KAAK,GAAG,OAAO,CAAA;QACvB,OAAO,CAAC,GAAG,GAAG,IAAI,CAAA;QAClB,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,CAAA;QACnD,OAAO,IAAI,CAAA;IACb,CAAC;YAAS,CAAC;QACT,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,2DAA2D;AAC3D,SAAS,iBAAiB,CAAC,OAAO;IAChC,MAAM,QAAQ,GAA+B,EAAE,CAAA;IAC/C,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACpF,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,SAAQ;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC,CAAA;QACxE,IAAI,UAAU,CAAC,IAAI,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;IACrD,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;IACnF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACtC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAClC,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,SAAS,8BAA8B,CAAC,OAAO,EAAE,eAAe;IAC9D,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACpF,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe;YAAE,SAAQ;QACpE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QACxD,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YACtF,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,CAAC,IAAI,yBAAyB,CAAC,CAAA;QAC1E,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI;IACrB,GAAG,CAAC,YAAY,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;QAChF,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAA;IAC/B,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAA;IACxB,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,CAAA;IACjD,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAA;AACrD,CAAC;AAED,SAAS,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK;IACvD,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,CAAA;IAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAA;IACxE,IAAI,CAAC;QACH,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACzC,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,CAAA;IAC/C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;IACzE,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO;IAClD,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,CAAA;IAC7D,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC,CAAA;AACpF,CAAC;AAED,SAAS,UAAU,CAAC,IAAI,EAAE,KAAK;IAC7B,IAAI,CAAC;QAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IAAC,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;IAAC,CAAC;AACvF,CAAC;AAED,SAAS,aAAa,CAAC,IAAI;IACzB,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,4BAA4B,CAAA;IACvD,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,wBAAwB,CAAA;IACvE,OAAO,eAAe,CAAA;AACxB,CAAC;AAED,SAAS,SAAS,CAAC,KAAK,EAAE,IAAI;IAC5B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAA;IAClD,KAAK,MAAM,GAAG,IAAI,IAAI;QAAE,IAAI,KAAK,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAA;IACzD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACpC,IAAI,KAAK;YAAE,OAAO,KAAK,CAAA;IACzB,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC;AAED,SAAS,eAAe,CAAC,KAAK,EAAE,KAAK;IACnC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAA;IAC5B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,0BAA0B,CAAC,CAAA;IACtF,OAAO,CAAC,CAAA;AACV,CAAC","sourcesContent":["// Basic Behavior 的四个原子动作(TypeScript source)。\n// Sandbox 中的 context/ 是可读投影;真正的 target/profile/policy/state 来自 sandbox 外 event index。\n\nimport { existsSync, mkdirSync, realpathSync, readdirSync } from 'node:fs'\nimport { dirname, join, resolve, parse, basename } from 'node:path'\nimport { randomUUID } from 'node:crypto'\nimport { digest, stableStringify } from './events.js'\nimport {\n acquireControlLock, acquireExecutionLock, readJson, writeJsonAtomic,\n} from './sessions.js'\nimport * as cfgmod from './config.js'\nimport * as dws from './dws.js'\nimport { verifySkillSnapshot } from './skills.js'\nimport {\n acquireSessionEffectLock, armWait, completeWaitFromReceipt,\n markWaitTransportAccepted, reconcileWaitFromReceipt,\n} from './waits.js'\n\nconst OUTWARD = new Set(['ack', 'reply', 'ask'])\nconst TERMINAL = new Set(['reply', 'ask', 'silence'])\nconst KINDS = new Set(['ack', 'reply', 'ask', 'silence'])\nconst SILENCE_REASONS = new Set([\n 'unmentioned', 'already_answered', 'no_value', 'policy_denied', 'unsupported',\n 'heartbeat_noop',\n])\n\nclass ActionUncertainError extends Error {\n receipt: Record<string, any>\n\n constructor(message: string, receipt: Record<string, any>) {\n super(message)\n this.name = 'ActionUncertainError'\n this.receipt = receipt\n }\n}\n\nexport function findRun(start = process.cwd(), explicit = '') {\n const picked = explicit || process.env.DTA_RUN || start\n let dir = resolve(picked)\n while (true) {\n if (existsSync(join(dir, 'run.json'))) return dir\n const parent = dirname(dir)\n if (parent === dir || dir === parse(dir).root) break\n dir = parent\n }\n throw new Error('找不到当前 Run;请在 prepare 返回的 cwd 中执行,或设置 DTA_RUN/--run')\n}\n\nexport function previewAction(runPath, kind, options = {}) {\n const context = loadContext(runPath)\n const payload = normalizePayload(kind, options, context.policy)\n const nextState = validate(context, kind)\n return {\n type: 'dingtalk-agent.action.preview',\n runId: context.run.id,\n kind,\n fromState: context.run.state,\n toState: nextState,\n transport: transportName(kind),\n target: kind === 'silence' ? null : context.target,\n profile: context.field.dws.profile || '',\n expectedUserId: context.field.dws.expectedUserId || '',\n transportMode: context.field.transport.mode || '',\n egressOwner: context.field.transport.egressOwner || '',\n payload,\n authorityHash: context.index.authorityHash,\n persisted: false,\n sideEffect: false,\n }\n}\n\nexport function executeAction(runPath, kind, options = {}) {\n if (!KINDS.has(kind)) throw new Error(`原子动作只能是: ${[...KINDS].join(' / ')}`)\n let context = loadContext(runPath)\n const payload = normalizePayload(kind, options, context.policy)\n const actionId = `act_${digest(`${context.run.id}\\0${kind}\\0${JSON.stringify(payload)}`).slice(0, 20)}`\n let actionPath = join(context.controlActionRoot, actionId)\n let receiptPath = join(actionPath, 'receipt.json')\n\n // Session effect lock 把 cancel 与外部副作用线性化;先拿到锁的一方定义先后。\n // event execution lock 仍负责同一个 Run 的 Action 幂等,control lock 只做短时 RMW。\n const releaseSessionEffect = acquireSessionEffectLock(context.root, context.sessionPath)\n try {\n const release = acquireExecutionLock(context.indexPath)\n try {\n context = loadContext(runPath)\n reconcileReceipts(context)\n context = loadContext(runPath)\n actionPath = join(context.controlActionRoot, actionId)\n receiptPath = join(actionPath, 'receipt.json')\n if (existsSync(receiptPath)) {\n const receipt = readJson(receiptPath)\n reconcileReceiptWait(context, receipt)\n return replayReceipt(context, receipt)\n }\n assertNoOtherUnresolvedAttempt(context, actionId)\n const nextState = validate(context, kind)\n mkdirSync(actionPath, { recursive: true })\n const intentPath = join(actionPath, 'intent.json')\n const attemptPath = join(actionPath, 'attempt.json')\n let intent\n if (existsSync(intentPath)) {\n intent = readJson(intentPath)\n if (intent.kind !== kind || JSON.stringify(intent.payload) !== JSON.stringify(payload)) {\n throw new Error(`Action intent 碰撞: ${actionId}`)\n }\n } else {\n intent = {\n $schema: 'dingtalk-agent/action-intent@1',\n id: actionId,\n runId: context.run.id,\n kind,\n createdAt: new Date().toISOString(),\n transport: transportName(kind),\n target: kind === 'silence' ? null : context.target,\n dwsProfile: context.field.dws.profile || '',\n expectedUserId: context.field.dws.expectedUserId || '',\n transportMode: context.field.transport.mode || '',\n egressOwner: context.field.transport.egressOwner || '',\n uuid: OUTWARD.has(kind) ? randomUUID() : null,\n payload,\n authorityHash: context.index.authorityHash,\n }\n persistArtifact(context, actionPath, 'intent.json', intent)\n }\n\n if (kind === 'silence') {\n const receipt = finish(context, intent, nextState, {\n outcome: 'confirmed', verified: true, verification: 'local-no-side-effect',\n })\n persistReceipt(context, actionPath, receipt)\n completeWaitFromReceipt(\n context.root, cfgmod.must(context.root), context.run.resume, receipt)\n projectReceipt(context, receipt)\n return receipt\n }\n\n verifyExecutionIdentity(context, intent, actionPath)\n const wait = kind === 'ask' ? ensureAskWait(context, actionId, payload.text) : null\n\n if (kind === 'ack' && existsSync(attemptPath)) {\n const receipt = uncertain(context, intent,\n 'ack 已有 attempt 但没有 receipt;表情动作无服务端幂等键,拒绝盲重试')\n persistReceipt(context, actionPath, receipt)\n projectReceipt(context, receipt)\n return receipt\n }\n if (!existsSync(attemptPath)) {\n persistArtifact(context, actionPath, 'attempt.json', {\n actionId, startedAt: new Date().toISOString(),\n })\n }\n\n let result\n let checked\n try {\n const transportResultPath = join(actionPath, 'transport-result.json')\n if (existsSync(transportResultPath)) {\n // DWS 已返回且结果已落盘时,从本地继续验证;绝不为了补 Receipt 再发一次。\n result = readJson(transportResultPath)\n } else {\n result = kind === 'ack'\n ? dws.ackMessage(context.target, {\n emoji: payload.emoji, profile: intent.dwsProfile,\n })\n : dws.replyMessage(context.target, payload.text, {\n uuid: intent.uuid, profile: intent.dwsProfile,\n })\n persistArtifact(context, actionPath, 'transport-result.json', result)\n }\n if (kind === 'ask') markWaitTransportAccepted(\n context.root, cfgmod.must(context.root), wait, result)\n checked = verify(kind, context.target, result, intent.dwsProfile)\n if (checked.data !== undefined) {\n persistArtifact(context, actionPath, 'verification.json', checked.data)\n }\n } catch (e) {\n const receipt = uncertain(context, intent, String(e.message || e))\n persistReceipt(context, actionPath, receipt)\n if (kind === 'ask') reconcileWaitFromReceipt(\n context.root, cfgmod.must(context.root), wait, receipt)\n projectReceipt(context, receipt)\n throw new ActionUncertainError(\n `动作结果不确定,禁止自动重发;action=${actionId}: ${e.message || e}`,\n receipt,\n )\n }\n\n const receipt = finish(context, intent, nextState, checked)\n persistReceipt(context, actionPath, receipt) // 事实先落盘\n if (kind === 'ask') reconcileWaitFromReceipt(\n context.root, cfgmod.must(context.root), wait, receipt)\n if (kind === 'reply') completeWaitFromReceipt(\n context.root, cfgmod.must(context.root), context.run.resume, receipt)\n projectReceipt(context, receipt) // 再更新 control/run 投影\n return receipt\n } finally {\n release()\n }\n } finally {\n releaseSessionEffect()\n }\n}\n\n/**\n * 权威数据只从 event index 读取。Run 目录里的静态上下文发生漂移时 fail closed;\n * 动态 run.json 只是可修复投影,不能反过来阻塞已落盘的 Receipt。\n * 这也让 --run /任意伪造目录 无法获得 DWS 外发能力。\n */\nfunction loadContext(runPath) {\n const actualRunPath = realpathSync(resolve(runPath))\n const projection = readJson(join(actualRunPath, 'run.json'))\n const root = process.env.DTA_ROOT\n ? resolve(process.env.DTA_ROOT)\n : cfgmod.findRoot(actualRunPath)\n if (!root) throw new Error('找不到 control store;act 必须由能访问 DTA_ROOT 的宿主侧执行')\n const cfg = cfgmod.must(root)\n const indexRoot = resolve(root, cfg.runtime?.eventIndexRoot || '.dingtalk-agent/event-index')\n const indexPath = join(indexRoot, `${digest(projection.eventId)}.json`)\n if (!existsSync(indexPath)) throw new Error('当前 Run 不在 event index 中;拒绝任意/伪造 --run')\n const index = readJson(indexPath)\n if (!index.authority || !index.control ||\n digest(stableStringify(index.authority)) !== index.authorityHash) {\n throw new Error('event index 的权威快照损坏,禁止执行')\n }\n if (realpathSync(index.runPath) !== actualRunPath ||\n index.runId !== index.control.id || index.eventId !== projection.eventId) {\n throw new Error('Run 与 event index 身份不一致,拒绝执行')\n }\n\n if (stableStringify(projection) !== stableStringify(index.control)) {\n mirrorJson(join(actualRunPath, 'run.json'), index.control)\n }\n const drift: string[] = []\n const targetProjection = readJson(join(actualRunPath, 'context', 'reply-target.json'))\n if (stableStringify(targetProjection) !== stableStringify(index.authority.replyTarget)) drift.push('reply-target.json')\n const policyProjection = readJson(join(actualRunPath, 'policy', 'allowed-actions.json'))\n if (stableStringify(policyProjection) !== stableStringify(index.authority.policy)) drift.push('allowed-actions.json')\n const fieldProjection = readJson(join(actualRunPath, 'context', 'field.json'))\n if (stableStringify(fieldProjection.dws || {}) !== stableStringify(index.authority.dws || {})) drift.push('field.dws')\n if (stableStringify(fieldProjection.transport || {}) !== stableStringify(index.authority.transport || {})) drift.push('field.transport')\n const behaviorProjection = readJson(join(actualRunPath, 'context', 'behavior.json'))\n if (behaviorProjection.hash !== index.authority.behaviorHash) drift.push('behavior.json')\n const eventProjection = readJson(join(actualRunPath, 'event.json'))\n if (digest(stableStringify(eventProjection)) !== index.authority.eventHash) drift.push('event.json')\n if (index.authority.resume) {\n const resumeProjection = readJson(join(actualRunPath, 'context', 'resume.json'))\n if (stableStringify(resumeProjection) !== stableStringify(index.authority.resume)) {\n drift.push('resume.json')\n }\n }\n try { verifySkillSnapshot(actualRunPath, index.authority.skillManifestHash) }\n catch (e) { drift.push(`skill-snapshot(${e.message})`) }\n if (drift.length) throw new Error(`Sandbox 权威投影被修改: ${drift.join(', ')};禁止执行`)\n\n const session = readJson(join(index.sessionPath, 'session.json'))\n const currentGeneration = validGeneration(session.generation, 'session.json')\n const runGeneration = validGeneration(\n index.authority.sessionGeneration ?? index.control.sessionGeneration, 'event index')\n if (currentGeneration !== runGeneration) {\n throw new Error(\n `Session generation 已失效:run=${runGeneration}, current=${currentGeneration};` +\n '该事项已被 /stop 或 /cancel 取消,禁止继续副作用')\n }\n\n const controlActionRoot = join(indexRoot, 'actions', index.runId)\n mkdirSync(controlActionRoot, { recursive: true })\n return {\n run: index.control,\n field: { dws: index.authority.dws || {}, transport: index.authority.transport || {} },\n policy: index.authority.policy,\n target: index.authority.replyTarget,\n authority: index.authority,\n index,\n indexPath,\n controlActionRoot,\n runPath: actualRunPath,\n sessionPath: index.sessionPath,\n event: eventProjection,\n root,\n }\n}\n\nfunction ensureAskWait(context, actionId, questionText = '') {\n return armWait(context.root, cfgmod.must(context.root), {\n fieldId: context.run.fieldId,\n sessionId: context.run.sessionId,\n sessionPath: context.sessionPath,\n sourceRunId: context.run.id,\n actionId,\n questionText,\n event: context.event,\n target: context.target,\n })\n}\n\nfunction reconcileAskWait(context, actionId, receipt, questionText = '') {\n const wait = ensureAskWait(context, actionId, questionText)\n return reconcileWaitFromReceipt(context.root, cfgmod.must(context.root), wait, receipt)\n}\n\nfunction reconcileReceiptWait(context, receipt) {\n if (receipt.kind === 'ask') {\n const intentPath = join(context.controlActionRoot, receipt.actionId, 'intent.json')\n const intent = existsSync(intentPath) ? readJson(intentPath) : null\n return reconcileAskWait(context, receipt.actionId, receipt, intent?.payload?.text || '')\n }\n if ((receipt.kind === 'reply' || receipt.kind === 'silence') &&\n receipt.outcome !== 'uncertain') {\n return completeWaitFromReceipt(\n context.root, cfgmod.must(context.root), context.run.resume, receipt)\n }\n return null\n}\n\nfunction normalizePayload(kind, options, policy) {\n if (!KINDS.has(kind)) throw new Error(`原子动作只能是: ${[...KINDS].join(' / ')}`)\n if (kind === 'ack') return { emoji: '收到' }\n if (kind === 'silence') {\n const reason = String(options.reason || 'no_value').trim()\n if (!SILENCE_REASONS.has(reason)) {\n throw new Error(`silence reason 必须是: ${[...SILENCE_REASONS].join(' / ')}`)\n }\n return { reason }\n }\n const text = String(options.text || '').trim()\n if (!text) throw new Error(`${kind} 需要 --text 或 --text-file`)\n const max = Number(policy.limits?.maxTextCharacters || 4000)\n if (text.length > max) throw new Error(`正文 ${text.length} 字,超过 Basic Behavior 上限 ${max}`)\n return { text }\n}\n\nfunction validate(context, kind) {\n const { run, policy, target } = context\n if (!(policy.allowedActions || []).includes(kind)) {\n throw new Error(`事件 ${run.eventKind} 不允许 ${kind};允许: ${(policy.allowedActions || []).join(', ')}`)\n }\n if (OUTWARD.has(kind) && (!target?.conversationId || !target?.messageId || !target?.senderOpenDingTalkId)) {\n throw new Error('Run 没有完整固定回复目标,禁止外发')\n }\n if (OUTWARD.has(kind)) {\n if (context.field.transport.egressOwner !== 'dingtalk-agent') {\n throw new Error(`Field 的出口属于 ${context.field.transport.egressOwner || 'unknown'},禁止 act 外发以避免双发`)\n }\n const profile = context.field.dws.profile || ''\n const expected = context.field.dws.expectedUserId || ''\n if (!profile) throw new Error('Workspace 没有固定 dws.profile,禁止依赖“当前登录身份”外发')\n if (profile.includes(',')) throw new Error('一个 Run 只能固定一个 dws.profile,禁止多组织广播式执行')\n if (!expected) throw new Error('Workspace 没有 expectedUserId,无法核对 DWS 实际执行身份')\n }\n const transition = policy.stateMachine?.transitions?.[run.state]?.[kind]\n if (!transition) throw new Error(`状态 ${run.state} 不接受动作 ${kind}`)\n const counts = run.actionCounts || {}\n const limits = policy.limits || {}\n if (kind === 'ack' && Number(counts.ack || 0) >= Number(limits.maxAckPerRun || 1)) {\n throw new Error('本 Run 已 ack,禁止重复刷表情')\n }\n if (OUTWARD.has(kind) && Number(counts.outward || 0) >= Number(limits.maxOutwardActionsPerRun || 2)) {\n throw new Error('本 Run 的外发预算已用完')\n }\n if (TERMINAL.has(kind) && Number(counts.terminal || 0) >= Number(limits.maxTerminalMessagesPerRun || 1)) {\n throw new Error('本 Run 已产生终态动作')\n }\n return transition\n}\n\nfunction verifyExecutionIdentity(context, intent, actionPath) {\n // profile 同名重新登录会换掉真实凭据身份;因此每个外发 Action 都现查,不跨 Action 缓存。\n const data = dws.getSelf(intent.dwsProfile)\n const userId = String(findValue(data, ['userId', 'user_id', 'userid']) || '')\n if (!userId) throw new Error('dws contact user get-self 没有返回 userId,禁止外发')\n if (userId !== String(intent.expectedUserId)) {\n throw new Error(`DWS 执行身份不符:expected=${intent.expectedUserId}, actual=${userId}`)\n }\n const verified = { profile: intent.dwsProfile, userId, verifiedAt: new Date().toISOString(), data }\n persistArtifact(context, actionPath, 'identity.json', verified)\n return verified\n}\n\nfunction verify(kind, target, result, profile) {\n if (kind === 'ack') {\n const data = dws.readMessageEmotions(target.messageId, profile)\n return { outcome: 'accepted-unverified', verified: false,\n verification: 'reaction-readback-cannot-prove-current-actor', data }\n }\n const taskId = findValue(result, ['openTaskId', 'open_task_id'])\n if (taskId) {\n const data = dws.querySendStatus(taskId, profile)\n const sentId = findValue(data, ['openMessageId', 'openMsgId', 'open_message_id'])\n return sentId\n ? { outcome: 'confirmed', verified: true, verification: 'query-send-status', data }\n : { outcome: 'accepted-unverified', verified: false,\n verification: 'query-send-status-without-message-id', data }\n }\n const messageId = findValue(result, ['openMessageId', 'openMsgId', 'open_message_id'])\n if (messageId) {\n const data = dws.readMessagesByIds(messageId, profile)\n const seen = data && JSON.stringify(data).includes(String(messageId))\n return seen\n ? { outcome: 'confirmed', verified: true, verification: 'message-readback', data }\n : { outcome: 'accepted-unverified', verified: false,\n verification: 'message-readback-miss', data }\n }\n return { outcome: 'accepted-unverified', verified: false,\n verification: 'reply-result-has-no-queryable-id', data: result }\n}\n\nfunction finish(context, intent, nextState, checked) {\n return {\n $schema: 'dingtalk-agent/action-receipt@1',\n actionId: intent.id,\n runId: intent.runId,\n kind: intent.kind,\n completedAt: new Date().toISOString(),\n fromState: context.run.state,\n toState: nextState,\n ...checked,\n }\n}\n\nfunction uncertain(context, intent, reason) {\n return finish(context, intent, 'needs-reconciliation', {\n outcome: 'uncertain', verified: false, verification: reason,\n })\n}\n\nfunction replayReceipt(context, receipt) {\n projectReceipt(context, receipt)\n return { ...receipt, duplicate: true }\n}\n\nfunction projectReceipt(context, receipt) {\n const release = acquireControlLock(context.indexPath)\n try {\n const latest = readJson(context.indexPath)\n if (digest(stableStringify(latest.authority)) !== latest.authorityHash) {\n throw new Error('投影 Receipt 时 authority hash 不一致')\n }\n const current = latest.control\n const applied = new Set(current.appliedActionIds || [])\n if (applied.has(receipt.actionId)) {\n mirrorJson(join(context.runPath, 'run.json'), current)\n context.index = latest\n context.run = current\n return current\n }\n // 兼容旧 control:若计数已表明该 kind 投影过,只回填 actionId,不重复计数/转移。\n if (Number(current.actionCounts?.[receipt.kind] || 0) > 0) {\n const next = { ...current, appliedActionIds: [...applied, receipt.actionId] }\n const updated = { ...latest, control: next, updatedAt: new Date().toISOString() }\n writeJsonAtomic(context.indexPath, updated)\n context.index = updated\n context.run = next\n mirrorJson(join(context.runPath, 'run.json'), next)\n return next\n }\n if (current.state !== receipt.fromState) {\n throw new Error(`Receipt 状态冲突: control=${current.state}, receipt=${receipt.fromState}→${receipt.toState}`)\n }\n const next = {\n ...current,\n updatedAt: receipt.completedAt,\n state: receipt.toState,\n appliedActionIds: [...applied, receipt.actionId],\n }\n bump(next, receipt.kind)\n if (receipt.toState === 'needs-reconciliation') next.status = 'blocked'\n else if (receipt.toState === 'waiting-input') next.status = receipt.verified ? 'waiting-input' : 'waiting-input-unverified'\n else if (receipt.toState === 'ignored') next.status = 'completed'\n else if (receipt.toState === 'completed') next.status = receipt.verified ? 'completed' : 'completed-unverified'\n else next.status = 'active'\n const updated = { ...latest, control: next, updatedAt: new Date().toISOString() }\n writeJsonAtomic(context.indexPath, updated)\n context.index = updated\n context.run = next\n mirrorJson(join(context.runPath, 'run.json'), next)\n return next\n } finally {\n release()\n }\n}\n\n/** 已有 Receipt 是真值;新动作前先把“Receipt 已落盘、control 未更新”的窗口收敛。 */\nfunction reconcileReceipts(context) {\n const receipts: Array<Record<string, any>> = []\n for (const entry of readdirSync(context.controlActionRoot, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue\n const path = join(context.controlActionRoot, entry.name, 'receipt.json')\n if (existsSync(path)) receipts.push(readJson(path))\n }\n receipts.sort((a, b) => String(a.completedAt).localeCompare(String(b.completedAt)))\n for (const receipt of receipts) {\n reconcileReceiptWait(context, receipt)\n projectReceipt(context, receipt)\n }\n}\n\n/** 旧 Action 可能已命中 DWS 但尚无 Receipt;此时换文本会生成新 actionId,必须 fail closed。 */\nfunction assertNoOtherUnresolvedAttempt(context, currentActionId) {\n for (const entry of readdirSync(context.controlActionRoot, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name === currentActionId) continue\n const path = join(context.controlActionRoot, entry.name)\n if (existsSync(join(path, 'attempt.json')) && !existsSync(join(path, 'receipt.json'))) {\n throw new Error(`Run 存在未对账 Action ${entry.name};禁止更换正文再外发,请先 reconcile`)\n }\n }\n}\n\nfunction bump(run, kind) {\n run.actionCounts = { ack: 0, reply: 0, ask: 0, silence: 0, outward: 0, terminal: 0,\n ...(run.actionCounts || {}) }\n run.actionCounts[kind]++\n if (OUTWARD.has(kind)) run.actionCounts.outward++\n if (TERMINAL.has(kind)) run.actionCounts.terminal++\n}\n\nfunction persistArtifact(context, actionPath, name, value) {\n writeJsonAtomic(join(actionPath, name), value)\n const mirrorDir = join(context.runPath, 'actions', basename(actionPath))\n try {\n mkdirSync(mirrorDir, { recursive: true })\n writeJsonAtomic(join(mirrorDir, name), value)\n } catch (e) {\n console.error(` ⚠️ sandbox 投影写入失败(control store 已保留真值): ${e.message}`)\n }\n}\n\nfunction persistReceipt(context, actionPath, receipt) {\n persistArtifact(context, actionPath, 'receipt.json', receipt)\n mirrorJson(join(context.runPath, 'receipts', `${receipt.actionId}.json`), receipt)\n}\n\nfunction mirrorJson(path, value) {\n try { writeJsonAtomic(path, value) }\n catch (e) { console.error(` ⚠️ sandbox 投影写入失败(control store 已保留真值): ${e.message}`) }\n}\n\nfunction transportName(kind) {\n if (kind === 'ack') return 'dws.chat.message.add-emoji'\n if (kind === 'reply' || kind === 'ask') return 'dws.chat.message.reply'\n return 'local.silence'\n}\n\nfunction findValue(value, keys) {\n if (!value || typeof value !== 'object') return ''\n for (const key of keys) if (value[key]) return 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\nfunction validGeneration(value, label) {\n const n = Number(value ?? 1)\n if (!Number.isInteger(n) || n < 1) throw new Error(`${label} 的 Session generation 非法`)\n return n\n}\n"]}
|
package/dist/src/boot.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// 冷启动 —— **fail-closed**(TypeScript source)。
|
|
2
|
+
//
|
|
3
|
+
// ⚠️ 这里必须【真的调 dws】。只查本地文件存不存在的 boot 是空转 ——
|
|
4
|
+
// 占位模板照样 BOOT OK,fail-closed 变成死代码,dws 硬化包装永远不会被执行。
|
|
5
|
+
// **「文档是劝,代码是拦」—— 拦的那部分不运行,就等于没有。**
|
|
6
|
+
//
|
|
7
|
+
// **水合不完整 → 禁答身份/能力/记忆/统计类问题。** 报 BOOT FAIL,不许猜、不许找替代路径。
|
|
8
|
+
// **一个「半个记忆」的员工,比一个明确说「我还没醒」的员工危险得多。**
|
|
9
|
+
import { readFileSync, existsSync, readdirSync } from 'node:fs';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import * as dws from './dws.js';
|
|
12
|
+
import { parseSource } from './kb.js';
|
|
13
|
+
const REQUIRED = ['index.md', 'self/role-spec.md', 'self/access.md', 'self/workspace.md'];
|
|
14
|
+
const PROBE = {
|
|
15
|
+
doc: (id) => dws.run(['doc', 'info', '--node', id], { allowFail: true }),
|
|
16
|
+
wiki: (id) => dws.run(['wiki', 'space', 'get', '--space-id', id], { allowFail: true }),
|
|
17
|
+
local: (id) => (existsSync(id) ? { ok: true } : null),
|
|
18
|
+
};
|
|
19
|
+
class BootError extends Error {
|
|
20
|
+
exitCode = 2;
|
|
21
|
+
}
|
|
22
|
+
export function boot(cfg, root) {
|
|
23
|
+
// ── ① 本体三件套:在不在、是不是还只是模板 ──
|
|
24
|
+
const bad = [];
|
|
25
|
+
for (const f of REQUIRED) {
|
|
26
|
+
const p = join(root, 'ontology', f);
|
|
27
|
+
if (!existsSync(p)) {
|
|
28
|
+
bad.push(`ontology/${f} 不存在`);
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
const txt = readFileSync(p, 'utf8');
|
|
32
|
+
const holes = (txt.match(/<待填>|TODO/g) || []).length;
|
|
33
|
+
if (txt.length < 50 || holes >= 3)
|
|
34
|
+
bad.push(`ontology/${f} 还是模板/占位(${holes} 处没填)`);
|
|
35
|
+
}
|
|
36
|
+
if (bad.length) {
|
|
37
|
+
console.error('[BOOT FAIL] 本体没水合完:');
|
|
38
|
+
for (const x of bad)
|
|
39
|
+
console.error(` ✗ ${x}`);
|
|
40
|
+
console.error('\n **禁答身份/能力/记忆/统计类问题。** 不要猜,不要找替代路径。');
|
|
41
|
+
throw new BootError('BOOT FAIL');
|
|
42
|
+
}
|
|
43
|
+
// ── ② 挂载的知识库【真的还在吗】—— 这一步会真调 dws ──
|
|
44
|
+
const kbs = cfg.kb || [];
|
|
45
|
+
if (!kbs.length) {
|
|
46
|
+
console.log(' ⚠️ 一个知识库都没挂 —— 它「知道什么」是空的。');
|
|
47
|
+
console.log(' dingtalk-agent kb mount --name <名字> --from dingtalk:doc:<folderId> --own external');
|
|
48
|
+
}
|
|
49
|
+
const dead = [];
|
|
50
|
+
for (const kb of kbs) {
|
|
51
|
+
const { kind, id } = parseSource(kb.from);
|
|
52
|
+
const ok = PROBE[kind] ? PROBE[kind](id) : null;
|
|
53
|
+
console.log(` ${ok ? '✓' : '✗'} ${kb.name.padEnd(14)} ${kb.from}`);
|
|
54
|
+
if (!ok)
|
|
55
|
+
dead.push(kb.name);
|
|
56
|
+
}
|
|
57
|
+
if (dead.length) {
|
|
58
|
+
console.error(`\n[BOOT FAIL] 这些知识库【拉不到】: ${dead.join('、')}`);
|
|
59
|
+
console.error(' 可能是:被删了 / 没权限 / 网络不通。**正面修,不要绕过。**');
|
|
60
|
+
console.error(' **禁答知识类问题** —— 你不知道自己知道什么。');
|
|
61
|
+
throw new BootError('BOOT FAIL');
|
|
62
|
+
}
|
|
63
|
+
const runs = existsSync(join(root, 'runs'))
|
|
64
|
+
? readdirSync(join(root, 'runs')).filter((f) => f.endsWith('.md')).length : 0;
|
|
65
|
+
console.log(`\n[BOOT OK] ${cfg.agent?.name} · 本体已水合 · 知识库 ${kbs.length} 个在线`);
|
|
66
|
+
console.log(` · 值班 ${(cfg.duties || []).length} 项 · 运行记录 ${runs} 天`);
|
|
67
|
+
console.log('\n下一步:读 ontology/index.md → self/(三件套)→ **命中路由才读** world/ 和 skills/。');
|
|
68
|
+
console.log('**渐进披露:用不上的正文一个字都不读。**');
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=boot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boot.js","sourceRoot":"","sources":["../../src/boot.ts"],"names":[],"mappings":"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","sourcesContent":["// 冷启动 —— **fail-closed**(TypeScript source)。\n//\n// ⚠️ 这里必须【真的调 dws】。只查本地文件存不存在的 boot 是空转 ——\n// 占位模板照样 BOOT OK,fail-closed 变成死代码,dws 硬化包装永远不会被执行。\n// **「文档是劝,代码是拦」—— 拦的那部分不运行,就等于没有。**\n//\n// **水合不完整 → 禁答身份/能力/记忆/统计类问题。** 报 BOOT FAIL,不许猜、不许找替代路径。\n// **一个「半个记忆」的员工,比一个明确说「我还没醒」的员工危险得多。**\nimport { readFileSync, existsSync, readdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport * as dws from './dws.js'\nimport { parseSource } from './kb.js'\n\nconst REQUIRED = ['index.md', 'self/role-spec.md', 'self/access.md', 'self/workspace.md']\n\nconst PROBE: Record<string, (id: string) => unknown> = {\n doc: (id) => dws.run(['doc', 'info', '--node', id], { allowFail: true }),\n wiki: (id) => dws.run(['wiki', 'space', 'get', '--space-id', id], { allowFail: true }),\n local: (id) => (existsSync(id) ? { ok: true } : null),\n}\n\nclass BootError extends Error {\n exitCode = 2\n}\n\nexport function boot(cfg, root) {\n // ── ① 本体三件套:在不在、是不是还只是模板 ──\n const bad: string[] = []\n for (const f of REQUIRED) {\n const p = join(root, 'ontology', f)\n if (!existsSync(p)) { bad.push(`ontology/${f} 不存在`); continue }\n const txt = readFileSync(p, 'utf8')\n const holes = (txt.match(/<待填>|TODO/g) || []).length\n if (txt.length < 50 || holes >= 3) bad.push(`ontology/${f} 还是模板/占位(${holes} 处没填)`)\n }\n if (bad.length) {\n console.error('[BOOT FAIL] 本体没水合完:')\n for (const x of bad) console.error(` ✗ ${x}`)\n console.error('\\n **禁答身份/能力/记忆/统计类问题。** 不要猜,不要找替代路径。')\n throw new BootError('BOOT FAIL')\n }\n\n // ── ② 挂载的知识库【真的还在吗】—— 这一步会真调 dws ──\n const kbs = cfg.kb || []\n if (!kbs.length) {\n console.log(' ⚠️ 一个知识库都没挂 —— 它「知道什么」是空的。')\n console.log(' dingtalk-agent kb mount --name <名字> --from dingtalk:doc:<folderId> --own external')\n }\n const dead: string[] = []\n for (const kb of kbs) {\n const { kind, id } = parseSource(kb.from)\n const ok = PROBE[kind] ? PROBE[kind](id) : null\n console.log(` ${ok ? '✓' : '✗'} ${kb.name.padEnd(14)} ${kb.from}`)\n if (!ok) dead.push(kb.name)\n }\n if (dead.length) {\n console.error(`\\n[BOOT FAIL] 这些知识库【拉不到】: ${dead.join('、')}`)\n console.error(' 可能是:被删了 / 没权限 / 网络不通。**正面修,不要绕过。**')\n console.error(' **禁答知识类问题** —— 你不知道自己知道什么。')\n throw new BootError('BOOT FAIL')\n }\n\n const runs = existsSync(join(root, 'runs'))\n ? readdirSync(join(root, 'runs')).filter((f) => f.endsWith('.md')).length : 0\n console.log(`\\n[BOOT OK] ${cfg.agent?.name} · 本体已水合 · 知识库 ${kbs.length} 个在线`)\n console.log(` · 值班 ${(cfg.duties || []).length} 项 · 运行记录 ${runs} 天`)\n console.log('\\n下一步:读 ontology/index.md → self/(三件套)→ **命中路由才读** world/ 和 skills/。')\n console.log('**渐进披露:用不上的正文一个字都不读。**')\n}\n"]}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// Agent Session 的轻量水合入口。
|
|
2
|
+
//
|
|
3
|
+
// 它不要求 init,也不创建项目模板:
|
|
4
|
+
// - local-dir 直接返回可读的 Markdown 挂载;
|
|
5
|
+
// - dingtalk-doc 通过 DWS 拉成隐藏的只读快照;
|
|
6
|
+
// - 已有 workspace@1 时复用其中的 mounts。
|
|
7
|
+
import { existsSync, lstatSync, mkdirSync, readFileSync, realpathSync, renameSync, writeFileSync, } from 'node:fs';
|
|
8
|
+
import { basename, dirname, join, relative, resolve } from 'node:path';
|
|
9
|
+
import { digest } from './events.js';
|
|
10
|
+
import * as dws from './dws.js';
|
|
11
|
+
import { loadWorkspace, workspacePath } from './workspace.js';
|
|
12
|
+
export function bootstrap(root, options = {}) {
|
|
13
|
+
const cwd = resolve(root);
|
|
14
|
+
const hasWorkspace = existsSync(workspacePath(cwd));
|
|
15
|
+
const workspace = hasWorkspace ? loadWorkspace(cwd) : null;
|
|
16
|
+
const storage = options.storage?.trim() || (workspace ? 'workspace-manifest' : `local-dir:${cwd}`);
|
|
17
|
+
const stateDir = resolve(cwd, options.stateDir || process.env.DTA_STATE_DIR || '.dingtalk-agent');
|
|
18
|
+
const mounts = workspace && !options.storage
|
|
19
|
+
? hydrateWorkspace(cwd, workspace, stateDir, options.profile)
|
|
20
|
+
: hydrateStorage(cwd, storage, stateDir, options.profile, 'workspace');
|
|
21
|
+
const contextId = workspace?.contextId || '';
|
|
22
|
+
const scopeSeed = contextId || canonicalStorageSeed(storage, cwd);
|
|
23
|
+
return {
|
|
24
|
+
$schema: 'dingtalk-agent/bootstrap@1',
|
|
25
|
+
mode: workspace ? 'workspace' : 'direct',
|
|
26
|
+
initialized: hasWorkspace,
|
|
27
|
+
scopeId: `scope_${digest(scopeSeed).slice(0, 20)}`,
|
|
28
|
+
contextId,
|
|
29
|
+
storage,
|
|
30
|
+
stateDir: mounts.some((item) => item.provider === 'dingtalk-doc') ? stateDir : '',
|
|
31
|
+
mounts,
|
|
32
|
+
note: hasWorkspace
|
|
33
|
+
? '已读取现有 Workspace;init 不是每次 Session 的前置动作。'
|
|
34
|
+
: '未初始化 Workspace;已按直接会话模式工作,不会自动修改当前目录。',
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function hydrateWorkspace(root, workspace, stateDir, profile = '') {
|
|
38
|
+
const out = [];
|
|
39
|
+
for (const slot of ['profile', 'memory', 'knowledge']) {
|
|
40
|
+
out.push(...hydrateStorage(root, workspace.mounts[slot], stateDir, profile || workspace.dws.profile, slot));
|
|
41
|
+
}
|
|
42
|
+
return out;
|
|
43
|
+
}
|
|
44
|
+
function hydrateStorage(root, uri, stateDir, profile = '', slot = 'workspace') {
|
|
45
|
+
const mount = parseStorage(uri);
|
|
46
|
+
if (mount.provider === 'local-dir')
|
|
47
|
+
return discoverLocalDirectory(root, mount.ref);
|
|
48
|
+
if (mount.provider === 'local-md') {
|
|
49
|
+
const path = safeLocalPath(root, mount.ref, false);
|
|
50
|
+
if (!path)
|
|
51
|
+
return [];
|
|
52
|
+
const markdown = readFileSync(path, 'utf8');
|
|
53
|
+
return [{ slot, provider: mount.provider, source: uri, path, hash: digest(markdown) }];
|
|
54
|
+
}
|
|
55
|
+
// /i/nodes URL 是多产品统一入口;先 probe,只有在线文档 adoc 才能作为 Markdown Storage。
|
|
56
|
+
const info = dws.docInfo(mount.ref, profile);
|
|
57
|
+
const contentType = String(info?.contentType || '').toUpperCase();
|
|
58
|
+
const extension = String(info?.extension || '').toLowerCase();
|
|
59
|
+
if (contentType !== 'ALIDOC' || extension !== 'adoc') {
|
|
60
|
+
throw new Error(`dingtalk-doc 只接受在线文档 adoc;实际 contentType=${contentType || '?'} extension=${extension || '?'}`);
|
|
61
|
+
}
|
|
62
|
+
const markdown = String(dws.readDoc(mount.ref, profile));
|
|
63
|
+
const scope = digest(uri).slice(0, 20);
|
|
64
|
+
const path = join(stateDir, 'cache', 'bootstrap', scope, `${safeName(slot)}.md`);
|
|
65
|
+
writeAtomic(path, markdown.endsWith('\n') ? markdown : `${markdown}\n`);
|
|
66
|
+
const manifest = join(dirname(path), 'manifest.json');
|
|
67
|
+
writeAtomic(manifest, JSON.stringify({
|
|
68
|
+
$schema: 'dingtalk-agent/bootstrap-cache@1',
|
|
69
|
+
source: uri,
|
|
70
|
+
profile,
|
|
71
|
+
pulledAt: new Date().toISOString(),
|
|
72
|
+
hash: digest(markdown),
|
|
73
|
+
path,
|
|
74
|
+
}, null, 2) + '\n');
|
|
75
|
+
return [{ slot, provider: mount.provider, source: uri, path, hash: digest(markdown) }];
|
|
76
|
+
}
|
|
77
|
+
function discoverLocalDirectory(root, ref) {
|
|
78
|
+
const directory = safeLocalPath(root, ref, true);
|
|
79
|
+
if (!directory || !lstatSync(directory).isDirectory()) {
|
|
80
|
+
throw new Error(`local-dir 不是目录: ${ref}`);
|
|
81
|
+
}
|
|
82
|
+
const candidates = [
|
|
83
|
+
['profile', 'WORKSPACE.md'],
|
|
84
|
+
['memory', 'MEMORY.md'],
|
|
85
|
+
['knowledge', join('knowledge', 'INDEX.md')],
|
|
86
|
+
];
|
|
87
|
+
const out = [];
|
|
88
|
+
for (const [slot, rel] of candidates) {
|
|
89
|
+
const path = resolve(directory, rel);
|
|
90
|
+
if (!existsSync(path) || !lstatSync(path).isFile())
|
|
91
|
+
continue;
|
|
92
|
+
const markdown = readFileSync(path, 'utf8');
|
|
93
|
+
out.push({
|
|
94
|
+
slot,
|
|
95
|
+
provider: 'local-dir',
|
|
96
|
+
source: `local-dir:${directory}`,
|
|
97
|
+
path,
|
|
98
|
+
hash: digest(markdown),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
function parseStorage(uri) {
|
|
104
|
+
const separator = uri.indexOf(':');
|
|
105
|
+
const provider = separator < 0 ? '' : uri.slice(0, separator);
|
|
106
|
+
const ref = separator < 0 ? '' : uri.slice(separator + 1).trim();
|
|
107
|
+
if (!['local-dir', 'local-md', 'dingtalk-doc'].includes(provider) || !ref) {
|
|
108
|
+
throw new Error(`Storage URI 不合法: ${uri};使用 local-dir:<path> / local-md:<path> / dingtalk-doc:<node-or-url>`);
|
|
109
|
+
}
|
|
110
|
+
return { provider: provider, ref };
|
|
111
|
+
}
|
|
112
|
+
function safeLocalPath(root, ref, allowAbsolute) {
|
|
113
|
+
const rootReal = realpathSync(resolve(root));
|
|
114
|
+
const candidate = resolve(rootReal, ref);
|
|
115
|
+
if (!existsSync(candidate)) {
|
|
116
|
+
if (!allowAbsolute)
|
|
117
|
+
return '';
|
|
118
|
+
throw new Error(`Storage 不存在: ${ref}`);
|
|
119
|
+
}
|
|
120
|
+
const actual = realpathSync(candidate);
|
|
121
|
+
if (!allowAbsolute) {
|
|
122
|
+
const rel = relative(rootReal, actual);
|
|
123
|
+
if (rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\' : '/'}`)) {
|
|
124
|
+
throw new Error(`local-md 必须位于当前 Workspace 内: ${ref}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return actual;
|
|
128
|
+
}
|
|
129
|
+
function canonicalStorageSeed(storage, root) {
|
|
130
|
+
const mount = parseStorage(storage);
|
|
131
|
+
return mount.provider === 'local-dir'
|
|
132
|
+
? `local-dir:${realpathSync(resolve(root, mount.ref))}`
|
|
133
|
+
: storage;
|
|
134
|
+
}
|
|
135
|
+
function writeAtomic(path, value) {
|
|
136
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
137
|
+
const temp = `${path}.${process.pid}.${Date.now()}.tmp`;
|
|
138
|
+
writeFileSync(temp, value, { flag: 'wx' });
|
|
139
|
+
renameSync(temp, path);
|
|
140
|
+
}
|
|
141
|
+
function safeName(value) {
|
|
142
|
+
return basename(value).replace(/[^a-zA-Z0-9._-]+/g, '-') || 'workspace';
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/bootstrap.ts"],"names":[],"mappings":"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","sourcesContent":["// Agent Session 的轻量水合入口。\n//\n// 它不要求 init,也不创建项目模板:\n// - local-dir 直接返回可读的 Markdown 挂载;\n// - dingtalk-doc 通过 DWS 拉成隐藏的只读快照;\n// - 已有 workspace@1 时复用其中的 mounts。\n\nimport {\n existsSync, lstatSync, mkdirSync, readFileSync, realpathSync, renameSync,\n writeFileSync,\n} from 'node:fs'\nimport { basename, dirname, join, relative, resolve } from 'node:path'\nimport { digest } from './events.js'\nimport * as dws from './dws.js'\nimport { loadWorkspace, workspacePath, type WorkspaceSpec } from './workspace.js'\n\ntype Provider = 'local-dir' | 'local-md' | 'dingtalk-doc'\n\nexport interface BootstrapOptions {\n storage?: string\n stateDir?: string\n profile?: string\n}\n\nexport interface BootstrapMount {\n slot: string\n provider: Provider\n source: string\n path: string\n hash: string\n}\n\nexport interface BootstrapResult {\n $schema: 'dingtalk-agent/bootstrap@1'\n mode: 'direct' | 'workspace'\n initialized: boolean\n scopeId: string\n contextId: string\n storage: string\n stateDir: string\n mounts: BootstrapMount[]\n note: string\n}\n\nexport function bootstrap(root: string, options: BootstrapOptions = {}): BootstrapResult {\n const cwd = resolve(root)\n const hasWorkspace = existsSync(workspacePath(cwd))\n const workspace = hasWorkspace ? loadWorkspace(cwd) : null\n const storage = options.storage?.trim() || (workspace ? 'workspace-manifest' : `local-dir:${cwd}`)\n const stateDir = resolve(cwd, options.stateDir || process.env.DTA_STATE_DIR || '.dingtalk-agent')\n const mounts = workspace && !options.storage\n ? hydrateWorkspace(cwd, workspace, stateDir, options.profile)\n : hydrateStorage(cwd, storage, stateDir, options.profile, 'workspace')\n const contextId = workspace?.contextId || ''\n const scopeSeed = contextId || canonicalStorageSeed(storage, cwd)\n return {\n $schema: 'dingtalk-agent/bootstrap@1',\n mode: workspace ? 'workspace' : 'direct',\n initialized: hasWorkspace,\n scopeId: `scope_${digest(scopeSeed).slice(0, 20)}`,\n contextId,\n storage,\n stateDir: mounts.some((item) => item.provider === 'dingtalk-doc') ? stateDir : '',\n mounts,\n note: hasWorkspace\n ? '已读取现有 Workspace;init 不是每次 Session 的前置动作。'\n : '未初始化 Workspace;已按直接会话模式工作,不会自动修改当前目录。',\n }\n}\n\nfunction hydrateWorkspace(\n root: string,\n workspace: WorkspaceSpec,\n stateDir: string,\n profile = '',\n): BootstrapMount[] {\n const out: BootstrapMount[] = []\n for (const slot of ['profile', 'memory', 'knowledge'] as const) {\n out.push(...hydrateStorage(\n root,\n workspace.mounts[slot],\n stateDir,\n profile || workspace.dws.profile,\n slot,\n ))\n }\n return out\n}\n\nfunction hydrateStorage(\n root: string,\n uri: string,\n stateDir: string,\n profile = '',\n slot = 'workspace',\n): BootstrapMount[] {\n const mount = parseStorage(uri)\n if (mount.provider === 'local-dir') return discoverLocalDirectory(root, mount.ref)\n if (mount.provider === 'local-md') {\n const path = safeLocalPath(root, mount.ref, false)\n if (!path) return []\n const markdown = readFileSync(path, 'utf8')\n return [{ slot, provider: mount.provider, source: uri, path, hash: digest(markdown) }]\n }\n\n // /i/nodes URL 是多产品统一入口;先 probe,只有在线文档 adoc 才能作为 Markdown Storage。\n const info = dws.docInfo(mount.ref, profile)\n const contentType = String(info?.contentType || '').toUpperCase()\n const extension = String(info?.extension || '').toLowerCase()\n if (contentType !== 'ALIDOC' || extension !== 'adoc') {\n throw new Error(\n `dingtalk-doc 只接受在线文档 adoc;实际 contentType=${contentType || '?'} extension=${extension || '?'}`,\n )\n }\n const markdown = String(dws.readDoc(mount.ref, profile))\n const scope = digest(uri).slice(0, 20)\n const path = join(stateDir, 'cache', 'bootstrap', scope, `${safeName(slot)}.md`)\n writeAtomic(path, markdown.endsWith('\\n') ? markdown : `${markdown}\\n`)\n const manifest = join(dirname(path), 'manifest.json')\n writeAtomic(manifest, JSON.stringify({\n $schema: 'dingtalk-agent/bootstrap-cache@1',\n source: uri,\n profile,\n pulledAt: new Date().toISOString(),\n hash: digest(markdown),\n path,\n }, null, 2) + '\\n')\n return [{ slot, provider: mount.provider, source: uri, path, hash: digest(markdown) }]\n}\n\nfunction discoverLocalDirectory(root: string, ref: string): BootstrapMount[] {\n const directory = safeLocalPath(root, ref, true)\n if (!directory || !lstatSync(directory).isDirectory()) {\n throw new Error(`local-dir 不是目录: ${ref}`)\n }\n const candidates: Array<[string, string]> = [\n ['profile', 'WORKSPACE.md'],\n ['memory', 'MEMORY.md'],\n ['knowledge', join('knowledge', 'INDEX.md')],\n ]\n const out: BootstrapMount[] = []\n for (const [slot, rel] of candidates) {\n const path = resolve(directory, rel)\n if (!existsSync(path) || !lstatSync(path).isFile()) continue\n const markdown = readFileSync(path, 'utf8')\n out.push({\n slot,\n provider: 'local-dir',\n source: `local-dir:${directory}`,\n path,\n hash: digest(markdown),\n })\n }\n return out\n}\n\nfunction parseStorage(uri: string): { provider: Provider; ref: string } {\n const separator = uri.indexOf(':')\n const provider = separator < 0 ? '' : uri.slice(0, separator)\n const ref = separator < 0 ? '' : uri.slice(separator + 1).trim()\n if (!['local-dir', 'local-md', 'dingtalk-doc'].includes(provider) || !ref) {\n throw new Error(\n `Storage URI 不合法: ${uri};使用 local-dir:<path> / local-md:<path> / dingtalk-doc:<node-or-url>`,\n )\n }\n return { provider: provider as Provider, ref }\n}\n\nfunction safeLocalPath(root: string, ref: string, allowAbsolute: boolean): string {\n const rootReal = realpathSync(resolve(root))\n const candidate = resolve(rootReal, ref)\n if (!existsSync(candidate)) {\n if (!allowAbsolute) return ''\n throw new Error(`Storage 不存在: ${ref}`)\n }\n const actual = realpathSync(candidate)\n if (!allowAbsolute) {\n const rel = relative(rootReal, actual)\n if (rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`)) {\n throw new Error(`local-md 必须位于当前 Workspace 内: ${ref}`)\n }\n }\n return actual\n}\n\nfunction canonicalStorageSeed(storage: string, root: string): string {\n const mount = parseStorage(storage)\n return mount.provider === 'local-dir'\n ? `local-dir:${realpathSync(resolve(root, mount.ref))}`\n : storage\n}\n\nfunction writeAtomic(path: string, value: string): void {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.${process.pid}.${Date.now()}.tmp`\n writeFileSync(temp, value, { flag: 'wx' })\n renameSync(temp, path)\n}\n\nfunction safeName(value: string): string {\n return basename(value).replace(/[^a-zA-Z0-9._-]+/g, '-') || 'workspace'\n}\n"]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// 配置 —— CLI 记住的东西(TypeScript source)。
|
|
2
|
+
//
|
|
3
|
+
// **记什么**:身份 · 挂载的知识库 · 值班表 · 评测目标。
|
|
4
|
+
// **不记什么**:凭证(那是 dws 的事,别在这里存 token)。
|
|
5
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
6
|
+
import { join, dirname, resolve, parse } from 'node:path';
|
|
7
|
+
export const FILE = '.dingtalk-agent/config.json';
|
|
8
|
+
export const DEFAULT = {
|
|
9
|
+
schemaVersion: 2,
|
|
10
|
+
agent: {
|
|
11
|
+
name: '<还没起名>',
|
|
12
|
+
userId: '<从 dws contact 取,不要猜>',
|
|
13
|
+
ownerId: '<主人的 userId>',
|
|
14
|
+
},
|
|
15
|
+
dws: {
|
|
16
|
+
// 外发前二者都必须固定;留空只允许 prepare/silence,不允许消息外发。
|
|
17
|
+
profile: '',
|
|
18
|
+
expectedUserId: '',
|
|
19
|
+
},
|
|
20
|
+
runtime: {
|
|
21
|
+
sessionRoot: '.dingtalk-agent/sessions',
|
|
22
|
+
eventIndexRoot: '.dingtalk-agent/event-index',
|
|
23
|
+
waitRoot: '.dingtalk-agent/waits',
|
|
24
|
+
waitTtlMs: 604800000,
|
|
25
|
+
},
|
|
26
|
+
fields: [
|
|
27
|
+
{ id: 'default', path: 'fields/default/field.json', default: true, priority: 0 },
|
|
28
|
+
],
|
|
29
|
+
kb: [],
|
|
30
|
+
duties: [],
|
|
31
|
+
eval: { target: '' },
|
|
32
|
+
};
|
|
33
|
+
export const path = (root) => join(root, FILE);
|
|
34
|
+
/**
|
|
35
|
+
* 沙箱 cwd 往往落在 Session/Run 子目录里,不能再假设 cwd 就是工作区根。
|
|
36
|
+
* 显式 DTA_ROOT 优先;否则向上寻找配置。init 场景找不到时由调用方回退到 cwd。
|
|
37
|
+
*/
|
|
38
|
+
export function findRoot(start = process.cwd()) {
|
|
39
|
+
let dir = resolve(start);
|
|
40
|
+
while (true) {
|
|
41
|
+
if (existsSync(path(dir)))
|
|
42
|
+
return dir;
|
|
43
|
+
const parent = dirname(dir);
|
|
44
|
+
if (parent === dir || dir === parse(dir).root)
|
|
45
|
+
return null;
|
|
46
|
+
dir = parent;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/** 老工作区按默认值补齐新字段,但绝不覆盖已有配置。 */
|
|
50
|
+
export function normalize(input = {}) {
|
|
51
|
+
const value = isRecord(input) ? input : {};
|
|
52
|
+
return {
|
|
53
|
+
...DEFAULT,
|
|
54
|
+
...value,
|
|
55
|
+
agent: { ...DEFAULT.agent, ...(isRecord(value.agent) ? value.agent : {}) },
|
|
56
|
+
dws: { ...DEFAULT.dws, ...(isRecord(value.dws) ? value.dws : {}) },
|
|
57
|
+
runtime: { ...DEFAULT.runtime, ...(isRecord(value.runtime) ? value.runtime : {}) },
|
|
58
|
+
fields: value.fields === undefined
|
|
59
|
+
? DEFAULT.fields.map((x) => ({ ...x }))
|
|
60
|
+
: (Array.isArray(value.fields) ? value.fields : []),
|
|
61
|
+
kb: Array.isArray(value.kb) ? value.kb : [],
|
|
62
|
+
duties: Array.isArray(value.duties) ? value.duties : [],
|
|
63
|
+
eval: { ...DEFAULT.eval, ...(isRecord(value.eval) ? value.eval : {}) },
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export function load(root) {
|
|
67
|
+
const p = path(root);
|
|
68
|
+
return existsSync(p) ? normalize(JSON.parse(readFileSync(p, 'utf8'))) : null;
|
|
69
|
+
}
|
|
70
|
+
export function save(root, value) {
|
|
71
|
+
const p = path(root);
|
|
72
|
+
mkdirSync(dirname(p), { recursive: true });
|
|
73
|
+
writeFileSync(p, JSON.stringify(normalize(value), null, 2) + '\n');
|
|
74
|
+
}
|
|
75
|
+
export function must(root) {
|
|
76
|
+
const cfg = load(root);
|
|
77
|
+
if (!cfg) {
|
|
78
|
+
throw new Error('Prepared Run runtime 尚未初始化 —— 先跑一次 `dingtalk-agent init`。\n' +
|
|
79
|
+
' 普通 Agent Session 不需要 init;请使用全局 Skill,并按需运行 `dingtalk-agent bootstrap`。');
|
|
80
|
+
}
|
|
81
|
+
return cfg;
|
|
82
|
+
}
|
|
83
|
+
function isRecord(value) {
|
|
84
|
+
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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","sourcesContent":["// 配置 —— CLI 记住的东西(TypeScript source)。\n//\n// **记什么**:身份 · 挂载的知识库 · 值班表 · 评测目标。\n// **不记什么**:凭证(那是 dws 的事,别在这里存 token)。\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs'\nimport { join, dirname, resolve, parse } from 'node:path'\nimport type { AgentConfig } from './types.js'\n\nexport const FILE = '.dingtalk-agent/config.json'\n\nexport const DEFAULT: AgentConfig = {\n schemaVersion: 2,\n agent: {\n name: '<还没起名>',\n userId: '<从 dws contact 取,不要猜>',\n ownerId: '<主人的 userId>',\n },\n dws: {\n // 外发前二者都必须固定;留空只允许 prepare/silence,不允许消息外发。\n profile: '',\n expectedUserId: '',\n },\n runtime: {\n sessionRoot: '.dingtalk-agent/sessions',\n eventIndexRoot: '.dingtalk-agent/event-index',\n waitRoot: '.dingtalk-agent/waits',\n waitTtlMs: 604800000,\n },\n fields: [\n { id: 'default', path: 'fields/default/field.json', default: true, priority: 0 },\n ],\n kb: [],\n duties: [],\n eval: { target: '' },\n}\n\nexport const path = (root: string): string => join(root, FILE)\n\n/**\n * 沙箱 cwd 往往落在 Session/Run 子目录里,不能再假设 cwd 就是工作区根。\n * 显式 DTA_ROOT 优先;否则向上寻找配置。init 场景找不到时由调用方回退到 cwd。\n */\nexport function findRoot(start = process.cwd()): string | null {\n let dir = resolve(start)\n while (true) {\n if (existsSync(path(dir))) return dir\n const parent = dirname(dir)\n if (parent === dir || dir === parse(dir).root) return null\n dir = parent\n }\n}\n\n/** 老工作区按默认值补齐新字段,但绝不覆盖已有配置。 */\nexport function normalize(input: unknown = {}): AgentConfig {\n const value = isRecord(input) ? input : {}\n return {\n ...DEFAULT,\n ...value,\n agent: { ...DEFAULT.agent, ...(isRecord(value.agent) ? value.agent : {}) },\n dws: { ...DEFAULT.dws, ...(isRecord(value.dws) ? value.dws : {}) },\n runtime: { ...DEFAULT.runtime, ...(isRecord(value.runtime) ? value.runtime : {}) },\n fields: value.fields === undefined\n ? DEFAULT.fields.map((x) => ({ ...x }))\n : (Array.isArray(value.fields) ? value.fields as AgentConfig['fields'] : []),\n kb: Array.isArray(value.kb) ? value.kb as AgentConfig['kb'] : [],\n duties: Array.isArray(value.duties) ? value.duties as AgentConfig['duties'] : [],\n eval: { ...DEFAULT.eval, ...(isRecord(value.eval) ? value.eval : {}) },\n }\n}\n\nexport function load(root: string): AgentConfig | null {\n const p = path(root)\n return existsSync(p) ? normalize(JSON.parse(readFileSync(p, 'utf8'))) : null\n}\n\nexport function save(root: string, value: unknown): void {\n const p = path(root)\n mkdirSync(dirname(p), { recursive: true })\n writeFileSync(p, JSON.stringify(normalize(value), null, 2) + '\\n')\n}\n\nexport function must(root: string): AgentConfig {\n const cfg = load(root)\n if (!cfg) {\n throw new Error(\n 'Prepared Run runtime 尚未初始化 —— 先跑一次 `dingtalk-agent init`。\\n' +\n ' 普通 Agent Session 不需要 init;请使用全局 Skill,并按需运行 `dingtalk-agent bootstrap`。')\n }\n return cfg\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n"]}
|