@xdxer/dingtalk-agent 0.1.5-beta.5 → 0.1.5-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +52 -0
- package/README.en.md +6 -6
- package/README.md +6 -6
- package/dist/bin/dingtalk-agent.js +406 -139
- package/dist/bin/dingtalk-agent.js.map +1 -1
- package/dist/src/actions.js +3 -2
- package/dist/src/actions.js.map +1 -1
- package/dist/src/agent-audit.js +29 -25
- package/dist/src/agent-audit.js.map +1 -1
- package/dist/src/agent-definition.js +7 -3
- package/dist/src/agent-definition.js.map +1 -1
- package/dist/src/agent-enhance.js +2 -2
- package/dist/src/agent-enhance.js.map +1 -1
- package/dist/src/agent-platform.js +2 -2
- package/dist/src/agent-platform.js.map +1 -1
- package/dist/src/development-workspace.js +14 -9
- package/dist/src/development-workspace.js.map +1 -1
- package/dist/src/doctor.js +58 -7
- package/dist/src/doctor.js.map +1 -1
- package/dist/src/dws.js +2 -1
- package/dist/src/dws.js.map +1 -1
- package/dist/src/init.js +2 -1
- package/dist/src/init.js.map +1 -1
- package/dist/src/map.js +157 -0
- package/dist/src/map.js.map +1 -0
- package/dist/src/opencode-evals.js +6 -6
- package/dist/src/opencode-evals.js.map +1 -1
- package/dist/src/opencode-provider.js +2 -2
- package/dist/src/opencode-provider.js.map +1 -1
- package/dist/src/opencode-workspace.js +3 -3
- package/dist/src/opencode-workspace.js.map +1 -1
- package/dist/src/personal-event-evals.js +4 -2
- package/dist/src/personal-event-evals.js.map +1 -1
- package/dist/src/remote-semantic-state-live-evals.js +5 -4
- package/dist/src/remote-semantic-state-live-evals.js.map +1 -1
- package/dist/src/remote-state-evals.js +2 -2
- package/dist/src/remote-state-evals.js.map +1 -1
- package/dist/src/robot-evals.js +3 -3
- package/dist/src/robot-evals.js.map +1 -1
- package/dist/src/schedule-plan.js +1 -1
- package/dist/src/schedule-plan.js.map +1 -1
- package/dist/src/sessions.js +1 -1
- package/dist/src/sessions.js.map +1 -1
- package/dist/src/skill-manager.js +74 -13
- package/dist/src/skill-manager.js.map +1 -1
- package/dist/src/tui.js +369 -0
- package/dist/src/tui.js.map +1 -0
- package/dist/src/upgrade.js +113 -33
- package/dist/src/upgrade.js.map +1 -1
- package/dist/src/waits.js +2 -1
- package/dist/src/waits.js.map +1 -1
- package/dist/src/workspace.js +2 -2
- package/dist/src/workspace.js.map +1 -1
- package/docs/ARCHITECTURE.md +9 -9
- package/docs/INSTALLATION.md +6 -6
- package/docs/SELF-TEST.md +3 -3
- package/docs/schemas/project.schema.json +2 -2
- package/examples/agents/README.md +1 -1
- package/examples/agents/fde-coach/agent/AGENTS.md +1 -1
- package/examples/agents/release-manager/agent/AGENTS.md +1 -1
- package/lab/agent-eval/catalog.json +5 -5
- package/lab/agent-eval/classic-failures.json +4 -4
- package/lab/agent-eval/completion-gate-regression.json +9 -9
- package/lab/agent-eval/personal-event-live.example.json +3 -3
- package/lab/agent-eval/remote-semantic-state-live.example.json +1 -1
- package/lab/agent-eval/workspace/opencode.json +2 -2
- package/lab/project-workspace/multica-readonly.fixture.json +2 -2
- package/lab/project-workspace/opencode-provider-suite.json +2 -2
- package/lab/project-workspace/project.fixture.json +1 -1
- package/lab/robot-eval/suite.json +1 -1
- package/lab/robot-eval/workspace/AGENTS.md +1 -1
- package/lab/robot-eval/workspace/opencode.json +2 -2
- package/lab/schemas/personal-event-eval.schema.json +1 -1
- package/package.json +8 -8
- package/skills/README.md +10 -7
- package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/SKILL.md +8 -8
- package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/AGENTS.template.md +1 -1
- package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/hosts/opencode/opencode.template.json +2 -2
- package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/evals/evals.json +3 -3
- package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/host-loading-contract.md +1 -1
- package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/hosts/claude-code.md +1 -1
- package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/hosts/opencode.md +2 -2
- package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/SKILL.md +2 -2
- package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/assets/eval-catalog.template.json +1 -1
- package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/evals/evals.json +1 -1
- package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/eval-topology.md +3 -3
- package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/interactive-debug-channels.md +1 -1
- package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/SKILL.md +2 -2
- package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/event-to-behavior.md +1 -1
- package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/COMPLETENESS.md +1 -1
- package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/SKILL.md +2 -2
- package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/config-binding.md +1 -1
- package/skills/platforms/deap/PLATFORM.md +1 -1
- package/skills/platforms/multica-dingtalk/PLATFORM.md +4 -4
- package/skills/platforms/multica-dingtalk/{dingtalk-agent-deploy-multica → dta-deploy-multica}/SKILL.md +3 -3
- package/skills/platforms/multica-dingtalk/{multica-external → dta-ops-multica}/SKILL.md +5 -5
- package/skills/platforms/multica-dingtalk/{multica-external → dta-ops-multica}/scripts/bootstrap.sh +2 -2
- /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/REPOSITORY.template.md +0 -0
- /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/agent.bindings.dingtalk-doc.template.json +0 -0
- /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/agent.bindings.local.template.json +0 -0
- /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/role-skill.template.md +0 -0
- /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/agent-definition-contract.md +0 -0
- /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/drive-and-schedules.md +0 -0
- /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/storage-routing.md +0 -0
- /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/evidence-contract.md +0 -0
- /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/failure-to-case.md +0 -0
- /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/local-connector-smoke.md +0 -0
- /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/scenario-taxonomy.md +0 -0
- /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/storage-modes.md +0 -0
- /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/assets/memory-candidate-proposal.json +0 -0
- /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/assets/task-checkpoint.json +0 -0
- /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/action-contract.md +0 -0
- /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/memory-and-evolution.md +0 -0
- /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/perception-and-gates.md +0 -0
- /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/risk-authority-and-privacy.md +0 -0
- /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/runtime-modes.md +0 -0
- /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/task-lifecycle.md +0 -0
- /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/truth-and-recovery.md +0 -0
- /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/adapters.md +0 -0
- /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/assembly-guidance.md +0 -0
- /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/binding.md +0 -0
- /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/cold-start.md +0 -0
- /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/consent-and-visibility.md +0 -0
- /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/consolidation.md +0 -0
- /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/event-ingest.md +0 -0
- /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/guided-setup.md +0 -0
- /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/model.md +0 -0
- /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/storage-port.md +0 -0
- /package/skills/platforms/multica-dingtalk/{dingtalk-agent-deploy-multica → dta-deploy-multica}/references/multica-deployment-contract.md +0 -0
- /package/skills/platforms/multica-dingtalk/{dingtalk-agent-deploy-multica → dta-deploy-multica}/references/promotion-observation-contract.md +0 -0
- /package/skills/platforms/multica-dingtalk/{multica-external → dta-ops-multica}/scripts/multica_ext.py +0 -0
package/dist/src/upgrade.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAErD,MAAM,YAAY,GAAG,uBAAuB,CAAA;AAC5C,MAAM,QAAQ,GAAG,4BAA4B,CAAA;AAqC7C,MAAM,UAAU,YAAY,CAAC,WAAmB,EAAE,UAA0B,EAAE;IAC5E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,EAAE,CAAA;IACtC,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAA;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;IAC/E,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;IAChD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAC1E,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IACjF,sCAAsC;IACtC,MAAM,YAAY,GAAG,gBAAgB,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAA;IAEnE,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;IAC3D,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;IACrF,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,aAAa,OAAO,oBAAoB,CAAC,CAAA;IAC3D,CAAC;IACD,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAA;IAC1D,MAAM,aAAa,GAAG,GAAG,CAAC,0BAA0B,IAAI,GAAG,YAAY,IAAI,SAAS,EAAE,CAAA;IACtF,MAAM,aAAa,GAAG,GAAG,CAAC,0BAA0B,IAAI,oBAAoB,CAAC,aAAa,EAAE,GAAG,CAAC,CAAA;IAChG,IAAI,eAAe,CAAC,aAAa,EAAE,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9F,MAAM,IAAI,KAAK,CACb,QAAQ,aAAa,WAAW,cAAc,UAAU;YACxD,iCAAiC,CAClC,CAAA;IACH,CAAC;IACD,MAAM,WAAW,GAAG;QAClB,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa;KACjF,CAAA;IACD,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,GAAG,WAAW,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACxE,MAAM,aAAa,GAAG,GAAG,UAAU,CAAC,UAAU,CAAC,2BAA2B,CAAA;IAC1E,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,aAAa,KAAK,cAAc,CAAA;IAEjE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO;YACL,OAAO,EAAE,0BAA0B,EAAE,cAAc,EAAE,aAAa;YAClE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI;YAChE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI;YACzB,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAClC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB;gBACvC,KAAK,EAAE,IAAI;gBACX,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY;gBAClC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK;gBAC3B,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS;aAC5C,CAAC,CAAC;YACH,QAAQ,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE;SAC7D,CAAA;IACH,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;QAC1F,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;QACjF,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CACb,aAAa,OAAO,CAAC,KAAK,EAAE,OAAO,IAAI,MAAM,IAAI,OAAO,OAAO,CAAC,MAAM,EAAE,IAAI;gBAC5E,UAAU,cAAc,EAAE,CAC3B,CAAA;QACH,CAAC;IACH,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,sBAAsB,UAAU,YAAY,cAAc,EAAE,CAAC,CAAA;IAC/E,CAAC;IACD,MAAM,YAAY,GAAG;QACnB,GAAG,GAAG;QACN,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;KAC/D,CAAA;IACD,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,EAAE;QACtD,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK;KACpD,CAAC,CAAA;IACF,MAAM,gBAAgB,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IAC/D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,gBAAgB,KAAK,aAAa,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CACb,0BAA0B,aAAa,YAAY,gBAAgB,IAAI,SAAS,IAAI;YACpF,QAAQ,cAAc,EAAE,CACzB,CAAA;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,oBAAoB,EAAE,QAAQ,CAAC,EAAE;QAChF,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO;KACtD,CAAC,CAAA;IACF,IAAI,KAAK,GAA+B,IAAI,CAAA;IAC5C,IAAI,CAAC;QAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;IACnG,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,YAAY,gBAAgB,mBAAmB;YAC/C,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,OAAO,QAAQ,CAAC,MAAM,EAAE,IAAI;YACpF,UAAU,aAAa,EAAE,CAC1B,CAAA;IACH,CAAC;IACD,OAAO;QACL,OAAO,EAAE,0BAA0B,EAAE,cAAc,EAAE,aAAa;QAClE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK;QACjE,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,KAAK,KAAK,IAAI;QAC5D,KAAK;QACL,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAChC,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAA;YACnF,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB;gBACvC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,IAAI,IAAI;gBACjD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY;gBAClE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,IAAI,SAAS;gBAC3C,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,gBAAgB,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,gBAAgB;aACxF,CAAA;QACH,CAAC,CAAC;QACF,QAAQ,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE;KAC7D,CAAA;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,aAAqB,EAAE,GAAsB;IACzE,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE;QACjG,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM;KACvC,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IAC9C,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,YAAY,aAAa,IAAI;YAC7B,GAAG,GAAG,CAAC,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,OAAO,GAAG,CAAC,MAAM,EAAE,EAAE,CAClF,CAAA;IACH,CAAC;IACD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAChC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK;YAAE,OAAO,KAAK,CAAA;IACtD,CAAC;IAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAC9B,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAA;IACrD,MAAM,IAAI,KAAK,CAAC,iBAAiB,aAAa,MAAM,CAAC,CAAA;AACvD,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAA;AAC5F,CAAC","sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { delimiter, join } from 'node:path'\nimport { spawnSync } from 'node:child_process'\nimport { cleanVersion, compareVersions } from './version.js'\nimport { skillSuiteStatus } from './skill-manager.js'\n\nconst PACKAGE_NAME = '@xdxer/dingtalk-agent'\nconst REGISTRY = 'https://registry.npmjs.org'\n\nexport interface UpgradeOptions {\n home?: string\n env?: NodeJS.ProcessEnv\n prefix?: string\n channel?: 'beta' | 'latest'\n version?: string\n dryRun?: boolean\n force?: boolean\n}\n\nexport interface UpgradeResult {\n $schema: 'dingtalk-agent/upgrade@1'\n currentVersion: string\n targetVersion: string\n target: string\n prefix: string\n executable: string\n changed: boolean\n dryRun: boolean\n ready: boolean\n setup: Record<string, any> | null\n skills: UpgradeSkillReport[]\n commands: { install: string; verify: string }\n}\n\n/** 升级前后各 Skill 的版本核对;`after` 为 null 表示 dry-run 尚未执行。 */\nexport interface UpgradeSkillReport {\n name: string\n before: string\n after: string | null\n bundled: string\n state: string\n changed: boolean\n}\n\nexport function upgradeAgent(packageRoot: string, options: UpgradeOptions = {}): UpgradeResult {\n const home = options.home || homedir()\n const env = { ...process.env, ...(options.env || {}) }\n const pkg = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'))\n const currentVersion = String(pkg.version || '')\n const prefix = options.prefix || join(home, '.local')\n const binDir = process.platform === 'win32' ? prefix : join(prefix, 'bin')\n const executable = join(binDir, process.platform === 'win32' ? 'dta.cmd' : 'dta')\n // 升级前先冻结本机 Skill 版本,否则重装之后无从核对到底动了什么。\n const skillsBefore = skillSuiteStatus(packageRoot, { home }).skills\n\n if (options.channel && options.version) {\n throw new Error('upgrade 的 --channel 与 --version 不能同时使用')\n }\n const channel = options.channel || (currentVersion.includes('-') ? 'beta' : 'latest')\n if (!['beta', 'latest'].includes(channel)) {\n throw new Error(`不支持的升级通道: ${channel};只能是 beta 或 latest`)\n }\n const requested = cleanVersion(options.version) || channel\n const packageSource = env.DTA_UPGRADE_PACKAGE_SOURCE || `${PACKAGE_NAME}@${requested}`\n const targetVersion = env.DTA_UPGRADE_TARGET_VERSION || resolveTargetVersion(packageSource, env)\n if (compareVersions(targetVersion, currentVersion) < 0 && !(options.version && options.force)) {\n throw new Error(\n `升级目标 ${targetVersion} 低于当前版本 ${currentVersion},拒绝自动降级;` +\n '如确需降级,请同时使用 --version 与 --force',\n )\n }\n const installArgs = [\n 'install', '--global', '--prefix', prefix, '--registry', REGISTRY, packageSource,\n ]\n const installCommand = ['npm', ...installArgs].map(shellQuote).join(' ')\n const verifyCommand = `${shellQuote(executable)} setup --skip-cli-install`\n const changed = options.force || targetVersion !== currentVersion\n\n if (options.dryRun) {\n return {\n $schema: 'dingtalk-agent/upgrade@1', currentVersion, targetVersion,\n target: packageSource, prefix, executable, changed, dryRun: true,\n ready: false, setup: null,\n skills: skillsBefore.map((item) => ({\n name: item.name,\n before: item.canonical.installedVersion,\n after: null,\n bundled: item.bundled.skillVersion,\n state: item.canonical.state,\n changed: item.canonical.state !== 'current',\n })),\n commands: { install: installCommand, verify: verifyCommand },\n }\n }\n\n if (changed) {\n const install = spawnSync('npm', installArgs, { encoding: 'utf8', env, timeout: 120_000 })\n const output = [install.stdout, install.stderr].filter(Boolean).join('\\n').trim()\n if (install.error || install.status !== 0) {\n throw new Error(\n `CLI 升级失败: ${install.error?.message || output || `退出码 ${install.status}`}\\n` +\n `可手动执行: ${installCommand}`,\n )\n }\n }\n if (!existsSync(executable)) {\n throw new Error(`npm 升级完成但找不到新 CLI: ${executable}\\n可手动执行: ${installCommand}`)\n }\n const effectiveEnv = {\n ...env,\n HOME: home,\n PATH: [binDir, env.PATH || ''].filter(Boolean).join(delimiter),\n }\n const versionRun = spawnSync(executable, ['--version'], {\n encoding: 'utf8', env: effectiveEnv, timeout: 8_000,\n })\n const installedVersion = String(versionRun.stdout || '').trim()\n if (versionRun.status !== 0 || installedVersion !== targetVersion) {\n throw new Error(\n `新 CLI 版本校验失败: expected=${targetVersion}, actual=${installedVersion || 'unknown'}\\n` +\n `可重试: ${installCommand}`,\n )\n }\n const setupRun = spawnSync(executable, ['setup', '--skip-cli-install', '--json'], {\n encoding: 'utf8', env: effectiveEnv, timeout: 180_000,\n })\n let setup: Record<string, any> | null = null\n try { setup = setupRun.stdout ? JSON.parse(setupRun.stdout) : null } catch { /* reported below */ }\n if (!setup) {\n throw new Error(\n `CLI 已升级到 ${installedVersion},但 setup 输出无法解析: ` +\n `${String(setupRun.stderr || setupRun.stdout).trim() || `退出码 ${setupRun.status}`}\\n` +\n `可手动执行: ${verifyCommand}`,\n )\n }\n return {\n $schema: 'dingtalk-agent/upgrade@1', currentVersion, targetVersion,\n target: packageSource, prefix, executable, changed, dryRun: false,\n ready: setupRun.status === 0 && setup.doctor?.ready === true,\n setup,\n skills: skillsBefore.map((item) => {\n const after = (setup?.skills || []).find((entry: any) => entry?.name === item.name)\n return {\n name: item.name,\n before: item.canonical.installedVersion,\n after: after?.canonical?.installedVersion ?? null,\n bundled: after?.bundled?.skillVersion ?? item.bundled.skillVersion,\n state: after?.canonical?.state ?? 'unknown',\n changed: (after?.canonical?.installedVersion ?? '') !== item.canonical.installedVersion,\n }\n }),\n commands: { install: installCommand, verify: verifyCommand },\n }\n}\n\nfunction resolveTargetVersion(packageSource: string, env: NodeJS.ProcessEnv): string {\n const run = spawnSync('npm', ['view', packageSource, 'version', '--json', '--registry', REGISTRY], {\n encoding: 'utf8', env, timeout: 30_000,\n })\n const output = String(run.stdout || '').trim()\n if (run.error || run.status !== 0) {\n throw new Error(\n `无法解析升级目标 ${packageSource}: ` +\n `${run.error?.message || String(run.stderr || '').trim() || `退出码 ${run.status}`}`,\n )\n }\n try {\n const value = JSON.parse(output)\n if (typeof value === 'string' && value) return value\n } catch { /* fall through */ }\n if (output) return output.replace(/^['\"]|['\"]$/g, '')\n throw new Error(`npm view 没有返回 ${packageSource} 的版本`)\n}\n\nfunction shellQuote(value: string): string {\n return /^[A-Za-z0-9_./:=@\"$-]+$/.test(value) ? value : `'${value.replace(/'/g, `'\"'\"'`)}'`\n}\n"]}
|
|
1
|
+
{"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/upgrade.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { delimiter, join } from 'node:path'\nimport { spawnSync } from 'node:child_process'\nimport { cleanVersion, compareVersions } from './version.js'\nimport { skillSuiteStatus } from './skill-manager.js'\n\nconst PACKAGE_NAME = '@xdxer/dingtalk-agent'\nconst REGISTRY = 'https://registry.npmjs.org'\n\nexport interface UpgradeOptions {\n home?: string\n env?: NodeJS.ProcessEnv\n prefix?: string\n channel?: 'beta' | 'latest'\n version?: string\n dryRun?: boolean\n force?: boolean\n /** 人类通道的进度回调;不传时行为与不带该参数时逐字节相同。--json 分支不得传。 */\n onEvent?: (event: UpgradeEvent) => void\n}\n\n/** 升级过程中的阶段事件。业务逻辑不依赖它,渲染层也不回写它。 */\nexport interface UpgradeEvent {\n /** 第几步,从 1 起 */\n step: number\n /** 总步数:dry-run 3 步,实跑 7 步 */\n total: number\n id: 'freeze' | 'resolve' | 'guard' | 'install' | 'locate' | 'verify-cli' | 'verify-env'\n label: string\n phase: 'begin' | 'end'\n ok?: boolean\n /** 终态附注,例如 '未变更,跳过' */\n meta?: string\n}\n\n/** `dta upgrade --check` 的结果;与 upgrade@1 分开,避免动既有 Schema。 */\nexport interface UpgradeCheckResult {\n $schema: 'dingtalk-agent/upgrade-check@1'\n currentVersion: string\n targetVersion: string\n /** 解析用的来源,可能是可变 tag(`pkg@latest`) */\n target: string\n /**\n * 钉死到精确版本的安装源。**安装必须用它而不是 target**:\n * 从解析到用户按下 y 之间,registry 的 tag 可能已经指向别的版本,\n * 那样会装进 Y 却按 X 校验,机器已经被改了才发现不一致。\n */\n pinnedSource: string\n channel: 'beta' | 'latest'\n /**\n * 目标相对当前版本的关系。**不能只给 outdated 布尔量**:\n * `--version <旧版> --force` 时 outdated=false,界面会显示\"已是最新\",\n * 用户确认之后却真的降级了——在不可逆动作前给了反的信息。\n */\n relation: 'upgrade' | 'same' | 'downgrade'\n}\n\nexport interface UpgradeResult {\n $schema: 'dingtalk-agent/upgrade@1'\n currentVersion: string\n targetVersion: string\n target: string\n prefix: string\n executable: string\n changed: boolean\n dryRun: boolean\n ready: boolean\n setup: Record<string, any> | null\n skills: UpgradeSkillReport[]\n commands: { install: string; verify: string }\n}\n\n/** 升级前后各 Skill 的版本核对;`after` 为 null 表示 dry-run 尚未执行。 */\nexport interface UpgradeSkillReport {\n name: string\n before: string\n after: string | null\n bundled: string\n state: string\n changed: boolean\n}\n\nexport function upgradeAgent(packageRoot: string, options: UpgradeOptions = {}): UpgradeResult {\n const home = options.home || homedir()\n const env = { ...process.env, ...(options.env || {}) }\n const pkg = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'))\n const currentVersion = String(pkg.version || '')\n const prefix = options.prefix || join(home, '.local')\n const binDir = process.platform === 'win32' ? prefix : join(prefix, 'bin')\n const executable = join(binDir, process.platform === 'win32' ? 'dta.cmd' : 'dta')\n\n // 阶段追踪:只发事件,不改任何返回值。不传 onEvent 时整段是纯开销为零的空转。\n let step = 0\n const total = options.dryRun ? 3 : 7\n // 观察者抛错不得影响升级:begin 抛错会挡住业务,end 抛错会把已经成功的\n // 安装变成失败抛出,可能诱导用户重试一次真实安装。一律隔离并就地禁用。\n let observer = options.onEvent\n const track = <T>(\n id: UpgradeEvent['id'], label: string, run: () => T,\n meta?: (value: T) => string,\n /** 不给时\"没抛错就算成功\";verify-env 这种要看内容才知道成没成的必须自定 */\n okOf?: (value: T) => boolean,\n ): T => {\n step += 1\n const emit = (phase: 'begin' | 'end', ok?: boolean, note?: string) => {\n if (!observer) return\n try { observer({ step, total, id, label, phase, ok, meta: note }) }\n catch { observer = undefined }\n }\n emit('begin')\n try {\n const value = run()\n emit('end', okOf ? okOf(value) : true, meta?.(value))\n return value\n } catch (error) {\n emit('end', false)\n throw error\n }\n }\n\n // 升级前先冻结本机 Skill 版本,否则重装之后无从核对到底动了什么。\n const skillsBefore = track(\n 'freeze', '冻结当前 Skill 版本',\n () => skillSuiteStatus(packageRoot, { home }).skills,\n (skills) => `${skills.length} 个 Skill`,\n )\n\n if (options.channel && options.version) {\n throw new Error('upgrade 的 --channel 与 --version 不能同时使用')\n }\n const channel = options.channel || (currentVersion.includes('-') ? 'beta' : 'latest')\n if (!['beta', 'latest'].includes(channel)) {\n throw new Error(`不支持的升级通道: ${channel};只能是 beta 或 latest`)\n }\n const requested = cleanVersion(options.version) || channel\n const packageSource = env.DTA_UPGRADE_PACKAGE_SOURCE || `${PACKAGE_NAME}@${requested}`\n const targetVersion = track(\n 'resolve', '解析升级目标',\n () => env.DTA_UPGRADE_TARGET_VERSION || resolveTargetVersion(packageSource, env),\n (version) => version,\n )\n track('guard', '检查版本关系', () => {\n if (compareVersions(targetVersion, currentVersion) < 0 && !(options.version && options.force)) {\n throw new Error(\n `升级目标 ${targetVersion} 低于当前版本 ${currentVersion},拒绝自动降级;` +\n '如确需降级,请同时使用 --version 与 --force',\n )\n }\n }, () => `${currentVersion} → ${targetVersion}`)\n const installArgs = [\n 'install', '--global', '--prefix', prefix, '--registry', REGISTRY, packageSource,\n ]\n const installCommand = ['npm', ...installArgs].map(shellQuote).join(' ')\n const verifyCommand = `${shellQuote(executable)} setup --skip-cli-install`\n const changed = options.force || targetVersion !== currentVersion\n\n if (options.dryRun) {\n return {\n $schema: 'dingtalk-agent/upgrade@1', currentVersion, targetVersion,\n target: packageSource, prefix, executable, changed, dryRun: true,\n ready: false, setup: null,\n skills: skillsBefore.map((item) => ({\n name: item.name,\n before: item.canonical.installedVersion,\n after: null,\n bundled: item.bundled.skillVersion,\n state: item.canonical.state,\n changed: item.canonical.state !== 'current',\n })),\n commands: { install: installCommand, verify: verifyCommand },\n }\n }\n\n track('install', `安装 ${packageSource}`, () => {\n if (!changed) return\n const install = spawnSync('npm', installArgs, { encoding: 'utf8', env, timeout: 120_000 })\n const output = [install.stdout, install.stderr].filter(Boolean).join('\\n').trim()\n if (install.error || install.status !== 0) {\n throw new Error(\n `CLI 升级失败: ${install.error?.message || output || `退出码 ${install.status}`}\\n` +\n `可手动执行: ${installCommand}`,\n )\n }\n }, () => changed ? targetVersion : '未变更,跳过')\n track('locate', '定位新 CLI', () => {\n if (!existsSync(executable)) {\n throw new Error(`npm 升级完成但找不到新 CLI: ${executable}\\n可手动执行: ${installCommand}`)\n }\n }, () => executable)\n const effectiveEnv = {\n ...env,\n HOME: home,\n PATH: [binDir, env.PATH || ''].filter(Boolean).join(delimiter),\n }\n const installedVersion = track('verify-cli', '校验新 CLI 版本', () => {\n const versionRun = spawnSync(executable, ['--version'], {\n encoding: 'utf8', env: effectiveEnv, timeout: 8_000,\n })\n const actual = String(versionRun.stdout || '').trim()\n if (versionRun.status !== 0 || actual !== targetVersion) {\n throw new Error(\n `新 CLI 版本校验失败: expected=${targetVersion}, actual=${actual || 'unknown'}\\n` +\n `可重试: ${installCommand}`,\n )\n }\n return actual\n }, (version) => version)\n // spawn 必须在 track 内部:这是整条链路最长的一步(180 秒预算),\n // 放到外面等于最该有进度的地方反而静默。\n let setupStatus = 0\n const setup = track('verify-env', '复核环境', () => {\n const setupRun = spawnSync(executable, ['setup', '--skip-cli-install', '--json'], {\n encoding: 'utf8', env: effectiveEnv, timeout: 180_000,\n })\n setupStatus = setupRun.status ?? 1\n let parsed: Record<string, any> | null = null\n try { parsed = setupRun.stdout ? JSON.parse(setupRun.stdout) : null } catch { /* reported below */ }\n if (!parsed) {\n throw new Error(\n `CLI 已升级到 ${installedVersion},但 setup 输出无法解析: ` +\n `${String(setupRun.stderr || setupRun.stdout).trim() || `退出码 ${setupRun.status}`}\\n` +\n `可手动执行: ${verifyCommand}`,\n )\n }\n return parsed\n },\n (parsed) => parsed?.doctor?.ready === true ? '全部 ready' : '部分未 ready',\n // 不能只看\"JSON 解析出来了\"就打 ✔:那会渲染成自相矛盾的 \"✔ 部分未 ready\"\n (parsed) => setupStatus === 0 && parsed?.doctor?.ready === true)\n return {\n $schema: 'dingtalk-agent/upgrade@1', currentVersion, targetVersion,\n target: packageSource, prefix, executable, changed, dryRun: false,\n ready: setupStatus === 0 && setup.doctor?.ready === true,\n setup,\n skills: skillsBefore.map((item) => {\n const after = (setup?.skills || []).find((entry: any) => entry?.name === item.name)\n return {\n name: item.name,\n before: item.canonical.installedVersion,\n after: after?.canonical?.installedVersion ?? null,\n bundled: after?.bundled?.skillVersion ?? item.bundled.skillVersion,\n state: after?.canonical?.state ?? 'unknown',\n changed: (after?.canonical?.installedVersion ?? '') !== item.canonical.installedVersion,\n }\n }),\n commands: { install: installCommand, verify: verifyCommand },\n }\n}\n\n/**\n * 只解析升级目标,不碰磁盘、不装任何东西。\n *\n * 独立于 upgradeAgent 的 Schema:`upgrade@1` 是 release-readiness 和契约\n * eval 的解析对象,不能为了一个只读命令给它加字段。\n */\nexport function checkUpgrade(packageRoot: string, options: UpgradeOptions = {}): UpgradeCheckResult {\n const env = { ...process.env, ...(options.env || {}) }\n const pkg = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'))\n const currentVersion = String(pkg.version || '')\n if (options.channel && options.version) {\n throw new Error('upgrade 的 --channel 与 --version 不能同时使用')\n }\n const channel = options.channel || (currentVersion.includes('-') ? 'beta' : 'latest')\n if (!['beta', 'latest'].includes(channel)) {\n throw new Error(`不支持的升级通道: ${channel};只能是 beta 或 latest`)\n }\n const requested = cleanVersion(options.version) || channel\n const packageSource = env.DTA_UPGRADE_PACKAGE_SOURCE || `${PACKAGE_NAME}@${requested}`\n const targetVersion = env.DTA_UPGRADE_TARGET_VERSION || resolveTargetVersion(packageSource, env)\n const order = compareVersions(targetVersion, currentVersion)\n return {\n $schema: 'dingtalk-agent/upgrade-check@1',\n currentVersion, targetVersion, target: packageSource,\n // 用户显式给过 source(本地路径、tarball 等)就原样保留,只有默认的\n // `pkg@tag` 这种可变来源才需要钉死。\n pinnedSource: env.DTA_UPGRADE_PACKAGE_SOURCE || `${PACKAGE_NAME}@${targetVersion}`,\n channel: channel as 'beta' | 'latest',\n relation: order > 0 ? 'upgrade' : order < 0 ? 'downgrade' : 'same',\n }\n}\n\nfunction resolveTargetVersion(packageSource: string, env: NodeJS.ProcessEnv): string {\n const run = spawnSync('npm', ['view', packageSource, 'version', '--json', '--registry', REGISTRY], {\n encoding: 'utf8', env, timeout: 30_000,\n })\n const output = String(run.stdout || '').trim()\n if (run.error || run.status !== 0) {\n throw new Error(\n `无法解析升级目标 ${packageSource}: ` +\n `${run.error?.message || String(run.stderr || '').trim() || `退出码 ${run.status}`}`,\n )\n }\n try {\n const value = JSON.parse(output)\n if (typeof value === 'string' && value) return value\n } catch { /* fall through */ }\n if (output) return output.replace(/^['\"]|['\"]$/g, '')\n throw new Error(`npm view 没有返回 ${packageSource} 的版本`)\n}\n\nfunction shellQuote(value: string): string {\n return /^[A-Za-z0-9_./:=@\"$-]+$/.test(value) ? value : `'${value.replace(/'/g, `'\"'\"'`)}'`\n}\n"]}
|
package/dist/src/waits.js
CHANGED
|
@@ -7,6 +7,7 @@ import { dirname, resolve, join } from 'node:path';
|
|
|
7
7
|
import { hostname } from 'node:os';
|
|
8
8
|
import { randomUUID } from 'node:crypto';
|
|
9
9
|
import { digest, stableStringify } from './events.js';
|
|
10
|
+
import { err } from './tui.js';
|
|
10
11
|
const OPEN_CHAIN = new Set([
|
|
11
12
|
'arming', 'active', 'uncertain', 'claimed', 'cancel-pending',
|
|
12
13
|
]);
|
|
@@ -841,7 +842,7 @@ function mirror(record) {
|
|
|
841
842
|
persist(join(dir, `${record.id}.json`), record);
|
|
842
843
|
}
|
|
843
844
|
catch (e) {
|
|
844
|
-
console.error(` ⚠️ Wait 审计镜像写入失败(waitRoot 权威真值已保留): ${e.message}`);
|
|
845
|
+
console.error(err().theme.warn(` ⚠️ Wait 审计镜像写入失败(waitRoot 权威真值已保留): ${e.message}`));
|
|
845
846
|
}
|
|
846
847
|
}
|
|
847
848
|
function readJson(path) {
|
package/dist/src/waits.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"waits.js","sourceRoot":"","sources":["../../src/waits.ts"],"names":[],"mappings":"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","sourcesContent":["// 单链 Durable Wait(TypeScript source)。\n//\n// v1 只解决一件事:ask 之后,下一条来自同一 Field/tenant/conversation/actor\n// 的 DM 或直接 @,恢复原 Session 并创建新 Run。这里不实现通用 workflow/stack。\n\nimport {\n existsSync, linkSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync,\n writeFileSync,\n} from 'node:fs'\nimport { dirname, resolve, join } from 'node:path'\nimport { hostname } from 'node:os'\nimport { randomUUID } from 'node:crypto'\nimport { digest, stableStringify } from './events.js'\n\nconst OPEN_CHAIN = new Set([\n 'arming', 'active', 'uncertain', 'claimed', 'cancel-pending',\n])\nconst RESUMABLE = new Set(['active', 'uncertain'])\nconst DEFAULT_TTL_MS = 7 * 24 * 60 * 60 * 1000\n\nexport function armWait(root, cfg, input) {\n const scope = scopeFromTarget(input.fieldId, input.event, input.target)\n if (!scope) {\n throw new Error('ask 无法建立 Wait:必须有 tenant、conversation、actor,且事件是 DM 或直接 @')\n }\n const rootPath = waitRoot(root, cfg)\n const scopeHash = digest(stableStringify(scope))\n const path = join(rootPath, `${scopeHash}.json`)\n const waitId = `wait_${digest(`${input.sessionId}\\0${input.actionId}`).slice(0, 20)}`\n const history = join(rootPath, 'history', `${waitId}.json`)\n mkdirSync(rootPath, { recursive: true })\n // 旧 ask 的 Receipt 可能在同一 scope 已进入下一轮 Wait 后重放;历史记录存在时\n // 只返回原 Wait,不能用旧 Receipt 覆盖当前正在等待的新问题。\n if (existsSync(history)) {\n const recorded = readJson(history)\n assertScope(recorded, scope, scopeHash)\n if (recorded.id === waitId && recorded.actionId === input.actionId &&\n recorded.sessionId === input.sessionId) return recorded\n }\n return withLock(path, () => {\n let existing = existsSync(path) ? readJson(path) : null\n if (existing) {\n assertScope(existing, scope, scopeHash)\n existing = repairFromReceipt(root, cfg, path, existing)\n }\n if (existing?.id === waitId && existing.actionId === input.actionId) return existing\n const ownedClaim = existing?.status === 'claimed' &&\n existing.sessionId === input.sessionId &&\n existing.claim?.runId === input.sourceRunId\n if (existing && OPEN_CHAIN.has(existing.status) && !expired(existing) &&\n !ownedClaim) {\n throw new Error(\n `同一人员/会话已有未完成 Wait ${existing.id}(Session ${existing.sessionId});` +\n '单链 v1 拒绝并行追问')\n }\n if (ownedClaim) {\n persistHistory(path, {\n ...existing, status: 'continued', continuedAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n })\n }\n const now = new Date().toISOString()\n const ttl = positiveNumber(cfg.runtime?.waitTtlMs, DEFAULT_TTL_MS)\n const record = {\n $schema: 'dingtalk-agent/wait@1',\n id: waitId,\n scopeHash,\n scope,\n fieldId: input.fieldId,\n sessionId: input.sessionId,\n sessionPath: resolve(input.sessionPath),\n sourceRunId: input.sourceRunId,\n actionId: input.actionId,\n questionText: String(input.questionText || ''),\n status: 'arming',\n version: Number(existing?.version || 0) + 1,\n createdAt: now,\n updatedAt: now,\n expiresAt: new Date(Date.now() + ttl).toISOString(),\n delivery: null,\n claim: null,\n }\n persistWait(path, record)\n return record\n })\n}\n\n/** Receipt 是真值;重放 Receipt 也能幂等补齐 active/uncertain Wait。 */\nexport function reconcileWaitFromReceipt(root, cfg, wait, receipt) {\n if (!wait) return null\n if (wait.actionId !== receipt.actionId) {\n throw new Error(`Wait/Receipt actionId 不一致: ${wait.actionId}/${receipt.actionId}`)\n }\n if (wait.lastAppliedReceiptActionId === receipt.actionId) return wait\n const path = join(waitRoot(root, cfg), `${wait.scopeHash}.json`)\n return withLock(path, () => {\n if (!existsSync(path)) throw new Error(`Wait 索引丢失: ${wait.id}`)\n const current = readJson(path)\n if (current.id === wait.id && current.actionId === receipt.actionId) {\n if (current.lastAppliedReceiptActionId === receipt.actionId) return current\n const next = applyReceipt(current, receipt)\n persistWait(path, next)\n return next\n }\n // 该链可能已经进入下一轮 Wait;旧 Receipt 只补自己的历史,不得覆盖 scope head。\n const history = join(waitRoot(root, cfg), 'history', `${wait.id}.json`)\n if (!existsSync(history)) {\n throw new Error(`Wait/Receipt 身份冲突: wait=${current.id}, action=${receipt.actionId}`)\n }\n const recorded = readJson(history)\n if (recorded.id !== wait.id || recorded.actionId !== receipt.actionId) {\n throw new Error(`Wait 历史与 Receipt 身份冲突: wait=${wait.id}, action=${receipt.actionId}`)\n }\n if (recorded.lastAppliedReceiptActionId === receipt.actionId) return recorded\n const next = applyReceipt(recorded, receipt)\n persistHistory(path, next)\n return next\n })\n}\n\n/** DWS 已返回可查询结果后立即开放 Wait;平台回读可以随后完成。 */\nexport function markWaitTransportAccepted(root, cfg, wait, result) {\n if (!wait) return null\n const path = join(waitRoot(root, cfg), `${wait.scopeHash}.json`)\n return withLock(path, () => {\n if (!existsSync(path)) throw new Error(`Wait 索引丢失: ${wait.id}`)\n const current = readJson(path)\n if (current.id === wait.id) {\n const next = applyTransportResult(current, result)\n persistWait(path, next)\n return next\n }\n const history = join(waitRoot(root, cfg), 'history', `${wait.id}.json`)\n if (!existsSync(history)) throw new Error(`Wait 已被其他链替换: ${wait.id}`)\n const recorded = readJson(history)\n if (recorded.id !== wait.id || recorded.actionId !== wait.actionId) {\n throw new Error(`Wait 历史与 transport-result 身份冲突: ${wait.id}`)\n }\n const next = applyTransportResult(recorded, result)\n persistHistory(path, next)\n return next\n })\n}\n\n/** resumed Run 给出最终 reply/silence 后,释放单链 scope。 */\nexport function completeWaitFromReceipt(root, cfg, resume, receipt) {\n if (resume?.mode !== 'resume' || !resume.waitId) return null\n const rootPath = waitRoot(root, cfg)\n const historyPath = join(rootPath, 'history', `${resume.waitId}.json`)\n let recorded = existsSync(historyPath) ? readJson(historyPath) : null\n let scopeHash = recorded?.scopeHash || resume.waitScopeHash || ''\n if (!scopeHash && existsSync(rootPath)) {\n const matches = readdirSync(rootPath)\n .filter((name) => name.endsWith('.json'))\n .map((name) => readJson(join(rootPath, name)))\n .filter((candidate) => candidate.id === resume.waitId)\n if (matches.length === 1) {\n recorded = matches[0]\n scopeHash = recorded.scopeHash\n }\n }\n if (!scopeHash) throw new Error(`Wait 历史丢失且无法从 scope head 修复: ${resume.waitId}`)\n const path = join(rootPath, `${scopeHash}.json`)\n return withLock(path, () => {\n if (!recorded) {\n const current = existsSync(path) ? readJson(path) : null\n if (!current || current.id !== resume.waitId) {\n throw new Error(`Wait 历史丢失且 scope head 不匹配: ${resume.waitId}`)\n }\n recorded = current\n persistHistory(path, recorded)\n }\n const now = new Date().toISOString()\n const current = existsSync(path) ? readJson(path) : null\n if (current?.id === recorded.id) {\n if (current.status === 'cancelled') {\n persistHistory(path, current)\n return current\n }\n const next = {\n ...current,\n status: current.status === 'cancel-pending' ? 'cancel-pending' : 'completed',\n updatedAt: now, completedAt: now,\n completedByReceiptActionId: receipt.actionId,\n }\n persistWait(path, next)\n return next\n }\n const next = {\n ...recorded, status: recorded.status === 'cancelled' ? 'cancelled' : 'completed',\n updatedAt: now, completedAt: now, completedByReceiptActionId: receipt.actionId,\n }\n persistHistory(path, next)\n return next\n })\n}\n\n/**\n * 显式 /stop、/cancel 是宿主控制面:不依赖当前 Field/Behavior/Skill。\n * 先写 cancel-pending,再在线性化锁内提升 Session generation,最后写 cancelled。\n */\nexport function cancelWaitForEvent(root, cfg, event) {\n if (!isCancelCommand(event.message?.text)) return null\n const eventScope = scopeWithoutField(event)\n if (!eventScope) return null\n const rootPath = waitRoot(root, cfg)\n const replay = readEventBinding(rootPath, event.id)\n if (replay) {\n assertEventBinding(replay, event, 'cancel', eventScope)\n if (replay.outcome === 'no-match') return null\n if (replay.outcome === 'ambiguous') {\n throw new Error(`取消命中多个 Wait,已固化为 ambiguous: ${(replay.candidates || []).join(', ')}`)\n }\n return cancelBoundWait(root, cfg, event, replay)\n }\n if (!existsSync(rootPath)) {\n createNoMatchBinding(rootPath, event, 'cancel', eventScope)\n return null\n }\n const candidates: Array<{ path: string; record: Record<string, any> }> = []\n for (const name of readdirSync(rootPath)) {\n if (!name.endsWith('.json')) continue\n const path = join(rootPath, name)\n const record = readJson(path)\n const sameCancel = record.claim?.eventId === event.id &&\n record.claim?.cancelRequested === true\n if (sameEventScope(record.scope, eventScope) &&\n (OPEN_CHAIN.has(record.status) || sameCancel ||\n (record.status === 'cancelled' && record.claim?.eventId === event.id))) {\n candidates.push({ path, record })\n }\n }\n if (candidates.length > 1) {\n createNoMatchBinding(rootPath, event, 'cancel', eventScope, {\n outcome: 'ambiguous', candidates: candidates.map((x) => x.record.id).sort(),\n })\n throw new Error(`取消命中多个 Wait,拒绝猜测: ${candidates.map((x) => x.record.id).join(', ')}`)\n }\n if (!candidates.length) {\n createNoMatchBinding(rootPath, event, 'cancel', eventScope)\n return null\n }\n const { path } = candidates[0]\n const bound = withLock(path, () => {\n let current = readJson(path)\n if (!sameEventScope(current.scope, eventScope)) {\n throw new Error(`取消 Wait 作用域漂移: ${current.id}`)\n }\n current = repairFromReceipt(root, cfg, path, current)\n if (current.status === 'cancelled' && current.claim?.eventId === event.id) {\n return createEventBinding(rootPath, event, 'cancel', current)\n }\n if (!OPEN_CHAIN.has(current.status)) {\n createNoMatchBinding(rootPath, event, 'cancel', eventScope)\n return null\n }\n // 先把 head 置为 pending,再写 ledger。两者之间即使 SIGKILL,重放也会从\n // pending 的 eventId 恢复;Action 无法趁 binding→effect-lock 窗口建立 W2。\n const now = new Date().toISOString()\n const sameCancel = current.claim?.eventId === event.id &&\n current.claim?.cancelRequested === true\n ensureClaimBinding(rootPath, current)\n const pending = {\n ...current,\n status: 'cancel-pending',\n updatedAt: now,\n previousClaim: sameCancel ? current.previousClaim || null : current.claim || null,\n claim: {\n eventId: event.id, eventKind: event.kind, claimedAt: now,\n runId: '', cancelRequested: true,\n },\n }\n persistWait(path, pending)\n const binding = createEventBinding(rootPath, event, 'cancel', pending)\n return binding\n })\n return bound ? cancelBoundWait(root, cfg, event, bound) : null\n}\n\n/** Action 与 cancel 共用这一把锁;先拿到锁的一方定义副作用先后。 */\nexport function acquireSessionEffectLock(root, sessionPath) {\n const dir = resolve(root, '.dingtalk-agent/session-effect-locks')\n mkdirSync(dir, { recursive: true })\n return acquireLock(\n join(dir, `${digest(resolve(sessionPath))}.lock`), 30 * 60_000, 3 * 60_000)\n}\n\n/**\n * incoming Event 在创建新 Session 前调用。显式 sessionKey/correlation 由调用方优先处理。\n * claimed/cancelled + 同 eventId 可重入,覆盖 materialize 过程中崩溃后的恢复窗口。\n */\nexport function claimWait(root, cfg, fieldId, event) {\n const scope = scopeFromEvent(fieldId, event)\n if (!scope) return null\n const rootPath = waitRoot(root, cfg)\n const scopeHash = digest(stableStringify(scope))\n const path = join(rootPath, `${scopeHash}.json`)\n const replay = readEventBinding(rootPath, event.id)\n if (replay) {\n assertEventBinding(replay, event, 'claim', scope)\n if (replay.outcome === 'no-match') return null\n return claimBoundWait(root, cfg, event, replay)\n }\n return withLock(path, () => {\n if (!existsSync(path)) {\n createNoMatchBinding(rootPath, event, 'claim', scope)\n return null\n }\n let current = readJson(path)\n assertScope(current, scope, scopeHash)\n current = repairFromReceipt(root, cfg, path, current)\n if (current.status === 'claimed' && current.claim?.eventId === event.id &&\n current.claim?.cancelRequested !== true) {\n createEventBinding(rootPath, event, 'claim', current)\n return current\n }\n if (expired(current)) {\n ensureClaimBinding(rootPath, current)\n if (OPEN_CHAIN.has(current.status)) {\n const next = { ...current, status: 'expired', updatedAt: new Date().toISOString() }\n persistWait(path, next)\n }\n createNoMatchBinding(rootPath, event, 'claim', scope)\n return null\n }\n if (!RESUMABLE.has(current.status)) {\n createNoMatchBinding(rootPath, event, 'claim', scope)\n return null\n }\n const now = new Date().toISOString()\n const next = {\n ...current,\n status: 'claimed',\n updatedAt: now,\n claim: {\n eventId: event.id,\n eventKind: event.kind,\n claimedAt: now,\n runId: '',\n cancelRequested: false,\n },\n }\n persistWait(path, next)\n createEventBinding(rootPath, event, 'claim', next)\n return next\n })\n}\n\nexport function attachClaimedRun(root, cfg, wait, eventId, runId) {\n if (!wait) return null\n const path = join(waitRoot(root, cfg), `${wait.scopeHash}.json`)\n return withLock(path, () => {\n const loaded = readBoundWait(path, wait.id)\n if (!loaded || loaded.record.claim?.eventId !== eventId) {\n throw new Error(`Wait claim 身份冲突: wait=${wait.id}, event=${eventId}`)\n }\n const current = loaded.record\n if (current.claim.runId && current.claim.runId !== runId) {\n throw new Error(`Wait ${wait.id} 已绑定其他 Run: ${current.claim.runId}`)\n }\n if (current.claim.runId === runId) {\n // head 已写而 history 未写时,幂等重试必须顺手补齐历史真值。\n persistBoundWait(path, current, loaded.isHead)\n return current\n }\n const next = {\n ...current,\n updatedAt: new Date().toISOString(),\n claim: { ...current.claim, runId },\n }\n persistBoundWait(path, next, loaded.isHead)\n return next\n })\n}\n\nexport function waitRoot(root, cfg) {\n return resolve(root, cfg.runtime?.waitRoot || '.dingtalk-agent/waits')\n}\n\nexport function readWaitForEvent(root, cfg, fieldId, event) {\n const scope = scopeFromEvent(fieldId, event)\n if (!scope) return null\n const path = join(waitRoot(root, cfg), `${digest(stableStringify(scope))}.json`)\n return existsSync(path) ? readJson(path) : null\n}\n\nexport function isCancelCommand(text) {\n // Live canary 的合成入站必须保留唯一 marker;marker 只是证据,不应阻断\n // 随后的显式取消命令。生产消息不带 marker 时仍保持原有严格匹配。\n const value = String(text || '').trim()\n .replace(/^\\[DTA-LAB-[^\\]\\n]+\\]\\s*/u, '')\n return /^\\/(?:stop|cancel|停止|取消)$/i.test(value)\n}\n\n/** eventId 一旦绑定 Wait,重放永远解析原 Wait,不能重新扫描当前 scope head。 */\nfunction createEventBinding(rootPath, event, operation, wait) {\n const path = eventBindingPath(rootPath, event.id)\n const binding = {\n $schema: 'dingtalk-agent/wait-event-binding@1',\n eventId: event.id,\n eventKind: event.kind,\n operation,\n outcome: 'matched',\n waitId: wait.id,\n scopeHash: wait.scopeHash,\n scope: wait.scope,\n fieldId: wait.fieldId,\n sessionId: wait.sessionId,\n sessionPath: wait.sessionPath,\n sourceRunId: wait.sourceRunId,\n actionId: wait.actionId,\n boundAt: new Date().toISOString(),\n }\n if (!writeJsonCreateAtomic(path, binding)) {\n const existing = readJson(path)\n if (stableStringify(bindingIdentity(existing)) !== stableStringify(bindingIdentity(binding))) {\n throw new Error(`Event ${event.id} 已绑定其他 Wait,拒绝 ABA 重解释`)\n }\n return existing\n }\n return binding\n}\n\nfunction createNoMatchBinding(\n rootPath,\n event,\n operation,\n scope,\n options: Record<string, any> = {},\n) {\n const path = eventBindingPath(rootPath, event.id)\n const binding = {\n $schema: 'dingtalk-agent/wait-event-binding@1',\n eventId: event.id,\n eventKind: event.kind,\n operation,\n outcome: options.outcome || 'no-match',\n candidates: options.candidates || [],\n waitId: '',\n scopeHash: digest(stableStringify(scope)),\n scope,\n fieldId: '',\n sessionId: '',\n sessionPath: '',\n sourceRunId: '',\n actionId: '',\n boundAt: new Date().toISOString(),\n }\n if (!writeJsonCreateAtomic(path, binding)) {\n const existing = readJson(path)\n if (stableStringify(bindingIdentity(existing)) !== stableStringify(bindingIdentity(binding))) {\n throw new Error(`Event ${event.id} 的 Wait 路由决策已固化,拒绝重新解释`)\n }\n return existing\n }\n return binding\n}\n\nfunction readEventBinding(rootPath, eventId) {\n const path = eventBindingPath(rootPath, eventId)\n return existsSync(path) ? readJson(path) : null\n}\n\nfunction eventBindingPath(rootPath, eventId) {\n return join(rootPath, 'events', `${digest(eventId)}.json`)\n}\n\nfunction bindingIdentity(value) {\n return {\n eventId: value.eventId,\n eventKind: value.eventKind,\n operation: value.operation,\n outcome: value.outcome,\n candidates: value.candidates || [],\n waitId: value.waitId,\n scopeHash: value.scopeHash,\n scope: value.scope,\n fieldId: value.fieldId,\n sessionId: value.sessionId,\n sessionPath: value.sessionPath,\n sourceRunId: value.sourceRunId,\n actionId: value.actionId,\n }\n}\n\nfunction assertEventBinding(binding, event, operation, expectedScope) {\n if (binding.eventId !== event.id || binding.eventKind !== event.kind ||\n binding.operation !== operation) {\n throw new Error(`Event ${event.id} 的 Wait binding 类型冲突`)\n }\n const scopeMatches = operation === 'cancel'\n ? sameEventScope(binding.scope, expectedScope)\n : stableStringify(binding.scope) === stableStringify(expectedScope)\n if (!scopeMatches || binding.scopeHash !== digest(stableStringify(binding.scope))) {\n throw new Error(`Event ${event.id} 的 Wait binding 作用域漂移`)\n }\n}\n\nfunction assertWaitBinding(record, binding) {\n const actual = {\n waitId: record.id,\n scopeHash: record.scopeHash,\n fieldId: record.fieldId,\n sessionId: record.sessionId,\n sessionPath: record.sessionPath,\n sourceRunId: record.sourceRunId,\n actionId: record.actionId,\n }\n const expected = {\n waitId: binding.waitId,\n scopeHash: binding.scopeHash,\n fieldId: binding.fieldId,\n sessionId: binding.sessionId,\n sessionPath: binding.sessionPath,\n sourceRunId: binding.sourceRunId,\n actionId: binding.actionId,\n }\n if (stableStringify(actual) !== stableStringify(expected)) {\n throw new Error(`Wait event binding 身份漂移: ${binding.waitId}`)\n }\n}\n\nfunction cancelBoundWait(root, cfg, event, binding) {\n const path = join(waitRoot(root, cfg), `${binding.scopeHash}.json`)\n let pending = withLock(path, () => {\n const loaded = readBoundWait(path, binding.waitId)\n if (!loaded) throw new Error(`取消绑定的 Wait 不存在: ${binding.waitId}`)\n let current = loaded.record\n assertWaitBinding(current, binding)\n if (loaded.isHead) current = repairFromReceipt(root, cfg, path, current)\n if (current.status === 'cancelled' && current.claim?.eventId === event.id) return current\n if (['cancel-pending', 'cancelled'].includes(current.status) &&\n current.claim?.cancelRequested === true && current.claim?.eventId !== event.id) {\n // 两个 stop 同时到达时只让先行者提升 generation;后来者成为同 Session 的安全 no-op。\n return suppressedClaim(current, event.id)\n }\n const sameCancel = current.claim?.eventId === event.id &&\n current.claim?.cancelRequested === true\n if (!OPEN_CHAIN.has(current.status) && !sameCancel) {\n throw new Error(`取消绑定的 Wait 已进入 ${current.status}: ${binding.waitId}`)\n }\n const now = new Date().toISOString()\n ensureClaimBinding(waitRoot(root, cfg), current)\n const next = {\n ...current,\n status: 'cancel-pending',\n updatedAt: now,\n previousClaim: sameCancel ? current.previousClaim || null : current.claim || null,\n claim: {\n eventId: event.id, eventKind: event.kind, claimedAt: now,\n runId: '', cancelRequested: true,\n },\n }\n persistBoundWait(path, next, loaded.isHead)\n return next\n })\n\n if (pending.suppressed) return pending\n applyCancelFence(root, pending, event.id)\n pending = withLock(path, () => {\n const loaded = readBoundWait(path, binding.waitId)\n if (!loaded) throw new Error(`取消完成时 Wait 丢失: ${binding.waitId}`)\n const current = loaded.record\n assertWaitBinding(current, binding)\n if (current.claim?.eventId !== event.id) {\n throw new Error(`取消 Wait 身份漂移: ${binding.waitId}`)\n }\n if (current.status === 'cancelled') {\n persistBoundWait(path, current, loaded.isHead)\n return current\n }\n const next = { ...current, status: 'cancelled', updatedAt: new Date().toISOString() }\n persistBoundWait(path, next, loaded.isHead)\n return next\n })\n return pending\n}\n\nfunction claimBoundWait(root, cfg, event, binding) {\n const path = join(waitRoot(root, cfg), `${binding.scopeHash}.json`)\n return withLock(path, () => {\n const loaded = readBoundWait(path, binding.waitId)\n if (!loaded) throw new Error(`回复绑定的 Wait 不存在: ${binding.waitId}`)\n let current = loaded.record\n assertWaitBinding(current, binding)\n if (loaded.isHead) current = repairFromReceipt(root, cfg, path, current)\n if (current.status === 'claimed' && current.claim?.eventId === event.id) {\n if (!loaded.isHead) throw new Error(`已 claim 的 Wait 不再是 scope head: ${binding.waitId}`)\n return current\n }\n if (['cancel-pending', 'cancelled'].includes(current.status) &&\n current.claim?.cancelRequested === true) {\n return suppressedClaim(current, event.id)\n }\n if (!loaded.isHead || !RESUMABLE.has(current.status) || expired(current)) {\n throw new Error(`回复事件已绑定 Wait ${binding.waitId},但当前状态为 ${current.status};拒绝回退成新事项`)\n }\n const now = new Date().toISOString()\n const next = {\n ...current,\n status: 'claimed',\n updatedAt: now,\n claim: {\n eventId: event.id, eventKind: event.kind, claimedAt: now,\n runId: '', cancelRequested: false,\n },\n }\n persistWait(path, next)\n return next\n })\n}\n\nfunction suppressedClaim(record, eventId) {\n const cancelEventId = record.claim?.eventId || ''\n return {\n ...record,\n suppressed: true,\n cancelEventId,\n claim: {\n eventId,\n claimedAt: new Date().toISOString(),\n runId: '',\n cancelRequested: true,\n supersededByEventId: cancelEventId,\n },\n }\n}\n\nfunction ensureClaimBinding(rootPath, record) {\n const claim = record.claim?.cancelRequested !== true\n ? record.claim\n : record.previousClaim?.cancelRequested !== true ? record.previousClaim : null\n if (!claim?.eventId) return null\n if (!claim.eventKind) {\n throw new Error(`Wait ${record.id} 的 claim 缺少 eventKind,无法安全修复 event ledger`)\n }\n return createEventBinding(rootPath, {\n id: claim.eventId,\n kind: claim.eventKind,\n }, 'claim', record)\n}\n\nfunction readBoundWait(scopePath, waitId) {\n if (existsSync(scopePath)) {\n const current = readJson(scopePath)\n if (current.id === waitId) return { record: current, isHead: true }\n }\n const history = join(dirname(scopePath), 'history', `${waitId}.json`)\n return existsSync(history) ? { record: readJson(history), isHead: false } : null\n}\n\nfunction persistBoundWait(scopePath, record, isHead) {\n if (isHead) persistWait(scopePath, record)\n else persistHistory(scopePath, record)\n}\n\nfunction scopeFromTarget(fieldId, event, target) {\n if (!['im.message.dm', 'im.message.mentioned'].includes(event.kind)) return null\n return completeScope({\n fieldId,\n tenantId: target?.tenantId || event.tenant?.id,\n conversationId: target?.conversationId || event.conversation?.id,\n actorId: target?.senderOpenDingTalkId || event.actor?.openDingTalkId,\n })\n}\n\nfunction scopeFromEvent(fieldId, event) {\n if (!['im.message.dm', 'im.message.mentioned'].includes(event.kind)) return null\n return completeScope({\n fieldId,\n tenantId: event.tenant?.id,\n conversationId: event.conversation?.id,\n actorId: event.actor?.openDingTalkId,\n })\n}\n\nfunction scopeWithoutField(event) {\n if (!['im.message.dm', 'im.message.mentioned'].includes(event.kind)) return null\n return completeScope({\n tenantId: event.tenant?.id,\n conversationId: event.conversation?.id,\n actorId: event.actor?.openDingTalkId,\n })\n}\n\nfunction sameEventScope(scope, expected) {\n return scope?.tenantId === expected.tenantId &&\n scope?.conversationId === expected.conversationId &&\n scope?.actorId === expected.actorId\n}\n\nfunction completeScope(value) {\n const scope = Object.fromEntries(Object.entries(value).map(([k, v]) => [k, String(v || '').trim()]))\n return Object.values(scope).every(Boolean) ? scope : null\n}\n\nfunction assertScope(record, scope, scopeHash) {\n if (record.scopeHash !== scopeHash || stableStringify(record.scope) !== stableStringify(scope)) {\n throw new Error(`Wait scope hash 碰撞或内容漂移: ${scopeHash}`)\n }\n}\n\nfunction expired(record) {\n const deadline = Date.parse(record.expiresAt || '')\n return Number.isFinite(deadline) && deadline <= Date.now()\n}\n\nfunction positiveNumber(value, fallback) {\n const n = Number(value)\n return Number.isFinite(n) && n > 0 ? n : fallback\n}\n\nfunction applyReceipt(record, receipt) {\n const keepLifecycle = new Set([\n 'claimed', 'cancel-pending', 'cancelled', 'completed', 'continued', 'expired',\n ]).has(record.status)\n const transportAccepted = Boolean(record.delivery?.transportAccepted)\n return {\n ...record,\n status: keepLifecycle\n ? record.status\n : (receipt.outcome === 'uncertain' && !transportAccepted ? 'uncertain' : 'active'),\n updatedAt: new Date().toISOString(),\n lastAppliedReceiptActionId: receipt.actionId,\n delivery: {\n ...(record.delivery || {}),\n outcome: receipt.outcome,\n verified: Boolean(receipt.verified),\n verification: receipt.verification || '',\n questionMessageId: findValue(\n receipt, ['openMessageId', 'openMsgId', 'open_message_id']) ||\n record.delivery?.questionMessageId || '',\n },\n }\n}\n\nfunction applyTransportResult(record, result) {\n return {\n ...record,\n status: record.status === 'arming' || record.status === 'uncertain'\n ? 'active' : record.status,\n updatedAt: new Date().toISOString(),\n delivery: {\n ...(record.delivery || {}),\n transportAccepted: true,\n questionMessageId: findValue(result,\n ['openMessageId', 'openMsgId', 'open_message_id']) ||\n record.delivery?.questionMessageId || '',\n },\n }\n}\n\n/** 在 incoming Event 路由时修复 Receipt/transport-result 已落盘但 Wait 仍 arming 的窗口。 */\nfunction repairFromReceipt(root, cfg, path, record) {\n if (record.status !== 'arming') return record\n const actionPath = join(\n resolve(root, cfg.runtime?.eventIndexRoot || '.dingtalk-agent/event-index'),\n 'actions', record.sourceRunId, record.actionId)\n const receiptPath = join(actionPath, 'receipt.json')\n const resultPath = join(actionPath, 'transport-result.json')\n if (!existsSync(receiptPath) && !existsSync(resultPath)) return record\n\n const receipt = existsSync(receiptPath) ? readJson(receiptPath) : null\n const result = existsSync(resultPath) ? readJson(resultPath) : null\n const next = {\n ...record,\n status: (result || receipt?.outcome !== 'uncertain') ? 'active' : 'uncertain',\n updatedAt: new Date().toISOString(),\n lastAppliedReceiptActionId: receipt?.actionId || record.lastAppliedReceiptActionId,\n delivery: {\n ...(record.delivery || {}),\n transportAccepted: Boolean(result),\n outcome: receipt?.outcome || 'transport-accepted',\n verified: Boolean(receipt?.verified),\n verification: receipt?.verification || '',\n questionMessageId: findValue(receipt,\n ['openMessageId', 'openMsgId', 'open_message_id']) ||\n findValue(result, ['openMessageId', 'openMsgId', 'open_message_id']) ||\n record.delivery?.questionMessageId || '',\n },\n }\n persistWait(path, next)\n return next\n}\n\nfunction applyCancelFence(root, wait, eventId) {\n const releaseEffect = acquireSessionEffectLock(root, wait.sessionPath)\n try {\n const lockRoot = resolve(root, '.dingtalk-agent/session-locks')\n mkdirSync(lockRoot, { recursive: true })\n const releaseState = acquireLock(\n join(lockRoot, `${digest(resolve(wait.sessionPath))}.lock`), 2 * 60_000)\n try {\n const sessionPath = join(resolve(wait.sessionPath), 'session.json')\n if (!existsSync(sessionPath)) throw new Error(`取消目标 Session 不存在: ${wait.sessionId}`)\n const session = readJson(sessionPath)\n if (session.id !== wait.sessionId || session.fieldId !== wait.fieldId) {\n throw new Error(`取消目标 Session 身份不一致: ${wait.sessionId}`)\n }\n if (session.lastCancelEventId === eventId) return\n const generation = validGeneration(session.generation)\n persist(sessionPath, {\n ...session,\n generation: generation + 1,\n lastCancelEventId: eventId,\n cancelledAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n })\n } finally {\n releaseState()\n }\n } finally {\n releaseEffect()\n }\n}\n\nfunction validGeneration(value) {\n const n = Number(value ?? 1)\n if (!Number.isInteger(n) || n < 1) throw new Error('Session generation 非法,拒绝取消')\n return n\n}\n\nfunction persist(path, value) {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.${process.pid}.${Date.now()}.${randomUUID()}.tmp`\n writeFileSync(temp, JSON.stringify(value, null, 2) + '\\n', { flag: 'wx' })\n renameSync(temp, path)\n}\n\nfunction writeJsonCreateAtomic(path, value) {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.${process.pid}.${Date.now()}.${randomUUID()}.tmp`\n writeFileSync(temp, JSON.stringify(value, null, 2) + '\\n', { flag: 'wx' })\n try {\n linkSync(temp, path)\n return true\n } catch (e) {\n if (e.code === 'EEXIST') return false\n throw e\n } finally {\n rmSync(temp, { force: true })\n }\n}\n\nfunction persistWait(scopePath, record) {\n persist(scopePath, record)\n persistHistory(scopePath, record)\n}\n\nfunction persistHistory(scopePath, record) {\n persist(join(dirname(scopePath), 'history', `${record.id}.json`), record)\n mirror(record)\n}\n\nfunction mirror(record) {\n try {\n const dir = join(record.sessionPath, 'waits')\n mkdirSync(dir, { recursive: true })\n persist(join(dir, `${record.id}.json`), record)\n } catch (e) {\n console.error(` ⚠️ Wait 审计镜像写入失败(waitRoot 权威真值已保留): ${e.message}`)\n }\n}\n\nfunction readJson(path) {\n return JSON.parse(readFileSync(path, 'utf8'))\n}\n\nconst LOCK_HOST = hostname()\nconst sleep = (ms) => Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms)\n\nfunction withLock(path, fn) {\n const lockPath = `${path}.lock`\n mkdirSync(dirname(path), { recursive: true })\n const release = acquireLock(lockPath)\n try { return fn() } finally { release() }\n}\n\nfunction acquireLock(path, staleAfterMs = 60_000, waitMs = 5_000) {\n const token = randomUUID()\n const deadline = Date.now() + waitMs\n while (true) {\n try {\n mkdirSync(path)\n try {\n persist(join(path, 'owner.json'), {\n token, pid: process.pid, host: LOCK_HOST, acquiredAt: new Date().toISOString(),\n })\n } catch (e) {\n rmSync(path, { recursive: true, force: true })\n throw e\n }\n return () => {\n try {\n const owner = readJson(join(path, 'owner.json'))\n if (owner.token === token) rmSync(path, { recursive: true, force: true })\n } catch {}\n }\n } catch (e) {\n if (e.code !== 'EEXIST') throw e\n if (staleLock(path, staleAfterMs)) {\n const tomb = `${path}.stale.${process.pid}.${randomUUID()}`\n try {\n renameSync(path, tomb)\n rmSync(tomb, { recursive: true, force: true })\n continue\n } catch (moveError) {\n if (moveError.code === 'ENOENT' || moveError.code === 'EEXIST') continue\n throw moveError\n }\n }\n if (Date.now() >= deadline) throw new Error(`Wait 正在被其他事件更新: ${path}`)\n sleep(50)\n }\n }\n}\n\nfunction staleLock(path, staleAfterMs) {\n let age\n try { age = Date.now() - statSync(path).mtimeMs } catch { return true }\n let owner\n try { owner = readJson(join(path, 'owner.json')) } catch {}\n if (!owner) return age >= 2_000\n if (owner.host === LOCK_HOST && Number.isInteger(Number(owner.pid))) {\n try { process.kill(Number(owner.pid), 0); return false }\n catch (e) { if (e.code === 'ESRCH') return true }\n }\n return age >= staleAfterMs\n}\n\nfunction findValue(value, keys) {\n if (!value || typeof value !== 'object') return ''\n for (const key of keys) if (value[key]) return String(value[key])\n for (const child of Object.values(value)) {\n const found = findValue(child, keys)\n if (found) return found\n }\n return ''\n}\n"]}
|
|
1
|
+
{"version":3,"file":"waits.js","sourceRoot":"","sources":["../../src/waits.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,EAAE;AACF,2DAA2D;AAC3D,0DAA0D;AAE1D,OAAO,EACL,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EACxF,aAAa,GACd,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAE9B,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACzB,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB;CAC7D,CAAC,CAAA;AACF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAA;AAClD,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AAE9C,MAAM,UAAU,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK;IACtC,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;IACvE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAA;IAC9E,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IACpC,MAAM,SAAS,GAAG,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAA;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,SAAS,OAAO,CAAC,CAAA;IAChD,MAAM,MAAM,GAAG,QAAQ,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAA;IACrF,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC,CAAA;IAC3D,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACxC,sDAAsD;IACtD,uCAAuC;IACvC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;QAClC,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;QACvC,IAAI,QAAQ,CAAC,EAAE,KAAK,MAAM,IAAI,QAAQ,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ;YAC9D,QAAQ,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;YAAE,OAAO,QAAQ,CAAA;IAC7D,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE;QACzB,IAAI,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACvD,IAAI,QAAQ,EAAE,CAAC;YACb,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;YACvC,QAAQ,GAAG,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;QACzD,CAAC;QACD,IAAI,QAAQ,EAAE,EAAE,KAAK,MAAM,IAAI,QAAQ,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ;YAAE,OAAO,QAAQ,CAAA;QACpF,MAAM,UAAU,GAAG,QAAQ,EAAE,MAAM,KAAK,SAAS;YAC/C,QAAQ,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;YACtC,QAAQ,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,WAAW,CAAA;QAC7C,IAAI,QAAQ,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;YACjE,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CACb,qBAAqB,QAAQ,CAAC,EAAE,YAAY,QAAQ,CAAC,SAAS,IAAI;gBAClE,cAAc,CAAC,CAAA;QACnB,CAAC;QACD,IAAI,UAAU,EAAE,CAAC;YACf,cAAc,CAAC,IAAI,EAAE;gBACnB,GAAG,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACvE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAA;QACJ,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QACpC,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,cAAc,CAAC,CAAA;QAClE,MAAM,MAAM,GAAG;YACb,OAAO,EAAE,uBAAuB;YAChC,EAAE,EAAE,MAAM;YACV,SAAS;YACT,KAAK;YACL,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;YACvC,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC;YAC9C,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC;YAC3C,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE;YACnD,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,IAAI;SACZ,CAAA;QACD,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QACzB,OAAO,MAAM,CAAA;IACf,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,wBAAwB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO;IAC/D,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;IACpF,CAAC;IACD,IAAI,IAAI,CAAC,0BAA0B,KAAK,OAAO,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAA;IACrE,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,OAAO,CAAC,CAAA;IAChE,OAAO,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE;QACzB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;QAC/D,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC9B,IAAI,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;YACpE,IAAI,OAAO,CAAC,0BAA0B,KAAK,OAAO,CAAC,QAAQ;gBAAE,OAAO,OAAO,CAAA;YAC3E,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAC3C,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YACvB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,sDAAsD;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;QACvE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,CAAC,EAAE,YAAY,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;QACtF,CAAC;QACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;QAClC,IAAI,QAAQ,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI,QAAQ,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,CAAC,EAAE,YAAY,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;QACvF,CAAC;QACD,IAAI,QAAQ,CAAC,0BAA0B,KAAK,OAAO,CAAC,QAAQ;YAAE,OAAO,QAAQ,CAAA;QAC7E,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC5C,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC1B,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,yBAAyB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM;IAC/D,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,OAAO,CAAC,CAAA;IAChE,OAAO,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE;QACzB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;QAC/D,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC9B,IAAI,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAClD,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YACvB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;QACvE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;QACrE,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;QAClC,IAAI,QAAQ,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;QAC/D,CAAC;QACD,MAAM,IAAI,GAAG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QACnD,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC1B,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,uBAAuB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO;IAChE,IAAI,MAAM,EAAE,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAC5D,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IACpC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,MAAM,OAAO,CAAC,CAAA;IACtE,IAAI,QAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACrE,IAAI,SAAS,GAAG,QAAQ,EAAE,SAAS,IAAI,MAAM,CAAC,aAAa,IAAI,EAAE,CAAA;IACjE,IAAI,CAAC,SAAS,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC;aAClC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aACxC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;aAC7C,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,CAAA;QACxD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;YACrB,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAA;QAChC,CAAC;IACH,CAAC;IACD,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;IAChF,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,SAAS,OAAO,CAAC,CAAA;IAChD,OAAO,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE;QACzB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YACxD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,EAAE,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC7C,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;YAChE,CAAC;YACD,QAAQ,GAAG,OAAO,CAAA;YAClB,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QAChC,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QACpC,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACxD,IAAI,OAAO,EAAE,EAAE,KAAK,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChC,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACnC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;gBAC7B,OAAO,OAAO,CAAA;YAChB,CAAC;YACD,MAAM,IAAI,GAAG;gBACX,GAAG,OAAO;gBACV,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,WAAW;gBAC5E,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG;gBAChC,0BAA0B,EAAE,OAAO,CAAC,QAAQ;aAC7C,CAAA;YACD,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YACvB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,IAAI,GAAG;YACX,GAAG,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW;YAChF,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,0BAA0B,EAAE,OAAO,CAAC,QAAQ;SAC/E,CAAA;QACD,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC1B,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK;IACjD,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IACtD,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;IAC3C,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAA;IAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IACpC,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;IACnD,IAAI,MAAM,EAAE,CAAC;QACX,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;QACvD,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU;YAAE,OAAO,IAAI,CAAA;QAC9C,IAAI,MAAM,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACxF,CAAC;QACD,OAAO,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IAClD,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,oBAAoB,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;QAC3D,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,UAAU,GAAyD,EAAE,CAAA;IAC3E,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAQ;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC7B,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,CAAC,EAAE;YACnD,MAAM,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAA;QACxC,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC;YACxC,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,UAAU;gBAC1C,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC7E,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;QACnC,CAAC;IACH,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,oBAAoB,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE;YAC1D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE;SAC5E,CAAC,CAAA;QACF,MAAM,IAAI,KAAK,CAAC,qBAAqB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACvF,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QACvB,oBAAoB,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;QAC3D,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;IAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE;QAChC,IAAI,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC5B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,kBAAkB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;QACjD,CAAC;QACD,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;QACrD,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,CAAC,EAAE,EAAE,CAAC;YAC1E,OAAO,kBAAkB,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC/D,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,oBAAoB,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;YAC3D,OAAO,IAAI,CAAA;QACb,CAAC;QACD,oDAAoD;QACpD,+DAA+D;QAC/D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QACpC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,CAAC,EAAE;YACpD,OAAO,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAA;QACzC,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QACrC,MAAM,OAAO,GAAG;YACd,GAAG,OAAO;YACV,MAAM,EAAE,gBAAgB;YACxB,SAAS,EAAE,GAAG;YACd,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI;YACjF,KAAK,EAAE;gBACL,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG;gBACxD,KAAK,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI;aACjC;SACF,CAAA;QACD,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAC1B,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;QACtE,OAAO,OAAO,CAAA;IAChB,CAAC,CAAC,CAAA;IACF,OAAO,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAChE,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,wBAAwB,CAAC,IAAI,EAAE,WAAW;IACxD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,sCAAsC,CAAC,CAAA;IACjE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACnC,OAAO,WAAW,CAChB,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,CAAA;AAC/E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK;IACjD,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAC5C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IACvB,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IACpC,MAAM,SAAS,GAAG,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAA;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,SAAS,OAAO,CAAC,CAAA;IAChD,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;IACnD,IAAI,MAAM,EAAE,CAAC;QACX,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;QACjD,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU;YAAE,OAAO,IAAI,CAAA;QAC9C,OAAO,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IACjD,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE;QACzB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,oBAAoB,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;YACrD,OAAO,IAAI,CAAA;QACb,CAAC;QACD,IAAI,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC5B,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;QACtC,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;QACrD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,CAAC,EAAE;YACnE,OAAO,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,EAAE,CAAC;YAC5C,kBAAkB,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;YACrD,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACrB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YACrC,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAA;gBACnF,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YACzB,CAAC;YACD,oBAAoB,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;YACrD,OAAO,IAAI,CAAA;QACb,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,oBAAoB,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;YACrD,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QACpC,MAAM,IAAI,GAAG;YACX,GAAG,OAAO;YACV,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,GAAG;YACd,KAAK,EAAE;gBACL,OAAO,EAAE,KAAK,CAAC,EAAE;gBACjB,SAAS,EAAE,KAAK,CAAC,IAAI;gBACrB,SAAS,EAAE,GAAG;gBACd,KAAK,EAAE,EAAE;gBACT,eAAe,EAAE,KAAK;aACvB;SACF,CAAA;QACD,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACvB,kBAAkB,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;QAClD,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK;IAC9D,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,OAAO,CAAC,CAAA;IAChE,OAAO,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE;QACzB,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;QAC3C,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,EAAE,WAAW,OAAO,EAAE,CAAC,CAAA;QACvE,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAA;QAC7B,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,EAAE,eAAe,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA;QACtE,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YAClC,uCAAuC;YACvC,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;YAC9C,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,MAAM,IAAI,GAAG;YACX,GAAG,OAAO;YACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE;SACnC,CAAA;QACD,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;QAC3C,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAI,EAAE,GAAG;IAChC,OAAO,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,IAAI,uBAAuB,CAAC,CAAA;AACxE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK;IACxD,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAC5C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IACvB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAA;IAChF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AACjD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAI;IAClC,kDAAkD;IAClD,sCAAsC;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;SACpC,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAA;IAC3C,OAAO,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AACjD,CAAC;AAED,0DAA0D;AAC1D,SAAS,kBAAkB,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI;IAC1D,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;IACjD,MAAM,OAAO,GAAG;QACd,OAAO,EAAE,qCAAqC;QAC9C,OAAO,EAAE,KAAK,CAAC,EAAE;QACjB,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,SAAS;QACT,OAAO,EAAE,SAAS;QAClB,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAClC,CAAA;IACD,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC/B,IAAI,eAAe,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,KAAK,eAAe,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAC7F,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,CAAC,EAAE,wBAAwB,CAAC,CAAA;QAC5D,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,SAAS,oBAAoB,CAC3B,QAAQ,EACR,KAAK,EACL,SAAS,EACT,KAAK,EACL,UAA+B,EAAE;IAEjC,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;IACjD,MAAM,OAAO,GAAG;QACd,OAAO,EAAE,qCAAqC;QAC9C,OAAO,EAAE,KAAK,CAAC,EAAE;QACjB,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,SAAS;QACT,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,UAAU;QACtC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;QACpC,MAAM,EAAE,EAAE;QACV,SAAS,EAAE,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACzC,KAAK;QACL,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,EAAE;QACb,WAAW,EAAE,EAAE;QACf,WAAW,EAAE,EAAE;QACf,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAClC,CAAA;IACD,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC/B,IAAI,eAAe,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,KAAK,eAAe,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAC7F,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,CAAC,EAAE,wBAAwB,CAAC,CAAA;QAC5D,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAQ,EAAE,OAAO;IACzC,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAChD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AACjD,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAQ,EAAE,OAAO;IACzC,OAAO,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;AAC5D,CAAC;AAED,SAAS,eAAe,CAAC,KAAK;IAC5B,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;QAClC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAA;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa;IAClE,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC,EAAE,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,IAAI;QAChE,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,CAAC,EAAE,sBAAsB,CAAC,CAAA;IAC1D,CAAC;IACD,MAAM,YAAY,GAAG,SAAS,KAAK,QAAQ;QACzC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC;QAC9C,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,eAAe,CAAC,aAAa,CAAC,CAAA;IACrE,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,SAAS,KAAK,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,CAAC,EAAE,uBAAuB,CAAC,CAAA;IAC3D,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAM,EAAE,OAAO;IACxC,MAAM,MAAM,GAAG;QACb,MAAM,EAAE,MAAM,CAAC,EAAE;QACjB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAA;IACD,MAAM,QAAQ,GAAG;QACf,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAA;IACD,IAAI,eAAe,CAAC,MAAM,CAAC,KAAK,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,4BAA4B,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAC/D,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC,SAAS,OAAO,CAAC,CAAA;IACnE,IAAI,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE;QAChC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;QAClD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;QACjE,IAAI,OAAO,GAAG,MAAM,CAAC,MAAM,CAAA;QAC3B,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACnC,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;QACxE,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,CAAC,EAAE;YAAE,OAAO,OAAO,CAAA;QACzF,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;YACxD,OAAO,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,CAAC,EAAE,EAAE,CAAC;YACnF,4DAA4D;YAC5D,OAAO,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;QAC3C,CAAC;QACD,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,CAAC,EAAE;YACpD,OAAO,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAA;QACzC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,kBAAkB,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;QACxE,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QACpC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAA;QAChD,MAAM,IAAI,GAAG;YACX,GAAG,OAAO;YACV,MAAM,EAAE,gBAAgB;YACxB,SAAS,EAAE,GAAG;YACd,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI;YACjF,KAAK,EAAE;gBACL,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG;gBACxD,KAAK,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI;aACjC;SACF,CAAA;QACD,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;QAC3C,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IAEF,IAAI,OAAO,CAAC,UAAU;QAAE,OAAO,OAAO,CAAA;IACtC,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;IACzC,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE;QAC5B,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;QAClD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;QAChE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAA;QAC7B,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACnC,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,iBAAiB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;QACpD,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACnC,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;YAC9C,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAA;QACrF,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;QAC3C,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC,SAAS,OAAO,CAAC,CAAA;IACnE,OAAO,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE;QACzB,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;QAClD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;QACjE,IAAI,OAAO,GAAG,MAAM,CAAC,MAAM,CAAA;QAC3B,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACnC,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;QACxE,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,CAAC,EAAE,EAAE,CAAC;YACxE,IAAI,CAAC,MAAM,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;YACvF,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;YACxD,OAAO,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,EAAE,CAAC;YAC5C,OAAO,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;QAC3C,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACzE,MAAM,IAAI,KAAK,CAAC,gBAAgB,OAAO,CAAC,MAAM,WAAW,OAAO,CAAC,MAAM,WAAW,CAAC,CAAA;QACrF,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QACpC,MAAM,IAAI,GAAG;YACX,GAAG,OAAO;YACV,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,GAAG;YACd,KAAK,EAAE;gBACL,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG;gBACxD,KAAK,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK;aAClC;SACF,CAAA;QACD,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACvB,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,MAAM,EAAE,OAAO;IACtC,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,CAAA;IACjD,OAAO;QACL,GAAG,MAAM;QACT,UAAU,EAAE,IAAI;QAChB,aAAa;QACb,KAAK,EAAE;YACL,OAAO;YACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK,EAAE,EAAE;YACT,eAAe,EAAE,IAAI;YACrB,mBAAmB,EAAE,aAAa;SACnC;KACF,CAAA;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAQ,EAAE,MAAM;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI;QAClD,CAAC,CAAC,MAAM,CAAC,KAAK;QACd,CAAC,CAAC,MAAM,CAAC,aAAa,EAAE,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAA;IAChF,IAAI,CAAC,KAAK,EAAE,OAAO;QAAE,OAAO,IAAI,CAAA;IAChC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,QAAQ,MAAM,CAAC,EAAE,2CAA2C,CAAC,CAAA;IAC/E,CAAC;IACD,OAAO,kBAAkB,CAAC,QAAQ,EAAE;QAClC,EAAE,EAAE,KAAK,CAAC,OAAO;QACjB,IAAI,EAAE,KAAK,CAAC,SAAS;KACtB,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;AACrB,CAAC;AAED,SAAS,aAAa,CAAC,SAAS,EAAE,MAAM;IACtC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAA;QACnC,IAAI,OAAO,CAAC,EAAE,KAAK,MAAM;YAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;IACrE,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC,CAAA;IACrE,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AAClF,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM;IACjD,IAAI,MAAM;QAAE,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;;QACrC,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;AACxC,CAAC;AAED,SAAS,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM;IAC7C,IAAI,CAAC,CAAC,eAAe,EAAE,sBAAsB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IAChF,OAAO,aAAa,CAAC;QACnB,OAAO;QACP,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE;QAC9C,cAAc,EAAE,MAAM,EAAE,cAAc,IAAI,KAAK,CAAC,YAAY,EAAE,EAAE;QAChE,OAAO,EAAE,MAAM,EAAE,oBAAoB,IAAI,KAAK,CAAC,KAAK,EAAE,cAAc;KACrE,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,OAAO,EAAE,KAAK;IACpC,IAAI,CAAC,CAAC,eAAe,EAAE,sBAAsB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IAChF,OAAO,aAAa,CAAC;QACnB,OAAO;QACP,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE;QAC1B,cAAc,EAAE,KAAK,CAAC,YAAY,EAAE,EAAE;QACtC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,cAAc;KACrC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAK;IAC9B,IAAI,CAAC,CAAC,eAAe,EAAE,sBAAsB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IAChF,OAAO,aAAa,CAAC;QACnB,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE;QAC1B,cAAc,EAAE,KAAK,CAAC,YAAY,EAAE,EAAE;QACtC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,cAAc;KACrC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAK,EAAE,QAAQ;IACrC,OAAO,KAAK,EAAE,QAAQ,KAAK,QAAQ,CAAC,QAAQ;QAC1C,KAAK,EAAE,cAAc,KAAK,QAAQ,CAAC,cAAc;QACjD,KAAK,EAAE,OAAO,KAAK,QAAQ,CAAC,OAAO,CAAA;AACvC,CAAC;AAED,SAAS,aAAa,CAAC,KAAK;IAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IACpG,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;AAC3D,CAAC;AAED,SAAS,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS;IAC3C,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/F,MAAM,IAAI,KAAK,CAAC,4BAA4B,SAAS,EAAE,CAAC,CAAA;IAC1D,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,MAAM;IACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAA;IACnD,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,CAAA;AAC5D,CAAC;AAED,SAAS,cAAc,CAAC,KAAK,EAAE,QAAQ;IACrC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IACvB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;AACnD,CAAC;AAED,SAAS,YAAY,CAAC,MAAM,EAAE,OAAO;IACnC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;QAC5B,SAAS,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS;KAC9E,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACrB,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAA;IACrE,OAAO;QACL,GAAG,MAAM;QACT,MAAM,EAAE,aAAa;YACnB,CAAC,CAAC,MAAM,CAAC,MAAM;YACf,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,KAAK,WAAW,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;QACpF,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,0BAA0B,EAAE,OAAO,CAAC,QAAQ;QAC5C,QAAQ,EAAE;YACR,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;YAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;YACnC,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE;YACxC,iBAAiB,EAAE,SAAS,CAC1B,OAAO,EAAE,CAAC,eAAe,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;gBAC3D,MAAM,CAAC,QAAQ,EAAE,iBAAiB,IAAI,EAAE;SAC3C;KACF,CAAA;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAM,EAAE,MAAM;IAC1C,OAAO;QACL,GAAG,MAAM;QACT,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW;YACjE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM;QAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,QAAQ,EAAE;YACR,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;YAC1B,iBAAiB,EAAE,IAAI;YACvB,iBAAiB,EAAE,SAAS,CAAC,MAAM,EACjC,CAAC,eAAe,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;gBAClD,MAAM,CAAC,QAAQ,EAAE,iBAAiB,IAAI,EAAE;SAC3C;KACF,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,SAAS,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM;IAChD,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAA;IAC7C,MAAM,UAAU,GAAG,IAAI,CACrB,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,cAAc,IAAI,6BAA6B,CAAC,EAC3E,SAAS,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;IACjD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;IACpD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAA;IAC5D,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,MAAM,CAAA;IAEtE,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACtE,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACnE,MAAM,IAAI,GAAG;QACX,GAAG,MAAM;QACT,MAAM,EAAE,CAAC,MAAM,IAAI,OAAO,EAAE,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW;QAC7E,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,0BAA0B,EAAE,OAAO,EAAE,QAAQ,IAAI,MAAM,CAAC,0BAA0B;QAClF,QAAQ,EAAE;YACR,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;YAC1B,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC;YAClC,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,oBAAoB;YACjD,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC;YACpC,YAAY,EAAE,OAAO,EAAE,YAAY,IAAI,EAAE;YACzC,iBAAiB,EAAE,SAAS,CAAC,OAAO,EAClC,CAAC,eAAe,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;gBAClD,SAAS,CAAC,MAAM,EAAE,CAAC,eAAe,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;gBACpE,MAAM,CAAC,QAAQ,EAAE,iBAAiB,IAAI,EAAE;SAC3C;KACF,CAAA;IACD,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACvB,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO;IAC3C,MAAM,aAAa,GAAG,wBAAwB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;IACtE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAA;QAC/D,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACxC,MAAM,YAAY,GAAG,WAAW,CAC9B,IAAI,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAA;QAC1E,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,cAAc,CAAC,CAAA;YACnE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;YACpF,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAA;YACrC,IAAI,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;gBACtE,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;YAC1D,CAAC;YACD,IAAI,OAAO,CAAC,iBAAiB,KAAK,OAAO;gBAAE,OAAM;YACjD,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;YACtD,OAAO,CAAC,WAAW,EAAE;gBACnB,GAAG,OAAO;gBACV,UAAU,EAAE,UAAU,GAAG,CAAC;gBAC1B,iBAAiB,EAAE,OAAO;gBAC1B,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACrC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAA;QACJ,CAAC;gBAAS,CAAC;YACT,YAAY,EAAE,CAAA;QAChB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,aAAa,EAAE,CAAA;IACjB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAK;IAC5B,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,4BAA4B,CAAC,CAAA;IAChF,OAAO,CAAC,CAAA;AACV,CAAC;AAED,SAAS,OAAO,CAAC,IAAI,EAAE,KAAK;IAC1B,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7C,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,UAAU,EAAE,MAAM,CAAA;IACvE,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IAC1E,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AACxB,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAI,EAAE,KAAK;IACxC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7C,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,UAAU,EAAE,MAAM,CAAA;IACvE,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IAC1E,IAAI,CAAC;QACH,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACpB,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAA;QACrC,MAAM,CAAC,CAAA;IACT,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAC/B,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,SAAS,EAAE,MAAM;IACpC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IAC1B,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;AACnC,CAAC;AAED,SAAS,cAAc,CAAC,SAAS,EAAE,MAAM;IACvC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAA;IACzE,MAAM,CAAC,MAAM,CAAC,CAAA;AAChB,CAAC;AAED,SAAS,MAAM,CAAC,MAAM;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QAC7C,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACnC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAA;IACjD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IACvF,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,IAAI;IACpB,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;AAC/C,CAAC;AAED,MAAM,SAAS,GAAG,QAAQ,EAAE,CAAA;AAC5B,MAAM,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;AAEtF,SAAS,QAAQ,CAAC,IAAI,EAAE,EAAE;IACxB,MAAM,QAAQ,GAAG,GAAG,IAAI,OAAO,CAAA;IAC/B,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7C,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAA;IACrC,IAAI,CAAC;QAAC,OAAO,EAAE,EAAE,CAAA;IAAC,CAAC;YAAS,CAAC;QAAC,OAAO,EAAE,CAAA;IAAC,CAAC;AAC3C,CAAC;AAED,SAAS,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,EAAE,MAAM,GAAG,KAAK;IAC9D,MAAM,KAAK,GAAG,UAAU,EAAE,CAAA;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAA;IACpC,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,SAAS,CAAC,IAAI,CAAC,CAAA;YACf,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE;oBAChC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBAC/E,CAAC,CAAA;YACJ,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;gBAC9C,MAAM,CAAC,CAAA;YACT,CAAC;YACD,OAAO,GAAG,EAAE;gBACV,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAA;oBAChD,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK;wBAAE,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;gBAC3E,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YACZ,CAAC,CAAA;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,CAAC,CAAA;YAChC,IAAI,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,GAAG,GAAG,IAAI,UAAU,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,EAAE,CAAA;gBAC3D,IAAI,CAAC;oBACH,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;oBACtB,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;oBAC9C,SAAQ;gBACV,CAAC;gBAAC,OAAO,SAAS,EAAE,CAAC;oBACnB,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ;wBAAE,SAAQ;oBACxE,MAAM,SAAS,CAAA;gBACjB,CAAC;YACH,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAA;YACtE,KAAK,CAAC,EAAE,CAAC,CAAA;QACX,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAI,EAAE,YAAY;IACnC,IAAI,GAAG,CAAA;IACP,IAAI,CAAC;QAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAA;IAAC,CAAC;IACvE,IAAI,KAAK,CAAA;IACT,IAAI,CAAC;QAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAC3D,IAAI,CAAC,KAAK;QAAE,OAAO,GAAG,IAAI,KAAK,CAAA;IAC/B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACpE,IAAI,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAAC,OAAO,KAAK,CAAA;QAAC,CAAC;QACxD,OAAO,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;gBAAE,OAAO,IAAI,CAAA;QAAC,CAAC;IACnD,CAAC;IACD,OAAO,GAAG,IAAI,YAAY,CAAA;AAC5B,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,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;IACjE,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","sourcesContent":["// 单链 Durable Wait(TypeScript source)。\n//\n// v1 只解决一件事:ask 之后,下一条来自同一 Field/tenant/conversation/actor\n// 的 DM 或直接 @,恢复原 Session 并创建新 Run。这里不实现通用 workflow/stack。\n\nimport {\n existsSync, linkSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync,\n writeFileSync,\n} from 'node:fs'\nimport { dirname, resolve, join } from 'node:path'\nimport { hostname } from 'node:os'\nimport { randomUUID } from 'node:crypto'\nimport { digest, stableStringify } from './events.js'\nimport { err } from './tui.js'\n\nconst OPEN_CHAIN = new Set([\n 'arming', 'active', 'uncertain', 'claimed', 'cancel-pending',\n])\nconst RESUMABLE = new Set(['active', 'uncertain'])\nconst DEFAULT_TTL_MS = 7 * 24 * 60 * 60 * 1000\n\nexport function armWait(root, cfg, input) {\n const scope = scopeFromTarget(input.fieldId, input.event, input.target)\n if (!scope) {\n throw new Error('ask 无法建立 Wait:必须有 tenant、conversation、actor,且事件是 DM 或直接 @')\n }\n const rootPath = waitRoot(root, cfg)\n const scopeHash = digest(stableStringify(scope))\n const path = join(rootPath, `${scopeHash}.json`)\n const waitId = `wait_${digest(`${input.sessionId}\\0${input.actionId}`).slice(0, 20)}`\n const history = join(rootPath, 'history', `${waitId}.json`)\n mkdirSync(rootPath, { recursive: true })\n // 旧 ask 的 Receipt 可能在同一 scope 已进入下一轮 Wait 后重放;历史记录存在时\n // 只返回原 Wait,不能用旧 Receipt 覆盖当前正在等待的新问题。\n if (existsSync(history)) {\n const recorded = readJson(history)\n assertScope(recorded, scope, scopeHash)\n if (recorded.id === waitId && recorded.actionId === input.actionId &&\n recorded.sessionId === input.sessionId) return recorded\n }\n return withLock(path, () => {\n let existing = existsSync(path) ? readJson(path) : null\n if (existing) {\n assertScope(existing, scope, scopeHash)\n existing = repairFromReceipt(root, cfg, path, existing)\n }\n if (existing?.id === waitId && existing.actionId === input.actionId) return existing\n const ownedClaim = existing?.status === 'claimed' &&\n existing.sessionId === input.sessionId &&\n existing.claim?.runId === input.sourceRunId\n if (existing && OPEN_CHAIN.has(existing.status) && !expired(existing) &&\n !ownedClaim) {\n throw new Error(\n `同一人员/会话已有未完成 Wait ${existing.id}(Session ${existing.sessionId});` +\n '单链 v1 拒绝并行追问')\n }\n if (ownedClaim) {\n persistHistory(path, {\n ...existing, status: 'continued', continuedAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n })\n }\n const now = new Date().toISOString()\n const ttl = positiveNumber(cfg.runtime?.waitTtlMs, DEFAULT_TTL_MS)\n const record = {\n $schema: 'dingtalk-agent/wait@1',\n id: waitId,\n scopeHash,\n scope,\n fieldId: input.fieldId,\n sessionId: input.sessionId,\n sessionPath: resolve(input.sessionPath),\n sourceRunId: input.sourceRunId,\n actionId: input.actionId,\n questionText: String(input.questionText || ''),\n status: 'arming',\n version: Number(existing?.version || 0) + 1,\n createdAt: now,\n updatedAt: now,\n expiresAt: new Date(Date.now() + ttl).toISOString(),\n delivery: null,\n claim: null,\n }\n persistWait(path, record)\n return record\n })\n}\n\n/** Receipt 是真值;重放 Receipt 也能幂等补齐 active/uncertain Wait。 */\nexport function reconcileWaitFromReceipt(root, cfg, wait, receipt) {\n if (!wait) return null\n if (wait.actionId !== receipt.actionId) {\n throw new Error(`Wait/Receipt actionId 不一致: ${wait.actionId}/${receipt.actionId}`)\n }\n if (wait.lastAppliedReceiptActionId === receipt.actionId) return wait\n const path = join(waitRoot(root, cfg), `${wait.scopeHash}.json`)\n return withLock(path, () => {\n if (!existsSync(path)) throw new Error(`Wait 索引丢失: ${wait.id}`)\n const current = readJson(path)\n if (current.id === wait.id && current.actionId === receipt.actionId) {\n if (current.lastAppliedReceiptActionId === receipt.actionId) return current\n const next = applyReceipt(current, receipt)\n persistWait(path, next)\n return next\n }\n // 该链可能已经进入下一轮 Wait;旧 Receipt 只补自己的历史,不得覆盖 scope head。\n const history = join(waitRoot(root, cfg), 'history', `${wait.id}.json`)\n if (!existsSync(history)) {\n throw new Error(`Wait/Receipt 身份冲突: wait=${current.id}, action=${receipt.actionId}`)\n }\n const recorded = readJson(history)\n if (recorded.id !== wait.id || recorded.actionId !== receipt.actionId) {\n throw new Error(`Wait 历史与 Receipt 身份冲突: wait=${wait.id}, action=${receipt.actionId}`)\n }\n if (recorded.lastAppliedReceiptActionId === receipt.actionId) return recorded\n const next = applyReceipt(recorded, receipt)\n persistHistory(path, next)\n return next\n })\n}\n\n/** DWS 已返回可查询结果后立即开放 Wait;平台回读可以随后完成。 */\nexport function markWaitTransportAccepted(root, cfg, wait, result) {\n if (!wait) return null\n const path = join(waitRoot(root, cfg), `${wait.scopeHash}.json`)\n return withLock(path, () => {\n if (!existsSync(path)) throw new Error(`Wait 索引丢失: ${wait.id}`)\n const current = readJson(path)\n if (current.id === wait.id) {\n const next = applyTransportResult(current, result)\n persistWait(path, next)\n return next\n }\n const history = join(waitRoot(root, cfg), 'history', `${wait.id}.json`)\n if (!existsSync(history)) throw new Error(`Wait 已被其他链替换: ${wait.id}`)\n const recorded = readJson(history)\n if (recorded.id !== wait.id || recorded.actionId !== wait.actionId) {\n throw new Error(`Wait 历史与 transport-result 身份冲突: ${wait.id}`)\n }\n const next = applyTransportResult(recorded, result)\n persistHistory(path, next)\n return next\n })\n}\n\n/** resumed Run 给出最终 reply/silence 后,释放单链 scope。 */\nexport function completeWaitFromReceipt(root, cfg, resume, receipt) {\n if (resume?.mode !== 'resume' || !resume.waitId) return null\n const rootPath = waitRoot(root, cfg)\n const historyPath = join(rootPath, 'history', `${resume.waitId}.json`)\n let recorded = existsSync(historyPath) ? readJson(historyPath) : null\n let scopeHash = recorded?.scopeHash || resume.waitScopeHash || ''\n if (!scopeHash && existsSync(rootPath)) {\n const matches = readdirSync(rootPath)\n .filter((name) => name.endsWith('.json'))\n .map((name) => readJson(join(rootPath, name)))\n .filter((candidate) => candidate.id === resume.waitId)\n if (matches.length === 1) {\n recorded = matches[0]\n scopeHash = recorded.scopeHash\n }\n }\n if (!scopeHash) throw new Error(`Wait 历史丢失且无法从 scope head 修复: ${resume.waitId}`)\n const path = join(rootPath, `${scopeHash}.json`)\n return withLock(path, () => {\n if (!recorded) {\n const current = existsSync(path) ? readJson(path) : null\n if (!current || current.id !== resume.waitId) {\n throw new Error(`Wait 历史丢失且 scope head 不匹配: ${resume.waitId}`)\n }\n recorded = current\n persistHistory(path, recorded)\n }\n const now = new Date().toISOString()\n const current = existsSync(path) ? readJson(path) : null\n if (current?.id === recorded.id) {\n if (current.status === 'cancelled') {\n persistHistory(path, current)\n return current\n }\n const next = {\n ...current,\n status: current.status === 'cancel-pending' ? 'cancel-pending' : 'completed',\n updatedAt: now, completedAt: now,\n completedByReceiptActionId: receipt.actionId,\n }\n persistWait(path, next)\n return next\n }\n const next = {\n ...recorded, status: recorded.status === 'cancelled' ? 'cancelled' : 'completed',\n updatedAt: now, completedAt: now, completedByReceiptActionId: receipt.actionId,\n }\n persistHistory(path, next)\n return next\n })\n}\n\n/**\n * 显式 /stop、/cancel 是宿主控制面:不依赖当前 Field/Behavior/Skill。\n * 先写 cancel-pending,再在线性化锁内提升 Session generation,最后写 cancelled。\n */\nexport function cancelWaitForEvent(root, cfg, event) {\n if (!isCancelCommand(event.message?.text)) return null\n const eventScope = scopeWithoutField(event)\n if (!eventScope) return null\n const rootPath = waitRoot(root, cfg)\n const replay = readEventBinding(rootPath, event.id)\n if (replay) {\n assertEventBinding(replay, event, 'cancel', eventScope)\n if (replay.outcome === 'no-match') return null\n if (replay.outcome === 'ambiguous') {\n throw new Error(`取消命中多个 Wait,已固化为 ambiguous: ${(replay.candidates || []).join(', ')}`)\n }\n return cancelBoundWait(root, cfg, event, replay)\n }\n if (!existsSync(rootPath)) {\n createNoMatchBinding(rootPath, event, 'cancel', eventScope)\n return null\n }\n const candidates: Array<{ path: string; record: Record<string, any> }> = []\n for (const name of readdirSync(rootPath)) {\n if (!name.endsWith('.json')) continue\n const path = join(rootPath, name)\n const record = readJson(path)\n const sameCancel = record.claim?.eventId === event.id &&\n record.claim?.cancelRequested === true\n if (sameEventScope(record.scope, eventScope) &&\n (OPEN_CHAIN.has(record.status) || sameCancel ||\n (record.status === 'cancelled' && record.claim?.eventId === event.id))) {\n candidates.push({ path, record })\n }\n }\n if (candidates.length > 1) {\n createNoMatchBinding(rootPath, event, 'cancel', eventScope, {\n outcome: 'ambiguous', candidates: candidates.map((x) => x.record.id).sort(),\n })\n throw new Error(`取消命中多个 Wait,拒绝猜测: ${candidates.map((x) => x.record.id).join(', ')}`)\n }\n if (!candidates.length) {\n createNoMatchBinding(rootPath, event, 'cancel', eventScope)\n return null\n }\n const { path } = candidates[0]\n const bound = withLock(path, () => {\n let current = readJson(path)\n if (!sameEventScope(current.scope, eventScope)) {\n throw new Error(`取消 Wait 作用域漂移: ${current.id}`)\n }\n current = repairFromReceipt(root, cfg, path, current)\n if (current.status === 'cancelled' && current.claim?.eventId === event.id) {\n return createEventBinding(rootPath, event, 'cancel', current)\n }\n if (!OPEN_CHAIN.has(current.status)) {\n createNoMatchBinding(rootPath, event, 'cancel', eventScope)\n return null\n }\n // 先把 head 置为 pending,再写 ledger。两者之间即使 SIGKILL,重放也会从\n // pending 的 eventId 恢复;Action 无法趁 binding→effect-lock 窗口建立 W2。\n const now = new Date().toISOString()\n const sameCancel = current.claim?.eventId === event.id &&\n current.claim?.cancelRequested === true\n ensureClaimBinding(rootPath, current)\n const pending = {\n ...current,\n status: 'cancel-pending',\n updatedAt: now,\n previousClaim: sameCancel ? current.previousClaim || null : current.claim || null,\n claim: {\n eventId: event.id, eventKind: event.kind, claimedAt: now,\n runId: '', cancelRequested: true,\n },\n }\n persistWait(path, pending)\n const binding = createEventBinding(rootPath, event, 'cancel', pending)\n return binding\n })\n return bound ? cancelBoundWait(root, cfg, event, bound) : null\n}\n\n/** Action 与 cancel 共用这一把锁;先拿到锁的一方定义副作用先后。 */\nexport function acquireSessionEffectLock(root, sessionPath) {\n const dir = resolve(root, '.dingtalk-agent/session-effect-locks')\n mkdirSync(dir, { recursive: true })\n return acquireLock(\n join(dir, `${digest(resolve(sessionPath))}.lock`), 30 * 60_000, 3 * 60_000)\n}\n\n/**\n * incoming Event 在创建新 Session 前调用。显式 sessionKey/correlation 由调用方优先处理。\n * claimed/cancelled + 同 eventId 可重入,覆盖 materialize 过程中崩溃后的恢复窗口。\n */\nexport function claimWait(root, cfg, fieldId, event) {\n const scope = scopeFromEvent(fieldId, event)\n if (!scope) return null\n const rootPath = waitRoot(root, cfg)\n const scopeHash = digest(stableStringify(scope))\n const path = join(rootPath, `${scopeHash}.json`)\n const replay = readEventBinding(rootPath, event.id)\n if (replay) {\n assertEventBinding(replay, event, 'claim', scope)\n if (replay.outcome === 'no-match') return null\n return claimBoundWait(root, cfg, event, replay)\n }\n return withLock(path, () => {\n if (!existsSync(path)) {\n createNoMatchBinding(rootPath, event, 'claim', scope)\n return null\n }\n let current = readJson(path)\n assertScope(current, scope, scopeHash)\n current = repairFromReceipt(root, cfg, path, current)\n if (current.status === 'claimed' && current.claim?.eventId === event.id &&\n current.claim?.cancelRequested !== true) {\n createEventBinding(rootPath, event, 'claim', current)\n return current\n }\n if (expired(current)) {\n ensureClaimBinding(rootPath, current)\n if (OPEN_CHAIN.has(current.status)) {\n const next = { ...current, status: 'expired', updatedAt: new Date().toISOString() }\n persistWait(path, next)\n }\n createNoMatchBinding(rootPath, event, 'claim', scope)\n return null\n }\n if (!RESUMABLE.has(current.status)) {\n createNoMatchBinding(rootPath, event, 'claim', scope)\n return null\n }\n const now = new Date().toISOString()\n const next = {\n ...current,\n status: 'claimed',\n updatedAt: now,\n claim: {\n eventId: event.id,\n eventKind: event.kind,\n claimedAt: now,\n runId: '',\n cancelRequested: false,\n },\n }\n persistWait(path, next)\n createEventBinding(rootPath, event, 'claim', next)\n return next\n })\n}\n\nexport function attachClaimedRun(root, cfg, wait, eventId, runId) {\n if (!wait) return null\n const path = join(waitRoot(root, cfg), `${wait.scopeHash}.json`)\n return withLock(path, () => {\n const loaded = readBoundWait(path, wait.id)\n if (!loaded || loaded.record.claim?.eventId !== eventId) {\n throw new Error(`Wait claim 身份冲突: wait=${wait.id}, event=${eventId}`)\n }\n const current = loaded.record\n if (current.claim.runId && current.claim.runId !== runId) {\n throw new Error(`Wait ${wait.id} 已绑定其他 Run: ${current.claim.runId}`)\n }\n if (current.claim.runId === runId) {\n // head 已写而 history 未写时,幂等重试必须顺手补齐历史真值。\n persistBoundWait(path, current, loaded.isHead)\n return current\n }\n const next = {\n ...current,\n updatedAt: new Date().toISOString(),\n claim: { ...current.claim, runId },\n }\n persistBoundWait(path, next, loaded.isHead)\n return next\n })\n}\n\nexport function waitRoot(root, cfg) {\n return resolve(root, cfg.runtime?.waitRoot || '.dingtalk-agent/waits')\n}\n\nexport function readWaitForEvent(root, cfg, fieldId, event) {\n const scope = scopeFromEvent(fieldId, event)\n if (!scope) return null\n const path = join(waitRoot(root, cfg), `${digest(stableStringify(scope))}.json`)\n return existsSync(path) ? readJson(path) : null\n}\n\nexport function isCancelCommand(text) {\n // Live canary 的合成入站必须保留唯一 marker;marker 只是证据,不应阻断\n // 随后的显式取消命令。生产消息不带 marker 时仍保持原有严格匹配。\n const value = String(text || '').trim()\n .replace(/^\\[DTA-LAB-[^\\]\\n]+\\]\\s*/u, '')\n return /^\\/(?:stop|cancel|停止|取消)$/i.test(value)\n}\n\n/** eventId 一旦绑定 Wait,重放永远解析原 Wait,不能重新扫描当前 scope head。 */\nfunction createEventBinding(rootPath, event, operation, wait) {\n const path = eventBindingPath(rootPath, event.id)\n const binding = {\n $schema: 'dingtalk-agent/wait-event-binding@1',\n eventId: event.id,\n eventKind: event.kind,\n operation,\n outcome: 'matched',\n waitId: wait.id,\n scopeHash: wait.scopeHash,\n scope: wait.scope,\n fieldId: wait.fieldId,\n sessionId: wait.sessionId,\n sessionPath: wait.sessionPath,\n sourceRunId: wait.sourceRunId,\n actionId: wait.actionId,\n boundAt: new Date().toISOString(),\n }\n if (!writeJsonCreateAtomic(path, binding)) {\n const existing = readJson(path)\n if (stableStringify(bindingIdentity(existing)) !== stableStringify(bindingIdentity(binding))) {\n throw new Error(`Event ${event.id} 已绑定其他 Wait,拒绝 ABA 重解释`)\n }\n return existing\n }\n return binding\n}\n\nfunction createNoMatchBinding(\n rootPath,\n event,\n operation,\n scope,\n options: Record<string, any> = {},\n) {\n const path = eventBindingPath(rootPath, event.id)\n const binding = {\n $schema: 'dingtalk-agent/wait-event-binding@1',\n eventId: event.id,\n eventKind: event.kind,\n operation,\n outcome: options.outcome || 'no-match',\n candidates: options.candidates || [],\n waitId: '',\n scopeHash: digest(stableStringify(scope)),\n scope,\n fieldId: '',\n sessionId: '',\n sessionPath: '',\n sourceRunId: '',\n actionId: '',\n boundAt: new Date().toISOString(),\n }\n if (!writeJsonCreateAtomic(path, binding)) {\n const existing = readJson(path)\n if (stableStringify(bindingIdentity(existing)) !== stableStringify(bindingIdentity(binding))) {\n throw new Error(`Event ${event.id} 的 Wait 路由决策已固化,拒绝重新解释`)\n }\n return existing\n }\n return binding\n}\n\nfunction readEventBinding(rootPath, eventId) {\n const path = eventBindingPath(rootPath, eventId)\n return existsSync(path) ? readJson(path) : null\n}\n\nfunction eventBindingPath(rootPath, eventId) {\n return join(rootPath, 'events', `${digest(eventId)}.json`)\n}\n\nfunction bindingIdentity(value) {\n return {\n eventId: value.eventId,\n eventKind: value.eventKind,\n operation: value.operation,\n outcome: value.outcome,\n candidates: value.candidates || [],\n waitId: value.waitId,\n scopeHash: value.scopeHash,\n scope: value.scope,\n fieldId: value.fieldId,\n sessionId: value.sessionId,\n sessionPath: value.sessionPath,\n sourceRunId: value.sourceRunId,\n actionId: value.actionId,\n }\n}\n\nfunction assertEventBinding(binding, event, operation, expectedScope) {\n if (binding.eventId !== event.id || binding.eventKind !== event.kind ||\n binding.operation !== operation) {\n throw new Error(`Event ${event.id} 的 Wait binding 类型冲突`)\n }\n const scopeMatches = operation === 'cancel'\n ? sameEventScope(binding.scope, expectedScope)\n : stableStringify(binding.scope) === stableStringify(expectedScope)\n if (!scopeMatches || binding.scopeHash !== digest(stableStringify(binding.scope))) {\n throw new Error(`Event ${event.id} 的 Wait binding 作用域漂移`)\n }\n}\n\nfunction assertWaitBinding(record, binding) {\n const actual = {\n waitId: record.id,\n scopeHash: record.scopeHash,\n fieldId: record.fieldId,\n sessionId: record.sessionId,\n sessionPath: record.sessionPath,\n sourceRunId: record.sourceRunId,\n actionId: record.actionId,\n }\n const expected = {\n waitId: binding.waitId,\n scopeHash: binding.scopeHash,\n fieldId: binding.fieldId,\n sessionId: binding.sessionId,\n sessionPath: binding.sessionPath,\n sourceRunId: binding.sourceRunId,\n actionId: binding.actionId,\n }\n if (stableStringify(actual) !== stableStringify(expected)) {\n throw new Error(`Wait event binding 身份漂移: ${binding.waitId}`)\n }\n}\n\nfunction cancelBoundWait(root, cfg, event, binding) {\n const path = join(waitRoot(root, cfg), `${binding.scopeHash}.json`)\n let pending = withLock(path, () => {\n const loaded = readBoundWait(path, binding.waitId)\n if (!loaded) throw new Error(`取消绑定的 Wait 不存在: ${binding.waitId}`)\n let current = loaded.record\n assertWaitBinding(current, binding)\n if (loaded.isHead) current = repairFromReceipt(root, cfg, path, current)\n if (current.status === 'cancelled' && current.claim?.eventId === event.id) return current\n if (['cancel-pending', 'cancelled'].includes(current.status) &&\n current.claim?.cancelRequested === true && current.claim?.eventId !== event.id) {\n // 两个 stop 同时到达时只让先行者提升 generation;后来者成为同 Session 的安全 no-op。\n return suppressedClaim(current, event.id)\n }\n const sameCancel = current.claim?.eventId === event.id &&\n current.claim?.cancelRequested === true\n if (!OPEN_CHAIN.has(current.status) && !sameCancel) {\n throw new Error(`取消绑定的 Wait 已进入 ${current.status}: ${binding.waitId}`)\n }\n const now = new Date().toISOString()\n ensureClaimBinding(waitRoot(root, cfg), current)\n const next = {\n ...current,\n status: 'cancel-pending',\n updatedAt: now,\n previousClaim: sameCancel ? current.previousClaim || null : current.claim || null,\n claim: {\n eventId: event.id, eventKind: event.kind, claimedAt: now,\n runId: '', cancelRequested: true,\n },\n }\n persistBoundWait(path, next, loaded.isHead)\n return next\n })\n\n if (pending.suppressed) return pending\n applyCancelFence(root, pending, event.id)\n pending = withLock(path, () => {\n const loaded = readBoundWait(path, binding.waitId)\n if (!loaded) throw new Error(`取消完成时 Wait 丢失: ${binding.waitId}`)\n const current = loaded.record\n assertWaitBinding(current, binding)\n if (current.claim?.eventId !== event.id) {\n throw new Error(`取消 Wait 身份漂移: ${binding.waitId}`)\n }\n if (current.status === 'cancelled') {\n persistBoundWait(path, current, loaded.isHead)\n return current\n }\n const next = { ...current, status: 'cancelled', updatedAt: new Date().toISOString() }\n persistBoundWait(path, next, loaded.isHead)\n return next\n })\n return pending\n}\n\nfunction claimBoundWait(root, cfg, event, binding) {\n const path = join(waitRoot(root, cfg), `${binding.scopeHash}.json`)\n return withLock(path, () => {\n const loaded = readBoundWait(path, binding.waitId)\n if (!loaded) throw new Error(`回复绑定的 Wait 不存在: ${binding.waitId}`)\n let current = loaded.record\n assertWaitBinding(current, binding)\n if (loaded.isHead) current = repairFromReceipt(root, cfg, path, current)\n if (current.status === 'claimed' && current.claim?.eventId === event.id) {\n if (!loaded.isHead) throw new Error(`已 claim 的 Wait 不再是 scope head: ${binding.waitId}`)\n return current\n }\n if (['cancel-pending', 'cancelled'].includes(current.status) &&\n current.claim?.cancelRequested === true) {\n return suppressedClaim(current, event.id)\n }\n if (!loaded.isHead || !RESUMABLE.has(current.status) || expired(current)) {\n throw new Error(`回复事件已绑定 Wait ${binding.waitId},但当前状态为 ${current.status};拒绝回退成新事项`)\n }\n const now = new Date().toISOString()\n const next = {\n ...current,\n status: 'claimed',\n updatedAt: now,\n claim: {\n eventId: event.id, eventKind: event.kind, claimedAt: now,\n runId: '', cancelRequested: false,\n },\n }\n persistWait(path, next)\n return next\n })\n}\n\nfunction suppressedClaim(record, eventId) {\n const cancelEventId = record.claim?.eventId || ''\n return {\n ...record,\n suppressed: true,\n cancelEventId,\n claim: {\n eventId,\n claimedAt: new Date().toISOString(),\n runId: '',\n cancelRequested: true,\n supersededByEventId: cancelEventId,\n },\n }\n}\n\nfunction ensureClaimBinding(rootPath, record) {\n const claim = record.claim?.cancelRequested !== true\n ? record.claim\n : record.previousClaim?.cancelRequested !== true ? record.previousClaim : null\n if (!claim?.eventId) return null\n if (!claim.eventKind) {\n throw new Error(`Wait ${record.id} 的 claim 缺少 eventKind,无法安全修复 event ledger`)\n }\n return createEventBinding(rootPath, {\n id: claim.eventId,\n kind: claim.eventKind,\n }, 'claim', record)\n}\n\nfunction readBoundWait(scopePath, waitId) {\n if (existsSync(scopePath)) {\n const current = readJson(scopePath)\n if (current.id === waitId) return { record: current, isHead: true }\n }\n const history = join(dirname(scopePath), 'history', `${waitId}.json`)\n return existsSync(history) ? { record: readJson(history), isHead: false } : null\n}\n\nfunction persistBoundWait(scopePath, record, isHead) {\n if (isHead) persistWait(scopePath, record)\n else persistHistory(scopePath, record)\n}\n\nfunction scopeFromTarget(fieldId, event, target) {\n if (!['im.message.dm', 'im.message.mentioned'].includes(event.kind)) return null\n return completeScope({\n fieldId,\n tenantId: target?.tenantId || event.tenant?.id,\n conversationId: target?.conversationId || event.conversation?.id,\n actorId: target?.senderOpenDingTalkId || event.actor?.openDingTalkId,\n })\n}\n\nfunction scopeFromEvent(fieldId, event) {\n if (!['im.message.dm', 'im.message.mentioned'].includes(event.kind)) return null\n return completeScope({\n fieldId,\n tenantId: event.tenant?.id,\n conversationId: event.conversation?.id,\n actorId: event.actor?.openDingTalkId,\n })\n}\n\nfunction scopeWithoutField(event) {\n if (!['im.message.dm', 'im.message.mentioned'].includes(event.kind)) return null\n return completeScope({\n tenantId: event.tenant?.id,\n conversationId: event.conversation?.id,\n actorId: event.actor?.openDingTalkId,\n })\n}\n\nfunction sameEventScope(scope, expected) {\n return scope?.tenantId === expected.tenantId &&\n scope?.conversationId === expected.conversationId &&\n scope?.actorId === expected.actorId\n}\n\nfunction completeScope(value) {\n const scope = Object.fromEntries(Object.entries(value).map(([k, v]) => [k, String(v || '').trim()]))\n return Object.values(scope).every(Boolean) ? scope : null\n}\n\nfunction assertScope(record, scope, scopeHash) {\n if (record.scopeHash !== scopeHash || stableStringify(record.scope) !== stableStringify(scope)) {\n throw new Error(`Wait scope hash 碰撞或内容漂移: ${scopeHash}`)\n }\n}\n\nfunction expired(record) {\n const deadline = Date.parse(record.expiresAt || '')\n return Number.isFinite(deadline) && deadline <= Date.now()\n}\n\nfunction positiveNumber(value, fallback) {\n const n = Number(value)\n return Number.isFinite(n) && n > 0 ? n : fallback\n}\n\nfunction applyReceipt(record, receipt) {\n const keepLifecycle = new Set([\n 'claimed', 'cancel-pending', 'cancelled', 'completed', 'continued', 'expired',\n ]).has(record.status)\n const transportAccepted = Boolean(record.delivery?.transportAccepted)\n return {\n ...record,\n status: keepLifecycle\n ? record.status\n : (receipt.outcome === 'uncertain' && !transportAccepted ? 'uncertain' : 'active'),\n updatedAt: new Date().toISOString(),\n lastAppliedReceiptActionId: receipt.actionId,\n delivery: {\n ...(record.delivery || {}),\n outcome: receipt.outcome,\n verified: Boolean(receipt.verified),\n verification: receipt.verification || '',\n questionMessageId: findValue(\n receipt, ['openMessageId', 'openMsgId', 'open_message_id']) ||\n record.delivery?.questionMessageId || '',\n },\n }\n}\n\nfunction applyTransportResult(record, result) {\n return {\n ...record,\n status: record.status === 'arming' || record.status === 'uncertain'\n ? 'active' : record.status,\n updatedAt: new Date().toISOString(),\n delivery: {\n ...(record.delivery || {}),\n transportAccepted: true,\n questionMessageId: findValue(result,\n ['openMessageId', 'openMsgId', 'open_message_id']) ||\n record.delivery?.questionMessageId || '',\n },\n }\n}\n\n/** 在 incoming Event 路由时修复 Receipt/transport-result 已落盘但 Wait 仍 arming 的窗口。 */\nfunction repairFromReceipt(root, cfg, path, record) {\n if (record.status !== 'arming') return record\n const actionPath = join(\n resolve(root, cfg.runtime?.eventIndexRoot || '.dingtalk-agent/event-index'),\n 'actions', record.sourceRunId, record.actionId)\n const receiptPath = join(actionPath, 'receipt.json')\n const resultPath = join(actionPath, 'transport-result.json')\n if (!existsSync(receiptPath) && !existsSync(resultPath)) return record\n\n const receipt = existsSync(receiptPath) ? readJson(receiptPath) : null\n const result = existsSync(resultPath) ? readJson(resultPath) : null\n const next = {\n ...record,\n status: (result || receipt?.outcome !== 'uncertain') ? 'active' : 'uncertain',\n updatedAt: new Date().toISOString(),\n lastAppliedReceiptActionId: receipt?.actionId || record.lastAppliedReceiptActionId,\n delivery: {\n ...(record.delivery || {}),\n transportAccepted: Boolean(result),\n outcome: receipt?.outcome || 'transport-accepted',\n verified: Boolean(receipt?.verified),\n verification: receipt?.verification || '',\n questionMessageId: findValue(receipt,\n ['openMessageId', 'openMsgId', 'open_message_id']) ||\n findValue(result, ['openMessageId', 'openMsgId', 'open_message_id']) ||\n record.delivery?.questionMessageId || '',\n },\n }\n persistWait(path, next)\n return next\n}\n\nfunction applyCancelFence(root, wait, eventId) {\n const releaseEffect = acquireSessionEffectLock(root, wait.sessionPath)\n try {\n const lockRoot = resolve(root, '.dingtalk-agent/session-locks')\n mkdirSync(lockRoot, { recursive: true })\n const releaseState = acquireLock(\n join(lockRoot, `${digest(resolve(wait.sessionPath))}.lock`), 2 * 60_000)\n try {\n const sessionPath = join(resolve(wait.sessionPath), 'session.json')\n if (!existsSync(sessionPath)) throw new Error(`取消目标 Session 不存在: ${wait.sessionId}`)\n const session = readJson(sessionPath)\n if (session.id !== wait.sessionId || session.fieldId !== wait.fieldId) {\n throw new Error(`取消目标 Session 身份不一致: ${wait.sessionId}`)\n }\n if (session.lastCancelEventId === eventId) return\n const generation = validGeneration(session.generation)\n persist(sessionPath, {\n ...session,\n generation: generation + 1,\n lastCancelEventId: eventId,\n cancelledAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n })\n } finally {\n releaseState()\n }\n } finally {\n releaseEffect()\n }\n}\n\nfunction validGeneration(value) {\n const n = Number(value ?? 1)\n if (!Number.isInteger(n) || n < 1) throw new Error('Session generation 非法,拒绝取消')\n return n\n}\n\nfunction persist(path, value) {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.${process.pid}.${Date.now()}.${randomUUID()}.tmp`\n writeFileSync(temp, JSON.stringify(value, null, 2) + '\\n', { flag: 'wx' })\n renameSync(temp, path)\n}\n\nfunction writeJsonCreateAtomic(path, value) {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.${process.pid}.${Date.now()}.${randomUUID()}.tmp`\n writeFileSync(temp, JSON.stringify(value, null, 2) + '\\n', { flag: 'wx' })\n try {\n linkSync(temp, path)\n return true\n } catch (e) {\n if (e.code === 'EEXIST') return false\n throw e\n } finally {\n rmSync(temp, { force: true })\n }\n}\n\nfunction persistWait(scopePath, record) {\n persist(scopePath, record)\n persistHistory(scopePath, record)\n}\n\nfunction persistHistory(scopePath, record) {\n persist(join(dirname(scopePath), 'history', `${record.id}.json`), record)\n mirror(record)\n}\n\nfunction mirror(record) {\n try {\n const dir = join(record.sessionPath, 'waits')\n mkdirSync(dir, { recursive: true })\n persist(join(dir, `${record.id}.json`), record)\n } catch (e) {\n console.error(err().theme.warn(` ⚠️ Wait 审计镜像写入失败(waitRoot 权威真值已保留): ${e.message}`))\n }\n}\n\nfunction readJson(path) {\n return JSON.parse(readFileSync(path, 'utf8'))\n}\n\nconst LOCK_HOST = hostname()\nconst sleep = (ms) => Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms)\n\nfunction withLock(path, fn) {\n const lockPath = `${path}.lock`\n mkdirSync(dirname(path), { recursive: true })\n const release = acquireLock(lockPath)\n try { return fn() } finally { release() }\n}\n\nfunction acquireLock(path, staleAfterMs = 60_000, waitMs = 5_000) {\n const token = randomUUID()\n const deadline = Date.now() + waitMs\n while (true) {\n try {\n mkdirSync(path)\n try {\n persist(join(path, 'owner.json'), {\n token, pid: process.pid, host: LOCK_HOST, acquiredAt: new Date().toISOString(),\n })\n } catch (e) {\n rmSync(path, { recursive: true, force: true })\n throw e\n }\n return () => {\n try {\n const owner = readJson(join(path, 'owner.json'))\n if (owner.token === token) rmSync(path, { recursive: true, force: true })\n } catch {}\n }\n } catch (e) {\n if (e.code !== 'EEXIST') throw e\n if (staleLock(path, staleAfterMs)) {\n const tomb = `${path}.stale.${process.pid}.${randomUUID()}`\n try {\n renameSync(path, tomb)\n rmSync(tomb, { recursive: true, force: true })\n continue\n } catch (moveError) {\n if (moveError.code === 'ENOENT' || moveError.code === 'EEXIST') continue\n throw moveError\n }\n }\n if (Date.now() >= deadline) throw new Error(`Wait 正在被其他事件更新: ${path}`)\n sleep(50)\n }\n }\n}\n\nfunction staleLock(path, staleAfterMs) {\n let age\n try { age = Date.now() - statSync(path).mtimeMs } catch { return true }\n let owner\n try { owner = readJson(join(path, 'owner.json')) } catch {}\n if (!owner) return age >= 2_000\n if (owner.host === LOCK_HOST && Number.isInteger(Number(owner.pid))) {\n try { process.kill(Number(owner.pid), 0); return false }\n catch (e) { if (e.code === 'ESRCH') return true }\n }\n return age >= staleAfterMs\n}\n\nfunction findValue(value, keys) {\n if (!value || typeof value !== 'object') return ''\n for (const key of keys) if (value[key]) return String(value[key])\n for (const child of Object.values(value)) {\n const found = findValue(child, keys)\n if (found) return found\n }\n return ''\n}\n"]}
|
package/dist/src/workspace.js
CHANGED
|
@@ -33,7 +33,7 @@ export function ensureWorkspace(root, options = {}) {
|
|
|
33
33
|
dws: { profile: '', expectedUserId: '' },
|
|
34
34
|
// 用 Skill name 声明,不把 Workspace 绑死到某个物理安装目录。
|
|
35
35
|
// Resolver 依次查 Workspace override、全局安装和 npm 内置版本。
|
|
36
|
-
skills: ['
|
|
36
|
+
skills: ['dta-basic-behavior', ...discoverLocalSkillNames(root, skillsRef)],
|
|
37
37
|
mounts: {
|
|
38
38
|
profile: `local-md:${profileRef}`,
|
|
39
39
|
memory: options.memory || 'local-md:MEMORY.md',
|
|
@@ -192,7 +192,7 @@ function discoverLocalSkillNames(root, skillsRef) {
|
|
|
192
192
|
if (name !== entry.name) {
|
|
193
193
|
throw new Error(`本地 Role Skill 目录名与 name 不一致: ${entry.name} != ${name}`);
|
|
194
194
|
}
|
|
195
|
-
if (name !== '
|
|
195
|
+
if (name !== 'dta-basic-behavior')
|
|
196
196
|
names.push(name);
|
|
197
197
|
}
|
|
198
198
|
return [...new Set(names)].sort();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/workspace.ts"],"names":[],"mappings":"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","sourcesContent":["// Agent Workspace:一个物理目录对应一个稳定 Context/Field。\n// 人和模型读取 Markdown;机器控制状态仍留在宿主私有 JSON 中。\n\nimport {\n existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync, 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'\n\nexport const WORKSPACE_FILE = '.dingtalk-agent/workspace.json'\n\nexport interface WorkspaceSpec {\n $schema: 'dingtalk-agent/workspace@1'\n id: string\n contextId: string\n fieldId: string\n dws: { profile: string; expectedUserId: string }\n skills: string[]\n mounts: Record<'profile' | 'memory' | 'knowledge' | 'skills', string>\n}\n\nexport interface WorkspaceInitOptions {\n contextId?: string\n id?: string\n memory?: string\n knowledge?: string\n}\n\nexport interface MountSnapshot {\n slot: string\n provider: 'local-md' | 'local-dir' | 'dingtalk-doc'\n source: string\n snapshotPath: string\n hash: string\n}\n\nexport function workspacePath(root: string): string {\n return join(root, WORKSPACE_FILE)\n}\n\nexport function ensureWorkspace(\n root: string,\n options: WorkspaceInitOptions = {},\n): WorkspaceSpec {\n const path = workspacePath(root)\n if (existsSync(path)) {\n const current = loadWorkspace(root)\n if (options.contextId && options.contextId !== current.contextId) {\n throw new Error(\n `当前目录已绑定 contextId=${current.contextId};一个物理 Workspace 不能重新绑定为 ${options.contextId}`,\n )\n }\n return current\n }\n\n const contextId = clean(options.contextId || basename(resolve(root)) || 'default')\n const id = clean(options.id || contextId)\n const packagedDefinition = existsSync(join(root, 'agent', 'AGENTS.md'))\n const profileRef = packagedDefinition\n ? 'agent/AGENTS.md'\n : existsSync(join(root, 'AGENTS.md')) ? 'AGENTS.md' : 'WORKSPACE.md'\n const skillsRef = existsSync(join(root, 'agent', 'skills'))\n ? 'agent/skills' : 'skills'\n const spec: WorkspaceSpec = {\n $schema: 'dingtalk-agent/workspace@1',\n id,\n contextId,\n fieldId: 'default',\n dws: { profile: '', expectedUserId: '' },\n // 用 Skill name 声明,不把 Workspace 绑死到某个物理安装目录。\n // Resolver 依次查 Workspace override、全局安装和 npm 内置版本。\n skills: ['dingtalk-basic-behavior', ...discoverLocalSkillNames(root, skillsRef)],\n mounts: {\n profile: `local-md:${profileRef}`,\n memory: options.memory || 'local-md:MEMORY.md',\n knowledge: options.knowledge || 'local-md:knowledge/INDEX.md',\n skills: `local-dir:${skillsRef}`,\n },\n }\n\n mkdirSync(dirname(path), { recursive: true })\n writeFileSync(path, JSON.stringify(spec, null, 2) + '\\n', { flag: 'wx' })\n writeDefaultMarkdown(root, spec)\n for (const dir of ['.dingtalk-agent/cache', '.dingtalk-agent/pending']) {\n mkdirSync(join(root, dir), { recursive: true })\n }\n return spec\n}\n\nexport function loadWorkspace(root: string): WorkspaceSpec {\n const path = workspacePath(root)\n if (!existsSync(path)) {\n throw new Error(\n '缺少 .dingtalk-agent/workspace.json;只有 Prepared Run runtime 才需要 `dingtalk-agent init`。' +\n '普通 Agent Session 请使用全局 Skill,按需运行 `dingtalk-agent bootstrap`。',\n )\n }\n let value: unknown\n try { value = JSON.parse(readFileSync(path, 'utf8')) }\n catch (error) { throw new Error(`Workspace manifest 不是合法 JSON: ${error.message}`) }\n return validateWorkspace(value)\n}\n\nexport function resolveContextId(spec: WorkspaceSpec, supplied = ''): string {\n const contextId = clean(supplied || spec.contextId)\n if (contextId !== spec.contextId) {\n throw new Error(\n `contextId=${contextId} 不属于当前 Workspace(期望 ${spec.contextId});请由上游选择正确工作目录`,\n )\n }\n return contextId\n}\n\n/**\n * Provider 只负责把语义内容冻结成本地 Markdown;锁、Wait、去重和 Receipt 不走这里。\n * dingtalk-doc 只读显式 node,不搜索、不创建、不覆盖。\n */\nexport function snapshotWorkspaceMounts(\n root: string,\n runPath: string,\n spec: WorkspaceSpec,\n): MountSnapshot[] {\n const destination = join(runPath, 'context', 'mounts')\n mkdirSync(destination, { recursive: true })\n const snapshots: MountSnapshot[] = []\n\n for (const [slot, uri] of Object.entries(spec.mounts)) {\n const mount = parseMount(uri)\n if (mount.provider === 'local-dir') {\n // skills 是逻辑槽:实际内容由 Skill resolver 从 Workspace override、\n // 全局目录或 npm 内置版本解析并在 Session 创建时冻结。\n if (slot !== 'skills') safeLocalPath(root, mount.ref)\n snapshots.push({\n slot, provider: mount.provider, source: uri,\n // P0 的目录型 mount 只有 skills;真实内容由 Session 绑定并冻结到这里。\n snapshotPath: slot === 'skills' ? 'context/skills' : '', hash: '',\n })\n continue\n }\n\n const markdown = mount.provider === 'local-md'\n ? readFileSync(safeLocalPath(root, mount.ref), 'utf8')\n : String(dws.readDoc(mount.ref, spec.dws.profile))\n const path = join(destination, `${safeName(slot)}.md`)\n writeFileSync(path, markdown.endsWith('\\n') ? markdown : markdown + '\\n')\n snapshots.push({\n slot,\n provider: mount.provider,\n source: uri,\n snapshotPath: relative(runPath, path).split('\\\\').join('/'),\n hash: digest(markdown),\n })\n }\n\n writeFileSync(\n join(destination, 'manifest.json'),\n JSON.stringify({ $schema: 'dingtalk-agent/mount-snapshot@1', entries: snapshots }, null, 2) + '\\n',\n )\n return snapshots\n}\n\nfunction validateWorkspace(value: unknown): WorkspaceSpec {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('Workspace manifest 必须是 JSON object')\n }\n const input = value as Record<string, any>\n if (input.$schema !== 'dingtalk-agent/workspace@1') {\n throw new Error('Workspace manifest 缺少 dingtalk-agent/workspace@1 schema')\n }\n for (const key of ['id', 'contextId', 'fieldId']) {\n if (!clean(input[key])) throw new Error(`Workspace manifest 缺少 ${key}`)\n }\n if (!Array.isArray(input.skills) || input.skills.some((item: unknown) => typeof item !== 'string')) {\n throw new Error('Workspace skills 必须是 string[]')\n }\n if (!input.dws || typeof input.dws.profile !== 'string' ||\n typeof input.dws.expectedUserId !== 'string') {\n throw new Error('Workspace dws 必须包含 string profile / expectedUserId')\n }\n const requiredSlots = ['profile', 'memory', 'knowledge', 'skills']\n if (!input.mounts || requiredSlots.some((slot) => typeof input.mounts[slot] !== 'string')) {\n throw new Error(`Workspace mounts 必须包含 ${requiredSlots.join(' / ')}`)\n }\n for (const uri of Object.values(input.mounts)) parseMount(String(uri))\n return input as WorkspaceSpec\n}\n\nfunction parseMount(uri: string): {\n provider: 'local-md' | 'local-dir' | 'dingtalk-doc'\n ref: string\n} {\n const separator = uri.indexOf(':')\n const provider = uri.slice(0, separator)\n const ref = separator >= 0 ? uri.slice(separator + 1).trim() : ''\n if (!['local-md', 'local-dir', 'dingtalk-doc'].includes(provider) || !ref) {\n throw new Error(`不支持的 Workspace mount: ${uri}`)\n }\n return { provider: provider as 'local-md' | 'local-dir' | 'dingtalk-doc', ref }\n}\n\nfunction safeLocalPath(root: string, ref: string): string {\n const rootReal = realpathSync(resolve(root))\n const candidate = resolve(rootReal, ref)\n if (!existsSync(candidate)) throw new Error(`Workspace mount 不存在: ${ref}`)\n const actual = realpathSync(candidate)\n const rel = relative(rootReal, actual)\n if (rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`)) {\n throw new Error(`Workspace local mount 必须位于当前目录内: ${ref}`)\n }\n return actual\n}\n\nfunction writeDefaultMarkdown(root: string, spec: WorkspaceSpec): void {\n const files: Array<[string, string]> = [\n ['WORKSPACE.md', `# Agent Workspace\\n\\n- Context ID: ${spec.contextId}\\n- Workspace: ${spec.id}\\n- Field: ${spec.fieldId}\\n\\n这里定义稳定的身份、职责、协作边界和内容挂载。\\n`],\n ['MEMORY.md', '# Long-term Memory\\n\\n只保存经过筛选、带来源的长期记忆。当前事项放在 Session memory。\\n'],\n ['knowledge/INDEX.md', '# Knowledge Index\\n\\n按需列出本 Workspace 可用的知识入口。\\n'],\n ]\n for (const [rel, content] of files) {\n const path = join(root, rel)\n mkdirSync(dirname(path), { recursive: true })\n if (!existsSync(path)) writeFileSync(path, content)\n }\n}\n\nfunction safeName(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, '-')\n}\n\nfunction discoverLocalSkillNames(root: string, skillsRef: string): string[] {\n const directory = join(root, skillsRef)\n if (!existsSync(directory) || !lstatSync(directory).isDirectory()) return []\n const names: string[] = []\n for (const entry of readdirSync(directory, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue\n const path = join(directory, entry.name, 'SKILL.md')\n if (!existsSync(path)) continue\n const markdown = readFileSync(path, 'utf8')\n const frontmatter = markdown.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/)?.[1] || ''\n const name = frontmatter.match(/^name:\\s*['\"]?([^'\"\\r\\n]+)['\"]?\\s*$/m)?.[1]?.trim() || ''\n if (!name) throw new Error(`本地 Role Skill 缺少 frontmatter name: ${path}`)\n if (name !== entry.name) {\n throw new Error(`本地 Role Skill 目录名与 name 不一致: ${entry.name} != ${name}`)\n }\n if (name !== 'dingtalk-basic-behavior') names.push(name)\n }\n return [...new Set(names)].sort()\n}\n\nfunction clean(value: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n"]}
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/workspace.ts"],"names":[],"mappings":"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","sourcesContent":["// Agent Workspace:一个物理目录对应一个稳定 Context/Field。\n// 人和模型读取 Markdown;机器控制状态仍留在宿主私有 JSON 中。\n\nimport {\n existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync, 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'\n\nexport const WORKSPACE_FILE = '.dingtalk-agent/workspace.json'\n\nexport interface WorkspaceSpec {\n $schema: 'dingtalk-agent/workspace@1'\n id: string\n contextId: string\n fieldId: string\n dws: { profile: string; expectedUserId: string }\n skills: string[]\n mounts: Record<'profile' | 'memory' | 'knowledge' | 'skills', string>\n}\n\nexport interface WorkspaceInitOptions {\n contextId?: string\n id?: string\n memory?: string\n knowledge?: string\n}\n\nexport interface MountSnapshot {\n slot: string\n provider: 'local-md' | 'local-dir' | 'dingtalk-doc'\n source: string\n snapshotPath: string\n hash: string\n}\n\nexport function workspacePath(root: string): string {\n return join(root, WORKSPACE_FILE)\n}\n\nexport function ensureWorkspace(\n root: string,\n options: WorkspaceInitOptions = {},\n): WorkspaceSpec {\n const path = workspacePath(root)\n if (existsSync(path)) {\n const current = loadWorkspace(root)\n if (options.contextId && options.contextId !== current.contextId) {\n throw new Error(\n `当前目录已绑定 contextId=${current.contextId};一个物理 Workspace 不能重新绑定为 ${options.contextId}`,\n )\n }\n return current\n }\n\n const contextId = clean(options.contextId || basename(resolve(root)) || 'default')\n const id = clean(options.id || contextId)\n const packagedDefinition = existsSync(join(root, 'agent', 'AGENTS.md'))\n const profileRef = packagedDefinition\n ? 'agent/AGENTS.md'\n : existsSync(join(root, 'AGENTS.md')) ? 'AGENTS.md' : 'WORKSPACE.md'\n const skillsRef = existsSync(join(root, 'agent', 'skills'))\n ? 'agent/skills' : 'skills'\n const spec: WorkspaceSpec = {\n $schema: 'dingtalk-agent/workspace@1',\n id,\n contextId,\n fieldId: 'default',\n dws: { profile: '', expectedUserId: '' },\n // 用 Skill name 声明,不把 Workspace 绑死到某个物理安装目录。\n // Resolver 依次查 Workspace override、全局安装和 npm 内置版本。\n skills: ['dta-basic-behavior', ...discoverLocalSkillNames(root, skillsRef)],\n mounts: {\n profile: `local-md:${profileRef}`,\n memory: options.memory || 'local-md:MEMORY.md',\n knowledge: options.knowledge || 'local-md:knowledge/INDEX.md',\n skills: `local-dir:${skillsRef}`,\n },\n }\n\n mkdirSync(dirname(path), { recursive: true })\n writeFileSync(path, JSON.stringify(spec, null, 2) + '\\n', { flag: 'wx' })\n writeDefaultMarkdown(root, spec)\n for (const dir of ['.dingtalk-agent/cache', '.dingtalk-agent/pending']) {\n mkdirSync(join(root, dir), { recursive: true })\n }\n return spec\n}\n\nexport function loadWorkspace(root: string): WorkspaceSpec {\n const path = workspacePath(root)\n if (!existsSync(path)) {\n throw new Error(\n '缺少 .dingtalk-agent/workspace.json;只有 Prepared Run runtime 才需要 `dingtalk-agent init`。' +\n '普通 Agent Session 请使用全局 Skill,按需运行 `dingtalk-agent bootstrap`。',\n )\n }\n let value: unknown\n try { value = JSON.parse(readFileSync(path, 'utf8')) }\n catch (error) { throw new Error(`Workspace manifest 不是合法 JSON: ${error.message}`) }\n return validateWorkspace(value)\n}\n\nexport function resolveContextId(spec: WorkspaceSpec, supplied = ''): string {\n const contextId = clean(supplied || spec.contextId)\n if (contextId !== spec.contextId) {\n throw new Error(\n `contextId=${contextId} 不属于当前 Workspace(期望 ${spec.contextId});请由上游选择正确工作目录`,\n )\n }\n return contextId\n}\n\n/**\n * Provider 只负责把语义内容冻结成本地 Markdown;锁、Wait、去重和 Receipt 不走这里。\n * dingtalk-doc 只读显式 node,不搜索、不创建、不覆盖。\n */\nexport function snapshotWorkspaceMounts(\n root: string,\n runPath: string,\n spec: WorkspaceSpec,\n): MountSnapshot[] {\n const destination = join(runPath, 'context', 'mounts')\n mkdirSync(destination, { recursive: true })\n const snapshots: MountSnapshot[] = []\n\n for (const [slot, uri] of Object.entries(spec.mounts)) {\n const mount = parseMount(uri)\n if (mount.provider === 'local-dir') {\n // skills 是逻辑槽:实际内容由 Skill resolver 从 Workspace override、\n // 全局目录或 npm 内置版本解析并在 Session 创建时冻结。\n if (slot !== 'skills') safeLocalPath(root, mount.ref)\n snapshots.push({\n slot, provider: mount.provider, source: uri,\n // P0 的目录型 mount 只有 skills;真实内容由 Session 绑定并冻结到这里。\n snapshotPath: slot === 'skills' ? 'context/skills' : '', hash: '',\n })\n continue\n }\n\n const markdown = mount.provider === 'local-md'\n ? readFileSync(safeLocalPath(root, mount.ref), 'utf8')\n : String(dws.readDoc(mount.ref, spec.dws.profile))\n const path = join(destination, `${safeName(slot)}.md`)\n writeFileSync(path, markdown.endsWith('\\n') ? markdown : markdown + '\\n')\n snapshots.push({\n slot,\n provider: mount.provider,\n source: uri,\n snapshotPath: relative(runPath, path).split('\\\\').join('/'),\n hash: digest(markdown),\n })\n }\n\n writeFileSync(\n join(destination, 'manifest.json'),\n JSON.stringify({ $schema: 'dingtalk-agent/mount-snapshot@1', entries: snapshots }, null, 2) + '\\n',\n )\n return snapshots\n}\n\nfunction validateWorkspace(value: unknown): WorkspaceSpec {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('Workspace manifest 必须是 JSON object')\n }\n const input = value as Record<string, any>\n if (input.$schema !== 'dingtalk-agent/workspace@1') {\n throw new Error('Workspace manifest 缺少 dingtalk-agent/workspace@1 schema')\n }\n for (const key of ['id', 'contextId', 'fieldId']) {\n if (!clean(input[key])) throw new Error(`Workspace manifest 缺少 ${key}`)\n }\n if (!Array.isArray(input.skills) || input.skills.some((item: unknown) => typeof item !== 'string')) {\n throw new Error('Workspace skills 必须是 string[]')\n }\n if (!input.dws || typeof input.dws.profile !== 'string' ||\n typeof input.dws.expectedUserId !== 'string') {\n throw new Error('Workspace dws 必须包含 string profile / expectedUserId')\n }\n const requiredSlots = ['profile', 'memory', 'knowledge', 'skills']\n if (!input.mounts || requiredSlots.some((slot) => typeof input.mounts[slot] !== 'string')) {\n throw new Error(`Workspace mounts 必须包含 ${requiredSlots.join(' / ')}`)\n }\n for (const uri of Object.values(input.mounts)) parseMount(String(uri))\n return input as WorkspaceSpec\n}\n\nfunction parseMount(uri: string): {\n provider: 'local-md' | 'local-dir' | 'dingtalk-doc'\n ref: string\n} {\n const separator = uri.indexOf(':')\n const provider = uri.slice(0, separator)\n const ref = separator >= 0 ? uri.slice(separator + 1).trim() : ''\n if (!['local-md', 'local-dir', 'dingtalk-doc'].includes(provider) || !ref) {\n throw new Error(`不支持的 Workspace mount: ${uri}`)\n }\n return { provider: provider as 'local-md' | 'local-dir' | 'dingtalk-doc', ref }\n}\n\nfunction safeLocalPath(root: string, ref: string): string {\n const rootReal = realpathSync(resolve(root))\n const candidate = resolve(rootReal, ref)\n if (!existsSync(candidate)) throw new Error(`Workspace mount 不存在: ${ref}`)\n const actual = realpathSync(candidate)\n const rel = relative(rootReal, actual)\n if (rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`)) {\n throw new Error(`Workspace local mount 必须位于当前目录内: ${ref}`)\n }\n return actual\n}\n\nfunction writeDefaultMarkdown(root: string, spec: WorkspaceSpec): void {\n const files: Array<[string, string]> = [\n ['WORKSPACE.md', `# Agent Workspace\\n\\n- Context ID: ${spec.contextId}\\n- Workspace: ${spec.id}\\n- Field: ${spec.fieldId}\\n\\n这里定义稳定的身份、职责、协作边界和内容挂载。\\n`],\n ['MEMORY.md', '# Long-term Memory\\n\\n只保存经过筛选、带来源的长期记忆。当前事项放在 Session memory。\\n'],\n ['knowledge/INDEX.md', '# Knowledge Index\\n\\n按需列出本 Workspace 可用的知识入口。\\n'],\n ]\n for (const [rel, content] of files) {\n const path = join(root, rel)\n mkdirSync(dirname(path), { recursive: true })\n if (!existsSync(path)) writeFileSync(path, content)\n }\n}\n\nfunction safeName(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, '-')\n}\n\nfunction discoverLocalSkillNames(root: string, skillsRef: string): string[] {\n const directory = join(root, skillsRef)\n if (!existsSync(directory) || !lstatSync(directory).isDirectory()) return []\n const names: string[] = []\n for (const entry of readdirSync(directory, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue\n const path = join(directory, entry.name, 'SKILL.md')\n if (!existsSync(path)) continue\n const markdown = readFileSync(path, 'utf8')\n const frontmatter = markdown.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/)?.[1] || ''\n const name = frontmatter.match(/^name:\\s*['\"]?([^'\"\\r\\n]+)['\"]?\\s*$/m)?.[1]?.trim() || ''\n if (!name) throw new Error(`本地 Role Skill 缺少 frontmatter name: ${path}`)\n if (name !== entry.name) {\n throw new Error(`本地 Role Skill 目录名与 name 不一致: ${entry.name} != ${name}`)\n }\n if (name !== 'dta-basic-behavior') names.push(name)\n }\n return [...new Set(names)].sort()\n}\n\nfunction clean(value: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n"]}
|