@h-ai/cli 0.1.0-alpha.64 → 0.1.0-alpha.65
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/README.en.md +20 -4
- package/README.ja.md +20 -4
- package/README.md +28 -12
- package/dist/chunk-47V5OT22.js +5639 -0
- package/dist/chunk-47V5OT22.js.map +1 -0
- package/dist/{chunk-X3RSYNBG.js → chunk-IPG3QNYK.js} +62 -4
- package/dist/chunk-IPG3QNYK.js.map +1 -0
- package/dist/cli-config-templates-SJ2MBIR7.js +5 -0
- package/dist/{cli-config-templates-QRF6B5T4.js.map → cli-config-templates-SJ2MBIR7.js.map} +1 -1
- package/dist/{cli-skill-templates-EZFW7D43.js → cli-skill-templates-A5VIR5J6.js} +3 -3
- package/dist/{cli-skill-templates-EZFW7D43.js.map → cli-skill-templates-A5VIR5J6.js.map} +1 -1
- package/dist/index.js +524 -66
- package/dist/index.js.map +1 -1
- package/dist/{src-DUGLX4YB.js → src-6PPBKQ6Q.js} +666 -290
- package/dist/src-6PPBKQ6Q.js.map +1 -0
- package/package.json +9 -7
- package/templates/apps/admin/src/routes/+layout.svelte.hbs +4 -2
- package/templates/apps/api/.dockerignore.hbs +5 -0
- package/templates/apps/api/.gitignore.hbs +4 -4
- package/templates/apps/api/Dockerfile.hbs +11 -1
- package/templates/apps/api/apps/{{projectName}}-contract/package.json.hbs +2 -0
- package/templates/apps/api/apps/{{projectName}}-service/config/_core.yml.hbs +2 -2
- package/templates/apps/api/apps/{{projectName}}-service/config/_serv.yml.hbs +4 -4
- package/templates/apps/api/apps/{{projectName}}-service/package.json.hbs +9 -2
- package/templates/apps/api/package.json.hbs +9 -0
- package/templates/apps/fullstack/.dockerignore.hbs +5 -3
- package/templates/apps/fullstack/.gitignore.hbs +22 -9
- package/templates/apps/fullstack/Dockerfile.hbs +11 -1
- package/templates/apps/fullstack/apps/{{projectName}}-app/package.json.hbs +6 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/vite.config.ts.hbs +7 -3
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/package.json.hbs +5 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/vite.config.ts.hbs +7 -3
- package/templates/apps/fullstack/apps/{{projectName}}-web/package.json.hbs +6 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/vite.config.ts.hbs +7 -3
- package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +23 -1
- package/templates/apps/fullstack/package.json.hbs +12 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/README.md.hbs +2 -2
- package/templates/apps/fullstack/packages/{{projectName}}-contract/package.json.hbs +2 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-contract.ts.hbs +1 -1
- package/templates/apps/fullstack/packages/{{projectName}}-contract/tests/contract.test.ts.hbs +8 -14
- package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +6 -4
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_reach.yml.hbs +8 -8
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_serv.yml.hbs +3 -3
- package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +9 -2
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/app-server.ts.hbs +4 -4
- package/templates/apps/fullstack/packages/{{projectName}}-shared/README.md.hbs +3 -1
- package/templates/apps/fullstack/packages/{{projectName}}-shared/package.json.hbs +2 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AdminWorkspace.svelte.hbs +14 -12
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AppShell.svelte.hbs +1 -1
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/management-store.svelte.ts.hbs +17 -3
- package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/management-store.test.ts.hbs +15 -5
- package/templates/apps/fullstack/playwright.config.ts.hbs +6 -1
- package/templates/apps/fullstack/pnpm-workspace.yaml.hbs +0 -1
- package/templates/apps/h5/src/routes/+layout.svelte.hbs +13 -13
- package/templates/apps/mobile-app/src/App.svelte.hbs +46 -117
- package/templates/apps/mobile-app/src/lib/pages/home.svelte.hbs +58 -0
- package/templates/apps/mobile-app/src/lib/pages/profile.svelte.hbs +13 -0
- package/templates/apps/mobile-app/src/lib/pages/tasks.svelte.hbs +16 -0
- package/templates/base/.dockerignore.hbs +5 -0
- package/templates/base/.gitignore.hbs +18 -4
- package/templates/base/Dockerfile.hbs +17 -1
- package/templates/base/e2e/app.spec.ts.hbs +14 -0
- package/templates/base/package.json.hbs +14 -2
- package/templates/base/tests/scaffold.test.ts.hbs +9 -3
- package/templates/base/vite.config.ts.hbs +6 -4
- package/templates/shared/hash-router.svelte.ts +83 -0
- package/templates/skills/AGENTS.md +15 -1
- package/templates/skills/bridges/admin/AGENTS.md +17 -1
- package/templates/skills/bridges/api/AGENTS.md +17 -3
- package/templates/skills/bridges/fullstack/AGENTS.md.hbs +35 -11
- package/templates/skills/bridges/h5/AGENTS.md +17 -1
- package/templates/skills/bridges/mobile-app/AGENTS.md +19 -3
- package/templates/skills/bridges/website/AGENTS.md +17 -1
- package/templates/skills/hai-ai/reference.md +2 -2
- package/templates/skills/hai-app-create/SKILL.md +5 -3
- package/templates/skills/hai-app-create/development.md +126 -2
- package/templates/skills/hai-app-create/reference.md +2 -2
- package/templates/skills/hai-app-review/SKILL.md +2 -2
- package/templates/skills/hai-app-tests/SKILL.md +2 -1
- package/templates/skills/hai-app-tests/reference.md +1 -1
- package/templates/skills/hai-core/SKILL.md +2 -1
- package/templates/skills/hai-deploy/SKILL.md +42 -34
- package/templates/skills/hai-deploy/middleware.md +94 -0
- package/templates/skills/hai-framework-sync/SKILL.md +1 -1
- package/templates/skills/hai-framework-sync/sync.md +1 -1
- package/templates/skills/hai-reach/reference.md +8 -8
- package/templates/skills/hai-spec-implement/SKILL.md +12 -9
- package/templates/skills/hai-spec-implement/changes.md +67 -0
- package/templates/skills/hai-spec-implement/templates.md +25 -3
- package/templates/skills/hai-spec-implement/workflow.md +7 -6
- package/templates/skills/hai-spec-review/SKILL.md +14 -5
- package/templates/skills/hai-spec-review/checklist.md +4 -3
- package/templates/skills/hai-storage/SKILL.md +2 -0
- package/dist/chunk-WW2MIO6T.js +0 -992
- package/dist/chunk-WW2MIO6T.js.map +0 -1
- package/dist/chunk-X3RSYNBG.js.map +0 -1
- package/dist/cli-config-templates-QRF6B5T4.js +0 -5
- package/dist/src-DUGLX4YB.js.map +0 -1
- /package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/{components/AuditManagement.svelte.hbs → pages/audit.svelte.hbs} +0 -0
- /package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/{components/RoleManagement.svelte.hbs → pages/roles.svelte.hbs} +0 -0
- /package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/{components/ProfileSettings.svelte.hbs → pages/settings.svelte.hbs} +0 -0
- /package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/{components/UserManagement.svelte.hbs → pages/users.svelte.hbs} +0 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli-utils.ts","../src/commands/cli-template-engine.ts","../src/commands/cli-create.ts","../src/commands/cli-add.ts","../src/commands/cli-deploy.ts","../src/commands/cli-generate.ts","../src/commands/cli-init.ts","../src/cli-main.ts"],"names":["process","fs","path","Handlebars","fileURLToPath","DEFAULT_FULLSTACK_FRONTENDS","fse","generateConfigFile","ora","chalk","prompts","generatedFiles","pkg","execSync","core"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAaA,IAAM,0BAAA,GAA6B,cAAA;AACnC,IAAM,kBAAA,GAAqB,IAAA;AAGpB,SAAS,gBAAgB,OAAA,EAAuB;AACrD,EAAAA,QAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,OAAO;AAAA,CAAI,CAAA;AACrC;AAGO,SAAS,aAAA,CAAc,SAAiB,KAAA,EAAuB;AACpE,EAAAA,QAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,OAAO;AAAA,CAAI,CAAA;AACnC,EAAA,IAAI,KAAA,KAAU,MAAA;AACZ,IAAAA,QAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,EAAG,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC;AAAA,CAAI,CAAA;AACtF;AAGO,SAAS,wBAAwB,WAAA,EAA6B;AACnE,EAAA,OAAO,QAAA,CAAS,WAAA,EAAa,IAAA,CAAK,GAAA,CAAI,IAAIA,QAAA,CAAQ,MAAA,CAAO,OAAA,IAAW,EAAA,IAAM,EAAE,CAAA,EAAG,EAAE,IAAA,EAAM,MAAM,CAAA;AAC/F;AAKO,SAAS,YAAY,GAAA,EAAqB;AAC/C,EAAA,OAAO,IACJ,OAAA,CAAQ,0BAAA,EAA4B,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,CAAE,WAAA,EAAY,GAAI,EAAE,CAAA,CACtE,OAAA,CAAQ,oBAAoB,CAAA,CAAA,KAAK,CAAA,CAAE,aAAa,CAAA;AACrD;AAKO,SAAS,aAAa,GAAA,EAAqB;AAChD,EAAA,MAAM,KAAA,GAAQ,YAAY,GAAG,CAAA;AAC7B,EAAA,OAAO,KAAA,CAAM,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,KAAA,CAAM,MAAM,CAAC,CAAA;AACtD;AAKO,SAAS,YAAY,GAAA,EAAqB;AAC/C,EAAA,OAAO,GAAA,CACJ,QAAQ,iBAAA,EAAmB,OAAO,EAClC,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA,CACtB,WAAA,EAAY;AACjB;AAKO,SAAS,YAAY,GAAA,EAAqB;AAC/C,EAAA,OAAO,GAAA,CACJ,QAAQ,iBAAA,EAAmB,OAAO,EAClC,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA,CACtB,WAAA,EAAY;AACjB;AAKO,SAAS,qBAAA,CAAsB,IAAA,EAAc,KAAA,GAAiC,EAAC,EAAoB;AACxG,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,YAAY,IAAI,CAAA;AAAA,IAC3B,UAAA,EAAY,aAAa,IAAI,CAAA;AAAA,IAC7B,SAAA,EAAW,YAAY,IAAI,CAAA;AAAA,IAC3B,SAAA,EAAW,YAAY,IAAI,CAAA;AAAA,IAC3B,GAAG;AAAA,GACL;AACF;AAwBA,eAAsB,SAAA,CAAU,UAAkB,OAAA,EAAgC;AAChF,EAAA,MAAMC,GAAA,CAAG,SAAA,CAAUC,KAAA,CAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA;AACzC,EAAA,MAAMD,GAAA,CAAG,SAAA,CAAU,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAC/C;AAKA,eAAsB,WAAW,QAAA,EAAoC;AACnE,EAAA,IAAI;AACF,IAAA,MAAMA,GAAA,CAAG,OAAO,QAAQ,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MACM;AACJ,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAsBO,SAAS,aAAA,GAAwB;AACtC,EAAA,IAAI,MAAMC,KAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AACrD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,MAAMD,GAAA,CAAG,YAAA,CAAaC,MAAK,IAAA,CAAK,GAAA,EAAK,cAAc,CAAC,CAAA;AAC1D,MAAA,IAAI,IAAI,IAAA,KAAS,WAAA;AACf,QAAA,OAAO,IAAI,OAAA,IAAW,OAAA;AAAA,IAC1B,CAAA,CAAA,MACM;AAAA,IAEN;AACA,IAAA,MAAM,MAAA,GAASA,KAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC/B,IAAA,IAAI,MAAA,KAAW,GAAA;AACb,MAAA;AACF,IAAA,GAAA,GAAM,MAAA;AAAA,EACR;AACA,EAAA,OAAO,OAAA;AACT;AAKA,eAAsB,qBAAqB,GAAA,EAA+C;AACxF,EAAA,IAAI,MAAM,UAAA,CAAWA,KAAA,CAAK,KAAK,GAAA,EAAK,gBAAgB,CAAC,CAAA,EAAG;AACtD,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,MAAM,UAAA,CAAWA,KAAA,CAAK,KAAK,GAAA,EAAK,WAAW,CAAC,CAAA,EAAG;AACjD,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AA+BO,SAAS,eAAA,GAAwB;AAEtC,EAAAC,WAAA,CAAW,cAAA,CAAe,OAAA,EAAS,SAAyB,CAAA,EAAY,GAAY,OAAA,EAAmC;AACrH,IAAA,OAAO,CAAA,KAAM,IAAI,OAAA,CAAQ,EAAA,CAAG,IAAI,CAAA,GAAI,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAAA,EAC1D,CAAC,CAAA;AAGD,EAAAA,WAAA,CAAW,cAAA,CAAe,QAAQ,MAAM;AACtC,IAAA,OAAA,iBAAO,IAAI,MAAK,EAAE,WAAA,GAAc,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAAA,EAC9C,CAAC,CAAA;AAGD,EAAAA,WAAA,CAAW,cAAA,CAAe,QAAQ,MAAM;AACtC,IAAA,OAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,EAChC,CAAC,CAAA;AAGD,EAAAA,WAAA,CAAW,cAAA,CAAe,OAAA,EAAS,CAAC,GAAA,KAAgB;AAClD,IAAA,OAAO,IAAI,WAAA,EAAY;AAAA,EACzB,CAAC,CAAA;AAGD,EAAAA,WAAA,CAAW,cAAA,CAAe,OAAA,EAAS,CAAC,GAAA,KAAgB;AAClD,IAAA,OAAO,IAAI,WAAA,EAAY;AAAA,EACzB,CAAC,CAAA;AACH;AAGA,eAAA,EAAgB;ACjNhBA,WAAAA,CAAW,cAAA,CAAe,OAAA,EAAS,SAAyB,CAAA,EAAY,GAAY,OAAA,EAAmC;AACrH,EAAA,OAAO,CAAA,KAAM,IAAI,OAAA,CAAQ,EAAA,CAAG,IAAI,CAAA,GAAI,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAC1D,CAAC,CAAA;AAGDA,WAAAA,CAAW,eAAe,MAAA,EAAQ,CAAC,UAAmB,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAC3EA,WAAAA,CAAW,eAAe,MAAA,EAAQ,CAAC,UAAkBA,WAAAA,CAAW,gBAAA,CAAiB,KAAK,CAAC,CAAA;AACvFA,WAAAA,CAAW,cAAA,CAAe,MAAA,EAAQ,CAAC,GAAA,EAAa,UAAmB,SAAA,CAAU,EAAE,CAAC,GAAG,GAAG,KAAA,EAAO,CAAA,CAAE,MAAM,CAAA;AACrGA,WAAAA,CAAW,cAAA,CAAe,YAAY,CAAC,KAAA,KAAkB,IAAI,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,QAAQ,MAAA,EAAQ,GAAG,EAAE,OAAA,CAAQ,IAAA,EAAM,KAAM,CAAC,CAAA,CAAA,CAAG,CAAA;AAI7IA,WAAAA,CAAW,cAAA,CAAe,cAAA,EAAgB,SAAiC,SAAA,EAAmB,OAAA,EAAkB;AAE9G,EAAA,MAAM,UAAU,kBAAA,CAAmB,SAAA,EAAW,IAAA,CAAK,aAAa,EAAE,OAAA,EAAQ;AAC1E,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,KAAY,WAAA,IAAe,cAAc,KAAA,GAC7D,OAAA,CAAQ,OAAA,CAAQ,uBAAA,EAAyB,wBAAwB,CAAA,CAAE,OAAA,CAAQ,eAAA,EAAiB,gBAAgB,CAAA,GAC5G,OAAA;AACJ,EAAA,OAAO,UACH,UAAA,GACA,CAAA;AAAA,EAAiD,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA,CAAE,IAAI,CAAA,IAAA,KAAQ,IAAA,GAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,GAAK,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAC7H,CAAC,CAAA;AAED,IAAM,6BAAA,GAAgC,cAAA;AACtC,IAAM,4BAAA,uBAAmC,GAAA,CAAI,CAAC,OAAO,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,MAAM,CAAC,CAAA;AAIvF,IAAM,8BAAA,uBAAqC,GAAA,CAAI;AAAA,EAC7C,qBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAID,IAAM,QAAA,GAAW;AAAA,EACf,iBAAA,EAAmB,QAAA;AAAA,EACnB,sBAAA,EAAwB,QAAA;AAAA;AAAA,EAExB,MAAA,EAAQ,SAAA;AAAA,EACR,iBAAA,EAAmB,SAAA;AAAA,EACnB,eAAA,EAAiB,QAAA;AAAA;AAAA,EAEjB,gBAAA,EAAkB,QAAA;AAAA,EAClB,YAAA,EAAc,QAAA;AAAA,EACd,eAAA,EAAiB,QAAA;AAAA,EACjB,YAAA,EAAc,QAAA;AAAA,EACd,aAAA,EAAe,QAAA;AAAA,EACf,eAAA,EAAiB,QAAA;AAAA,EACjB,YAAA,EAAc,QAAA;AAAA,EACd,oBAAA,EAAsB,QAAA;AAAA,EACtB,0BAAA,EAA4B,QAAA;AAAA,EAC5B,kBAAA,EAAoB,QAAA;AAAA;AAAA,EAEpB,OAAA,EAAS,SAAA;AAAA,EACT,WAAA,EAAa,QAAA;AAAA,EACb,eAAA,EAAiB,QAAA;AAAA;AAAA,EAEjB,eAAA,EAAiB,SAAA;AAAA,EACjB,mBAAA,EAAqB,QAAA;AAAA;AAAA,EAErB,MAAA,EAAQ,SAAA;AAAA,EACR,SAAA,EAAW,SAAA;AAAA,EACX,iBAAA,EAAmB,QAAA;AAAA,EACnB,WAAA,EAAa,QAAA;AAAA,EACb,YAAA,EAAc,QAAA;AAAA;AAAA,EAEd,IAAA,EAAM,QAAA;AAAA,EACN,MAAA,EAAQ,SAAA;AAAA,EACR,IAAA,EAAM,QAAA;AAAA,EACN,MAAA,EAAQ,QAAA;AAAA;AAAA,EAER,MAAA,EAAQ,UAAA;AAAA,EACR,kBAAA,EAAoB,QAAA;AAAA,EACpB,kBAAA,EAAoB,SAAA;AAAA,EACpB,kBAAA,EAAoB,QAAA;AAAA;AAAA,EAEpB,SAAA,EAAW,SAAA;AAAA;AAAA,EAEX,UAAA,EAAY,QAAA;AAAA;AAAA,EAEZ,UAAA,EAAY,SAAA;AAAA;AAAA,EAEZ,GAAA,EAAK,QAAA;AAAA;AAAA,EAEL,QAAA,EAAU;AACZ,CAAA;AAIA,IAAM,sBAAA,GAAoE;AAAA,EACxE,GAAA,EAAK,IAAA;AAAA,EACL,GAAA,EAAK,IAAA;AAAA,EACL,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,eAAA,GAAkD;AAAA,EACtD,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,qBAAA,GAAmD,CAAC,KAAA,EAAO,KAAA,EAAO,SAAS,CAAA;AACjF,IAAM,2BAAA,GAAyD,CAAC,KAAA,EAAO,KAAA,EAAO,SAAS,CAAA;AACvF,IAAM,cAAA,GAAiB,CAAC,OAAA,EAAS,MAAM,CAAA;AACvC,IAAM,kBAAA,GAAqB,OAAA;AAE3B,IAAM,sBAAsB,aAAA,EAAc;AAC1C,IAAM,6BAAA,GAAgC,UAAA;AAItC,IAAM,yBAAA,GAA4B;AAAA,EAChC,UAAA;AAAA,EACA,kBAAA;AAAA,EACA,oBAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA;AACA,IAAM,uBAA+C,MAAA,CAAO,WAAA;AAAA,EAC1D,0BAA0B,GAAA,CAAI,CAAA,WAAA,KAAe,CAAC,WAAA,EAAa,mBAAmB,CAAC;AACjF,CAAA;AAEA,IAAM,mCAAA,GAA8D;AAAA,EAClE,wBAAwB,QAAA,CAAS,iBAAA;AAAA,EACjC,uCAAuC,QAAA,CAAS,sBAAA;AAAA,EAChD,sBAAsB,QAAA,CAAS,gBAAA;AAAA,EAC/B,kBAAkB,QAAA,CAAS,YAAA;AAAA,EAC3B,qBAAqB,QAAA,CAAS,eAAA;AAAA,EAC9B,kBAAkB,QAAA,CAAS,YAAA;AAAA,EAC3B,mBAAmB,QAAA,CAAS,aAAA;AAAA,EAC5B,qBAAqB,QAAA,CAAS,eAAA;AAAA,EAC9B,kBAAkB,QAAA,CAAS,YAAA;AAAA,EAC3B,0BAA0B,QAAA,CAAS,oBAAA;AAAA,EACnC,iCAAiC,QAAA,CAAS,0BAAA;AAAA,EAC1C,yBAAyB,QAAA,CAAS,kBAAA;AAAA,EAClC,wBAAwB,QAAA,CAAS,iBAAA;AAAA,EACjC,sBAAsB,QAAA,CAAS,eAAA;AAAA,EAC/B,wBAAwB,QAAA,CAAS,eAAA;AAAA,EACjC,iCAAiC,QAAA,CAAS,mBAAA;AAAA,EAC1C,oBAAoB,QAAA,CAAS,UAAA;AAAA,EAC7B,gCAAgC,QAAA,CAAS,YAAA;AAAA,EACzC,qBAAqB,QAAA,CAAS,eAAA;AAAA,EAC9B,mBAAmB,QAAA,CAAS,QAAA;AAAA,EAC5B,eAAe,QAAA,CAAS,SAAA;AAAA,EACxB,WAAW,QAAA,CAAS,MAAA;AAAA,EACpB,WAAW,QAAA,CAAS,OAAA;AAAA,EACpB,UAAU,QAAA,CAAS,MAAA;AAAA,EACnB,wBAAwB,QAAA,CAAS,kBAAA;AAAA,EACjC,wBAAwB,QAAA,CAAS,kBAAA;AAAA,EACjC,UAAU,QAAA,CAAS,MAAA;AAAA,EACnB,UAAU,QAAA,CAAS,MAAA;AAAA,EACnB,gBAAgB,QAAA,CAAS,WAAA;AAAA,EACzB,wBAAwB,QAAA,CAAS,kBAAA;AAAA,EACjC,eAAe,QAAA,CAAS,WAAA;AAAA,EACxB,QAAQ,QAAA,CAAS,IAAA;AAAA,EACjB,cAAc,QAAA,CAAS,UAAA;AAAA,EACvB,QAAQ,QAAA,CAAS,IAAA;AAAA,EACjB,UAAU,QAAA,CAAS,MAAA;AAAA,EACnB,OAAO,QAAA,CAAS;AAClB,CAAA;AAEA,IAAM,0BAAA,GAAqD;AAAA,EACzD,GAAG,oBAAA;AAAA,EACH,GAAG;AACL,CAAA;AAEA,IAAM,oCAAA,GAAuC;AAAA,EAC3C,sBAAA;AAAA,EACA,kBAAA;AAAA,EACA,8BAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,sBAAA;AAAA,EACA,sBAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,sBAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,wCAAA,GAA2C;AAAA,EAC/C,oBAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,oCAAA,GAAuC;AAAA,EAC3C,aAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,sCAAA,GAAyC;AAAA,EAC7C,kBAAA;AAAA,EACA,oBAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA,sBAAA;AAAA,EACA,+BAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,mCAAA,GAAsC;AAAA,EAC1C,sBAAA;AAAA,EACA,UAAA;AAAA,EACA,sBAAA;AAAA,EACA,oBAAA;AAAA,EACA,sBAAA;AAAA,EACA,+BAAA;AAAA,EACA,8BAAA;AAAA,EACA,mBAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,sBAAA;AAAA,EACA,sBAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,sBAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,mCAAA,GAAsC;AAAA,EAC1C,GAAG,mCAAA;AAAA,EACH,qCAAA;AAAA,EACA,oBAAA;AAAA,EACA,gBAAA;AAAA,EACA,mBAAA;AAAA,EACA,gBAAA;AAAA,EACA,iBAAA;AAAA,EACA,mBAAA;AAAA,EACA,gBAAA;AAAA,EACA,wBAAA;AAAA,EACA,+BAAA;AAAA,EACA,uBAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,uCAAA,GAA0C;AAAA,EAC9C,GAAG,mCAAA;AAAA,EACH;AACF,CAAA;AAEA,IAAM,4CAAA,GAA+C;AAAA,EACnD,sBAAA;AAAA,EACA,kBAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,sBAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,mBAAA,CACP,cACA,wBAAA,EACwB;AACxB,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,CAAC,GAAG,IAAI,IAAI,YAAY,CAAC,EACtB,IAAA,CAAK,CAAC,IAAA,EAAM,KAAA,KAAU,KAAK,aAAA,CAAc,KAAK,CAAC,CAAA,CAC/C,GAAA,CAAI,CAAC,WAAA,KAAgB;AACpB,MAAA,MAAM,OAAA,GAAU,yBAAyB,WAAW,CAAA;AACpD,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,WAAW,CAAA,CAAA,CAAG,CAAA;AAAA,MACxE;AACA,MAAA,OAAO,CAAC,aAAa,OAAO,CAAA;AAAA,IAC9B,CAAC;AAAA,GACL;AACF;AAEA,SAAS,gCAAgC,kBAAA,EAAyD;AAChG,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,OAAO,MAAM,CAAC,GAAA,EAAK,kBAAA,GAAqB,6BAAA,GAAgC,OAAO,CAAC;AAAA,GACtH;AACF;AAEA,SAAS,iCAAiC,UAAA,EAA6D;AACrG,EAAA,MAAM,YAAA,GAAyB;AAAA,IAC7B,GAAG,4CAAA;AAAA,IACH,kBAAA;AAAA,IACA,oBAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,IAAI,UAAA,CAAW,EAAA;AACb,IAAA,YAAA,CAAa,KAAK,aAAa,CAAA;AACjC,EAAA,IAAI,UAAA,CAAW,KAAA;AACb,IAAA,YAAA,CAAa,KAAK,aAAa,CAAA;AACjC,EAAA,IAAI,UAAA,CAAW,GAAA;AACb,IAAA,YAAA,CAAa,KAAK,WAAW,CAAA;AAC/B,EAAA,IAAI,UAAA,CAAW,MAAA;AACb,IAAA,YAAA,CAAa,KAAK,cAAc,CAAA;AAClC,EAAA,IAAI,UAAA,CAAW,OAAA;AACb,IAAA,YAAA,CAAa,KAAK,eAAe,CAAA;AACnC,EAAA,IAAI,UAAA,CAAW,EAAA;AACb,IAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAC9B,EAAA,IAAI,UAAA,CAAW,KAAA;AACb,IAAA,YAAA,CAAa,KAAK,aAAa,CAAA;AACjC,EAAA,IAAI,UAAA,CAAW,KAAA;AACb,IAAA,YAAA,CAAa,KAAK,aAAa,CAAA;AACjC,EAAA,IAAI,UAAA,CAAW,OAAA;AACb,IAAA,YAAA,CAAa,KAAK,eAAe,CAAA;AACnC,EAAA,IAAI,UAAA,CAAW,KAAA;AACb,IAAA,YAAA,CAAa,KAAK,aAAa,CAAA;AACjC,EAAA,IAAI,UAAA,CAAW,QAAA;AACb,IAAA,YAAA,CAAa,KAAK,gBAAgB,CAAA;AACpC,EAAA,IAAI,UAAA,CAAW,SAAA;AACb,IAAA,YAAA,CAAa,KAAK,iBAAiB,CAAA;AACrC,EAAA,IAAI,UAAA,CAAW,MAAA;AACb,IAAA,YAAA,CAAa,KAAK,cAAc,CAAA;AAElC,EAAA,OAAO,mBAAA,CAAoB,cAAc,0BAA0B,CAAA;AACrE;AAEA,SAAS,2BAA2B,OAAA,EAKT;AACzB,EAAA,MAAM,eAAyB,EAAC;AAEhC,EAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,IAAA,YAAA,CAAa,IAAA,CAAK,kBAAA,EAAoB,oBAAA,EAAsB,iBAAA,EAAmB,UAAU,CAAA;AACzF,IAAA,OAAO,mBAAA,CAAoB,cAAc,oBAAoB,CAAA;AAAA,EAC/D;AAEA,EAAA,YAAA,CAAa,IAAA,CAAK,cAAc,WAAW,CAAA;AAC3C,EAAA,IAAI,OAAA,CAAQ,KAAA;AACV,IAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAC9B,EAAA,IAAI,QAAQ,UAAA,CAAW,EAAA;AACrB,IAAA,YAAA,CAAa,KAAK,aAAa,CAAA;AACjC,EAAA,IAAI,QAAQ,UAAA,CAAW,KAAA;AACrB,IAAA,YAAA,CAAa,KAAK,aAAa,CAAA;AACjC,EAAA,IAAI,QAAQ,UAAA,CAAW,GAAA;AACrB,IAAA,YAAA,CAAa,KAAK,WAAW,CAAA;AAC/B,EAAA,IAAI,QAAQ,UAAA,CAAW,MAAA;AACrB,IAAA,YAAA,CAAa,KAAK,cAAc,CAAA;AAClC,EAAA,IAAI,QAAQ,UAAA,CAAW,OAAA;AACrB,IAAA,YAAA,CAAa,KAAK,eAAe,CAAA;AACnC,EAAA,IAAI,QAAQ,UAAA,CAAW,EAAA;AACrB,IAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAC9B,EAAA,IAAI,QAAQ,UAAA,CAAW,KAAA;AACrB,IAAA,YAAA,CAAa,KAAK,aAAa,CAAA;AACjC,EAAA,IAAI,QAAQ,UAAA,CAAW,KAAA;AACrB,IAAA,YAAA,CAAa,KAAK,aAAa,CAAA;AACjC,EAAA,IAAI,QAAQ,UAAA,CAAW,OAAA;AACrB,IAAA,YAAA,CAAa,KAAK,eAAe,CAAA;AACnC,EAAA,IAAI,QAAQ,UAAA,CAAW,KAAA;AACrB,IAAA,YAAA,CAAa,KAAK,aAAa,CAAA;AACjC,EAAA,IAAI,QAAQ,UAAA,CAAW,QAAA;AACrB,IAAA,YAAA,CAAa,KAAK,gBAAgB,CAAA;AACpC,EAAA,IAAI,QAAQ,UAAA,CAAW,SAAA;AACrB,IAAA,YAAA,CAAa,KAAK,iBAAiB,CAAA;AACrC,EAAA,IAAI,QAAQ,UAAA,CAAW,MAAA;AACrB,IAAA,YAAA,CAAa,KAAK,cAAc,CAAA;AAClC,EAAA,IAAI,OAAA,CAAQ,WAAW,YAAY,CAAA;AACjC,IAAA,YAAA,CAAa,KAAK,kBAAkB,CAAA;AACtC,EAAA,IAAI,QAAQ,UAAA,CAAW,SAAA;AACrB,IAAA,YAAA,CAAa,KAAK,iBAAiB,CAAA;AACrC,EAAA,IAAI,OAAA,CAAQ,cAAA,IAAkB,CAAC,OAAA,CAAQ,WAAW,YAAY,CAAA;AAC5D,IAAA,YAAA,CAAa,KAAK,kBAAkB,CAAA;AACtC,EAAA,IAAI,OAAA,CAAQ,cAAA,IAAkB,CAAC,OAAA,CAAQ,UAAA,CAAW,SAAA;AAChD,IAAA,YAAA,CAAa,KAAK,iBAAiB,CAAA;AAErC,EAAA,OAAO,mBAAA,CAAoB,cAAc,oBAAoB,CAAA;AAC/D;AAEA,SAAS,8BAA8B,SAAA,EAA8D;AACnG,EAAA,MAAM,YAAA,GAAyB;AAAA,IAC7B,GAAG,oCAAA;AAAA,IACH,GAAG,wCAAA;AAAA,IACH,GAAG,oCAAA;AAAA,IACH,GAAG;AAAA,GACL;AAEA,EAAA,IAAI,SAAA,CAAU,SAAS,KAAK,CAAA;AAC1B,IAAA,YAAA,CAAa,IAAA,CAAK,GAAG,mCAAmC,CAAA;AAC1D,EAAA,IAAI,SAAA,CAAU,SAAS,KAAK,CAAA;AAC1B,IAAA,YAAA,CAAa,IAAA,CAAK,GAAG,mCAAmC,CAAA;AAC1D,EAAA,IAAI,SAAA,CAAU,SAAS,SAAS,CAAA;AAC9B,IAAA,YAAA,CAAa,IAAA,CAAK,GAAG,uCAAuC,CAAA;AAE9D,EAAA,OAAO,mBAAA,CAAoB,cAAc,0BAA0B,CAAA;AACrE;AAyIA,IAAM,kBAAA,GAA+C;AAAA,EACnD,GAAA,EAAK,CAAC,eAAe,CAAA;AAAA,EACrB,OAAA,EAAS,CAAC,QAAQ,CAAA;AAAA,EAClB,EAAA,EAAI,CAAC,QAAQ,CAAA;AAAA,EACb,OAAA,EAAS,CAAC,QAAQ,CAAA;AAAA,EAClB,KAAA,EAAO,CAAC,QAAQ,CAAA;AAAA,EAChB,QAAA,EAAU,CAAC,QAAQ,CAAA;AAAA,EACnB,KAAA,EAAO,CAAC,QAAQ,CAAA;AAAA,EAChB,SAAA,EAAW,CAAC,QAAQ,CAAA;AAAA,EACpB,KAAA,EAAO,CAAC,QAAQ;AAClB,CAAA;AAKA,IAAM,sBAAA,GAAmD;AAAA,EACvD,GAAA,EAAK,CAAC,OAAA,EAAS,IAAA,EAAM,SAAS;AAChC,CAAA;AAEA,IAAM,gBAAA,GAAmB,cAAA;AACzB,IAAM,gBAAA,GAAmB,QAAA;AACzB,IAAM,sCAAA,GAAyC,wDAAA;AAC/C,IAAM,yBAAA,GAA4B,aAAA;AAClC,IAAM,sBAAA,GAAyB,WAAA;AAa/B,SAAS,gBAAA,GAA2B;AAClC,EAAA,MAAM,aAAaD,KAAAA,CAAK,OAAA,CAAQE,aAAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAE9D,EAAA,MAAM,QAAA,GAAWF,KAAAA,CAAK,OAAA,CAAQ,UAAA,EAAY,MAAM,WAAW,CAAA;AAC3D,EAAA,IAAI,GAAA,CAAI,cAAA,CAAe,QAAQ,CAAA,EAAG;AAChC,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,OAAOA,KAAAA,CAAK,OAAA,CAAQ,UAAA,EAAY,IAAA,EAAM,MAAM,WAAW,CAAA;AACzD;AAaA,eAAe,aAAA,CAAc,GAAA,EAAa,IAAA,EAAc,YAAA,EAAwC;AAC9F,EAAA,IAAI,CAAE,MAAM,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAI;AAChC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,CAAI,IAAA,CAAK,GAAA,EAAK,IAAA,EAAM;AAAA,IACxB,SAAA,EAAW,IAAA;AAAA,IACX,MAAA,EAAQ,CAAC,QAAA,KAAqB;AAC5B,MAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,QAAA,CAAS,GAAA,EAAK,QAAQ,CAAA;AAEvC,MAAA,IAAI,IAAI,QAAA,CAAS,IAAI,KAAK,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,EAAG;AAC5C,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,IAAI,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AAC7B,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAC3C,QAAA,OAAO,CAAC,YAAA,CAAa,IAAA,CAAK,CAAA,CAAA,KAAK,QAAQ,CAAA,IAAK,GAAA,CAAI,UAAA,CAAW,CAAA,EAAG,CAAC,CAAA,EAAGA,KAAAA,CAAK,GAAG,EAAE,CAAC,CAAA;AAAA,MAC/E;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,GACD,CAAA;AACH;AAKA,eAAe,aAAa,GAAA,EAAgC;AAC1D,EAAA,IAAI,CAAE,MAAM,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAI;AAChC,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,eAAe,KAAK,OAAA,EAAgC;AAClD,IAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,OAAA,CAAQ,SAAS,EAAE,aAAA,EAAe,MAAM,CAAA;AAClE,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,IAAA,CAAK,OAAA,EAAS,MAAM,IAAI,CAAA;AAC9C,MAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,QAAA,MAAM,KAAK,QAAQ,CAAA;AAAA,MACrB,CAAA,MAAA,IACS,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AACpC,QAAA,OAAA,CAAQ,IAAA,CAAKA,KAAAA,CAAK,QAAA,CAAS,GAAA,EAAK,QAAQ,CAAC,CAAA;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,KAAK,GAAG,CAAA;AACd,EAAA,OAAO,OAAA;AACT;AAQA,eAAe,4BAA4B,GAAA,EAAgC;AACzE,EAAA,IAAI,CAAE,MAAM,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAI;AAChC,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,eAAe,KAAK,OAAA,EAAgC;AAClD,IAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,OAAA,CAAQ,SAAS,EAAE,aAAA,EAAe,MAAM,CAAA;AAClE,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,IAAA,CAAK,OAAA,EAAS,MAAM,IAAI,CAAA;AAC9C,MAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,QAAA,MAAM,KAAK,QAAQ,CAAA;AACnB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAUA,KAAAA,CAAK,QAAA,CAAS,GAAA,EAAK,QAAQ,CAAA;AAC3C,MAAA,IAAI,CAAC,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,KAAM,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,IAAK,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,CAAA,EAAI;AACtF,QAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,KAAK,GAAG,CAAA;AACd,EAAA,OAAO,OAAA;AACT;AASO,SAAS,qBAAqB,OAAA,EAOjB;AAClB,EAAA,MAAM,aAAsC,EAAC;AAC7C,EAAA,KAAA,MAAW,CAAA,IAAK,QAAQ,QAAA,EAAU;AAChC,IAAA,UAAA,CAAW,CAAC,CAAA,GAAI,IAAA;AAAA,EAClB;AAGA,EAAA,IAAI,OAAA,CAAQ,YAAY,WAAA,EAAa;AACnC,IAAA,KAAA,MAAW,OAAA,IAAW,CAAC,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,SAAA,EAAW,OAAO,CAAA,EAAG,UAAA,CAAW,OAAO,CAAA,GAAI,IAAA;AAAA,EACpG;AAIA,EAAA,IAAI,WAAW,GAAA,EAAK;AAClB,IAAA,UAAA,CAAW,EAAA,GAAK,IAAA;AAChB,IAAA,UAAA,CAAW,KAAA,GAAQ,IAAA;AACnB,IAAA,UAAA,CAAW,MAAA,GAAS,IAAA;AAAA,EACtB;AAEA,EAAA,IAAI,UAAA,CAAW,KAAA,IAAS,UAAA,CAAW,SAAA,IAAa,WAAW,OAAA,EAAS;AAClE,IAAA,UAAA,CAAW,EAAA,GAAK,IAAA;AAAA,EAClB;AAEA,EAAA,MAAM,KAAA,GAAQ,QAAQ,OAAA,KAAY,KAAA;AAClC,EAAA,MAAM,WAAA,GAAc,QAAQ,OAAA,KAAY,WAAA;AACxC,EAAA,MAAM,cAAA,GAAiB,QAAQ,OAAA,KAAY,YAAA;AAC3C,EAAA,MAAM,eAAA,GAAkB,cAAA;AACxB,EAAA,MAAM,kBAAA,GAAqB,QAAQ,cAAA,KAAmB,MAAA;AACtD,EAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,IAAS,CAAC,WAAA;AACzB,EAAA,MAAM,iBAAA,GAAoB,QAAQ,SAAA,IAAa,2BAAA;AAC/C,EAAA,IAAI,kBAAA;AACJ,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,kBAAA,GAAqB,8BAA8B,iBAAiB,CAAA;AAAA,EACtE,WACS,KAAA,EAAO;AACd,IAAA,kBAAA,GAAqB,iCAAiC,UAAU,CAAA;AAAA,EAClE,CAAA,MACK;AACH,IAAA,kBAAA,GAAqB,0BAAA,CAA2B;AAAA,MAC9C,UAAA;AAAA,MACA,KAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO;AAAA,IACL,aAAa,OAAA,CAAQ,IAAA;AAAA,IACrB,QAAA,EAAU,QAAA;AAAA,IACV,kBAAA;AAAA,IACA,mBAAA,EAAqB,qBAAqB,6BAAA,GAAgC,mBAAA;AAAA,IAC1E,iBAAA,EAAmB,mBAAA;AAAA,IACnB,kBAAA;AAAA,IACA,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAA,EAAU,UAAA;AAAA,IACV,eAAe,OAAA,CAAQ,aAAA;AAAA,IACvB,KAAA;AAAA,IACA,OAAA,EAAS,CAAC,KAAA,IAAS,CAAC,WAAA;AAAA,IACpB,cAAA;AAAA,IACA,cAAA,EAAgB,KAAA;AAAA,IAChB,eAAA;AAAA,IACA,aAAA,EAAe,OAAA,CAAQ,aAAA,EAAe,IAAA,EAAM,aAAA,IAAiB,OAAA;AAAA,IAC7D,gBAAgB,OAAA,CAAQ,cAAA;AAAA,IACxB,KAAK,KAAA,GACD,gCAAA,CAAiC,OAAA,CAAQ,IAAA,EAAM,kBAAkB,CAAA,GACjE,MAAA;AAAA,IACJ,WAAW,WAAA,GACP,6BAAA;AAAA,MACE,OAAA,CAAQ,IAAA;AAAA,MACR,iBAAA;AAAA,MACA,OAAA,CAAQ,aAAA;AAAA,MACR;AAAA,KACF,GACA;AAAA,GACN;AACF;AAEA,SAAS,gCAAA,CACP,WAAA,EACA,kBAAA,GAAqB,KAAA,EACQ;AAC7B,EAAA,MAAM,UAAA,GAAa,aAAa,WAAW,CAAA;AAC3C,EAAA,MAAM,UAAA,GAAa,mBAAmB,UAAU,CAAA;AAEhD,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,QAAA;AAAA,IACV,iBAAA,EAAmB,gCAAgC,kBAAkB,CAAA;AAAA,IACrE,mBAAA,EAAqB,GAAG,WAAW,CAAA,SAAA,CAAA;AAAA,IACnC,kBAAA,EAAoB,GAAG,UAAU,CAAA,QAAA,CAAA;AAAA,IACjC,kBAAA,EAAoB,GAAG,WAAW,CAAA,QAAA,CAAA;AAAA,IAClC,qBAAA,EAAuB,SAAS,UAAU,CAAA,GAAA,CAAA;AAAA,IAC1C,4BAAA,EAA8B,SAAS,UAAU,CAAA,UAAA;AAAA,GACnD;AACF;AAEA,SAAS,6BAAA,CACP,WAAA,EACA,cAAA,EACA,aAAA,EACA,qBAAqB,KAAA,EACK;AAC1B,EAAA,MAAM,iBAAA,GAAoB,CAAC,GAAG,IAAI,GAAA,CAAI,eAAe,MAAA,GAAS,CAAA,GAAI,cAAA,GAAiB,2BAA2B,CAAC,CAAA;AAE/G,EAAA,MAAM,WAAA,GAAc,aAAA,EAAe,SAAA,EAAW,KAAA,IAAS,EAAC;AACxD,EAAA,MAAM,UAAU,CAAC,MAAA,KACf,YAAY,MAAM,CAAA,IAAK,uBAAuB,MAAM,CAAA;AAEtD,EAAA,MAAM,eAAe,iBAAA,CAClB,MAAA,CAAO,qBAAqB,CAAA,CAC5B,IAAI,CAAA,MAAA,MAAW;AAAA,IACd,MAAA;AAAA,IACA,WAAA,EAAa,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,IACrC,KAAA,EAAO,gBAAgB,MAAM,CAAA;AAAA,IAC7B,IAAA,EAAM,QAAQ,MAAM;AAAA,GACtB,CAAE,CAAA;AAEJ,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,aAAA,EAAe,IAAA,EAAM,IAAA,IAAQ,WAAA;AAAA,IACtC,QAAA,EAAU,QAAA;AAAA,IACV,iBAAA,EAAmB,gCAAgC,kBAAkB,CAAA;AAAA,IACrE,mBAAA,EAAqB,GAAG,WAAW,CAAA,SAAA,CAAA;AAAA,IACnC,kBAAA,EAAoB,CAAA,EAAG,YAAA,CAAa,WAAW,CAAC,CAAA,QAAA,CAAA;AAAA,IAChD,eAAA,EAAiB,GAAG,WAAW,CAAA,KAAA,CAAA;AAAA,IAC/B,kBAAA,EAAoB,YAAA,CAAa,WAAW,CAAA,CAAE,WAAA,EAAY;AAAA,IAC1D,iBAAA,EAAmB,GAAG,WAAW,CAAA,OAAA,CAAA;AAAA,IACjC,iBAAA;AAAA,IACA,qBAAA,EAAuB,CAAA,CAAA,EAAI,iBAAA,CAAkB,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,IAC1E,YAAA;AAAA,IACA,WAAA,EAAa,aAAa,CAAC,CAAA;AAAA,IAC3B,SAAA,EAAW;AAAA,MACT,GAAA,EAAK,iBAAA,CAAkB,QAAA,CAAS,KAAK,CAAA;AAAA,MACrC,GAAA,EAAK,iBAAA,CAAkB,QAAA,CAAS,KAAK,CAAA;AAAA,MACrC,OAAA,EAAS,iBAAA,CAAkB,QAAA,CAAS,SAAS,CAAA;AAAA,MAC7C,OAAA,EAAS,iBAAA,CAAkB,QAAA,CAAS,SAAS;AAAA,KAC/C;AAAA,IACA,KAAA,EAAO;AAAA,MACL,GAAA,EAAK,QAAQ,KAAK,CAAA;AAAA,MAClB,GAAA,EAAK,QAAQ,KAAK,CAAA;AAAA,MAClB,OAAA,EAAS,QAAQ,SAAS;AAAA,KAC5B;AAAA,IACA,UAAA,EAAY,iBAAA,CAAkB,QAAA,CAAS,SAAS,CAAA;AAAA,IAChD,IAAA,EAAM,mBAAmB,aAAa,CAAA;AAAA,IACtC,KAAA,EAAO,oBAAoB,aAAa;AAAA,GAC1C;AACF;AAEA,SAAS,mBAAmB,aAAA,EAAqD;AAC/E,EAAA,MAAM,UAAA,GAAa,aAAA,EAAe,IAAA,EAAM,aAAA,IAAiB,OAAA;AACzD,EAAA,MAAM,UAAA,GAAa,aAAA,EAAe,SAAA,EAAW,IAAA,EAAM,UAAA,IAAc,UAAA;AACjE,EAAA,MAAM,cAAA,GAAiB,UAAA,KAAe,OAAA,GAAU,OAAA,GAAU,OAAA;AAC1D,EAAA,MAAM,SAAA,GAAY,aAAA,EAAe,SAAA,EAAW,IAAA,EAAM,OAAA;AAClD,EAAA,MAAM,OAAA,GAAU,SAAA,IAAa,SAAA,CAAU,MAAA,GAAS,IAC5C,CAAC,GAAG,IAAI,GAAA,CAAI,SAAS,CAAC,CAAA,GACtB,CAAC,YAAY,cAAc,CAAA;AAC/B,EAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,EAAG;AACjC,IAAA,OAAA,CAAQ,QAAQ,UAAU,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,EAAE,YAAY,OAAA,EAAQ;AAC/B;AAEA,SAAS,oBAAoB,aAAA,EAAsD;AACjF,EAAA,MAAM,YAAA,GAAe,aAAA,EAAe,SAAA,EAAW,KAAA,EAAO,YAAA,IAAgB,kBAAA;AACtE,EAAA,MAAM,SAAA,GAAY,aAAA,EAAe,SAAA,EAAW,KAAA,EAAO,MAAA;AACnD,EAAA,MAAM,MAAA,GAAS,SAAA,IAAa,SAAA,CAAU,MAAA,GAAS,IAC3C,CAAC,GAAG,IAAI,GAAA,CAAI,SAAS,CAAC,CAAA,GACtB,CAAC,GAAG,cAAc,CAAA;AACtB,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,YAAY,CAAA,EAAG;AAClC,IAAA,MAAA,CAAO,QAAQ,YAAY,CAAA;AAAA,EAC7B;AACA,EAAA,OAAO,EAAE,cAAc,MAAA,EAAO;AAChC;AAEA,SAAS,sBAAsB,MAAA,EAA6D;AAC1F,EAAA,OAAO,qBAAA,CAAsB,SAAS,MAAM,CAAA;AAC9C;AAEA,SAAS,aAAa,KAAA,EAAuB;AAC3C,EAAA,MAAM,QAAQ,KAAA,CACX,KAAA,CAAM,yBAAyB,CAAA,CAC/B,OAAO,OAAO,CAAA;AACjB,EAAA,MAAM,KAAA,GAAQ,KAAA,CACX,GAAA,CAAI,CAAC,MAAM,KAAA,KAAU;AACpB,IAAA,MAAM,UAAA,GAAa,KAAK,WAAA,EAAY;AACpC,IAAA,OAAO,KAAA,KAAU,CAAA,GACb,UAAA,GACA,CAAA,EAAG,WAAW,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,EAAG,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,EACjE,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACV,EAAA,IAAI,CAAC,KAAA;AACH,IAAA,OAAO,KAAA;AACT,EAAA,OAAO,uBAAuB,IAAA,CAAK,KAAK,CAAA,GAAI,KAAA,GAAQ,MAAM,KAAK,CAAA,CAAA;AACjE;AAEA,SAAS,mBAAmB,KAAA,EAAuB;AACjD,EAAA,IAAI,CAAC,KAAA;AACH,IAAA,OAAO,KAAA;AACT,EAAA,OAAO,CAAA,EAAG,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAC1D;AAkBA,eAAsB,qBAAA,CACpB,aACA,OAAA,EACe;AACf,EAAA,MAAM,OAAO,gBAAA,EAAiB;AAC9B,EAAA,MAAM,mBAAA,GAAsB,OAAA,CAAQ,OAAA,KAAY,WAAA,IAAe,CAAC,OAAA,CAAQ,cAAA;AAGxE,EAAA,IAAI,mBAAA,EAAqB;AACvB,IAAA,MAAM,cAAcA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,MAAM,GAAG,WAAW,CAAA;AAAA,EAC1D,CAAA,MACK;AAEH,IAAA,MAAM,GAAA,CAAI,IAAA,CAAKA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,MAAA,EAAQ,iBAAiB,CAAA,EAAGA,KAAAA,CAAK,IAAA,CAAK,WAAA,EAAa,iBAAiB,CAAC,CAAA;AAAA,EACtG;AAIA,EAAA,MAAM,SAASA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,MAAA,EAAQ,QAAQ,OAAO,CAAA;AACtD,EAAA,IAAI,MAAM,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,EAAG;AAChC,IAAA,MAAM,cAAc,OAAA,CAAQ,OAAA,GAAU,EAAC,GAAI,CAAC,UAAU,CAAA;AACtD,IAAA,MAAM,aAAA,CAAc,MAAA,EAAQ,WAAA,EAAa,WAAW,CAAA;AAAA,EACtD;AAGA,EAAA,IAAI,CAAC,OAAA,CAAQ,cAAA,IAAkB,OAAA,CAAQ,YAAY,WAAA,EAAa;AAC9D,IAAA,KAAA,MAAW,SAAA,IAAa,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACrD,MAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,EAAG;AAChC,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,CAAC,gBAAA,CAAiB,IAAA,CAAK,SAAS,CAAA,EAAG;AACrC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,UAAA,GAAaA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,YAAY,SAAS,CAAA;AACxD,MAAA,IAAI,CAAE,MAAM,GAAA,CAAI,UAAA,CAAW,UAAU,CAAA,EAAI;AACvC,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,SAAS,CAAA,IAAK,EAAC;AACrD,MAAA,KAAA,MAAW,WAAW,UAAA,EAAY;AAEhC,QAAA,IAAI,OAAA,CAAQ,cAAA,IAAkB,OAAA,KAAY,eAAA,EAAiB;AACzD,UAAA;AAAA,QACF;AACA,QAAA,MAAM,SAAA,GAAYA,KAAAA,CAAK,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA;AAC/C,QAAA,IAAI,MAAM,GAAA,CAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACnC,UAAA,MAAM,cAAc,SAAA,EAAWA,KAAAA,CAAK,KAAK,WAAA,EAAa,KAAA,EAAO,QAAQ,CAAC,CAAA;AAAA,QACxE;AAAA,MACF;AAGA,MAAA,MAAM,gBAAA,GAAmB,sBAAA,CAAuB,SAAS,CAAA,IAAK,EAAC;AAC/D,MAAA,IAAI,gBAAA,CAAiB,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC9C,QAAA,MAAM,cAAcA,KAAAA,CAAK,IAAA,CAAK,YAAY,CAAA,OAAA,EAAU,OAAA,CAAQ,OAAO,CAAA,CAAE,CAAA;AACrE,QAAA,IAAI,MAAM,GAAA,CAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AACrC,UAAA,MAAM,cAAc,WAAA,EAAaA,KAAAA,CAAK,KAAK,WAAA,EAAa,KAAA,EAAO,QAAQ,CAAC,CAAA;AAAA,QAC1E;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,kBAAA,CAAmB,IAAA,EAAM,WAAA,EAAa,OAAO,CAAA;AAGnD,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,MAAM,OAAA,GAAUA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA;AACtC,IAAA,IAAI,MAAM,GAAA,CAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AACjC,MAAA,MAAM,IAAI,IAAA,CAAK,OAAA,EAAS,aAAa,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IAC1D;AAAA,EACF;AAGA,EAAA,IAAI,mBAAA,EAAqB;AACvB,IAAA,MAAM,IAAI,SAAA,CAAUA,KAAAA,CAAK,IAAA,CAAK,WAAA,EAAa,QAAQ,CAAC,CAAA;AAAA,EACtD;AACF;AAYA,eAAe,kBAAA,CACb,aAAA,EACA,WAAA,EACA,OAAA,EACe;AAEf,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,KAAY,WAAA,IAAe,QAAQ,cAAA,GACxD,CAACA,KAAAA,CAAK,IAAA,CAAK,aAAA,EAAe,MAAA,EAAQ,OAAA,CAAQ,OAAO,CAAC,CAAA,GAClD;AAAA,IACEA,KAAAA,CAAK,IAAA,CAAK,aAAA,EAAe,MAAM,CAAA;AAAA,IAC/BA,KAAAA,CAAK,IAAA,CAAK,aAAA,EAAe,MAAA,EAAQ,QAAQ,OAAO;AAAA,GAClD;AAEJ,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,cAAA,CAAe,GAAA,EAAK,WAAA,EAAa,OAAO,CAAA;AAC9C,IAAA,MAAM,2BAAA,CAA4B,GAAA,EAAK,WAAA,EAAa,OAAO,CAAA;AAAA,EAC7D;AAGA,EAAA,IAAI,OAAA,CAAQ,cAAA,IAAkB,OAAA,CAAQ,OAAA,KAAY,WAAA,EAAa;AAC7D,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAaA,KAAAA,CAAK,IAAA,CAAK,WAAA,EAAa,OAAO,QAAQ,CAAA;AACzD,EAAA,KAAA,MAAW,SAAA,IAAa,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACrD,IAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,EAAG;AAChC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAaA,KAAAA,CAAK,IAAA,CAAK,aAAA,EAAe,YAAY,SAAS,CAAA;AACjE,IAAA,IAAI,CAAE,MAAM,GAAA,CAAI,UAAA,CAAW,UAAU,CAAA,EAAI;AACvC,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,SAAS,CAAA,IAAK,EAAC;AACrD,IAAA,KAAA,MAAW,WAAW,UAAA,EAAY;AAEhC,MAAA,IAAI,OAAA,CAAQ,cAAA,IAAkB,OAAA,KAAY,eAAA,EAAiB;AACzD,QAAA;AAAA,MACF;AACA,MAAA,MAAM,eAAeA,KAAAA,CAAK,IAAA,CAAK,YAAY,OAAO,CAAA,EAAG,YAAY,OAAO,CAAA;AAAA,IAC1E;AAGA,IAAA,MAAM,gBAAA,GAAmB,sBAAA,CAAuB,SAAS,CAAA,IAAK,EAAC;AAC/D,IAAA,IAAI,gBAAA,CAAiB,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC9C,MAAA,MAAM,cAAA;AAAA,QACJA,MAAK,IAAA,CAAK,UAAA,EAAY,CAAA,OAAA,EAAU,OAAA,CAAQ,OAAO,CAAA,CAAE,CAAA;AAAA,QACjD,UAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACF;AAKA,eAAe,cAAA,CACb,GAAA,EACA,QAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,GAAG,CAAA;AACvC,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,OAAA,GAAUA,KAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA;AACtC,IAAA,MAAM,kBAAA,GAAqB,OAAA,CAAQ,OAAA,CAAQ,gBAAA,EAAkB,EAAE,CAAA;AAE/D,IAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,QAAA,CAAS,SAAS,OAAO,CAAA;AACpD,IAAA,MAAM,WAAWC,WAAAA,CAAW,OAAA,CAAQ,UAAU,EAAE,QAAA,EAAU,MAAM,CAAA;AAChE,IAAA,MAAM,QAAA,GAAW,SAAS,OAAO,CAAA;AACjC,IAAA,IAAI,sBAAA,CAAuB,QAAA,EAAU,QAAQ,CAAA,EAAG;AAC9C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,kBAAA,EAAoB,OAAO,CAAA;AAC/D,IAAA,IAAI,CAAC,kBAAA,CAAmB,UAAU,CAAA,EAAG;AACnC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,CAAQ,cAAA,IAAkB,8BAAA,CAA+B,GAAA,CAAI,UAAA,CAAW,KAAA,CAAMD,KAAAA,CAAK,GAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG;AACtG,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA;AAC/C,IAAA,MAAM,kBAAA,GAAqB,wBAAA,CAAyB,QAAA,EAAU,UAAU,CAAA;AAExE,IAAA,MAAM,GAAA,CAAI,SAAA,CAAUA,KAAAA,CAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC1C,IAAA,MAAM,GAAA,CAAI,SAAA,CAAU,QAAA,EAAU,kBAAA,EAAoB,OAAO,CAAA;AAAA,EAC3D;AACF;AAEA,eAAe,2BAAA,CACb,GAAA,EACA,QAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,WAAA,GAAc,MAAM,2BAAA,CAA4B,GAAG,CAAA;AACzD,EAAA,KAAA,MAAW,WAAW,WAAA,EAAa;AACjC,IAAA,IAAI,CAAC,gCAAA,CAAiC,OAAA,EAAS,OAAO,CAAA,EAAG;AACvD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,OAAA,EAAS,OAAO,CAAA;AACpD,IAAA,IAAI,CAAC,kBAAA,CAAmB,UAAU,CAAA,EAAG;AACnC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAUA,KAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA;AACtC,IAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA;AAC/C,IAAA,MAAM,GAAA,CAAI,SAAA,CAAUA,KAAAA,CAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC1C,IAAA,MAAM,GAAA,CAAI,QAAA,CAAS,OAAA,EAAS,QAAQ,CAAA;AAAA,EACtC;AACF;AAEA,SAAS,gCAAA,CAAiC,SAAiB,OAAA,EAAmC;AAC5F,EAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,WAAA,IAAe,CAAC,QAAQ,SAAA,EAAW;AACzD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,iBAAiB,OAAA,CAAQ,KAAA,CAAMA,MAAK,GAAG,CAAA,CAAE,KAAK,GAAG,CAAA;AACvD,EAAA,MAAM,aAAA,GAAgB,sCAAA,CAAuC,IAAA,CAAK,cAAc,CAAA;AAChF,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,cAAc,CAAC,CAAA;AAC9B,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,SAAA,CAAU,SAAA,CAAU,MAAM,CAAC,CAAA;AACpD;AAEA,SAAS,wBAAA,CAAyB,SAAiB,UAAA,EAA4B;AAC7E,EAAA,MAAM,qBAAA,GAAwB,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA;AAC3D,EAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AACnC,EAAA,MAAM,UAAA,GAAa,6BAA6B,GAAA,CAAI,GAAG,IACnD,qBAAA,CAAsB,OAAA,CAAQ,SAAA,EAAW,MAAM,CAAA,GAC/C,qBAAA;AACJ,EAAA,IAAI,UAAA,CAAW,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AAClC,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,OAAO,WAAW,QAAA,CAAS,IAAI,CAAA,GAAI,UAAA,GAAa,GAAG,UAAU;AAAA,CAAA;AAC/D;AAEA,SAAS,sBAAA,CAAuB,UAAkB,QAAA,EAA2B;AAC3E,EAAA,OAAO,SAAS,QAAA,CAAS,6BAA6B,KAAK,QAAA,CAAS,IAAA,GAAO,MAAA,KAAW,CAAA;AACxF;AAEA,SAAS,gBAAA,CAAiB,cAAsB,OAAA,EAAkC;AAChF,EAAA,MAAM,qBAAqB,YAAA,CAAa,KAAA,CAAMA,MAAK,GAAG,CAAA,CAAE,KAAK,GAAG,CAAA;AAChE,EAAA,OAAOC,WAAAA,CAAW,QAAQ,kBAAA,EAAoB,EAAE,UAAU,IAAA,EAAM,EAAE,OAAO,CAAA;AAC3E;AAEA,SAAS,mBAAmB,YAAA,EAA+B;AACzD,EAAA,MAAM,UAAA,GAAaD,KAAAA,CAAK,SAAA,CAAU,YAAY,CAAA;AAC9C,EAAA,OAAO,CAACA,KAAAA,CAAK,UAAA,CAAW,UAAU,CAAA,IAAK,UAAA,KAAe,IAAA,IAAQ,CAAC,UAAA,CAAW,UAAA,CAAW,CAAA,EAAA,EAAKA,KAAAA,CAAK,GAAG,CAAA,CAAE,CAAA;AACtG;;;AC7pCA,IAAM,YAAA,GAAe,eAAA;AACrB,IAAM,cAAA,GAAiB,YAAA;AAKvB,IAAM,SAAA,GAAkG;AAAA,EACtG,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,0BAAA;AAAA,IACN,WAAA,EAAa,yGAAA;AAAA,IACb,eAAA,EAAiB,CAAC,KAAA,EAAO,IAAA,EAAM,SAAS,QAAQ;AAAA,GAClD;AAAA,EACA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,0BAAA;AAAA,IACN,WAAA,EAAa,4FAAA;AAAA,IACb,eAAA,EAAiB,CAAC,IAAA,EAAM,OAAO;AAAA,GACjC;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,iBAAA;AAAA,IACN,WAAA,EAAa,wFAAA;AAAA,IACb,eAAA,EAAiB,CAAC,IAAA,EAAM,OAAO;AAAA,GACjC;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,kBAAA;AAAA,IACN,WAAA,EAAa,sFAAA;AAAA,IACb,eAAA,EAAiB,CAAC,IAAA,EAAM,OAAO;AAAA,GACjC;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,0BAAA;AAAA,IACN,WAAA,EAAa,iHAAA;AAAA,IACb,eAAA,EAAiB,CAAC,YAAA,EAAc,WAAW;AAAA,GAC7C;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,4CAAA;AAAA,IACN,WAAA,EAAa,sLAAA;AAAA,IACb,iBAAiB,CAAC,KAAA,EAAO,MAAM,OAAA,EAAS,QAAA,EAAU,WAAW,OAAO;AAAA;AAExE,CAAA;AAEA,IAAM,gBAAA,GAAwG;AAAA,EAC5G,KAAK,EAAE,IAAA,EAAM,OAAO,WAAA,EAAa,qCAAA,EAAc,aAAa,IAAA,EAAK;AAAA,EACjE,KAAK,EAAE,IAAA,EAAM,OAAO,WAAA,EAAa,oDAAA,EAA6B,aAAa,IAAA,EAAK;AAAA,EAChF,SAAS,EAAE,IAAA,EAAM,sBAAO,WAAA,EAAa,sFAAA,EAAkB,aAAa,KAAA,EAAM;AAAA,EAC1E,SAAS,EAAE,IAAA,EAAM,sBAAO,WAAA,EAAa,kDAAA,EAAiB,aAAa,IAAA;AACrE,CAAA;AAEA,IAAMG,4BAAAA,GAAgD,CAAC,KAAA,EAAO,KAAA,EAAO,SAAS,CAAA;AAS9E,IAAM,QAAA,GAA8C;AAAA,EAClD,KAAA,EAAO;AAAA,IACL,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,4CAAA;AAAA,IACN,WAAA,EAAa,yEAAA;AAAA,IACb,QAAA,EAAU,CAAC,WAAW,CAAA;AAAA,IACtB,YAAA,EAAc,CAAC,QAAA,EAAU,IAAA,EAAM,OAAO;AAAA,GACxC;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,IAAA;AAAA,IACJ,IAAA,EAAM,oBAAA;AAAA,IACN,WAAA,EAAa,gEAAA;AAAA,IACb,QAAA,EAAU,CAAC,aAAa;AAAA,GAC1B;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,cAAA;AAAA,IACN,WAAA,EAAa,kCAAA;AAAA,IACb,QAAA,EAAU,CAAC,aAAa;AAAA,GAC1B;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,IAAA;AAAA,IACJ,IAAA,EAAM,iBAAA;AAAA,IACN,WAAA,EAAa,0GAAA;AAAA,IACb,QAAA,EAAU,CAAC,UAAU;AAAA,GACvB;AAAA,EACA,SAAA,EAAW;AAAA,IACT,EAAA,EAAI,SAAA;AAAA,IACJ,IAAA,EAAM,0BAAA;AAAA,IACN,WAAA,EAAa,6DAAA;AAAA,IACb,QAAA,EAAU,CAAC,eAAe;AAAA,GAC5B;AAAA,EACA,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,QAAA;AAAA,IACJ,IAAA,EAAM,0BAAA;AAAA,IACN,WAAA,EAAa,+DAAA;AAAA,IACb,QAAA,EAAU,CAAC,cAAc;AAAA,GAC3B;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,0BAAA;AAAA,IACN,WAAA,EAAa,wDAAA;AAAA,IACb,QAAA,EAAU,CAAC,aAAa,CAAA;AAAA,IACxB,YAAA,EAAc,CAAC,IAAI;AAAA,GACrB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,0BAAA;AAAA,IACN,WAAA,EAAa,gFAAA;AAAA,IACb,QAAA,EAAU,CAAC,aAAa;AAAA,GAC1B;AAAA,EACA,SAAA,EAAW;AAAA,IACT,EAAA,EAAI,SAAA;AAAA,IACJ,IAAA,EAAM,0BAAA;AAAA,IACN,WAAA,EAAa,uFAAA;AAAA,IACb,QAAA,EAAU,CAAC,eAAe,CAAA;AAAA,IAC1B,YAAA,EAAc,CAAC,IAAI;AAAA,GACrB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,gCAAA;AAAA,IACN,WAAA,EAAa,qGAAA;AAAA,IACb,QAAA,EAAU,CAAC,aAAa;AAAA,GAC1B;AAAA,EACA,UAAA,EAAY;AAAA,IACV,EAAA,EAAI,UAAA;AAAA,IACJ,IAAA,EAAM,sCAAA;AAAA,IACN,WAAA,EAAa,kGAAA;AAAA,IACb,QAAA,EAAU,CAAC,gBAAgB;AAAA,GAC7B;AAAA,EACA,WAAA,EAAa;AAAA,IACX,EAAA,EAAI,WAAA;AAAA,IACJ,IAAA,EAAM,0BAAA;AAAA,IACN,WAAA,EAAa,+EAAA;AAAA,IACb,QAAA,EAAU,CAAC,iBAAiB,CAAA;AAAA,IAC5B,YAAA,EAAc,CAAC,IAAI;AAAA,GACrB;AAAA,EACA,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,QAAA;AAAA,IACJ,IAAA,EAAM,gCAAA;AAAA,IACN,WAAA,EAAa,sFAAA;AAAA,IACb,QAAA,EAAU,CAAC,cAAc;AAAA,GAC3B;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,EAAA,EAAI,YAAA;AAAA,IACJ,IAAA,EAAM,yBAAA;AAAA,IACN,WAAA,EAAa,uGAAA;AAAA,IACb,QAAA,EAAU,CAAC,kBAAkB;AAAA,GAC/B;AAAA,EACA,WAAA,EAAa;AAAA,IACX,EAAA,EAAI,WAAA;AAAA,IACJ,IAAA,EAAM,gCAAA;AAAA,IACN,WAAA,EAAa,0FAAA;AAAA,IACb,QAAA,EAAU,CAAC,iBAAiB;AAAA;AAEhC,CAAA;AAKA,IAAM,mBAAA,GAAmC;AAAA,EACvC,KAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,kBAAA,GAAqB,cAAA;AAM3B,IAAM,iBAAA,GAAoB;AAAA,EACxB,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,gEAAA;AAAA,IACb,UAAU;AAAC,GACb;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,yEAAA;AAAA,IACb,QAAA,EAAU,CAAC,KAAA,EAAO,IAAA,EAAM,SAAS,QAAQ;AAAA,GAC3C;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa,0DAAA;AAAA,IACb,QAAA,EAAU;AAAA,MACR,KAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA;AACF,GACF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,sEAAA;AAAA,IACb,UAAU;AAAC;AAEf,CAAA;AASA,eAAsB,cAAc,OAAA,EAA8C;AAChF,EAAA,MAAM,UAAU,GAAA,EAAI;AAEpB,EAAA,IAAI;AAEF,IAAA,MAAM,eAAA,GAAkB,MAAM,cAAA,CAAe,OAAO,CAAA;AAGpD,IAAA,IAAI,CAAC,kBAAA,CAAmB,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA,EAAG;AAClD,MAAA,aAAA,CAAc,MAAM,GAAA,CAAI,CAAA,6CAAA,EAAa,eAAA,CAAgB,IAAI,mGAAmB,CAAC,CAAA;AAC7E,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,cAAcH,KAAAA,CAAK,OAAA,CAAQ,gBAAgB,GAAA,IAAO,GAAA,EAAK,gBAAgB,IAAI,CAAA;AAGjF,IAAA,IAAI,MAAM,UAAA,CAAW,WAAW,CAAA,EAAG;AACjC,MAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,OAAA,CAAQ;AAAA,QAClC,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,CAAA,aAAA,EAAM,eAAA,CAAgB,IAAI,CAAA,uDAAA,CAAA;AAAA,QACnC,OAAA,EAAS;AAAA,OACV,CAAA;AAED,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,eAAA,CAAgB,KAAA,CAAM,MAAA,CAAO,oBAAK,CAAC,CAAA;AACnC,QAAA;AAAA,MACF;AAEA,MAAA,MAAMI,GAAAA,CAAI,OAAO,WAAW,CAAA;AAAA,IAC9B;AAEA,IAAA,OAAA,CAAQ,MAAM,yCAAW,CAAA;AACzB,IAAA,MAAMA,GAAAA,CAAI,UAAU,WAAW,CAAA;AAC/B,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAGhB,IAAA,OAAA,CAAQ,MAAM,yCAAW,CAAA;AAEzB,IAAA,MAAM,UAAU,oBAAA,CAAqB;AAAA,MACnC,MAAM,eAAA,CAAgB,IAAA;AAAA,MACtB,SAAS,eAAA,CAAgB,OAAA;AAAA,MACzB,UAAU,eAAA,CAAgB,QAAA;AAAA,MAC1B,WAAW,eAAA,CAAgB,SAAA;AAAA,MAC3B,eAAe,eAAA,CAAgB,aAAA;AAAA,MAC/B,gBAAgB,eAAA,CAAgB;AAAA,KACjC,CAAA;AAGD,IAAA,MAAM,qBAAA,CAAsB,aAAa,OAAO,CAAA;AAEhD,IAAA;AAEE,MAAA,MAAM,EAAE,kBAAA,EAAAC,mBAAAA,EAAoB,oBAAmB,GAAI,MAAM,OAAO,oCAA2B,CAAA;AAC3F,MAAA,MAAM,UAAU,eAAA,CAAgB,aAAA;AAChC,MAAA,MAAM,cAAA,GAAiB,gBAAgB,OAAA,KAAY,KAAA;AACnD,MAAA,MAAM,WAAA,GAAc,gBAAgB,OAAA,KAAY,WAAA;AAChD,MAAA,MAAM,SAAA,GAAY,cAAA,GACdL,KAAAA,CAAK,IAAA,CAAK,WAAA,EAAa,MAAA,EAAQ,CAAA,EAAG,eAAA,CAAgB,IAAI,CAAA,QAAA,CAAA,EAAY,QAAQ,CAAA,GAC1E,WAAA,GACEA,MAAK,IAAA,CAAK,WAAA,EAAa,UAAA,EAAY,CAAA,EAAG,eAAA,CAAgB,IAAI,CAAA,KAAA,CAAA,EAAS,QAAQ,CAAA,GAC3EA,KAAAA,CAAK,IAAA,CAAK,WAAA,EAAa,QAAQ,CAAA;AACrC,MAAA,MAAM,cAAA,GAAiB,cAAA,GACnBA,KAAAA,CAAK,IAAA,CAAK,aAAa,MAAA,EAAQ,CAAA,EAAG,eAAA,CAAgB,IAAI,YAAY,cAAc,CAAA,GAChFA,KAAAA,CAAK,IAAA,CAAK,aAAa,cAAc,CAAA;AAEzC,MAAA,KAAA,MAAW,SAAA,IAAa,gBAAgB,QAAA,EAAU;AAChD,QAAA,MAAM,SAAA,GAAY,oBAAoB,SAAS,CAAA;AAC/C,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAM,aAAaA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,CAAA,CAAA,EAAI,SAAS,CAAA,IAAA,CAAM,CAAA;AAE3D,UAAA,IAAI,WAAA,IAAe,MAAMI,GAAAA,CAAI,UAAA,CAAW,UAAU,CAAA;AAChD,YAAA;AACF,UAAA,MAAM,SAAA,CAAU,UAAA,EAAYC,mBAAAA,CAAmB,SAAA,EAAW,OAAO,CAAC,CAAA;AAAA,QACpE;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,cAAA,IAAkB,CAAC,WAAA,EAAa;AAEnC,QAAA,MAAM,SAAA;AAAA,UACJL,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,WAAW,CAAA;AAAA,UAChCK,mBAAAA,CAAmB,QAAQ,OAAO;AAAA,SACpC;AAAA,MACF;AAEA,MAAA,MAAM,aAAa,cAAA,GACf,CAAA,EAAG,mBAAmB,eAAA,CAAgB,QAAA,EAAU,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,GACxD,cACE,CAAA,EAAG,kBAAA,CAAmB,gBAAgB,QAAA,EAAU,OAAA,EAAS,IAAI,CAAC;AAAA;AAAA;;AAAA;AAAA;AAAA,CAAA,GAC9D,kBAAA,CAAmB,eAAA,CAAgB,QAAA,EAAU,OAAO,CAAA;AAE1D,MAAA,MAAM,SAAA,CAAU,gBAAgB,UAAU,CAAA;AAC1C,MAAA,IAAI,WAAA,EAAa;AAEf,QAAA,MAAM,WAAW,CAAA,IAAA,EAAO,WAAA,CAAY,EAAE,CAAA,CAAE,QAAA,CAAS,WAAW,CAAC,CAAA,CAAA;AAC7D,QAAA,MAAMD,GAAAA,CAAI,SAAA,CAAUJ,KAAAA,CAAK,IAAA,CAAK,WAAA,EAAa,MAAM,CAAA,EAAG,UAAA,CAAW,OAAA,CAAQ,+BAAA,EAAiC,CAAA,2BAAA,EAA8B,QAAQ;AAAA,CAAI,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AAAA,MACtK;AAAA,IACF;AAGA,IAAA,MAAM,EAAE,kBAAA,EAAmB,GAAI,MAAM,OAAO,mCAA0B,CAAA;AACtE,IAAA,MAAM,kBAAA;AAAA,MACJ,WAAA;AAAA,MACA,eAAA,CAAgB,QAAA;AAAA,MAChB,eAAA,CAAgB,OAAA;AAAA,MAChB,eAAA,CAAgB;AAAA,KAClB;AAGA,IAAA,MAAM,YAAA,GAAe,SAAA,CAAU,eAAA,CAAgB,OAAO,CAAA,CAAE,IAAA;AACxD,IAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,OAAA,KAAY,WAAA,GAC9C,uBAAA,CAAwB,eAAA,CAAgB,IAAA,EAAM,eAAA,CAAgB,cAAA,EAAiB,eAAA,CAAgB,SAAS,CAAA,GACxG,eAAA,CAAgB,OAAA,KAAY,KAAA,GAC1B,0BAAA,CAA2B,eAAA,CAAgB,IAAA,EAAM,eAAA,CAAgB,cAAe,CAAA,GAChF,cAAA,CAAe,eAAA,CAAgB,IAAA,EAAM,YAAA,EAAc,eAAA,CAAgB,cAAA,EAAiB,eAAA,CAAgB,OAAO,CAAA;AACjH,IAAA,MAAM,SAAA;AAAA,MACJA,KAAAA,CAAK,IAAA,CAAK,WAAA,EAAa,WAAW,CAAA;AAAA,MAClC;AAAA,KACF;AAEA,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAGhB,IAAA,IAAI,gBAAgB,GAAA,EAAK;AACvB,MAAA,OAAA,CAAQ,MAAM,wCAAe,CAAA;AAC7B,MAAA,QAAA,CAAS,YAAY,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,UAAU,CAAA;AAC1D,MAAA,IAAI,gBAAgB,SAAA,EAAW;AAG7B,QAAA,MAAM,YAAY,eAAA,CAAgB,SAAA;AAClC,QAAA,IAAI,CAAC,aAAa,IAAA,CAAK,SAAS,KAAK,CAAC,cAAA,CAAe,IAAA,CAAK,SAAS,CAAA,EAAG;AACpE,UAAA,OAAA,CAAQ,IAAA,EAAK;AACb,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,SAAS,CAAA,CAAE,CAAA;AAAA,QACvD;AACA,QAAA,YAAA,CAAa,KAAA,EAAO,CAAC,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,SAAS,CAAA,EAAG,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,QAAA,EAAU,CAAA;AAAA,MACnG;AACA,MAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,IAClB;AAGA,IAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,0BAAA,EAAS,eAAA,CAAgB,cAAc,CAAA,IAAA,CAAM,CAAA;AAC3D,MAAA,mBAAA,CAAoB,WAAA,EAAa,gBAAgB,cAAe,CAAA;AAChE,MAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,IAClB;AAGA,IAAA,sBAAA,CAAuB,eAAe,CAAA;AAAA,EACxC,SACO,KAAA,EAAO;AACZ,IAAA,OAAA,CAAQ,IAAA,EAAK;AACb,IAAA,aAAA,CAAc,MAAM,GAAA,CAAI,IAAA,CAAK,kBAAkB,CAAC,GAAG,KAAK,CAAA;AACxD,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AASA,eAAe,eAAe,OAAA,EAAwE;AACpG,EAAA,MAAM,WAAA,GAAc,QAAQ,GAAA,IAAO,KAAA;AAEnC,EAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,EAAA,eAAA,CAAgB,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,iCAA0B,CAAC,CAAA;AAC3D,EAAA,eAAA,CAAgB,KAAA,CAAM,IAAA,CAAK,8DAAwD,CAAC,CAAA;AACpF,EAAA,eAAA,CAAgB,EAAE,CAAA;AAElB,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,eAAA,CAAgB,KAAA,CAAM,GAAA,CAAI,sBAAO,CAAC,CAAA;AAClC,IAAAF,QAAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAA;AAGA,EAAA,IAAI,cAAc,OAAA,CAAQ,IAAA;AAC1B,EAAA,IAAI,CAAC,eAAe,WAAA,EAAa;AAC/B,IAAA,WAAA,GAAc,QAAA;AAAA,EAChB,CAAA,MAAA,IACS,CAAC,WAAA,EAAa;AACrB,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,OAAA,CAAQ;AAAA,MAC7B,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,2BAAA;AAAA,MACT,OAAA,EAAS,QAAA;AAAA,MACT,QAAA,EAAU,CAAC,KAAA,KAAkB;AAC3B,QAAA,IAAI,CAAC,MAAM,IAAA,EAAK;AACd,UAAA,OAAO,kDAAA;AACT,QAAA,IAAI,CAAC,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAA;AAChC,UAAA,OAAO,oHAAA;AACT,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACF,EAAG,EAAE,QAAA,EAAU,CAAA;AACf,IAAA,WAAA,GAAc,IAAA;AAAA,EAChB;AAGA,EAAA,IAAI,kBAAkB,OAAA,CAAQ,OAAA;AAC9B,EAAA,IAAI,CAAC,mBAAmB,WAAA,EAAa;AACnC,IAAA,eAAA,GAAkB,OAAA;AAAA,EACpB,CAAA,MAAA,IACS,CAAC,eAAA,EAAiB;AACzB,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,OAAA,CAAQ;AAAA,MAChC,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,2BAAA;AAAA,MACT,IAAA,EAAM,KAAK,gBAAgB,CAAA;AAAA,MAC3B,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,CAAC,CAAA,MAAO;AAAA,QACpD,OAAO,CAAA,CAAE,IAAA;AAAA,QACT,WAAA,EAAa,uBAAA,CAAwB,CAAA,CAAE,WAAW,CAAA;AAAA,QAClD,KAAA,EAAO;AAAA,OACT,CAAE,CAAA;AAAA,MACF,OAAA,EAAS;AAAA,KACX,EAAG,EAAE,QAAA,EAAU,CAAA;AACf,IAAA,eAAA,GAAkB,OAAA;AAAA,EACpB;AAEA,EAAA,MAAM,kBAAmB,eAAA,IAAmB,OAAA;AAE5C,EAAA,MAAM,iBAAA,GAAoB,eAAA,KAAoB,WAAA,GAC1C,MAAM,sBAAA,CAAuB,QAAQ,SAAA,EAAW,WAAA,EAAa,QAAQ,CAAA,GACrE,EAAC;AAGL,EAAA,IAAI,mBAAmB,OAAA,CAAQ,QAAA;AAC/B,EAAA,IAAI,oBAAoB,WAAA,EAAa;AACnC,IAAA,gBAAA,GAAmB,gBAAA,IAAoB,QAAA;AAAA,EACzC,CAAA,MAAA,IACS,CAAC,gBAAA,EAAkB;AAC1B,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,gBAAA,GAAmB,SAAA;AAAA,IACrB,CAAA,MACK;AACH,MAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAA,CAAQ;AAAA,QACjC,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,OAAA,EAAS,2BAAA;AAAA,QACT,IAAA,EAAM,KAAK,gBAAgB,CAAA;AAAA,QAC3B,SAAS,MAAA,CAAO,MAAA,CAAO,iBAAiB,CAAA,CAAE,IAAI,CAAA,CAAA,MAAM;AAAA,UAClD,OAAO,CAAA,CAAE,IAAA;AAAA,UACT,WAAA,EAAa,uBAAA,CAAwB,CAAA,CAAE,WAAW,CAAA;AAAA,UAClD,OAAO,CAAA,CAAE;AAAA,SACX,CAAE,CAAA;AAAA,QACF,OAAA,EAAS;AAAA,OACX,EAAG,EAAE,QAAA,EAAU,CAAA;AACf,MAAA,gBAAA,GAAmB,QAAA;AAAA,IACrB;AAAA,EACF;AAGA,EAAA,IAAI,mBAAgC,EAAC;AACrC,EAAA,MAAM,eAAA,GAAkB,SAAA,CAAU,eAAe,CAAA,CAAE,eAAA;AAEnD,EAAA,IAAI,oBAAoB,WAAA,EAAa;AACnC,IAAA,gBAAA,GAAmB,2BAA2B,eAAe,CAAA;AAAA,EAC/D,WACS,gBAAA,KAAqB,QAAA,IAAY,CAAC,OAAA,CAAQ,YAAY,WAAA,EAAa;AAC1E,IAAA,gBAAA,GAAmB,2BAA2B,eAAe,CAAA;AAAA,EAC/D,CAAA,MAAA,IACS,gBAAA,KAAqB,QAAA,IAAY,CAAC,QAAQ,QAAA,EAAU;AAC3D,IAAA,MAAM,cAAA,GAAiB,mBAAA,CAAoB,GAAA,CAAI,CAAA,EAAA,MAAO;AAAA,MACpD,KAAA,EAAO,QAAA,CAAS,EAAE,CAAA,CAAE,IAAA;AAAA,MACpB,WAAA,EAAa,uBAAA,CAAwB,QAAA,CAAS,EAAE,EAAE,WAAW,CAAA;AAAA,MAC7D,KAAA,EAAO,EAAA;AAAA,MACP,QAAA,EAAU,eAAA,CAAgB,QAAA,CAAS,EAAE;AAAA,KACvC,CAAE,CAAA;AAEF,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAA,CAAQ;AAAA,MACjC,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS,KAAK,oBAAoB,CAAA;AAAA,MAClC,OAAA,EAAS,cAAA;AAAA,MACT,IAAA,EAAM,KAAK,qBAAqB,CAAA;AAAA,MAChC,YAAA,EAAc;AAAA,KAChB,EAAG,EAAE,QAAA,EAAU,CAAA;AAEf,IAAA,gBAAA,GAAmB,YAAY,EAAC;AAChC,IAAA,gBAAA,GAAmB,2BAA2B,gBAAgB,CAAA;AAAA,EAChE,CAAA,MAAA,IACS,gBAAA,KAAqB,QAAA,IAAY,OAAA,CAAQ,QAAA,EAAU;AAC1D,IAAA,gBAAA,GAAmB,0BAAA,CAA2B,QAAQ,QAAQ,CAAA;AAAA,EAChE,CAAA,MACK;AACH,IAAA,MAAM,gBAAA,GAAmB,iBAAA,CAAkB,gBAAkD,CAAA,EAAG,YAAY,EAAC;AAC7G,IAAA,MAAM,MAAA,uBAAa,GAAA,CAAI,CAAC,GAAG,gBAAA,EAAkB,GAAG,eAAe,CAAC,CAAA;AAChE,IAAA,gBAAA,GAAmB,0BAAA,CAA2B,KAAA,CAAM,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,EAClE;AAGA,EAAA,MAAM,aAAA,GAAgB,oBAAoB,WAAA,GACtC,EAAE,GAAG,yBAAA,CAA0B,gBAAA,EAAkB,WAAY,CAAA,EAAG,GAAG,OAAA,CAAQ,eAAc,GACzF,OAAA,CAAQ,aAAA,KAAkB,WAAA,GACxB,yBAAA,CAA0B,gBAAA,EAAkB,WAAY,CAAA,GACxD,MAAM,mBAAA,CAAoB,gBAAA,EAAkB,WAAY,CAAA,CAAA;AAG9D,EAAA,IAAI,cAAc,OAAA,CAAQ,QAAA;AAC1B,EAAA,IAAI,WAAA,KAAgB,UAAa,WAAA,EAAa;AAC5C,IAAA,WAAA,GAAc,IAAA;AAAA,EAChB,CAAA,MAAA,IACS,gBAAgB,MAAA,EAAW;AAClC,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAA,CAAQ;AAAA,MACjC,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS,mDAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACX,EAAG,EAAE,QAAA,EAAU,CAAA;AACf,IAAA,WAAA,GAAc,QAAA;AAAA,EAChB;AAGA,EAAA,MAAM,QAAA,GAAW,MAAM,oBAAA,CAAqB,OAAA,CAAQ,OAAO,GAAG,CAAA;AAC9D,EAAA,IAAI,iBAAiB,eAAA,KAAoB,WAAA,IAAe,eAAA,KAAoB,KAAA,GACxE,SACA,OAAA,CAAQ,cAAA;AACZ,EAAA,IAAI,CAAC,kBAAkB,WAAA,EAAa;AAClC,IAAA,cAAA,GAAiB,QAAA;AAAA,EACnB;AACA,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,MAAM,EAAE,EAAA,EAAG,GAAI,MAAM,OAAA,CAAQ;AAAA,MAC3B,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,IAAA;AAAA,MACN,OAAA,EAAS,2BAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,qBAAA,EAAa,KAAA,EAAO,MAAA,EAAO;AAAA,QACpC,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,QAC7B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO,OACjC;AAAA,MACA,SAAS,QAAA,KAAa,MAAA,GAAS,CAAA,GAAI,QAAA,KAAa,QAAQ,CAAA,GAAI;AAAA,KAC9D,EAAG,EAAE,QAAA,EAAU,CAAA;AACf,IAAA,cAAA,GAAiB,EAAA;AAAA,EACnB;AAGA,EAAA,IAAI,UAAU,OAAA,CAAQ,OAAA;AACtB,EAAA,IAAI,OAAA,KAAY,UAAa,WAAA,EAAa;AACxC,IAAA,OAAA,GAAU,IAAA;AAAA,EACZ,CAAA,MAAA,IACS,YAAY,MAAA,EAAW;AAC9B,IAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,OAAA,CAAQ;AAAA,MAClC,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,WAAA;AAAA,MACN,OAAA,EAAS,uCAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACX,EAAG,EAAE,QAAA,EAAU,CAAA;AACf,IAAA,OAAA,GAAU,SAAA;AAAA,EACZ;AAGA,EAAA,IAAI,MAAM,OAAA,CAAQ,GAAA;AAClB,EAAA,IAAI,GAAA,KAAQ,UAAa,WAAA,EAAa;AACpC,IAAA,GAAA,GAAM,IAAA;AAAA,EACR,CAAA,MAAA,IACS,QAAQ,MAAA,EAAW;AAC1B,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,OAAA,CAAQ;AAAA,MAChC,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,qCAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACX,EAAG,EAAE,QAAA,EAAU,CAAA;AACf,IAAA,GAAA,GAAM,OAAA;AAAA,EACR;AAGA,EAAA,IAAI,YAAY,OAAA,CAAQ,SAAA;AACxB,EAAA,IAAI,GAAA,IAAO,SAAA,KAAc,MAAA,IAAa,WAAA,EAAa;AACjD,IAAA,SAAA,GAAY,EAAA;AAAA,EACd,CAAA,MAAA,IACS,GAAA,IAAO,SAAA,KAAc,MAAA,EAAW;AACvC,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,OAAA,CAAQ;AAAA,MAC/B,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,4EAAA;AAAA,MACT,OAAA,EAAS,EAAA;AAAA,MACT,QAAA,EAAU,CAAC,KAAA,KAAkB;AAC3B,QAAA,IAAI,CAAC,MAAM,IAAA,EAAK;AACd,UAAA,OAAO,IAAA;AACT,QAAA,IAAI,aAAa,IAAA,CAAK,KAAK,CAAA,IAAK,cAAA,CAAe,KAAK,KAAK,CAAA;AACvD,UAAA,OAAO,IAAA;AACT,QAAA,OAAO,oGAAA;AAAA,MACT;AAAA,KACF,EAAG,EAAE,QAAA,EAAU,CAAA;AACf,IAAA,SAAA,GAAY,MAAA,EAAQ,MAAK,IAAK,EAAA;AAAA,EAChC;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IACN,OAAA,EAAS,eAAA;AAAA,IACT,SAAA,EAAW,iBAAA;AAAA,IACX,UAAW,gBAAA,IAAoB,SAAA;AAAA,IAC/B,QAAA,EAAU,gBAAA;AAAA,IACV,aAAA;AAAA,IACA,UAAU,WAAA,IAAe,IAAA;AAAA,IACzB,SAAS,OAAA,IAAW,IAAA;AAAA,IACpB,gBAAgB,cAAA,IAAkB,MAAA;AAAA,IAClC,KAAK,GAAA,IAAO,IAAA;AAAA,IACZ,WAAW,SAAA,IAAa,EAAA;AAAA,IACxB,GAAA,EAAK,WAAA;AAAA,IACL,OAAA,EAAS,QAAQ,OAAA,IAAW,KAAA;AAAA,IAC5B,GAAA,EAAK,QAAQ,GAAA,IAAO;AAAA,GACtB;AACF;AAEA,SAAS,yBAAA,CAA0B,UAAuB,WAAA,EAAoC;AAC5F,EAAA,MAAM,OAAA,GAAyB;AAAA,IAC7B,IAAA,EAAM,EAAE,IAAA,EAAM,WAAA,EAAa,eAAe,OAAA;AAAQ,GACpD;AAEA,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,EAAG;AAC3B,IAAA,OAAA,CAAQ,EAAA,GAAK,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,eAAA,EAAgB;AAAA,EAC3D;AACA,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG;AAC9B,IAAA,OAAA,CAAQ,KAAA,GAAQ,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,EACnC;AACA,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA,EAAG;AAC5B,IAAA,OAAA,CAAQ,GAAA,GAAM,EAAE,aAAA,EAAe,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,EACvD;AACA,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,SAAS,CAAA,EAAG;AAChC,IAAA,OAAA,CAAQ,OAAA,GAAU,EAAE,IAAA,EAAM,OAAA,EAAS,WAAW,gBAAA,EAAiB;AAAA,EACjE;AACA,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,EAAG;AAC3B,IAAA,OAAA,CAAQ,EAAA,GAAK,EAAE,eAAA,EAAiB,QAAA,EAAU,OAAO,aAAA,EAAc;AAAA,EACjE;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,eAAe,sBAAA,CACb,SAAA,EACA,WAAA,EACA,QAAA,EAC2B;AAC3B,EAAA,IAAI,SAAA,IAAa,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AACrC,IAAA,OAAO,yBAAyB,SAAS,CAAA;AAAA,EAC3C;AACA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAOK,4BAAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,iBAAA,EAAkB,GAAI,MAAM,OAAA,CAAQ;AAAA,IAC1C,IAAA,EAAM,aAAA;AAAA,IACN,IAAA,EAAM,mBAAA;AAAA,IACN,OAAA,EAAS,KAAK,qBAAqB,CAAA;AAAA,IACnC,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,gBAAgB,CAAA,CAAE,IAAI,CAAC,CAAC,EAAA,EAAI,MAAM,CAAA,MAAO;AAAA,MAC/D,OAAO,MAAA,CAAO,IAAA;AAAA,MACd,WAAA,EAAa,uBAAA,CAAwB,MAAA,CAAO,WAAW,CAAA;AAAA,MACvD,KAAA,EAAO,EAAA;AAAA,MACP,QAAA,EAAUA,4BAAAA,CAA4B,QAAA,CAAS,EAAoB;AAAA,KACrE,CAAE,CAAA;AAAA,IACF,IAAA,EAAM,KAAK,qBAAqB,CAAA;AAAA,IAChC,YAAA,EAAc;AAAA,GAChB,EAAG,EAAE,QAAA,EAAU,CAAA;AAEf,EAAA,OAAO,wBAAA,CAAyB,qBAAqBA,4BAA2B,CAAA;AAClF;AAEA,SAAS,yBAAyB,SAAA,EAA+C;AAC/E,EAAA,MAAM,eAAe,IAAI,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAC,CAAA;AAC1D,EAAA,MAAM,SAAS,SAAA,CAAU,MAAA,CAAO,YAAU,YAAA,CAAa,GAAA,CAAI,MAAM,CAAC,CAAA;AAClE,EAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,OAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAASA,4BAA2B,CAAC,CAAA;AAC9E;AASA,SAAS,2BAA2B,QAAA,EAAoC;AACtE,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,QAAQ,CAAA;AAE/B,EAAA,IAAI,OAAA,GAAU,IAAA;AACd,EAAA,OAAO,OAAA,EAAS;AACd,IAAA,OAAA,GAAU,KAAA;AACV,IAAA,KAAA,MAAW,aAAa,MAAA,EAAQ;AAC9B,MAAA,MAAM,OAAA,GAAU,SAAS,SAAS,CAAA;AAClC,MAAA,IAAI,SAAS,YAAA,EAAc;AACzB,QAAA,KAAA,MAAW,GAAA,IAAO,QAAQ,YAAA,EAAc;AACtC,UAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,EAAG;AACpB,YAAA,MAAA,CAAO,IAAI,GAAG,CAAA;AACd,YAAA,OAAA,GAAU,IAAA;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,MAAM,CAAA;AAC1B;AASA,eAAe,mBAAA,CAAoB,UAAuB,WAAA,EAA6C;AACrG,EAAA,MAAM,UAAyB,EAAC;AAChC,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,eAAA,CAAgB,KAAA,CAAM,GAAA,CAAI,sBAAO,CAAC,CAAA;AAClC,IAAAL,QAAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAA;AAEA,EAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,EAAA,eAAA,CAAgB,KAAA,CAAM,IAAA,CAAK,mCAAU,CAAC,CAAA;AACtC,EAAA,eAAA,CAAgB,KAAA,CAAM,IAAA,CAAK,uGAAuB,CAAC,CAAA;AACnD,EAAA,eAAA,CAAgB,EAAE,CAAA;AAGlB,EAAA,OAAA,CAAQ,IAAA,GAAO,MAAM,gBAAA,CAAiB,WAAA,EAAa,QAAQ,CAAA;AAE3D,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,EAAG;AAC3B,IAAA,OAAA,CAAQ,EAAA,GAAK,MAAM,cAAA,CAAe,WAAA,EAAa,QAAQ,CAAA;AAAA,EACzD;AACA,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG;AAC9B,IAAA,OAAA,CAAQ,KAAA,GAAQ,MAAM,iBAAA,CAAkB,QAAQ,CAAA;AAAA,EAClD;AACA,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA,EAAG;AAC5B,IAAA,OAAA,CAAQ,GAAA,GAAM,MAAM,eAAA,CAAgB,QAAQ,CAAA;AAAA,EAC9C;AACA,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,SAAS,CAAA,EAAG;AAChC,IAAA,OAAA,CAAQ,OAAA,GAAU,MAAM,mBAAA,CAAoB,QAAQ,CAAA;AAAA,EACtD;AACA,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,EAAG;AAC3B,IAAA,OAAA,CAAQ,EAAA,GAAK,MAAM,cAAA,CAAe,QAAQ,CAAA;AAAA,EAC5C;AAEA,EAAA,OAAO,OAAA;AACT;AAKA,eAAe,gBAAA,CAAiB,aAAqB,QAAA,EAAsD;AACzG,EAAA,eAAA,CAAgB,KAAA,CAAM,IAAA,CAAK,+CAAiB,CAAC,CAAA;AAC7C,EAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,OAAA,CAAQ;AAAA,IACtC,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,eAAA;AAAA,IACN,OAAA,EAAS,2BAAA;AAAA,IACT,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,sBAAA,EAAc,KAAA,EAAO,OAAA,EAAQ;AAAA,MACtC,EAAE,KAAA,EAAO,iBAAA,EAAmB,KAAA,EAAO,OAAA;AAAQ,KAC7C;AAAA,IACA,OAAA,EAAS;AAAA,GACX,EAAG,EAAE,QAAA,EAAU,CAAA;AACf,EAAA,OAAO,EAAE,IAAA,EAAM,WAAA,EAAa,aAAA,EAAc;AAC5C;AAKA,eAAe,cAAA,CAAe,aAAqB,QAAA,EAAoD;AACrG,EAAA,eAAA,CAAgB,KAAA,CAAM,IAAA,CAAK,uCAAc,CAAC,CAAA;AAC1C,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,OAAA,CAAQ;AAAA,IAC7B,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,OAAA,EAAS,iCAAA;AAAA,IACT,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,2DAAA,EAAqB,KAAA,EAAO,QAAA,EAAS;AAAA,MAC9C,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,YAAA,EAAa;AAAA,MAC3C,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA;AAAQ,KACnC;AAAA,IACA,OAAA,EAAS;AAAA,GACX,EAAG,EAAE,QAAA,EAAU,CAAA;AAEf,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAA,CAAQ;AAAA,MACjC,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS,wCAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACX,EAAG,EAAE,QAAA,EAAU,CAAA;AACf,IAAA,OAAO,EAAE,MAAM,QAAA,EAAS;AAAA,EAC1B;AAEA,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ;AAAA,IAC5B,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,CAAA,EAAG,IAAA,KAAS,YAAA,GAAe,YAAA,GAAe,OAAO,CAAA,cAAA,CAAA,EAAQ,SAAS,WAAA,EAAY;AAAA,IACrH,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,eAAA,EAAO,OAAA,EAAS,IAAA,KAAS,YAAA,GAAe,IAAA,GAAO,IAAA,EAAK;AAAA,IAC7F,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,YAAY,OAAA,EAAS,iCAAA,EAAU,SAAS,WAAA;AAAY,GAC5E,EAAG,EAAE,QAAA,EAAU,CAAA;AAEf,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,MAAM,OAAA,CAAQ,IAAA,EAAM,QAAA,EAAU,OAAA,CAAQ,QAAA,EAAS;AACpF;AAKA,eAAe,kBAAkB,QAAA,EAAuD;AACtF,EAAA,eAAA,CAAgB,KAAA,CAAM,IAAA,CAAK,oCAAgB,CAAC,CAAA;AAC5C,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,OAAA,CAAQ;AAAA,IAC7B,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,OAAA,EAAS,2BAAA;AAAA,IACT,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,6EAAA,EAAmB,KAAA,EAAO,QAAA,EAAS;AAAA,MAC5C,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA;AAAQ,KACnC;AAAA,IACA,OAAA,EAAS;AAAA,GACX,EAAG,EAAE,QAAA,EAAU,CAAA;AAEf,EAAA,IAAI,IAAA,KAAS,QAAA;AACX,IAAA,OAAO,EAAE,IAAA,EAAK;AAEhB,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ;AAAA,IAC5B,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,QAAQ,OAAA,EAAS,qBAAA,EAAa,SAAS,WAAA,EAAY;AAAA,IACzE,EAAE,MAAM,QAAA,EAAU,IAAA,EAAM,QAAQ,OAAA,EAAS,qBAAA,EAAa,SAAS,IAAA;AAAK,GACtE,EAAG,EAAE,QAAA,EAAU,CAAA;AAEf,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,QAAQ,IAAA,EAAM,IAAA,EAAM,QAAQ,IAAA,EAAK;AACxD;AAKA,eAAe,gBAAgB,QAAA,EAAqD;AAClF,EAAA,eAAA,CAAgB,KAAA,CAAM,IAAA,CAAK,8CAAgB,CAAC,CAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ;AAAA,IAC5B,EAAE,MAAM,SAAA,EAAW,IAAA,EAAM,iBAAiB,OAAA,EAAS,uCAAA,EAAW,SAAS,IAAA,EAAK;AAAA,IAC5E,EAAE,MAAM,SAAA,EAAW,IAAA,EAAM,YAAY,OAAA,EAAS,kDAAA,EAAiB,SAAS,KAAA;AAAM,GAChF,EAAG,EAAE,QAAA,EAAU,CAAA;AACf,EAAA,OAAO,EAAE,aAAA,EAAe,OAAA,CAAQ,aAAA,EAAe,QAAA,EAAU,QAAQ,QAAA,EAAS;AAC5E;AAKA,eAAe,oBAAoB,QAAA,EAAyD;AAC1F,EAAA,eAAA,CAAgB,KAAA,CAAM,IAAA,CAAK,kDAAoB,CAAC,CAAA;AAChD,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,OAAA,CAAQ;AAAA,IAC7B,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,OAAA,EAAS,2BAAA;AAAA,IACT,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,6EAAA,EAAmB,KAAA,EAAO,OAAA,EAAQ;AAAA,MAC3C,EAAE,KAAA,EAAO,kBAAA,EAAoB,KAAA,EAAO,IAAA;AAAK,KAC3C;AAAA,IACA,OAAA,EAAS;AAAA,GACX,EAAG,EAAE,QAAA,EAAU,CAAA;AAEf,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,OAAA,CAAQ;AAAA,MAClC,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,WAAA;AAAA,MACN,OAAA,EAAS,2BAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACX,EAAG,EAAE,QAAA,EAAU,CAAA;AACf,IAAA,OAAO,EAAE,MAAM,SAAA,EAAU;AAAA,EAC3B;AAEA,EAAA,OAAO,EAAE,IAAA,EAAK;AAChB;AAKA,eAAe,eAAe,QAAA,EAAoD;AAChF,EAAA,eAAA,CAAgB,KAAA,CAAM,IAAA,CAAK,oCAAgB,CAAC,CAAA;AAC5C,EAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,MAAM,OAAA,CAAQ;AAAA,IACxC,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,iBAAA;AAAA,IACN,OAAA,EAAS,cAAA;AAAA,IACT,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,MACnC,EAAE,KAAA,EAAO,oBAAA,EAAsB,KAAA,EAAO,WAAA,EAAY;AAAA,MAClD,EAAE,KAAA,EAAO,oCAAA,EAAkB,KAAA,EAAO,QAAA;AAAS,KAC7C;AAAA,IACA,OAAA,EAAS;AAAA,GACX,EAAG,EAAE,QAAA,EAAU,CAAA;AAEf,EAAA,MAAM,eAAe,eAAA,KAAoB,QAAA,GACrC,aAAA,GACA,eAAA,KAAoB,cAClB,iBAAA,GACA,EAAA;AAEN,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAA,CAAQ;AAAA,IAC9B,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,OAAA;AAAA,IACN,OAAA,EAAS,2BAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX,EAAG,EAAE,QAAA,EAAU,CAAA;AAEf,EAAA,OAAO,EAAE,iBAAiB,KAAA,EAAM;AAClC;AASA,SAAS,oBAAoB,SAAA,EAAqC;AAChE,EAAA,MAAM,GAAA,GAA8B;AAAA,IAClC,EAAA,EAAI,IAAA;AAAA,IACJ,KAAA,EAAO,OAAA;AAAA,IACP,GAAA,EAAK,KAAA;AAAA,IACL,OAAA,EAAS,SAAA;AAAA,IACT,EAAA,EAAI,IAAA;AAAA,IACJ,MAAA,EAAQ,QAAA;AAAA,IACR,KAAA,EAAO,OAAA;AAAA,IACP,KAAA,EAAO,OAAA;AAAA,IACP,SAAA,EAAW,WAAA;AAAA,IACX,KAAA,EAAO,OAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AACA,EAAA,OAAO,GAAA,CAAI,SAAS,CAAA,IAAK,IAAA;AAC3B;AAKA,SAAS,kBAAkB,EAAA,EAAqC;AAC9D,EAAA,QAAQ,EAAA;AAAI,IACV,KAAK,MAAA;AAAQ,MAAA,OAAO,cAAA;AAAA,IACpB,KAAK,MAAA;AAAQ,MAAA,OAAO,MAAA;AAAA,IACpB;AAAS,MAAA,OAAO,aAAA;AAAA;AAEpB;AAOA,SAAS,aAAA,CAAc,IAA6B,MAAA,EAAwB;AAC1E,EAAA,OAAO,EAAA,KAAO,QAAQ,CAAA,QAAA,EAAW,MAAM,KAAK,CAAA,EAAG,EAAE,IAAI,MAAM,CAAA,CAAA;AAC7D;AAEA,SAAS,mBAAA,CAAoB,aAAqB,EAAA,EAAmC;AACnF,EAAA,MAAM,UAAA,GAAa,kBAAkB,EAAE,CAAA;AACvC,EAAA,IAAI;AACF,IAAA,QAAA,CAAS,UAAA,EAAY;AAAA,MACnB,GAAA,EAAK,WAAA;AAAA,MACL,KAAA,EAAO,MAAA;AAAA,MACP,QAAA,EAAU,OAAA;AAAA,MACV,SAAA,EAAW,KAAK,IAAA,GAAO;AAAA,KACxB,CAAA;AAAA,EACH,SACO,KAAA,EAAO;AACZ,IAAA,MAAM,OAAA,GAAU,oBAAA,CAAqB,UAAA,EAAY,KAAK,CAAA;AACtD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,mBAAA,EAAqB,EAAE,MAAA,EAAQ,EAAE,EAAA,EAAG,EAAG,CAAC;AAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAAA,EAChF;AACF;AASA,SAAS,oBAAA,CAAqB,SAAiB,KAAA,EAAwB;AACrE,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,KAAK,kBAAA,EAAoB,EAAE,QAAQ,EAAE,OAAA,IAAW,CAAA;AAAA,EACzD;AAEA,EAAA,MAAM,OAAA,GAAU,KAAA;AAChB,EAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,OAAA,CAAQ,MAAM,CAAA;AAClD,EAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,OAAA,CAAQ,MAAM,CAAA;AAClD,EAAA,MAAM,MAAA,GAAS,OAAO,OAAA,CAAQ,MAAA,KAAW,WAAW,IAAA,CAAK,cAAA,EAAgB,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,OAAA,CAAQ,MAAA,EAAO,EAAG,CAAA,GAAI,EAAA;AACjH,EAAA,MAAM,MAAA,GAAS,OAAO,OAAA,CAAQ,MAAA,KAAW,WAAW,IAAA,CAAK,YAAA,EAAc,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO,EAAG,CAAA,GAAI,EAAA;AACjH,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,KAAK,kBAAA,EAAoB,EAAE,QAAQ,EAAE,OAAA,IAAW,CAAA;AAAA,IAChD,MAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA,GAAS,CAAA;AAAA,EAAY,MAAM,CAAA,CAAA,GAAK,EAAA;AAAA,IAChC,MAAA,GAAS,CAAA;AAAA,EAAY,MAAM,CAAA,CAAA,GAAK;AAAA,GAClC,CAAE,OAAO,OAAO,CAAA;AAEhB,EAAA,OAAO,MAAA,CAAO,KAAK,MAAM,CAAA;AAC3B;AAEA,SAAS,qBAAqB,MAAA,EAAyB;AACrD,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,IAAA,OAAO,OAAO,IAAA,EAAK;AAAA,EACrB;AACA,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AAC3B,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,CAAE,IAAA,EAAK;AAAA,EACvC;AACA,EAAA,OAAO,EAAA;AACT;AAMA,SAAS,2BAAA,GAAsC;AAC7C,EAAA,OAAO,CAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA,CAAA;AAaT;AAEA,SAAS,cAAA,CAAe,IAAA,EAAc,YAAA,EAAsB,EAAA,EAA6B,OAAA,EAA0B;AACjH,EAAA,MAAM,OAAA,GAAU,kBAAkB,EAAE,CAAA;AACpC,EAAA,MAAM,gBAAgB,OAAA,KAAY,YAAA;AAClC,EAAA,MAAM,aAAA,GAAgB,gBAAgB,IAAA,GAAO,GAAA;AAC7C,EAAA,MAAM,cAAA,GAAiB,aAAA,GACnB,EAAA,GACA,CAAA,0HAAA,EAA6H,IAAI,CAAA,sBAAA,CAAA;AACrI,EAAA,MAAM,iBAAA,GAAoB,gBACtB,EAAA,GACA;AAAA;AAAA,EAEJ,aAAA,CAAc,EAAA,EAAI,mBAAmB,CAAC;AAAA,EACtC,aAAA,CAAc,EAAA,EAAI,mBAAmB,CAAC,CAAA,CAAA;AACtC,EAAA,MAAM,YAAA,GAAe,gBACjB,uIAAA,GACA,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,+RAAA,CAAA;AASJ,EAAA,MAAM,QAAA,GAAW,gBAAgB,SAAA,GAAY,GAAA;AAC7C,EAAA,OAAO,KAAK,IAAI;;AAAA,mDAAA,EAEU,YAAY,CAAA;;AAAA;;AAAA;AAAA,EAKtC,OAAO;AAAA,EACP,aAAA,CAAc,EAAA,EAAI,KAAK,CAAC;AAAA;;AAAA;;AAAA;AAAA,EAMxB,aAAA,CAAc,EAAA,EAAI,OAAO,CAAC;AAAA,EAC1B,aAAA,CAAc,EAAA,EAAI,cAAc,CAAC;AAAA,EACjC,aAAA,CAAc,EAAA,EAAI,SAAS,CAAC;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA,EAS5B,aAAA,CAAc,EAAA,EAAI,cAAc,CAAC;AAAA,EACjC,aAAA,CAAc,EAAA,EAAI,cAAc,CAAC,GAAG,iBAAiB;AAAA;;AAAA;;AAAA;AAAA;AAAA,0BAAA,EAO3B,IAAI,OAAO,aAAa,CAAA,CAAA,EAAI,aAAa,CAAA,EAAG,cAAc,IAAI,IAAI,CAAA;AAAA;;AAAA;;AAAA;AAAA,6BAAA,EAM/D,aAAa,GAAG,QAAQ;AAAA,YAAA,EACzC,IAAI;AAAA;;AAAA,EAGhB,YAAY;;AAAA,EAEZ,6BAA6B,CAAA;;AAAA;AAAA;AAAA,CAAA;AAK/B;AAEA,SAAS,0BAAA,CAA2B,MAAc,EAAA,EAAqC;AACrF,EAAA,OAAO,KAAK,IAAI;;AAAA;;AAAA;;AAAA,SAAA,EAMP,IAAI,CAAA;AAAA,SAAA,EACJ,IAAI,CAAA;;AAAA;;AAAA;AAAA,EAKb,EAAE,CAAA;AAAA,EACF,EAAE,CAAA;AAAA;;AAAA;;AAAA;AAAA,EAMF,EAAE,CAAA;AAAA,EACF,EAAE,CAAA;AAAA,EACF,EAAE,CAAA;AAAA,EACF,EAAE,CAAA;AAAA,EACF,EAAE,CAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA,EASF,EAAE,CAAA;AAAA,EACF,EAAE,CAAA;;AAAA,cAAA,EAEO,IAAI,CAAA;AAAA,EACb,EAAE,CAAA;AAAA,EACF,EAAE,CAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA,0BAAA,EAOwB,IAAI,CAAA;AAAA;AAAA,6BAAA,EAED,IAAI,CAAA;AAAA,EAAA,EAC/B,IAAI,CAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EAUM,IAAI;AAAA;;AAAA,8CAAA,EAGA,IAAI,CAAA;AAAA,oDAAA,EACH,IAAI,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA,WAAA,EAYf,IAAI,CAAA;AAAA,WAAA,EACJ,IAAI,CAAA;AAAA;;AAAA,EAGV,6BAA6B,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAO/B;AAEA,SAAS,uBAAA,CAAwB,IAAA,EAAc,EAAA,EAAY,SAAA,EAAqC;AAC9F,EAAA,MAAM,gBAAA,GAAmB,SAAA,CAAU,GAAA,CAAI,CAAA,MAAA,KAAU,gBAAA,CAAiB,MAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAC1F,EAAA,MAAM,gBAAA,GAAmB,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,GAC7C;AAAA;AAAA,EAEJ,EAAE,CAAA;AAAA,EACF,EAAE,CAAA,iBAAA,CAAA,GACE,EAAA;AACJ,EAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,GAC1C;;AAAA;AAAA,0BAAA,EAGsB,IAAI,CAAA;AAAA;AAAA,EAAA,EAE5B,IAAI,CAAA,WAAA,CAAA,GACF,EAAA;AACJ,EAAA,MAAM,eAAA,GAAkB,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,GAC5C,CAAA;AAAA;AAAA,CAAA,GAGA,EAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,UAAU,QAAA,CAAS,KAAK,IAAI,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,IAAA,CAAA,GAAS,IAAA;AAC3E,EAAA,OAAO,KAAK,IAAI;;AAAA;;AAAA;;AAAA,aAAA,EAMH,IAAI,CAAA;AAAA,aAAA,EACJ,IAAI,CAAA;AAAA,aAAA,EACJ,IAAI,CAAA;AAAA,SAAA,EACR,IAAI,CAAA,4BAAA,EAAgB,SAAA,CAAU,SAAS,KAAK,CAAA,GAAI,KAAK,gCAAO;AAAA,SAAA,EAC5D,IAAI,CAAA,kDAAA,EAAuB,SAAA,CAAU,SAAS,KAAK,CAAA,GAAI,KAAK,gCAAO;AAAA,SAAA,EACnE,IAAI,CAAA,8CAAA,EAAmB,SAAA,CAAU,SAAS,SAAS,CAAA,GAAI,KAAK,gCAAO;AAAA,SAAA,EACnE,IAAI,CAAA,4FAAA,EAAwC,SAAA,CAAU,SAAS,SAAS,CAAA,GAAI,iEAAe,gCAAO;;AAAA,oCAAA,EAErG,oBAAoB,qBAAqB;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA,8BAAA,EAgBhC,IAAI,CAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA,EAWnB,EAAE,CAAA;AAAA,EACF,EAAE,CAAA;;AAAA;AAAA,EAGF,EAAE,CAAA;;AAAA;AAAA,EAGF,EAAE,CAAA;;AAAA;AAAA,EAGF,EAAE,CAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA,EAWF,EAAE,CAAA;AAAA,EACF,EAAE,CAAA;;AAAA,kBAAA,EAEW,IAAI,CAAA;AAAA,EACjB,EAAE,CAAA;AAAA,EACF,EAAE,CAAA;AAAA,EACF,gBAAgB;AAAA;;AAAA;;AAAA;AAAA;AAAA,0BAAA,EAOU,IAAI,CAAA;AAAA;AAAA,6BAAA,EAED,IAAI,CAAA;AAAA,EAAA,EAC/B,IAAI,CAAA;AAAA,EACN,aAAa;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA,EAQb,eAAe,eAAe,cAAc;AAAA;;AAAA,kDAAA,EAGxB,IAAI,CAAA;AAAA,wDAAA,EACH,IAAI,CAAA;AAAA;AAAA,EAEzB,UAAU,QAAA,CAAS,KAAK,IAAI,CAAA,iLAAA,EAAwC,EAAE,qQAAyH,EAAE;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA,aAAA,EAYzL,EAAE,CAAA,UAAA,EAAa,IAAI,CAAA,iBAAA,EAAoB,EAAE,aAAa,IAAI,CAAA;AAAA,aAAA,EAC1D,EAAE,aAAa,IAAI,CAAA;AAAA,iBAAA,EACf,EAAE,CAAA,UAAA,EAAa,IAAI,CAAA,yBAAA,EAA4B,EAAE,aAAa,IAAI,CAAA;;AAAA;;AAAA,yBAAA,EAI1D,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA,IAAA,EAIpB,EAAE,CAAA,4LAAA,EAAkE,EAAE,CAAA,UAAA,EAAa,IAAI,CAAA;;AAAA;;AAAA,8FAAA,EAIzD,IAAI,CAAA;AAAA,oGAAA,EACb,IAAI,iCAA4B,IAAI,CAAA;AAAA;;AAAA;;AAAA;AAAA,EAM7D,EAAE,CAAA;AAAA,EACF,EAAE,CAAA;AAAA,EACF,EAAE,CAAA;AAAA,EACF,EAAE,CAAA;AAAA,EACF,EAAE,CAAA;AAAA;;AAAA,EAGF,6BAA6B,CAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AAM/B;AAKA,SAAS,uBAAuB,OAAA,EAA+C;AAC7E,EAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,EAAA,eAAA,CAAgB,KAAA,CAAM,KAAA,CAAM,mDAAW,CAAC,CAAA;AACxC,EAAA,eAAA,CAAgB,EAAE,CAAA;AAGlB,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC/B,IAAA,eAAA,CAAgB,KAAA,CAAM,IAAA,CAAK,iCAAQ,CAAC,CAAA;AACpC,IAAA,KAAA,MAAW,SAAA,IAAa,QAAQ,QAAA,EAAU;AACxC,MAAA,MAAM,OAAA,GAAU,SAAS,SAAS,CAAA;AAClC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,eAAA,CAAgB,KAAA,CAAM,KAAK,CAAA,SAAA,EAAO,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,SAAS,GAAG,CAAC,CAAA;AAAA,MAClE;AAAA,IACF;AACA,IAAA,eAAA,CAAgB,EAAE,CAAA;AAAA,EACpB;AAEA,EAAA,eAAA,CAAgB,0BAAM,CAAA;AACtB,EAAA,eAAA,CAAgB,MAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,OAAA,CAAQ,IAAI,EAAE,CAAC,CAAA;AAClD,EAAA,IAAI,QAAQ,OAAA,KAAY,WAAA;AACtB,IAAA,eAAA,CAAgB,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,wBAAwB,CAAC,CAAC,CAAA;AAC5D,EAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,IAAA,eAAA,CAAgB,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,iBAAA,CAAkB,QAAQ,cAAc,CAAC,EAAE,CAAC,CAAA;AAAA,EAC9E;AACA,EAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,YAAY,KAAA,EAAO;AAChE,IAAA,eAAA,CAAgB,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,aAAA,CAAc,QAAQ,cAAA,EAAgB,KAAK,CAAC,CAAA,CAAE,CAAC,CAAA;AAC/E,IAAA,eAAA,CAAgB,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,aAAA,CAAc,QAAQ,cAAA,EAAgB,WAAW,CAAC,CAAA,CAAE,CAAC,CAAA;AACrF,IAAA,eAAA,CAAgB,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,aAAA,CAAc,QAAQ,cAAA,EAAgB,MAAM,CAAC,CAAA,CAAE,CAAC,CAAA;AAChF,IAAA,eAAA,CAAgB,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,aAAA,CAAc,QAAQ,cAAA,EAAgB,UAAU,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,EACtF,CAAA,MACK;AACH,IAAA,eAAA,CAAgB,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,aAAA,CAAc,QAAQ,cAAA,EAAgB,KAAK,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,EACjF;AACA,EAAA,eAAA,CAAgB,EAAE,CAAA;AACpB;AASA,eAAsB,cAAc,GAAA,EAA0C;AAC5E,EAAA,MAAM,OAAA,GAAUE,KAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,cAAc,CAAA;AAE7C,EAAA,IAAI,CAAE,MAAM,UAAA,CAAW,OAAO,CAAA,EAAI;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAMI,GAAAA,CAAI,QAAA,CAAS,OAAO,CAAA;AACtC,IAAA,MAAM,OAAO,EAAE,GAAG,IAAI,YAAA,EAAc,GAAG,IAAI,eAAA,EAAgB;AAE3D,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,OAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAC,CAAA;AAE9E,IAAA,OAAO;AAAA,MACL,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,YAAA,EAAc,YAAY,MAAA,GAAS,CAAA;AAAA,MACnC;AAAA,KACF;AAAA,EACF,CAAA,CAAA,MACM;AACJ,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;ACv5CA,IAAM,UAAA,GAA+G;AAAA;AAAA,EAEnH,KAAA,EAAO,EAAE,QAAA,EAAU,CAAC,WAAW,CAAA,EAAG,IAAA,EAAM,CAAC,QAAA,EAAU,MAAM,OAAO,CAAA,EAAG,SAAA,EAAW,KAAA,EAAO,aAAa,4CAAA,EAAU;AAAA;AAAA,EAE5G,IAAA,EAAM,EAAE,QAAA,EAAU,CAAC,aAAa,CAAA,EAAG,SAAA,EAAW,IAAA,EAAM,WAAA,EAAa,oBAAA,EAAM;AAAA,EACvE,OAAA,EAAS,EAAE,QAAA,EAAU,CAAC,aAAa,CAAA,EAAG,SAAA,EAAW,IAAA,EAAM,WAAA,EAAa,oBAAA,EAAM;AAAA,EAC1E,OAAA,EAAS,EAAE,QAAA,EAAU,CAAC,aAAa,CAAA,EAAG,SAAA,EAAW,OAAA,EAAS,WAAA,EAAa,cAAA,EAAK;AAAA,EAC5E,IAAA,EAAM,EAAE,QAAA,EAAU,CAAC,UAAU,CAAA,EAAG,SAAA,EAAW,IAAA,EAAM,WAAA,EAAa,iBAAA,EAAQ;AAAA,EACtE,SAAA,EAAW,EAAE,QAAA,EAAU,CAAC,eAAe,CAAA,EAAG,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,0BAAA,EAAO;AAAA,EACpF,UAAU,EAAE,QAAA,EAAU,CAAC,cAAc,CAAA,EAAG,aAAa,0BAAA,EAAO;AAAA,EAC5D,OAAO,EAAE,QAAA,EAAU,CAAC,WAAW,CAAA,EAAG,aAAa,oCAAA,EAAiB;AAAA,EAChE,MAAM,EAAE,QAAA,EAAU,CAAC,UAAU,CAAA,EAAG,aAAa,uBAAA,EAAS;AAAA,EACtD,QAAA,EAAU,EAAE,QAAA,EAAU,CAAC,cAAc,CAAA,EAAG,SAAA,EAAW,QAAA,EAAU,WAAA,EAAa,gCAAA,EAAQ;AAAA,EAClF,OAAA,EAAS,EAAE,QAAA,EAAU,CAAC,aAAa,CAAA,EAAG,SAAA,EAAW,OAAA,EAAS,WAAA,EAAa,gCAAA,EAAQ;AAAA,EAC/E,YAAY,EAAE,QAAA,EAAU,CAAC,gBAAgB,CAAA,EAAG,aAAa,sCAAA,EAAS;AAAA,EAClE,OAAA,EAAS,EAAE,QAAA,EAAU,CAAC,aAAa,CAAA,EAAG,SAAA,EAAW,OAAA,EAAS,WAAA,EAAa,0BAAA,EAAO;AAAA,EAC9E,WAAA,EAAa,EAAE,QAAA,EAAU,CAAC,iBAAiB,CAAA,EAAG,IAAA,EAAM,CAAC,IAAI,CAAA,EAAG,SAAA,EAAW,WAAA,EAAa,aAAa,0BAAA,EAAO;AAAA,EACxG,OAAA,EAAS,EAAE,QAAA,EAAU,CAAC,aAAa,CAAA,EAAG,IAAA,EAAM,CAAC,IAAI,CAAA,EAAG,SAAA,EAAW,OAAA,EAAS,aAAa,0BAAA,EAAO;AAAA,EAC5F,SAAA,EAAW,EAAE,QAAA,EAAU,CAAC,eAAe,CAAA,EAAG,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,cAAA,EAAK;AAAA,EAClF,aAAa,EAAE,QAAA,EAAU,CAAC,iBAAiB,CAAA,EAAG,aAAa,gCAAA,EAAQ;AAAA,EACnE,cAAc,EAAE,QAAA,EAAU,CAAC,kBAAkB,CAAA,EAAG,aAAa,yBAAA;AAC/D,CAAA;AAKA,eAAsB,UAAU,OAAA,EAA0C;AACxE,EAAA,MAAM,UAAUE,GAAAA,EAAI;AACpB,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,IAAO,GAAA;AAE3B,EAAA,IAAI;AAEF,IAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,GAAG,CAAA;AACvC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAMC,KAAAA,CAAM,GAAA,CAAI,iFAA0B,CAAC,CAAA;AACvD,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,aAAa,OAAA,CAAQ,MAAA;AACzB,IAAA,IAAI,CAAC,UAAA,EAAY;AAEf,MAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,OAAA,CAAQ,WAAW,CAAA;AAC7C,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,CACtC,MAAA,CAAO,CAAC,GAAG,GAAG,CAAA,KAAM,CAAC,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,CAAA,CAAA,KAAK,SAAA,CAAU,GAAA,CAAI,CAAC,CAAC,CAAC,CAAA,CAC9D,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,GAAG,CAAA,MAAO;AAAA,QACpB,KAAA,EAAO,CAAA,EAAGA,KAAAA,CAAM,IAAA,CAAK,IAAI,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA,CAAA,EAAIA,KAAAA,CAAM,IAAA,CAAK,GAAA,CAAI,WAAW,CAAC,CAAA,CAAA;AAAA,QACnE,KAAA,EAAO;AAAA,OACT,CAAE,CAAA;AAEJ,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAKA,KAAAA,CAAM,KAAA,CAAM,kDAAU,CAAC,CAAA;AACxC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAMC,OAAAA,CAAQ;AAAA,QACjC,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,OAAA,EAAS,mDAAA;AAAA,QACT;AAAA,OACD,CAAA;AAED,MAAA,IAAI,CAAC,QAAA;AACH,QAAA;AACF,MAAA,UAAA,GAAa,QAAA;AAAA,IACf;AAEA,IAAA,MAAM,SAAA,GAAY,WAAW,UAAU,CAAA;AACvC,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,IAAA,CAAK,OAAO,KAAA,CAAMD,KAAAA,CAAM,IAAI,CAAA,0BAAA,EAAS,UAAU,EAAE,CAAC,CAAA;AAClD,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,0BAAA,EAAS,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAC9D,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,wBAAA,EAA0B,4BAAA,EAA6B,GAAI,MAAM,OAAO,mCAA0B,CAAA;AAG1G,IAAA,IAAI,SAAA,CAAU,SAAS,KAAA,CAAM,CAAA,CAAA,KAAK,QAAQ,WAAA,CAAY,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AAClE,MAAA,MAAME,kBAAiB,MAAM,wBAAA;AAAA,QAC3B,GAAA;AAAA,QACA,4BAAA,CAA6B,QAAQ,WAAW,CAAA;AAAA,QAChD;AAAA,UACE,eAAA,EAAiB,KAAA;AAAA,UACjB,oBAAA,EAAsB;AAAA;AACxB,OACF;AACA,MAAA,IAAIA,eAAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,QAAA,IAAA,CAAK,OAAO,IAAA,CAAKF,KAAAA,CAAM,OAAO,CAAA,aAAA,EAAM,UAAU,yEAAkB,CAAC,CAAA;AACjE,QAAA,KAAA,MAAW,iBAAiBE,eAAAA,EAAgB;AAC1C,UAAA,IAAA,CAAK,OAAO,IAAA,CAAKF,KAAAA,CAAM,KAAK,CAAA,IAAA,EAAO,aAAa,eAAe,CAAC,CAAA;AAAA,QAClE;AAAA,MACF,CAAA,MACK;AACH,QAAA,IAAA,CAAK,OAAO,IAAA,CAAKA,KAAAA,CAAM,OAAO,CAAA,aAAA,EAAM,UAAU,qBAAM,CAAC,CAAA;AAAA,MACvD;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,SAAA,CAAU,QAAQ,CAAA;AAC9C,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,KAAA,MAAW,GAAA,IAAO,UAAU,IAAA,EAAM;AAChC,QAAA,MAAM,MAAA,GAAS,WAAW,GAAG,CAAA;AAC7B,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,KAAA,MAAWG,IAAAA,IAAO,OAAO,QAAA,EAAU;AACjC,YAAA,WAAA,CAAY,IAAIA,IAAG,CAAA;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,OAAA,CAAQ,MAAM,8BAAoB,CAAA;AAClC,IAAA,MAAM,OAAA,GAAUV,KAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,cAAc,CAAA;AAC7C,IAAA,MAAM,GAAA,GAAM,MAAMI,GAAAA,CAAI,QAAA,CAAS,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,GAAA,CAAI,YAAA;AACP,MAAA,GAAA,CAAI,eAAe,EAAC;AAEtB,IAAA,MAAM,uBAAuB,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,YAAsC,EACnF,IAAA,CAAK,CAAC,CAAC,OAAO,MAAM,OAAA,CAAQ,UAAA,CAAW,QAAQ,CAAC,IAAI,CAAC,CAAA;AAGxD,IAAA,MAAM,UAAA,GAAa,oBAAA,KAAyB,UAAA,GAAa,UAAA,GAAa,aAAA,EAAc;AAEpF,IAAA,KAAA,MAAW,WAAW,WAAA,EAAa;AACjC,MAAA,IAAI,CAAC,GAAA,CAAI,YAAA,CAAa,OAAO,CAAA,EAAG;AAC9B,QAAA,GAAA,CAAI,YAAA,CAAa,OAAO,CAAA,GAAI,UAAA;AAAA,MAC9B;AAAA,IACF;AACA,IAAA,MAAMA,IAAI,SAAA,CAAU,OAAA,EAAS,KAAK,EAAE,MAAA,EAAQ,GAAG,CAAA;AAC/C,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAGhB,IAAA,IAAI,UAAU,SAAA,EAAW;AACvB,MAAA,MAAM,SAAA,GAAYJ,KAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,QAAQ,CAAA;AACzC,MAAA,MAAM,aAAaA,KAAAA,CAAK,IAAA,CAAK,WAAW,CAAA,CAAA,EAAI,SAAA,CAAU,SAAS,CAAA,IAAA,CAAM,CAAA;AACrE,MAAA,IAAI,CAAE,MAAM,UAAA,CAAW,UAAU,CAAA,EAAI;AACnC,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,6CAAA,EAAkB,SAAA,CAAU,SAAS,CAAA,OAAA,CAAS,CAAA;AAC5D,QAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,SAAA,CAAU,SAAS,CAAA;AACtD,QAAA,MAAM,SAAA,CAAU,YAAY,OAAO,CAAA;AACnC,QAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,MAClB,CAAA,MACK;AACH,QAAA,IAAA,CAAK,MAAA,CAAO,KAAKO,KAAAA,CAAM,IAAA,CAAK,uDAAoB,SAAA,CAAU,SAAS,MAAM,CAAC,CAAA;AAAA,MAC5E;AAAA,IACF;AAGA,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,KAAA,MAAW,GAAA,IAAO,UAAU,IAAA,EAAM;AAChC,QAAA,MAAM,MAAA,GAAS,WAAW,GAAG,CAAA;AAC7B,QAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,UAAA,MAAM,aAAA,GAAgBP,MAAK,IAAA,CAAK,GAAA,EAAK,UAAU,CAAA,CAAA,EAAI,MAAA,CAAO,SAAS,CAAA,IAAA,CAAM,CAAA;AACzE,UAAA,IAAI,CAAE,MAAM,UAAA,CAAW,aAAa,CAAA,EAAI;AACtC,YAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,MAAA,CAAO,SAAS,CAAA;AACnD,YAAA,MAAM,SAAA,CAAU,eAAe,OAAO,CAAA;AACtC,YAAA,IAAA,CAAK,MAAA,CAAO,KAAKO,KAAAA,CAAM,IAAA,CAAK,eAAe,MAAA,CAAO,SAAS,qBAAW,CAAC,CAAA;AAAA,UACzE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,gBAAgB,CAAC,GAAG,OAAA,CAAQ,WAAA,EAAa,GAAG,WAAW,CAAA;AAC7D,IAAA,MAAM,iBAAiB,MAAM,wBAAA;AAAA,MAC3B,GAAA;AAAA,MACA,6BAA6B,aAAa,CAAA;AAAA,MAC1C;AAAA,QACE,eAAA,EAAiB,KAAA;AAAA,QACjB,oBAAA,EAAsB;AAAA;AACxB,KACF;AACA,IAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,MAAA,KAAA,MAAW,iBAAiB,cAAA,EAAgB;AAC1C,QAAA,IAAA,CAAK,OAAO,IAAA,CAAKA,KAAAA,CAAM,KAAK,CAAA,IAAA,EAAO,aAAa,eAAe,CAAC,CAAA;AAAA,MAClE;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,QAAQ,OAAA,KAAY,KAAA;AACtC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAA,CAAQ,MAAM,6BAAS,CAAA;AACvB,MAAA,MAAM,EAAE,QAAA,EAAAI,SAAAA,EAAS,GAAI,MAAM,OAAO,eAAoB,CAAA;AACtD,MAAA,MAAM,EAAA,GAAK,MAAM,oBAAA,CAAqB,GAAG,CAAA;AACzC,MAAAA,SAAAA,CAAS,GAAG,EAAE,CAAA,QAAA,CAAA,EAAY,EAAE,GAAA,EAAK,KAAA,EAAO,UAAU,CAAA;AAClD,MAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,IAClB;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,EAAE,CAAA;AACnB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAKJ,KAAAA,CAAM,MAAM,CAAA,oBAAA,EAAQ,UAAU,iCAAQ,CAAC,CAAA;AACxD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,EAAE,CAAA;AACnB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,iCAAQ,CAAA;AACzB,IAAA,KAAA,MAAWG,QAAO,WAAA,EAAa;AAC7B,MAAA,IAAA,CAAK,OAAO,IAAA,CAAKH,KAAAA,CAAM,KAAK,CAAA,EAAA,EAAKG,IAAG,EAAE,CAAC,CAAA;AAAA,IACzC;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,EAAE,CAAA;AAAA,EACrB,SACO,KAAA,EAAO;AACZ,IAAA,OAAA,CAAQ,IAAA,EAAK;AACb,IAAA,IAAA,CAAK,MAAA,CAAO,MAAMH,KAAAA,CAAM,GAAA,CAAI,uCAAS,CAAA,EAAG,EAAE,OAAO,CAAA;AACjD,IAAA,MAAM,KAAA;AAAA,EACR;AACF;ACpMA,eAAsB,cAAc,OAAA,EAA8C;AAChF,EAAA,MAAM,UAAUD,GAAAA,EAAI;AACpB,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAOR,QAAAA,CAAQ,GAAA,EAAI;AACvC,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,EAAK,OAAA,CAAQ,UAAU,GAAG,CAAA;AACjD,EAAA,IAAI,WAAA,GAA4C,IAAA;AAEhD,EAAA,IAAI;AAEF,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI;AACF,MAAA,YAAA,GAAe,MAAM,OAAO,mBAAc,CAAA;AAAA,IAC5C,CAAA,CAAA,MACM;AACJ,MAAAc,IAAAA,CAAK,OAAO,KAAA,CAAML,KAAAA,CAAM,IAAI,IAAA,CAAK,2BAA2B,CAAC,CAAC,CAAA;AAC9D,MAAAK,KAAK,MAAA,CAAO,IAAA,CAAKL,KAAAA,CAAM,IAAA,CAAK,yBAAyB,CAAC,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,IAAA,CAAK,2BAA2B,CAAC,CAAA;AAAA,IACnD;AAEA,IAAA,MAAM,EAAE,QAAO,GAAI,YAAA;AAGnB,IAAA,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,6BAA6B,CAAC,CAAA;AACjD,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,WAAA,CAAY,IAAA,EAAK;AAC3C,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,MAAA,MAAM,IAAI,KAAA,CAAM,IAAA,CAAK,+BAAA,EAAiC,EAAE,MAAA,EAAQ,EAAE,OAAA,EAAS,UAAA,CAAW,KAAA,CAAM,OAAA,EAAQ,EAAG,CAAC,CAAA;AAAA,IAC1G;AACA,IAAA,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,+BAAA,EAAiC,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,UAAA,CAAW,IAAA,CAAK,MAAA,EAAO,EAAG,CAAC,CAAA;AAGpG,IAAA,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,wBAAwB,CAAC,CAAA;AAC5C,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,EAAQ,QAAA,EAAU,aAAa,CAAA;AAC1D,IAAA,IAAI,CAAC,UAAA,CAAW,UAAU,CAAA,EAAG;AAC3B,MAAA,OAAA,CAAQ,IAAA,CAAKA,KAAAA,CAAM,GAAA,CAAI,IAAA,CAAK,2BAAA,EAA6B,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,UAAA,EAAW,EAAG,CAAC,CAAC,CAAA;AAC3F,MAAAK,IAAAA,CAAK,OAAO,IAAA,CAAKL,KAAAA,CAAM,KAAK,IAAA,CAAK,wBAAwB,CAAC,CAAC,CAAA;AAC3D,MAAA,MAAM,IAAI,KAAA,CAAM,IAAA,CAAK,2BAAA,EAA6B,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,UAAA,EAAW,EAAG,CAAC,CAAA;AAAA,IACrF;AAEA,IAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,UAAA,EAAY,OAAO,CAAA;AACtD,IAAA,MAAM,SAAA,GAAY,uBAAuB,aAAa,CAAA;AACtD,IAAA,MAAM,YAAA,GAAe,MAAM,SAAS,CAAA;AACpC,IAAA,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,0BAA0B,CAAC,CAAA;AAGhD,IAAA,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,qBAAqB,CAAC,CAAA;AACzC,IAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAC3C,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,MAAA,MAAM,IAAI,KAAA,CAAM,IAAA,CAAK,wBAAA,EAA0B,EAAE,MAAA,EAAQ,EAAE,OAAA,EAAS,UAAA,CAAW,KAAA,CAAM,OAAA,EAAQ,EAAG,CAAC,CAAA;AAAA,IACnG;AACA,IAAA,MAAM,OAAO,UAAA,CAAW,IAAA;AACxB,IAAA,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,oBAAA,EAAsB,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,IAAA,CAAK,OAAA,EAAS,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,EAAG,QAAA,EAAU,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA,IAAK,IAAA,CAAK,iBAAiB,CAAA,EAAE,EAAG,CAAC,CAAA;AAG1L,IAAA,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,yBAAyB,CAAC,CAAA;AAC7C,IAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA;AACjD,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,MAAA,MAAM,IAAI,KAAA,CAAM,IAAA,CAAK,wBAAA,EAA0B,EAAE,MAAA,EAAQ,EAAE,OAAA,EAAS,UAAA,CAAW,KAAA,CAAM,OAAA,EAAQ,EAAG,CAAC,CAAA;AAAA,IACnG;AACA,IAAA,WAAA,GAAc,MAAM,OAAO,KAAA,EAAM;AACjC,IAAA,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,wBAAwB,CAAC,CAAA;AAG9C,IAAA,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,sBAAsB,CAAC,CAAA;AAC1C,IAAA,MAAM,YAAA,GAAe,MAAM,MAAA,CAAO,SAAA,CAAU,MAAA,EAAQ;AAAA,MAClD,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,eAAe,OAAA,CAAQ,aAAA;AAAA,MACvB,WAAW,OAAA,CAAQ;AAAA,KACpB,CAAA;AAED,IAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AACzB,MAAA,IAAI,YAAA,CAAa,KAAA,CAAM,GAAA,EAAK,QAAA,EAAU;AACpC,QAAAK,IAAAA,CAAK,OAAO,IAAA,CAAK,YAAA,CAAa,MAAM,UAAA,IAAc,IAAA,CAAK,2BAA2B,CAAA,EAAG;AAAA,UACnF,QAAA,EAAU,YAAA,CAAa,KAAA,CAAM,GAAA,CAAI;AAAA,SAClC,CAAA;AAAA,MACH;AACA,MAAA,MAAM,IAAI,KAAA,CAAM,IAAA,CAAK,mBAAA,EAAqB,EAAE,MAAA,EAAQ,EAAE,OAAA,EAAS,YAAA,CAAa,KAAA,CAAM,OAAA,EAAQ,EAAG,CAAC,CAAA;AAAA,IAChG;AAEA,IAAA,OAAA,CAAQ,QAAQL,KAAAA,CAAM,KAAA,CAAM,IAAA,CAAK,oBAAoB,CAAC,CAAC,CAAA;AACvD,IAAAK,IAAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AACnB,IAAAA,KAAK,MAAA,CAAO,IAAA,CAAKL,KAAAA,CAAM,IAAA,CAAK,KAAK,gBAAA,EAAkB,EAAE,MAAA,EAAQ,EAAE,KAAK,YAAA,CAAa,IAAA,CAAK,KAAI,EAAG,CAAC,CAAC,CAAA;AAC/F,IAAAK,KAAK,MAAA,CAAO,IAAA,CAAKL,KAAAA,CAAM,IAAA,CAAK,KAAK,eAAA,EAAiB,EAAE,MAAA,EAAQ,EAAE,IAAI,YAAA,CAAa,IAAA,CAAK,cAAa,EAAG,CAAC,CAAC,CAAA;AACtG,IAAA,IAAI,YAAA,CAAa,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AAC3C,MAAAK,IAAAA,CAAK,OAAO,IAAA,CAAKL,KAAAA,CAAM,KAAK,IAAA,CAAK,gBAAA,EAAkB,EAAE,MAAA,EAAQ,EAAE,OAAO,YAAA,CAAa,IAAA,CAAK,WAAW,IAAA,CAAK,IAAI,GAAE,EAAG,CAAC,CAAC,CAAA;AAAA,IACrH;AACA,IAAAK,IAAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAAA,EACrB,SACO,KAAA,EAAO;AACZ,IAAA,OAAA,CAAQ,KAAKL,KAAAA,CAAM,GAAA,CAAI,IAAA,CAAK,2BAA2B,CAAC,CAAC,CAAA;AACzD,IAAAK,IAAAA,CAAK,OAAO,KAAA,CAAM,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AACxE,IAAA,MAAM,KAAA;AAAA,EACR,CAAA,SACA;AACE,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IAAI;AACF,QAAA,MAAM,WAAA,EAAY;AAAA,MACpB,SACO,KAAA,EAAO;AACZ,QAAAA,KAAK,MAAA,CAAO,KAAA,CAAM,+BAAA,EAAiC,EAAE,OAAO,CAAA;AAC5D,QAAAd,SAAQ,QAAA,GAAW,CAAA;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AACF;AAQA,SAAS,uBAAuB,OAAA,EAAyB;AACvD,EAAA,OAAO,QAAQ,OAAA,CAAQ,8BAAA,EAAgC,CAAC,MAAA,EAAQ,KAAa,YAAA,KAA0B;AACrG,IAAA,OAAOA,QAAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,IAAK,YAAA,IAAgB,EAAA;AAAA,EAC7C,CAAC,CAAA;AACH;ACjIA,IAAM,UAAA,GAID;AAAA,EACH,IAAA,EAAM;AAAA,IACJ,WAAA,EAAa,wBAAA;AAAA,IACb,WAAA,EAAa,YAAA;AAAA,IACb,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,SAAA,EAAW;AAAA,IACT,WAAA,EAAa,qBAAA;AAAA,IACb,WAAA,EAAa,oBAAA;AAAA,IACb,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,GAAA,EAAK;AAAA,IACH,WAAA,EAAa,kBAAA;AAAA,IACb,WAAA,EAAa,gBAAA;AAAA,IACb,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,KAAA,EAAO;AAAA,IACL,WAAA,EAAa,0BAAA;AAAA,IACb,WAAA,EAAa,gBAAA;AAAA,IACb,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,SAAA,EAAW;AAAA,IACT,WAAA,EAAa,gCAAA;AAAA,IACb,WAAA,EAAa,YAAA;AAAA,IACb,QAAA,EAAU;AAAA;AAEd,CAAA;AAKA,eAAsB,SAAS,OAAA,EAAyC;AACtE,EAAA,MAAM,UAAUQ,GAAAA,EAAI;AACpB,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,IAAO,GAAA;AAE3B,EAAA,IAAI;AAEF,IAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,GAAG,CAAA;AAEvC,IAAA,IAAI,CAAC,SAAS,YAAA,EAAc;AAC1B,MAAAM,KAAK,MAAA,CAAO,IAAA,CAAKL,KAAAA,CAAM,MAAA,CAAO,qEAAmB,CAAC,CAAA;AAAA,IACpD;AAGA,IAAA,MAAM,eAAA,GAAkB,MAAM,sBAAA,CAAuB,OAAO,CAAA;AAC5D,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,eAAA,CAAgB,IAAI,CAAA;AAEjD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kDAAA,EAAa,eAAA,CAAgB,IAAI,CAAA,CAAE,CAAA;AAAA,IACrD;AAGA,IAAA,IAAI,CAAC,qCAAA,CAAsC,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AAClE,MAAA,MAAM,IAAI,KAAA,CAAM,IAAA,CAAK,yBAAyB,CAAC,CAAA;AAEjD,IAAA,MAAM,YAAYP,KAAAA,CAAK,OAAA,CAAQ,KAAK,eAAA,CAAgB,MAAA,IAAU,UAAU,WAAW,CAAA;AAGnF,IAAA,MAAM,WAAA,GAAcA,KAAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACpC,IAAA,IAAI,CAAC,UAAU,UAAA,CAAW,WAAA,GAAcA,MAAK,GAAG,CAAA,IAAK,cAAc,WAAA,EAAa;AAC9E,MAAA,MAAM,IAAI,KAAA,CAAM,IAAA,CAAK,8BAA8B,CAAC,CAAA;AAAA,IACtD;AAEA,IAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,eAAA,CAAgB,IAAA,EAAM;AAAA,MAC1D,aAAa,OAAA,EAAS;AAAA,KACvB,CAAA;AAED,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,aAAA,EAAM,SAAA,CAAU,WAAW,CAAA,GAAA,CAAK,CAAA;AAE9C,IAAA,MAAM,KAAA,GAAQ,MAAM,SAAA,CAAU,QAAA,CAAS,SAAS,SAAS,CAAA;AACzD,IAAA,MAAM,OAAA,GAAU,MAAMI,GAAAA,CAAI,QAAA,CAAS,WAAW,CAAA;AAE9C,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,CAAC,eAAA,CAAgB,KAAA,IAAS,MAAMA,GAAAA,CAAI,UAAA,CAAW,KAAK,IAAI,CAAA;AAC1D,QAAA,MAAM,IAAI,KAAA,CAAM,IAAA,CAAK,oBAAA,EAAsB,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,EAAG,CAAC,CAAA;AAC7E,MAAA,IAAI,WAAW,IAAA,CAAK,IAAA;AACpB,MAAA,OAAO,CAAC,MAAMA,GAAAA,CAAI,UAAA,CAAW,QAAQ,CAAA;AACnC,QAAA,QAAA,GAAWJ,KAAAA,CAAK,QAAQ,QAAQ,CAAA;AAClC,MAAA,MAAM,YAAA,GAAe,MAAMI,GAAAA,CAAI,QAAA,CAAS,QAAQ,CAAA;AAChD,MAAA,MAAM,QAAA,GAAWJ,KAAAA,CAAK,QAAA,CAAS,OAAA,EAAS,YAAY,CAAA;AACpD,MAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,QAAA,CAAS,UAAA,CAAW,CAAA,EAAA,EAAKA,KAAAA,CAAK,GAAG,CAAA,CAAE,CAAA,IAAKA,KAAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AACvF,QAAA,MAAM,IAAI,KAAA,CAAM,IAAA,CAAK,8BAA8B,CAAC,CAAA;AAAA,IACxD;AACA,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAMI,IAAI,SAAA,CAAUJ,KAAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;AAC3C,MAAA,MAAMI,GAAAA,CAAI,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,KAAK,OAAA,EAAS,EAAE,QAAA,EAAU,OAAA,EAAS,IAAA,EAAM,eAAA,CAAgB,KAAA,GAAQ,GAAA,GAAM,MAAM,CAAA;AAAA,IAC9G;AAEA,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAEhB,IAAAQ,IAAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAA,EAAI,EAAE,CAAA;AACvB,IAAAA,KAAK,MAAA,CAAO,IAAA,CAAKL,KAAAA,CAAM,KAAA,CAAM,uCAAS,CAAC,CAAA;AACvC,IAAAK,IAAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAA,EAAI,EAAE,CAAA;AACvB,IAAAA,IAAAA,CAAK,MAAA,CAAO,IAAA,CAAK,iCAAQ,CAAA;AACzB,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,MAAAA,IAAAA,CAAK,MAAA,CAAO,IAAA,CAAKL,KAAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAKP,KAAAA,CAAK,QAAA,CAAS,GAAA,EAAK,IAAA,CAAK,IAAI,CAAC,EAAE,CAAC,CAAA;AAAA,IACnE,CAAC,CAAA;AACD,IAAAY,IAAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAA,EAAI,EAAE,CAAA;AAAA,EACzB,SACO,KAAA,EAAO;AACZ,IAAA,OAAA,CAAQ,IAAA,EAAK;AACb,IAAAA,IAAAA,CAAK,OAAO,KAAA,CAAML,KAAAA,CAAM,IAAI,2BAAO,CAAA,EAAG,EAAE,KAAA,EAAO,CAAA;AAC/C,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAKA,eAAe,uBAAuB,OAAA,EAA8D;AAClG,EAAA,MAAM,YAAoC,EAAC;AAE3C,EAAA,IAAI,CAAC,QAAQ,IAAA,EAAM;AACjB,IAAA,SAAA,CAAU,IAAA,CAAK;AAAA,MACb,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,uCAAA;AAAA,MACT,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,MAAO;AAAA,QACzD,KAAA,EAAO,CAAA,EAAG,GAAG,CAAA,GAAA,EAAM,MAAM,WAAW,CAAA,CAAA;AAAA,QACpC,KAAA,EAAO;AAAA,OACT,CAAE;AAAA,KACH,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,CAAC,QAAQ,IAAA,EAAM;AACjB,IAAA,SAAA,CAAU,IAAA,CAAK;AAAA,MACb,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,eAAA;AAAA,MACT,QAAA,EAAU,CAAC,KAAA,KAAkB;AAC3B,QAAA,IAAI,CAAC,MAAM,IAAA,EAAK;AACd,UAAA,OAAO,sCAAA;AACT,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,OAAA,GAAU,UAAU,MAAA,GAAS,CAAA,GAAI,MAAMC,OAAAA,CAAQ,SAAS,IAAI,EAAC;AAEnE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ,IAAA;AAAA,IAC9B,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ,IAAA;AAAA,IAC9B,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,IAC1B,KAAA,EAAO,QAAQ,KAAA,IAAS,KAAA;AAAA,IACxB,OAAA,EAAS,QAAQ,OAAA,IAAW,KAAA;AAAA,IAC5B,GAAA,EAAK,QAAQ,GAAA,IAAO;AAAA,GACtB;AACF;AAKA,eAAe,YAAA,CACb,SACA,SAAA,EACmD;AACnD,EAAA,MAAM,QAAkD,EAAC;AACzD,EAAA,MAAM,OAAA,GAAUR,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAGtD,EAAA,MAAM,WAAA,GAAc,CAAA,KAAA,EAAQ,OAAA,CAAQ,UAAU,CAAA;AAAA;AAAA,SAAA,EAErC,QAAQ,UAAU,CAAA;AAAA;;AAAA;AAAA,sCAAA,EAIW,QAAQ,UAAU,CAAA;;AAAA;AAAA;AAAA,CAAA;AAMxD,EAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,IAAA,CAAK,OAAA,EAAS,cAAc,CAAA;AAClD,EAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,aAAa,CAAA;AAGnD,EAAA,MAAM,aAAA,GAAgB,CAAA;AAAA,GAAA,EACnB,QAAQ,UAAU,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAiBrB,EAAA,MAAM,UAAA,GAAaA,KAAAA,CAAK,IAAA,CAAK,OAAA,EAAS,iBAAiB,CAAA;AACvD,EAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,UAAA,EAAY,OAAA,EAAS,eAAe,CAAA;AAEvD,EAAA,OAAO,KAAA;AACT;AAKA,eAAe,iBAAA,CACb,SACA,SAAA,EACmD;AACnD,EAAA,MAAM,QAAkD,EAAC;AAGzD,EAAA,MAAM,gBAAA,GAAmB,CAAA;AAAA;;AAAA;AAAA,KAAA,EAIpB,QAAQ,UAAU,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAmBvB,EAAA,MAAM,gBAAgBA,KAAAA,CAAK,IAAA,CAAK,WAAW,CAAA,EAAG,OAAA,CAAQ,UAAU,CAAA,OAAA,CAAS,CAAA;AACzE,EAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,aAAA,EAAe,OAAA,EAAS,kBAAkB,CAAA;AAE7D,EAAA,OAAO,KAAA;AACT;AAKA,eAAe,WAAA,CACb,SACA,SAAA,EACmD;AACnD,EAAA,MAAM,QAAkD,EAAC;AACzD,EAAA,MAAM,MAAA,GAASA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAGrD,EAAA,MAAM,aAAA,GAAgB,CAAA;AAAA,GAAA,EACnB,QAAQ,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,OAAA,EAad,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,QAAA,EAOhB,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AASzB,EAAA,MAAM,UAAA,GAAaA,KAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,YAAY,CAAA;AACjD,EAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,UAAA,EAAY,OAAA,EAAS,eAAe,CAAA;AAEvD,EAAA,OAAO,KAAA;AACT;AAKA,eAAe,aAAA,CACb,SACA,SAAA,EACmD;AACnD,EAAA,MAAM,QAAkD,EAAC;AAGzD,EAAA,MAAM,YAAA,GAAe,CAAA;AAAA,GAAA,EAClB,QAAQ,UAAU,CAAA;AAAA;AAAA;;AAAA;AAAA,GAAA,EAKlB,QAAQ,UAAU,CAAA;AAAA;AAAA,aAAA,EAER,QAAQ,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,gBAAA,EAYxB,QAAQ,UAAU,CAAA;AAAA;AAAA,mBAAA,EAEL,OAAA,CAAQ,UAAU,CAAA,SAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,gBAAA,EAO5D,QAAQ,UAAU,CAAA;AAAA;AAAA,mBAAA,EAEL,OAAA,CAAQ,UAAU,CAAA,eAAA,EAAkB,OAAA,CAAQ,UAAU,CAAA;;AAAA;AAAA,GAAA,EAGtE,QAAQ,UAAU,CAAA;AAAA;AAAA,YAAA,EAET,OAAA,CAAQ,UAAU,CAAA,kBAAA,EAAqB,OAAA,CAAQ,SAAS,CAAA;AAAA,kBAAA,EAClD,OAAA,CAAQ,UAAU,CAAA,wBAAA,EAA2B,OAAA,CAAQ,UAAU,CAAA;AAAA,kBAAA,EAC/D,OAAA,CAAQ,UAAU,CAAA,wBAAA,EAA2B,OAAA,CAAQ,UAAU,CAAA;AAAA,CAAA;AAGjF,EAAA,MAAM,YAAYA,KAAAA,CAAK,IAAA,CAAK,WAAW,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAA,GAAA,CAAK,CAAA;AAChE,EAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,cAAc,CAAA;AAErD,EAAA,OAAO,KAAA;AACT;AAKA,eAAe,iBAAA,CACb,SACA,SAAA,EACmD;AACnD,EAAA,MAAM,QAAkD,EAAC;AACzD,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,EAAA,MAAM,gBAAA,GAAmB,CAAA;AAAA,iBAAA,EAClB,QAAQ,UAAU;AAAA,iBAAA,EAAA,iBAClB,IAAI,IAAA,EAAK,EAAE,WAAA,EAAa;AAAA;AAAA;;AAAA;AAAA;AAAA,wCAAA,EAMS,QAAQ,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,sCAAA,EAUnB,QAAQ,SAAS,CAAA;AAAA;AAAA,CAAA;AAIvD,EAAA,MAAM,aAAA,GAAgBA,MAAK,IAAA,CAAK,SAAA,EAAW,GAAG,SAAS,CAAA,CAAA,EAAI,OAAA,CAAQ,SAAS,CAAA,GAAA,CAAK,CAAA;AACjF,EAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,aAAA,EAAe,OAAA,EAAS,kBAAkB,CAAA;AAE7D,EAAA,OAAO,KAAA;AACT;ACxXA,IAAM,iBAAA,GAA0E;AAAA,EAC9E,YAAA,EAAc,EAAE,SAAA,EAAW,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,EACjD,YAAA,EAAc,EAAE,SAAA,EAAW,MAAA,EAAQ,OAAO,SAAA,EAAU;AAAA,EACpD,aAAA,EAAe,EAAE,SAAA,EAAW,IAAA,EAAM,OAAO,UAAA,EAAW;AAAA,EACpD,aAAA,EAAe,EAAE,SAAA,EAAW,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACpD,WAAA,EAAa,EAAE,SAAA,EAAW,KAAA,EAAO,OAAO,KAAA,EAAM;AAAA,EAC9C,eAAA,EAAiB,EAAE,SAAA,EAAW,SAAA,EAAW,OAAO,SAAA,EAAU;AAAA,EAC1D,UAAA,EAAY,EAAE,SAAA,EAAW,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,EAC3C,aAAA,EAAe,EAAE,SAAA,EAAW,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACpD,aAAA,EAAe,EAAE,SAAA,EAAW,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACpD,iBAAA,EAAmB,EAAE,SAAA,EAAW,WAAA,EAAa,OAAO,WAAA,EAAY;AAAA,EAChE,aAAA,EAAe,EAAE,SAAA,EAAW,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACpD,eAAA,EAAiB,EAAE,SAAA,EAAW,SAAA,EAAW,OAAO,SAAA,EAAU;AAAA,EAC1D,cAAA,EAAgB,EAAE,SAAA,EAAW,QAAA,EAAU,OAAO,QAAA;AAChD,CAAA;AAiBA,eAAe,gBAAgB,GAAA,EAA+C;AAC5E,EAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,GAAG,CAAA;AACvC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,UAAuC,EAAC;AAE9C,EAAA,KAAA,MAAW,GAAA,IAAO,QAAQ,WAAA,EAAa;AACrC,IAAA,MAAM,OAAA,GAAU,kBAAkB,GAAG,CAAA;AACrC,IAAA,IAAI,CAAC,OAAA;AACH,MAAA;AAEF,IAAA,MAAM,UAAA,GAAaA,MAAK,IAAA,CAAK,GAAA,EAAK,UAAU,CAAA,CAAA,EAAI,OAAA,CAAQ,SAAS,CAAA,IAAA,CAAM,CAAA;AACvE,IAAA,IAAI,MAAM,UAAA,CAAW,UAAU,CAAA,EAAG;AAChC,MAAA,QAAA,CAAS,IAAA,CAAK,QAAQ,SAAS,CAAA;AAAA,IACjC,CAAA,MACK;AACH,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAA,EAAK,SAAA,EAAW,QAAQ,SAAA,EAAW,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,CAAA;AAAA,IAC1E;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,OAAA,EAAS,OAAA,EAAQ;AACtC;AAKA,eAAsB,YAAY,OAAA,EAAqC;AACrE,EAAA,MAAM,UAAUM,GAAAA,EAAI;AACpB,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,IAAO,GAAA;AAE3B,EAAA,IAAI;AAEF,IAAA,OAAA,CAAQ,MAAM,6BAAS,CAAA;AACvB,IAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,GAAG,CAAA;AAExC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAA,CAAQ,IAAA,CAAKC,KAAAA,CAAM,GAAA,CAAI,iFAA0B,CAAC,CAAA;AAClD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,OAAA,EAAQ,GAAI,MAAA;AACvC,IAAA,OAAA,CAAQ,QAAQ,CAAA,gCAAA,EAAUA,KAAAA,CAAM,KAAK,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAE,CAAA;AAGpD,IAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,MAAA,MAAM,EAAE,wBAAA,EAA0B,4BAAA,EAA6B,GAAI,MAAM,OAAO,mCAA0B,CAAA;AAC1G,MAAA,MAAM,iBAAiB,MAAM,wBAAA,CAAyB,KAAK,4BAAA,CAA6B,OAAA,CAAQ,WAAW,CAAA,EAAG;AAAA,QAC5G,eAAA,EAAiB,KAAA;AAAA,QACjB,oBAAA,EAAsB;AAAA,OACvB,CAAA;AACD,MAAA,KAAA,MAAW,iBAAiB,cAAA,EAAgB;AAC1C,QAAAK,IAAAA,CAAK,OAAO,IAAA,CAAKL,KAAAA,CAAM,KAAK,CAAA,IAAA,EAAO,aAAa,EAAE,CAAC,CAAA;AAAA,MACrD;AAAA,IACF;AAGA,IAAAK,IAAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AACnB,IAAAA,KAAK,MAAA,CAAO,IAAA,CAAKL,KAAAA,CAAM,IAAA,CAAK,2BAAO,CAAC,CAAA;AACpC,IAAAK,IAAAA,CAAK,OAAO,IAAA,CAAK,CAAA,gBAAA,EAASL,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAE,CAAA;AACpD,IAAAK,KAAK,MAAA,CAAO,IAAA,CAAK,CAAA,gBAAA,EAAS,OAAA,CAAQ,OAAO,CAAA,CAAE,CAAA;AAC3C,IAAAA,IAAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,kCAAA,EAAY,OAAA,CAAQ,YAAY,MAAA,GAAS,CAAA,GAAI,OAAA,CAAQ,WAAA,CAAY,GAAA,CAAI,CAAA,CAAA,KAAKL,MAAM,IAAA,CAAK,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,IAAIA,KAAAA,CAAM,IAAA,CAAK,QAAG,CAAC,CAAA,CAAE,CAAA;AACxI,IAAAK,IAAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAGnB,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAAA,KAAK,MAAA,CAAO,IAAA,CAAKL,KAAAA,CAAM,IAAA,CAAK,2BAAO,CAAC,CAAA;AACpC,MAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,QAAAK,IAAAA,CAAK,OAAO,IAAA,CAAKL,KAAAA,CAAM,MAAM,CAAA,iBAAA,EAAe,GAAG,MAAM,CAAC,CAAA;AAAA,MACxD;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,CAAC,QAAQ,KAAA,EAAO;AAC1C,MAAAK,IAAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AACnB,MAAAA,KAAK,MAAA,CAAO,IAAA,CAAKL,KAAAA,CAAM,KAAA,CAAM,qEAAc,CAAC,CAAA;AAC5C,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAAK,IAAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AACnB,MAAAA,KAAK,MAAA,CAAO,IAAA,CAAKL,KAAAA,CAAM,IAAA,CAAK,2BAAO,CAAC,CAAA;AACpC,MAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,QAAAK,IAAAA,CAAK,MAAA,CAAO,IAAA,CAAKL,KAAAA,CAAM,MAAA,CAAO,CAAA,iBAAA,EAAe,IAAA,CAAK,SAAS,CAAA,MAAA,EAAS,IAAA,CAAK,KAAK,CAAA,CAAA,CAAG,CAAC,CAAA;AAAA,MACpF;AACA,MAAAK,IAAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAEnB,MAAA,OAAA,CAAQ,MAAM,qDAAa,CAAA;AAC3B,MAAA,IAAI,SAAA,GAAY,CAAA;AAChB,MAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,QAAA,MAAM,UAAA,GAAaZ,MAAK,IAAA,CAAK,GAAA,EAAK,UAAU,CAAA,CAAA,EAAI,IAAA,CAAK,SAAS,CAAA,IAAA,CAAM,CAAA;AACpE,QAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,IAAA,CAAK,SAAS,CAAA;AACjD,QAAA,MAAM,SAAA,CAAU,YAAY,OAAO,CAAA;AACnC,QAAA,SAAA,EAAA;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,OAAA,CAAQ,CAAA,mBAAA,EAAO,SAAS,CAAA,+BAAA,CAAQ,CAAA;AAAA,IAC1C;AAGA,IAAA,IAAI,OAAA,CAAQ,KAAA,IAAS,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACxC,MAAAY,IAAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AACnB,MAAA,OAAA,CAAQ,MAAM,6EAAiB,CAAA;AAC/B,MAAA,IAAI,WAAA,GAAc,CAAA;AAClB,MAAA,KAAA,MAAW,GAAA,IAAO,QAAQ,WAAA,EAAa;AACrC,QAAA,MAAM,OAAA,GAAU,kBAAkB,GAAG,CAAA;AACrC,QAAA,IAAI,CAAC,OAAA;AACH,UAAA;AACF,QAAA,MAAM,UAAA,GAAaZ,MAAK,IAAA,CAAK,GAAA,EAAK,UAAU,CAAA,CAAA,EAAI,OAAA,CAAQ,SAAS,CAAA,IAAA,CAAM,CAAA;AACvE,QAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,OAAA,CAAQ,SAAS,CAAA;AACpD,QAAA,MAAM,SAAA,CAAU,YAAY,OAAO,CAAA;AACnC,QAAA,WAAA,EAAA;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,OAAA,CAAQ,CAAA,+BAAA,EAAS,WAAW,CAAA,+BAAA,CAAQ,CAAA;AAAA,IAC9C;AAGA,IAAA,MAAM,cAAA,GAAiBA,KAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,UAAU,WAAW,CAAA;AAC3D,IAAA,IAAI,CAAE,MAAM,UAAA,CAAW,cAAc,CAAA,EAAI;AACvC,MAAA,OAAA,CAAQ,MAAM,0DAA4B,CAAA;AAC1C,MAAA,MAAM,OAAA,GAAU,mBAAmB,MAAM,CAAA;AACzC,MAAA,MAAM,SAAA,CAAU,gBAAgB,OAAO,CAAA;AACvC,MAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,IAClB;AAEA,IAAAY,IAAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AACnB,IAAAA,KAAK,MAAA,CAAO,IAAA,CAAKL,KAAAA,CAAM,KAAA,CAAM,qEAAc,CAAC,CAAA;AAC5C,IAAAK,IAAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AACnB,IAAAA,KAAK,MAAA,CAAO,IAAA,CAAKL,KAAAA,CAAM,IAAA,CAAK,qBAAM,CAAC,CAAA;AACnC,IAAAK,KAAK,MAAA,CAAO,IAAA,CAAKL,KAAAA,CAAM,IAAA,CAAK,gEAAwB,CAAC,CAAA;AACrD,IAAAK,KAAK,MAAA,CAAO,IAAA,CAAKL,KAAAA,CAAM,IAAA,CAAK,iEAAyB,CAAC,CAAA;AACtD,IAAAK,IAAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAAA,EACrB,SACO,KAAA,EAAO;AACZ,IAAA,OAAA,CAAQ,IAAA,EAAK;AACb,IAAAA,IAAAA,CAAK,OAAO,KAAA,CAAML,KAAAA,CAAM,IAAI,iCAAQ,CAAA,EAAG,EAAE,KAAA,EAAO,CAAA;AAChD,IAAA,MAAM,KAAA;AAAA,EACR;AACF;;;ACvLA,IAAM,UAAU,aAAA,EAAc;AAG9B,IAAM,GAAA,GAAM,IAAI,KAAK,CAAA;AAGrB,GAAA,CAAI,MAAA,CAAO,iBAAiB,sCAAQ,CAAA;AACpC,GAAA,CAAI,MAAA,CAAO,oBAAoB,0BAAM,CAAA;AAGrC,GAAA,CACG,OAAA,CAAQ,iBAAiB,2CAAa,CAAA,CACtC,OAAO,eAAA,EAAiB,2EAAuD,CAAA,CAC/E,MAAA,CAAO,uBAAA,EAAyB,wHAA6C,EAC7E,MAAA,CAAO,2BAAA,EAA6B,2DAAuC,CAAA,CAC3E,MAAA,CAAO,2BAAA,EAA6B,qFAA6C,CAAA,CACjF,MAAA,CAAO,YAAA,EAAc,sCAAQ,CAAA,CAC7B,MAAA,CAAO,iBAAiB,4CAAS,CAAA,CACjC,MAAA,CAAO,cAAA,EAAgB,gCAAO,CAAA,CAC9B,OAAO,4BAAA,EAA8B,4CAAwB,CAAA,CAC7D,MAAA,CAAO,UAAA,EAAY,8BAAU,EAC7B,MAAA,CAAO,oBAAA,EAAsB,0CAAY,CAAA,CACzC,MAAA,CAAO,WAAA,EAAa,oEAAa,CAAA,CACjC,MAAA,CAAO,OAAO,IAAA,EAA0B,OAAA,KAAqC;AAC5E,EAAA,IAAI;AAEF,IAAA,MAAM,QAAA,GAAW,OAAO,OAAA,CAAQ,QAAA,KAAa,WACzC,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,GAAG,EAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA,GAC7C,KAAA,CAAA;AACJ,IAAA,MAAM,YAAY,OAAO,OAAA,CAAQ,cAAc,QAAA,GAC3C,OAAA,CAAQ,UAAU,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,OAAK,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,GAC9D,KAAA,CAAA;AAEJ,IAAA,MAAM,aAAA,CAAc;AAAA,MAClB,MAAM,IAAA,IAAQ,EAAA;AAAA,MACd,SAAS,OAAA,CAAQ,IAAA;AAAA,MACjB,SAAA;AAAA,MACA,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,QAAA;AAAA,MACA,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,MACxB,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,KAAK,OAAA,CAAQ;AAAA,KACd,CAAA;AAAA,EACH,CAAA,CAAA,MACM;AAEJ,IAAAT,SAAQ,QAAA,GAAW,CAAA;AAAA,EACrB;AACF,CAAC,CAAA;AAGH,GAAA,CACG,OAAA,CAAQ,cAAA,EAAgB,wDAAW,CAAA,CACnC,MAAA,CAAO,cAAA,EAAgB,gCAAO,CAAA,CAC9B,MAAA,CAAO,OAAO,MAAA,EAA4B,OAAA,KAAqC;AAC9E,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,CAAU;AAAA,MACd,MAAA;AAAA,MACA,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,KAAK,OAAA,CAAQ;AAAA,KACd,CAAA;AAAA,EACH,CAAA,CAAA,MACM;AACJ,IAAAA,QAAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF,CAAC,CAAA;AAGH,GAAA,CACG,OAAA,CAAQ,MAAA,EAAQ,yDAAY,CAAA,CAC5B,MAAA,CAAO,eAAe,kDAAU,CAAA,CAChC,MAAA,CAAO,OAAO,OAAA,KAAqC;AAClD,EAAA,IAAI;AACF,IAAA,MAAM,WAAA,CAAY;AAAA,MAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,KAAK,OAAA,CAAQ;AAAA,KACd,CAAA;AAAA,EACH,CAAA,CAAA,MACM;AACJ,IAAAA,QAAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF,CAAC,CAAA;AAGH,GAAA,CACG,QAAQ,wBAAA,EAA0B,0BAAM,EACxC,KAAA,CAAM,GAAG,EACT,MAAA,CAAO,qBAAA,EAAuB,0BAAM,CAAA,CACpC,MAAA,CAAO,eAAe,sCAAQ,CAAA,CAC9B,OAAO,OAAO,IAAA,EAA0B,MAA0B,OAAA,KAAqC;AACtG,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,CAAS;AAAA,MACb,IAAA;AAAA,MACA,MAAM,IAAA,IAAQ,EAAA;AAAA,MACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,KAAK,OAAA,CAAQ;AAAA,KACd,CAAA;AAAA,EACH,CAAA,CAAA,MACM;AACJ,IAAAA,QAAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF,CAAC,CAAA;AAGH,GAAA,CACG,QAAQ,iBAAA,EAAmB,kDAAU,EACrC,MAAA,CAAO,uBAAA,EAAyB,kFAA2B,CAAA,CAC3D,MAAA,CAAO,oBAAoB,kDAAU,CAAA,CACrC,OAAO,cAAA,EAAgB,0BAAM,EAC7B,MAAA,CAAO,OAAO,QAA4B,OAAA,KAAqC;AAC9E,EAAA,IAAI;AACF,IAAA,MAAM,aAAA,CAAc;AAAA,MAClB,MAAA;AAAA,MACA,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,eAAe,OAAA,CAAQ,aAAA;AAAA,MACvB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,KAAK,OAAA,CAAQ;AAAA,KACd,CAAA;AAAA,EACH,CAAA,CAAA,MACM;AACJ,IAAAA,QAAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF,CAAC,CAAA;AAGH,GAAA,CACG,QAAQ,eAAA,EAAiB,0BAAM,EAC/B,MAAA,CAAO,OAAO,MAAc,OAAA,KAAqC;AAChE,EAAA,MAAM,QAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,GAAA,EAAK,OAAA,CAAQ,KAAe,CAAA;AACnE,CAAC,CAAA;AAEH,GAAA,CACG,QAAQ,oBAAA,EAAsB,0BAAM,EACpC,MAAA,CAAO,OAAO,MAAc,OAAA,KAAqC;AAChE,EAAA,MAAM,QAAA,CAAS,EAAE,IAAA,EAAM,WAAA,EAAa,MAAM,GAAA,EAAK,OAAA,CAAQ,KAAe,CAAA;AACxE,CAAC,CAAA;AAEH,GAAA,CACG,QAAQ,cAAA,EAAgB,kBAAQ,EAChC,MAAA,CAAO,OAAO,MAAc,OAAA,KAAqC;AAChE,EAAA,MAAM,QAAA,CAAS,EAAE,IAAA,EAAM,KAAA,EAAO,MAAM,GAAA,EAAK,OAAA,CAAQ,KAAe,CAAA;AAClE,CAAC,CAAA;AAEH,GAAA,CACG,QAAQ,gBAAA,EAAkB,sCAAQ,EAClC,MAAA,CAAO,OAAO,MAAc,OAAA,KAAqC;AAChE,EAAA,MAAM,QAAA,CAAS,EAAE,IAAA,EAAM,OAAA,EAAS,MAAM,GAAA,EAAK,OAAA,CAAQ,KAAe,CAAA;AACpE,CAAC,CAAA;AAGH,GAAA,CAAI,QAAQ,OAAO,CAAA;AACnB,GAAA,CAAI,IAAA,EAAK;AAGT,IAAM,MAAA,GAAS,IAAI,KAAA,EAAM;AAGzB,IAAI,CAAC,GAAA,CAAI,cAAA,IAAkB,CAAC,MAAA,CAAO,QAAQ,IAAA,IAAQ,CAAC,MAAA,CAAO,OAAA,CAAQ,OAAA,EAAS;AAC1E,EAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,EAAA,eAAA,CAAgBS,KAAAA,CAAM,IAAA,CAAK,yBAAyB,CAAC,CAAA;AACrD,EAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,EAAA,GAAA,CAAI,UAAA,EAAW;AACjB","file":"index.js","sourcesContent":["/**\n * @h-ai/cli — 工具函数\n * @module cli-utils\n */\n\nimport type { TemplateContext } from './cli-types.js'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { fileURLToPath } from 'node:url'\nimport { wrapAnsi } from 'fast-wrap-ansi'\nimport fs from 'fs-extra'\nimport Handlebars from 'handlebars'\n\nconst CAMEL_CASE_SEPARATOR_REGEX = /[-_\\s]+(.)?/g\nconst LEADING_CHAR_REGEX = /^./\n\n/** CLI 交互提示直接写终端,不能交给异步 JSON 日志 transport。 */\nexport function writeCliMessage(message: string): void {\n process.stdout.write(`${message}\\n`)\n}\n\n/** 显示异常的 message,保留子命令输出;Error 的不可枚举属性不能依赖 JSON 序列化。 */\nexport function writeCliError(message: string, error?: unknown): void {\n process.stderr.write(`${message}\\n`)\n if (error !== undefined)\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`)\n}\n\n/** 显式按显示宽度换行,为 prompts 的前缀和缩进预留空间,避免中文自动折行后擦除不足。 */\nexport function formatPromptDescription(description: string): string {\n return wrapAnsi(description, Math.max(1, (process.stdout.columns || 80) - 32), { hard: true })\n}\n\n/**\n * 转换为驼峰命名\n */\nexport function toCamelCase(str: string): string {\n return str\n .replace(CAMEL_CASE_SEPARATOR_REGEX, (_, c) => c ? c.toUpperCase() : '')\n .replace(LEADING_CHAR_REGEX, c => c.toLowerCase())\n}\n\n/**\n * 转换为帕斯卡命名\n */\nexport function toPascalCase(str: string): string {\n const camel = toCamelCase(str)\n return camel.charAt(0).toUpperCase() + camel.slice(1)\n}\n\n/**\n * 转换为短横线命名\n */\nexport function toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase()\n}\n\n/**\n * 转换为下划线命名\n */\nexport function toSnakeCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s-]+/g, '_')\n .toLowerCase()\n}\n\n/**\n * 创建模板上下文\n */\nexport function createTemplateContext(name: string, extra: Record<string, unknown> = {}): TemplateContext {\n return {\n camelCase: toCamelCase(name),\n pascalCase: toPascalCase(name),\n kebabCase: toKebabCase(name),\n snakeCase: toSnakeCase(name),\n ...extra,\n }\n}\n\n/**\n * 渲染模板\n */\nexport function renderTemplate(template: string, context: TemplateContext): string {\n const compiled = Handlebars.compile(template, { noEscape: true })\n return compiled(context)\n}\n\n/**\n * 渲染模板文件\n */\nexport async function renderTemplateFile(\n templatePath: string,\n context: TemplateContext,\n): Promise<string> {\n const template = await fs.readFile(templatePath, 'utf-8')\n return renderTemplate(template, context)\n}\n\n/**\n * 写入文件(创建目录)\n */\nexport async function writeFile(filePath: string, content: string): Promise<void> {\n await fs.ensureDir(path.dirname(filePath))\n await fs.writeFile(filePath, content, 'utf-8')\n}\n\n/**\n * 检查文件是否存在\n */\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath)\n return true\n }\n catch {\n return false\n }\n}\n\n/**\n * 获取包版本\n */\nexport async function getPackageVersion(pkgPath: string): Promise<string | null> {\n try {\n const pkg = await fs.readJson(pkgPath)\n return pkg.version\n }\n catch {\n return null\n }\n}\n\n/**\n * 读取 CLI 自身版本号\n *\n * 从当前模块所在目录向上查找 `@h-ai/cli` 的 package.json,\n * 兼容源码布局(src/)与打包产物布局(dist/)以及 npm 安装后的 node_modules 布局。\n * 用于生成项目时固定 `@h-ai/*` 依赖版本,避免硬编码与预发布版本漂移。\n */\nexport function getCliVersion(): string {\n let dir = path.dirname(fileURLToPath(import.meta.url))\n for (let i = 0; i < 6; i++) {\n try {\n const pkg = fs.readJsonSync(path.join(dir, 'package.json')) as { name?: string, version?: string }\n if (pkg.name === '@h-ai/cli')\n return pkg.version ?? '0.0.0'\n }\n catch {\n // 当前目录无 package.json,继续向上查找\n }\n const parent = path.dirname(dir)\n if (parent === dir)\n break\n dir = parent\n }\n return '0.0.0'\n}\n\n/**\n * 检测包管理器\n */\nexport async function detectPackageManager(cwd: string): Promise<'pnpm' | 'npm' | 'yarn'> {\n if (await fileExists(path.join(cwd, 'pnpm-lock.yaml'))) {\n return 'pnpm'\n }\n if (await fileExists(path.join(cwd, 'yarn.lock'))) {\n return 'yarn'\n }\n return 'npm'\n}\n\n/**\n * 格式化字节\n */\nexport function formatBytes(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB']\n let size = bytes\n let unitIndex = 0\n\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024\n unitIndex++\n }\n\n return `${size.toFixed(1)} ${units[unitIndex]}`\n}\n\n/**\n * 格式化时间\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`\n }\n return `${(ms / 1000).toFixed(2)}s`\n}\n\n/**\n * 注册 Handlebars helpers\n */\nexport function registerHelpers(): void {\n // 条件判断\n Handlebars.registerHelper('if_eq', function (this: unknown, a: unknown, b: unknown, options: Handlebars.HelperOptions) {\n return a === b ? options.fn(this) : options.inverse(this)\n })\n\n // 日期格式化\n Handlebars.registerHelper('date', () => {\n return new Date().toISOString().split('T')[0]\n })\n\n // 年份\n Handlebars.registerHelper('year', () => {\n return new Date().getFullYear()\n })\n\n // 大写\n Handlebars.registerHelper('upper', (str: string) => {\n return str.toUpperCase()\n })\n\n // 小写\n Handlebars.registerHelper('lower', (str: string) => {\n return str.toLowerCase()\n })\n}\n\n// 初始化时注册 helpers\nregisterHelpers()\n","/**\n * @h-ai/cli — 模板引擎\n *\n * 基于模板目录的项目生成逻辑:\n * 1. 拷贝 base 模板(骨架)\n * 2. 拷贝 apps/{type} 模板(应用类型路由)\n * 3. 叠加 features/{feat} 模板(可选功能路由,静态文件)\n * 4. 渲染 Handlebars 动态模板(base + apps + features 的 .hbs 文件)\n * 5. 拷贝 i18n 脚手架(project.inlang + messages)(当 hasI18n 为 true)\n *\n * @module cli-template-engine\n */\n\nimport type { AppType, FeatureId, FrontendTarget, ModuleConfigs } from '../cli-types.js'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport fse from 'fs-extra'\nimport Handlebars from 'handlebars'\nimport { stringify } from 'yaml'\nimport { getCliVersion } from '../cli-utils.js'\nimport { generateConfigFile } from './cli-config-templates.js'\n\n// 注册自定义 Handlebars helpers\nHandlebars.registerHelper('if_eq', function (this: unknown, a: unknown, b: unknown, options: Handlebars.HelperOptions) {\n return a === b ? options.fn(this) : options.inverse(this)\n})\n\n// 配置中的显示名称可包含引号、空格和换行,嵌入 TS / JSON / YAML 时必须作为字面量编码。\nHandlebars.registerHelper('json', (value: unknown) => JSON.stringify(value))\nHandlebars.registerHelper('html', (value: string) => Handlebars.escapeExpression(value))\nHandlebars.registerHelper('yaml', (key: string, value: unknown) => stringify({ [key]: value }).trim())\nHandlebars.registerHelper('jsString', (value: string) => `'${JSON.stringify(value).slice(1, -1).replace(/\\\\\"/g, '\"').replace(/'/g, '\\\\\\'')}'`)\n\n// 同一份模块配置供直接渲染和 create 命令使用,避免精简配置覆盖完整模板。\n// 未选择的模块只输出注释;说明也加两层注释,整文件去掉外层后仍是合法 YAML。\nHandlebars.registerHelper('moduleConfig', function (this: TemplateContext, moduleKey: string, enabled: boolean) {\n // 文件模板自身保留结尾换行,helper 不再重复输出空行。\n const content = generateConfigFile(moduleKey, this.moduleConfigs).trimEnd()\n const configured = this.appType === 'fullstack' && moduleKey === 'iam'\n ? content.replace('seedDefaultData: true', 'seedDefaultData: false').replace('variant: card', 'variant: split')\n : content\n return enabled\n ? configured\n : `# # 未启用:安装对应模块并在服务端 runtime 中初始化,再取消所需配置的注释。\\n${configured.split('\\n').map(line => line ? `# ${line}` : '').join('\\n')}`\n})\n\nconst TEMPLATE_SKIP_IF_EMPTY_MARKER = '@skipIfEmpty'\nconst NORMALIZED_RENDER_EXTENSIONS = new Set(['.ts', '.js', '.svelte', '.json', '.css'])\n\n// Capacitor 应用为纯客户端 SPA(Svelte 5 + Vite),没有服务端运行时。\n// 服务端专属产物(hooks、server init)必须跳过,否则预渲染会因访问 url.searchParams 报错。\nconst CAPACITOR_SKIPPED_SERVER_FILES = new Set([\n 'src/hooks.server.ts',\n 'src/lib/server/init.ts',\n])\n\n// 以下版本号与生成项目的 pnpm-workspace.yaml catalog 保持一致;\n// 单包脚手架直接写具体版本,pnpm fullstack workspace 会通过 catalog: 引用这些版本。\nconst VERSIONS = {\n antfuEslintConfig: '^9.5.1',\n capacitorSecureStorage: '^8.0.1',\n // UI / Icon\n bitsUi: '^2.19.5',\n iconifyJsonTabler: '^1.2.42',\n iconifyTailwind: '^1.2.3',\n // Capacitor\n capacitorAndroid: '^8.5.3',\n capacitorApp: '^8.1.2',\n capacitorCamera: '^8.2.5',\n capacitorCli: '^8.5.3',\n capacitorCore: '^8.5.3',\n capacitorDevice: '^8.0.3',\n capacitorIos: '^8.5.3',\n capacitorPreferences: '^8.0.1',\n capacitorPushNotifications: '^8.1.3',\n capacitorStatusBar: '^8.0.4',\n // Tailwind / DaisyUI\n daisyui: '^5.7.47',\n tailwindcss: '^4.3.3',\n tailwindcssVite: '^4.3.3',\n // i18n\n inlangParaglide: '^2.27.0',\n inlangMessageFormat: '^4.5.0',\n // Svelte / Vite\n svelte: '^5.57.2',\n svelteKit: '^2.70.3',\n svelteAdapterNode: '^5.5.7',\n svelteCheck: '^4.7.6',\n sveltePlugin: '^7.3.1',\n // Build / Test\n vite: '^8.3.4',\n vitest: '^4.1.11',\n tsup: '^8.5.1',\n rimraf: '^6.1.3',\n // ESLint\n eslint: '^10.12.0',\n eslintPluginFormat: '^2.0.1',\n eslintPluginSvelte: '^3.23.1',\n svelteEslintParser: '^1.9.0',\n // Node / TS\n nodeTypes: '^26.6.5',\n // Svelte / ESLint / tsup 继续使用稳定的 JavaScript 编译 API。\n typescript: '^6.0.3',\n // E2E\n playwright: '^1.64.0',\n // Validation\n zod: '^4.6.5',\n // Tauri\n tauriCli: '^2.12.1',\n} as const\n\ntype ImplementedFrontendTarget = Exclude<FrontendTarget, 'miniapp'>\n\nconst FRONTEND_PORTS_DEFAULT: Record<ImplementedFrontendTarget, number> = {\n web: 4173,\n app: 5175,\n desktop: 5176,\n}\n\nconst FRONTEND_LABELS: Record<FrontendTarget, string> = {\n web: 'Web',\n app: 'App',\n miniapp: 'Miniapp',\n desktop: 'Desktop',\n}\n\nconst IMPLEMENTED_FRONTENDS: readonly FrontendTarget[] = ['web', 'app', 'desktop']\nconst DEFAULT_FULLSTACK_FRONTENDS: readonly FrontendTarget[] = ['web', 'app', 'desktop']\nconst DEFAULT_THEMES = ['light', 'dark'] as const\nconst DEFAULT_THEME_NAME = 'light'\n// 框架与模板同步发布;范围版本会把旧命名 alpha9 视为比 alpha.58 更新。\nconst HAI_PACKAGE_VERSION = getCliVersion()\nconst HAI_PACKAGE_SPECIFIER_CATALOG = 'catalog:'\ntype FullstackPackageSpecifiers = { [Key in keyof typeof VERSIONS]: string }\ntype CatalogPackageVersions = Readonly<Record<string, string>>\n\nconst HAI_CATALOG_PACKAGE_NAMES = [\n '@h-ai/ai',\n '@h-ai/api-client',\n '@h-ai/api-contract',\n '@h-ai/audit',\n '@h-ai/cache',\n '@h-ai/capacitor',\n '@h-ai/core',\n '@h-ai/crypto',\n '@h-ai/datapipe',\n '@h-ai/deploy',\n '@h-ai/iam',\n '@h-ai/kit',\n '@h-ai/payment',\n '@h-ai/reach',\n '@h-ai/reldb',\n '@h-ai/scheduler',\n '@h-ai/serv',\n '@h-ai/storage',\n '@h-ai/ui',\n '@h-ai/vecdb',\n] as const\nconst HAI_CATALOG_PACKAGES: Record<string, string> = Object.fromEntries(\n HAI_CATALOG_PACKAGE_NAMES.map(packageName => [packageName, HAI_PACKAGE_VERSION]),\n)\n\nconst FULLSTACK_EXTERNAL_CATALOG_PACKAGES: CatalogPackageVersions = {\n '@antfu/eslint-config': VERSIONS.antfuEslintConfig,\n '@aparajita/capacitor-secure-storage': VERSIONS.capacitorSecureStorage,\n '@capacitor/android': VERSIONS.capacitorAndroid,\n '@capacitor/app': VERSIONS.capacitorApp,\n '@capacitor/camera': VERSIONS.capacitorCamera,\n '@capacitor/cli': VERSIONS.capacitorCli,\n '@capacitor/core': VERSIONS.capacitorCore,\n '@capacitor/device': VERSIONS.capacitorDevice,\n '@capacitor/ios': VERSIONS.capacitorIos,\n '@capacitor/preferences': VERSIONS.capacitorPreferences,\n '@capacitor/push-notifications': VERSIONS.capacitorPushNotifications,\n '@capacitor/status-bar': VERSIONS.capacitorStatusBar,\n '@iconify-json/tabler': VERSIONS.iconifyJsonTabler,\n '@iconify/tailwind4': VERSIONS.iconifyTailwind,\n '@inlang/paraglide-js': VERSIONS.inlangParaglide,\n '@inlang/plugin-message-format': VERSIONS.inlangMessageFormat,\n '@playwright/test': VERSIONS.playwright,\n '@sveltejs/vite-plugin-svelte': VERSIONS.sveltePlugin,\n '@tailwindcss/vite': VERSIONS.tailwindcssVite,\n '@tauri-apps/cli': VERSIONS.tauriCli,\n '@types/node': VERSIONS.nodeTypes,\n 'bits-ui': VERSIONS.bitsUi,\n 'daisyui': VERSIONS.daisyui,\n 'eslint': VERSIONS.eslint,\n 'eslint-plugin-format': VERSIONS.eslintPluginFormat,\n 'eslint-plugin-svelte': VERSIONS.eslintPluginSvelte,\n 'rimraf': VERSIONS.rimraf,\n 'svelte': VERSIONS.svelte,\n 'svelte-check': VERSIONS.svelteCheck,\n 'svelte-eslint-parser': VERSIONS.svelteEslintParser,\n 'tailwindcss': VERSIONS.tailwindcss,\n 'tsup': VERSIONS.tsup,\n 'typescript': VERSIONS.typescript,\n 'vite': VERSIONS.vite,\n 'vitest': VERSIONS.vitest,\n 'zod': VERSIONS.zod,\n}\n\nconst FULLSTACK_CATALOG_PACKAGES: CatalogPackageVersions = {\n ...HAI_CATALOG_PACKAGES,\n ...FULLSTACK_EXTERNAL_CATALOG_PACKAGES,\n}\n\nconst FULLSTACK_ROOT_CATALOG_PACKAGE_NAMES = [\n '@antfu/eslint-config',\n '@playwright/test',\n '@sveltejs/vite-plugin-svelte',\n '@types/node',\n 'eslint',\n 'eslint-plugin-format',\n 'eslint-plugin-svelte',\n 'rimraf',\n 'svelte',\n 'svelte-check',\n 'svelte-eslint-parser',\n 'tsup',\n 'typescript',\n 'vite',\n 'vitest',\n] as const\n\nconst FULLSTACK_CONTRACT_CATALOG_PACKAGE_NAMES = [\n '@h-ai/api-contract',\n '@h-ai/core',\n 'zod',\n] as const\n\nconst FULLSTACK_SERV_CATALOG_PACKAGE_NAMES = [\n '@h-ai/audit',\n '@h-ai/cache',\n '@h-ai/core',\n '@h-ai/crypto',\n '@h-ai/iam',\n '@h-ai/reach',\n '@h-ai/reldb',\n '@h-ai/serv',\n '@h-ai/storage',\n 'zod',\n] as const\n\nconst FULLSTACK_SHARED_CATALOG_PACKAGE_NAMES = [\n '@h-ai/api-client',\n '@h-ai/api-contract',\n '@h-ai/core',\n '@h-ai/crypto',\n '@h-ai/ui',\n '@inlang/paraglide-js',\n '@inlang/plugin-message-format',\n 'svelte',\n 'svelte-check',\n 'typescript',\n 'vite',\n 'vitest',\n] as const\n\nconst FULLSTACK_WEB_CATALOG_PACKAGE_NAMES = [\n '@antfu/eslint-config',\n '@h-ai/ui',\n '@iconify-json/tabler',\n '@iconify/tailwind4',\n '@inlang/paraglide-js',\n '@inlang/plugin-message-format',\n '@sveltejs/vite-plugin-svelte',\n '@tailwindcss/vite',\n 'bits-ui',\n 'daisyui',\n 'eslint',\n 'eslint-plugin-format',\n 'eslint-plugin-svelte',\n 'svelte',\n 'svelte-check',\n 'svelte-eslint-parser',\n 'tailwindcss',\n 'typescript',\n 'vite',\n 'vitest',\n] as const\n\nconst FULLSTACK_APP_CATALOG_PACKAGE_NAMES = [\n ...FULLSTACK_WEB_CATALOG_PACKAGE_NAMES,\n '@aparajita/capacitor-secure-storage',\n '@capacitor/android',\n '@capacitor/app',\n '@capacitor/camera',\n '@capacitor/cli',\n '@capacitor/core',\n '@capacitor/device',\n '@capacitor/ios',\n '@capacitor/preferences',\n '@capacitor/push-notifications',\n '@capacitor/status-bar',\n '@h-ai/capacitor',\n] as const\n\nconst FULLSTACK_DESKTOP_CATALOG_PACKAGE_NAMES = [\n ...FULLSTACK_WEB_CATALOG_PACKAGE_NAMES,\n '@tauri-apps/cli',\n] as const\n\nconst API_WORKSPACE_EXTERNAL_CATALOG_PACKAGE_NAMES = [\n '@antfu/eslint-config',\n '@playwright/test',\n '@types/node',\n 'eslint',\n 'eslint-plugin-format',\n 'rimraf',\n 'tsup',\n 'typescript',\n 'vitest',\n 'zod',\n] as const\n\nfunction pickCatalogPackages(\n packageNames: readonly string[],\n availableCatalogPackages: CatalogPackageVersions,\n): Record<string, string> {\n return Object.fromEntries(\n [...new Set(packageNames)]\n .sort((left, right) => left.localeCompare(right))\n .map((packageName) => {\n const version = availableCatalogPackages[packageName]\n if (!version) {\n throw new Error(`Missing catalog version for package \"${packageName}\"`)\n }\n return [packageName, version]\n }),\n )\n}\n\nfunction buildFullstackPackageSpecifiers(useCatalogProtocol: boolean): FullstackPackageSpecifiers {\n return Object.fromEntries(\n Object.entries(VERSIONS).map(([key, version]) => [key, useCatalogProtocol ? HAI_PACKAGE_SPECIFIER_CATALOG : version]),\n ) as FullstackPackageSpecifiers\n}\n\nfunction buildApiWorkspaceCatalogPackages(featureMap: Record<string, boolean>): Record<string, string> {\n const packageNames: string[] = [\n ...API_WORKSPACE_EXTERNAL_CATALOG_PACKAGE_NAMES,\n '@h-ai/api-client',\n '@h-ai/api-contract',\n '@h-ai/core',\n '@h-ai/serv',\n ]\n\n if (featureMap.db)\n packageNames.push('@h-ai/reldb')\n if (featureMap.cache)\n packageNames.push('@h-ai/cache')\n if (featureMap.iam)\n packageNames.push('@h-ai/iam')\n if (featureMap.crypto)\n packageNames.push('@h-ai/crypto')\n if (featureMap.storage)\n packageNames.push('@h-ai/storage')\n if (featureMap.ai)\n packageNames.push('@h-ai/ai')\n if (featureMap.audit)\n packageNames.push('@h-ai/audit')\n if (featureMap.reach)\n packageNames.push('@h-ai/reach')\n if (featureMap.payment)\n packageNames.push('@h-ai/payment')\n if (featureMap.vecdb)\n packageNames.push('@h-ai/vecdb')\n if (featureMap.datapipe)\n packageNames.push('@h-ai/datapipe')\n if (featureMap.scheduler)\n packageNames.push('@h-ai/scheduler')\n if (featureMap.deploy)\n packageNames.push('@h-ai/deploy')\n\n return pickCatalogPackages(packageNames, FULLSTACK_CATALOG_PACKAGES)\n}\n\nfunction buildAppHaiCatalogPackages(options: {\n featureMap: Record<string, boolean>\n hasUi: boolean\n isCapacitorApp: boolean\n isSvelteOnlyApp: boolean\n}): Record<string, string> {\n const packageNames: string[] = []\n\n if (options.isSvelteOnlyApp) {\n packageNames.push('@h-ai/api-client', '@h-ai/api-contract', '@h-ai/capacitor', '@h-ai/ui')\n return pickCatalogPackages(packageNames, HAI_CATALOG_PACKAGES)\n }\n\n packageNames.push('@h-ai/core', '@h-ai/kit')\n if (options.hasUi)\n packageNames.push('@h-ai/ui')\n if (options.featureMap.db)\n packageNames.push('@h-ai/reldb')\n if (options.featureMap.cache)\n packageNames.push('@h-ai/cache')\n if (options.featureMap.iam)\n packageNames.push('@h-ai/iam')\n if (options.featureMap.crypto)\n packageNames.push('@h-ai/crypto')\n if (options.featureMap.storage)\n packageNames.push('@h-ai/storage')\n if (options.featureMap.ai)\n packageNames.push('@h-ai/ai')\n if (options.featureMap.audit)\n packageNames.push('@h-ai/audit')\n if (options.featureMap.reach)\n packageNames.push('@h-ai/reach')\n if (options.featureMap.payment)\n packageNames.push('@h-ai/payment')\n if (options.featureMap.vecdb)\n packageNames.push('@h-ai/vecdb')\n if (options.featureMap.datapipe)\n packageNames.push('@h-ai/datapipe')\n if (options.featureMap.scheduler)\n packageNames.push('@h-ai/scheduler')\n if (options.featureMap.deploy)\n packageNames.push('@h-ai/deploy')\n if (options.featureMap['api-client'])\n packageNames.push('@h-ai/api-client')\n if (options.featureMap.capacitor)\n packageNames.push('@h-ai/capacitor')\n if (options.isCapacitorApp && !options.featureMap['api-client'])\n packageNames.push('@h-ai/api-client')\n if (options.isCapacitorApp && !options.featureMap.capacitor)\n packageNames.push('@h-ai/capacitor')\n\n return pickCatalogPackages(packageNames, HAI_CATALOG_PACKAGES)\n}\n\nfunction buildFullstackCatalogPackages(frontends: readonly FrontendTarget[]): Record<string, string> {\n const packageNames: string[] = [\n ...FULLSTACK_ROOT_CATALOG_PACKAGE_NAMES,\n ...FULLSTACK_CONTRACT_CATALOG_PACKAGE_NAMES,\n ...FULLSTACK_SERV_CATALOG_PACKAGE_NAMES,\n ...FULLSTACK_SHARED_CATALOG_PACKAGE_NAMES,\n ]\n\n if (frontends.includes('web'))\n packageNames.push(...FULLSTACK_WEB_CATALOG_PACKAGE_NAMES)\n if (frontends.includes('app'))\n packageNames.push(...FULLSTACK_APP_CATALOG_PACKAGE_NAMES)\n if (frontends.includes('desktop'))\n packageNames.push(...FULLSTACK_DESKTOP_CATALOG_PACKAGE_NAMES)\n\n return pickCatalogPackages(packageNames, FULLSTACK_CATALOG_PACKAGES)\n}\n\n// =============================================================================\n// 类型\n// =============================================================================\n\n/**\n * 模板渲染上下文\n */\nexport interface TemplateContext {\n /** 所有应用模板共用的第三方依赖版本,避免单包与 workspace 版本表漂移。 */\n versions: typeof VERSIONS\n /** 项目名称 */\n projectName: string\n /** 是否对 @h-ai/* 依赖启用 pnpm catalog 协议 */\n useCatalogProtocol: boolean\n /** @h-ai/* 依赖写入 package.json 时使用的版本说明符 */\n haiPackageSpecifier: string\n /** 生成项目时引用的 @h-ai/* 发布版本 */\n haiPackageVersion: string\n /** 生成项目时写入 pnpm-workspace.yaml 的 catalog 条目 */\n haiCatalogPackages: Record<string, string>\n /** 应用类型 */\n appType: AppType\n /** 选中的 feature 集合(用于 {{#if features.xxx}}) */\n features: Record<string, boolean>\n /** 创建时指定的模块配置;配置模板需保留这些值。 */\n moduleConfigs?: ModuleConfigs\n /** 是否有 UI(非 api / fullstack 类型) */\n hasUi: boolean\n /** 是否有 i18n(非 api / fullstack 类型) */\n hasI18n: boolean\n /** 是否为 Capacitor 原生移动应用(mobile-app) */\n isCapacitorApp: boolean\n /** 是否为 API workspace(service + contract) */\n isApiWorkspace: boolean\n /** 是否为不依赖 SvelteKit 的纯 Svelte 5 应用 */\n isSvelteOnlyApp: boolean\n /** 默认语言 */\n defaultLocale: string\n /** 包管理器 */\n packageManager: string\n /** API workspace 专用上下文 */\n api?: ApiWorkspaceTemplateContext\n /** 前后端分离工程专用上下文 */\n fullstack?: FullstackTemplateContext\n}\n\nexport interface ApiWorkspaceTemplateContext {\n /** 依赖版本集合 */\n versions: typeof VERSIONS\n /** 写入 package.json 的依赖说明符(pnpm 时为 catalog:) */\n packageSpecifiers: FullstackPackageSpecifiers\n /** 共享 contract 包名 */\n contractPackageName: string\n /** 共享 contract 导出变量名 */\n contractExportName: string\n /** 后端 service 包名 */\n servicePackageName: string\n /** Service App 工厂函数名 */\n serviceAppFactoryName: string\n /** procedures 聚合函数名 */\n serviceProceduresFactoryName: string\n}\n\nexport interface FullstackFrontendApp {\n /** 前端目标 */\n target: ImplementedFrontendTarget\n /** 包名 */\n packageName: string\n /** 展示名称 */\n label: string\n /** 本地端口 */\n port: number\n}\n\n/**\n * 国际化配置(已解析后的最终值)\n */\nexport interface FullstackI18nContext {\n baseLocale: string\n locales: readonly string[]\n}\n\n/**\n * 主题配置(已解析后的最终值)\n */\nexport interface FullstackThemeContext {\n defaultTheme: string\n themes: readonly string[]\n}\n\nexport interface FullstackTemplateContext {\n /** 显示名称来自 core 配置。 */\n appName: string\n /** 依赖版本集合 */\n versions: typeof VERSIONS\n /** 写入 package.json 的依赖说明符(pnpm 时为 catalog:) */\n packageSpecifiers: FullstackPackageSpecifiers\n /** 共享 contract 包名 */\n contractPackageName: string\n /** 共享 contract 导出变量名 */\n contractExportName: string\n /** 后端 service 包名 */\n servPackageName: string\n /** 原生壳 appId / bundle identifier 使用的安全短名 */\n nativeAppIdSegment: string\n /** 前端共享代码包名 */\n sharedPackageName: string\n /** 所有已选择前端 */\n selectedFrontends: readonly FrontendTarget[]\n /** 已选择前端 JSON 字面量 */\n selectedFrontendsJson: string\n /** 可运行前端应用 */\n frontendApps: readonly FullstackFrontendApp[]\n /** Playwright 默认验证前端 */\n e2eFrontend?: FullstackFrontendApp\n /** 前端选择布尔表,用于模板条件创建 */\n frontends: Record<FrontendTarget, boolean>\n /** 各前端端口(key 为 target) */\n ports: Record<ImplementedFrontendTarget, number>\n /** 是否选择小程序预留 */\n hasMiniapp: boolean\n /** i18n 配置 */\n i18n: FullstackI18nContext\n /** 主题配置 */\n theme: FullstackThemeContext\n}\n\n/**\n * feature 对应的路由目录映射\n *\n * 每个 feature 可以有:\n * - `routes-shared/` — 所有应用类型共用(如 API 端点)\n * - `routes-{appType}/` — 特定应用类型专用(如 UI 页面)\n * - `routes/` — 通用路由(任何类型都拷贝)\n */\nconst FEATURE_ROUTE_DIRS: Record<string, string[]> = {\n iam: ['routes-shared'],\n storage: ['routes'],\n ai: ['routes'],\n payment: ['routes'],\n vecdb: ['routes'],\n datapipe: ['routes'],\n reach: ['routes'],\n scheduler: ['routes'],\n audit: ['routes'],\n}\n\n/**\n * feature 的 appType 专用路由\n */\nconst FEATURE_APP_ROUTE_DIRS: Record<string, string[]> = {\n iam: ['admin', 'h5', 'website'],\n}\n\nconst FEATURE_ID_REGEX = /^[a-z0-9-]+$/\nconst HBS_SUFFIX_REGEX = /\\.hbs$/\nconst FULLSTACK_FRONTEND_TEMPLATE_PATH_REGEX = /^apps\\/\\{\\{projectName\\}\\}-(web|app|desktop|miniapp)\\//\nconst NON_IDENTIFIER_CHAR_REGEX = /[^a-z0-9]+/i\nconst IDENTIFIER_START_REGEX = /^[a-z_$]/i\n\n// =============================================================================\n// 路径工具\n// =============================================================================\n\n/**\n * 获取 templates/ 目录的绝对路径\n *\n * 兼容两种运行环境:\n * - 构建后:dist/cli-template-engine.js → ../templates\n * - 测试时:src/commands/cli-template-engine.ts → ../../templates\n */\nfunction getTemplatesRoot(): string {\n const currentDir = path.dirname(fileURLToPath(import.meta.url))\n // 优先尝试 dist 模式(../templates),再尝试 src 模式(../../templates)\n const distPath = path.resolve(currentDir, '..', 'templates')\n if (fse.pathExistsSync(distPath)) {\n return distPath\n }\n return path.resolve(currentDir, '..', '..', 'templates')\n}\n\n// =============================================================================\n// 拷贝工具\n// =============================================================================\n\n/**\n * 拷贝目录,自动跳过 .hbs 文件(这些由 renderDynamicFiles 处理)\n *\n * @param src - 源目录\n * @param dest - 目标目录\n * @param excludePaths - 需要排除的相对路径前缀(如 'messages')\n */\nasync function copyStaticDir(src: string, dest: string, excludePaths?: string[]): Promise<void> {\n if (!(await fse.pathExists(src))) {\n return\n }\n\n await fse.copy(src, dest, {\n overwrite: true,\n filter: (filePath: string) => {\n const rel = path.relative(src, filePath)\n // 含 Handlebars 占位符的路径必须走动态渲染,避免复制出字面量目录\n if (rel.includes('{{') || rel.includes('}}')) {\n return false\n }\n // 跳过 .hbs 模板文件\n if (filePath.endsWith('.hbs')) {\n return false\n }\n // 跳过排除路径\n if (excludePaths && excludePaths.length > 0) {\n return !excludePaths.some(p => rel === p || rel.startsWith(`${p}${path.sep}`))\n }\n return true\n },\n })\n}\n\n/**\n * 查找目录中所有 .hbs 文件并返回相对路径\n */\nasync function findHbsFiles(dir: string): Promise<string[]> {\n if (!(await fse.pathExists(dir))) {\n return []\n }\n\n const results: string[] = []\n\n async function walk(current: string): Promise<void> {\n const entries = await fse.readdir(current, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n await walk(fullPath)\n }\n else if (entry.name.endsWith('.hbs')) {\n results.push(path.relative(dir, fullPath))\n }\n }\n }\n\n await walk(dir)\n return results\n}\n\n/**\n * 查找位于动态路径中的静态资源。\n *\n * 普通静态文件已经由 copyStaticDir 复制;这里专门补上带 Handlebars 路径片段\n * 的资源,例如 fullstack Tauri 图标目录。\n */\nasync function findRenderedStaticPathFiles(dir: string): Promise<string[]> {\n if (!(await fse.pathExists(dir))) {\n return []\n }\n\n const results: string[] = []\n\n async function walk(current: string): Promise<void> {\n const entries = await fse.readdir(current, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n await walk(fullPath)\n continue\n }\n\n const relPath = path.relative(dir, fullPath)\n if (!entry.name.endsWith('.hbs') && (relPath.includes('{{') || relPath.includes('}}'))) {\n results.push(relPath)\n }\n }\n }\n\n await walk(dir)\n return results\n}\n\n// =============================================================================\n// 构建上下文\n// =============================================================================\n\n/**\n * 根据用户选项构建模板渲染上下文\n */\nexport function buildTemplateContext(options: {\n name: string\n appType: AppType\n features: FeatureId[]\n frontends?: readonly FrontendTarget[]\n moduleConfigs?: ModuleConfigs\n packageManager: string\n}): TemplateContext {\n const featureMap: Record<string, boolean> = {}\n for (const f of options.features) {\n featureMap[f] = true\n }\n\n // fullstack 默认交付完整 mini 管理功能,不能移除其必需模块。\n if (options.appType === 'fullstack') {\n for (const feature of ['iam', 'db', 'cache', 'crypto', 'storage', 'audit']) featureMap[feature] = true\n }\n\n // 强制补全模块硬依赖,防止调用方未经过 resolveFeatureDependencies 时遗漏依赖\n // iam 依赖 reldb(用户/角色/权限持久化)和 cache(会话/OTP 缓存),以及 crypto(密码哈希)\n if (featureMap.iam) {\n featureMap.db = true\n featureMap.cache = true\n featureMap.crypto = true\n }\n // audit / scheduler / payment 依赖 reldb\n if (featureMap.audit || featureMap.scheduler || featureMap.payment) {\n featureMap.db = true\n }\n\n const isApi = options.appType === 'api'\n const isFullstack = options.appType === 'fullstack'\n const isCapacitorApp = options.appType === 'mobile-app'\n const isSvelteOnlyApp = isCapacitorApp\n const useCatalogProtocol = options.packageManager === 'pnpm'\n const hasUi = !isApi && !isFullstack\n const selectedFrontends = options.frontends ?? DEFAULT_FULLSTACK_FRONTENDS\n let haiCatalogPackages: TemplateContext['haiCatalogPackages']\n if (isFullstack) {\n haiCatalogPackages = buildFullstackCatalogPackages(selectedFrontends)\n }\n else if (isApi) {\n haiCatalogPackages = buildApiWorkspaceCatalogPackages(featureMap)\n }\n else {\n haiCatalogPackages = buildAppHaiCatalogPackages({\n featureMap,\n hasUi,\n isCapacitorApp,\n isSvelteOnlyApp,\n })\n }\n\n return {\n projectName: options.name,\n versions: VERSIONS,\n useCatalogProtocol,\n haiPackageSpecifier: useCatalogProtocol ? HAI_PACKAGE_SPECIFIER_CATALOG : HAI_PACKAGE_VERSION,\n haiPackageVersion: HAI_PACKAGE_VERSION,\n haiCatalogPackages,\n appType: options.appType,\n features: featureMap,\n moduleConfigs: options.moduleConfigs,\n hasUi,\n hasI18n: !isApi && !isFullstack,\n isCapacitorApp,\n isApiWorkspace: isApi,\n isSvelteOnlyApp,\n defaultLocale: options.moduleConfigs?.core?.defaultLocale ?? 'zh-CN',\n packageManager: options.packageManager,\n api: isApi\n ? buildApiWorkspaceTemplateContext(options.name, useCatalogProtocol)\n : undefined,\n fullstack: isFullstack\n ? buildFullstackTemplateContext(\n options.name,\n selectedFrontends,\n options.moduleConfigs,\n useCatalogProtocol,\n )\n : undefined,\n }\n}\n\nfunction buildApiWorkspaceTemplateContext(\n projectName: string,\n useCatalogProtocol = false,\n): ApiWorkspaceTemplateContext {\n const identifier = toIdentifier(projectName)\n const pascalName = toPascalIdentifier(identifier)\n\n return {\n versions: VERSIONS,\n packageSpecifiers: buildFullstackPackageSpecifiers(useCatalogProtocol),\n contractPackageName: `${projectName}-contract`,\n contractExportName: `${identifier}Contract`,\n servicePackageName: `${projectName}-service`,\n serviceAppFactoryName: `create${pascalName}App`,\n serviceProceduresFactoryName: `create${pascalName}Procedures`,\n }\n}\n\nfunction buildFullstackTemplateContext(\n projectName: string,\n frontendsInput: readonly FrontendTarget[],\n moduleConfigs?: ModuleConfigs,\n useCatalogProtocol = false,\n): FullstackTemplateContext {\n const selectedFrontends = [...new Set(frontendsInput.length > 0 ? frontendsInput : DEFAULT_FULLSTACK_FRONTENDS)]\n\n const portsConfig = moduleConfigs?.fullstack?.ports ?? {}\n const portFor = (target: ImplementedFrontendTarget): number =>\n portsConfig[target] ?? FRONTEND_PORTS_DEFAULT[target]\n\n const frontendApps = selectedFrontends\n .filter(isImplementedFrontend)\n .map(target => ({\n target,\n packageName: `${projectName}-${target}`,\n label: FRONTEND_LABELS[target],\n port: portFor(target),\n }))\n\n return {\n appName: moduleConfigs?.core?.name ?? projectName,\n versions: VERSIONS,\n packageSpecifiers: buildFullstackPackageSpecifiers(useCatalogProtocol),\n contractPackageName: `${projectName}-contract`,\n contractExportName: `${toIdentifier(projectName)}Contract`,\n servPackageName: `${projectName}-serv`,\n nativeAppIdSegment: toIdentifier(projectName).toLowerCase(),\n sharedPackageName: `${projectName}-shared`,\n selectedFrontends,\n selectedFrontendsJson: `[${selectedFrontends.map(f => `'${f}'`).join(', ')}]`,\n frontendApps,\n e2eFrontend: frontendApps[0],\n frontends: {\n web: selectedFrontends.includes('web'),\n app: selectedFrontends.includes('app'),\n miniapp: selectedFrontends.includes('miniapp'),\n desktop: selectedFrontends.includes('desktop'),\n },\n ports: {\n web: portFor('web'),\n app: portFor('app'),\n desktop: portFor('desktop'),\n },\n hasMiniapp: selectedFrontends.includes('miniapp'),\n i18n: resolveI18nContext(moduleConfigs),\n theme: resolveThemeContext(moduleConfigs),\n }\n}\n\nfunction resolveI18nContext(moduleConfigs?: ModuleConfigs): FullstackI18nContext {\n const coreLocale = moduleConfigs?.core?.defaultLocale ?? 'zh-CN'\n const baseLocale = moduleConfigs?.fullstack?.i18n?.baseLocale ?? coreLocale\n const fallbackLocale = baseLocale === 'en-US' ? 'zh-CN' : 'en-US'\n const requested = moduleConfigs?.fullstack?.i18n?.locales\n const locales = requested && requested.length > 0\n ? [...new Set(requested)]\n : [baseLocale, fallbackLocale]\n if (!locales.includes(baseLocale)) {\n locales.unshift(baseLocale)\n }\n return { baseLocale, locales }\n}\n\nfunction resolveThemeContext(moduleConfigs?: ModuleConfigs): FullstackThemeContext {\n const defaultTheme = moduleConfigs?.fullstack?.theme?.defaultTheme ?? DEFAULT_THEME_NAME\n const requested = moduleConfigs?.fullstack?.theme?.themes\n const themes = requested && requested.length > 0\n ? [...new Set(requested)]\n : [...DEFAULT_THEMES]\n if (!themes.includes(defaultTheme)) {\n themes.unshift(defaultTheme)\n }\n return { defaultTheme, themes }\n}\n\nfunction isImplementedFrontend(target: FrontendTarget): target is ImplementedFrontendTarget {\n return IMPLEMENTED_FRONTENDS.includes(target)\n}\n\nfunction toIdentifier(value: string): string {\n const words = value\n .split(NON_IDENTIFIER_CHAR_REGEX)\n .filter(Boolean)\n const camel = words\n .map((word, index) => {\n const normalized = word.toLowerCase()\n return index === 0\n ? normalized\n : `${normalized.charAt(0).toUpperCase()}${normalized.slice(1)}`\n })\n .join('')\n if (!camel)\n return 'app'\n return IDENTIFIER_START_REGEX.test(camel) ? camel : `app${camel}`\n}\n\nfunction toPascalIdentifier(value: string): string {\n if (!value)\n return 'App'\n return `${value.charAt(0).toUpperCase()}${value.slice(1)}`\n}\n\n// =============================================================================\n// 核心:生成项目\n// =============================================================================\n\n/**\n * 从模板生成项目\n *\n * 执行流程:\n * 1. 拷贝 base 静态文件\n * 2. 拷贝 apps/{appType} 路由\n * 3. 叠加选中 feature 的路由\n * 4. 渲染所有 .hbs 动态模板\n *\n * @param projectPath - 项目目标目录\n * @param context - 模板渲染上下文\n */\nexport async function generateFromTemplates(\n projectPath: string,\n context: TemplateContext,\n): Promise<void> {\n const root = getTemplatesRoot()\n const includeBaseTemplate = context.appType !== 'fullstack' && !context.isApiWorkspace\n\n // ─── ① 拷贝 base 骨架(静态文件) ───\n if (includeBaseTemplate) {\n await copyStaticDir(path.join(root, 'base'), projectPath)\n }\n else {\n // API/fullstack 自有骨架,质量门禁仍复用单包模板的同一份规则。\n await fse.copy(path.join(root, 'base', 'eslint-rules.js'), path.join(projectPath, 'eslint-rules.js'))\n }\n\n // ─── ② 拷贝 apps/{appType} 路由 ───\n // messages/ 目录仅在 hasI18n 时拷贝\n const appDir = path.join(root, 'apps', context.appType)\n if (await fse.pathExists(appDir)) {\n const appExcludes = context.hasI18n ? [] : ['messages']\n await copyStaticDir(appDir, projectPath, appExcludes)\n }\n\n // ─── ③ 叠加 feature 路由 ───\n if (!context.isApiWorkspace && context.appType !== 'fullstack') {\n for (const featureId of Object.keys(context.features)) {\n if (context.isSvelteOnlyApp) {\n continue\n }\n\n if (!context.features[featureId]) {\n continue\n }\n\n // 安全校验:featureId 只允许字母、数字和连字符,防止路径遍历\n if (!FEATURE_ID_REGEX.test(featureId)) {\n continue\n }\n\n const featureDir = path.join(root, 'features', featureId)\n if (!(await fse.pathExists(featureDir))) {\n continue\n }\n\n // 通用路由(routes/)\n const sharedDirs = FEATURE_ROUTE_DIRS[featureId] || []\n for (const dirName of sharedDirs) {\n // Capacitor SPA 无服务端运行时,跳过服务端 API 路由(routes-shared)\n if (context.isCapacitorApp && dirName === 'routes-shared') {\n continue\n }\n const routesSrc = path.join(featureDir, dirName)\n if (await fse.pathExists(routesSrc)) {\n await copyStaticDir(routesSrc, path.join(projectPath, 'src', 'routes'))\n }\n }\n\n // appType 专用路由(routes-{appType})\n const appSpecificTypes = FEATURE_APP_ROUTE_DIRS[featureId] || []\n if (appSpecificTypes.includes(context.appType)) {\n const appRouteSrc = path.join(featureDir, `routes-${context.appType}`)\n if (await fse.pathExists(appRouteSrc)) {\n await copyStaticDir(appRouteSrc, path.join(projectPath, 'src', 'routes'))\n }\n }\n }\n }\n\n // ─── ④ 渲染 .hbs 动态模板 ───\n await renderDynamicFiles(root, projectPath, context)\n\n // ─── ⑤ 拷贝 i18n 脚手架(project.inlang + messages) ───\n if (context.hasI18n) {\n const i18nDir = path.join(root, 'i18n')\n if (await fse.pathExists(i18nDir)) {\n await fse.copy(i18nDir, projectPath, { overwrite: true })\n }\n }\n\n // ─── ⑥ 确保 static 目录存在 ───\n if (includeBaseTemplate) {\n await fse.ensureDir(path.join(projectPath, 'static'))\n }\n}\n\n// =============================================================================\n// 动态模板渲染\n// =============================================================================\n\n/**\n * 渲染所有 .hbs 文件:base、apps/{appType}、以及选中 feature 的路由目录\n *\n * base / apps 的 .hbs 渲染后输出到 projectPath 根目录;\n * feature 的 .hbs 渲染后输出到 projectPath/src/routes/。\n */\nasync function renderDynamicFiles(\n templatesRoot: string,\n projectPath: string,\n context: TemplateContext,\n): Promise<void> {\n // ── base + apps/{appType} → 输出到项目根 ──\n const rootDirs = context.appType === 'fullstack' || context.isApiWorkspace\n ? [path.join(templatesRoot, 'apps', context.appType)]\n : [\n path.join(templatesRoot, 'base'),\n path.join(templatesRoot, 'apps', context.appType),\n ]\n\n for (const dir of rootDirs) {\n await renderHbsInDir(dir, projectPath, context)\n await copyRenderedStaticPathFiles(dir, projectPath, context)\n }\n\n // ── feature 路由 → 输出到 src/routes/ ──\n if (context.isApiWorkspace || context.appType === 'fullstack') {\n return\n }\n\n const routesDest = path.join(projectPath, 'src', 'routes')\n for (const featureId of Object.keys(context.features)) {\n if (context.isSvelteOnlyApp) {\n continue\n }\n\n if (!context.features[featureId]) {\n continue\n }\n\n const featureDir = path.join(templatesRoot, 'features', featureId)\n if (!(await fse.pathExists(featureDir))) {\n continue\n }\n\n // 通用路由(routes-shared / routes 等)\n const sharedDirs = FEATURE_ROUTE_DIRS[featureId] || []\n for (const dirName of sharedDirs) {\n // Capacitor SPA 无服务端运行时,跳过服务端 API 路由(routes-shared)\n if (context.isCapacitorApp && dirName === 'routes-shared') {\n continue\n }\n await renderHbsInDir(path.join(featureDir, dirName), routesDest, context)\n }\n\n // appType 专用路由(routes-{appType})\n const appSpecificTypes = FEATURE_APP_ROUTE_DIRS[featureId] || []\n if (appSpecificTypes.includes(context.appType)) {\n await renderHbsInDir(\n path.join(featureDir, `routes-${context.appType}`),\n routesDest,\n context,\n )\n }\n }\n}\n\n/**\n * 渲染指定目录下所有 .hbs 文件并输出到目标目录(去掉 .hbs 后缀)\n */\nasync function renderHbsInDir(\n dir: string,\n destRoot: string,\n context: TemplateContext,\n): Promise<void> {\n const hbsFiles = await findHbsFiles(dir)\n for (const relPath of hbsFiles) {\n const srcPath = path.join(dir, relPath)\n const outRelPathTemplate = relPath.replace(HBS_SUFFIX_REGEX, '')\n\n const template = await fse.readFile(srcPath, 'utf-8')\n const compiled = Handlebars.compile(template, { noEscape: true })\n const rendered = compiled(context)\n if (shouldSkipRenderedFile(template, rendered)) {\n continue\n }\n\n const outRelPath = renderOutputPath(outRelPathTemplate, context)\n if (!isSafeRelativePath(outRelPath)) {\n continue\n }\n\n // Capacitor SPA 跳过服务端专属文件(hooks / server init)\n if (context.isCapacitorApp && CAPACITOR_SKIPPED_SERVER_FILES.has(outRelPath.split(path.sep).join('/'))) {\n continue\n }\n\n const destPath = path.join(destRoot, outRelPath)\n const normalizedRendered = normalizeRenderedContent(rendered, outRelPath)\n\n await fse.ensureDir(path.dirname(destPath))\n await fse.writeFile(destPath, normalizedRendered, 'utf-8')\n }\n}\n\nasync function copyRenderedStaticPathFiles(\n dir: string,\n destRoot: string,\n context: TemplateContext,\n): Promise<void> {\n const staticFiles = await findRenderedStaticPathFiles(dir)\n for (const relPath of staticFiles) {\n if (!shouldCopyRenderedStaticPathFile(relPath, context)) {\n continue\n }\n\n const outRelPath = renderOutputPath(relPath, context)\n if (!isSafeRelativePath(outRelPath)) {\n continue\n }\n\n const srcPath = path.join(dir, relPath)\n const destPath = path.join(destRoot, outRelPath)\n await fse.ensureDir(path.dirname(destPath))\n await fse.copyFile(srcPath, destPath)\n }\n}\n\nfunction shouldCopyRenderedStaticPathFile(relPath: string, context: TemplateContext): boolean {\n if (context.appType !== 'fullstack' || !context.fullstack) {\n return true\n }\n\n const normalizedPath = relPath.split(path.sep).join('/')\n const frontendMatch = FULLSTACK_FRONTEND_TEMPLATE_PATH_REGEX.exec(normalizedPath)\n if (!frontendMatch) {\n return true\n }\n\n const target = frontendMatch[1] as FrontendTarget\n return Boolean(context.fullstack.frontends[target])\n}\n\nfunction normalizeRenderedContent(content: string, outRelPath: string): string {\n const normalizedLineEndings = content.replace(/\\r\\n/g, '\\n')\n const ext = path.extname(outRelPath)\n const normalized = NORMALIZED_RENDER_EXTENSIONS.has(ext)\n ? normalizedLineEndings.replace(/\\n{3,}/g, '\\n\\n')\n : normalizedLineEndings\n if (normalized.trim().length === 0) {\n return ''\n }\n return normalized.endsWith('\\n') ? normalized : `${normalized}\\n`\n}\n\nfunction shouldSkipRenderedFile(template: string, rendered: string): boolean {\n return template.includes(TEMPLATE_SKIP_IF_EMPTY_MARKER) && rendered.trim().length === 0\n}\n\nfunction renderOutputPath(pathTemplate: string, context: TemplateContext): string {\n const normalizedTemplate = pathTemplate.split(path.sep).join('/')\n return Handlebars.compile(normalizedTemplate, { noEscape: true })(context)\n}\n\nfunction isSafeRelativePath(relativePath: string): boolean {\n const normalized = path.normalize(relativePath)\n return !path.isAbsolute(normalized) && normalized !== '..' && !normalized.startsWith(`..${path.sep}`)\n}\n","/**\n * @h-ai/cli — 项目创建命令\n *\n * 基于模板的交互式项目创建:\n * 1. 交互式收集选项(appType / features / moduleConfigs)\n * 2. 拷贝 base 骨架 + appType 路由 + feature 路由\n * 3. 渲染动态模板(init.ts / hooks.server.ts / package.json)\n * 4. 生成配置文件、.env、Skill 文件\n *\n * @module cli-create\n */\n\nimport type { AppType, CreateProjectOptions, FeatureDefinition, FeatureId, FrontendTarget, ModuleConfigs, ProjectInfo } from '../cli-types.js'\nimport { Buffer } from 'node:buffer'\nimport { execFileSync, execSync } from 'node:child_process'\nimport { randomBytes } from 'node:crypto'\nimport path from 'node:path'\nimport process from 'node:process'\nimport chalk from 'chalk'\nimport fse from 'fs-extra'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { cliM } from '../cli-i18n.js'\nimport { detectPackageManager, fileExists, formatPromptDescription, writeCliError, writeCliMessage, writeFile } from '../cli-utils.js'\nimport { buildTemplateContext, generateFromTemplates } from './cli-template-engine.js'\n\n// =============================================================================\n// 应用类型定义\n// =============================================================================\n\n/** Git 远程地址校验 */\nconst RE_HTTPS_URL = /^https:\\/\\/.+/\nconst RE_GIT_SSH_URL = /^git@.+:.+/\n\n/**\n * 应用类型定义\n */\nconst APP_TYPES: Record<AppType, { name: string, description: string, defaultFeatures: FeatureId[] }> = {\n 'admin': {\n name: '管理后台',\n description: '企业级管理系统,含 IAM、数据库、完整 UI',\n defaultFeatures: ['iam', 'db', 'cache', 'crypto'],\n },\n 'website': {\n name: '企业官网',\n description: 'SSR/SSG 企业官网,SEO 友好、响应式布局',\n defaultFeatures: ['db', 'cache'],\n },\n 'h5': {\n name: 'H5 应用',\n description: '移动端 H5 应用,触摸优化、PWA 支持',\n defaultFeatures: ['db', 'cache'],\n },\n 'api': {\n name: 'API 服务',\n description: 'typed API workspace,含 contract + service 双工程、无 UI',\n defaultFeatures: ['db', 'cache'],\n },\n 'mobile-app': {\n name: '移动应用',\n description: '移动端应用(Capacitor + Svelte 5 + Vite),可打包为 Android/iOS',\n defaultFeatures: ['api-client', 'capacitor'],\n },\n 'fullstack': {\n name: '前后端分离工程',\n description: '多端 mini 管理系统,包含用户、角色、审计、个人设置与双向传输加密',\n defaultFeatures: ['iam', 'db', 'cache', 'crypto', 'storage', 'audit'],\n },\n}\n\nconst FRONTEND_TARGETS: Record<FrontendTarget, { name: string, description: string, implemented: boolean }> = {\n web: { name: 'Web', description: '浏览器 Web 应用', implemented: true },\n app: { name: 'App', description: '移动端 Capacitor App / H5 前端', implemented: true },\n miniapp: { name: '小程序', description: '预留目标,当前只生成说明占位', implemented: false },\n desktop: { name: '桌面端', description: 'Tauri 桌面端前端工程', implemented: true },\n}\n\nconst DEFAULT_FULLSTACK_FRONTENDS: FrontendTarget[] = ['web', 'app', 'desktop']\n\n// =============================================================================\n// 功能定义\n// =============================================================================\n\n/**\n * 功能定义\n */\nconst FEATURES: Record<string, FeatureDefinition> = {\n 'iam': {\n id: 'iam',\n name: '身份与访问管理',\n description: 'Session/JWT 会话管理、RBAC 权限控制',\n packages: ['@h-ai/iam'],\n dependencies: ['crypto', 'db', 'cache'],\n },\n 'db': {\n id: 'db',\n name: '数据库',\n description: '多数据库支持 (SQLite/PostgreSQL/MySQL)',\n packages: ['@h-ai/reldb'],\n },\n 'cache': {\n id: 'cache',\n name: '缓存',\n description: 'Redis / 内存缓存',\n packages: ['@h-ai/cache'],\n },\n 'ai': {\n id: 'ai',\n name: 'AI 集成',\n description: 'LLM 适配器、MCP 协议、技能系统、流式响应',\n packages: ['@h-ai/ai'],\n },\n 'storage': {\n id: 'storage',\n name: '文件存储',\n description: '本地存储、S3/OSS/COS 云存储',\n packages: ['@h-ai/storage'],\n },\n 'crypto': {\n id: 'crypto',\n name: '加密模块',\n description: '国密 SM2/SM3/SM4、Argon2 密码哈希',\n packages: ['@h-ai/crypto'],\n },\n 'audit': {\n id: 'audit',\n name: '审计日志',\n description: '操作审计、安全追踪',\n packages: ['@h-ai/audit'],\n dependencies: ['db'],\n },\n 'reach': {\n id: 'reach',\n name: '触达服务',\n description: '邮件、短信、微信等消息触达',\n packages: ['@h-ai/reach'],\n },\n 'payment': {\n id: 'payment',\n name: '统一支付',\n description: '微信支付、支付宝、Stripe 统一接入',\n packages: ['@h-ai/payment'],\n dependencies: ['db'],\n },\n 'vecdb': {\n id: 'vecdb',\n name: '向量数据库',\n description: '向量检索与相似度搜索(LanceDB / pgvector / Qdrant)',\n packages: ['@h-ai/vecdb'],\n },\n 'datapipe': {\n id: 'datapipe',\n name: '数据处理管道',\n description: '文本清洗、分块与可组合处理流水线',\n packages: ['@h-ai/datapipe'],\n },\n 'scheduler': {\n id: 'scheduler',\n name: '任务调度',\n description: 'Cron 任务注册、执行与日志追踪',\n packages: ['@h-ai/scheduler'],\n dependencies: ['db'],\n },\n 'deploy': {\n id: 'deploy',\n name: '自动化部署',\n description: '统一部署编排与多平台发布支持',\n packages: ['@h-ai/deploy'],\n },\n 'api-client': {\n id: 'api-client',\n name: 'HTTP 客户端',\n description: '统一 API 调用、错误处理与流式请求支持',\n packages: ['@h-ai/api-client'],\n },\n 'capacitor': {\n id: 'capacitor',\n name: '移动端能力',\n description: 'Capacitor 原生桥接能力(偏移动应用)',\n packages: ['@h-ai/capacitor'],\n },\n}\n\n/**\n * 可选择的功能列表\n */\nconst SELECTABLE_FEATURES: FeatureId[] = [\n 'iam',\n 'db',\n 'cache',\n 'ai',\n 'storage',\n 'crypto',\n 'audit',\n 'reach',\n 'payment',\n 'vecdb',\n 'datapipe',\n 'scheduler',\n 'deploy',\n 'api-client',\n 'capacitor',\n]\n\nconst PROJECT_NAME_REGEX = /^[a-z0-9-]+$/\n\n// =============================================================================\n// 项目模板定义\n// =============================================================================\n\nconst PROJECT_TEMPLATES = {\n minimal: {\n name: 'minimal',\n description: '最小模板 — 仅核心功能',\n features: [] as FeatureId[],\n },\n default: {\n name: 'default',\n description: '标准模板 — IAM + 数据库 + 缓存',\n features: ['iam', 'db', 'cache', 'crypto'] as FeatureId[],\n },\n full: {\n name: 'full',\n description: '完整模板 — 所有功能',\n features: [\n 'iam',\n 'db',\n 'cache',\n 'crypto',\n 'ai',\n 'storage',\n 'audit',\n 'reach',\n 'payment',\n 'vecdb',\n 'datapipe',\n 'scheduler',\n 'deploy',\n 'api-client',\n 'capacitor',\n ] as FeatureId[],\n },\n custom: {\n name: 'custom',\n description: '自定义 — 选择需要的功能',\n features: [] as FeatureId[],\n },\n}\n\n// =============================================================================\n// 创建项目(主入口)\n// =============================================================================\n\n/**\n * 创建项目\n */\nexport async function createProject(options: CreateProjectOptions): Promise<void> {\n const spinner = ora()\n\n try {\n // 交互式获取选项\n const resolvedOptions = await resolveOptions(options)\n\n // 安全校验:项目名必须仅含小写字母、数字和连字符,防止路径遍历\n if (!PROJECT_NAME_REGEX.test(resolvedOptions.name)) {\n writeCliError(chalk.red(`项目名称不合法: \"${resolvedOptions.name}\",只能包含小写字母、数字和连字符`))\n return\n }\n\n const projectPath = path.resolve(resolvedOptions.cwd ?? '.', resolvedOptions.name)\n\n // 检查目录是否存在\n if (await fileExists(projectPath)) {\n const { overwrite } = await prompts({\n type: 'confirm',\n name: 'overwrite',\n message: `目录 ${resolvedOptions.name} 已存在,是否覆盖?`,\n initial: false,\n })\n\n if (!overwrite) {\n writeCliMessage(chalk.yellow('已取消'))\n return\n }\n\n await fse.remove(projectPath)\n }\n\n spinner.start('创建项目目录...')\n await fse.ensureDir(projectPath)\n spinner.succeed()\n\n // ─── 基于模板生成项目文件 ───\n spinner.start('生成项目文件...')\n\n const context = buildTemplateContext({\n name: resolvedOptions.name,\n appType: resolvedOptions.appType,\n features: resolvedOptions.features,\n frontends: resolvedOptions.frontends,\n moduleConfigs: resolvedOptions.moduleConfigs,\n packageManager: resolvedOptions.packageManager!,\n })\n\n // 拷贝模板 + 渲染动态文件\n await generateFromTemplates(projectPath, context)\n\n {\n // 生成配置文件(config/*.yml)\n const { generateConfigFile, generateEnvExample } = await import('./cli-config-templates.js')\n const configs = resolvedOptions.moduleConfigs\n const isApiWorkspace = resolvedOptions.appType === 'api'\n const isFullstack = resolvedOptions.appType === 'fullstack'\n const configDir = isApiWorkspace\n ? path.join(projectPath, 'apps', `${resolvedOptions.name}-service`, 'config')\n : isFullstack\n ? path.join(projectPath, 'packages', `${resolvedOptions.name}-serv`, 'config')\n : path.join(projectPath, 'config')\n const envExamplePath = isApiWorkspace\n ? path.join(projectPath, 'apps', `${resolvedOptions.name}-service`, '.env.example')\n : path.join(projectPath, '.env.example')\n\n for (const featureId of resolvedOptions.features) {\n const configKey = getFeatureConfigKey(featureId)\n if (configKey) {\n const configPath = path.join(configDir, `_${configKey}.yml`)\n // fullstack 已用模块配置 helper 渲染完整配置,不能再覆盖 Reach 模板等应用默认值。\n if (isFullstack && await fse.pathExists(configPath))\n continue\n await writeFile(configPath, generateConfigFile(configKey, configs))\n }\n }\n\n if (!isApiWorkspace && !isFullstack) {\n // 始终生成 core 配置\n await writeFile(\n path.join(configDir, '_core.yml'),\n generateConfigFile('core', configs),\n )\n }\n\n const envExample = isApiWorkspace\n ? `${generateEnvExample(resolvedOptions.features, configs)}\\n# =============================================================================\\n# Service Runtime\\n# =============================================================================\\nPORT=3000\\n`\n : isFullstack\n ? `${generateEnvExample(resolvedOptions.features, configs, true)}\\n# First-start administrator password. The CLI generates a random value in .env.\\nHAI_ADMIN_DEFAULT_PASSWORD=\\n\\n# Local development API. Use your public API origin for deployment/native clients.\\nPUBLIC_API_BASE=http://127.0.0.1:3000\\n`\n : generateEnvExample(resolvedOptions.features, configs)\n\n await writeFile(envExamplePath, envExample)\n if (isFullstack) {\n // 每个项目使用独立随机密码,保证四类字符;真实凭据只写入被忽略的本地文件。\n const password = `Aa1!${randomBytes(24).toString('base64url')}`\n await fse.writeFile(path.join(projectPath, '.env'), envExample.replace('HAI_ADMIN_DEFAULT_PASSWORD=\\n', `HAI_ADMIN_DEFAULT_PASSWORD=${password}\\n`), { mode: 0o600 })\n }\n }\n\n // 生成 Skill 文件\n const { generateSkillFiles } = await import('./cli-skill-templates.js')\n await generateSkillFiles(\n projectPath,\n resolvedOptions.features,\n resolvedOptions.appType,\n resolvedOptions.name,\n )\n\n // 生成 README\n const appTypeLabel = APP_TYPES[resolvedOptions.appType].name\n const readmeContent = resolvedOptions.appType === 'fullstack'\n ? generateFullstackReadme(resolvedOptions.name, resolvedOptions.packageManager!, resolvedOptions.frontends)\n : resolvedOptions.appType === 'api'\n ? generateApiWorkspaceReadme(resolvedOptions.name, resolvedOptions.packageManager!)\n : generateReadme(resolvedOptions.name, appTypeLabel, resolvedOptions.packageManager!, resolvedOptions.appType)\n await writeFile(\n path.join(projectPath, 'README.md'),\n readmeContent,\n )\n\n spinner.succeed()\n\n // 初始化 Git\n if (resolvedOptions.git) {\n spinner.start('初始化 Git 仓库...')\n execSync('git init', { cwd: projectPath, stdio: 'ignore' })\n if (resolvedOptions.gitRemote) {\n // 使用 execFileSync + 数组参数,避免 shell 注入\n // 同时在非交互模式下补充校验(交互模式在 prompts.validate 中已校验)\n const gitRemote = resolvedOptions.gitRemote\n if (!RE_HTTPS_URL.test(gitRemote) && !RE_GIT_SSH_URL.test(gitRemote)) {\n spinner.fail()\n throw new Error(`Invalid gitRemote URL: ${gitRemote}`)\n }\n execFileSync('git', ['remote', 'add', 'origin', gitRemote], { cwd: projectPath, stdio: 'ignore' })\n }\n spinner.succeed()\n }\n\n // 安装依赖\n if (resolvedOptions.install) {\n spinner.start(`安装依赖 (${resolvedOptions.packageManager})...`)\n installDependencies(projectPath, resolvedOptions.packageManager!)\n spinner.succeed()\n }\n\n // 完成提示\n printCompletionMessage(resolvedOptions)\n }\n catch (error) {\n spinner.fail()\n writeCliError(chalk.red(cliM('cli_createFailed')), error)\n throw error\n }\n}\n\n// =============================================================================\n// 交互式选项解析\n// =============================================================================\n\n/**\n * 解析选项(交互式)\n */\nasync function resolveOptions(options: CreateProjectOptions): Promise<Required<CreateProjectOptions>> {\n const useDefaults = options.yes ?? false\n\n writeCliMessage('')\n writeCliMessage(chalk.bold.cyan(' 🚀 hai Agent Framework'))\n writeCliMessage(chalk.gray(' AI-Native · Configuration-Driven · Security-First'))\n writeCliMessage('')\n\n const onCancel = () => {\n writeCliMessage(chalk.red('\\n已取消'))\n process.exit(1)\n }\n\n // 项目名称(逐条询问,避免 prompts 数组模式在 Windows 终端重复渲染)\n let projectName = options.name\n if (!projectName && useDefaults) {\n projectName = 'my-app'\n }\n else if (!projectName) {\n const { name } = await prompts({\n type: 'text',\n name: 'name',\n message: '项目名称:',\n initial: 'my-app',\n validate: (value: string) => {\n if (!value.trim())\n return '项目名称不能为空'\n if (!PROJECT_NAME_REGEX.test(value))\n return '项目名称只能包含小写字母、数字和连字符'\n return true\n },\n }, { onCancel })\n projectName = name\n }\n\n // 应用类型\n let resolvedAppType = options.appType\n if (!resolvedAppType && useDefaults) {\n resolvedAppType = 'admin'\n }\n else if (!resolvedAppType) {\n const { appType } = await prompts({\n type: 'select',\n name: 'appType',\n message: '应用类型:',\n hint: cliM('cli_selectHint'),\n choices: Object.entries(APP_TYPES).map(([key, t]) => ({\n title: t.name,\n description: formatPromptDescription(t.description),\n value: key,\n })),\n initial: 0,\n }, { onCancel })\n resolvedAppType = appType\n }\n\n const selectedAppType = (resolvedAppType || 'admin') as AppType\n\n const selectedFrontends = selectedAppType === 'fullstack'\n ? await resolveFrontendTargets(options.frontends, useDefaults, onCancel)\n : []\n\n // 模板选择\n let selectedTemplate = options.template\n if (selectedAppType === 'fullstack') {\n selectedTemplate = selectedTemplate ?? 'custom'\n }\n else if (!selectedTemplate) {\n if (useDefaults) {\n selectedTemplate = 'default'\n }\n else {\n const { template } = await prompts({\n type: 'select',\n name: 'template',\n message: '选择模板:',\n hint: cliM('cli_selectHint'),\n choices: Object.values(PROJECT_TEMPLATES).map(t => ({\n title: t.name,\n description: formatPromptDescription(t.description),\n value: t.name,\n })),\n initial: 1,\n }, { onCancel })\n selectedTemplate = template\n }\n }\n\n // 功能选择\n let selectedFeatures: FeatureId[] = []\n const appTypeDefaults = APP_TYPES[selectedAppType].defaultFeatures\n\n if (selectedAppType === 'fullstack') {\n selectedFeatures = resolveFeatureDependencies(appTypeDefaults)\n }\n else if (selectedTemplate === 'custom' && !options.features && useDefaults) {\n selectedFeatures = resolveFeatureDependencies(appTypeDefaults)\n }\n else if (selectedTemplate === 'custom' && !options.features) {\n const featureChoices = SELECTABLE_FEATURES.map(id => ({\n title: FEATURES[id].name,\n description: formatPromptDescription(FEATURES[id].description),\n value: id,\n selected: appTypeDefaults.includes(id),\n }))\n\n const { features } = await prompts({\n type: 'multiselect',\n name: 'features',\n message: cliM('cli_featuresPrompt'),\n choices: featureChoices,\n hint: cliM('cli_multiselectHint'),\n instructions: false,\n }, { onCancel })\n\n selectedFeatures = features || []\n selectedFeatures = resolveFeatureDependencies(selectedFeatures)\n }\n else if (selectedTemplate === 'custom' && options.features) {\n selectedFeatures = resolveFeatureDependencies(options.features)\n }\n else {\n const templateFeatures = PROJECT_TEMPLATES[selectedTemplate as keyof typeof PROJECT_TEMPLATES]?.features || []\n const merged = new Set([...templateFeatures, ...appTypeDefaults])\n selectedFeatures = resolveFeatureDependencies(Array.from(merged))\n }\n\n // 模块配置\n const moduleConfigs = selectedAppType === 'fullstack'\n ? { ...buildDefaultModuleConfigs(selectedFeatures, projectName!), ...options.moduleConfigs }\n : options.moduleConfigs ?? (useDefaults\n ? buildDefaultModuleConfigs(selectedFeatures, projectName!)\n : await promptModuleConfigs(selectedFeatures, projectName!))\n\n // 示例代码\n let addExamples = options.examples\n if (addExamples === undefined && useDefaults) {\n addExamples = true\n }\n else if (addExamples === undefined) {\n const { examples } = await prompts({\n type: 'confirm',\n name: 'examples',\n message: '是否添加示例代码?',\n initial: true,\n }, { onCancel })\n addExamples = examples\n }\n\n // 包管理器\n const detected = await detectPackageManager(options.cwd ?? '.')\n let packageManager = selectedAppType === 'fullstack' || selectedAppType === 'api'\n ? 'pnpm'\n : options.packageManager\n if (!packageManager && useDefaults) {\n packageManager = detected\n }\n if (!packageManager) {\n const { pm } = await prompts({\n type: 'select',\n name: 'pm',\n message: '包管理器:',\n choices: [\n { title: 'pnpm (推荐)', value: 'pnpm' },\n { title: 'npm', value: 'npm' },\n { title: 'yarn', value: 'yarn' },\n ],\n initial: detected === 'pnpm' ? 0 : detected === 'npm' ? 1 : 2,\n }, { onCancel })\n packageManager = pm\n }\n\n // 安装依赖\n let install = options.install\n if (install === undefined && useDefaults) {\n install = true\n }\n else if (install === undefined) {\n const { doInstall } = await prompts({\n type: 'confirm',\n name: 'doInstall',\n message: '是否安装依赖?',\n initial: true,\n }, { onCancel })\n install = doInstall\n }\n\n // Git\n let git = options.git\n if (git === undefined && useDefaults) {\n git = true\n }\n else if (git === undefined) {\n const { initGit } = await prompts({\n type: 'confirm',\n name: 'initGit',\n message: '是否初始化 Git?',\n initial: true,\n }, { onCancel })\n git = initGit\n }\n\n // Git 远程仓库地址\n let gitRemote = options.gitRemote\n if (git && gitRemote === undefined && useDefaults) {\n gitRemote = ''\n }\n else if (git && gitRemote === undefined) {\n const { remote } = await prompts({\n type: 'text',\n name: 'remote',\n message: 'Git 仓库地址 (可选,回车跳过):',\n initial: '',\n validate: (value: string) => {\n if (!value.trim())\n return true\n if (RE_HTTPS_URL.test(value) || RE_GIT_SSH_URL.test(value))\n return true\n return '请输入合法的 Git 仓库地址 (https://... 或 git@...:...)'\n },\n }, { onCancel })\n gitRemote = remote?.trim() || ''\n }\n\n return {\n name: projectName!,\n appType: selectedAppType,\n frontends: selectedFrontends,\n template: (selectedTemplate ?? 'default') as 'default' | 'minimal' | 'full' | 'custom',\n features: selectedFeatures,\n moduleConfigs,\n examples: addExamples ?? true,\n install: install ?? true,\n packageManager: packageManager || 'pnpm',\n git: git ?? true,\n gitRemote: gitRemote ?? '',\n yes: useDefaults,\n verbose: options.verbose ?? false,\n cwd: options.cwd ?? '.',\n }\n}\n\nfunction buildDefaultModuleConfigs(features: FeatureId[], projectName: string): ModuleConfigs {\n const configs: ModuleConfigs = {\n core: { name: projectName, defaultLocale: 'zh-CN' },\n }\n\n if (features.includes('db')) {\n configs.db = { type: 'sqlite', database: './data/app.db' }\n }\n if (features.includes('cache')) {\n configs.cache = { type: 'memory' }\n }\n if (features.includes('iam')) {\n configs.iam = { loginPassword: true, loginOtp: false }\n }\n if (features.includes('storage')) {\n configs.storage = { type: 'local', localPath: './data/uploads' }\n }\n if (features.includes('ai')) {\n configs.ai = { defaultProvider: 'openai', model: 'gpt-4o-mini' }\n }\n\n return configs\n}\n\nasync function resolveFrontendTargets(\n frontends: FrontendTarget[] | undefined,\n useDefaults: boolean,\n onCancel: () => void,\n): Promise<FrontendTarget[]> {\n if (frontends && frontends.length > 0) {\n return normalizeFrontendTargets(frontends)\n }\n if (useDefaults) {\n return DEFAULT_FULLSTACK_FRONTENDS\n }\n\n const { selectedFrontends } = await prompts({\n type: 'multiselect',\n name: 'selectedFrontends',\n message: cliM('cli_frontendsPrompt'),\n choices: Object.entries(FRONTEND_TARGETS).map(([id, target]) => ({\n title: target.name,\n description: formatPromptDescription(target.description),\n value: id,\n selected: DEFAULT_FULLSTACK_FRONTENDS.includes(id as FrontendTarget),\n })),\n hint: cliM('cli_multiselectHint'),\n instructions: false,\n }, { onCancel })\n\n return normalizeFrontendTargets(selectedFrontends ?? DEFAULT_FULLSTACK_FRONTENDS)\n}\n\nfunction normalizeFrontendTargets(frontends: FrontendTarget[]): FrontendTarget[] {\n const validTargets = new Set(Object.keys(FRONTEND_TARGETS))\n const result = frontends.filter(target => validTargets.has(target))\n return [...new Set(result.length > 0 ? result : DEFAULT_FULLSTACK_FRONTENDS)]\n}\n\n// =============================================================================\n// 功能依赖解析\n// =============================================================================\n\n/**\n * 解析功能依赖(自动补全传递依赖,循环直至收敛)\n */\nfunction resolveFeatureDependencies(features: FeatureId[]): FeatureId[] {\n const result = new Set(features)\n\n let changed = true\n while (changed) {\n changed = false\n for (const featureId of result) {\n const feature = FEATURES[featureId]\n if (feature?.dependencies) {\n for (const dep of feature.dependencies) {\n if (!result.has(dep)) {\n result.add(dep)\n changed = true\n }\n }\n }\n }\n }\n\n return Array.from(result)\n}\n\n// =============================================================================\n// 模块配置交互\n// =============================================================================\n\n/**\n * 交互式收集模块配置\n */\nasync function promptModuleConfigs(features: FeatureId[], projectName: string): Promise<ModuleConfigs> {\n const configs: ModuleConfigs = {}\n const onCancel = () => {\n writeCliMessage(chalk.red('\\n已取消'))\n process.exit(1)\n }\n\n writeCliMessage('')\n writeCliMessage(chalk.bold(' ⚙ 模块配置'))\n writeCliMessage(chalk.gray(' 设置关键配置项(回车使用默认值)'))\n writeCliMessage('')\n\n // core 配置(始终收集)\n configs.core = await promptCoreConfig(projectName, onCancel)\n\n if (features.includes('db')) {\n configs.db = await promptDbConfig(projectName, onCancel)\n }\n if (features.includes('cache')) {\n configs.cache = await promptCacheConfig(onCancel)\n }\n if (features.includes('iam')) {\n configs.iam = await promptIamConfig(onCancel)\n }\n if (features.includes('storage')) {\n configs.storage = await promptStorageConfig(onCancel)\n }\n if (features.includes('ai')) {\n configs.ai = await promptAiConfig(onCancel)\n }\n\n return configs\n}\n\n/**\n * 收集 core 模块配置\n */\nasync function promptCoreConfig(projectName: string, onCancel: () => void): Promise<ModuleConfigs['core']> {\n writeCliMessage(chalk.cyan(' [core] 应用基础配置'))\n const { defaultLocale } = await prompts({\n type: 'select',\n name: 'defaultLocale',\n message: '默认语言:',\n choices: [\n { title: '中文 (zh-CN)', value: 'zh-CN' },\n { title: 'English (en-US)', value: 'en-US' },\n ],\n initial: 0,\n }, { onCancel })\n return { name: projectName, defaultLocale }\n}\n\n/**\n * 收集 db 模块配置\n */\nasync function promptDbConfig(projectName: string, onCancel: () => void): Promise<ModuleConfigs['db']> {\n writeCliMessage(chalk.cyan(' [db] 数据库配置'))\n const { type } = await prompts({\n type: 'select',\n name: 'type',\n message: '数据库类型:',\n choices: [\n { title: 'SQLite (零配置,适合开发)', value: 'sqlite' },\n { title: 'PostgreSQL', value: 'postgresql' },\n { title: 'MySQL', value: 'mysql' },\n ],\n initial: 0,\n }, { onCancel })\n\n if (type === 'sqlite') {\n const { database } = await prompts({\n type: 'text',\n name: 'database',\n message: 'SQLite 数据库路径:',\n initial: './data/app.db',\n }, { onCancel })\n return { type, database }\n }\n\n const answers = await prompts([\n { type: 'text', name: 'host', message: `${type === 'postgresql' ? 'PostgreSQL' : 'MySQL'} 主机:`, initial: 'localhost' },\n { type: 'number', name: 'port', message: '端口:', initial: type === 'postgresql' ? 5432 : 3306 },\n { type: 'text', name: 'database', message: '数据库名称:', initial: projectName },\n ], { onCancel })\n\n return { type, host: answers.host, port: answers.port, database: answers.database }\n}\n\n/**\n * 收集 cache 模块配置\n */\nasync function promptCacheConfig(onCancel: () => void): Promise<ModuleConfigs['cache']> {\n writeCliMessage(chalk.cyan(' [cache] 缓存配置'))\n const { type } = await prompts({\n type: 'select',\n name: 'type',\n message: '缓存类型:',\n choices: [\n { title: '内存缓存 (零配置,适合开发)', value: 'memory' },\n { title: 'Redis', value: 'redis' },\n ],\n initial: 0,\n }, { onCancel })\n\n if (type === 'memory')\n return { type }\n\n const answers = await prompts([\n { type: 'text', name: 'host', message: 'Redis 主机:', initial: 'localhost' },\n { type: 'number', name: 'port', message: 'Redis 端口:', initial: 6379 },\n ], { onCancel })\n\n return { type, host: answers.host, port: answers.port }\n}\n\n/**\n * 收集 iam 模块配置\n */\nasync function promptIamConfig(onCancel: () => void): Promise<ModuleConfigs['iam']> {\n writeCliMessage(chalk.cyan(' [iam] 认证授权配置'))\n const answers = await prompts([\n { type: 'confirm', name: 'loginPassword', message: '启用密码登录?', initial: true },\n { type: 'confirm', name: 'loginOtp', message: '启用 OTP 验证码登录?', initial: false },\n ], { onCancel })\n return { loginPassword: answers.loginPassword, loginOtp: answers.loginOtp }\n}\n\n/**\n * 收集 storage 模块配置\n */\nasync function promptStorageConfig(onCancel: () => void): Promise<ModuleConfigs['storage']> {\n writeCliMessage(chalk.cyan(' [storage] 文件存储配置'))\n const { type } = await prompts({\n type: 'select',\n name: 'type',\n message: '存储类型:',\n choices: [\n { title: '本地存储 (零配置,适合开发)', value: 'local' },\n { title: 'S3 / MinIO / OSS', value: 's3' },\n ],\n initial: 0,\n }, { onCancel })\n\n if (type === 'local') {\n const { localPath } = await prompts({\n type: 'text',\n name: 'localPath',\n message: '存储路径:',\n initial: './data/uploads',\n }, { onCancel })\n return { type, localPath }\n }\n\n return { type }\n}\n\n/**\n * 收集 ai 模块配置\n */\nasync function promptAiConfig(onCancel: () => void): Promise<ModuleConfigs['ai']> {\n writeCliMessage(chalk.cyan(' [ai] AI 集成配置'))\n const { defaultProvider } = await prompts({\n type: 'select',\n name: 'defaultProvider',\n message: 'AI Provider:',\n choices: [\n { title: 'OpenAI', value: 'openai' },\n { title: 'Anthropic (Claude)', value: 'anthropic' },\n { title: '其他 (OpenAI 兼容)', value: 'custom' },\n ],\n initial: 0,\n }, { onCancel })\n\n const defaultModel = defaultProvider === 'openai'\n ? 'gpt-4o-mini'\n : defaultProvider === 'anthropic'\n ? 'claude-3-sonnet'\n : ''\n\n const { model } = await prompts({\n type: 'text',\n name: 'model',\n message: '默认模型:',\n initial: defaultModel,\n }, { onCancel })\n\n return { defaultProvider, model }\n}\n\n// =============================================================================\n// 工具函数\n// =============================================================================\n\n/**\n * 获取功能对应的配置 key\n */\nfunction getFeatureConfigKey(featureId: FeatureId): string | null {\n const map: Record<string, string> = {\n db: 'db',\n cache: 'cache',\n iam: 'iam',\n storage: 'storage',\n ai: 'ai',\n deploy: 'deploy',\n vecdb: 'vecdb',\n reach: 'reach',\n scheduler: 'scheduler',\n audit: 'audit',\n payment: 'payment',\n }\n return map[featureId] ?? null\n}\n\n/**\n * 获取安装命令\n */\nfunction getInstallCommand(pm: 'pnpm' | 'npm' | 'yarn'): string {\n switch (pm) {\n case 'pnpm': return 'pnpm install'\n case 'yarn': return 'yarn'\n default: return 'npm install'\n }\n}\n\n/**\n * 生成运行 package.json 脚本的命令\n *\n * npm 需要 `npm run <script>`(lifecycle 脚本除外),pnpm / yarn 可直接 `<pm> <script>`。\n */\nfunction getRunCommand(pm: 'pnpm' | 'npm' | 'yarn', script: string): string {\n return pm === 'npm' ? `npm run ${script}` : `${pm} ${script}`\n}\n\nfunction installDependencies(projectPath: string, pm: 'pnpm' | 'npm' | 'yarn'): void {\n const installCmd = getInstallCommand(pm)\n try {\n execSync(installCmd, {\n cwd: projectPath,\n stdio: 'pipe',\n encoding: 'utf-8',\n maxBuffer: 10 * 1024 * 1024,\n })\n }\n catch (error) {\n const details = formatCommandFailure(installCmd, error)\n throw new Error(`${cliM('cli_installFailed', { params: { pm } })}\\n${details}`)\n }\n}\n\ninterface CommandFailureLike {\n stdout?: unknown\n stderr?: unknown\n status?: number | null\n signal?: string | null\n}\n\nfunction formatCommandFailure(command: string, error: unknown): string {\n if (!error || typeof error !== 'object') {\n return cliM('cli_commandLabel', { params: { command } })\n }\n\n const failure = error as CommandFailureLike\n const stdout = normalizeChildOutput(failure.stdout)\n const stderr = normalizeChildOutput(failure.stderr)\n const status = typeof failure.status === 'number' ? cliM('cli_exitCode', { params: { code: failure.status } }) : ''\n const signal = typeof failure.signal === 'string' ? cliM('cli_signal', { params: { signal: failure.signal } }) : ''\n const output = [\n cliM('cli_commandLabel', { params: { command } }),\n status,\n signal,\n stderr ? `stderr:\\n${stderr}` : '',\n stdout ? `stdout:\\n${stdout}` : '',\n ].filter(Boolean)\n\n return output.join('\\n\\n')\n}\n\nfunction normalizeChildOutput(output: unknown): string {\n if (typeof output === 'string') {\n return output.trim()\n }\n if (Buffer.isBuffer(output)) {\n return output.toString('utf-8').trim()\n }\n return ''\n}\n\n/**\n * 生成 README\n */\n/** 生成各类项目共用的 AI 开发入口说明。 */\nfunction generateAiDevelopmentReadme(): string {\n return `## AI 辅助开发\n\n从本项目根目录打开所用编码工具,先读取 [AGENTS.md](./AGENTS.md)。Claude Code 通过 [CLAUDE.md](./CLAUDE.md) 加载项目规则;GitHub Copilot 使用 [.github/copilot-instructions.md](./.github/copilot-instructions.md),OpenCode 使用 AGENTS.md 和 [opencode.json](./opencode.json)。\n\nCodex、Cursor、Copilot、OpenCode 从 .agents/skills/ 发现共享技能;Claude Code 通过 CLAUDE.md 引用 AGENTS.md,并按项目指引读取 .agents/skills/ 的同一份正文。需求或设计文档在生成前使用 [文档审查 Skill](./.agents/skills/hai-spec-review/SKILL.md) 严格检查完备性、歧义、技术正确性和命名一致性,问题解决后再生成。普通新增、修改、修复任务使用 [应用开发 Skill](./.agents/skills/hai-app-create/SKILL.md) 和 [开发规范与框架能力路由](./.agents/skills/hai-app-create/development.md);具体模块再按需读取,不能把 Skill 已交付当成依赖已安装或配置已启用。\n\n根据文档规划、实施或返修时,使用 [文档实施 Skill](./.agents/skills/hai-spec-implement/SKILL.md):按可验收功能拆分,维护 docs/task-list.md 与 docs/tasks/ 记录,每项在独立分支走 TDD、验证与本地合并;返修沿用原任务与分支并追加证据。仅规划不开始实现,指定任务先核验依赖。\n\n优先复用适用的 hai-framework 公开 API 与已有业务实现。完成时说明复用的能力、相关能力未采用的原因,以及安全边界和类型、配置、文案、调用方的同步情况。质量验证按当前 package.json 执行 typecheck → lint → build → test;UI、路由与端到端流程另运行 test:e2e,未运行项说明原因。安全与质量规则既要按规范审查,也要运行门禁验证。\n\n已有 hai 项目可运行 hai init 补齐缺失的 AI 支持文件与参考资源;已有 AGENTS.md、Skill 和自定义规则会保留,升级时需将上述普通开发入口与规范显式合并到旧指引。\n\n`\n}\n\nfunction generateReadme(name: string, appTypeLabel: string, pm: 'pnpm' | 'npm' | 'yarn', appType: AppType): string {\n const install = getInstallCommand(pm)\n const isStaticImage = appType === 'mobile-app'\n const containerPort = isStaticImage ? 8080 : 3000\n const runtimeOptions = isStaticImage\n ? ''\n : ` --env-file .env --mount type=bind,source=/absolute/path/to/config,target=/app/config,readonly --mount type=volume,source=${name}-data,target=/app/data`\n const embeddedDataBuild = isStaticImage\n ? ''\n : `\n# 带 data/ 初始数据构建(二选一)\n${getRunCommand(pm, 'docker:build:data')}\n${getRunCommand(pm, 'podman:build:data')}`\n const runtimeNotes = isStaticImage\n ? '- 该模板生成静态 Web 镜像,不包含可写数据库目录。'\n : `以上三个运行时参数均可按需删除:\n\n| 参数 | 用途 | 可选性 |\n| --- | --- | --- |\n| \\`--env-file .env\\` | 批量传入环境变量;也可改用多个 \\`-e NAME=value\\`。 | 可选;删除后使用镜像和 YAML 默认值。 |\n| \\`--mount type=bind,...target=/app/config,readonly\\` | 用宿主机配置目录覆盖镜像内 \\`/app/config\\`;必须把 \\`source\\` 改成真实绝对路径,\\`readonly\\` 防止容器修改配置。 | 可选;删除后使用镜像自带配置。 |\n| \\`--mount type=volume,...target=/app/data\\` | 创建或复用 named volume,持久化 SQLite 和本地存储。 | 可选但生产环境建议保留;删除后数据只写入容器层,使用 \\`--rm\\` 删除容器时会丢失。 |\n\n- 带数据构建会把当前 \\`data/\\`(例如预置 SQLite 文件)固化为镜像初始快照;运行后产生的新数据仍应写入 \\`/app/data\\` volume。`\n const testPath = isStaticImage ? '/health' : '/'\n return `# ${name}\n\n基于 hai Agent Framework 构建的${appTypeLabel}应用。\n\n## 开发\n\n\\`\\`\\`bash\n${install}\n${getRunCommand(pm, 'dev')}\n\\`\\`\\`\n\n## 构建\n\n\\`\\`\\`bash\n${getRunCommand(pm, 'build')}\n${getRunCommand(pm, 'i18n:compile')}\n${getRunCommand(pm, 'preview')}\n\\`\\`\\`\n\n## 容器运行\n\n### 构建镜像\n\n\\`\\`\\`bash\n# 普通构建(二选一)\n${getRunCommand(pm, 'docker:build')}\n${getRunCommand(pm, 'podman:build')}${embeddedDataBuild}\n\\`\\`\\`\n\n### 运行镜像\n\n\\`\\`\\`bash\n# Docker;使用 Podman 时将 docker 替换为 podman\ndocker run --rm -d --name ${name} -p ${containerPort}:${containerPort}${runtimeOptions} ${name}:latest\n\\`\\`\\`\n\n### 测试镜像\n\n\\`\\`\\`bash\ncurl --fail http://127.0.0.1:${containerPort}${testPath}\ndocker stop ${name}\n\\`\\`\\`\n\n${runtimeNotes}\n\n${generateAiDevelopmentReadme()}## 文档\n\n- [hai Agent Framework](https://github.com/hai-series/hai-framework)\n- [Svelte 5](https://svelte.dev/)\n`\n}\n\nfunction generateApiWorkspaceReadme(name: string, pm: 'pnpm' | 'npm' | 'yarn'): string {\n return `# ${name}\n\n基于 hai Agent Framework 构建的 typed API workspace。\n\n## 工程结构\n\n- \\`apps/${name}-contract\\`:共享 API contract、Zod schema 与类型\n- \\`apps/${name}-service\\`:后端 API service,基于 \\`@h-ai/serv\\` 暴露 HTTP 应用\n\n## 开发\n\n\\`\\`\\`bash\n${pm} install\n${pm} dev\n\\`\\`\\`\n\n## 质量门禁\n\n\\`\\`\\`bash\n${pm} typecheck\n${pm} lint\n${pm} build\n${pm} test\n${pm} test:e2e\n\\`\\`\\`\n\n## 容器运行\n\n### 构建镜像\n\n\\`\\`\\`bash\n# 普通构建(二选一)\n${pm} docker:build\n${pm} podman:build\n\n# 将 apps/${name}-service/data 作为镜像初始数据构建(二选一)\n${pm} docker:build:data\n${pm} podman:build:data\n\\`\\`\\`\n\n### 运行镜像\n\n\\`\\`\\`bash\n# 使用 Podman 时将 docker 替换为 podman\ndocker run --rm -d --name ${name} -p 3000:3000 --env-file .env \\\\\n --mount type=bind,source=/absolute/path/to/config,target=/app/config,readonly \\\\\n --mount type=volume,source=${name}-data,target=/app/data \\\\\n ${name}:latest\n\\`\\`\\`\n\n### 测试镜像\n\n\\`\\`\\`bash\ncurl --fail http://127.0.0.1:3000/health\ncurl --fail http://127.0.0.1:3000/ready\ncurl --fail --request POST http://127.0.0.1:3000/api/v1/app/info \\\\\n --header \"Content-Type: application/json\" --data '{}'\ndocker stop ${name}\n\\`\\`\\`\n\n- 配置默认来自 \\`apps/${name}-service/config\\`;运行时可只读挂载到 \\`/app/config\\` 覆盖,并用 YAML 的 \\`\\${ENV_NAME:default}\\` 占位符接收环境变量。\n- 带数据构建会把 \\`apps/${name}-service/data\\` 固化为镜像初始数据;生产写入仍建议使用 \\`/app/data\\` volume。\n\n以上三个运行时参数均可按需删除:\n\n| 参数 | 用途 | 可选性 |\n| --- | --- | --- |\n| \\`--env-file .env\\` | 批量传入环境变量;也可改用多个 \\`-e NAME=value\\`。 | 可选;删除后使用镜像和 YAML 默认值。 |\n| \\`--mount type=bind,...target=/app/config,readonly\\` | 用宿主机配置目录覆盖镜像内 \\`/app/config\\`;必须把 \\`source\\` 改成真实绝对路径,\\`readonly\\` 防止容器修改配置。 | 可选;删除后使用镜像自带配置。 |\n| \\`--mount type=volume,...target=/app/data\\` | 创建或复用 named volume,持久化 SQLite 和本地存储。 | 可选但生产环境建议保留;删除后数据只写入容器层,使用 \\`--rm\\` 删除容器时会丢失。 |\n\n## 扩展建议\n\n- 在 \\`${name}-contract\\` 中维护应用级 contract,前后端共用同一份类型与路径定义。\n- 在 \\`${name}-service\\` 中扩展 procedures、模块初始化与配置。\n- 需要 IAM / storage / ai 时,优先复用 \\`@h-ai/api-contract\\` 与 \\`@h-ai/serv/features/*\\`。\n\n${generateAiDevelopmentReadme()}## 文档\n\n- [hai Agent Framework](https://github.com/hai-series/hai-framework)\n- [@h-ai/serv](./.agents/skills/hai-serv/SKILL.md)\n- [@h-ai/api-contract](./.agents/skills/hai-api-contract/SKILL.md)\n- [@h-ai/api-client](./.agents/skills/hai-api-client/SKILL.md)\n`\n}\n\nfunction generateFullstackReadme(name: string, pm: string, frontends: FrontendTarget[]): string {\n const enabledFrontends = frontends.map(target => FRONTEND_TARGETS[target].name).join(' / ')\n const webBuildCommands = frontends.includes('web')\n ? `\n# Web 静态镜像(二选一)\n${pm} docker:build:web\n${pm} podman:build:web`\n : ''\n const webRunCommand = frontends.includes('web')\n ? `\n\n# Web;PUBLIC_API_BASE 在容器启动时注入,不需要重新构建镜像\ndocker run --rm -d --name ${name}-web -p 8080:8080 \\\\\n -e PUBLIC_API_BASE=https://api.example.com \\\\\n ${name}-web:latest`\n : ''\n const webTestCommands = frontends.includes('web')\n ? `curl --fail http://127.0.0.1:8080/health\ncurl --fail http://127.0.0.1:8080/runtime-config.js\n`\n : ''\n const containerNames = frontends.includes('web') ? `${name} ${name}-web` : name\n return `# ${name}\n\n基于 hai Agent Framework 构建的前后端分离多包工程。\n\n## 工程结构\n\n- \\`packages/${name}-contract\\`:前后端共享 API 契约、Zod Schema 与类型\n- \\`packages/${name}-serv\\`:后端 API Service(通过 \\`@h-ai/serv\\` 暴露最小 HTTP App 抽象,不直接暴露 Hono)\n- \\`packages/${name}-shared\\`:跨端共享 Shell、主题、语言切换、API client 与共享 messages\n- \\`apps/${name}-web\\`:Web 前端${frontends.includes('web') ? '' : '(未启用)'}\n- \\`apps/${name}-app\\`:移动端 App/H5 前端${frontends.includes('app') ? '' : '(未启用)'}\n- \\`apps/${name}-desktop\\`:桌面端前端${frontends.includes('desktop') ? '' : '(未启用)'}\n- \\`apps/${name}-miniapp\\`:小程序预留说明与本端 inlang messages${frontends.includes('miniapp') ? '(占位,不参与构建)' : '(未启用)'}\n\n已启用前端:${enabledFrontends || 'Web / App / Desktop'}\n\n## 默认管理功能\n\n默认启用 IAM、reldb、cache、audit、storage 和 crypto。管理员可以管理用户(新增、编辑、禁用、删除、角色分配、头像上传)、查看两种固定角色及人数、维护角色说明、分页筛选审计日志;普通用户只能维护个人资料、头像、语言、主题和密码。密码修改后全部会话失效,需要重新登录。\n\nCLI 已在根目录生成 \\`.env\\`,其中 \\`HAI_ADMIN_DEFAULT_PASSWORD\\` 是每个项目独立生成的随机强密码。直接运行 \\`dev\\` / \\`start\\` 即可,首次登录使用用户名 \\`admin\\` 和该密码;也可通过同名环境变量覆盖。密码须满足 \\`_iam.yml\\` 策略,启动失败会显示具体校验原因及错误码。\\`.env\\` 已被 Git 和容器构建忽略,\\`.env.example\\` 不含真实密码;部署时设置目标环境自己的密码。已有用户时不会重复创建管理员或重设密码。\n\n本地开发默认 \\`PUBLIC_API_BASE=http://127.0.0.1:3000\\`,Vite 使用同源代理;部署时改为实际公网 API Origin,Android 模拟器访问宿主机时使用 \\`http://10.0.2.2:3000\\`。不要将密钥放入任何 \\`PUBLIC_\\` 或 \\`VITE_\\` 变量。\n\n所有业务 JSON 请求和响应默认通过 \\`@h-ai/crypto\\` transport 双向加密(含登录、刷新、头像上传);前端统一使用共享 typed API client。Web 访问令牌仅存内存、刷新令牌由 HttpOnly Cookie 保存;受信原生端使用平台安全存储或内存。头像为随机路径只读图片资源,支持 PNG/JPEG/WebP,最大 512 KiB。健康检查和只读头像图片可直接访问。\n\n应用显示名称、版本、环境、默认语言和日志设置来自后端 \\`config/_core.yml\\`,前端通过 \\`app.info\\` 获取安全元信息。默认 SQLite、本地存储与内存缓存适合单实例,管理写入仅支持单写实例;多实例读取可使用共享数据库、Redis cache 和 S3 存储,但管理写请求须统一路由到同一写实例。另需会话粘性路由使请求命中同一进程内传输私钥,服务重启后客户端重新协商。生产需显式配置允许的 CORS Origin。业务提交后的审计写入采用最大努力,失败记录结构化错误日志,保留已完成业务的原始结果。\n\n## 配置扩展\n\n服务端 \\`packages/${name}-serv/config/\\` 始终保留 core、serv、db、cache、iam、storage、audit、reach、ai、vecdb、payment、scheduler、deploy 共 13 份 YAML。已用模块保留工作默认值,未启用模块整份注释,可选字段和替代 Provider 按块注释;根 \\`.env.example\\` 也保留未启用模块的凭据示例。Reach 默认为开发控制台通知,生产按 \\`_reach.yml\\` 注释替换为 SMTP、短信或 API Provider,并保持名称唯一。\n\n自动生成的 \\`.env\\` 默认只启用初始管理员密码和 \\`PUBLIC_API_BASE\\`,模块环境覆盖保留注释,YAML 是默认值来源。需要环境覆盖时显式取消对应变量的注释;编辑 YAML 时同步核对已有覆盖。\n\n扩展时先在服务端 workspace 安装需要的包,在 \\`src/server/runtime.ts\\` 按模块公开 Schema 校验配置、初始化并反序关闭,再接入 contract/procedure 和界面。整份注释文件先去掉一层外层注释,可选块继续按需开启;配置文件存在不代表业务功能已接入。\\`crypto.init()\\` 无配置参数,datapipe 为纯函数,不生成虚构 YAML。\n\n环境变量只覆盖 YAML 已有路径,注释键须先启用,或用 \\`HAI_DB\\` / \\`HAI_CACHE\\` 等整体对象覆盖。camelCase 不拆词,例如 \\`connectTimeout\\` 对应 \\`HAI_CACHE_CONNECTTIMEOUT\\`。修改配置后重启服务;语言列表在各前端/shared 的 \\`project.inlang/settings.json\\` 中同步。\\`**/data/\\` 忽略任意层级的数据目录及 \\`.gitkeep\\`,运行数据不入 Git,运行时自动创建目录。\n\n## 开发、编译与打包\n\n\\`\\`\\`bash\n${pm} install\n${pm} dev\n\n# 一键编译:类型检查 + 全工作区构建\n${pm} compile\n\n# 一键打包:Web build、App Capacitor sync、Desktop Tauri build(按启用前端执行)\n${pm} package\n\n# 部署入口:默认执行 package,可替换为团队自己的 CI/CD 发布脚本\n${pm} deploy\n\\`\\`\\`\n\n## 容器运行\n\n默认镜像直接运行 API Service,外部端口为 3000。\n\n### 构建镜像\n\n\\`\\`\\`bash\n# Service 普通构建(二选一)\n${pm} docker:build\n${pm} podman:build\n\n# 将 packages/${name}-serv/data 作为镜像初始数据构建(二选一)\n${pm} docker:build:data\n${pm} podman:build:data\n${webBuildCommands}\n\\`\\`\\`\n\n### 运行镜像\n\n\\`\\`\\`bash\n# Service;使用 Podman 时将 docker 替换为 podman\ndocker run --rm -d --name ${name} -p 3000:3000 --env-file .env \\\\\n --mount type=bind,source=/absolute/path/to/config,target=/app/config,readonly \\\\\n --mount type=volume,source=${name}-data,target=/app/data \\\\\n ${name}:latest\n${webRunCommand}\n\\`\\`\\`\n\n### 测试镜像\n\n\\`\\`\\`bash\ncurl --fail http://127.0.0.1:3000/health\ncurl --fail http://127.0.0.1:3000/ready\n${webTestCommands}docker stop ${containerNames}\n\\`\\`\\`\n\n- 配置默认来自 \\`packages/${name}-serv/config\\`,也可挂载到 \\`/app/config\\`;YAML 中的 \\`\\${ENV_NAME:default}\\` 可由 \\`--env-file\\` 或 \\`-e\\` 注入。\n- 带数据构建会把 \\`packages/${name}-serv/data\\` 固化为镜像初始数据;持久化写入仍应使用 volume。\n- Service 由 \\`@h-ai/serv\\` 直接对外监听,不额外启动 Web 转发层。\n${frontends.includes('web') ? `- Web 使用独立静态镜像并支持一次构建、多环境部署;构建只需运行 \\`${pm} docker:build:web\\`,启动容器时通过 \\`-e PUBLIC_API_BASE=https://api.example.com\\` 指向 Service 对外地址。未设置时默认使用 Web 页面自身 origin。` : ''}\n\n以上三个 Service 运行时参数均可按需删除:\n\n| 参数 | 用途 | 可选性 |\n| --- | --- | --- |\n| \\`--env-file .env\\` | 批量传入环境变量;也可改用多个 \\`-e NAME=value\\`。 | 可选;删除后使用镜像和 YAML 默认值。 |\n| \\`--mount type=bind,...target=/app/config,readonly\\` | 用宿主机配置目录覆盖镜像内 \\`/app/config\\`;必须把 \\`source\\` 改成真实绝对路径,\\`readonly\\` 防止容器修改配置。 | 可选;删除后使用镜像自带配置。 |\n| \\`--mount type=volume,...target=/app/data\\` | 创建或复用 named volume,持久化 SQLite 和本地存储。 | 可选但生产环境建议保留;删除后数据只写入容器层,使用 \\`--rm\\` 删除容器时会丢失。 |\n\n前端单独交付命令:\n\n- Web:\\`${pm} --filter ${name}-web build\\` / \\`${pm} --filter ${name}-web package\\`\n- App:\\`${pm} --filter ${name}-app package\\`,Android/iOS 可用 \\`cap:build:android:debug\\` / \\`cap:build:android:release\\` / \\`cap:build:ios\\`\n- Desktop:\\`${pm} --filter ${name}-desktop tauri:dev\\` / \\`${pm} --filter ${name}-desktop package\\`\n\n## i18n 与 shared 协同\n\n- shared:\\`packages/${name}-shared/project.inlang\\` + \\`messages/\\`,只放跨端共享组件文案。\n- web/app/desktop:每个应用都有自己的 \\`project.inlang\\` + \\`messages/\\`,用于本端页面与产品文案。\n- miniapp:当前是占位,但也有自己的 \\`project.inlang\\` + \\`messages/\\`,便于后续接入真实小程序框架。\n- 新增 locale 时,shared 与所有启用前端的 \\`locales\\` 必须同步;语言切换器会同时更新 shared runtime 与宿主应用 runtime。\n- \\`${pm} i18n:compile\\` 会统一编译 shared 与每个启用前端的 Paraglide 输出;各前端也可单独运行 \\`${pm} --filter ${name}-web paraglide:compile\\` 等命令。\n\n## 自定义建议\n\n- 改全局 Shell/主题/语言切换:编辑 \\`packages/${name}-shared\\`。\n- 改某个前端页面和文案:编辑对应 \\`apps/${name}-*/src/routes\\` 与 \\`apps/${name}-*/messages\\`。\n- 改主题列表:调整脚手架配置中的 \\`fullstack.theme.themes\\`,或直接编辑各端 \\`src/app.css\\` 的 daisyUI \\`themes\\`。\n\n## 质量门禁\n\n\\`\\`\\`bash\n${pm} typecheck\n${pm} lint\n${pm} build\n${pm} test\n${pm} test:e2e\n\\`\\`\\`\n\n${generateAiDevelopmentReadme()}## 文档\n\n- [hai Agent Framework](https://github.com/hai-series/hai-framework)\n- [@h-ai/serv](./.agents/skills/hai-serv/SKILL.md)\n- [@h-ai/ui](./.agents/skills/hai-ui/SKILL.md)\n`\n}\n\n/**\n * 打印完成提示\n */\nfunction printCompletionMessage(options: Required<CreateProjectOptions>): void {\n writeCliMessage('')\n writeCliMessage(chalk.green('✔ 项目创建成功!'))\n writeCliMessage('')\n\n // 功能摘要\n if (options.features.length > 0) {\n writeCliMessage(chalk.bold('已启用功能:'))\n for (const featureId of options.features) {\n const feature = FEATURES[featureId]\n if (feature) {\n writeCliMessage(chalk.gray(` • ${feature.name} (${featureId})`))\n }\n }\n writeCliMessage('')\n }\n\n writeCliMessage('下一步:')\n writeCliMessage(chalk.cyan(` cd ${options.name}`))\n if (options.appType === 'fullstack')\n writeCliMessage(chalk.cyan(cliM('cli_adminPasswordSaved')))\n if (!options.install) {\n writeCliMessage(chalk.cyan(` ${getInstallCommand(options.packageManager)}`))\n }\n if (options.appType === 'fullstack' || options.appType === 'api') {\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'dev')}`))\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'typecheck')}`))\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'test')}`))\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'test:e2e')}`))\n }\n else {\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'dev')}`))\n }\n writeCliMessage('')\n}\n\n// =============================================================================\n// 项目检测(供 init 命令使用)\n// =============================================================================\n\n/**\n * 检测项目信息\n */\nexport async function detectProject(cwd: string): Promise<ProjectInfo | null> {\n const pkgPath = path.join(cwd, 'package.json')\n\n if (!(await fileExists(pkgPath))) {\n return null\n }\n\n try {\n const pkg = await fse.readJson(pkgPath)\n const deps = { ...pkg.dependencies, ...pkg.devDependencies }\n\n const haiPackages = Object.keys(deps).filter(name => name.startsWith('@h-ai/'))\n\n return {\n name: pkg.name,\n version: pkg.version,\n description: pkg.description,\n isHaiProject: haiPackages.length > 0,\n haiPackages,\n }\n }\n catch {\n return null\n }\n}\n","/**\n * @h-ai/cli — 模块增量添加命令\n *\n * 向现有 hai 项目增量启用模块。\n * @module cli-add\n */\n\nimport type { FeatureId, GlobalOptions } from '../cli-types.js'\nimport path from 'node:path'\nimport { core } from '@h-ai/core'\nimport chalk from 'chalk'\nimport fse from 'fs-extra'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { detectPackageManager, fileExists, getCliVersion, writeFile } from '../cli-utils.js'\nimport { generateConfigFile } from './cli-config-templates.js'\nimport { detectProject } from './cli-create.js'\n\n/**\n * add 命令选项\n */\nexport interface AddModuleOptions extends GlobalOptions {\n /** 要添加的模块 */\n module?: FeatureId\n /** 是否安装依赖 */\n install?: boolean\n}\n\n// 可添加的模块与对应包\nconst MODULE_MAP: Record<string, { packages: string[], deps?: string[], configKey?: string, description: string }> = {\n // iam 依赖 crypto(password hash)/ db(user 存储)/ cache(session 缓存)\n 'iam': { packages: ['@h-ai/iam'], deps: ['crypto', 'db', 'cache'], configKey: 'iam', description: '身份与访问管理' },\n // 'db' 和 'reldb' 都映射到 @h-ai/reldb,兼容用户习惯(hai add db 和 hai add reldb 均可)\n 'db': { packages: ['@h-ai/reldb'], configKey: 'db', description: '数据库' },\n 'reldb': { packages: ['@h-ai/reldb'], configKey: 'db', description: '数据库' },\n 'cache': { packages: ['@h-ai/cache'], configKey: 'cache', description: '缓存' },\n 'ai': { packages: ['@h-ai/ai'], configKey: 'ai', description: 'AI 集成' },\n 'storage': { packages: ['@h-ai/storage'], configKey: 'storage', description: '文件存储' },\n 'crypto': { packages: ['@h-ai/crypto'], description: '加密模块' },\n 'kit': { packages: ['@h-ai/kit'], description: 'SvelteKit 集成工具' },\n 'ui': { packages: ['@h-ai/ui'], description: 'UI 组件库' },\n 'deploy': { packages: ['@h-ai/deploy'], configKey: 'deploy', description: '自动化部署' },\n 'vecdb': { packages: ['@h-ai/vecdb'], configKey: 'vecdb', description: '向量数据库' },\n 'datapipe': { packages: ['@h-ai/datapipe'], description: '数据处理管道' },\n 'reach': { packages: ['@h-ai/reach'], configKey: 'reach', description: '消息推送' },\n 'scheduler': { packages: ['@h-ai/scheduler'], deps: ['db'], configKey: 'scheduler', description: '任务调度' },\n 'audit': { packages: ['@h-ai/audit'], deps: ['db'], configKey: 'audit', description: '审计日志' },\n 'payment': { packages: ['@h-ai/payment'], configKey: 'payment', description: '支付' },\n 'capacitor': { packages: ['@h-ai/capacitor'], description: '移动端能力' },\n 'api-client': { packages: ['@h-ai/api-client'], description: 'HTTP 客户端' },\n}\n\n/**\n * 增量添加模块到现有项目\n */\nexport async function addModule(options: AddModuleOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? '.'\n\n try {\n // 检测项目\n const project = await detectProject(cwd)\n if (!project) {\n core.logger.error(chalk.red('未检测到项目(找不到 package.json)'))\n return\n }\n\n // 交互式选择模块\n let moduleName = options.module\n if (!moduleName) {\n // 过滤已安装的模块\n const installed = new Set(project.haiPackages)\n const choices = Object.entries(MODULE_MAP)\n .filter(([, def]) => !def.packages.every(p => installed.has(p)))\n .map(([key, def]) => ({\n title: `${chalk.bold(key.padEnd(10))} ${chalk.gray(def.description)}`,\n value: key,\n }))\n\n if (choices.length === 0) {\n core.logger.info(chalk.green('所有模块已安装!'))\n return\n }\n\n const { selected } = await prompts({\n type: 'select',\n name: 'selected',\n message: '选择要添加的模块:',\n choices,\n })\n\n if (!selected)\n return\n moduleName = selected as FeatureId\n }\n\n const moduleDef = MODULE_MAP[moduleName]\n if (!moduleDef) {\n core.logger.error(chalk.red(`未知模块: ${moduleName}`))\n core.logger.info(`可用模块: ${Object.keys(MODULE_MAP).join(', ')}`)\n return\n }\n\n const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates.js')\n\n // 检查是否已安装\n if (moduleDef.packages.every(p => project.haiPackages.includes(p))) {\n const generatedFiles = await generateProjectAiSupport(\n cwd,\n resolveSkillNamesForPackages(project.haiPackages),\n {\n overwriteSkills: false,\n overwriteBridgeFiles: false,\n },\n )\n if (generatedFiles.length > 0) {\n core.logger.info(chalk.yellow(`模块 ${moduleName} 已安装,已补全 AI 支持文件`))\n for (const generatedFile of generatedFiles) {\n core.logger.info(chalk.gray(` + ${generatedFile} (AI support)`))\n }\n }\n else {\n core.logger.info(chalk.yellow(`模块 ${moduleName} 已安装`))\n }\n return\n }\n\n // 收集所有需要安装的包(含依赖模块)\n const allPackages = new Set(moduleDef.packages)\n if (moduleDef.deps) {\n for (const dep of moduleDef.deps) {\n const depDef = MODULE_MAP[dep]\n if (depDef) {\n for (const pkg of depDef.packages) {\n allPackages.add(pkg)\n }\n }\n }\n }\n\n // 更新 package.json\n spinner.start('更新 package.json...')\n const pkgPath = path.join(cwd, 'package.json')\n const pkg = await fse.readJson(pkgPath)\n if (!pkg.dependencies)\n pkg.dependencies = {}\n\n const existingHaiSpecifier = Object.entries(pkg.dependencies as Record<string, string>)\n .find(([pkgName]) => pkgName.startsWith('@h-ai/'))?.[1]\n\n // 已存在的 @h-ai/* 依赖若使用 catalog:,新增模块保持一致;否则固定当前 CLI 对应版本。\n const depVersion = existingHaiSpecifier === 'catalog:' ? 'catalog:' : getCliVersion()\n\n for (const pkgName of allPackages) {\n if (!pkg.dependencies[pkgName]) {\n pkg.dependencies[pkgName] = depVersion\n }\n }\n await fse.writeJson(pkgPath, pkg, { spaces: 2 })\n spinner.succeed()\n\n // 生成配置文件\n if (moduleDef.configKey) {\n const configDir = path.join(cwd, 'config')\n const configPath = path.join(configDir, `_${moduleDef.configKey}.yml`)\n if (!(await fileExists(configPath))) {\n spinner.start(`生成配置文件 config/_${moduleDef.configKey}.yml...`)\n const content = generateConfigFile(moduleDef.configKey)\n await writeFile(configPath, content)\n spinner.succeed()\n }\n else {\n core.logger.info(chalk.gray(`配置文件已存在: config/_${moduleDef.configKey}.yml`))\n }\n }\n\n // 生成依赖模块的配置文件\n if (moduleDef.deps) {\n for (const dep of moduleDef.deps) {\n const depDef = MODULE_MAP[dep]\n if (depDef?.configKey) {\n const depConfigPath = path.join(cwd, 'config', `_${depDef.configKey}.yml`)\n if (!(await fileExists(depConfigPath))) {\n const content = generateConfigFile(depDef.configKey)\n await writeFile(depConfigPath, content)\n core.logger.info(chalk.gray(` + config/_${depDef.configKey}.yml (依赖)`))\n }\n }\n }\n }\n\n const skillPackages = [...project.haiPackages, ...allPackages]\n const generatedFiles = await generateProjectAiSupport(\n cwd,\n resolveSkillNamesForPackages(skillPackages),\n {\n overwriteSkills: false,\n overwriteBridgeFiles: false,\n },\n )\n if (generatedFiles.length > 0) {\n for (const generatedFile of generatedFiles) {\n core.logger.info(chalk.gray(` + ${generatedFile} (AI support)`))\n }\n }\n\n // 安装依赖\n const doInstall = options.install !== false\n if (doInstall) {\n spinner.start('安装依赖...')\n const { execSync } = await import('node:child_process')\n const pm = await detectPackageManager(cwd)\n execSync(`${pm} install`, { cwd, stdio: 'ignore' })\n spinner.succeed()\n }\n\n core.logger.info('')\n core.logger.info(chalk.green(`✔ 模块 ${moduleName} 添加成功!`))\n core.logger.info('')\n core.logger.info('已添加的包:')\n for (const pkg of allPackages) {\n core.logger.info(chalk.cyan(` ${pkg}`))\n }\n core.logger.info('')\n }\n catch (error) {\n spinner.fail()\n core.logger.error(chalk.red('添加模块失败:'), { error })\n throw error\n }\n}\n","/**\n * @h-ai/cli — 部署命令\n *\n * 使用: hai deploy [appDir]\n * @module cli-deploy\n */\n\nimport type { GlobalOptions } from '../cli-types.js'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport process from 'node:process'\nimport { core } from '@h-ai/core'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { parse } from 'yaml'\nimport { cliM } from '../cli-i18n.js'\n\n/** deploy 命令选项 */\nexport interface DeployCommandOptions extends GlobalOptions {\n /** 应用目录 */\n appDir?: string\n /** 项目名称(覆盖自动检测) */\n projectName?: string\n /** 跳过基础设施开通 */\n skipProvision?: boolean\n /** 跳过构建 */\n skipBuild?: boolean\n}\n\n/**\n * 执行部署命令\n *\n * @param options - 部署选项\n */\nexport async function deployCommand(options: DeployCommandOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? process.cwd()\n const appDir = resolve(cwd, options.appDir ?? '.')\n let closeDeploy: (() => Promise<void>) | null = null\n\n try {\n // 动态导入 @h-ai/deploy(允许 CLI 在未安装 deploy 时仍可使用其他命令)\n let deployModule: typeof import('@h-ai/deploy')\n try {\n deployModule = await import('@h-ai/deploy')\n }\n catch {\n core.logger.error(chalk.red(cliM('cli_deploy_module_missing')))\n core.logger.info(chalk.cyan(' pnpm add @h-ai/deploy'))\n throw new Error(cliM('cli_deploy_module_missing'))\n }\n\n const { deploy } = deployModule\n\n // 1. 加载凭证\n spinner.start(cliM('cli_deploy_load_credentials'))\n const credResult = deploy.credentials.load()\n if (!credResult.success) {\n throw new Error(cliM('cli_deploy_credentials_failed', { params: { message: credResult.error.message } }))\n }\n spinner.succeed(cliM('cli_deploy_credentials_loaded', { params: { count: credResult.data.length } }))\n\n // 2. 读取部署配置\n spinner.start(cliM('cli_deploy_load_config'))\n const configPath = resolve(appDir, 'config', '_deploy.yml')\n if (!existsSync(configPath)) {\n spinner.fail(chalk.red(cliM('cli_deploy_config_missing', { params: { path: configPath } })))\n core.logger.info(chalk.cyan(cliM('cli_deploy_config_hint')))\n throw new Error(cliM('cli_deploy_config_missing', { params: { path: configPath } }))\n }\n\n const configContent = readFileSync(configPath, 'utf-8')\n const rawConfig = interpolateEnvFallback(configContent)\n const deployConfig = parse(rawConfig)\n spinner.succeed(cliM('cli_deploy_config_loaded'))\n\n // 3. 扫描应用\n spinner.start(cliM('cli_deploy_scanning'))\n const scanResult = await deploy.scan(appDir)\n if (!scanResult.success) {\n throw new Error(cliM('cli_deploy_scan_failed', { params: { message: scanResult.error.message } }))\n }\n const scan = scanResult.data\n spinner.succeed(cliM('cli_deploy_scanned', { params: { name: scan.appName, sveltekit: String(scan.isSvelteKit), services: scan.requiredServices.join(', ') || cliM('cli_deploy_none') } }))\n\n // 4. 初始化 deploy 模块\n spinner.start(cliM('cli_deploy_initializing'))\n const initResult = await deploy.init(deployConfig)\n if (!initResult.success) {\n throw new Error(cliM('cli_deploy_init_failed', { params: { message: initResult.error.message } }))\n }\n closeDeploy = () => deploy.close()\n spinner.succeed(cliM('cli_deploy_initialized'))\n\n // 5. 执行部署\n spinner.start(cliM('cli_deploy_deploying'))\n const deployResult = await deploy.deployApp(appDir, {\n projectName: options.projectName,\n skipProvision: options.skipProvision,\n skipBuild: options.skipBuild,\n })\n\n if (!deployResult.success) {\n if (deployResult.error.ext?.recovery) {\n core.logger.warn(deployResult.error.suggestion ?? cliM('cli_deploy_command_failed'), {\n recovery: deployResult.error.ext.recovery,\n })\n }\n throw new Error(cliM('cli_deploy_failed', { params: { message: deployResult.error.message } }))\n }\n\n spinner.succeed(chalk.green(cliM('cli_deploy_success')))\n core.logger.info('')\n core.logger.info(chalk.cyan(cliM('cli_deploy_url', { params: { url: deployResult.data.url } })))\n core.logger.info(chalk.gray(cliM('cli_deploy_id', { params: { id: deployResult.data.deploymentId } })))\n if (deployResult.data.envVarsSet.length > 0) {\n core.logger.info(chalk.gray(cliM('cli_deploy_env', { params: { names: deployResult.data.envVarsSet.join(', ') } })))\n }\n core.logger.info('')\n }\n catch (error) {\n spinner.fail(chalk.red(cliM('cli_deploy_command_failed')))\n core.logger.error(error instanceof Error ? error.message : String(error))\n throw error\n }\n finally {\n if (closeDeploy) {\n try {\n await closeDeploy()\n }\n catch (error) {\n core.logger.error('Failed to close deploy module', { error })\n process.exitCode = 1\n }\n }\n }\n}\n\n/**\n * 简易环境变量插值(fallback,当 core.config.interpolateEnv 不可用时)\n *\n * @param content - 包含 ${VAR:default} 的字符串\n * @returns 插值后的字符串\n */\nfunction interpolateEnvFallback(content: string): string {\n return content.replace(/\\$\\{([^:}]+)(?::([^}]*))?\\}/g, (_match, key: string, defaultValue?: string) => {\n return process.env[key] ?? defaultValue ?? ''\n })\n}\n","/**\n * @h-ai/cli — 代码生成命令\n * @module cli-generate\n */\n\nimport type { GenerateOptions, GeneratorType, TemplateContext } from '../cli-types.js'\nimport path from 'node:path'\nimport { core } from '@h-ai/core'\nimport chalk from 'chalk'\nimport fse from 'fs-extra'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { cliM } from '../cli-i18n.js'\nimport { createTemplateContext } from '../cli-utils.js'\nimport { detectProject } from './cli-create.js'\n\n/**\n * 生成器配置\n */\nconst GENERATORS: Record<GeneratorType, {\n description: string\n defaultPath: string\n generate: (context: TemplateContext, outputDir: string) => Promise<Array<{ path: string, content: string }>>\n}> = {\n page: {\n description: 'SvelteKit 页面',\n defaultPath: 'src/routes',\n generate: generatePage,\n },\n component: {\n description: 'Svelte 组件',\n defaultPath: 'src/lib/components',\n generate: generateComponent,\n },\n api: {\n description: 'API 端点',\n defaultPath: 'src/routes/api',\n generate: generateApi,\n },\n model: {\n description: '数据模型',\n defaultPath: 'src/lib/models',\n generate: generateModel,\n },\n migration: {\n description: '数据库迁移',\n defaultPath: 'migrations',\n generate: generateMigration,\n },\n}\n\n/**\n * 生成代码\n */\nexport async function generate(options: GenerateOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? '.'\n\n try {\n // 检查是否在 hai 项目中\n const project = await detectProject(cwd)\n\n if (!project?.isHaiProject) {\n core.logger.warn(chalk.yellow('警告: 当前目录不是 hai 项目'))\n }\n\n // 交互式获取选项\n const resolvedOptions = await resolveGenerateOptions(options)\n const generator = GENERATORS[resolvedOptions.type]\n\n if (!generator) {\n throw new Error(`未知的生成器类型: ${resolvedOptions.type}`)\n }\n\n // 名称会同时进入路径、标识符与源码字符串,禁止路径片段和代码字符。\n if (!/^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$/i.test(resolvedOptions.name))\n throw new Error(cliM('cli_invalidGenerateName'))\n\n const outputDir = path.resolve(cwd, resolvedOptions.output || generator.defaultPath)\n\n // 安全校验:输出路径必须在当前工作目录内,防止路径遍历\n const resolvedCwd = path.resolve(cwd)\n if (!outputDir.startsWith(resolvedCwd + path.sep) && outputDir !== resolvedCwd) {\n throw new Error(cliM('cli_generateOutsideWorkspace'))\n }\n\n const context = createTemplateContext(resolvedOptions.name, {\n projectName: project?.name,\n })\n\n spinner.start(`生成 ${generator.description}...`)\n\n const files = await generator.generate(context, outputDir)\n const realCwd = await fse.realpath(resolvedCwd)\n // 先检查全部目标,再落盘,避免页面的第二个文件冲突时已覆盖第一个。\n for (const file of files) {\n if (!resolvedOptions.force && await fse.pathExists(file.path))\n throw new Error(cliM('cli_generateExists', { params: { path: file.path } }))\n let ancestor = file.path\n while (!await fse.pathExists(ancestor))\n ancestor = path.dirname(ancestor)\n const realAncestor = await fse.realpath(ancestor)\n const relative = path.relative(realCwd, realAncestor)\n if (relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative))\n throw new Error(cliM('cli_generateOutsideWorkspace'))\n }\n for (const file of files) {\n await fse.ensureDir(path.dirname(file.path))\n await fse.writeFile(file.path, file.content, { encoding: 'utf-8', flag: resolvedOptions.force ? 'w' : 'wx' })\n }\n\n spinner.succeed()\n\n core.logger.info('', {})\n core.logger.info(chalk.green('✔ 生成完成!'))\n core.logger.info('', {})\n core.logger.info('创建的文件:')\n files.forEach((file) => {\n core.logger.info(chalk.cyan(` ${path.relative(cwd, file.path)}`))\n })\n core.logger.info('', {})\n }\n catch (error) {\n spinner.fail()\n core.logger.error(chalk.red('生成失败:'), { error })\n throw error\n }\n}\n\n/**\n * 解析生成选项\n */\nasync function resolveGenerateOptions(options: GenerateOptions): Promise<Required<GenerateOptions>> {\n const questions: prompts.PromptObject[] = []\n\n if (!options.type) {\n questions.push({\n type: 'select',\n name: 'type',\n message: '选择生成类型:',\n choices: Object.entries(GENERATORS).map(([key, value]) => ({\n title: `${key} - ${value.description}`,\n value: key,\n })),\n })\n }\n\n if (!options.name) {\n questions.push({\n type: 'text',\n name: 'name',\n message: '名称:',\n validate: (value: string) => {\n if (!value.trim())\n return '名称不能为空'\n return true\n },\n })\n }\n\n const answers = questions.length > 0 ? await prompts(questions) : {}\n\n return {\n type: options.type || answers.type,\n name: options.name || answers.name,\n output: options.output ?? '',\n force: options.force ?? false,\n verbose: options.verbose ?? false,\n cwd: options.cwd ?? '.',\n }\n}\n\n/**\n * 生成页面\n */\nasync function generatePage(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n const pageDir = path.join(outputDir, context.kebabCase)\n\n // +page.svelte\n const pageContent = `<!-- ${context.pascalCase} 页面 -->\n<svelte:head>\n <title>${context.pascalCase}</title>\n</svelte:head>\n\n<div class='container mx-auto p-4'>\n <h1 class='text-2xl font-bold mb-4'>${context.pascalCase}</h1>\n\n <!-- 页面内容 -->\n</div>\n`\n\n const pagePath = path.join(pageDir, '+page.svelte')\n files.push({ path: pagePath, content: pageContent })\n\n // +page.server.ts\n const serverContent = `/**\n * ${context.pascalCase} 页面服务端\n */\nimport type { Actions, PageServerLoad } from './$types'\n\nexport const load: PageServerLoad = async () => {\n return {\n // 页面数据\n }\n}\n\nexport const actions: Actions = {\n default: async () => {\n // 表单处理\n },\n}\n`\n\n const serverPath = path.join(pageDir, '+page.server.ts')\n files.push({ path: serverPath, content: serverContent })\n\n return files\n}\n\n/**\n * 生成组件\n */\nasync function generateComponent(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n\n // Component.svelte\n const componentContent = `<script lang='ts'>\n import type { Snippet } from 'svelte'\n\n /**\n * ${context.pascalCase} 组件\n */\n\n interface Props {\n /** 自定义 class */\n class?: string\n /** 子内容(Svelte 5 snippet) */\n children?: Snippet\n }\n\n const { class: className = '', children }: Props = $props()\n</script>\n\n<div class={className}>\n <!-- 组件内容 -->\n {@render children?.()}\n</div>\n`\n\n const componentPath = path.join(outputDir, `${context.pascalCase}.svelte`)\n files.push({ path: componentPath, content: componentContent })\n\n return files\n}\n\n/**\n * 生成 API 端点\n */\nasync function generateApi(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n const apiDir = path.join(outputDir, context.kebabCase)\n\n // +server.ts\n const serverContent = `/**\n * ${context.pascalCase} API\n */\nimport type { RequestHandler } from './$types'\nimport { kit } from '@h-ai/kit'\nimport { z } from 'zod'\n\n/** 示例输入;添加业务逻辑前扩展字段和约束。 */\nconst InputSchema = z.object({\n /** 业务名称(非空) */\n name: z.string().min(1),\n})\n\n/**\n * GET ${context.kebabCase}\n */\nexport const GET: RequestHandler = kit.handler(async ({ locals }) => {\n return kit.response.ok({ items: [] }, locals.requestId)\n})\n\n/**\n * POST ${context.kebabCase}\n */\nexport const POST: RequestHandler = kit.handler(async ({ request, locals }) => {\n const body = await kit.validate.body(request, InputSchema)\n // 校验通过后再执行业务操作;示例仅回传数据,不执行写入。\n return kit.response.ok(body, locals.requestId)\n})\n`\n\n const serverPath = path.join(apiDir, '+server.ts')\n files.push({ path: serverPath, content: serverContent })\n\n return files\n}\n\n/**\n * 生成数据模型\n */\nasync function generateModel(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n\n // model.ts\n const modelContent = `/**\n * ${context.pascalCase} 模型\n */\nimport { z } from 'zod'\n\n/**\n * ${context.pascalCase} Schema\n */\nexport const ${context.camelCase}Schema = z.object({\n /** 记录唯一标识 */\n id: z.string(),\n /** 显示名称 */\n name: z.string().min(1),\n /** 创建时间 */\n createdAt: z.date(),\n /** 最后修改时间 */\n updatedAt: z.date(),\n})\n\n/**\n * 创建 ${context.pascalCase} Schema\n */\nexport const create${context.pascalCase}Schema = ${context.camelCase}Schema.omit({\n id: true,\n createdAt: true,\n updatedAt: true,\n})\n\n/**\n * 更新 ${context.pascalCase} Schema\n */\nexport const update${context.pascalCase}Schema = create${context.pascalCase}Schema.partial()\n\n/**\n * ${context.pascalCase} 类型\n */\nexport type ${context.pascalCase} = z.infer<typeof ${context.camelCase}Schema>\nexport type Create${context.pascalCase} = z.infer<typeof create${context.pascalCase}Schema>\nexport type Update${context.pascalCase} = z.infer<typeof update${context.pascalCase}Schema>\n`\n\n const modelPath = path.join(outputDir, `${context.kebabCase}.ts`)\n files.push({ path: modelPath, content: modelContent })\n\n return files\n}\n\n/**\n * 生成迁移\n */\nasync function generateMigration(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n const timestamp = Date.now()\n\n // migration.ts\n const migrationContent = `/**\n * 迁移: ${context.pascalCase}\n * 时间: ${new Date().toISOString()}\n */\nimport { reldb } from '@h-ai/reldb'\n\n/** 升级:调用前初始化 reldb,调用方必须检查返回的 HaiResult。 */\nexport function up() {\n return reldb.ddl.createTable('hai_app_${context.snakeCase}', {\n id: { type: 'TEXT', primaryKey: true },\n name: { type: 'TEXT', notNull: true },\n created_at: { type: 'TIMESTAMP', notNull: true },\n updated_at: { type: 'TIMESTAMP', notNull: true },\n })\n}\n\n/** 回滚会删除整张表;由应用确认数据可删除后显式调用。 */\nexport function down() {\n return reldb.ddl.dropTable('hai_app_${context.snakeCase}')\n}\n`\n\n const migrationPath = path.join(outputDir, `${timestamp}_${context.snakeCase}.ts`)\n files.push({ path: migrationPath, content: migrationContent })\n\n return files\n}\n","/**\n * @h-ai/cli — 项目初始化/校验命令\n *\n * 校验现有项目配置完整性,补全缺失的配置文件。\n * @module cli-init\n */\n\nimport type { GlobalOptions, ProjectInfo } from '../cli-types.js'\nimport path from 'node:path'\nimport { core } from '@h-ai/core'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { fileExists, writeFile } from '../cli-utils.js'\nimport { generateConfigFile } from './cli-config-templates.js'\nimport { detectProject } from './cli-create.js'\n\n/**\n * init 命令选项\n */\nexport interface InitOptions extends GlobalOptions {\n /** 强制重新生成配置 */\n force?: boolean\n}\n\n/**\n * 模块到配置文件的映射\n */\nconst MODULE_CONFIG_MAP: Record<string, { configKey: string, label: string }> = {\n '@h-ai/core': { configKey: 'core', label: 'Core' },\n '@h-ai/serv': { configKey: 'serv', label: 'Service' },\n '@h-ai/reldb': { configKey: 'db', label: 'Database' },\n '@h-ai/cache': { configKey: 'cache', label: 'Cache' },\n '@h-ai/iam': { configKey: 'iam', label: 'IAM' },\n '@h-ai/storage': { configKey: 'storage', label: 'Storage' },\n '@h-ai/ai': { configKey: 'ai', label: 'AI' },\n '@h-ai/vecdb': { configKey: 'vecdb', label: 'VecDB' },\n '@h-ai/reach': { configKey: 'reach', label: 'Reach' },\n '@h-ai/scheduler': { configKey: 'scheduler', label: 'Scheduler' },\n '@h-ai/audit': { configKey: 'audit', label: 'Audit' },\n '@h-ai/payment': { configKey: 'payment', label: 'Payment' },\n '@h-ai/deploy': { configKey: 'deploy', label: 'Deploy' },\n}\n\n/**\n * 校验结果\n */\ninterface ValidationResult {\n /** 已存在的配置 */\n existing: string[]\n /** 缺失的配置 */\n missing: Array<{ pkg: string, configKey: string, label: string }>\n /** 项目信息 */\n project: ProjectInfo\n}\n\n/**\n * 校验项目配置完整性\n */\nasync function validateProject(cwd: string): Promise<ValidationResult | null> {\n const project = await detectProject(cwd)\n if (!project) {\n return null\n }\n\n const existing: string[] = []\n const missing: ValidationResult['missing'] = []\n\n for (const pkg of project.haiPackages) {\n const mapping = MODULE_CONFIG_MAP[pkg]\n if (!mapping)\n continue\n\n const configPath = path.join(cwd, 'config', `_${mapping.configKey}.yml`)\n if (await fileExists(configPath)) {\n existing.push(mapping.configKey)\n }\n else {\n missing.push({ pkg, configKey: mapping.configKey, label: mapping.label })\n }\n }\n\n return { existing, missing, project }\n}\n\n/**\n * 初始化/校验项目配置\n */\nexport async function initProject(options: InitOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? '.'\n\n try {\n // 检测项目\n spinner.start('检测项目...')\n const result = await validateProject(cwd)\n\n if (!result) {\n spinner.fail(chalk.red('未检测到项目(找不到 package.json)'))\n return\n }\n\n const { project, existing, missing } = result\n spinner.succeed(`检测到项目: ${chalk.cyan(project.name)}`)\n\n // 即使配置齐备,也补全新增 AI 参考资源;已有项目规则与 Skill 不覆盖。\n if (project.isHaiProject) {\n const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates.js')\n const generatedFiles = await generateProjectAiSupport(cwd, resolveSkillNamesForPackages(project.haiPackages), {\n overwriteSkills: false,\n overwriteBridgeFiles: false,\n })\n for (const generatedFile of generatedFiles) {\n core.logger.info(chalk.gray(` + ${generatedFile}`))\n }\n }\n\n // 显示项目状态\n core.logger.info('')\n core.logger.info(chalk.bold('项目状态:'))\n core.logger.info(` 名称: ${chalk.cyan(project.name)}`)\n core.logger.info(` 版本: ${project.version}`)\n core.logger.info(` 已安装模块: ${project.haiPackages.length > 0 ? project.haiPackages.map(p => chalk.cyan(p)).join(', ') : chalk.gray('无')}`)\n core.logger.info('')\n\n // 显示配置状态\n if (existing.length > 0) {\n core.logger.info(chalk.bold('已有配置:'))\n for (const key of existing) {\n core.logger.info(chalk.green(` ✔ config/_${key}.yml`))\n }\n }\n\n // 无缺失配置\n if (missing.length === 0 && !options.force) {\n core.logger.info('')\n core.logger.info(chalk.green('✔ 所有配置文件已就绪!'))\n return\n }\n\n // 补全缺失配置\n if (missing.length > 0) {\n core.logger.info('')\n core.logger.info(chalk.bold('缺失配置:'))\n for (const item of missing) {\n core.logger.info(chalk.yellow(` ✘ config/_${item.configKey}.yml (${item.label})`))\n }\n core.logger.info('')\n\n spinner.start('生成缺失配置文件...')\n let generated = 0\n for (const item of missing) {\n const configPath = path.join(cwd, 'config', `_${item.configKey}.yml`)\n const content = generateConfigFile(item.configKey)\n await writeFile(configPath, content)\n generated++\n }\n spinner.succeed(`已生成 ${generated} 个配置文件`)\n }\n\n // 强制模式:重新生成所有配置\n if (options.force && existing.length > 0) {\n core.logger.info('')\n spinner.start('强制重新生成所有配置文件...')\n let regenerated = 0\n for (const pkg of project.haiPackages) {\n const mapping = MODULE_CONFIG_MAP[pkg]\n if (!mapping)\n continue\n const configPath = path.join(cwd, 'config', `_${mapping.configKey}.yml`)\n const content = generateConfigFile(mapping.configKey)\n await writeFile(configPath, content)\n regenerated++\n }\n spinner.succeed(`已重新生成 ${regenerated} 个配置文件`)\n }\n\n // 检查 core 配置(始终需要)\n const coreConfigPath = path.join(cwd, 'config', '_core.yml')\n if (!(await fileExists(coreConfigPath))) {\n spinner.start('生成核心配置 config/_core.yml...')\n const content = generateConfigFile('core')\n await writeFile(coreConfigPath, content)\n spinner.succeed()\n }\n\n core.logger.info('')\n core.logger.info(chalk.green('✔ 项目配置初始化完成!'))\n core.logger.info('')\n core.logger.info(chalk.gray('下一步:'))\n core.logger.info(chalk.gray(' 1. 编辑 config/ 中的配置文件'))\n core.logger.info(chalk.gray(' 2. 运行 pnpm dev 启动开发服务'))\n core.logger.info('')\n }\n catch (error) {\n spinner.fail()\n core.logger.error(chalk.red('初始化失败:'), { error })\n throw error\n }\n}\n","/**\n * @h-ai/cli — 主入口\n *\n * hai Agent Framework CLI\n * @module cli-main\n */\n\nimport type { AppType, CreateProjectOptions, FeatureId, FrontendTarget, GeneratorType } from './cli-types.js'\nimport process from 'node:process'\nimport { cac } from 'cac'\nimport chalk from 'chalk'\nimport { getCliVersion, writeCliMessage } from './cli-utils.js'\nimport { addModule, createProject, deployCommand, generate, initProject } from './commands/cli-commands.js'\n\n// CLI 版本(从 package.json 动态读取,避免硬编码与 npm 发布版本不一致)\nconst VERSION = getCliVersion()\n\n// 创建 CLI\nconst cli = cac('hai')\n\n// 全局选项\ncli.option('-v, --verbose', '显示详细输出')\ncli.option('-C, --cwd <path>', '工作目录')\n\n// 创建项目命令\ncli\n .command('create [name]', '创建新的 hai 项目')\n .option('--type <type>', '应用类型 (admin, website, h5, api, mobile-app, fullstack)')\n .option('--frontends <targets>', '前后端分离工程前端目标 (逗号分隔: web,app,miniapp,desktop)')\n .option('-t, --template <template>', '项目模板 (minimal, default, full, custom)')\n .option('-f, --features <features>', '功能列表 (逗号分隔: iam,db,cache,ai,storage,crypto)')\n .option('--examples', '添加示例代码')\n .option('--no-examples', '不添加示例代码')\n .option('--no-install', '不安装依赖')\n .option('-p, --package-manager <pm>', '包管理器 (pnpm, npm, yarn)')\n .option('--no-git', '不初始化 Git')\n .option('--git-remote <url>', 'Git 远程仓库地址')\n .option('-y, --yes', '使用默认配置,跳过交互')\n .action(async (name: string | undefined, options: Record<string, unknown>) => {\n try {\n // 解析功能列表\n const features = typeof options.features === 'string'\n ? options.features.split(',').map(f => f.trim()) as CreateProjectOptions['features']\n : undefined\n const frontends = typeof options.frontends === 'string'\n ? options.frontends.split(',').map(f => f.trim()).filter(Boolean) as FrontendTarget[]\n : undefined\n\n await createProject({\n name: name ?? '',\n appType: options.type as AppType,\n frontends,\n template: options.template as CreateProjectOptions['template'],\n features,\n examples: options.examples as boolean,\n install: options.install as boolean,\n packageManager: options.packageManager as CreateProjectOptions['packageManager'],\n git: options.git as boolean,\n gitRemote: options.gitRemote as string,\n yes: options.yes as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n // 保留自然退出,让终端/管道中的失败详情写完。\n process.exitCode = 1\n }\n })\n\n// 增量添加模块\ncli\n .command('add [module]', '向现有项目添加模块')\n .option('--no-install', '不安装依赖')\n .action(async (module: string | undefined, options: Record<string, unknown>) => {\n try {\n await addModule({\n module: module as FeatureId,\n install: options.install as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n process.exit(1)\n }\n })\n\n// 初始化/校验配置\ncli\n .command('init', '初始化/校验项目配置')\n .option('-f, --force', '强制重新生成配置')\n .action(async (options: Record<string, unknown>) => {\n try {\n await initProject({\n force: options.force as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n process.exit(1)\n }\n })\n\n// 代码生成命令\ncli\n .command('generate [type] [name]', '生成代码')\n .alias('g')\n .option('-o, --output <path>', '输出路径')\n .option('-f, --force', '覆盖现有文件')\n .action(async (type: string | undefined, name: string | undefined, options: Record<string, unknown>) => {\n try {\n await generate({\n type: type as GeneratorType,\n name: name ?? '',\n output: options.output as string,\n force: options.force as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n process.exit(1)\n }\n })\n\n// 部署命令\ncli\n .command('deploy [appDir]', '部署应用到云平台')\n .option('--project-name <name>', '项目名称(默认从 package.json 读取)')\n .option('--skip-provision', '跳过基础设施开通')\n .option('--skip-build', '跳过构建')\n .action(async (appDir: string | undefined, options: Record<string, unknown>) => {\n try {\n await deployCommand({\n appDir,\n projectName: options.projectName as string,\n skipProvision: options.skipProvision as boolean,\n skipBuild: options.skipBuild as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n process.exit(1)\n }\n })\n\n// 快捷生成命令\ncli\n .command('g:page <name>', '生成页面')\n .action(async (name: string, options: Record<string, unknown>) => {\n await generate({ type: 'page', name, cwd: options.cwd as string })\n })\n\ncli\n .command('g:component <name>', '生成组件')\n .action(async (name: string, options: Record<string, unknown>) => {\n await generate({ type: 'component', name, cwd: options.cwd as string })\n })\n\ncli\n .command('g:api <name>', '生成 API')\n .action(async (name: string, options: Record<string, unknown>) => {\n await generate({ type: 'api', name, cwd: options.cwd as string })\n })\n\ncli\n .command('g:model <name>', '生成数据模型')\n .action(async (name: string, options: Record<string, unknown>) => {\n await generate({ type: 'model', name, cwd: options.cwd as string })\n })\n\n// 版本和帮助\ncli.version(VERSION)\ncli.help()\n\n// 解析参数\nconst parsed = cli.parse()\n\n// 无命令且未请求帮助/版本时显示帮助\nif (!cli.matchedCommand && !parsed.options.help && !parsed.options.version) {\n writeCliMessage('')\n writeCliMessage(chalk.cyan('hai Agent Framework CLI'))\n writeCliMessage('')\n cli.outputHelp()\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli-utils.ts","../src/commands/cli-template-engine.ts","../src/commands/cli-create.ts","../src/commands/cli-add.ts","../src/commands/cli-deploy-middleware.ts","../src/commands/cli-deploy.ts","../src/commands/cli-generate.ts","../src/commands/cli-init.ts","../src/cli-main.ts"],"names":["process","fs","path","Handlebars","fileURLToPath","DEFAULT_FULLSTACK_FRONTENDS","fse","generateConfigFile","ora","chalk","prompts","generatedFiles","pkg","execSync","parsed","core","previous","existsSync"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @h-ai/cli — 工具函数\n * @module cli-utils\n */\n\nimport type { TemplateContext } from './cli-types.js'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { fileURLToPath } from 'node:url'\nimport { wrapAnsi } from 'fast-wrap-ansi'\nimport fs from 'fs-extra'\nimport Handlebars from 'handlebars'\n\nconst CAMEL_CASE_SEPARATOR_REGEX = /[-_\\s]+(.)?/g\nconst LEADING_CHAR_REGEX = /^./\n\n/** CLI 交互提示直接写终端,不能交给异步 JSON 日志 transport。 */\nexport function writeCliMessage(message: string): void {\n process.stdout.write(`${message}\\n`)\n}\n\n/** 显示异常的 message,保留子命令输出;Error 的不可枚举属性不能依赖 JSON 序列化。 */\nexport function writeCliError(message: string, error?: unknown): void {\n process.stderr.write(`${message}\\n`)\n if (error !== undefined)\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`)\n}\n\n/** 显式按显示宽度换行,为 prompts 的前缀和缩进预留空间,避免中文自动折行后擦除不足。 */\nexport function formatPromptDescription(description: string): string {\n return wrapAnsi(description, Math.max(1, (process.stdout.columns || 80) - 32), { hard: true })\n}\n\n/**\n * 转换为驼峰命名\n */\nexport function toCamelCase(str: string): string {\n return str\n .replace(CAMEL_CASE_SEPARATOR_REGEX, (_, c) => c ? c.toUpperCase() : '')\n .replace(LEADING_CHAR_REGEX, c => c.toLowerCase())\n}\n\n/**\n * 转换为帕斯卡命名\n */\nexport function toPascalCase(str: string): string {\n const camel = toCamelCase(str)\n return camel.charAt(0).toUpperCase() + camel.slice(1)\n}\n\n/**\n * 转换为短横线命名\n */\nexport function toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase()\n}\n\n/**\n * 转换为下划线命名\n */\nexport function toSnakeCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s-]+/g, '_')\n .toLowerCase()\n}\n\n/**\n * 创建模板上下文\n */\nexport function createTemplateContext(name: string, extra: Record<string, unknown> = {}): TemplateContext {\n return {\n camelCase: toCamelCase(name),\n pascalCase: toPascalCase(name),\n kebabCase: toKebabCase(name),\n snakeCase: toSnakeCase(name),\n ...extra,\n }\n}\n\n/**\n * 渲染模板\n */\nexport function renderTemplate(template: string, context: TemplateContext): string {\n const compiled = Handlebars.compile(template, { noEscape: true })\n return compiled(context)\n}\n\n/**\n * 渲染模板文件\n */\nexport async function renderTemplateFile(\n templatePath: string,\n context: TemplateContext,\n): Promise<string> {\n const template = await fs.readFile(templatePath, 'utf-8')\n return renderTemplate(template, context)\n}\n\n/**\n * 写入文件(创建目录)\n */\nexport async function writeFile(filePath: string, content: string): Promise<void> {\n await fs.ensureDir(path.dirname(filePath))\n await fs.writeFile(filePath, content, 'utf-8')\n}\n\n/**\n * 检查文件是否存在\n */\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath)\n return true\n }\n catch {\n return false\n }\n}\n\n/**\n * 获取包版本\n */\nexport async function getPackageVersion(pkgPath: string): Promise<string | null> {\n try {\n const pkg = await fs.readJson(pkgPath)\n return pkg.version\n }\n catch {\n return null\n }\n}\n\n/**\n * 读取 CLI 自身版本号\n *\n * 从当前模块所在目录向上查找 `@h-ai/cli` 的 package.json,\n * 兼容源码布局(src/)与打包产物布局(dist/)以及 npm 安装后的 node_modules 布局。\n * 用于生成项目时固定 `@h-ai/*` 依赖版本,避免硬编码与预发布版本漂移。\n */\nexport function getCliVersion(): string {\n let dir = path.dirname(fileURLToPath(import.meta.url))\n for (let i = 0; i < 6; i++) {\n try {\n const pkg = fs.readJsonSync(path.join(dir, 'package.json')) as { name?: string, version?: string }\n if (pkg.name === '@h-ai/cli')\n return pkg.version ?? '0.0.0'\n }\n catch {\n // 当前目录无 package.json,继续向上查找\n }\n const parent = path.dirname(dir)\n if (parent === dir)\n break\n dir = parent\n }\n return '0.0.0'\n}\n\n/**\n * 检测包管理器\n */\nexport async function detectPackageManager(cwd: string): Promise<'pnpm' | 'npm' | 'yarn'> {\n if (await fileExists(path.join(cwd, 'pnpm-lock.yaml'))) {\n return 'pnpm'\n }\n if (await fileExists(path.join(cwd, 'yarn.lock'))) {\n return 'yarn'\n }\n return 'npm'\n}\n\n/**\n * 格式化字节\n */\nexport function formatBytes(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB']\n let size = bytes\n let unitIndex = 0\n\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024\n unitIndex++\n }\n\n return `${size.toFixed(1)} ${units[unitIndex]}`\n}\n\n/**\n * 格式化时间\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`\n }\n return `${(ms / 1000).toFixed(2)}s`\n}\n\n/**\n * 注册 Handlebars helpers\n */\nexport function registerHelpers(): void {\n // 条件判断\n Handlebars.registerHelper('if_eq', function (this: unknown, a: unknown, b: unknown, options: Handlebars.HelperOptions) {\n return a === b ? options.fn(this) : options.inverse(this)\n })\n\n // 日期格式化\n Handlebars.registerHelper('date', () => {\n return new Date().toISOString().split('T')[0]\n })\n\n // 年份\n Handlebars.registerHelper('year', () => {\n return new Date().getFullYear()\n })\n\n // 大写\n Handlebars.registerHelper('upper', (str: string) => {\n return str.toUpperCase()\n })\n\n // 小写\n Handlebars.registerHelper('lower', (str: string) => {\n return str.toLowerCase()\n })\n}\n\n// 初始化时注册 helpers\nregisterHelpers()\n","/**\n * @h-ai/cli — 模板引擎\n *\n * 基于模板目录的项目生成逻辑:\n * 1. 拷贝 base 模板(骨架)\n * 2. 拷贝 apps/{type} 模板(应用类型路由)\n * 3. 叠加 features/{feat} 模板(可选功能路由,静态文件)\n * 4. 渲染 Handlebars 动态模板(base + apps + features 的 .hbs 文件)\n * 5. 拷贝 i18n 脚手架(project.inlang + messages)(当 hasI18n 为 true)\n *\n * @module cli-template-engine\n */\n\nimport type { AppType, FeatureId, FrontendTarget, ModuleConfigs } from '../cli-types.js'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport fse from 'fs-extra'\nimport Handlebars from 'handlebars'\nimport { stringify } from 'yaml'\nimport { getCliVersion } from '../cli-utils.js'\nimport { parameterizeConfig } from './cli-config-environment.js'\nimport { generateConfigFile } from './cli-config-templates.js'\n\n// 注册自定义 Handlebars helpers\nHandlebars.registerHelper('if_eq', function (this: unknown, a: unknown, b: unknown, options: Handlebars.HelperOptions) {\n return a === b ? options.fn(this) : options.inverse(this)\n})\n\n// 配置中的显示名称可包含引号、空格和换行,嵌入 TS / JSON / YAML 时必须作为字面量编码。\nHandlebars.registerHelper('json', (value: unknown) => JSON.stringify(value))\nHandlebars.registerHelper('html', (value: string) => Handlebars.escapeExpression(value))\nHandlebars.registerHelper('yaml', (key: string, value: unknown) => stringify({ [key]: value }).trim())\nHandlebars.registerHelper('jsString', (value: string) => `'${JSON.stringify(value).slice(1, -1).replace(/\\\\\"/g, '\"').replace(/'/g, '\\\\\\'')}'`)\n\n// 同一份模块配置供直接渲染和 create 命令使用,避免精简配置覆盖完整模板。\n// 未选择的模块只输出注释;说明也加两层注释,整文件去掉外层后仍是合法 YAML。\nHandlebars.registerHelper('moduleConfig', function (this: TemplateContext, moduleKey: string, enabled: boolean) {\n // 文件模板自身保留结尾换行,helper 不再重复输出空行。\n const content = generateConfigFile(moduleKey, this.moduleConfigs).trimEnd()\n const configured = this.appType === 'fullstack' && moduleKey === 'iam'\n ? content.replace('HAI_IAM_SEEDDEFAULTDATA:true', 'HAI_IAM_SEEDDEFAULTDATA:false').replace('variant: card', 'variant: split')\n : content\n return enabled\n ? configured\n : `# # 未启用:安装对应模块并在服务端 runtime 中初始化,再取消所需配置的注释。\\n${configured.split('\\n').map(line => line ? `# ${line}` : '').join('\\n')}`\n})\n\nconst TEMPLATE_SKIP_IF_EMPTY_MARKER = '@skipIfEmpty'\nconst NORMALIZED_RENDER_EXTENSIONS = new Set(['.ts', '.js', '.svelte', '.json', '.css'])\n\n// Capacitor 应用为纯客户端 SPA(Svelte 5 + Vite),没有服务端运行时。\n// 服务端专属产物(hooks、server init)必须跳过,否则预渲染会因访问 url.searchParams 报错。\nconst CAPACITOR_SKIPPED_SERVER_FILES = new Set([\n 'src/hooks.server.ts',\n 'src/lib/server/init.ts',\n])\n\n// 以下版本号与生成项目的 pnpm-workspace.yaml catalog 保持一致;\n// 单包脚手架直接写具体版本,pnpm fullstack workspace 会通过 catalog: 引用这些版本。\nconst VERSIONS = {\n antfuEslintConfig: '^9.5.1',\n capacitorSecureStorage: '^8.0.1',\n // UI / Icon\n bitsUi: '^2.19.5',\n iconifyJsonTabler: '^1.2.42',\n iconifyTailwind: '^1.2.3',\n // Capacitor\n capacitorAndroid: '^8.5.3',\n capacitorApp: '^8.1.2',\n capacitorCamera: '^8.2.5',\n capacitorCli: '^8.5.3',\n capacitorCore: '^8.5.3',\n capacitorDevice: '^8.0.3',\n capacitorIos: '^8.5.3',\n capacitorPreferences: '^8.0.1',\n capacitorPushNotifications: '^8.1.3',\n capacitorStatusBar: '^8.0.4',\n // Tailwind / DaisyUI\n daisyui: '^5.7.47',\n tailwindcss: '^4.3.3',\n tailwindcssVite: '^4.3.3',\n // i18n\n inlangParaglide: '^2.27.0',\n inlangMessageFormat: '^4.5.0',\n // Svelte / Vite\n svelte: '^5.57.2',\n svelteKit: '^2.70.3',\n svelteAdapterNode: '^5.5.7',\n svelteCheck: '^4.7.6',\n sveltePlugin: '^7.3.1',\n // Build / Test\n vite: '^8.3.4',\n vitest: '^4.1.11',\n tsup: '^8.5.1',\n rimraf: '^6.1.3',\n // ESLint\n eslint: '^10.12.0',\n eslintPluginFormat: '^2.0.1',\n eslintPluginSvelte: '^3.23.1',\n svelteEslintParser: '^1.9.0',\n // Node / TS\n nodeTypes: '^26.6.5',\n // Svelte / ESLint / tsup 继续使用稳定的 JavaScript 编译 API。\n typescript: '^6.0.3',\n // E2E\n playwright: '^1.64.0',\n // Validation\n zod: '^4.6.5',\n // Tauri\n tauriCli: '^2.12.1',\n} as const\n\ntype ImplementedFrontendTarget = Exclude<FrontendTarget, 'miniapp'>\n\nconst FRONTEND_PORTS_DEFAULT: Record<ImplementedFrontendTarget, number> = {\n web: 4173,\n app: 5175,\n desktop: 5176,\n}\n\nconst FRONTEND_LABELS: Record<FrontendTarget, string> = {\n web: 'Web',\n app: 'App',\n miniapp: 'Miniapp',\n desktop: 'Desktop',\n}\n\nconst IMPLEMENTED_FRONTENDS: readonly FrontendTarget[] = ['web', 'app', 'desktop']\nconst DEFAULT_FULLSTACK_FRONTENDS: readonly FrontendTarget[] = ['web', 'app', 'desktop']\nconst DEFAULT_THEMES = ['light', 'dark'] as const\nconst DEFAULT_THEME_NAME = 'light'\n// 框架与模板同步发布;范围版本会把旧命名 alpha9 视为比 alpha.58 更新。\nconst HAI_PACKAGE_VERSION = getCliVersion()\nconst HAI_PACKAGE_SPECIFIER_CATALOG = 'catalog:'\ntype FullstackPackageSpecifiers = { [Key in keyof typeof VERSIONS]: string }\ntype CatalogPackageVersions = Readonly<Record<string, string>>\n\nconst HAI_CATALOG_PACKAGE_NAMES = [\n '@h-ai/ai',\n '@h-ai/api-client',\n '@h-ai/api-contract',\n '@h-ai/audit',\n '@h-ai/cache',\n '@h-ai/capacitor',\n '@h-ai/core',\n '@h-ai/crypto',\n '@h-ai/datapipe',\n '@h-ai/deploy',\n '@h-ai/iam',\n '@h-ai/kit',\n '@h-ai/payment',\n '@h-ai/reach',\n '@h-ai/reldb',\n '@h-ai/scheduler',\n '@h-ai/serv',\n '@h-ai/storage',\n '@h-ai/ui',\n '@h-ai/vecdb',\n] as const\nconst HAI_CATALOG_PACKAGES: Record<string, string> = Object.fromEntries(\n HAI_CATALOG_PACKAGE_NAMES.map(packageName => [packageName, HAI_PACKAGE_VERSION]),\n)\n\nconst FULLSTACK_EXTERNAL_CATALOG_PACKAGES: CatalogPackageVersions = {\n '@antfu/eslint-config': VERSIONS.antfuEslintConfig,\n '@aparajita/capacitor-secure-storage': VERSIONS.capacitorSecureStorage,\n '@capacitor/android': VERSIONS.capacitorAndroid,\n '@capacitor/app': VERSIONS.capacitorApp,\n '@capacitor/camera': VERSIONS.capacitorCamera,\n '@capacitor/cli': VERSIONS.capacitorCli,\n '@capacitor/core': VERSIONS.capacitorCore,\n '@capacitor/device': VERSIONS.capacitorDevice,\n '@capacitor/ios': VERSIONS.capacitorIos,\n '@capacitor/preferences': VERSIONS.capacitorPreferences,\n '@capacitor/push-notifications': VERSIONS.capacitorPushNotifications,\n '@capacitor/status-bar': VERSIONS.capacitorStatusBar,\n '@iconify-json/tabler': VERSIONS.iconifyJsonTabler,\n '@iconify/tailwind4': VERSIONS.iconifyTailwind,\n '@inlang/paraglide-js': VERSIONS.inlangParaglide,\n '@inlang/plugin-message-format': VERSIONS.inlangMessageFormat,\n '@playwright/test': VERSIONS.playwright,\n '@sveltejs/vite-plugin-svelte': VERSIONS.sveltePlugin,\n '@tailwindcss/vite': VERSIONS.tailwindcssVite,\n '@tauri-apps/cli': VERSIONS.tauriCli,\n '@types/node': VERSIONS.nodeTypes,\n 'bits-ui': VERSIONS.bitsUi,\n 'daisyui': VERSIONS.daisyui,\n 'eslint': VERSIONS.eslint,\n 'eslint-plugin-format': VERSIONS.eslintPluginFormat,\n 'eslint-plugin-svelte': VERSIONS.eslintPluginSvelte,\n 'rimraf': VERSIONS.rimraf,\n 'svelte': VERSIONS.svelte,\n 'svelte-check': VERSIONS.svelteCheck,\n 'svelte-eslint-parser': VERSIONS.svelteEslintParser,\n 'tailwindcss': VERSIONS.tailwindcss,\n 'tsup': VERSIONS.tsup,\n 'typescript': VERSIONS.typescript,\n 'vite': VERSIONS.vite,\n 'vitest': VERSIONS.vitest,\n 'zod': VERSIONS.zod,\n}\n\nconst FULLSTACK_CATALOG_PACKAGES: CatalogPackageVersions = {\n ...HAI_CATALOG_PACKAGES,\n ...FULLSTACK_EXTERNAL_CATALOG_PACKAGES,\n}\n\nconst FULLSTACK_ROOT_CATALOG_PACKAGE_NAMES = [\n '@antfu/eslint-config',\n '@playwright/test',\n '@sveltejs/vite-plugin-svelte',\n '@types/node',\n 'eslint',\n 'eslint-plugin-format',\n 'eslint-plugin-svelte',\n 'rimraf',\n 'svelte',\n 'svelte-check',\n 'svelte-eslint-parser',\n 'tsup',\n 'typescript',\n 'vite',\n 'vitest',\n] as const\n\nconst FULLSTACK_CONTRACT_CATALOG_PACKAGE_NAMES = [\n '@h-ai/api-contract',\n '@h-ai/core',\n 'zod',\n] as const\n\nconst FULLSTACK_SERV_CATALOG_PACKAGE_NAMES = [\n '@h-ai/audit',\n '@h-ai/cache',\n '@h-ai/core',\n '@h-ai/crypto',\n '@h-ai/iam',\n '@h-ai/reach',\n '@h-ai/reldb',\n '@h-ai/serv',\n '@h-ai/storage',\n 'zod',\n] as const\n\nconst FULLSTACK_SHARED_CATALOG_PACKAGE_NAMES = [\n '@h-ai/api-client',\n '@h-ai/api-contract',\n '@h-ai/core',\n '@h-ai/crypto',\n '@h-ai/ui',\n '@inlang/paraglide-js',\n '@inlang/plugin-message-format',\n 'svelte',\n 'svelte-check',\n 'typescript',\n 'vite',\n 'vitest',\n] as const\n\nconst FULLSTACK_WEB_CATALOG_PACKAGE_NAMES = [\n '@antfu/eslint-config',\n '@h-ai/ui',\n '@iconify-json/tabler',\n '@iconify/tailwind4',\n '@inlang/paraglide-js',\n '@inlang/plugin-message-format',\n '@sveltejs/vite-plugin-svelte',\n '@tailwindcss/vite',\n 'bits-ui',\n 'daisyui',\n 'eslint',\n 'eslint-plugin-format',\n 'eslint-plugin-svelte',\n 'svelte',\n 'svelte-check',\n 'svelte-eslint-parser',\n 'tailwindcss',\n 'typescript',\n 'vite',\n 'vitest',\n] as const\n\nconst FULLSTACK_APP_CATALOG_PACKAGE_NAMES = [\n ...FULLSTACK_WEB_CATALOG_PACKAGE_NAMES,\n '@aparajita/capacitor-secure-storage',\n '@capacitor/android',\n '@capacitor/app',\n '@capacitor/camera',\n '@capacitor/cli',\n '@capacitor/core',\n '@capacitor/device',\n '@capacitor/ios',\n '@capacitor/preferences',\n '@capacitor/push-notifications',\n '@capacitor/status-bar',\n '@h-ai/capacitor',\n] as const\n\nconst FULLSTACK_DESKTOP_CATALOG_PACKAGE_NAMES = [\n ...FULLSTACK_WEB_CATALOG_PACKAGE_NAMES,\n '@tauri-apps/cli',\n] as const\n\nconst API_WORKSPACE_EXTERNAL_CATALOG_PACKAGE_NAMES = [\n '@antfu/eslint-config',\n '@playwright/test',\n '@types/node',\n 'eslint',\n 'eslint-plugin-format',\n 'rimraf',\n 'tsup',\n 'typescript',\n 'vitest',\n 'zod',\n] as const\n\nfunction pickCatalogPackages(\n packageNames: readonly string[],\n availableCatalogPackages: CatalogPackageVersions,\n): Record<string, string> {\n return Object.fromEntries(\n [...new Set(packageNames)]\n .sort((left, right) => left.localeCompare(right))\n .map((packageName) => {\n const version = availableCatalogPackages[packageName]\n if (!version) {\n throw new Error(`Missing catalog version for package \"${packageName}\"`)\n }\n return [packageName, version]\n }),\n )\n}\n\nfunction buildFullstackPackageSpecifiers(useCatalogProtocol: boolean): FullstackPackageSpecifiers {\n return Object.fromEntries(\n Object.entries(VERSIONS).map(([key, version]) => [key, useCatalogProtocol ? HAI_PACKAGE_SPECIFIER_CATALOG : version]),\n ) as FullstackPackageSpecifiers\n}\n\nfunction buildApiWorkspaceCatalogPackages(featureMap: Record<string, boolean>): Record<string, string> {\n const packageNames: string[] = [\n ...API_WORKSPACE_EXTERNAL_CATALOG_PACKAGE_NAMES,\n '@h-ai/api-client',\n '@h-ai/api-contract',\n '@h-ai/core',\n '@h-ai/serv',\n ]\n\n if (featureMap.db)\n packageNames.push('@h-ai/reldb')\n if (featureMap.cache)\n packageNames.push('@h-ai/cache')\n if (featureMap.iam)\n packageNames.push('@h-ai/iam')\n if (featureMap.crypto)\n packageNames.push('@h-ai/crypto')\n if (featureMap.storage)\n packageNames.push('@h-ai/storage')\n if (featureMap.ai)\n packageNames.push('@h-ai/ai')\n if (featureMap.audit)\n packageNames.push('@h-ai/audit')\n if (featureMap.reach)\n packageNames.push('@h-ai/reach')\n if (featureMap.payment)\n packageNames.push('@h-ai/payment')\n if (featureMap.vecdb)\n packageNames.push('@h-ai/vecdb')\n if (featureMap.datapipe)\n packageNames.push('@h-ai/datapipe')\n if (featureMap.scheduler)\n packageNames.push('@h-ai/scheduler')\n if (featureMap.deploy)\n packageNames.push('@h-ai/deploy')\n\n return pickCatalogPackages(packageNames, FULLSTACK_CATALOG_PACKAGES)\n}\n\nfunction buildAppHaiCatalogPackages(options: {\n featureMap: Record<string, boolean>\n hasUi: boolean\n isCapacitorApp: boolean\n isSvelteOnlyApp: boolean\n}): Record<string, string> {\n const packageNames: string[] = []\n\n if (options.isSvelteOnlyApp) {\n packageNames.push('@h-ai/api-client', '@h-ai/api-contract', '@h-ai/capacitor', '@h-ai/ui')\n return pickCatalogPackages(packageNames, HAI_CATALOG_PACKAGES)\n }\n\n packageNames.push('@h-ai/core', '@h-ai/kit')\n if (options.hasUi)\n packageNames.push('@h-ai/ui')\n if (options.featureMap.db)\n packageNames.push('@h-ai/reldb')\n if (options.featureMap.cache)\n packageNames.push('@h-ai/cache')\n if (options.featureMap.iam)\n packageNames.push('@h-ai/iam')\n if (options.featureMap.crypto)\n packageNames.push('@h-ai/crypto')\n if (options.featureMap.storage)\n packageNames.push('@h-ai/storage')\n if (options.featureMap.ai)\n packageNames.push('@h-ai/ai')\n if (options.featureMap.audit)\n packageNames.push('@h-ai/audit')\n if (options.featureMap.reach)\n packageNames.push('@h-ai/reach')\n if (options.featureMap.payment)\n packageNames.push('@h-ai/payment')\n if (options.featureMap.vecdb)\n packageNames.push('@h-ai/vecdb')\n if (options.featureMap.datapipe)\n packageNames.push('@h-ai/datapipe')\n if (options.featureMap.scheduler)\n packageNames.push('@h-ai/scheduler')\n if (options.featureMap.deploy)\n packageNames.push('@h-ai/deploy')\n if (options.featureMap['api-client'])\n packageNames.push('@h-ai/api-client')\n if (options.featureMap.capacitor)\n packageNames.push('@h-ai/capacitor')\n if (options.isCapacitorApp && !options.featureMap['api-client'])\n packageNames.push('@h-ai/api-client')\n if (options.isCapacitorApp && !options.featureMap.capacitor)\n packageNames.push('@h-ai/capacitor')\n\n return pickCatalogPackages(packageNames, HAI_CATALOG_PACKAGES)\n}\n\nfunction buildFullstackCatalogPackages(frontends: readonly FrontendTarget[], deploy = false): Record<string, string> {\n const packageNames: string[] = [\n ...FULLSTACK_ROOT_CATALOG_PACKAGE_NAMES,\n ...FULLSTACK_CONTRACT_CATALOG_PACKAGE_NAMES,\n ...FULLSTACK_SERV_CATALOG_PACKAGE_NAMES,\n ...FULLSTACK_SHARED_CATALOG_PACKAGE_NAMES,\n ]\n\n if (frontends.includes('web'))\n packageNames.push(...FULLSTACK_WEB_CATALOG_PACKAGE_NAMES)\n if (frontends.includes('app'))\n packageNames.push(...FULLSTACK_APP_CATALOG_PACKAGE_NAMES)\n if (frontends.includes('desktop'))\n packageNames.push(...FULLSTACK_DESKTOP_CATALOG_PACKAGE_NAMES)\n if (deploy)\n packageNames.push('@h-ai/deploy')\n\n return pickCatalogPackages(packageNames, FULLSTACK_CATALOG_PACKAGES)\n}\n\n// =============================================================================\n// 类型\n// =============================================================================\n\n/**\n * 模板渲染上下文\n */\nexport interface TemplateContext {\n /** 所有应用模板共用的第三方依赖版本,避免单包与 workspace 版本表漂移。 */\n versions: typeof VERSIONS\n /** 项目名称 */\n projectName: string\n /** 是否对 @h-ai/* 依赖启用 pnpm catalog 协议 */\n useCatalogProtocol: boolean\n /** @h-ai/* 依赖写入 package.json 时使用的版本说明符 */\n haiPackageSpecifier: string\n /** 生成项目时引用的 @h-ai/* 发布版本 */\n haiPackageVersion: string\n /** 生成项目时写入 pnpm-workspace.yaml 的 catalog 条目 */\n haiCatalogPackages: Record<string, string>\n /** 应用类型 */\n appType: AppType\n /** 选中的 feature 集合(用于 {{#if features.xxx}}) */\n features: Record<string, boolean>\n /** 创建时指定的模块配置;配置模板需保留这些值。 */\n moduleConfigs?: ModuleConfigs\n /** 是否有 UI(非 api / fullstack 类型) */\n hasUi: boolean\n /** 是否有 i18n(非 api / fullstack 类型) */\n hasI18n: boolean\n /** 是否为 Capacitor 原生移动应用(mobile-app) */\n isCapacitorApp: boolean\n /** 是否为 API workspace(service + contract) */\n isApiWorkspace: boolean\n /** 是否为不依赖 SvelteKit 的纯 Svelte 5 应用 */\n isSvelteOnlyApp: boolean\n /** 默认语言 */\n defaultLocale: string\n /** 包管理器 */\n packageManager: string\n /** API workspace 专用上下文 */\n api?: ApiWorkspaceTemplateContext\n /** 前后端分离工程专用上下文 */\n fullstack?: FullstackTemplateContext\n}\n\nexport interface ApiWorkspaceTemplateContext {\n /** 依赖版本集合 */\n versions: typeof VERSIONS\n /** 写入 package.json 的依赖说明符(pnpm 时为 catalog:) */\n packageSpecifiers: FullstackPackageSpecifiers\n /** 共享 contract 包名 */\n contractPackageName: string\n /** 共享 contract 导出变量名 */\n contractExportName: string\n /** 后端 service 包名 */\n servicePackageName: string\n /** Service App 工厂函数名 */\n serviceAppFactoryName: string\n /** procedures 聚合函数名 */\n serviceProceduresFactoryName: string\n}\n\nexport interface FullstackFrontendApp {\n /** 前端目标 */\n target: ImplementedFrontendTarget\n /** 包名 */\n packageName: string\n /** 展示名称 */\n label: string\n /** 本地端口 */\n port: number\n}\n\n/**\n * 国际化配置(已解析后的最终值)\n */\nexport interface FullstackI18nContext {\n baseLocale: string\n locales: readonly string[]\n}\n\n/**\n * 主题配置(已解析后的最终值)\n */\nexport interface FullstackThemeContext {\n defaultTheme: string\n themes: readonly string[]\n}\n\nexport interface FullstackTemplateContext {\n /** 显示名称来自 core 配置。 */\n appName: string\n /** 依赖版本集合 */\n versions: typeof VERSIONS\n /** 写入 package.json 的依赖说明符(pnpm 时为 catalog:) */\n packageSpecifiers: FullstackPackageSpecifiers\n /** 共享 contract 包名 */\n contractPackageName: string\n /** 共享 contract 导出变量名 */\n contractExportName: string\n /** 后端 service 包名 */\n servPackageName: string\n /** 原生壳 appId / bundle identifier 使用的安全短名 */\n nativeAppIdSegment: string\n /** 前端共享代码包名 */\n sharedPackageName: string\n /** 所有已选择前端 */\n selectedFrontends: readonly FrontendTarget[]\n /** 已选择前端 JSON 字面量 */\n selectedFrontendsJson: string\n /** 可运行前端应用 */\n frontendApps: readonly FullstackFrontendApp[]\n /** Playwright 默认验证前端 */\n e2eFrontend?: FullstackFrontendApp\n /** 前端选择布尔表,用于模板条件创建 */\n frontends: Record<FrontendTarget, boolean>\n /** 各前端端口(key 为 target) */\n ports: Record<ImplementedFrontendTarget, number>\n /** 是否选择小程序预留 */\n hasMiniapp: boolean\n /** i18n 配置 */\n i18n: FullstackI18nContext\n /** 主题配置 */\n theme: FullstackThemeContext\n}\n\n/**\n * feature 对应的路由目录映射\n *\n * 每个 feature 可以有:\n * - `routes-shared/` — 所有应用类型共用(如 API 端点)\n * - `routes-{appType}/` — 特定应用类型专用(如 UI 页面)\n * - `routes/` — 通用路由(任何类型都拷贝)\n */\nconst FEATURE_ROUTE_DIRS: Record<string, string[]> = {\n iam: ['routes-shared'],\n storage: ['routes'],\n ai: ['routes'],\n payment: ['routes'],\n vecdb: ['routes'],\n datapipe: ['routes'],\n reach: ['routes'],\n scheduler: ['routes'],\n audit: ['routes'],\n}\n\n/**\n * feature 的 appType 专用路由\n */\nconst FEATURE_APP_ROUTE_DIRS: Record<string, string[]> = {\n iam: ['admin', 'h5', 'website'],\n}\n\nconst FEATURE_ID_REGEX = /^[a-z0-9-]+$/\nconst HBS_SUFFIX_REGEX = /\\.hbs$/\nconst FULLSTACK_FRONTEND_TEMPLATE_PATH_REGEX = /^apps\\/\\{\\{projectName\\}\\}-(web|app|desktop|miniapp)\\//\nconst NON_IDENTIFIER_CHAR_REGEX = /[^a-z0-9]+/i\nconst IDENTIFIER_START_REGEX = /^[a-z_$]/i\n\n// =============================================================================\n// 路径工具\n// =============================================================================\n\n/**\n * 获取 templates/ 目录的绝对路径\n *\n * 兼容两种运行环境:\n * - 构建后:dist/cli-template-engine.js → ../templates\n * - 测试时:src/commands/cli-template-engine.ts → ../../templates\n */\nfunction getTemplatesRoot(): string {\n const currentDir = path.dirname(fileURLToPath(import.meta.url))\n // 优先尝试 dist 模式(../templates),再尝试 src 模式(../../templates)\n const distPath = path.resolve(currentDir, '..', 'templates')\n if (fse.pathExistsSync(distPath)) {\n return distPath\n }\n return path.resolve(currentDir, '..', '..', 'templates')\n}\n\n// =============================================================================\n// 拷贝工具\n// =============================================================================\n\n/**\n * 拷贝目录,自动跳过 .hbs 文件(这些由 renderDynamicFiles 处理)\n *\n * @param src - 源目录\n * @param dest - 目标目录\n * @param excludePaths - 需要排除的相对路径前缀(如 'messages')\n */\nasync function copyStaticDir(src: string, dest: string, excludePaths?: string[]): Promise<void> {\n if (!(await fse.pathExists(src))) {\n return\n }\n\n await fse.copy(src, dest, {\n overwrite: true,\n filter: (filePath: string) => {\n const rel = path.relative(src, filePath)\n // 含 Handlebars 占位符的路径必须走动态渲染,避免复制出字面量目录\n if (rel.includes('{{') || rel.includes('}}')) {\n return false\n }\n // 跳过 .hbs 模板文件\n if (filePath.endsWith('.hbs')) {\n return false\n }\n // 跳过排除路径\n if (excludePaths && excludePaths.length > 0) {\n return !excludePaths.some(p => rel === p || rel.startsWith(`${p}${path.sep}`))\n }\n return true\n },\n })\n}\n\n/**\n * 查找目录中所有 .hbs 文件并返回相对路径\n */\nasync function findHbsFiles(dir: string): Promise<string[]> {\n if (!(await fse.pathExists(dir))) {\n return []\n }\n\n const results: string[] = []\n\n async function walk(current: string): Promise<void> {\n const entries = await fse.readdir(current, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n await walk(fullPath)\n }\n else if (entry.name.endsWith('.hbs')) {\n results.push(path.relative(dir, fullPath))\n }\n }\n }\n\n await walk(dir)\n return results\n}\n\n/**\n * 查找位于动态路径中的静态资源。\n *\n * 普通静态文件已经由 copyStaticDir 复制;这里专门补上带 Handlebars 路径片段\n * 的资源,例如 fullstack Tauri 图标目录。\n */\nasync function findRenderedStaticPathFiles(dir: string): Promise<string[]> {\n if (!(await fse.pathExists(dir))) {\n return []\n }\n\n const results: string[] = []\n\n async function walk(current: string): Promise<void> {\n const entries = await fse.readdir(current, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n await walk(fullPath)\n continue\n }\n\n const relPath = path.relative(dir, fullPath)\n if (!entry.name.endsWith('.hbs') && (relPath.includes('{{') || relPath.includes('}}'))) {\n results.push(relPath)\n }\n }\n }\n\n await walk(dir)\n return results\n}\n\n// =============================================================================\n// 构建上下文\n// =============================================================================\n\n/**\n * 根据用户选项构建模板渲染上下文\n */\nexport function buildTemplateContext(options: {\n name: string\n appType: AppType\n features: FeatureId[]\n frontends?: readonly FrontendTarget[]\n moduleConfigs?: ModuleConfigs\n packageManager: string\n}): TemplateContext {\n const featureMap: Record<string, boolean> = {}\n for (const f of options.features) {\n featureMap[f] = true\n }\n\n // fullstack 默认交付完整 mini 管理功能,不能移除其必需模块。\n if (options.appType === 'fullstack') {\n for (const feature of ['iam', 'db', 'cache', 'crypto', 'storage', 'audit']) featureMap[feature] = true\n }\n\n // 强制补全模块硬依赖,防止调用方未经过 resolveFeatureDependencies 时遗漏依赖\n // iam 依赖 reldb(用户/角色/权限持久化)和 cache(会话/OTP 缓存),以及 crypto(密码哈希)\n if (featureMap.iam) {\n featureMap.db = true\n featureMap.cache = true\n featureMap.crypto = true\n }\n // audit / scheduler / payment 依赖 reldb\n if (featureMap.audit || featureMap.scheduler || featureMap.payment) {\n featureMap.db = true\n }\n\n const isApi = options.appType === 'api'\n const isFullstack = options.appType === 'fullstack'\n const isCapacitorApp = options.appType === 'mobile-app'\n const isSvelteOnlyApp = isCapacitorApp\n const useCatalogProtocol = options.packageManager === 'pnpm'\n const hasUi = !isApi && !isFullstack\n const selectedFrontends = options.frontends ?? DEFAULT_FULLSTACK_FRONTENDS\n let haiCatalogPackages: TemplateContext['haiCatalogPackages']\n if (isFullstack) {\n haiCatalogPackages = buildFullstackCatalogPackages(selectedFrontends, featureMap.deploy)\n }\n else if (isApi) {\n haiCatalogPackages = buildApiWorkspaceCatalogPackages(featureMap)\n }\n else {\n haiCatalogPackages = buildAppHaiCatalogPackages({\n featureMap,\n hasUi,\n isCapacitorApp,\n isSvelteOnlyApp,\n })\n }\n\n return {\n projectName: options.name,\n versions: VERSIONS,\n useCatalogProtocol,\n haiPackageSpecifier: useCatalogProtocol ? HAI_PACKAGE_SPECIFIER_CATALOG : HAI_PACKAGE_VERSION,\n haiPackageVersion: HAI_PACKAGE_VERSION,\n haiCatalogPackages,\n appType: options.appType,\n features: featureMap,\n moduleConfigs: options.moduleConfigs,\n hasUi,\n hasI18n: !isApi && !isFullstack,\n isCapacitorApp,\n isApiWorkspace: isApi,\n isSvelteOnlyApp,\n defaultLocale: options.moduleConfigs?.core?.defaultLocale ?? 'zh-CN',\n packageManager: options.packageManager,\n api: isApi\n ? buildApiWorkspaceTemplateContext(options.name, useCatalogProtocol)\n : undefined,\n fullstack: isFullstack\n ? buildFullstackTemplateContext(\n options.name,\n selectedFrontends,\n options.moduleConfigs,\n useCatalogProtocol,\n )\n : undefined,\n }\n}\n\nfunction buildApiWorkspaceTemplateContext(\n projectName: string,\n useCatalogProtocol = false,\n): ApiWorkspaceTemplateContext {\n const identifier = toIdentifier(projectName)\n const pascalName = toPascalIdentifier(identifier)\n\n return {\n versions: VERSIONS,\n packageSpecifiers: buildFullstackPackageSpecifiers(useCatalogProtocol),\n contractPackageName: `${projectName}-contract`,\n contractExportName: `${identifier}Contract`,\n servicePackageName: `${projectName}-service`,\n serviceAppFactoryName: `create${pascalName}App`,\n serviceProceduresFactoryName: `create${pascalName}Procedures`,\n }\n}\n\nfunction buildFullstackTemplateContext(\n projectName: string,\n frontendsInput: readonly FrontendTarget[],\n moduleConfigs?: ModuleConfigs,\n useCatalogProtocol = false,\n): FullstackTemplateContext {\n const selectedFrontends = [...new Set(frontendsInput.length > 0 ? frontendsInput : DEFAULT_FULLSTACK_FRONTENDS)]\n\n const portsConfig = moduleConfigs?.fullstack?.ports ?? {}\n const portFor = (target: ImplementedFrontendTarget): number =>\n portsConfig[target] ?? FRONTEND_PORTS_DEFAULT[target]\n\n const frontendApps = selectedFrontends\n .filter(isImplementedFrontend)\n .map(target => ({\n target,\n packageName: `${projectName}-${target}`,\n label: FRONTEND_LABELS[target],\n port: portFor(target),\n }))\n\n return {\n appName: moduleConfigs?.core?.name ?? projectName,\n versions: VERSIONS,\n packageSpecifiers: buildFullstackPackageSpecifiers(useCatalogProtocol),\n contractPackageName: `${projectName}-contract`,\n contractExportName: `${toIdentifier(projectName)}Contract`,\n servPackageName: `${projectName}-serv`,\n nativeAppIdSegment: toIdentifier(projectName).toLowerCase(),\n sharedPackageName: `${projectName}-shared`,\n selectedFrontends,\n selectedFrontendsJson: `[${selectedFrontends.map(f => `'${f}'`).join(', ')}]`,\n frontendApps,\n e2eFrontend: frontendApps[0],\n frontends: {\n web: selectedFrontends.includes('web'),\n app: selectedFrontends.includes('app'),\n miniapp: selectedFrontends.includes('miniapp'),\n desktop: selectedFrontends.includes('desktop'),\n },\n ports: {\n web: portFor('web'),\n app: portFor('app'),\n desktop: portFor('desktop'),\n },\n hasMiniapp: selectedFrontends.includes('miniapp'),\n i18n: resolveI18nContext(moduleConfigs),\n theme: resolveThemeContext(moduleConfigs),\n }\n}\n\nfunction resolveI18nContext(moduleConfigs?: ModuleConfigs): FullstackI18nContext {\n const coreLocale = moduleConfigs?.core?.defaultLocale ?? 'zh-CN'\n const baseLocale = moduleConfigs?.fullstack?.i18n?.baseLocale ?? coreLocale\n const fallbackLocale = baseLocale === 'en-US' ? 'zh-CN' : 'en-US'\n const requested = moduleConfigs?.fullstack?.i18n?.locales\n const locales = requested && requested.length > 0\n ? [...new Set(requested)]\n : [baseLocale, fallbackLocale]\n if (!locales.includes(baseLocale)) {\n locales.unshift(baseLocale)\n }\n return { baseLocale, locales }\n}\n\nfunction resolveThemeContext(moduleConfigs?: ModuleConfigs): FullstackThemeContext {\n const defaultTheme = moduleConfigs?.fullstack?.theme?.defaultTheme ?? DEFAULT_THEME_NAME\n const requested = moduleConfigs?.fullstack?.theme?.themes\n const themes = requested && requested.length > 0\n ? [...new Set(requested)]\n : [...DEFAULT_THEMES]\n if (!themes.includes(defaultTheme)) {\n themes.unshift(defaultTheme)\n }\n return { defaultTheme, themes }\n}\n\nfunction isImplementedFrontend(target: FrontendTarget): target is ImplementedFrontendTarget {\n return IMPLEMENTED_FRONTENDS.includes(target)\n}\n\nfunction toIdentifier(value: string): string {\n const words = value\n .split(NON_IDENTIFIER_CHAR_REGEX)\n .filter(Boolean)\n const camel = words\n .map((word, index) => {\n const normalized = word.toLowerCase()\n return index === 0\n ? normalized\n : `${normalized.charAt(0).toUpperCase()}${normalized.slice(1)}`\n })\n .join('')\n if (!camel)\n return 'app'\n return IDENTIFIER_START_REGEX.test(camel) ? camel : `app${camel}`\n}\n\nfunction toPascalIdentifier(value: string): string {\n if (!value)\n return 'App'\n return `${value.charAt(0).toUpperCase()}${value.slice(1)}`\n}\n\n// =============================================================================\n// 核心:生成项目\n// =============================================================================\n\n/**\n * 从模板生成项目\n *\n * 执行流程:\n * 1. 拷贝 base 静态文件\n * 2. 拷贝 apps/{appType} 路由\n * 3. 叠加选中 feature 的路由\n * 4. 渲染所有 .hbs 动态模板\n *\n * @param projectPath - 项目目标目录\n * @param context - 模板渲染上下文\n */\nexport async function generateFromTemplates(\n projectPath: string,\n context: TemplateContext,\n): Promise<void> {\n const root = getTemplatesRoot()\n const includeBaseTemplate = context.appType !== 'fullstack' && !context.isApiWorkspace\n\n // ─── ① 拷贝 base 骨架(静态文件) ───\n if (includeBaseTemplate) {\n await copyStaticDir(path.join(root, 'base'), projectPath)\n }\n else {\n // API/fullstack 自有骨架,质量门禁仍复用单包模板的同一份规则。\n await fse.copy(path.join(root, 'base', 'eslint-rules.js'), path.join(projectPath, 'eslint-rules.js'))\n }\n\n // ─── ② 拷贝 apps/{appType} 路由 ───\n // messages/ 目录仅在 hasI18n 时拷贝\n const appDir = path.join(root, 'apps', context.appType)\n if (await fse.pathExists(appDir)) {\n const appExcludes = context.hasI18n ? [] : ['messages']\n await copyStaticDir(appDir, projectPath, appExcludes)\n }\n\n // ─── ③ 叠加 feature 路由 ───\n if (!context.isApiWorkspace && context.appType !== 'fullstack') {\n for (const featureId of Object.keys(context.features)) {\n if (context.isSvelteOnlyApp) {\n continue\n }\n\n if (!context.features[featureId]) {\n continue\n }\n\n // 安全校验:featureId 只允许字母、数字和连字符,防止路径遍历\n if (!FEATURE_ID_REGEX.test(featureId)) {\n continue\n }\n\n const featureDir = path.join(root, 'features', featureId)\n if (!(await fse.pathExists(featureDir))) {\n continue\n }\n\n // 通用路由(routes/)\n const sharedDirs = FEATURE_ROUTE_DIRS[featureId] || []\n for (const dirName of sharedDirs) {\n // Capacitor SPA 无服务端运行时,跳过服务端 API 路由(routes-shared)\n if (context.isCapacitorApp && dirName === 'routes-shared') {\n continue\n }\n const routesSrc = path.join(featureDir, dirName)\n if (await fse.pathExists(routesSrc)) {\n await copyStaticDir(routesSrc, path.join(projectPath, 'src', 'routes'))\n }\n }\n\n // appType 专用路由(routes-{appType})\n const appSpecificTypes = FEATURE_APP_ROUTE_DIRS[featureId] || []\n if (appSpecificTypes.includes(context.appType)) {\n const appRouteSrc = path.join(featureDir, `routes-${context.appType}`)\n if (await fse.pathExists(appRouteSrc)) {\n await copyStaticDir(appRouteSrc, path.join(projectPath, 'src', 'routes'))\n }\n }\n }\n }\n\n // ─── ④ 渲染 .hbs 动态模板 ───\n await renderDynamicFiles(root, projectPath, context)\n\n if (context.isSvelteOnlyApp || context.appType === 'fullstack') {\n const navigationDir = context.appType === 'fullstack'\n ? path.join(projectPath, 'packages', `${context.projectName}-shared`, 'src', 'lib', 'navigation')\n : path.join(projectPath, 'src', 'lib', 'navigation')\n await fse.copy(path.join(root, 'shared', 'hash-router.svelte.ts'), path.join(navigationDir, 'hash-router.svelte.ts'))\n }\n\n // ─── ⑤ 拷贝 i18n 脚手架(project.inlang + messages) ───\n if (context.hasI18n) {\n const i18nDir = path.join(root, 'i18n')\n if (await fse.pathExists(i18nDir)) {\n await fse.copy(i18nDir, projectPath, { overwrite: true })\n }\n }\n\n // ─── ⑥ 确保 static 目录存在 ───\n if (includeBaseTemplate) {\n await fse.ensureDir(path.join(projectPath, 'static'))\n }\n}\n\n// =============================================================================\n// 动态模板渲染\n// =============================================================================\n\n/**\n * 渲染所有 .hbs 文件:base、apps/{appType}、以及选中 feature 的路由目录\n *\n * base / apps 的 .hbs 渲染后输出到 projectPath 根目录;\n * feature 的 .hbs 渲染后输出到 projectPath/src/routes/。\n */\nasync function renderDynamicFiles(\n templatesRoot: string,\n projectPath: string,\n context: TemplateContext,\n): Promise<void> {\n // ── base + apps/{appType} → 输出到项目根 ──\n const rootDirs = context.appType === 'fullstack' || context.isApiWorkspace\n ? [path.join(templatesRoot, 'apps', context.appType)]\n : [\n path.join(templatesRoot, 'base'),\n path.join(templatesRoot, 'apps', context.appType),\n ]\n\n for (const dir of rootDirs) {\n await renderHbsInDir(dir, projectPath, context)\n await copyRenderedStaticPathFiles(dir, projectPath, context)\n }\n\n // ── feature 路由 → 输出到 src/routes/ ──\n if (context.isApiWorkspace || context.appType === 'fullstack') {\n return\n }\n\n const routesDest = path.join(projectPath, 'src', 'routes')\n for (const featureId of Object.keys(context.features)) {\n if (context.isSvelteOnlyApp) {\n continue\n }\n\n if (!context.features[featureId]) {\n continue\n }\n\n const featureDir = path.join(templatesRoot, 'features', featureId)\n if (!(await fse.pathExists(featureDir))) {\n continue\n }\n\n // 通用路由(routes-shared / routes 等)\n const sharedDirs = FEATURE_ROUTE_DIRS[featureId] || []\n for (const dirName of sharedDirs) {\n // Capacitor SPA 无服务端运行时,跳过服务端 API 路由(routes-shared)\n if (context.isCapacitorApp && dirName === 'routes-shared') {\n continue\n }\n await renderHbsInDir(path.join(featureDir, dirName), routesDest, context)\n }\n\n // appType 专用路由(routes-{appType})\n const appSpecificTypes = FEATURE_APP_ROUTE_DIRS[featureId] || []\n if (appSpecificTypes.includes(context.appType)) {\n await renderHbsInDir(\n path.join(featureDir, `routes-${context.appType}`),\n routesDest,\n context,\n )\n }\n }\n}\n\n/**\n * 渲染指定目录下所有 .hbs 文件并输出到目标目录(去掉 .hbs 后缀)\n */\nasync function renderHbsInDir(\n dir: string,\n destRoot: string,\n context: TemplateContext,\n): Promise<void> {\n const hbsFiles = await findHbsFiles(dir)\n for (const relPath of hbsFiles) {\n const srcPath = path.join(dir, relPath)\n const outRelPathTemplate = relPath.replace(HBS_SUFFIX_REGEX, '')\n\n const template = await fse.readFile(srcPath, 'utf-8')\n const compiled = Handlebars.compile(template, { noEscape: true })\n const rendered = compiled(context)\n if (shouldSkipRenderedFile(template, rendered)) {\n continue\n }\n\n const outRelPath = renderOutputPath(outRelPathTemplate, context)\n if (!isSafeRelativePath(outRelPath)) {\n continue\n }\n\n // Capacitor SPA 跳过服务端专属文件(hooks / server init)\n if (context.isCapacitorApp && CAPACITOR_SKIPPED_SERVER_FILES.has(outRelPath.split(path.sep).join('/'))) {\n continue\n }\n\n const destPath = path.join(destRoot, outRelPath)\n const configMatch = /(?:^|[/\\\\])config[/\\\\]_([^/\\\\]+)\\.ya?ml$/.exec(outRelPath)\n const normalizedRendered = normalizeRenderedContent(configMatch ? parameterizeConfig(configMatch[1], rendered) : rendered, outRelPath)\n\n await fse.ensureDir(path.dirname(destPath))\n await fse.writeFile(destPath, normalizedRendered, 'utf-8')\n }\n}\n\nasync function copyRenderedStaticPathFiles(\n dir: string,\n destRoot: string,\n context: TemplateContext,\n): Promise<void> {\n const staticFiles = await findRenderedStaticPathFiles(dir)\n for (const relPath of staticFiles) {\n if (!shouldCopyRenderedStaticPathFile(relPath, context)) {\n continue\n }\n\n const outRelPath = renderOutputPath(relPath, context)\n if (!isSafeRelativePath(outRelPath)) {\n continue\n }\n\n const srcPath = path.join(dir, relPath)\n const destPath = path.join(destRoot, outRelPath)\n await fse.ensureDir(path.dirname(destPath))\n await fse.copyFile(srcPath, destPath)\n }\n}\n\nfunction shouldCopyRenderedStaticPathFile(relPath: string, context: TemplateContext): boolean {\n if (context.appType !== 'fullstack' || !context.fullstack) {\n return true\n }\n\n const normalizedPath = relPath.split(path.sep).join('/')\n const frontendMatch = FULLSTACK_FRONTEND_TEMPLATE_PATH_REGEX.exec(normalizedPath)\n if (!frontendMatch) {\n return true\n }\n\n const target = frontendMatch[1] as FrontendTarget\n return Boolean(context.fullstack.frontends[target])\n}\n\nfunction normalizeRenderedContent(content: string, outRelPath: string): string {\n const normalizedLineEndings = content.replace(/\\r\\n/g, '\\n')\n const ext = path.extname(outRelPath)\n const normalized = NORMALIZED_RENDER_EXTENSIONS.has(ext)\n ? normalizedLineEndings.replace(/\\n{3,}/g, '\\n\\n')\n : normalizedLineEndings\n if (normalized.trim().length === 0) {\n return ''\n }\n return normalized.endsWith('\\n') ? normalized : `${normalized}\\n`\n}\n\nfunction shouldSkipRenderedFile(template: string, rendered: string): boolean {\n return template.includes(TEMPLATE_SKIP_IF_EMPTY_MARKER) && rendered.trim().length === 0\n}\n\nfunction renderOutputPath(pathTemplate: string, context: TemplateContext): string {\n const normalizedTemplate = pathTemplate.split(path.sep).join('/')\n return Handlebars.compile(normalizedTemplate, { noEscape: true })(context)\n}\n\nfunction isSafeRelativePath(relativePath: string): boolean {\n const normalized = path.normalize(relativePath)\n return !path.isAbsolute(normalized) && normalized !== '..' && !normalized.startsWith(`..${path.sep}`)\n}\n","/**\n * @h-ai/cli — 项目创建命令\n *\n * 基于模板的交互式项目创建:\n * 1. 交互式收集选项(appType / features / moduleConfigs)\n * 2. 拷贝 base 骨架 + appType 路由 + feature 路由\n * 3. 渲染动态模板(init.ts / hooks.server.ts / package.json)\n * 4. 生成配置文件、.env、Skill 文件\n *\n * @module cli-create\n */\n\nimport type { AppType, CreateProjectOptions, FeatureDefinition, FeatureId, FrontendTarget, ModuleConfigs, ProjectInfo } from '../cli-types.js'\nimport type { ConfigEnvironmentVariable } from './cli-config-environment.js'\nimport { Buffer } from 'node:buffer'\nimport { execFileSync, execSync } from 'node:child_process'\nimport { randomBytes } from 'node:crypto'\nimport path from 'node:path'\nimport process from 'node:process'\nimport chalk from 'chalk'\nimport fse from 'fs-extra'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { cliM } from '../cli-i18n.js'\nimport { detectPackageManager, fileExists, formatPromptDescription, writeCliError, writeCliMessage, writeFile } from '../cli-utils.js'\nimport { renderEnvironment, runtimeEnvironmentVariables } from './cli-config-environment.js'\nimport { buildTemplateContext, generateFromTemplates } from './cli-template-engine.js'\n\n// =============================================================================\n// 应用类型定义\n// =============================================================================\n\n/** Git 远程地址校验 */\nconst RE_HTTPS_URL = /^https:\\/\\/.+/\nconst RE_GIT_SSH_URL = /^git@.+:.+/\n\n/**\n * 应用类型定义\n */\nconst APP_TYPES: Record<AppType, { name: string, description: string, defaultFeatures: FeatureId[] }> = {\n 'admin': {\n name: '管理后台',\n description: '企业级管理系统,含 IAM、数据库、完整 UI',\n defaultFeatures: ['iam', 'db', 'cache', 'crypto'],\n },\n 'website': {\n name: '企业官网',\n description: 'SSR/SSG 企业官网,SEO 友好、响应式布局',\n defaultFeatures: ['db', 'cache'],\n },\n 'h5': {\n name: 'H5 应用',\n description: '移动端 H5 应用,触摸优化、PWA 支持',\n defaultFeatures: ['db', 'cache'],\n },\n 'api': {\n name: 'API 服务',\n description: 'typed API workspace,含 contract + service 双工程、无 UI',\n defaultFeatures: ['db', 'cache'],\n },\n 'mobile-app': {\n name: '移动应用',\n description: '移动端应用(Capacitor + Svelte 5 + Vite),可打包为 Android/iOS',\n defaultFeatures: ['api-client', 'capacitor'],\n },\n 'fullstack': {\n name: '前后端分离工程',\n description: '多端 mini 管理系统,包含用户、角色、审计、个人设置与双向传输加密',\n defaultFeatures: ['iam', 'db', 'cache', 'crypto', 'storage', 'audit'],\n },\n}\n\nconst FRONTEND_TARGETS: Record<FrontendTarget, { name: string, description: string, implemented: boolean }> = {\n web: { name: 'Web', description: '浏览器 Web 应用', implemented: true },\n app: { name: 'App', description: '移动端 Capacitor App / H5 前端', implemented: true },\n miniapp: { name: '小程序', description: '预留目标,当前只生成说明占位', implemented: false },\n desktop: { name: '桌面端', description: 'Tauri 桌面端前端工程', implemented: true },\n}\n\nconst DEFAULT_FULLSTACK_FRONTENDS: FrontendTarget[] = ['web', 'app', 'desktop']\n\n// =============================================================================\n// 功能定义\n// =============================================================================\n\n/**\n * 功能定义\n */\nconst FEATURES: Record<string, FeatureDefinition> = {\n 'iam': {\n id: 'iam',\n name: '身份与访问管理',\n description: 'Session/JWT 会话管理、RBAC 权限控制',\n packages: ['@h-ai/iam'],\n dependencies: ['crypto', 'db', 'cache'],\n },\n 'db': {\n id: 'db',\n name: '数据库',\n description: '多数据库支持 (SQLite/PostgreSQL/MySQL)',\n packages: ['@h-ai/reldb'],\n },\n 'cache': {\n id: 'cache',\n name: '缓存',\n description: 'Redis / 内存缓存',\n packages: ['@h-ai/cache'],\n },\n 'ai': {\n id: 'ai',\n name: 'AI 集成',\n description: 'LLM 适配器、MCP 协议、技能系统、流式响应',\n packages: ['@h-ai/ai'],\n },\n 'storage': {\n id: 'storage',\n name: '文件存储',\n description: '本地存储、S3/OSS/COS 云存储',\n packages: ['@h-ai/storage'],\n },\n 'crypto': {\n id: 'crypto',\n name: '加密模块',\n description: '国密 SM2/SM3/SM4、Argon2 密码哈希',\n packages: ['@h-ai/crypto'],\n },\n 'audit': {\n id: 'audit',\n name: '审计日志',\n description: '操作审计、安全追踪',\n packages: ['@h-ai/audit'],\n dependencies: ['db'],\n },\n 'reach': {\n id: 'reach',\n name: '触达服务',\n description: '邮件、短信、微信等消息触达',\n packages: ['@h-ai/reach'],\n },\n 'payment': {\n id: 'payment',\n name: '统一支付',\n description: '微信支付、支付宝、Stripe 统一接入',\n packages: ['@h-ai/payment'],\n dependencies: ['db'],\n },\n 'vecdb': {\n id: 'vecdb',\n name: '向量数据库',\n description: '向量检索与相似度搜索(LanceDB / pgvector / Qdrant)',\n packages: ['@h-ai/vecdb'],\n },\n 'datapipe': {\n id: 'datapipe',\n name: '数据处理管道',\n description: '文本清洗、分块与可组合处理流水线',\n packages: ['@h-ai/datapipe'],\n },\n 'scheduler': {\n id: 'scheduler',\n name: '任务调度',\n description: 'Cron 任务注册、执行与日志追踪',\n packages: ['@h-ai/scheduler'],\n dependencies: ['db'],\n },\n 'deploy': {\n id: 'deploy',\n name: '自动化部署',\n description: '统一部署编排与多平台发布支持',\n packages: ['@h-ai/deploy'],\n },\n 'api-client': {\n id: 'api-client',\n name: 'HTTP 客户端',\n description: '统一 API 调用、错误处理与流式请求支持',\n packages: ['@h-ai/api-client'],\n },\n 'capacitor': {\n id: 'capacitor',\n name: '移动端能力',\n description: 'Capacitor 原生桥接能力(偏移动应用)',\n packages: ['@h-ai/capacitor'],\n },\n}\n\n/**\n * 可选择的功能列表\n */\nconst SELECTABLE_FEATURES: FeatureId[] = [\n 'iam',\n 'db',\n 'cache',\n 'ai',\n 'storage',\n 'crypto',\n 'audit',\n 'reach',\n 'payment',\n 'vecdb',\n 'datapipe',\n 'scheduler',\n 'deploy',\n 'api-client',\n 'capacitor',\n]\n\nconst PROJECT_NAME_REGEX = /^[a-z0-9-]+$/\n\n// =============================================================================\n// 项目模板定义\n// =============================================================================\n\nconst PROJECT_TEMPLATES = {\n minimal: {\n name: 'minimal',\n description: '最小模板 — 仅核心功能',\n features: [] as FeatureId[],\n },\n default: {\n name: 'default',\n description: '标准模板 — IAM + 数据库 + 缓存',\n features: ['iam', 'db', 'cache', 'crypto'] as FeatureId[],\n },\n full: {\n name: 'full',\n description: '完整模板 — 所有功能',\n features: [\n 'iam',\n 'db',\n 'cache',\n 'crypto',\n 'ai',\n 'storage',\n 'audit',\n 'reach',\n 'payment',\n 'vecdb',\n 'datapipe',\n 'scheduler',\n 'deploy',\n 'api-client',\n 'capacitor',\n ] as FeatureId[],\n },\n custom: {\n name: 'custom',\n description: '自定义 — 选择需要的功能',\n features: [] as FeatureId[],\n },\n}\n\n// =============================================================================\n// 创建项目(主入口)\n// =============================================================================\n\n/**\n * 创建项目\n */\nexport async function createProject(options: CreateProjectOptions): Promise<void> {\n const spinner = ora()\n\n try {\n // 交互式获取选项\n const resolvedOptions = await resolveOptions(options)\n\n // 安全校验:项目名必须仅含小写字母、数字和连字符,防止路径遍历\n if (!PROJECT_NAME_REGEX.test(resolvedOptions.name)) {\n writeCliError(chalk.red(`项目名称不合法: \"${resolvedOptions.name}\",只能包含小写字母、数字和连字符`))\n return\n }\n\n const projectPath = path.resolve(resolvedOptions.cwd ?? '.', resolvedOptions.name)\n\n // 检查目录是否存在\n if (await fileExists(projectPath)) {\n const { overwrite } = await prompts({\n type: 'confirm',\n name: 'overwrite',\n message: `目录 ${resolvedOptions.name} 已存在,是否覆盖?`,\n initial: false,\n })\n\n if (!overwrite) {\n writeCliMessage(chalk.yellow('已取消'))\n return\n }\n\n await fse.remove(projectPath)\n }\n\n spinner.start('创建项目目录...')\n await fse.ensureDir(projectPath)\n spinner.succeed()\n\n // ─── 基于模板生成项目文件 ───\n spinner.start('生成项目文件...')\n\n const context = buildTemplateContext({\n name: resolvedOptions.name,\n appType: resolvedOptions.appType,\n features: resolvedOptions.features,\n frontends: resolvedOptions.frontends,\n moduleConfigs: resolvedOptions.moduleConfigs,\n packageManager: resolvedOptions.packageManager!,\n })\n\n // 拷贝模板 + 渲染动态文件\n await generateFromTemplates(projectPath, context)\n\n {\n // 生成配置文件(config/*.yml)\n const { generateConfigFile, generateEnvExample } = await import('./cli-config-templates.js')\n const configs = resolvedOptions.moduleConfigs\n const isApiWorkspace = resolvedOptions.appType === 'api'\n const isFullstack = resolvedOptions.appType === 'fullstack'\n const configDir = isApiWorkspace\n ? path.join(projectPath, 'apps', `${resolvedOptions.name}-service`, 'config')\n : isFullstack\n ? path.join(projectPath, 'packages', `${resolvedOptions.name}-serv`, 'config')\n : path.join(projectPath, 'config')\n const envExamplePath = isApiWorkspace\n ? path.join(projectPath, 'apps', `${resolvedOptions.name}-service`, '.env.example')\n : path.join(projectPath, '.env.example')\n\n for (const featureId of resolvedOptions.features) {\n const configKey = getFeatureConfigKey(featureId)\n if (configKey) {\n const configPath = path.join(configDir, `_${configKey}.yml`)\n // fullstack 已用模块配置 helper 渲染完整配置,不能再覆盖 Reach 模板等应用默认值。\n if (isFullstack && await fse.pathExists(configPath))\n continue\n await writeFile(configPath, generateConfigFile(configKey, configs))\n }\n }\n\n if (!isApiWorkspace && !isFullstack) {\n // 始终生成 core 配置\n await writeFile(\n path.join(configDir, '_core.yml'),\n generateConfigFile('core', configs),\n )\n }\n\n const configContents: Record<string, string> = {}\n for (const file of await fse.readdir(configDir)) {\n if (/^_.*\\.yml$/.test(file))\n configContents[file.slice(1, -4)] = await fse.readFile(path.join(configDir, file), 'utf8')\n }\n const envFeatures: FeatureId[] = resolvedOptions.features\n const envContents = generateEnvExample(envFeatures, configs, isFullstack, configContents)\n let envExample = isApiWorkspace\n ? envContents\n : isFullstack\n ? `${envContents}\\n# First-start administrator password; must satisfy the IAM password policy.\\nHAI_ADMIN_DEFAULT_PASSWORD=\\n\\n# Public API origin; never include credentials.\\nPUBLIC_API_BASE=http://127.0.0.1:3000\\n`\n : context.isSvelteOnlyApp\n ? `${envContents}\\n# Public API URL including /api/v1; never include credentials.\\nPUBLIC_API_BASE=http://10.0.2.2:3000/api/v1\\n`\n : envContents\n\n const runtimeVariables = new Map<string, ConfigEnvironmentVariable>()\n for (const file of await fse.readdir(projectPath, { recursive: true, encoding: 'utf8' })) {\n if (!/\\.(?:ts|js|mjs|svelte|envsh)$/.test(file))\n continue\n for (const variable of runtimeEnvironmentVariables(await fse.readFile(path.join(projectPath, file), 'utf8')))\n runtimeVariables.set(variable.name, variable)\n }\n const existingNames = new Set([...envExample.matchAll(/^(?:#\\s*)?([A-Z][A-Z0-9_]*)=/gm)].map(match => match[1]))\n const runtimeExample = renderEnvironment([...runtimeVariables.values()].filter(variable => !existingNames.has(variable.name)))\n if (runtimeExample)\n envExample += `\\n# 可选运行入口(按用途注入,不进入公共默认值):\\n${runtimeExample.split('\\n').map(line => line && !line.startsWith('#') ? `# ${line}` : line).join('\\n')}\\n`\n\n await writeFile(envExamplePath, envExample)\n const envDirectory = path.dirname(envExamplePath)\n const sharedVariables = envExample.split('\\n').filter(line => /^[A-Z][A-Z0-9_]*=/.test(line))\n await writeFile(path.join(envDirectory, '.env'), `# 公共基础配置(可提交);完整字段说明见 .env.example。\\n${sharedVariables.join('\\n')}\\n`)\n for (const [mode, environment] of [['dev', 'development'], ['test', 'test'], ['prod', 'production']] as const) {\n await writeFile(path.join(envDirectory, `.env.${mode}`), `# 公共 ${mode} 环境配置;本机私有值放 .env.local,进程环境变量优先。\\nHAI_CORE_ENV=${environment}\\nHAI_CORE_DEBUG=false\\nHAI_CORE_LOGGING_LEVEL=${mode === 'test' ? 'warn' : mode === 'dev' ? 'debug' : 'info'}\\n`)\n }\n if (isFullstack) {\n // 每个项目使用独立随机密码,保证四类字符;真实凭据只写入被忽略的本地文件。\n const password = `Aa1!${randomBytes(24).toString('base64url')}`\n await fse.writeFile(path.join(projectPath, '.env.local'), `# 本机私有配置,不提交 Git。\\nHAI_ADMIN_DEFAULT_PASSWORD=${password}\\n`, { mode: 0o600 })\n }\n else {\n await writeFile(path.join(envDirectory, '.env.local'), '# 本机私有配置,不提交 Git;覆盖公共基础和环境配置。\\n')\n }\n }\n\n // 生成 Skill 文件\n const { generateSkillFiles } = await import('./cli-skill-templates.js')\n await generateSkillFiles(\n projectPath,\n resolvedOptions.features,\n resolvedOptions.appType,\n resolvedOptions.name,\n )\n\n // 生成 README\n const appTypeLabel = APP_TYPES[resolvedOptions.appType].name\n const readmeContent = resolvedOptions.appType === 'fullstack'\n ? generateFullstackReadme(resolvedOptions.name, resolvedOptions.packageManager!, resolvedOptions.frontends)\n : resolvedOptions.appType === 'api'\n ? generateApiWorkspaceReadme(resolvedOptions.name, resolvedOptions.packageManager!)\n : generateReadme(resolvedOptions.name, appTypeLabel, resolvedOptions.packageManager!, resolvedOptions.appType)\n await writeFile(\n path.join(projectPath, 'README.md'),\n readmeContent,\n )\n\n spinner.succeed()\n\n // 初始化 Git\n if (resolvedOptions.git) {\n spinner.start('初始化 Git 仓库...')\n execSync('git init', { cwd: projectPath, stdio: 'ignore' })\n if (resolvedOptions.gitRemote) {\n // 使用 execFileSync + 数组参数,避免 shell 注入\n // 同时在非交互模式下补充校验(交互模式在 prompts.validate 中已校验)\n const gitRemote = resolvedOptions.gitRemote\n if (!RE_HTTPS_URL.test(gitRemote) && !RE_GIT_SSH_URL.test(gitRemote)) {\n spinner.fail()\n throw new Error(`Invalid gitRemote URL: ${gitRemote}`)\n }\n execFileSync('git', ['remote', 'add', 'origin', gitRemote], { cwd: projectPath, stdio: 'ignore' })\n }\n spinner.succeed()\n }\n\n // 安装依赖\n if (resolvedOptions.install) {\n spinner.start(`安装依赖 (${resolvedOptions.packageManager})...`)\n installDependencies(projectPath, resolvedOptions.packageManager!)\n spinner.succeed()\n }\n\n // 完成提示\n printCompletionMessage(resolvedOptions)\n }\n catch (error) {\n spinner.fail()\n writeCliError(chalk.red(cliM('cli_createFailed')), error)\n throw error\n }\n}\n\n// =============================================================================\n// 交互式选项解析\n// =============================================================================\n\n/**\n * 解析选项(交互式)\n */\nasync function resolveOptions(options: CreateProjectOptions): Promise<Required<CreateProjectOptions>> {\n const useDefaults = options.yes ?? false\n\n writeCliMessage('')\n writeCliMessage(chalk.bold.cyan(' 🚀 hai Agent Framework'))\n writeCliMessage(chalk.gray(' AI-Native · Configuration-Driven · Security-First'))\n writeCliMessage('')\n\n const onCancel = () => {\n writeCliMessage(chalk.red('\\n已取消'))\n process.exit(1)\n }\n\n // 项目名称(逐条询问,避免 prompts 数组模式在 Windows 终端重复渲染)\n let projectName = options.name\n if (!projectName && useDefaults) {\n projectName = 'my-app'\n }\n else if (!projectName) {\n const { name } = await prompts({\n type: 'text',\n name: 'name',\n message: '项目名称:',\n initial: 'my-app',\n validate: (value: string) => {\n if (!value.trim())\n return '项目名称不能为空'\n if (!PROJECT_NAME_REGEX.test(value))\n return '项目名称只能包含小写字母、数字和连字符'\n return true\n },\n }, { onCancel })\n projectName = name\n }\n\n // 应用类型\n let resolvedAppType = options.appType\n if (!resolvedAppType && useDefaults) {\n resolvedAppType = 'admin'\n }\n else if (!resolvedAppType) {\n const { appType } = await prompts({\n type: 'select',\n name: 'appType',\n message: '应用类型:',\n hint: cliM('cli_selectHint'),\n choices: Object.entries(APP_TYPES).map(([key, t]) => ({\n title: t.name,\n description: formatPromptDescription(t.description),\n value: key,\n })),\n initial: 0,\n }, { onCancel })\n resolvedAppType = appType\n }\n\n const selectedAppType = (resolvedAppType || 'admin') as AppType\n\n const selectedFrontends = selectedAppType === 'fullstack'\n ? await resolveFrontendTargets(options.frontends, useDefaults, onCancel)\n : []\n\n // 模板选择\n let selectedTemplate = options.template\n if (selectedAppType === 'fullstack') {\n selectedTemplate = selectedTemplate ?? 'custom'\n }\n else if (!selectedTemplate) {\n if (useDefaults) {\n selectedTemplate = 'default'\n }\n else {\n const { template } = await prompts({\n type: 'select',\n name: 'template',\n message: '选择模板:',\n hint: cliM('cli_selectHint'),\n choices: Object.values(PROJECT_TEMPLATES).map(t => ({\n title: t.name,\n description: formatPromptDescription(t.description),\n value: t.name,\n })),\n initial: 1,\n }, { onCancel })\n selectedTemplate = template\n }\n }\n\n // 功能选择\n let selectedFeatures: FeatureId[] = []\n const appTypeDefaults = APP_TYPES[selectedAppType].defaultFeatures\n\n if (selectedAppType === 'fullstack') {\n // fullstack 业务模块由模板确定;部署工具可通过显式 --features deploy 启用。\n selectedFeatures = resolveFeatureDependencies([...appTypeDefaults, ...(options.features?.includes('deploy') ? ['deploy' as const] : [])])\n }\n else if (selectedTemplate === 'custom' && !options.features && useDefaults) {\n selectedFeatures = resolveFeatureDependencies(appTypeDefaults)\n }\n else if (selectedTemplate === 'custom' && !options.features) {\n const featureChoices = SELECTABLE_FEATURES.map(id => ({\n title: FEATURES[id].name,\n description: formatPromptDescription(FEATURES[id].description),\n value: id,\n selected: appTypeDefaults.includes(id),\n }))\n\n const { features } = await prompts({\n type: 'multiselect',\n name: 'features',\n message: cliM('cli_featuresPrompt'),\n choices: featureChoices,\n hint: cliM('cli_multiselectHint'),\n instructions: false,\n }, { onCancel })\n\n selectedFeatures = features || []\n selectedFeatures = resolveFeatureDependencies(selectedFeatures)\n }\n else if (selectedTemplate === 'custom' && options.features) {\n selectedFeatures = resolveFeatureDependencies(options.features)\n }\n else {\n const templateFeatures = PROJECT_TEMPLATES[selectedTemplate as keyof typeof PROJECT_TEMPLATES]?.features || []\n const merged = new Set([...templateFeatures, ...appTypeDefaults])\n selectedFeatures = resolveFeatureDependencies(Array.from(merged))\n }\n\n // 模块配置\n const moduleConfigs = selectedAppType === 'fullstack'\n ? { ...buildDefaultModuleConfigs(selectedFeatures, projectName!), ...options.moduleConfigs }\n : options.moduleConfigs ?? (useDefaults\n ? buildDefaultModuleConfigs(selectedFeatures, projectName!)\n : await promptModuleConfigs(selectedFeatures, projectName!))\n\n // 示例代码\n let addExamples = options.examples\n if (addExamples === undefined && useDefaults) {\n addExamples = true\n }\n else if (addExamples === undefined) {\n const { examples } = await prompts({\n type: 'confirm',\n name: 'examples',\n message: '是否添加示例代码?',\n initial: true,\n }, { onCancel })\n addExamples = examples\n }\n\n // 包管理器\n const detected = await detectPackageManager(options.cwd ?? '.')\n let packageManager = selectedAppType === 'fullstack' || selectedAppType === 'api'\n ? 'pnpm'\n : options.packageManager\n if (!packageManager && useDefaults) {\n packageManager = detected\n }\n if (!packageManager) {\n const { pm } = await prompts({\n type: 'select',\n name: 'pm',\n message: '包管理器:',\n choices: [\n { title: 'pnpm (推荐)', value: 'pnpm' },\n { title: 'npm', value: 'npm' },\n { title: 'yarn', value: 'yarn' },\n ],\n initial: detected === 'pnpm' ? 0 : detected === 'npm' ? 1 : 2,\n }, { onCancel })\n packageManager = pm\n }\n\n // 安装依赖\n let install = options.install\n if (install === undefined && useDefaults) {\n install = true\n }\n else if (install === undefined) {\n const { doInstall } = await prompts({\n type: 'confirm',\n name: 'doInstall',\n message: '是否安装依赖?',\n initial: true,\n }, { onCancel })\n install = doInstall\n }\n\n // Git\n let git = options.git\n if (git === undefined && useDefaults) {\n git = true\n }\n else if (git === undefined) {\n const { initGit } = await prompts({\n type: 'confirm',\n name: 'initGit',\n message: '是否初始化 Git?',\n initial: true,\n }, { onCancel })\n git = initGit\n }\n\n // Git 远程仓库地址\n let gitRemote = options.gitRemote\n if (git && gitRemote === undefined && useDefaults) {\n gitRemote = ''\n }\n else if (git && gitRemote === undefined) {\n const { remote } = await prompts({\n type: 'text',\n name: 'remote',\n message: 'Git 仓库地址 (可选,回车跳过):',\n initial: '',\n validate: (value: string) => {\n if (!value.trim())\n return true\n if (RE_HTTPS_URL.test(value) || RE_GIT_SSH_URL.test(value))\n return true\n return '请输入合法的 Git 仓库地址 (https://... 或 git@...:...)'\n },\n }, { onCancel })\n gitRemote = remote?.trim() || ''\n }\n\n return {\n name: projectName!,\n appType: selectedAppType,\n frontends: selectedFrontends,\n template: (selectedTemplate ?? 'default') as 'default' | 'minimal' | 'full' | 'custom',\n features: selectedFeatures,\n moduleConfigs,\n examples: addExamples ?? true,\n install: install ?? true,\n packageManager: packageManager || 'pnpm',\n git: git ?? true,\n gitRemote: gitRemote ?? '',\n yes: useDefaults,\n verbose: options.verbose ?? false,\n cwd: options.cwd ?? '.',\n }\n}\n\nfunction buildDefaultModuleConfigs(features: FeatureId[], projectName: string): ModuleConfigs {\n const configs: ModuleConfigs = {\n core: { name: projectName, defaultLocale: 'zh-CN' },\n }\n\n if (features.includes('db')) {\n configs.db = { type: 'sqlite', database: './data/app.db' }\n }\n if (features.includes('cache')) {\n configs.cache = { type: 'memory' }\n }\n if (features.includes('iam')) {\n configs.iam = { loginPassword: true, loginOtp: false }\n }\n if (features.includes('storage')) {\n configs.storage = { type: 'local', localPath: './data/uploads' }\n }\n if (features.includes('ai')) {\n configs.ai = { defaultProvider: 'openai', model: 'gpt-4o-mini' }\n }\n\n return configs\n}\n\nasync function resolveFrontendTargets(\n frontends: FrontendTarget[] | undefined,\n useDefaults: boolean,\n onCancel: () => void,\n): Promise<FrontendTarget[]> {\n if (frontends && frontends.length > 0) {\n return normalizeFrontendTargets(frontends)\n }\n if (useDefaults) {\n return DEFAULT_FULLSTACK_FRONTENDS\n }\n\n const { selectedFrontends } = await prompts({\n type: 'multiselect',\n name: 'selectedFrontends',\n message: cliM('cli_frontendsPrompt'),\n choices: Object.entries(FRONTEND_TARGETS).map(([id, target]) => ({\n title: target.name,\n description: formatPromptDescription(target.description),\n value: id,\n selected: DEFAULT_FULLSTACK_FRONTENDS.includes(id as FrontendTarget),\n })),\n hint: cliM('cli_multiselectHint'),\n instructions: false,\n }, { onCancel })\n\n return normalizeFrontendTargets(selectedFrontends ?? DEFAULT_FULLSTACK_FRONTENDS)\n}\n\nfunction normalizeFrontendTargets(frontends: FrontendTarget[]): FrontendTarget[] {\n const validTargets = new Set(Object.keys(FRONTEND_TARGETS))\n const result = frontends.filter(target => validTargets.has(target))\n return [...new Set(result.length > 0 ? result : DEFAULT_FULLSTACK_FRONTENDS)]\n}\n\n// =============================================================================\n// 功能依赖解析\n// =============================================================================\n\n/**\n * 解析功能依赖(自动补全传递依赖,循环直至收敛)\n */\nfunction resolveFeatureDependencies(features: FeatureId[]): FeatureId[] {\n const result = new Set(features)\n\n let changed = true\n while (changed) {\n changed = false\n for (const featureId of result) {\n const feature = FEATURES[featureId]\n if (feature?.dependencies) {\n for (const dep of feature.dependencies) {\n if (!result.has(dep)) {\n result.add(dep)\n changed = true\n }\n }\n }\n }\n }\n\n return Array.from(result)\n}\n\n// =============================================================================\n// 模块配置交互\n// =============================================================================\n\n/**\n * 交互式收集模块配置\n */\nasync function promptModuleConfigs(features: FeatureId[], projectName: string): Promise<ModuleConfigs> {\n const configs: ModuleConfigs = {}\n const onCancel = () => {\n writeCliMessage(chalk.red('\\n已取消'))\n process.exit(1)\n }\n\n writeCliMessage('')\n writeCliMessage(chalk.bold(' ⚙ 模块配置'))\n writeCliMessage(chalk.gray(' 设置关键配置项(回车使用默认值)'))\n writeCliMessage('')\n\n // core 配置(始终收集)\n configs.core = await promptCoreConfig(projectName, onCancel)\n\n if (features.includes('db')) {\n configs.db = await promptDbConfig(projectName, onCancel)\n }\n if (features.includes('cache')) {\n configs.cache = await promptCacheConfig(onCancel)\n }\n if (features.includes('iam')) {\n configs.iam = await promptIamConfig(onCancel)\n }\n if (features.includes('storage')) {\n configs.storage = await promptStorageConfig(onCancel)\n }\n if (features.includes('ai')) {\n configs.ai = await promptAiConfig(onCancel)\n }\n\n return configs\n}\n\n/**\n * 收集 core 模块配置\n */\nasync function promptCoreConfig(projectName: string, onCancel: () => void): Promise<ModuleConfigs['core']> {\n writeCliMessage(chalk.cyan(' [core] 应用基础配置'))\n const { defaultLocale } = await prompts({\n type: 'select',\n name: 'defaultLocale',\n message: '默认语言:',\n choices: [\n { title: '中文 (zh-CN)', value: 'zh-CN' },\n { title: 'English (en-US)', value: 'en-US' },\n ],\n initial: 0,\n }, { onCancel })\n return { name: projectName, defaultLocale }\n}\n\n/**\n * 收集 db 模块配置\n */\nasync function promptDbConfig(projectName: string, onCancel: () => void): Promise<ModuleConfigs['db']> {\n writeCliMessage(chalk.cyan(' [db] 数据库配置'))\n const { type } = await prompts({\n type: 'select',\n name: 'type',\n message: '数据库类型:',\n choices: [\n { title: 'SQLite (零配置,适合开发)', value: 'sqlite' },\n { title: 'PostgreSQL', value: 'postgresql' },\n { title: 'MySQL', value: 'mysql' },\n ],\n initial: 0,\n }, { onCancel })\n\n if (type === 'sqlite') {\n const { database } = await prompts({\n type: 'text',\n name: 'database',\n message: 'SQLite 数据库路径:',\n initial: './data/app.db',\n }, { onCancel })\n return { type, database }\n }\n\n const answers = await prompts([\n { type: 'text', name: 'host', message: `${type === 'postgresql' ? 'PostgreSQL' : 'MySQL'} 主机:`, initial: 'localhost' },\n { type: 'number', name: 'port', message: '端口:', initial: type === 'postgresql' ? 5432 : 3306 },\n { type: 'text', name: 'database', message: '数据库名称:', initial: projectName },\n ], { onCancel })\n\n return { type, host: answers.host, port: answers.port, database: answers.database }\n}\n\n/**\n * 收集 cache 模块配置\n */\nasync function promptCacheConfig(onCancel: () => void): Promise<ModuleConfigs['cache']> {\n writeCliMessage(chalk.cyan(' [cache] 缓存配置'))\n const { type } = await prompts({\n type: 'select',\n name: 'type',\n message: '缓存类型:',\n choices: [\n { title: '内存缓存 (零配置,适合开发)', value: 'memory' },\n { title: 'Redis', value: 'redis' },\n ],\n initial: 0,\n }, { onCancel })\n\n if (type === 'memory')\n return { type }\n\n const answers = await prompts([\n { type: 'text', name: 'host', message: 'Redis 主机:', initial: 'localhost' },\n { type: 'number', name: 'port', message: 'Redis 端口:', initial: 6379 },\n ], { onCancel })\n\n return { type, host: answers.host, port: answers.port }\n}\n\n/**\n * 收集 iam 模块配置\n */\nasync function promptIamConfig(onCancel: () => void): Promise<ModuleConfigs['iam']> {\n writeCliMessage(chalk.cyan(' [iam] 认证授权配置'))\n const answers = await prompts([\n { type: 'confirm', name: 'loginPassword', message: '启用密码登录?', initial: true },\n { type: 'confirm', name: 'loginOtp', message: '启用 OTP 验证码登录?', initial: false },\n ], { onCancel })\n return { loginPassword: answers.loginPassword, loginOtp: answers.loginOtp }\n}\n\n/**\n * 收集 storage 模块配置\n */\nasync function promptStorageConfig(onCancel: () => void): Promise<ModuleConfigs['storage']> {\n writeCliMessage(chalk.cyan(' [storage] 文件存储配置'))\n const { type } = await prompts({\n type: 'select',\n name: 'type',\n message: '存储类型:',\n choices: [\n { title: '本地存储 (零配置,适合开发)', value: 'local' },\n { title: 'S3 / MinIO / OSS', value: 's3' },\n ],\n initial: 0,\n }, { onCancel })\n\n if (type === 'local') {\n const { localPath } = await prompts({\n type: 'text',\n name: 'localPath',\n message: '存储路径:',\n initial: './data/uploads',\n }, { onCancel })\n return { type, localPath }\n }\n\n return { type }\n}\n\n/**\n * 收集 ai 模块配置\n */\nasync function promptAiConfig(onCancel: () => void): Promise<ModuleConfigs['ai']> {\n writeCliMessage(chalk.cyan(' [ai] AI 集成配置'))\n const { defaultProvider } = await prompts({\n type: 'select',\n name: 'defaultProvider',\n message: 'AI Provider:',\n choices: [\n { title: 'OpenAI', value: 'openai' },\n { title: 'Anthropic (Claude)', value: 'anthropic' },\n { title: '其他 (OpenAI 兼容)', value: 'custom' },\n ],\n initial: 0,\n }, { onCancel })\n\n const defaultModel = defaultProvider === 'openai'\n ? 'gpt-4o-mini'\n : defaultProvider === 'anthropic'\n ? 'claude-3-sonnet'\n : ''\n\n const { model } = await prompts({\n type: 'text',\n name: 'model',\n message: '默认模型:',\n initial: defaultModel,\n }, { onCancel })\n\n return { defaultProvider, model }\n}\n\n// =============================================================================\n// 工具函数\n// =============================================================================\n\n/**\n * 获取功能对应的配置 key\n */\nfunction getFeatureConfigKey(featureId: FeatureId): string | null {\n const map: Record<string, string> = {\n db: 'db',\n cache: 'cache',\n iam: 'iam',\n storage: 'storage',\n ai: 'ai',\n deploy: 'deploy',\n vecdb: 'vecdb',\n reach: 'reach',\n scheduler: 'scheduler',\n audit: 'audit',\n payment: 'payment',\n }\n return map[featureId] ?? null\n}\n\n/**\n * 获取安装命令\n */\nfunction getInstallCommand(pm: 'pnpm' | 'npm' | 'yarn'): string {\n switch (pm) {\n case 'pnpm': return 'pnpm install'\n case 'yarn': return 'yarn'\n default: return 'npm install'\n }\n}\n\n/**\n * 生成运行 package.json 脚本的命令\n *\n * npm 需要 `npm run <script>`(lifecycle 脚本除外),pnpm / yarn 可直接 `<pm> <script>`。\n */\nfunction getRunCommand(pm: 'pnpm' | 'npm' | 'yarn', script: string): string {\n return pm === 'npm' ? `npm run ${script}` : `${pm} ${script}`\n}\n\nfunction installDependencies(projectPath: string, pm: 'pnpm' | 'npm' | 'yarn'): void {\n const installCmd = getInstallCommand(pm)\n try {\n execSync(installCmd, {\n cwd: projectPath,\n stdio: 'pipe',\n encoding: 'utf-8',\n maxBuffer: 10 * 1024 * 1024,\n })\n }\n catch (error) {\n const details = formatCommandFailure(installCmd, error)\n throw new Error(`${cliM('cli_installFailed', { params: { pm } })}\\n${details}`)\n }\n}\n\ninterface CommandFailureLike {\n stdout?: unknown\n stderr?: unknown\n status?: number | null\n signal?: string | null\n}\n\nfunction formatCommandFailure(command: string, error: unknown): string {\n if (!error || typeof error !== 'object') {\n return cliM('cli_commandLabel', { params: { command } })\n }\n\n const failure = error as CommandFailureLike\n const stdout = normalizeChildOutput(failure.stdout)\n const stderr = normalizeChildOutput(failure.stderr)\n const status = typeof failure.status === 'number' ? cliM('cli_exitCode', { params: { code: failure.status } }) : ''\n const signal = typeof failure.signal === 'string' ? cliM('cli_signal', { params: { signal: failure.signal } }) : ''\n const output = [\n cliM('cli_commandLabel', { params: { command } }),\n status,\n signal,\n stderr ? `stderr:\\n${stderr}` : '',\n stdout ? `stdout:\\n${stdout}` : '',\n ].filter(Boolean)\n\n return output.join('\\n\\n')\n}\n\nfunction normalizeChildOutput(output: unknown): string {\n if (typeof output === 'string') {\n return output.trim()\n }\n if (Buffer.isBuffer(output)) {\n return output.toString('utf-8').trim()\n }\n return ''\n}\n\n/**\n * 生成 README\n */\n/** 生成各类项目共用的 AI 开发入口说明。 */\nfunction generateAiDevelopmentReadme(): string {\n return `## AI 辅助开发\n\n从本项目根目录打开所用编码工具,先读取 [AGENTS.md](./AGENTS.md)。Claude Code 通过 [CLAUDE.md](./CLAUDE.md) 加载项目规则;GitHub Copilot 使用 [.github/copilot-instructions.md](./.github/copilot-instructions.md),OpenCode 使用 AGENTS.md 和 [opencode.json](./opencode.json)。\n\n业务以用户当前明确要求及其指定的需求/设计文档为准。模板 AGENTS、README、skills、生成代码与测试中的角色/权限、流程、限额和架构是可调整的初始方案;审查将差异列为模板适配项,实施按授权同步冲突代码、测试与过期规则,不要求把需求改回模板。框架 API 以当前安装版本公开契约为准,服务端授权、资源隔离、输入校验和凭据保护仍需落实。\n\nCodex、Cursor、Copilot、OpenCode 从 .agents/skills/ 发现共享技能;Claude Code 通过 CLAUDE.md 引用 AGENTS.md,并按项目指引读取 .agents/skills/ 的同一份正文。需求或设计文档在生成前使用 [文档审查 Skill](./.agents/skills/hai-spec-review/SKILL.md) 严格检查完备性、歧义、技术正确性和命名一致性,问题解决后再生成。普通新增、修改、修复任务使用 [应用开发 Skill](./.agents/skills/hai-app-create/SKILL.md) 和 [开发规范与框架能力路由](./.agents/skills/hai-app-create/development.md);具体模块再按需读取,不能把 Skill 已交付当成依赖已安装或配置已启用。\n\n根据文档规划、实施、返修或按已提交文档差异同步实现时,使用 [文档实施 Skill](./.agents/skills/hai-spec-implement/SKILL.md):维护 docs/task-list.md 与 docs/tasks/,记录已验收文档和实现的 Git SHA,比较固定目标版本后更新原任务或新建任务,每项独立分支 TDD、验证并本地合并;全部差异与整体验收通过后才推进基线。返修沿用原任务与分支。仅规划不开始实现,指定任务先核验依赖。\n\n优先复用适用的 hai-framework 公开 API 与已有业务实现。完成时说明复用的能力、相关能力未采用的原因,以及安全边界和类型、配置、文案、调用方的同步情况。质量验证按当前 package.json 执行 typecheck → lint → build → test;UI、路由与端到端流程另运行 test:e2e,未运行项说明原因。安全与质量规则既要按规范审查,也要运行门禁验证。\n\n已有 hai 项目可运行 hai init 补齐缺失的 AI 支持文件与参考资源;已有 AGENTS.md、Skill 和自定义规则会保留,升级时需将上述需求优先规则、普通开发入口与规范显式合并到旧指引,并修正已被需求替代的模板约束。\n\n`\n}\n\n/** 生成各类工程共用的配置与命令说明,放在开发/部署章节之间。 */\nfunction generateEnvironmentReadme(): string {\n return `## 分环境配置\n\n运行参数在 \\`.env.example\\` 中逐项说明用途、枚举和范围。\\`.env\\` 为公共基础,\\`.env.dev\\` / \\`.env.test\\` / \\`.env.prod\\` 为环境覆盖,均提交 Git;\\`.env.local\\` 为本机私有覆盖,不提交 Git。优先级为进程环境 > \\`.env.local\\` > 环境文件 > \\`.env\\`。YAML 显式引用 \\`HAI_<配置名>_<路径>\\` 并保留本地回退,camelCase 不拆词。完整命令、加载优先级和 Provider 切换见 [环境配置](.agents/skills/hai-app-create/development.md#环境配置)。\n\n| 用途 | 命令 |\n| --- | --- |\n| 开发 / 测试模式 / 生产模式预览 | \\`pnpm dev\\` / \\`dev:test\\` / \\`dev:prod\\` |\n| 类型检查(check 为别名) | \\`pnpm typecheck\\` |\n| 检查 / 自动修复格式 | \\`pnpm lint\\` / \\`lint:fix\\` |\n| 构建 / 生产模式构建 | \\`pnpm build\\` / \\`build:prod\\` |\n| 单元测试 / 监听 / 浏览器验收 | \\`pnpm test\\` / \\`test:watch\\` / \\`test:e2e\\` |\n| Node 服务按环境启动(构建后) | \\`pnpm start\\` / \\`start:test\\` / \\`start:prod\\` |\n\nVite 客户端使用 \\`preview\\` 预览静态产物,Node 服务使用 \\`start\\`;纯 contract/shared 库只提供适用的构建和质量命令。API workspace 的环境文件位于 \\`apps/<name>-service\\`,fullstack 位于工程根。`\n}\n\nfunction generateReadme(name: string, appTypeLabel: string, pm: 'pnpm' | 'npm' | 'yarn', appType: AppType): string {\n const install = getInstallCommand(pm)\n const isStaticImage = appType === 'mobile-app'\n const containerPort = isStaticImage ? 8080 : 3000\n const runtimeOptions = isStaticImage\n ? ''\n : ` --env-file .env --mount type=bind,source=/absolute/path/to/config,target=/app/config,readonly --mount type=volume,source=${name}-data,target=/app/data`\n const embeddedDataBuild = isStaticImage\n ? ''\n : `\n# 带 data/ 初始数据构建(二选一)\n${getRunCommand(pm, 'docker:build:data')}\n${getRunCommand(pm, 'podman:build:data')}`\n const runtimeNotes = isStaticImage\n ? '- 该模板生成静态 Web 镜像,不包含可写数据库目录。'\n : `以上三个运行时参数均可按需删除:\n\n| 参数 | 用途 | 可选性 |\n| --- | --- | --- |\n| \\`--env-file .env\\` | 批量传入环境变量;也可改用多个 \\`-e NAME=value\\`。 | 可选;删除后使用镜像和 YAML 默认值。 |\n| \\`--mount type=bind,...target=/app/config,readonly\\` | 用宿主机配置目录覆盖镜像内 \\`/app/config\\`;必须把 \\`source\\` 改成真实绝对路径,\\`readonly\\` 防止容器修改配置。 | 可选;删除后使用镜像自带配置。 |\n| \\`--mount type=volume,...target=/app/data\\` | 创建或复用 named volume,持久化 SQLite 和本地存储。 | 可选但生产环境建议保留;删除后数据只写入容器层,使用 \\`--rm\\` 删除容器时会丢失。 |\n\n- 带数据构建会把当前 \\`data/\\`(例如预置 SQLite 文件)固化为镜像初始快照;运行后产生的新数据仍应写入 \\`/app/data\\` volume。`\n const testPath = isStaticImage ? '/health' : '/'\n return `# ${name}\n\n基于 hai Agent Framework 构建的${appTypeLabel}应用。\n\n## 页面布局与路由\n\n页面统一继承根布局的 header/footer。${appType === 'mobile-app' ? '页面放 src/lib/pages/**/*.svelte,hash 路由自动发现,刷新与前进后退恢复当前页。' : '使用 SvelteKit 自动文件路由,新增 +page.svelte 无需维护路由表;刷新定位与服务端鉴权保持一致。'}\n\n## 开发\n\n\\`\\`\\`bash\n${install}\n${getRunCommand(pm, 'dev')}\n\\`\\`\\`\n\n${generateEnvironmentReadme()}\n\n## 构建\n\n\\`\\`\\`bash\n${getRunCommand(pm, 'build')}\n${getRunCommand(pm, 'i18n:compile')}\n${getRunCommand(pm, 'preview')}\n\\`\\`\\`\n\n## 容器运行\n\n### 构建镜像\n\n\\`\\`\\`bash\n# 普通构建(二选一)\n${getRunCommand(pm, 'docker:build')}\n${getRunCommand(pm, 'podman:build')}${embeddedDataBuild}\n\\`\\`\\`\n\n### 运行镜像\n\n\\`\\`\\`bash\n# Docker;使用 Podman 时将 docker 替换为 podman\ndocker run --rm -d --name ${name} -p ${containerPort}:${containerPort}${runtimeOptions} ${name}:latest\n\\`\\`\\`\n\n### 测试镜像\n\n\\`\\`\\`bash\ncurl --fail http://127.0.0.1:${containerPort}${testPath}\ndocker stop ${name}\n\\`\\`\\`\n\n${runtimeNotes}\n\n${generateAiDevelopmentReadme()}## 文档\n\n- [hai Agent Framework](https://github.com/hai-series/hai-framework)\n- [Svelte 5](https://svelte.dev/)\n`\n}\n\nfunction generateApiWorkspaceReadme(name: string, pm: 'pnpm' | 'npm' | 'yarn'): string {\n return `# ${name}\n\n基于 hai Agent Framework 构建的 typed API workspace。\n\n## 工程结构\n\n- \\`apps/${name}-contract\\`:共享 API contract、Zod schema 与类型\n- \\`apps/${name}-service\\`:后端 API service,基于 \\`@h-ai/serv\\` 暴露 HTTP 应用\n\n## 开发\n\n\\`\\`\\`bash\n${pm} install\n${pm} dev\n\\`\\`\\`\n\n${generateEnvironmentReadme()}\n\n## 质量门禁\n\n\\`\\`\\`bash\n${pm} typecheck\n${pm} lint\n${pm} build\n${pm} test\n${pm} test:e2e\n\\`\\`\\`\n\n## 容器运行\n\n### 构建镜像\n\n\\`\\`\\`bash\n# 普通构建(二选一)\n${pm} docker:build\n${pm} podman:build\n\n# 将 apps/${name}-service/data 作为镜像初始数据构建(二选一)\n${pm} docker:build:data\n${pm} podman:build:data\n\\`\\`\\`\n\n### 运行镜像\n\n\\`\\`\\`bash\n# 使用 Podman 时将 docker 替换为 podman\ndocker run --rm -d --name ${name} -p 3000:3000 --env-file .env \\\\\n --mount type=bind,source=/absolute/path/to/config,target=/app/config,readonly \\\\\n --mount type=volume,source=${name}-data,target=/app/data \\\\\n ${name}:latest\n\\`\\`\\`\n\n### 测试镜像\n\n\\`\\`\\`bash\ncurl --fail http://127.0.0.1:3000/health\ncurl --fail http://127.0.0.1:3000/ready\ncurl --fail --request POST http://127.0.0.1:3000/api/v1/app/info \\\\\n --header \"Content-Type: application/json\" --data '{}'\ndocker stop ${name}\n\\`\\`\\`\n\n- 配置默认来自 \\`apps/${name}-service/config\\`;运行时可只读挂载到 \\`/app/config\\` 覆盖,并用 YAML 的 \\`\\${ENV_NAME:default}\\` 占位符接收环境变量。\n- 带数据构建会把 \\`apps/${name}-service/data\\` 固化为镜像初始数据;生产写入仍建议使用 \\`/app/data\\` volume。\n\n以上三个运行时参数均可按需删除:\n\n| 参数 | 用途 | 可选性 |\n| --- | --- | --- |\n| \\`--env-file .env\\` | 批量传入环境变量;也可改用多个 \\`-e NAME=value\\`。 | 可选;删除后使用镜像和 YAML 默认值。 |\n| \\`--mount type=bind,...target=/app/config,readonly\\` | 用宿主机配置目录覆盖镜像内 \\`/app/config\\`;必须把 \\`source\\` 改成真实绝对路径,\\`readonly\\` 防止容器修改配置。 | 可选;删除后使用镜像自带配置。 |\n| \\`--mount type=volume,...target=/app/data\\` | 创建或复用 named volume,持久化 SQLite 和本地存储。 | 可选但生产环境建议保留;删除后数据只写入容器层,使用 \\`--rm\\` 删除容器时会丢失。 |\n\n## 扩展建议\n\n- 在 \\`${name}-contract\\` 中维护应用级 contract,前后端共用同一份类型与路径定义。\n- 在 \\`${name}-service\\` 中扩展 procedures、模块初始化与配置。\n- 需要 IAM / storage / ai 时,优先复用 \\`@h-ai/api-contract\\` 与 \\`@h-ai/serv/features/*\\`。\n\n${generateAiDevelopmentReadme()}## 文档\n\n- [hai Agent Framework](https://github.com/hai-series/hai-framework)\n- [@h-ai/serv](./.agents/skills/hai-serv/SKILL.md)\n- [@h-ai/api-contract](./.agents/skills/hai-api-contract/SKILL.md)\n- [@h-ai/api-client](./.agents/skills/hai-api-client/SKILL.md)\n`\n}\n\nfunction generateFullstackReadme(name: string, pm: string, frontends: FrontendTarget[]): string {\n const enabledFrontends = frontends.map(target => FRONTEND_TARGETS[target].name).join(' / ')\n const webBuildCommands = frontends.includes('web')\n ? `\n# Web 静态镜像(二选一)\n${pm} docker:build:web\n${pm} podman:build:web`\n : ''\n const webRunCommand = frontends.includes('web')\n ? `\n\n# Web;PUBLIC_API_BASE 在容器启动时注入,不需要重新构建镜像\ndocker run --rm -d --name ${name}-web -p 8080:8080 \\\\\n -e PUBLIC_API_BASE=https://api.example.com \\\\\n ${name}-web:latest`\n : ''\n const webTestCommands = frontends.includes('web')\n ? `curl --fail http://127.0.0.1:8080/health\ncurl --fail http://127.0.0.1:8080/runtime-config.js\n`\n : ''\n const containerNames = frontends.includes('web') ? `${name} ${name}-web` : name\n return `# ${name}\n\n基于 hai Agent Framework 构建的前后端分离多包工程。\n\n## 工程结构\n\n- \\`packages/${name}-contract\\`:前后端共享 API 契约、Zod Schema 与类型\n- \\`packages/${name}-serv\\`:后端 API Service(通过 \\`@h-ai/serv\\` 暴露最小 HTTP App 抽象,不直接暴露 Hono)\n- \\`packages/${name}-shared\\`:跨端共享 Shell、主题、语言切换、API client 与共享 messages\n- \\`apps/${name}-web\\`:Web 前端${frontends.includes('web') ? '' : '(未启用)'}\n- \\`apps/${name}-app\\`:移动端 App/H5 前端${frontends.includes('app') ? '' : '(未启用)'}\n- \\`apps/${name}-desktop\\`:桌面端前端${frontends.includes('desktop') ? '' : '(未启用)'}\n- \\`apps/${name}-miniapp\\`:小程序预留说明与本端 inlang messages${frontends.includes('miniapp') ? '(占位,不参与构建)' : '(未启用)'}\n\n已启用前端:${enabledFrontends || 'Web / App / Desktop'}\n\n## 页面布局与路由\n\nWeb/App/Desktop 共享 AppShell 的 header/footer。新增页面放 shared/src/lib/pages/**/*.svelte,由 HashRouter 自动发现并按需加载;菜单只维护入口。地址使用 #/页面路径,支持刷新、查询串与浏览器前进后退;API 权限仍由服务端校验。\n\n## 默认管理功能\n\n以下描述可运行示例的初始业务,可按实际需求调整或移除,并同步代码、数据、鉴权、界面、测试和文档。\n\n默认启用 IAM、reldb、cache、audit、storage 和 crypto。初始管理员可以管理用户(新增、编辑、禁用、删除、角色分配、头像上传)、查看 admin/user 角色及人数、维护角色说明、分页筛选审计日志;初始普通用户进入个人资料、头像、语言、主题和密码设置。默认密码修改后全部会话失效,需要重新登录;角色模型、访问范围和会话策略由业务需求决定。\n\nCLI 已在根目录生成 \\`.env.local\\`,其中 \\`HAI_ADMIN_DEFAULT_PASSWORD\\` 是每个项目独立生成的随机强密码。直接运行 \\`dev\\` / \\`start\\` 即可,首次登录使用用户名 \\`admin\\` 和该密码;也可通过同名环境变量覆盖。密码须满足 \\`_iam.yml\\` 策略,启动失败会显示具体校验原因及错误码。\\`.env.local\\` 已被 Git 和容器构建忽略,\\`.env.example\\` 不含真实密码;部署时设置目标环境自己的密码。已有用户时不会重复创建管理员或重设密码。\n\n本地开发默认 \\`PUBLIC_API_BASE=http://127.0.0.1:3000\\`,Vite 使用同源代理;部署时改为实际公网 API Origin,Android 模拟器访问宿主机时使用 \\`http://10.0.2.2:3000\\`。不要将密钥放入任何 \\`PUBLIC_\\` 或 \\`VITE_\\` 变量。\n\n所有业务 JSON 请求和响应默认通过 \\`@h-ai/crypto\\` transport 双向加密(含登录、刷新、头像上传);前端统一使用共享 typed API client。Web 访问令牌仅存内存、刷新令牌由 HttpOnly Cookie 保存;受信原生端使用平台安全存储或内存。头像为随机路径只读图片资源,支持 PNG/JPEG/WebP,最大 512 KiB。健康检查和只读头像图片可直接访问。\n\n应用显示名称、版本、环境、默认语言和日志设置来自后端 \\`config/_core.yml\\`,前端通过 \\`app.info\\` 获取安全元信息。默认 SQLite、本地存储与内存缓存适合单实例,管理写入仅支持单写实例;多实例读取可使用共享数据库、Redis cache 和 S3 存储,但管理写请求须统一路由到同一写实例。另需会话粘性路由使请求命中同一进程内传输私钥,服务重启后客户端重新协商。生产需显式配置允许的 CORS Origin。业务提交后的审计写入采用最大努力,失败记录结构化错误日志,保留已完成业务的原始结果。\n\n## 配置扩展\n\n服务端 \\`packages/${name}-serv/config/\\` 始终保留 core、serv、db、cache、iam、storage、audit、reach、ai、vecdb、payment、scheduler、deploy 共 13 份 YAML。已用模块保留工作默认值,未启用模块整份注释,可选字段和替代 Provider 按块注释;根 \\`.env.example\\` 也保留未启用模块的凭据示例。Reach 默认为开发控制台通知,生产按 \\`_reach.yml\\` 注释替换为 SMTP、短信或 API Provider,并保持名称唯一。\n\n自动生成的 \\`.env\\` 包含已启用模块的环境参数;YAML 显式引用相同变量并保留本地回退。编辑环境参数优先修改对应 \\`.env\\`;未启用模块仍保留注释。\n\n扩展时先在服务端 workspace 安装需要的包,在 \\`src/server/runtime.ts\\` 按模块公开 Schema 校验配置、初始化并反序关闭,再接入 contract/procedure 和界面。整份注释文件先去掉一层外层注释,可选块继续按需开启;配置文件存在不代表业务功能已接入。\\`crypto.init()\\` 无配置参数,datapipe 为纯函数,不生成虚构 YAML。\n\n环境变量只覆盖 YAML 已有路径,注释键须先启用,或用 \\`HAI_DB\\` / \\`HAI_CACHE\\` 等整体对象覆盖。camelCase 不拆词,例如 \\`connectTimeout\\` 对应 \\`HAI_CACHE_CONNECTTIMEOUT\\`。修改配置后重启服务;语言列表在各前端/shared 的 \\`project.inlang/settings.json\\` 中同步。\\`**/data/\\` 忽略任意层级的数据目录及 \\`.gitkeep\\`,运行数据不入 Git,运行时自动创建目录。\n\n${generateEnvironmentReadme()}\n\n## 开发、编译与打包\n\n\\`\\`\\`bash\n${pm} install\n${pm} dev\n\n# 一键编译:类型检查 + 全工作区构建\n${pm} compile\n\n# 一键打包:Web build、App Capacitor sync、Desktop Tauri build(按启用前端执行)\n${pm} package\n\n# 部署入口:默认执行 package,可替换为团队自己的 CI/CD 发布脚本\n${pm} deploy\n\\`\\`\\`\n\n## 容器运行\n\n默认镜像直接运行 API Service,外部端口为 3000。\n\n### 构建镜像\n\n\\`\\`\\`bash\n# Service 普通构建(二选一)\n${pm} docker:build\n${pm} podman:build\n\n# 将 packages/${name}-serv/data 作为镜像初始数据构建(二选一)\n${pm} docker:build:data\n${pm} podman:build:data\n${webBuildCommands}\n\\`\\`\\`\n\n### 运行镜像\n\n\\`\\`\\`bash\n# Service;使用 Podman 时将 docker 替换为 podman\ndocker run --rm -d --name ${name} -p 3000:3000 --env-file .env --env-file .env.prod --env-file .env.local \\\\\n --mount type=bind,source=/absolute/path/to/config,target=/app/config,readonly \\\\\n --mount type=volume,source=${name}-data,target=/app/data \\\\\n ${name}:latest\n${webRunCommand}\n\\`\\`\\`\n\n### 测试镜像\n\n\\`\\`\\`bash\ncurl --fail http://127.0.0.1:3000/health\ncurl --fail http://127.0.0.1:3000/ready\n${webTestCommands}docker stop ${containerNames}\n\\`\\`\\`\n\n- 上例按公共基础、生产环境、本机私有文件的顺序注入变量;运行前在目标机器创建 \\`.env.local\\` 并设置自己的管理员密码。部署平台也可直接注入同名变量。\n- 配置默认来自 \\`packages/${name}-serv/config\\`,也可挂载到 \\`/app/config\\`;YAML 中的 \\`\\${ENV_NAME:default}\\` 可由 \\`--env-file\\` 或 \\`-e\\` 注入。\n- 带数据构建会把 \\`packages/${name}-serv/data\\` 固化为镜像初始数据;持久化写入仍应使用 volume。\n- Service 由 \\`@h-ai/serv\\` 直接对外监听,不额外启动 Web 转发层。\n${frontends.includes('web') ? `- Web 使用独立静态镜像并支持一次构建、多环境部署;构建只需运行 \\`${pm} docker:build:web\\`,启动容器时通过 \\`-e PUBLIC_API_BASE=https://api.example.com\\` 指向 Service 对外地址。未设置时默认使用 Web 页面自身 origin。` : ''}\n\n以上三个 Service 运行时参数均可按需删除:\n\n| 参数 | 用途 | 可选性 |\n| --- | --- | --- |\n| \\`--env-file .env\\` | 批量传入环境变量;也可改用多个 \\`-e NAME=value\\`。 | 可选;删除后使用镜像和 YAML 默认值。 |\n| \\`--mount type=bind,...target=/app/config,readonly\\` | 用宿主机配置目录覆盖镜像内 \\`/app/config\\`;必须把 \\`source\\` 改成真实绝对路径,\\`readonly\\` 防止容器修改配置。 | 可选;删除后使用镜像自带配置。 |\n| \\`--mount type=volume,...target=/app/data\\` | 创建或复用 named volume,持久化 SQLite 和本地存储。 | 可选但生产环境建议保留;删除后数据只写入容器层,使用 \\`--rm\\` 删除容器时会丢失。 |\n\n前端单独交付命令:\n\n- Web:\\`${pm} --filter ${name}-web build\\` / \\`${pm} --filter ${name}-web package\\`\n- App:\\`${pm} --filter ${name}-app package\\`,Android/iOS 可用 \\`cap:build:android:debug\\` / \\`cap:build:android:release\\` / \\`cap:build:ios\\`\n- Desktop:\\`${pm} --filter ${name}-desktop tauri:dev\\` / \\`${pm} --filter ${name}-desktop package\\`\n\n## i18n 与 shared 协同\n\n- shared:\\`packages/${name}-shared/project.inlang\\` + \\`messages/\\`,只放跨端共享组件文案。\n- web/app/desktop:每个应用都有自己的 \\`project.inlang\\` + \\`messages/\\`,用于本端页面与产品文案。\n- miniapp:当前是占位,但也有自己的 \\`project.inlang\\` + \\`messages/\\`,便于后续接入真实小程序框架。\n- 新增 locale 时,shared 与所有启用前端的 \\`locales\\` 必须同步;语言切换器会同时更新 shared runtime 与宿主应用 runtime。\n- \\`${pm} i18n:compile\\` 会统一编译 shared 与每个启用前端的 Paraglide 输出;各前端也可单独运行 \\`${pm} --filter ${name}-web paraglide:compile\\` 等命令。\n\n## 自定义建议\n\n- 改全局 Shell/主题/语言切换:编辑 \\`packages/${name}-shared\\`。\n- 改某个前端页面和文案:编辑对应 \\`apps/${name}-*/src/routes\\` 与 \\`apps/${name}-*/messages\\`。\n- 改主题列表:调整脚手架配置中的 \\`fullstack.theme.themes\\`,或直接编辑各端 \\`src/app.css\\` 的 daisyUI \\`themes\\`。\n\n## 质量门禁\n\n\\`\\`\\`bash\n${pm} typecheck\n${pm} lint\n${pm} build\n${pm} test\n${pm} test:e2e\n\\`\\`\\`\n\n${generateAiDevelopmentReadme()}## 文档\n\n- [hai Agent Framework](https://github.com/hai-series/hai-framework)\n- [@h-ai/serv](./.agents/skills/hai-serv/SKILL.md)\n- [@h-ai/ui](./.agents/skills/hai-ui/SKILL.md)\n`\n}\n\n/**\n * 打印完成提示\n */\nfunction printCompletionMessage(options: Required<CreateProjectOptions>): void {\n writeCliMessage('')\n writeCliMessage(chalk.green('✔ 项目创建成功!'))\n writeCliMessage('')\n\n // 功能摘要\n if (options.features.length > 0) {\n writeCliMessage(chalk.bold('已启用功能:'))\n for (const featureId of options.features) {\n const feature = FEATURES[featureId]\n if (feature) {\n writeCliMessage(chalk.gray(` • ${feature.name} (${featureId})`))\n }\n }\n writeCliMessage('')\n }\n\n writeCliMessage('下一步:')\n writeCliMessage(chalk.cyan(` cd ${options.name}`))\n if (options.appType === 'fullstack')\n writeCliMessage(chalk.cyan(cliM('cli_adminPasswordSaved')))\n if (!options.install) {\n writeCliMessage(chalk.cyan(` ${getInstallCommand(options.packageManager)}`))\n }\n if (options.appType === 'fullstack' || options.appType === 'api') {\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'dev')}`))\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'typecheck')}`))\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'test')}`))\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'test:e2e')}`))\n }\n else {\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'dev')}`))\n }\n writeCliMessage('')\n}\n\n// =============================================================================\n// 项目检测(供 init 命令使用)\n// =============================================================================\n\n/**\n * 检测项目信息\n */\nexport async function detectProject(cwd: string): Promise<ProjectInfo | null> {\n const pkgPath = path.join(cwd, 'package.json')\n\n if (!(await fileExists(pkgPath))) {\n return null\n }\n\n try {\n const pkg = await fse.readJson(pkgPath)\n const deps = { ...pkg.dependencies, ...pkg.devDependencies }\n\n const haiPackages = Object.keys(deps).filter(name => name.startsWith('@h-ai/'))\n\n return {\n name: pkg.name,\n version: pkg.version,\n description: pkg.description,\n isHaiProject: haiPackages.length > 0,\n haiPackages,\n }\n }\n catch {\n return null\n }\n}\n","/**\n * @h-ai/cli — 模块增量添加命令\n *\n * 向现有 hai 项目增量启用模块。\n * @module cli-add\n */\n\nimport type { FeatureId, GlobalOptions } from '../cli-types.js'\nimport path from 'node:path'\nimport { core } from '@h-ai/core'\nimport chalk from 'chalk'\nimport fse from 'fs-extra'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { detectPackageManager, fileExists, getCliVersion, writeFile } from '../cli-utils.js'\nimport { generateConfigFile } from './cli-config-templates.js'\nimport { detectProject } from './cli-create.js'\n\n/**\n * add 命令选项\n */\nexport interface AddModuleOptions extends GlobalOptions {\n /** 要添加的模块 */\n module?: FeatureId\n /** 是否安装依赖 */\n install?: boolean\n}\n\n// 可添加的模块与对应包\nconst MODULE_MAP: Record<string, { packages: string[], deps?: string[], configKey?: string, description: string }> = {\n // iam 依赖 crypto(password hash)/ db(user 存储)/ cache(session 缓存)\n 'iam': { packages: ['@h-ai/iam'], deps: ['crypto', 'db', 'cache'], configKey: 'iam', description: '身份与访问管理' },\n // 'db' 和 'reldb' 都映射到 @h-ai/reldb,兼容用户习惯(hai add db 和 hai add reldb 均可)\n 'db': { packages: ['@h-ai/reldb'], configKey: 'db', description: '数据库' },\n 'reldb': { packages: ['@h-ai/reldb'], configKey: 'db', description: '数据库' },\n 'cache': { packages: ['@h-ai/cache'], configKey: 'cache', description: '缓存' },\n 'ai': { packages: ['@h-ai/ai'], configKey: 'ai', description: 'AI 集成' },\n 'storage': { packages: ['@h-ai/storage'], configKey: 'storage', description: '文件存储' },\n 'crypto': { packages: ['@h-ai/crypto'], description: '加密模块' },\n 'kit': { packages: ['@h-ai/kit'], description: 'SvelteKit 集成工具' },\n 'ui': { packages: ['@h-ai/ui'], description: 'UI 组件库' },\n 'deploy': { packages: ['@h-ai/deploy'], configKey: 'deploy', description: '自动化部署' },\n 'vecdb': { packages: ['@h-ai/vecdb'], configKey: 'vecdb', description: '向量数据库' },\n 'datapipe': { packages: ['@h-ai/datapipe'], description: '数据处理管道' },\n 'reach': { packages: ['@h-ai/reach'], configKey: 'reach', description: '消息推送' },\n 'scheduler': { packages: ['@h-ai/scheduler'], deps: ['db'], configKey: 'scheduler', description: '任务调度' },\n 'audit': { packages: ['@h-ai/audit'], deps: ['db'], configKey: 'audit', description: '审计日志' },\n 'payment': { packages: ['@h-ai/payment'], configKey: 'payment', description: '支付' },\n 'capacitor': { packages: ['@h-ai/capacitor'], description: '移动端能力' },\n 'api-client': { packages: ['@h-ai/api-client'], description: 'HTTP 客户端' },\n}\n\n/**\n * 增量添加模块到现有项目\n */\nexport async function addModule(options: AddModuleOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? '.'\n\n try {\n // 检测项目\n const project = await detectProject(cwd)\n if (!project) {\n core.logger.error(chalk.red('未检测到项目(找不到 package.json)'))\n return\n }\n\n // 交互式选择模块\n let moduleName = options.module\n if (!moduleName) {\n // 过滤已安装的模块\n const installed = new Set(project.haiPackages)\n const choices = Object.entries(MODULE_MAP)\n .filter(([, def]) => !def.packages.every(p => installed.has(p)))\n .map(([key, def]) => ({\n title: `${chalk.bold(key.padEnd(10))} ${chalk.gray(def.description)}`,\n value: key,\n }))\n\n if (choices.length === 0) {\n core.logger.info(chalk.green('所有模块已安装!'))\n return\n }\n\n const { selected } = await prompts({\n type: 'select',\n name: 'selected',\n message: '选择要添加的模块:',\n choices,\n })\n\n if (!selected)\n return\n moduleName = selected as FeatureId\n }\n\n const moduleDef = MODULE_MAP[moduleName]\n if (!moduleDef) {\n core.logger.error(chalk.red(`未知模块: ${moduleName}`))\n core.logger.info(`可用模块: ${Object.keys(MODULE_MAP).join(', ')}`)\n return\n }\n\n const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates.js')\n\n // 检查是否已安装\n if (moduleDef.packages.every(p => project.haiPackages.includes(p))) {\n const generatedFiles = await generateProjectAiSupport(\n cwd,\n resolveSkillNamesForPackages(project.haiPackages),\n {\n overwriteSkills: false,\n overwriteBridgeFiles: false,\n },\n )\n if (generatedFiles.length > 0) {\n core.logger.info(chalk.yellow(`模块 ${moduleName} 已安装,已补全 AI 支持文件`))\n for (const generatedFile of generatedFiles) {\n core.logger.info(chalk.gray(` + ${generatedFile} (AI support)`))\n }\n }\n else {\n core.logger.info(chalk.yellow(`模块 ${moduleName} 已安装`))\n }\n return\n }\n\n // 收集所有需要安装的包(含依赖模块)\n const allPackages = new Set(moduleDef.packages)\n if (moduleDef.deps) {\n for (const dep of moduleDef.deps) {\n const depDef = MODULE_MAP[dep]\n if (depDef) {\n for (const pkg of depDef.packages) {\n allPackages.add(pkg)\n }\n }\n }\n }\n\n // 更新 package.json\n spinner.start('更新 package.json...')\n const pkgPath = path.join(cwd, 'package.json')\n const pkg = await fse.readJson(pkgPath)\n if (!pkg.dependencies)\n pkg.dependencies = {}\n\n const existingHaiSpecifier = Object.entries(pkg.dependencies as Record<string, string>)\n .find(([pkgName]) => pkgName.startsWith('@h-ai/'))?.[1]\n\n // 已存在的 @h-ai/* 依赖若使用 catalog:,新增模块保持一致;否则固定当前 CLI 对应版本。\n const depVersion = existingHaiSpecifier === 'catalog:' ? 'catalog:' : getCliVersion()\n\n for (const pkgName of allPackages) {\n if (!pkg.dependencies[pkgName]) {\n pkg.dependencies[pkgName] = depVersion\n }\n }\n await fse.writeJson(pkgPath, pkg, { spaces: 2 })\n spinner.succeed()\n\n // 生成配置文件\n if (moduleDef.configKey) {\n const configDir = path.join(cwd, 'config')\n const configPath = path.join(configDir, `_${moduleDef.configKey}.yml`)\n if (!(await fileExists(configPath))) {\n spinner.start(`生成配置文件 config/_${moduleDef.configKey}.yml...`)\n const content = generateConfigFile(moduleDef.configKey)\n await writeFile(configPath, content)\n spinner.succeed()\n }\n else {\n core.logger.info(chalk.gray(`配置文件已存在: config/_${moduleDef.configKey}.yml`))\n }\n }\n\n // 生成依赖模块的配置文件\n if (moduleDef.deps) {\n for (const dep of moduleDef.deps) {\n const depDef = MODULE_MAP[dep]\n if (depDef?.configKey) {\n const depConfigPath = path.join(cwd, 'config', `_${depDef.configKey}.yml`)\n if (!(await fileExists(depConfigPath))) {\n const content = generateConfigFile(depDef.configKey)\n await writeFile(depConfigPath, content)\n core.logger.info(chalk.gray(` + config/_${depDef.configKey}.yml (依赖)`))\n }\n }\n }\n }\n\n const skillPackages = [...project.haiPackages, ...allPackages]\n const generatedFiles = await generateProjectAiSupport(\n cwd,\n resolveSkillNamesForPackages(skillPackages),\n {\n overwriteSkills: false,\n overwriteBridgeFiles: false,\n },\n )\n if (generatedFiles.length > 0) {\n for (const generatedFile of generatedFiles) {\n core.logger.info(chalk.gray(` + ${generatedFile} (AI support)`))\n }\n }\n\n // 安装依赖\n const doInstall = options.install !== false\n if (doInstall) {\n spinner.start('安装依赖...')\n const { execSync } = await import('node:child_process')\n const pm = await detectPackageManager(cwd)\n execSync(`${pm} install`, { cwd, stdio: 'ignore' })\n spinner.succeed()\n }\n\n core.logger.info('')\n core.logger.info(chalk.green(`✔ 模块 ${moduleName} 添加成功!`))\n core.logger.info('')\n core.logger.info('已添加的包:')\n for (const pkg of allPackages) {\n core.logger.info(chalk.cyan(` ${pkg}`))\n }\n core.logger.info('')\n }\n catch (error) {\n spinner.fail()\n core.logger.error(chalk.red('添加模块失败:'), { error })\n throw error\n }\n}\n","/** 部署向导:逐项配置实际依赖的中间件,不以文件存在代替有效连接配置。 */\nimport type { DeploymentEnvironment, MiddlewareBackend, MiddlewareField, MiddlewareMode, MiddlewareRequirement, ScanResult } from '@h-ai/deploy'\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { core } from '@h-ai/core'\nimport prompts from 'prompts'\nimport { parseDocument } from 'yaml'\nimport { cliM } from '../cli-i18n.js'\nimport { moduleEnvironmentVariables } from './cli-config-environment.js'\n\ntype DeployModule = typeof import('@h-ai/deploy')\n\n/**\n * 展示连接配置时保留可核对的后端/地址,隐藏密码、令牌和 URL 认证部分。\n * @example `displayDeployValue('HAI_DB', '{\"type\":\"mysql\",\"password\":\"secret\"}')`\n */\nexport function displayDeployValue(name: string, value: string): string {\n if (/PASSWORD|SECRET|TOKEN|APIKEY|PRIVATEKEY|ACCESSKEY|AUTHORIZATION/i.test(name.replace(/[^a-z0-9]/gi, '')) || /(?:^|_)PASS$/i.test(name) || value.includes('PRIVATE KEY'))\n return cliM('cli_deploy_secret')\n try {\n const parsed: unknown = JSON.parse(value)\n if (parsed && typeof parsed === 'object') {\n const sanitize = (object: unknown): unknown => {\n if (Array.isArray(object))\n return object.map(sanitize)\n if (object && typeof object === 'object')\n return Object.fromEntries(Object.entries(object).map(([key, item]) => [key, /PASSWORD|SECRET|TOKEN|APIKEY|PRIVATEKEY|ACCESSKEY|AUTHORIZATION/i.test(key.replace(/[^a-z0-9]/gi, '')) || /(?:^|_)PASS$/i.test(key) ? cliM('cli_deploy_secret') : typeof item === 'string' ? displayDeployValue(key, item) : sanitize(item)]))\n return object\n }\n return JSON.stringify(sanitize(parsed))\n }\n }\n catch { /* 普通连接字符串无需 JSON 处理。 */ }\n try {\n const url = new URL(value)\n if (url.username || url.password) {\n url.username = '***'\n url.password = '***'\n }\n for (const key of url.searchParams.keys()) {\n if (/password|secret|token|key|authorization/i.test(key))\n url.searchParams.set(key, '***')\n }\n return url.toString()\n }\n catch {\n return value\n }\n}\n\n/** 凭据输入字段,名称与 deploy 公开配置 Schema 相同。 */\nconst CLOUD_FIELDS: Record<string, string[]> = {\n 'neon': ['apiKey'],\n 'upstash': ['email', 'apiKey'],\n 'cloudflare-r2': ['accountId', 'apiToken', 'accessKeyId', 'secretAccessKey'],\n 'resend': ['apiKey', 'from'],\n 'aliyun': ['accessKeyId', 'accessKeySecret', 'signName'],\n}\n\n/** 解析目标环境显式声明的配置,仅用于判断是否允许跳过。 */\nfunction targetConfig(requirement: MiddlewareRequirement, environment: DeploymentEnvironment): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n const parent = environment.targetValues[requirement.envPrefix]\n if (parent) {\n try {\n Object.assign(result, JSON.parse(parent))\n }\n catch { return {} }\n }\n for (const [key, value] of Object.entries(environment.targetValues)) {\n if (key.startsWith(`${requirement.envPrefix}_`))\n result[key.slice(requirement.envPrefix.length + 1).toLowerCase()] = value\n }\n return result\n}\n\n/**\n * 只有目标文件显式声明了当前后端及必要连接项,才允许保持不变。\n * 凭据仍可来自 .env.local/进程;其他环境的配置不能让此选项出现。\n * @example `canKeepMiddleware(requirement, backend, prodEnvironment)`\n */\nexport function canKeepMiddleware(requirement: MiddlewareRequirement, backend: MiddlewareBackend, environment: DeploymentEnvironment): boolean {\n const target = targetConfig(requirement, environment)\n if (requirement.service === 'ldap' && backend.backend === 'disabled')\n return environment.targetValues.HAI_IAM_LOGIN_LDAP === 'false'\n if (requirement.service === 'ldap') {\n if (!Object.keys(target).length)\n return false\n }\n else if (target.type !== backend.backend) {\n return false\n }\n return backend.fields.filter(field => field.required && !field.secret).every((field) => {\n if ((target.url || (requirement.config.url && Object.keys(target).length)) && ['host', 'port'].includes(field.name))\n return true\n return (target[field.name] !== undefined && target[field.name] !== '') || (target[field.name.toLowerCase()] !== undefined && target[field.name.toLowerCase()] !== '')\n }) && backend.fields.filter(field => field.required && field.secret).every(field => Boolean(requirement.config[field.name] || environment.values[`${requirement.envPrefix}_${field.name.toUpperCase()}`]))\n}\n\n/** 用户取消与缺少非交互输入都必须停止,禁止使用未回答的隐含默认值。 */\nasync function ask(question: prompts.PromptObject): Promise<unknown> {\n const answer = await prompts({ ...question, name: 'value' })\n if (answer.value === undefined)\n throw new Error(cliM('cli_deploy_cancelled'))\n return answer.value\n}\n\n/** 校验连接字段;与模块 Schema 的基础取值约束一致。 */\nfunction validateField(value: string, field: MiddlewareField): boolean | string {\n if (value === '')\n return field.required ? cliM('cli_deploy_required') : true\n if (field.kind === 'port')\n return (/^\\d+$/.test(value) && Number(value) >= 1 && Number(value) <= 65535) || cliM('cli_deploy_invalid_value')\n if (field.kind === 'number')\n return (/^\\d+$/.test(value) && Number(value) >= (field.minimum ?? 0) && Number(value) <= (field.maximum ?? Number.MAX_SAFE_INTEGER)) || cliM('cli_deploy_invalid_value')\n if (field.kind === 'boolean')\n return ['true', 'false'].includes(value) || cliM('cli_deploy_invalid_value')\n if (field.kind === 'url') {\n try {\n return Boolean(new URL(value).protocol)\n }\n catch { return cliM('cli_deploy_invalid_value') }\n }\n if (field.name === 'ssl') {\n const parsed = parseDocument(value)\n const ssl: unknown = parsed.errors.length ? undefined : parsed.toJS()\n return (typeof ssl === 'boolean' || ['require', 'prefer', 'allow', 'disable'].includes(String(ssl)) || (ssl !== null && typeof ssl === 'object' && !Array.isArray(ssl))) || cliM('cli_deploy_invalid_value')\n }\n if (field.name === 'headers') {\n try {\n const headers: unknown = JSON.parse(value)\n return (headers !== null && typeof headers === 'object' && !Array.isArray(headers) && Object.values(headers).every(item => typeof item === 'string')) || cliM('cli_deploy_invalid_value')\n }\n catch {\n return cliM('cli_deploy_invalid_value')\n }\n }\n if (field.name === 'method')\n return ['POST', 'PUT'].includes(value) || cliM('cli_deploy_invalid_value')\n return true\n}\n\n/** 连接配置的声明节点必须存在,约定变量才能覆盖原 YAML 未启用的可选功能。 */\nfunction ensureConfigNode(appDir: string, requirement: MiddlewareRequirement, backend: string): void {\n if (requirement.service === 'ldap' && backend === 'disabled')\n return\n const directory = join(appDir, 'config')\n mkdirSync(directory, { recursive: true })\n const path = join(directory, `_${requirement.configName}.yml`)\n const document = parseDocument(existsSync(path) ? readFileSync(path, 'utf8') : '{}\\n')\n if (document.errors.length)\n throw new Error(cliM('cli_deploy_invalid_value'))\n if (requirement.configPath.length && !document.hasIn(requirement.configPath))\n document.setIn(requirement.configPath, requirement.configName === 'reach' ? { name: requirement.config.name ?? requirement.service, type: backend } : {})\n if (requirement.service === 'ldap') {\n if (!document.hasIn(['login']))\n document.setIn(['login'], {})\n if (!document.hasIn(['login', 'ldap']))\n document.setIn(['login', 'ldap'], `\\${HAI_IAM_LOGIN_LDAP:false}`)\n }\n const content = document.toString()\n if (!existsSync(path) || readFileSync(path, 'utf8') !== content)\n writeFileSync(path, content)\n}\n\n/** 保存单个连接对象;整体覆盖可避免旧 URL 或不兼容后端字段残留。 */\nfunction connectionEnv(requirement: MiddlewareRequirement, backend: string, config: Record<string, unknown>): Record<string, string> {\n if (requirement.service === 'ldap')\n return backend === 'disabled' ? { HAI_IAM_LOGIN_LDAP: 'false' } : { HAI_IAM_LOGIN_LDAP: 'true', [requirement.envPrefix]: JSON.stringify(config) }\n return { [requirement.envPrefix]: JSON.stringify({ ...config, type: backend }) }\n}\n\n/**\n * 逐项收集处理方式、后端和连接参数;返回值用于过滤云开通器和 Compose 服务。\n * @example `await configureDeployMiddleware(module, scan, environment, config, false)`\n */\nexport async function configureDeployMiddleware(module: DeployModule, scan: ScanResult, environment: DeploymentEnvironment, config: Record<string, unknown>, yes = false): Promise<Partial<Record<string, MiddlewareMode>>> {\n const modes: Partial<Record<string, MiddlewareMode>> = {}\n const services: Record<string, unknown> = {}\n const existingServices = config.services && typeof config.services === 'object' ? config.services as Record<string, unknown> : {}\n const provider = config.provider as { type?: string } | undefined\n for (const requirement of scan.middlewares ?? []) {\n const choices = module.DEPLOY_MIDDLEWARE[requirement.service]\n const current = choices.find(item => item.backend === requirement.backend)\n if (!current)\n throw new Error(cliM('cli_deploy_cloud_unsupported', { params: { backend: requirement.backend } }))\n core.logger.info(cliM('cli_deploy_middleware', { params: { service: requirement.service, backend: current.label, purpose: module.describeMiddlewareBackend(current), source: requirement.source } }))\n const canKeep = canKeepMiddleware(requirement, current, environment)\n const mode = yes\n ? canKeep ? 'keep' : 'default'\n : await ask({\n type: 'select',\n name: 'value',\n message: cliM('cli_deploy_action', { params: { service: requirement.service } }),\n choices: [\n { title: cliM('cli_deploy_default'), value: 'default' },\n { title: cliM('cli_deploy_custom'), value: 'custom' },\n ...(canKeep ? [{ title: cliM('cli_deploy_keep'), value: 'keep' }] : []),\n ],\n }) as MiddlewareMode\n modes[requirement.envPrefix] = mode\n // 同类服务可有多个 Provider;保留每项选择,聚合值仅用于选择云开通器。\n const previous = modes[requirement.service]\n modes[requirement.service] = previous === 'default' || mode === 'default' ? 'default' : previous === 'custom' || mode === 'custom' ? 'custom' : 'keep'\n if (mode === 'keep') {\n if (!canKeep)\n throw new Error(cliM('cli_deploy_missing_keep', { params: { service: requirement.service } }))\n continue\n }\n const backendName = yes ? current.backend : String(await ask({ type: 'select', name: 'value', message: cliM('cli_deploy_backend', { params: { service: requirement.service } }), initial: choices.indexOf(current), choices: choices.map(item => ({ title: `${item.label} — ${module.describeMiddlewareBackend(item)}`, value: item.backend })) }))\n const backend = choices.find(item => item.backend === backendName)\n if (!backend)\n throw new Error(cliM('cli_deploy_invalid_value'))\n requirement.backend = backendName\n const updates: Record<string, string> = {}\n if (mode === 'default' && backendName === 's3' && provider?.type === 'docker-ssh') {\n const container = config.container && typeof config.container === 'object' ? config.container as Record<string, unknown> : {}\n const currentEngine = container.s3Engine === 'minio' ? 'minio' : 'rustfs'\n const engine = yes ? currentEngine : String(await ask({ type: 'select', name: 'value', message: cliM('cli_deploy_s3_engine'), initial: currentEngine === 'rustfs' ? 0 : 1, choices: [{ title: 'RustFS', value: 'rustfs' }, { title: 'MinIO', value: 'minio' }] }))\n if (!['rustfs', 'minio'].includes(engine))\n throw new Error(cliM('cli_deploy_invalid_value'))\n config.container = { ...container, s3Engine: engine }\n updates.HAI_DEPLOY_CONTAINER_S3ENGINE = engine\n const deploymentFile = join(scan.appDir ?? '.', 'config', '_deploy.yml')\n const deployment = parseDocument(readFileSync(deploymentFile, 'utf8'))\n if (deployment.errors.length)\n throw new Error(cliM('cli_deploy_invalid_value'))\n if (!deployment.hasIn(['container', 's3Engine'])) {\n if (!deployment.hasIn(['container']))\n deployment.setIn(['container'], {})\n deployment.setIn(['container', 's3Engine'], `\\${HAI_DEPLOY_CONTAINER_S3ENGINE:rustfs}`)\n writeFileSync(deploymentFile, deployment.toString())\n }\n }\n if (mode === 'default' && provider?.type === 'vercel') {\n if (!backend.provisioner)\n throw new Error(cliM('cli_deploy_cloud_unsupported', { params: { backend: backend.label } }))\n const prior = existingServices[requirement.service]\n const priorConfig = prior && typeof prior === 'object' ? prior as Record<string, unknown> : {}\n const cloud: Record<string, string> = { provisioner: backend.provisioner }\n for (const name of CLOUD_FIELDS[backend.provisioner]) {\n const key = `HAI_DEPLOY_SERVICES_${requirement.service.toUpperCase()}_${name.toUpperCase()}`\n const initial = String(priorConfig[name] ?? environment.values[key] ?? '')\n const value = yes ? initial : String(await ask({ type: /key|token|secret/i.test(name) ? 'password' : 'text', name: 'value', message: key, initial, validate: input => Boolean(input) || cliM('cli_deploy_required') }))\n if (!value)\n throw new Error(`${key}: ${cliM('cli_deploy_required')}`)\n cloud[name] = value\n updates[key] = value\n }\n services[requirement.service] = cloud\n }\n else {\n if (mode === 'default' && (requirement.service === 'sms' || backendName === 'api'))\n throw new Error(cliM('cli_deploy_cloud_unsupported', { params: { backend: backend.label } }))\n const connection: Record<string, unknown> = mode === 'custom' && backendName === current.backend ? { ...requirement.config } : requirement.configName === 'reach' ? { name: requirement.config.name ?? requirement.service } : {}\n for (const field of backend.fields) {\n const previous = backendName === current.backend ? requirement.config[field.name] : undefined\n const initial = previous === undefined ? field.defaultValue ?? '' : typeof previous === 'object' ? JSON.stringify(previous) : String(previous)\n const variable = `${requirement.envPrefix}_${field.name.toUpperCase()}`\n const info = moduleEnvironmentVariables(requirement.configName).find(item => item.name === variable)\n const value = mode === 'custom' && !yes ? String(await ask({ type: field.secret ? 'password' : 'text', name: 'value', message: cliM('cli_deploy_field', { params: { name: variable, description: info?.description ?? field.name, constraint: info?.constraint ?? field.kind ?? 'string' } }), initial, validate: input => validateField(String(input), field) })) : initial\n // 默认的服务端凭据由 sidecar/云开通器生成,不要求用户填写。\n if (value !== '') {\n connection[field.name] = field.kind === 'number' || field.kind === 'port' ? Number(value) : field.kind === 'boolean' ? value === 'true' : field.name === 'headers' || field.name === 'ssl' ? parseDocument(value).toJS() : value\n }\n else {\n delete connection[field.name]\n }\n }\n Object.assign(updates, connectionEnv(requirement, backendName, connection))\n }\n ensureConfigNode(scan.appDir ?? '.', requirement, backendName)\n const saved = module.saveDeploymentEnvironment(environment, updates)\n if (!saved.success)\n throw new Error(saved.error.message)\n for (const [name, value] of Object.entries(updates)) {\n core.logger.info(cliM('cli_deploy_saved', { params: { name, value: displayDeployValue(name, value) } }))\n }\n }\n // 仅默认选项对应的云服务参与初始化/开通;custom/keep 不认证、不创建。\n config.services = Object.keys(services).length ? services : undefined\n return modes\n}\n","/**\n * @h-ai/cli — 部署命令\n *\n * 使用: hai deploy [appDir]\n * @module cli-deploy\n */\n\nimport type { DeploymentEnvironment } from '@h-ai/deploy'\nimport type { GlobalOptions } from '../cli-types.js'\nimport { existsSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { resolve } from 'node:path'\nimport process from 'node:process'\nimport { pathToFileURL } from 'node:url'\nimport { core } from '@h-ai/core'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { cliM } from '../cli-i18n.js'\nimport { configureDeployMiddleware, displayDeployValue } from './cli-deploy-middleware.js'\n\n/** deploy 命令选项 */\nexport interface DeployCommandOptions extends GlobalOptions {\n /** 部署环境;省略时必须交互输入。 */\n env?: string\n /** 环境文件目录,默认扫描应用/workspace 根。 */\n envDir?: string\n /** 非交互模式:保留完整的目标配置,其余采用当前后端默认配置。 */\n yes?: boolean\n /** 应用目录 */\n appDir?: string\n /** 项目名称(覆盖自动检测) */\n projectName?: string\n /** 跳过基础设施开通 */\n skipProvision?: boolean\n /** 已配置完备,跳过全部中间件处理并直接部署。 */\n skipMiddleware?: boolean\n /** 跳过构建 */\n skipBuild?: boolean\n}\n\n/** 配置输入中的可选对象;不让未完成的配置绕过最终 Provider Schema。 */\nfunction configObject(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {}\n}\n\n/**\n * 补齐部署目标,完整配置直接复用;本机 SSH 参数和平台 Token 只写 `.env.local`。\n * @example 首次输入主机和密钥路径后,下次执行 `hai deploy --env prod` 自动复用。\n */\nasync function configureDeployTarget(module: typeof import('@h-ai/deploy'), config: Record<string, unknown>, environment: DeploymentEnvironment, nonInteractive?: boolean): Promise<void> {\n const current = module.ProviderConfigSchema.safeParse(config.provider)\n if (current.success) {\n config.provider = current.data\n core.logger.info(cliM('cli_deploy_target_reused', { params: { target: current.data.type === 'docker-ssh' ? `${current.data.ssh.username}@${current.data.ssh.host}:${current.data.ssh.port}` : 'Vercel' } }))\n return\n }\n if (nonInteractive)\n throw new Error(cliM('cli_deploy_target_missing', { params: { fields: current.error.issues.map(issue => `provider.${issue.path.join('.')}`).join(', ') } }))\n\n const original = configObject(config.provider)\n const platform = await prompts({\n type: 'select',\n name: 'value',\n message: cliM('cli_deploy_target_platform'),\n choices: [{ title: cliM('cli_deploy_target_ssh'), value: 'docker-ssh' }, { title: 'Vercel', value: 'vercel' }],\n initial: original.type === 'vercel' ? 1 : 0,\n })\n if (!platform.value)\n throw new Error(cliM('cli_deploy_cancelled'))\n\n const input = async (name: string, initial: unknown, options: { optional?: boolean, secret?: boolean, port?: boolean } = {}): Promise<string> => {\n const answer = await prompts({\n type: options.secret ? 'password' : 'text',\n name: 'value',\n message: cliM('cli_deploy_target_field', { params: { name } }),\n initial: options.secret ? undefined : initial === undefined ? '' : String(initial),\n validate: (value: string) => options.port\n ? (/^\\d+$/.test(value) && Number(value) >= 1 && Number(value) <= 65535) || cliM('cli_deploy_invalid_value')\n : options.optional || !!value.trim() || cliM('cli_deploy_invalid_value'),\n })\n if (answer.value === undefined)\n throw new Error(cliM('cli_deploy_cancelled'))\n return String(answer.value).trim()\n }\n let provider: Record<string, unknown>\n if (platform.value === 'docker-ssh') {\n core.logger.info(cliM('cli_deploy_target_ssh_hint'))\n const ssh = configObject(original.ssh)\n const remote = configObject(original.remote)\n const expose = configObject(original.expose)\n const host = await input('HAI_DEPLOY_PROVIDER_SSH_HOST', ssh.host)\n const port = Number(await input('HAI_DEPLOY_PROVIDER_SSH_PORT', ssh.port ?? 22, { port: true }))\n const username = await input('HAI_DEPLOY_PROVIDER_SSH_USERNAME', ssh.username)\n const identityFile = await input('HAI_DEPLOY_PROVIDER_SSH_IDENTITYFILE', ssh.identityFile, { optional: true })\n const knownHostsFile = await input('HAI_DEPLOY_PROVIDER_SSH_KNOWNHOSTSFILE', ssh.knownHostsFile, { optional: true })\n const baseDir = await input('HAI_DEPLOY_PROVIDER_REMOTE_BASEDIR', remote.baseDir || '/opt/hai/apps')\n const runtime = await prompts({ type: 'select', name: 'value', message: cliM('cli_deploy_target_runtime'), choices: ['auto', 'podman', 'docker'].map(value => ({ title: value, value })), initial: ['auto', 'podman', 'docker'].indexOf(String(remote.runtime ?? 'auto')) })\n if (!runtime.value)\n throw new Error(cliM('cli_deploy_cancelled'))\n const hostPort = Number(await input('HAI_DEPLOY_PROVIDER_EXPOSE_HOSTPORT', expose.hostPort || 3000, { port: true }))\n const containerPort = Number(await input('HAI_DEPLOY_PROVIDER_EXPOSE_CONTAINERPORT', expose.containerPort || 3000, { port: true }))\n provider = {\n type: 'docker-ssh',\n ssh: { ...ssh, host, port, username, identityFile: identityFile || undefined, knownHostsFile: knownHostsFile || undefined },\n remote: { ...remote, baseDir, runtime: runtime.value },\n expose: { type: 'port', hostPort, containerPort },\n }\n }\n else {\n provider = { type: 'vercel', token: await input('HAI_DEPLOY_PROVIDER_TOKEN', undefined, { secret: true }) }\n }\n const validated = module.ProviderConfigSchema.safeParse(provider)\n if (!validated.success)\n throw new Error(cliM('cli_deploy_invalid_value'))\n const saved = module.saveDeploymentEnvironment(environment, { HAI_DEPLOY_PROVIDER: JSON.stringify(validated.data) }, { private: true })\n if (!saved.success)\n throw new Error(saved.error.message)\n config.provider = validated.data\n core.logger.info(cliM('cli_deploy_target_saved'))\n}\n\n/**\n * 执行部署命令\n *\n * @param options - 部署选项\n * @example `await deployCommand({ env: 'prod', skipMiddleware: true, yes: true })`\n */\nexport async function deployCommand(options: DeployCommandOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? process.cwd()\n let appDir = resolve(cwd, options.appDir ?? '.')\n let closeDeploy: (() => Promise<void>) | null = null\n const originalEnv = { ...process.env }\n\n try {\n // 环境选择是第一步;取消、无 TTY 或缺文件均不能继续认证/开通资源。\n let environmentName = options.env\n if (!environmentName) {\n if (!process.stdin.isTTY)\n throw new Error(cliM('cli_deploy_environment_hint'))\n const answer = await prompts({ type: 'text', name: 'environment', message: cliM('cli_deploy_environment'), initial: 'prod' })\n environmentName = answer.environment\n if (!environmentName)\n throw new Error(cliM('cli_deploy_cancelled'))\n }\n if (!options.yes && !process.stdin.isTTY)\n throw new Error(cliM('cli_deploy_environment_hint'))\n // 动态导入 @h-ai/deploy(允许 CLI 在未安装 deploy 时仍可使用其他命令)\n let deployModule: typeof import('@h-ai/deploy')\n try {\n // 全局安装的 CLI 先使用目标工程的 deploy 版本,不依赖 CLI 的开发依赖。\n const localRequire = createRequire(resolve(appDir, 'package.json'))\n let localModule: string | undefined\n try {\n localModule = localRequire.resolve('@h-ai/deploy')\n }\n catch { /* 源码仓库或直接模块测试可使用 CLI 本身可解析的安装。 */ }\n deployModule = localModule ? await import(pathToFileURL(localModule).href) : await import('@h-ai/deploy')\n }\n catch {\n core.logger.error(chalk.red(cliM('cli_deploy_module_missing')))\n core.logger.info(chalk.cyan(' pnpm add @h-ai/deploy'))\n throw new Error(cliM('cli_deploy_module_missing'))\n }\n\n const { deploy } = deployModule\n\n const scanResult = await deploy.scan(appDir, { environment: environmentName, envDir: options.envDir ? resolve(cwd, options.envDir) : undefined })\n if (!scanResult.success)\n throw new Error(cliM('cli_deploy_scan_failed', { params: { message: scanResult.error.message } }))\n const scan = scanResult.data\n appDir = scan.appDir ?? appDir\n const environment = deployModule.loadDeploymentEnvironment({ environment: environmentName, envDir: scan.envDir ?? appDir })\n if (!environment.success)\n throw new Error(environment.error.message)\n Object.assign(process.env, environment.data.values)\n\n // 1. 加载凭证\n spinner.start(cliM('cli_deploy_load_credentials'))\n const credResult = deploy.credentials.load()\n if (!credResult.success) {\n throw new Error(cliM('cli_deploy_credentials_failed', { params: { message: credResult.error.message } }))\n }\n spinner.succeed(cliM('cli_deploy_credentials_loaded', { params: { count: credResult.data.length } }))\n\n // 2. 读取部署配置\n spinner.start(cliM('cli_deploy_load_config'))\n const configPath = resolve(appDir, 'config', '_deploy.yml')\n if (!existsSync(configPath)) {\n spinner.fail(chalk.red(cliM('cli_deploy_config_missing', { params: { path: configPath } })))\n core.logger.info(chalk.cyan(cliM('cli_deploy_config_hint')))\n throw new Error(cliM('cli_deploy_config_missing', { params: { path: configPath } }))\n }\n\n const loadedConfig = deployModule.loadDeploymentConfig('deploy', configPath, process.env)\n if (!loadedConfig.success)\n throw new Error(loadedConfig.error.message)\n const deployConfig = loadedConfig.data\n spinner.succeed(cliM('cli_deploy_config_loaded'))\n await configureDeployTarget(deployModule, deployConfig, environment.data, options.yes)\n\n spinner.succeed(cliM('cli_deploy_scanned', { params: { name: scan.appName, sveltekit: String(scan.isSvelteKit), services: scan.requiredServices.join(', ') || cliM('cli_deploy_none') } }))\n\n let skipMiddleware = options.skipMiddleware || options.skipProvision\n if (!skipMiddleware && !options.yes && scan.requiredServices.length) {\n const action = await prompts({\n type: 'select',\n name: 'value',\n message: cliM('cli_deploy_middleware_plan'),\n choices: [{ title: cliM('cli_deploy_middleware_configure'), value: 'configure' }, { title: cliM('cli_deploy_middleware_skip'), value: 'skip' }],\n })\n if (!action.value)\n throw new Error(cliM('cli_deploy_cancelled'))\n skipMiddleware = action.value === 'skip'\n }\n if (skipMiddleware)\n core.logger.info(cliM('cli_deploy_middleware_skipped'))\n const serviceModes = skipMiddleware\n ? Object.fromEntries(scan.requiredServices.map(service => [service, 'keep' as const]))\n : await configureDeployMiddleware(deployModule, scan, environment.data, deployConfig, options.yes)\n if (skipMiddleware)\n deployConfig.services = undefined\n // 刚写入文件的值不能被本次命令之前注入的快照覆盖;保留用户原有进程变量优先级。\n for (const key of Object.keys(process.env)) {\n if (originalEnv[key] === undefined)\n delete process.env[key]\n }\n Object.assign(process.env, originalEnv)\n const refreshed = deployModule.loadDeploymentEnvironment({ environment: environment.data.environment, envDir: environment.data.envDir })\n if (!refreshed.success)\n throw new Error(refreshed.error.message)\n Object.assign(process.env, refreshed.data.values)\n\n // 4. 初始化 deploy 模块\n spinner.start(cliM('cli_deploy_initializing'))\n const validatedConfig = deployModule.DeployConfigSchema.safeParse(deployConfig)\n if (!validatedConfig.success)\n throw new Error(cliM('cli_deploy_init_failed', { params: { message: cliM('cli_deploy_invalid_value') } }))\n const initResult = await deploy.init(validatedConfig.data)\n if (!initResult.success) {\n throw new Error(cliM('cli_deploy_init_failed', { params: { message: initResult.error.message } }))\n }\n closeDeploy = () => deploy.close()\n spinner.succeed(cliM('cli_deploy_initialized'))\n\n // 5. 执行部署\n spinner.start(cliM('cli_deploy_deploying'))\n const deployResult = await deploy.deployApp(appDir, {\n projectName: options.projectName,\n skipProvision: skipMiddleware,\n skipBuild: options.skipBuild,\n environment: environment.data.environment,\n envDir: environment.data.envDir,\n serviceModes,\n })\n\n if (!deployResult.success) {\n if (deployResult.error.ext?.recovery) {\n core.logger.warn(deployResult.error.suggestion ?? cliM('cli_deploy_command_failed'), {\n recovery: deployResult.error.ext.recovery,\n })\n }\n throw new Error(cliM('cli_deploy_failed', { params: { message: deployResult.error.message } }))\n }\n\n spinner.succeed(chalk.green(cliM('cli_deploy_success')))\n for (const key of Object.keys(process.env)) {\n if (originalEnv[key] === undefined)\n delete process.env[key]\n }\n Object.assign(process.env, originalEnv)\n const completedEnvironment = deployModule.loadDeploymentEnvironment({ environment: environment.data.environment, envDir: environment.data.envDir })\n if (!completedEnvironment.success)\n throw new Error(completedEnvironment.error.message)\n for (const requirement of scan.middlewares ?? []) {\n if ((serviceModes[requirement.envPrefix] ?? serviceModes[requirement.service]) === 'keep')\n continue\n const value = completedEnvironment.data.values[requirement.envPrefix]\n if (value !== undefined)\n core.logger.info(cliM('cli_deploy_saved', { params: { name: requirement.envPrefix, value: displayDeployValue(requirement.envPrefix, value) } }))\n }\n core.logger.info('')\n core.logger.info(chalk.cyan(cliM('cli_deploy_url', { params: { url: deployResult.data.url } })))\n core.logger.info(chalk.gray(cliM('cli_deploy_id', { params: { id: deployResult.data.deploymentId } })))\n if (deployResult.data.envVarsSet.length > 0) {\n core.logger.info(chalk.gray(cliM('cli_deploy_env', { params: { names: deployResult.data.envVarsSet.join(', ') } })))\n }\n core.logger.info('')\n }\n catch (error) {\n spinner.fail(chalk.red(cliM('cli_deploy_command_failed')))\n core.logger.error(error instanceof Error ? error.message : String(error))\n throw error\n }\n finally {\n if (closeDeploy) {\n try {\n await closeDeploy()\n }\n catch (error) {\n core.logger.error('Failed to close deploy module', { error })\n process.exitCode = 1\n }\n }\n for (const key of Object.keys(process.env)) {\n if (originalEnv[key] === undefined)\n delete process.env[key]\n }\n Object.assign(process.env, originalEnv)\n }\n}\n","/**\n * @h-ai/cli — 代码生成命令\n * @module cli-generate\n */\n\nimport type { GenerateOptions, GeneratorType, TemplateContext } from '../cli-types.js'\nimport path from 'node:path'\nimport { core } from '@h-ai/core'\nimport chalk from 'chalk'\nimport fse from 'fs-extra'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { cliM } from '../cli-i18n.js'\nimport { createTemplateContext } from '../cli-utils.js'\nimport { detectProject } from './cli-create.js'\n\n/**\n * 生成器配置\n */\nconst GENERATORS: Record<GeneratorType, {\n description: string\n defaultPath: string\n generate: (context: TemplateContext, outputDir: string) => Promise<Array<{ path: string, content: string }>>\n}> = {\n page: {\n description: 'SvelteKit 页面',\n defaultPath: 'src/routes',\n generate: generatePage,\n },\n component: {\n description: 'Svelte 组件',\n defaultPath: 'src/lib/components',\n generate: generateComponent,\n },\n api: {\n description: 'API 端点',\n defaultPath: 'src/routes/api',\n generate: generateApi,\n },\n model: {\n description: '数据模型',\n defaultPath: 'src/lib/models',\n generate: generateModel,\n },\n migration: {\n description: '数据库迁移',\n defaultPath: 'migrations',\n generate: generateMigration,\n },\n}\n\n/**\n * 生成代码\n */\nexport async function generate(options: GenerateOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? '.'\n\n try {\n // 检查是否在 hai 项目中\n const project = await detectProject(cwd)\n\n if (!project?.isHaiProject) {\n core.logger.warn(chalk.yellow('警告: 当前目录不是 hai 项目'))\n }\n\n // 交互式获取选项\n const resolvedOptions = await resolveGenerateOptions(options)\n const generator = GENERATORS[resolvedOptions.type]\n\n if (!generator) {\n throw new Error(`未知的生成器类型: ${resolvedOptions.type}`)\n }\n\n // 名称会同时进入路径、标识符与源码字符串,禁止路径片段和代码字符。\n if (!/^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$/i.test(resolvedOptions.name))\n throw new Error(cliM('cli_invalidGenerateName'))\n\n const outputDir = path.resolve(cwd, resolvedOptions.output || generator.defaultPath)\n\n // 安全校验:输出路径必须在当前工作目录内,防止路径遍历\n const resolvedCwd = path.resolve(cwd)\n if (!outputDir.startsWith(resolvedCwd + path.sep) && outputDir !== resolvedCwd) {\n throw new Error(cliM('cli_generateOutsideWorkspace'))\n }\n\n const context = createTemplateContext(resolvedOptions.name, {\n projectName: project?.name,\n })\n\n spinner.start(`生成 ${generator.description}...`)\n\n const files = await generator.generate(context, outputDir)\n const realCwd = await fse.realpath(resolvedCwd)\n // 先检查全部目标,再落盘,避免页面的第二个文件冲突时已覆盖第一个。\n for (const file of files) {\n if (!resolvedOptions.force && await fse.pathExists(file.path))\n throw new Error(cliM('cli_generateExists', { params: { path: file.path } }))\n let ancestor = file.path\n while (!await fse.pathExists(ancestor))\n ancestor = path.dirname(ancestor)\n const realAncestor = await fse.realpath(ancestor)\n const relative = path.relative(realCwd, realAncestor)\n if (relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative))\n throw new Error(cliM('cli_generateOutsideWorkspace'))\n }\n for (const file of files) {\n await fse.ensureDir(path.dirname(file.path))\n await fse.writeFile(file.path, file.content, { encoding: 'utf-8', flag: resolvedOptions.force ? 'w' : 'wx' })\n }\n\n spinner.succeed()\n\n core.logger.info('', {})\n core.logger.info(chalk.green('✔ 生成完成!'))\n core.logger.info('', {})\n core.logger.info('创建的文件:')\n files.forEach((file) => {\n core.logger.info(chalk.cyan(` ${path.relative(cwd, file.path)}`))\n })\n core.logger.info('', {})\n }\n catch (error) {\n spinner.fail()\n core.logger.error(chalk.red('生成失败:'), { error })\n throw error\n }\n}\n\n/**\n * 解析生成选项\n */\nasync function resolveGenerateOptions(options: GenerateOptions): Promise<Required<GenerateOptions>> {\n const questions: prompts.PromptObject[] = []\n\n if (!options.type) {\n questions.push({\n type: 'select',\n name: 'type',\n message: '选择生成类型:',\n choices: Object.entries(GENERATORS).map(([key, value]) => ({\n title: `${key} - ${value.description}`,\n value: key,\n })),\n })\n }\n\n if (!options.name) {\n questions.push({\n type: 'text',\n name: 'name',\n message: '名称:',\n validate: (value: string) => {\n if (!value.trim())\n return '名称不能为空'\n return true\n },\n })\n }\n\n const answers = questions.length > 0 ? await prompts(questions) : {}\n\n return {\n type: options.type || answers.type,\n name: options.name || answers.name,\n output: options.output ?? '',\n force: options.force ?? false,\n verbose: options.verbose ?? false,\n cwd: options.cwd ?? '.',\n }\n}\n\n/**\n * 生成页面\n */\nasync function generatePage(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n const pageDir = path.join(outputDir, context.kebabCase)\n\n // +page.svelte\n const pageContent = `<!-- ${context.pascalCase} 页面 -->\n<svelte:head>\n <title>${context.pascalCase}</title>\n</svelte:head>\n\n<div class='container mx-auto p-4'>\n <h1 class='text-2xl font-bold mb-4'>${context.pascalCase}</h1>\n\n <!-- 页面内容 -->\n</div>\n`\n\n const pagePath = path.join(pageDir, '+page.svelte')\n files.push({ path: pagePath, content: pageContent })\n\n // +page.server.ts\n const serverContent = `/**\n * ${context.pascalCase} 页面服务端\n */\nimport type { Actions, PageServerLoad } from './$types'\n\nexport const load: PageServerLoad = async () => {\n return {\n // 页面数据\n }\n}\n\nexport const actions: Actions = {\n default: async () => {\n // 表单处理\n },\n}\n`\n\n const serverPath = path.join(pageDir, '+page.server.ts')\n files.push({ path: serverPath, content: serverContent })\n\n return files\n}\n\n/**\n * 生成组件\n */\nasync function generateComponent(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n\n // Component.svelte\n const componentContent = `<script lang='ts'>\n import type { Snippet } from 'svelte'\n\n /**\n * ${context.pascalCase} 组件\n */\n\n interface Props {\n /** 自定义 class */\n class?: string\n /** 子内容(Svelte 5 snippet) */\n children?: Snippet\n }\n\n const { class: className = '', children }: Props = $props()\n</script>\n\n<div class={className}>\n <!-- 组件内容 -->\n {@render children?.()}\n</div>\n`\n\n const componentPath = path.join(outputDir, `${context.pascalCase}.svelte`)\n files.push({ path: componentPath, content: componentContent })\n\n return files\n}\n\n/**\n * 生成 API 端点\n */\nasync function generateApi(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n const apiDir = path.join(outputDir, context.kebabCase)\n\n // +server.ts\n const serverContent = `/**\n * ${context.pascalCase} API\n */\nimport type { RequestHandler } from './$types'\nimport { kit } from '@h-ai/kit'\nimport { z } from 'zod'\n\n/** 示例输入;添加业务逻辑前扩展字段和约束。 */\nconst InputSchema = z.object({\n /** 业务名称(非空) */\n name: z.string().min(1),\n})\n\n/**\n * GET ${context.kebabCase}\n */\nexport const GET: RequestHandler = kit.handler(async ({ locals }) => {\n return kit.response.ok({ items: [] }, locals.requestId)\n})\n\n/**\n * POST ${context.kebabCase}\n */\nexport const POST: RequestHandler = kit.handler(async ({ request, locals }) => {\n const body = await kit.validate.body(request, InputSchema)\n // 校验通过后再执行业务操作;示例仅回传数据,不执行写入。\n return kit.response.ok(body, locals.requestId)\n})\n`\n\n const serverPath = path.join(apiDir, '+server.ts')\n files.push({ path: serverPath, content: serverContent })\n\n return files\n}\n\n/**\n * 生成数据模型\n */\nasync function generateModel(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n\n // model.ts\n const modelContent = `/**\n * ${context.pascalCase} 模型\n */\nimport { z } from 'zod'\n\n/**\n * ${context.pascalCase} Schema\n */\nexport const ${context.camelCase}Schema = z.object({\n /** 记录唯一标识 */\n id: z.string(),\n /** 显示名称 */\n name: z.string().min(1),\n /** 创建时间 */\n createdAt: z.date(),\n /** 最后修改时间 */\n updatedAt: z.date(),\n})\n\n/**\n * 创建 ${context.pascalCase} Schema\n */\nexport const create${context.pascalCase}Schema = ${context.camelCase}Schema.omit({\n id: true,\n createdAt: true,\n updatedAt: true,\n})\n\n/**\n * 更新 ${context.pascalCase} Schema\n */\nexport const update${context.pascalCase}Schema = create${context.pascalCase}Schema.partial()\n\n/**\n * ${context.pascalCase} 类型\n */\nexport type ${context.pascalCase} = z.infer<typeof ${context.camelCase}Schema>\nexport type Create${context.pascalCase} = z.infer<typeof create${context.pascalCase}Schema>\nexport type Update${context.pascalCase} = z.infer<typeof update${context.pascalCase}Schema>\n`\n\n const modelPath = path.join(outputDir, `${context.kebabCase}.ts`)\n files.push({ path: modelPath, content: modelContent })\n\n return files\n}\n\n/**\n * 生成迁移\n */\nasync function generateMigration(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n const timestamp = Date.now()\n\n // migration.ts\n const migrationContent = `/**\n * 迁移: ${context.pascalCase}\n * 时间: ${new Date().toISOString()}\n */\nimport { reldb } from '@h-ai/reldb'\n\n/** 升级:调用前初始化 reldb,调用方必须检查返回的 HaiResult。 */\nexport function up() {\n return reldb.ddl.createTable('hai_app_${context.snakeCase}', {\n id: { type: 'TEXT', primaryKey: true },\n name: { type: 'TEXT', notNull: true },\n created_at: { type: 'TIMESTAMP', notNull: true },\n updated_at: { type: 'TIMESTAMP', notNull: true },\n })\n}\n\n/** 回滚会删除整张表;由应用确认数据可删除后显式调用。 */\nexport function down() {\n return reldb.ddl.dropTable('hai_app_${context.snakeCase}')\n}\n`\n\n const migrationPath = path.join(outputDir, `${timestamp}_${context.snakeCase}.ts`)\n files.push({ path: migrationPath, content: migrationContent })\n\n return files\n}\n","/**\n * @h-ai/cli — 项目初始化/校验命令\n *\n * 校验现有项目配置完整性,补全缺失的配置文件。\n * @module cli-init\n */\n\nimport type { GlobalOptions, ProjectInfo } from '../cli-types.js'\nimport path from 'node:path'\nimport { core } from '@h-ai/core'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { fileExists, writeFile } from '../cli-utils.js'\nimport { generateConfigFile } from './cli-config-templates.js'\nimport { detectProject } from './cli-create.js'\n\n/**\n * init 命令选项\n */\nexport interface InitOptions extends GlobalOptions {\n /** 强制重新生成配置 */\n force?: boolean\n}\n\n/**\n * 模块到配置文件的映射\n */\nconst MODULE_CONFIG_MAP: Record<string, { configKey: string, label: string }> = {\n '@h-ai/core': { configKey: 'core', label: 'Core' },\n '@h-ai/serv': { configKey: 'serv', label: 'Service' },\n '@h-ai/reldb': { configKey: 'db', label: 'Database' },\n '@h-ai/cache': { configKey: 'cache', label: 'Cache' },\n '@h-ai/iam': { configKey: 'iam', label: 'IAM' },\n '@h-ai/storage': { configKey: 'storage', label: 'Storage' },\n '@h-ai/ai': { configKey: 'ai', label: 'AI' },\n '@h-ai/vecdb': { configKey: 'vecdb', label: 'VecDB' },\n '@h-ai/reach': { configKey: 'reach', label: 'Reach' },\n '@h-ai/scheduler': { configKey: 'scheduler', label: 'Scheduler' },\n '@h-ai/audit': { configKey: 'audit', label: 'Audit' },\n '@h-ai/payment': { configKey: 'payment', label: 'Payment' },\n '@h-ai/deploy': { configKey: 'deploy', label: 'Deploy' },\n}\n\n/**\n * 校验结果\n */\ninterface ValidationResult {\n /** 已存在的配置 */\n existing: string[]\n /** 缺失的配置 */\n missing: Array<{ pkg: string, configKey: string, label: string }>\n /** 项目信息 */\n project: ProjectInfo\n}\n\n/**\n * 校验项目配置完整性\n */\nasync function validateProject(cwd: string): Promise<ValidationResult | null> {\n const project = await detectProject(cwd)\n if (!project) {\n return null\n }\n\n const existing: string[] = []\n const missing: ValidationResult['missing'] = []\n\n for (const pkg of project.haiPackages) {\n const mapping = MODULE_CONFIG_MAP[pkg]\n if (!mapping)\n continue\n\n const configPath = path.join(cwd, 'config', `_${mapping.configKey}.yml`)\n if (await fileExists(configPath)) {\n existing.push(mapping.configKey)\n }\n else {\n missing.push({ pkg, configKey: mapping.configKey, label: mapping.label })\n }\n }\n\n return { existing, missing, project }\n}\n\n/**\n * 初始化/校验项目配置\n */\nexport async function initProject(options: InitOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? '.'\n\n try {\n // 检测项目\n spinner.start('检测项目...')\n const result = await validateProject(cwd)\n\n if (!result) {\n spinner.fail(chalk.red('未检测到项目(找不到 package.json)'))\n return\n }\n\n const { project, existing, missing } = result\n spinner.succeed(`检测到项目: ${chalk.cyan(project.name)}`)\n\n // 即使配置齐备,也补全新增 AI 参考资源;已有项目规则与 Skill 不覆盖。\n if (project.isHaiProject) {\n const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates.js')\n const generatedFiles = await generateProjectAiSupport(cwd, resolveSkillNamesForPackages(project.haiPackages), {\n overwriteSkills: false,\n overwriteBridgeFiles: false,\n })\n for (const generatedFile of generatedFiles) {\n core.logger.info(chalk.gray(` + ${generatedFile}`))\n }\n }\n\n // 显示项目状态\n core.logger.info('')\n core.logger.info(chalk.bold('项目状态:'))\n core.logger.info(` 名称: ${chalk.cyan(project.name)}`)\n core.logger.info(` 版本: ${project.version}`)\n core.logger.info(` 已安装模块: ${project.haiPackages.length > 0 ? project.haiPackages.map(p => chalk.cyan(p)).join(', ') : chalk.gray('无')}`)\n core.logger.info('')\n\n // 显示配置状态\n if (existing.length > 0) {\n core.logger.info(chalk.bold('已有配置:'))\n for (const key of existing) {\n core.logger.info(chalk.green(` ✔ config/_${key}.yml`))\n }\n }\n\n // 无缺失配置\n if (missing.length === 0 && !options.force) {\n core.logger.info('')\n core.logger.info(chalk.green('✔ 所有配置文件已就绪!'))\n return\n }\n\n // 补全缺失配置\n if (missing.length > 0) {\n core.logger.info('')\n core.logger.info(chalk.bold('缺失配置:'))\n for (const item of missing) {\n core.logger.info(chalk.yellow(` ✘ config/_${item.configKey}.yml (${item.label})`))\n }\n core.logger.info('')\n\n spinner.start('生成缺失配置文件...')\n let generated = 0\n for (const item of missing) {\n const configPath = path.join(cwd, 'config', `_${item.configKey}.yml`)\n const content = generateConfigFile(item.configKey)\n await writeFile(configPath, content)\n generated++\n }\n spinner.succeed(`已生成 ${generated} 个配置文件`)\n }\n\n // 强制模式:重新生成所有配置\n if (options.force && existing.length > 0) {\n core.logger.info('')\n spinner.start('强制重新生成所有配置文件...')\n let regenerated = 0\n for (const pkg of project.haiPackages) {\n const mapping = MODULE_CONFIG_MAP[pkg]\n if (!mapping)\n continue\n const configPath = path.join(cwd, 'config', `_${mapping.configKey}.yml`)\n const content = generateConfigFile(mapping.configKey)\n await writeFile(configPath, content)\n regenerated++\n }\n spinner.succeed(`已重新生成 ${regenerated} 个配置文件`)\n }\n\n // 检查 core 配置(始终需要)\n const coreConfigPath = path.join(cwd, 'config', '_core.yml')\n if (!(await fileExists(coreConfigPath))) {\n spinner.start('生成核心配置 config/_core.yml...')\n const content = generateConfigFile('core')\n await writeFile(coreConfigPath, content)\n spinner.succeed()\n }\n\n core.logger.info('')\n core.logger.info(chalk.green('✔ 项目配置初始化完成!'))\n core.logger.info('')\n core.logger.info(chalk.gray('下一步:'))\n core.logger.info(chalk.gray(' 1. 编辑 config/ 中的配置文件'))\n core.logger.info(chalk.gray(' 2. 运行 pnpm dev 启动开发服务'))\n core.logger.info('')\n }\n catch (error) {\n spinner.fail()\n core.logger.error(chalk.red('初始化失败:'), { error })\n throw error\n }\n}\n","/**\n * @h-ai/cli — 主入口\n *\n * hai Agent Framework CLI\n * @module cli-main\n */\n\nimport type { AppType, CreateProjectOptions, FeatureId, FrontendTarget, GeneratorType } from './cli-types.js'\nimport process from 'node:process'\nimport { cac } from 'cac'\nimport chalk from 'chalk'\nimport { getCliVersion, writeCliMessage } from './cli-utils.js'\nimport { addModule, createProject, deployCommand, generate, initProject } from './commands/cli-commands.js'\n\n// CLI 版本(从 package.json 动态读取,避免硬编码与 npm 发布版本不一致)\nconst VERSION = getCliVersion()\n\n// 创建 CLI\nconst cli = cac('hai')\n\n// 全局选项\ncli.option('-v, --verbose', '显示详细输出')\ncli.option('-C, --cwd <path>', '工作目录')\n\n// 创建项目命令\ncli\n .command('create [name]', '创建新的 hai 项目')\n .option('--type <type>', '应用类型 (admin, website, h5, api, mobile-app, fullstack)')\n .option('--frontends <targets>', '前后端分离工程前端目标 (逗号分隔: web,app,miniapp,desktop)')\n .option('-t, --template <template>', '项目模板 (minimal, default, full, custom)')\n .option('-f, --features <features>', '功能列表 (逗号分隔: iam,db,cache,ai,storage,crypto)')\n .option('--examples', '添加示例代码')\n .option('--no-examples', '不添加示例代码')\n .option('--no-install', '不安装依赖')\n .option('-p, --package-manager <pm>', '包管理器 (pnpm, npm, yarn)')\n .option('--no-git', '不初始化 Git')\n .option('--git-remote <url>', 'Git 远程仓库地址')\n .option('-y, --yes', '使用默认配置,跳过交互')\n .action(async (name: string | undefined, options: Record<string, unknown>) => {\n try {\n // 解析功能列表\n const features = typeof options.features === 'string'\n ? options.features.split(',').map(f => f.trim()) as CreateProjectOptions['features']\n : undefined\n const frontends = typeof options.frontends === 'string'\n ? options.frontends.split(',').map(f => f.trim()).filter(Boolean) as FrontendTarget[]\n : undefined\n\n await createProject({\n name: name ?? '',\n appType: options.type as AppType,\n frontends,\n template: options.template as CreateProjectOptions['template'],\n features,\n examples: options.examples as boolean,\n install: options.install as boolean,\n packageManager: options.packageManager as CreateProjectOptions['packageManager'],\n git: options.git as boolean,\n gitRemote: options.gitRemote as string,\n yes: options.yes as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n // 保留自然退出,让终端/管道中的失败详情写完。\n process.exitCode = 1\n }\n })\n\n// 增量添加模块\ncli\n .command('add [module]', '向现有项目添加模块')\n .option('--no-install', '不安装依赖')\n .action(async (module: string | undefined, options: Record<string, unknown>) => {\n try {\n await addModule({\n module: module as FeatureId,\n install: options.install as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n process.exit(1)\n }\n })\n\n// 初始化/校验配置\ncli\n .command('init', '初始化/校验项目配置')\n .option('-f, --force', '强制重新生成配置')\n .action(async (options: Record<string, unknown>) => {\n try {\n await initProject({\n force: options.force as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n process.exit(1)\n }\n })\n\n// 代码生成命令\ncli\n .command('generate [type] [name]', '生成代码')\n .alias('g')\n .option('-o, --output <path>', '输出路径')\n .option('-f, --force', '覆盖现有文件')\n .action(async (type: string | undefined, name: string | undefined, options: Record<string, unknown>) => {\n try {\n await generate({\n type: type as GeneratorType,\n name: name ?? '',\n output: options.output as string,\n force: options.force as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n process.exit(1)\n }\n })\n\n// 部署命令\ncli\n .command('deploy [appDir]', '部署应用到云平台')\n .option('--env <environment>', '部署环境(test / prod 等,必须存在对应环境文件)')\n .option('--env-dir <path>', '环境文件所在目录(默认自动查找)')\n .option('-y, --yes', '按当前后端默认配置部署,目标环境已有完整配置时保持不变')\n .option('--project-name <name>', '项目名称(默认使用应用目录名)')\n .option('--skip-provision', '配置已完备,跳过中间件配置与开通,直接部署')\n .option('--skip-middleware', '配置已完备,跳过全部中间件处理,直接部署')\n .option('--skip-build', '跳过构建')\n .action(async (appDir: string | undefined, options: Record<string, unknown>) => {\n try {\n await deployCommand({\n appDir,\n env: options.env as string,\n envDir: options.envDir as string,\n yes: options.yes as boolean,\n projectName: options.projectName as string,\n skipProvision: options.skipProvision as boolean,\n skipMiddleware: options.skipMiddleware as boolean,\n skipBuild: options.skipBuild as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n process.exit(1)\n }\n })\n\n// 快捷生成命令\ncli\n .command('g:page <name>', '生成页面')\n .action(async (name: string, options: Record<string, unknown>) => {\n await generate({ type: 'page', name, cwd: options.cwd as string })\n })\n\ncli\n .command('g:component <name>', '生成组件')\n .action(async (name: string, options: Record<string, unknown>) => {\n await generate({ type: 'component', name, cwd: options.cwd as string })\n })\n\ncli\n .command('g:api <name>', '生成 API')\n .action(async (name: string, options: Record<string, unknown>) => {\n await generate({ type: 'api', name, cwd: options.cwd as string })\n })\n\ncli\n .command('g:model <name>', '生成数据模型')\n .action(async (name: string, options: Record<string, unknown>) => {\n await generate({ type: 'model', name, cwd: options.cwd as string })\n })\n\n// 版本和帮助\ncli.version(VERSION)\ncli.help()\n\n// 解析参数\nconst parsed = cli.parse()\n\n// 无命令且未请求帮助/版本时显示帮助\nif (!cli.matchedCommand && !parsed.options.help && !parsed.options.version) {\n writeCliMessage('')\n writeCliMessage(chalk.cyan('hai Agent Framework CLI'))\n writeCliMessage('')\n cli.outputHelp()\n}\n"]}
|