jishushell 0.4.24 → 0.5.15
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/INSTALL-NOTICE +11 -0
- package/apps/anythingllm-container.yaml +287 -0
- package/apps/browserless-chromium-container.yaml +90 -0
- package/apps/filebrowser-container.yaml +163 -0
- package/apps/hermes-container.yaml +36 -2
- package/apps/ollama-binary.yaml +91 -90
- package/apps/ollama-cpu-container.yaml +8 -1
- package/apps/ollama-with-hollama-binary.yaml +91 -90
- package/apps/openclaw-binary.yaml +38 -1
- package/apps/openclaw-container.yaml +45 -2
- package/apps/openclaw-with-ollama-container.yaml +11 -2
- package/apps/openclaw-with-searxng-container.yaml +26 -2
- package/apps/openwebui-container.yaml +45 -1
- package/apps/playwright-container.yaml +7 -1
- package/apps/searxng-container.yaml +58 -7
- package/apps/weknora-container.yaml +471 -0
- package/dist/cli/app.js +79 -9
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/doctor.d.ts +12 -12
- package/dist/cli/doctor.js +242 -55
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/llm.d.ts +4 -3
- package/dist/cli/llm.js +4 -3
- package/dist/cli/llm.js.map +1 -1
- package/dist/cli/panel.d.ts +6 -5
- package/dist/cli/panel.js +10 -9
- package/dist/cli/panel.js.map +1 -1
- package/dist/config.d.ts +19 -0
- package/dist/config.js +99 -1
- package/dist/config.js.map +1 -1
- package/dist/control.d.ts +7 -6
- package/dist/control.js +7 -6
- package/dist/control.js.map +1 -1
- package/dist/install.js +3 -3
- package/dist/install.js.map +1 -1
- package/dist/routes/agent-apps.d.ts +1 -1
- package/dist/routes/agent-apps.js +1 -1
- package/dist/routes/apps.js +44 -11
- package/dist/routes/apps.js.map +1 -1
- package/dist/routes/auth.js +5 -2
- package/dist/routes/auth.js.map +1 -1
- package/dist/routes/backup.js +64 -11
- package/dist/routes/backup.js.map +1 -1
- package/dist/routes/external-mounts.d.ts +17 -0
- package/dist/routes/external-mounts.js +73 -0
- package/dist/routes/external-mounts.js.map +1 -0
- package/dist/routes/file-mounts.d.ts +13 -0
- package/dist/routes/file-mounts.js +90 -0
- package/dist/routes/file-mounts.js.map +1 -0
- package/dist/routes/files-organize.d.ts +28 -0
- package/dist/routes/files-organize.js +167 -0
- package/dist/routes/files-organize.js.map +1 -0
- package/dist/routes/files.d.ts +31 -0
- package/dist/routes/files.js +321 -0
- package/dist/routes/files.js.map +1 -0
- package/dist/routes/instances.js +826 -17
- package/dist/routes/instances.js.map +1 -1
- package/dist/routes/internal.d.ts +2 -0
- package/dist/routes/internal.js +59 -0
- package/dist/routes/internal.js.map +1 -0
- package/dist/routes/llm.js +24 -35
- package/dist/routes/llm.js.map +1 -1
- package/dist/routes/setup.js +10 -10
- package/dist/routes/setup.js.map +1 -1
- package/dist/routes/system.js +1 -1
- package/dist/routes/system.js.map +1 -1
- package/dist/routes/webdav.d.ts +17 -0
- package/dist/routes/webdav.js +114 -0
- package/dist/routes/webdav.js.map +1 -0
- package/dist/server.d.ts +9 -0
- package/dist/server.js +751 -20
- package/dist/server.js.map +1 -1
- package/dist/services/agent-apps/catalog.js +4 -3
- package/dist/services/agent-apps/catalog.js.map +1 -1
- package/dist/services/agent-apps/index.d.ts +1 -1
- package/dist/services/agent-apps/index.js +1 -1
- package/dist/services/agent-apps/installers/adapter.d.ts +1 -1
- package/dist/services/agent-apps/installers/adapter.js +1 -1
- package/dist/services/agent-apps/installers/shell-script.d.ts +1 -1
- package/dist/services/agent-apps/installers/shell-script.js +3 -3
- package/dist/services/agent-apps/installers/shell-script.js.map +1 -1
- package/dist/services/agent-apps/types.d.ts +2 -2
- package/dist/services/agent-apps/types.js +1 -1
- package/dist/services/app/app-compiler.d.ts +1 -1
- package/dist/services/app/app-compiler.js +5 -5
- package/dist/services/app/app-compiler.js.map +1 -1
- package/dist/services/app/app-manager.d.ts +25 -1
- package/dist/services/app/app-manager.js +829 -150
- package/dist/services/app/app-manager.js.map +1 -1
- package/dist/services/app/custom-manager.js.map +1 -1
- package/dist/services/app/hermes-agent-manager.js +7 -4
- package/dist/services/app/hermes-agent-manager.js.map +1 -1
- package/dist/services/app/ollama-manager.js +1 -1
- package/dist/services/app/ollama-manager.js.map +1 -1
- package/dist/services/app/openclaw-manager.js +20 -3
- package/dist/services/app/openclaw-manager.js.map +1 -1
- package/dist/services/app/platform-transform.d.ts +32 -0
- package/dist/services/app/platform-transform.js +65 -0
- package/dist/services/app/platform-transform.js.map +1 -0
- package/dist/services/app/provide-resolver.d.ts +29 -0
- package/dist/services/app/provide-resolver.js +112 -0
- package/dist/services/app/provide-resolver.js.map +1 -0
- package/dist/services/app-passwords.d.ts +61 -0
- package/dist/services/app-passwords.js +173 -0
- package/dist/services/app-passwords.js.map +1 -0
- package/dist/services/backup-manager.d.ts +11 -0
- package/dist/services/backup-manager.js +177 -4
- package/dist/services/backup-manager.js.map +1 -1
- package/dist/services/capability-endpoint-validator.d.ts +41 -0
- package/dist/services/capability-endpoint-validator.js +104 -0
- package/dist/services/capability-endpoint-validator.js.map +1 -0
- package/dist/services/capability-health.d.ts +16 -0
- package/dist/services/capability-health.js +121 -0
- package/dist/services/capability-health.js.map +1 -0
- package/dist/services/capability-registry.d.ts +106 -0
- package/dist/services/capability-registry.js +313 -0
- package/dist/services/capability-registry.js.map +1 -0
- package/dist/services/connection-apply.d.ts +91 -0
- package/dist/services/connection-apply.js +475 -0
- package/dist/services/connection-apply.js.map +1 -0
- package/dist/services/connection-resolver.d.ts +65 -0
- package/dist/services/connection-resolver.js +281 -0
- package/dist/services/connection-resolver.js.map +1 -0
- package/dist/services/connection-transactor.d.ts +39 -0
- package/dist/services/connection-transactor.js +351 -0
- package/dist/services/connection-transactor.js.map +1 -0
- package/dist/services/external-mounts.d.ts +40 -0
- package/dist/services/external-mounts.js +187 -0
- package/dist/services/external-mounts.js.map +1 -0
- package/dist/services/files-manager.d.ts +252 -0
- package/dist/services/files-manager.js +1075 -0
- package/dist/services/files-manager.js.map +1 -0
- package/dist/services/files-mounts.d.ts +42 -0
- package/dist/services/files-mounts.js +207 -0
- package/dist/services/files-mounts.js.map +1 -0
- package/dist/services/instance-manager.d.ts +13 -0
- package/dist/services/instance-manager.js +138 -46
- package/dist/services/instance-manager.js.map +1 -1
- package/dist/services/llm-proxy/index.d.ts +16 -2
- package/dist/services/llm-proxy/index.js +48 -44
- package/dist/services/llm-proxy/index.js.map +1 -1
- package/dist/services/llm-proxy/probe.d.ts +6 -0
- package/dist/services/llm-proxy/probe.js +85 -0
- package/dist/services/llm-proxy/probe.js.map +1 -0
- package/dist/services/llm-proxy/ssrf.d.ts +1 -0
- package/dist/services/llm-proxy/ssrf.js +24 -9
- package/dist/services/llm-proxy/ssrf.js.map +1 -1
- package/dist/services/nomad-manager.d.ts +4 -0
- package/dist/services/nomad-manager.js +428 -35
- package/dist/services/nomad-manager.js.map +1 -1
- package/dist/services/organize/applier.d.ts +46 -0
- package/dist/services/organize/applier.js +218 -0
- package/dist/services/organize/applier.js.map +1 -0
- package/dist/services/organize/rules.d.ts +57 -0
- package/dist/services/organize/rules.js +286 -0
- package/dist/services/organize/rules.js.map +1 -0
- package/dist/services/organize/scanner.d.ts +50 -0
- package/dist/services/organize/scanner.js +366 -0
- package/dist/services/organize/scanner.js.map +1 -0
- package/dist/services/organize/store.d.ts +14 -0
- package/dist/services/organize/store.js +82 -0
- package/dist/services/organize/store.js.map +1 -0
- package/dist/services/panel-manager.js +20 -1
- package/dist/services/panel-manager.js.map +1 -1
- package/dist/services/process-manager.js +4 -3
- package/dist/services/process-manager.js.map +1 -1
- package/dist/services/runtime/adapters/hermes.d.ts +30 -1
- package/dist/services/runtime/adapters/hermes.js +219 -6
- package/dist/services/runtime/adapters/hermes.js.map +1 -1
- package/dist/services/runtime/adapters/openclaw-mcporter.d.ts +45 -0
- package/dist/services/runtime/adapters/openclaw-mcporter.js +108 -0
- package/dist/services/runtime/adapters/openclaw-mcporter.js.map +1 -0
- package/dist/services/runtime/adapters/openclaw-routes.d.ts +8 -2
- package/dist/services/runtime/adapters/openclaw-routes.js +68 -0
- package/dist/services/runtime/adapters/openclaw-routes.js.map +1 -1
- package/dist/services/runtime/adapters/openclaw.d.ts +177 -0
- package/dist/services/runtime/adapters/openclaw.js +1171 -11
- package/dist/services/runtime/adapters/openclaw.js.map +1 -1
- package/dist/services/runtime/instance.d.ts +1 -1
- package/dist/services/runtime/instance.js +1 -1
- package/dist/services/runtime/instance.js.map +1 -1
- package/dist/services/runtime/mcp-shims/anythingllm-shim.d.ts +46 -0
- package/dist/services/runtime/mcp-shims/anythingllm-shim.js +281 -0
- package/dist/services/runtime/mcp-shims/anythingllm-shim.js.map +1 -0
- package/dist/services/runtime/mcp-shims/drive-shim.d.ts +54 -0
- package/dist/services/runtime/mcp-shims/drive-shim.js +489 -0
- package/dist/services/runtime/mcp-shims/drive-shim.js.map +1 -0
- package/dist/services/runtime/mcp-shims/firewall.d.ts +26 -0
- package/dist/services/runtime/mcp-shims/firewall.js +129 -0
- package/dist/services/runtime/mcp-shims/firewall.js.map +1 -0
- package/dist/services/runtime/mcp-shims/searxng-shim.d.ts +27 -0
- package/dist/services/runtime/mcp-shims/searxng-shim.js +125 -0
- package/dist/services/runtime/mcp-shims/searxng-shim.js.map +1 -0
- package/dist/services/runtime/mcp-shims/write-mcp-entry.d.ts +83 -0
- package/dist/services/runtime/mcp-shims/write-mcp-entry.js +127 -0
- package/dist/services/runtime/mcp-shims/write-mcp-entry.js.map +1 -0
- package/dist/services/runtime/migrations.d.ts +8 -0
- package/dist/services/runtime/migrations.js +100 -0
- package/dist/services/runtime/migrations.js.map +1 -1
- package/dist/services/runtime/types.d.ts +46 -0
- package/dist/services/setup-manager.js +99 -24
- package/dist/services/setup-manager.js.map +1 -1
- package/dist/services/suggestions.d.ts +27 -0
- package/dist/services/suggestions.js +133 -0
- package/dist/services/suggestions.js.map +1 -0
- package/dist/services/task-registry.js +4 -2
- package/dist/services/task-registry.js.map +1 -1
- package/dist/services/telemetry/device-fingerprint.d.ts +1 -1
- package/dist/services/telemetry/device-fingerprint.js +1 -1
- package/dist/services/types-shim.d.ts +16 -0
- package/dist/services/types-shim.js +2 -0
- package/dist/services/types-shim.js.map +1 -0
- package/dist/services/webdav/server.d.ts +24 -0
- package/dist/services/webdav/server.js +420 -0
- package/dist/services/webdav/server.js.map +1 -0
- package/dist/services/webdav/xml-builder.d.ts +73 -0
- package/dist/services/webdav/xml-builder.js +156 -0
- package/dist/services/webdav/xml-builder.js.map +1 -0
- package/dist/services/workspace-builder.d.ts +29 -0
- package/dist/services/workspace-builder.js +188 -0
- package/dist/services/workspace-builder.js.map +1 -0
- package/dist/types.d.ts +231 -1
- package/dist/utils/instance-lock.d.ts +22 -0
- package/dist/utils/instance-lock.js +48 -0
- package/dist/utils/instance-lock.js.map +1 -0
- package/dist/utils/path-locks.d.ts +30 -0
- package/dist/utils/path-locks.js +63 -0
- package/dist/utils/path-locks.js.map +1 -0
- package/dist/utils/path-safety.d.ts +41 -0
- package/dist/utils/path-safety.js +119 -0
- package/dist/utils/path-safety.js.map +1 -0
- package/dist/utils/safe-json.js +55 -22
- package/dist/utils/safe-json.js.map +1 -1
- package/dist/utils/safe-write.d.ts +24 -0
- package/dist/utils/safe-write.js +82 -0
- package/dist/utils/safe-write.js.map +1 -0
- package/install/jishu-install.sh +323 -27
- package/install/jishu-uninstall.sh +353 -20
- package/package.json +18 -1
- package/public/assets/Dashboard-BdWPtroF.js +1 -0
- package/public/assets/{HermesChatPanel-mFSureyc.js → HermesChatPanel-B_2HlVBQ.js} +1 -1
- package/public/assets/HermesConfigForm-DVlhg3WV.js +4 -0
- package/public/assets/{InitPassword-CVA8wQA6.js → InitPassword-D7glTExX.js} +1 -1
- package/public/assets/InstanceDetail-CxSy2cpe.js +92 -0
- package/public/assets/{Login-BWsZH2mu.js → Login-Cfr5c2sv.js} +1 -1
- package/public/assets/NewInstance-BIYDmJis.js +1 -0
- package/public/assets/ProviderRecommendations-BuRnvRcI.js +1 -0
- package/public/assets/Settings-Cc-tYBil.js +1 -0
- package/public/assets/Setup-lGZEk5jq.js +1 -0
- package/public/assets/{WeixinLoginPanel-CnjR8xMu.js → WeixinLoginPanel-CoGqzxeV.js} +2 -2
- package/public/assets/index-87IJXG-w.css +1 -0
- package/public/assets/index-BZc5zH7u.js +19 -0
- package/public/assets/providers-DtNXh9JD.js +1 -0
- package/public/assets/registry-BWnkJgZ1.js +2 -0
- package/public/assets/{usePolling-Do5Erqm_.js → usePolling-CwwT9KrC.js} +1 -1
- package/public/assets/{vendor-i18n-ucpM0OR0.js → vendor-i18n-y9V7Sfuu.js} +1 -1
- package/public/assets/{vendor-react-Bk1hRGiY.js → vendor-react-BWrEVJVb.js} +6 -6
- package/public/index.html +4 -4
- package/scripts/check-app-spec.mjs +457 -0
- package/scripts/check-i18n.mjs +154 -0
- package/scripts/check-new-file-tests.mjs +230 -0
- package/scripts/check-quarantine-expiry.mjs +105 -0
- package/scripts/perf/README.md +49 -0
- package/scripts/perf/auth.js +99 -0
- package/scripts/perf/config.js +63 -0
- package/scripts/perf/instances.js +143 -0
- package/scripts/perf/proxy.js +96 -0
- package/scripts/run.sh +4 -4
- package/scripts/smoke/files-w1.sh +142 -0
- package/scripts/smoke-backend.mjs +122 -0
- package/scripts/smoke-post-publish.mjs +346 -0
- package/public/assets/Dashboard-B-JoOjBQ.js +0 -1
- package/public/assets/HermesConfigForm-DvR05LK1.js +0 -4
- package/public/assets/InstanceDetail-DcZW2QGO.js +0 -91
- package/public/assets/NewInstance-BCIrAd86.js +0 -1
- package/public/assets/Settings-xkDcduFz.js +0 -1
- package/public/assets/Setup-Cfuwj4gV.js +0 -1
- package/public/assets/index-CPhVFEsx.css +0 -1
- package/public/assets/index-DQsM6Joa.js +0 -19
- package/public/assets/providers-V-vwrExZ.js +0 -1
- package/public/assets/registry-B4UFJdpA.js +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/services/webdav/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,OAAO,EAEL,UAAU,GACX,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,UAAU,GAEX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAoB,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAU7C,sDAAsD;AAEtD;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,WAAmB;IAC5D,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpD,IAAI,OAAO,GAAG,MAAM,CAAC;IACrB,6CAA6C;IAC7C,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1C,IAAI,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACjF,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACxD,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1D,2DAA2D;IAC3D,OAAO,OAAO;SACX,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,IAAI,CAAC;YACH,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;SACvB,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,sDAAsD;AAEtD,SAAS,UAAU,CACjB,GAAkB,EAClB,GAAW,EACX,UAAmB;IAEnB,OAAO,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,OAAO,CAAC,KAAmB,EAAE,MAAe;IACnD,KAAK;SACF,IAAI,CAAC,GAAG,CAAC;SACT,MAAM,CAAC,cAAc,EAAE,2BAA2B,CAAC;SACnD,IAAI,CAAC,cAAc,MAAM,IAAI,gBAAgB,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,sDAAsD;AAEtD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAmB,EACnB,IAAoB,EACpB,KAAmB;IAEnB,KAAK;SACF,IAAI,CAAC,GAAG,CAAC;SACT,MAAM,CACL,OAAO,EACP,8DAA8D,CAC/D;SACA,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC;SAClB,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,iCAAiC;SAChE,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,sDAAsD;AAEtD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAkB,EAClB,GAAmB,EACnB,KAAmB;IAEnB,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAExD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,KAA2B,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAE/C,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACnC,IAAI,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QACD,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,IAAI,CAAC,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;IAED,MAAM,SAAS,GAAkB;QAC/B,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC;KACpD,CAAC;IAEF,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACrC,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS,CAAC,gCAAgC;YACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC5C,IAAI,SAAmB,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBAClC,IAAI,EAAE,CAAC,cAAc,EAAE;oBAAE,SAAS;gBAClC,SAAS,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACpC,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC/C,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;YACpD,IAAI,CAAC,UAAU,CAAC,OAAO;gBAAE,SAAS,CAAC,8BAA8B;YACjE,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACzD,KAAK;SACF,IAAI,CAAC,GAAG,CAAC;SACT,MAAM,CAAC,cAAc,EAAE,kCAAkC,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC;SAClB,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CACrB,GAAW,EACX,IAAc,EACd,WAAmB;IAEnB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,OAAO;QACL,OAAO,EAAE,GAAG;QACZ,WAAW;QACX,KAAK;QACL,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;QAC3B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtC,IAAI,EAAE,MAAM,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG;QACpD,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IAC3B,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,WAAW,GAA2B;IAC1C,MAAM,EAAE,2BAA2B;IACnC,KAAK,EAAE,8BAA8B;IACrC,OAAO,EAAE,kBAAkB;IAC3B,MAAM,EAAE,iBAAiB;IACzB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,iBAAiB;IACzB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,iBAAiB;CAC1B,CAAC;AAEF,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,0BAA0B,CAAC;AACxD,CAAC;AAED,sDAAsD;AAEtD,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAkB,EAClB,GAAmB,EACnB,KAAmB,EACnB,QAAiB;IAEjB,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAExD,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACjD,KAAK;aACF,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC;aAC9B,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aACxC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC;aACtB,MAAM,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;aAC/D,MAAM,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QACpC,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,sDAAsD;AAEtD,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAkB,EAClB,GAAmB,EACnB,KAAmB;IAEnB,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAExD,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,iEAAiE;IACjE,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;IAC5E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,GAA0B,CAAC;IAC5C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,wDAAwD;QACxD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE;YAC3D,SAAS,EAAE,IAAI;YACf,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;QACH,kEAAkE;QAClE,+DAA+D;QAC/D,KAAK;aACF,IAAI,CAAC,GAAG,CAAC;aACT,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC;aAC3B,MAAM,CAAC,gBAAgB,EAAE,GAAG,CAAC;aAC7B,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,sDAAsD;AAEtD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAkB,EAClB,GAAmB,EACnB,KAAmB;IAEnB,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAExD,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,sDAAsD;AAEtD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,GAAkB,EAClB,GAAmB,EACnB,KAAmB;IAEnB,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAExD,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IAED,0DAA0D;IAC1D,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAW,EAAE,EAAE,CAAC,CAAC;IACxE,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,sDAAsD;AAEtD,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAkB,EAClB,GAAmB,EACnB,KAAmB;IAEnB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,sBAAsB,CAAC,GAAG,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IAC3D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IACD,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACjD,IAAI,CAAC,SAAS,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAE5D,MAAM,SAAS,GACb,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC;SACjC,IAAI,EAAE;SACN,WAAW,EAAE,KAAK,GAAG,CAAC;IAE3B,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QACvD,gEAAgE;QAChE,mEAAmE;QACnE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACvD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,sDAAsD;AAEtD,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAkB,EAClB,GAAmB,EACnB,KAAmB;IAEnB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,sBAAsB,CAAC,GAAG,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IAC3D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IACD,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAClD,IAAI,CAAC,SAAS,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAE5D,MAAM,SAAS,GACb,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC;SACjC,IAAI,EAAE;SACN,WAAW,EAAE,KAAK,GAAG,CAAC;IAE3B,mEAAmE;IACnE,qEAAqE;IACrE,4DAA4D;IAC5D,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACjD,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QACH,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACvB,KAAK;aACF,IAAI,CAAC,GAAG,CAAC;aACT,IAAI,CAAC,yDAAyD,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,mEAAmE;QACnE,MAAM,YAAY,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;YACnC,MAAM,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACvD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAC7B,GAAmB,EACnB,WAAmB;IAEnB,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC;IACpC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACjD,uEAAuE;IACvE,mEAAmE;IACnE,IAAI,IAAI,GAAG,GAAG,CAAC;IACf,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;IACD,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/C,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjD,OAAO,IAAI;SACR,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,IAAI,CAAC;YACH,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;SACvB,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,sDAAsD;AAEtD,SAAS,cAAc,CAAC,KAAmB,EAAE,CAAU;IACrD,IAAI,CAAC,YAAY,UAAU,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACzC,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,CAA8B,CAAC;IAC3C,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,gBAAgB,CAAC,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebDAV XML serialization (M3 W4 PR-2).
|
|
3
|
+
*
|
|
4
|
+
* We serialize a tiny subset of RFC 4918 PROPFIND multistatus responses
|
|
5
|
+
* — exactly what iOS Files / macOS Finder / Windows Explorer / WinSCP
|
|
6
|
+
* actually inspect. We deliberately avoid pulling an XML library:
|
|
7
|
+
* outputs are template-driven and the surface is < 200 lines.
|
|
8
|
+
*
|
|
9
|
+
* Properties supported per resource:
|
|
10
|
+
* D:displayname
|
|
11
|
+
* D:resourcetype (<D:collection/> for dirs, empty for files)
|
|
12
|
+
* D:getcontentlength (files only)
|
|
13
|
+
* D:getlastmodified (RFC 1123)
|
|
14
|
+
* D:creationdate (ISO 8601 with timezone)
|
|
15
|
+
* D:getetag (weak, "W/\"size-mtime\"")
|
|
16
|
+
* D:getcontenttype (files only)
|
|
17
|
+
* D:supportedlock (empty — we do not implement locking)
|
|
18
|
+
* D:lockdiscovery (empty)
|
|
19
|
+
*
|
|
20
|
+
* Properties NOT supported (clients tolerate missing): D:quota-*,
|
|
21
|
+
* D:executable, D:source — return 404 in propstat if explicitly asked.
|
|
22
|
+
*
|
|
23
|
+
* Caller is responsible for path safety on `href` — we URL-encode but
|
|
24
|
+
* do not validate the path is inside the WebDAV root.
|
|
25
|
+
*/
|
|
26
|
+
export interface DavResource {
|
|
27
|
+
/**
|
|
28
|
+
* Path relative to the WebDAV root, WITHOUT the leading `/webdav`
|
|
29
|
+
* mount prefix. For the root itself pass `""`. For a directory
|
|
30
|
+
* `notes`, pass `"notes"` — the builder appends a trailing slash
|
|
31
|
+
* for collections automatically.
|
|
32
|
+
*/
|
|
33
|
+
pathRel: string;
|
|
34
|
+
displayName: string;
|
|
35
|
+
isDir: boolean;
|
|
36
|
+
size: number;
|
|
37
|
+
/** Unix seconds. */
|
|
38
|
+
mtime: number;
|
|
39
|
+
/** Already-formed weak ETag, e.g. `W/"123-456789"`. */
|
|
40
|
+
etag: string;
|
|
41
|
+
/** Files only; ignored for directories. */
|
|
42
|
+
mime?: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Build a complete <D:multistatus> XML document for a PROPFIND.
|
|
46
|
+
*
|
|
47
|
+
* @param mountPrefix the absolute URL prefix the client used to reach
|
|
48
|
+
* us, e.g. `/webdav` (must NOT end in `/`)
|
|
49
|
+
* @param resources ordered list; the first entry should be the
|
|
50
|
+
* target resource itself (Depth: 0 returns only
|
|
51
|
+
* this), followed by children (Depth: 1)
|
|
52
|
+
*/
|
|
53
|
+
export declare function buildMultistatus(mountPrefix: string, resources: DavResource[]): string;
|
|
54
|
+
/**
|
|
55
|
+
* Build a `<D:multistatus>` for a single 404 — used when MOVE/COPY
|
|
56
|
+
* destination doesn't exist, or PROPFIND on missing path.
|
|
57
|
+
*/
|
|
58
|
+
export declare function buildNotFoundMultistatus(mountPrefix: string, pathRel: string): string;
|
|
59
|
+
export declare function escapeXml(s: string): string;
|
|
60
|
+
/**
|
|
61
|
+
* Encode one path segment per RFC 3986. Path-segment-safe, but
|
|
62
|
+
* percent-encodes anything outside the allowed set so spaces, CJK
|
|
63
|
+
* characters etc. survive transit.
|
|
64
|
+
*/
|
|
65
|
+
export declare function encodePathSegment(seg: string): string;
|
|
66
|
+
export declare function rfc1123(unixSec: number): string;
|
|
67
|
+
export declare function iso8601(unixSec: number): string;
|
|
68
|
+
/**
|
|
69
|
+
* Parse a Depth header. Returns 0, 1, or "infinity"; defaults to
|
|
70
|
+
* infinity per RFC 4918, but we cap at 1 because directory walks at
|
|
71
|
+
* arbitrary depth are a DOS surface.
|
|
72
|
+
*/
|
|
73
|
+
export declare function parseDepth(header: string | undefined): 0 | 1;
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebDAV XML serialization (M3 W4 PR-2).
|
|
3
|
+
*
|
|
4
|
+
* We serialize a tiny subset of RFC 4918 PROPFIND multistatus responses
|
|
5
|
+
* — exactly what iOS Files / macOS Finder / Windows Explorer / WinSCP
|
|
6
|
+
* actually inspect. We deliberately avoid pulling an XML library:
|
|
7
|
+
* outputs are template-driven and the surface is < 200 lines.
|
|
8
|
+
*
|
|
9
|
+
* Properties supported per resource:
|
|
10
|
+
* D:displayname
|
|
11
|
+
* D:resourcetype (<D:collection/> for dirs, empty for files)
|
|
12
|
+
* D:getcontentlength (files only)
|
|
13
|
+
* D:getlastmodified (RFC 1123)
|
|
14
|
+
* D:creationdate (ISO 8601 with timezone)
|
|
15
|
+
* D:getetag (weak, "W/\"size-mtime\"")
|
|
16
|
+
* D:getcontenttype (files only)
|
|
17
|
+
* D:supportedlock (empty — we do not implement locking)
|
|
18
|
+
* D:lockdiscovery (empty)
|
|
19
|
+
*
|
|
20
|
+
* Properties NOT supported (clients tolerate missing): D:quota-*,
|
|
21
|
+
* D:executable, D:source — return 404 in propstat if explicitly asked.
|
|
22
|
+
*
|
|
23
|
+
* Caller is responsible for path safety on `href` — we URL-encode but
|
|
24
|
+
* do not validate the path is inside the WebDAV root.
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* Build a complete <D:multistatus> XML document for a PROPFIND.
|
|
28
|
+
*
|
|
29
|
+
* @param mountPrefix the absolute URL prefix the client used to reach
|
|
30
|
+
* us, e.g. `/webdav` (must NOT end in `/`)
|
|
31
|
+
* @param resources ordered list; the first entry should be the
|
|
32
|
+
* target resource itself (Depth: 0 returns only
|
|
33
|
+
* this), followed by children (Depth: 1)
|
|
34
|
+
*/
|
|
35
|
+
export function buildMultistatus(mountPrefix, resources) {
|
|
36
|
+
const responses = resources.map((r) => buildResponse(mountPrefix, r)).join("");
|
|
37
|
+
return (`<?xml version="1.0" encoding="utf-8"?>\n` +
|
|
38
|
+
`<D:multistatus xmlns:D="DAV:">${responses}</D:multistatus>\n`);
|
|
39
|
+
}
|
|
40
|
+
function buildResponse(mountPrefix, r) {
|
|
41
|
+
const href = buildHref(mountPrefix, r);
|
|
42
|
+
const propLines = [
|
|
43
|
+
`<D:displayname>${escapeXml(r.displayName)}</D:displayname>`,
|
|
44
|
+
r.isDir
|
|
45
|
+
? `<D:resourcetype><D:collection/></D:resourcetype>`
|
|
46
|
+
: `<D:resourcetype/>`,
|
|
47
|
+
`<D:getlastmodified>${rfc1123(r.mtime)}</D:getlastmodified>`,
|
|
48
|
+
`<D:creationdate>${iso8601(r.mtime)}</D:creationdate>`,
|
|
49
|
+
`<D:getetag>${escapeXml(r.etag)}</D:getetag>`,
|
|
50
|
+
`<D:supportedlock/>`,
|
|
51
|
+
`<D:lockdiscovery/>`,
|
|
52
|
+
];
|
|
53
|
+
if (!r.isDir) {
|
|
54
|
+
propLines.push(`<D:getcontentlength>${r.size}</D:getcontentlength>`);
|
|
55
|
+
if (r.mime) {
|
|
56
|
+
propLines.push(`<D:getcontenttype>${escapeXml(r.mime)}</D:getcontenttype>`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return (`<D:response>` +
|
|
60
|
+
`<D:href>${href}</D:href>` +
|
|
61
|
+
`<D:propstat>` +
|
|
62
|
+
`<D:prop>${propLines.join("")}</D:prop>` +
|
|
63
|
+
`<D:status>HTTP/1.1 200 OK</D:status>` +
|
|
64
|
+
`</D:propstat>` +
|
|
65
|
+
`</D:response>`);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* URL-encode each path segment (NOT the slashes between them) and
|
|
69
|
+
* append a trailing slash for collections — required by RFC 4918 so
|
|
70
|
+
* Finder / iOS Files render the icon as a directory rather than a
|
|
71
|
+
* zero-byte file.
|
|
72
|
+
*/
|
|
73
|
+
function buildHref(mountPrefix, r) {
|
|
74
|
+
const cleanPrefix = mountPrefix.replace(/\/+$/, "");
|
|
75
|
+
const segs = (r.pathRel || "").split("/").filter(Boolean);
|
|
76
|
+
const encoded = segs.map(encodePathSegment).join("/");
|
|
77
|
+
let href = encoded ? `${cleanPrefix}/${encoded}` : `${cleanPrefix}/`;
|
|
78
|
+
if (r.isDir && !href.endsWith("/"))
|
|
79
|
+
href += "/";
|
|
80
|
+
return href;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Build a `<D:multistatus>` for a single 404 — used when MOVE/COPY
|
|
84
|
+
* destination doesn't exist, or PROPFIND on missing path.
|
|
85
|
+
*/
|
|
86
|
+
export function buildNotFoundMultistatus(mountPrefix, pathRel) {
|
|
87
|
+
const href = encodeURI(`${mountPrefix.replace(/\/+$/, "")}/${pathRel}`);
|
|
88
|
+
return (`<?xml version="1.0" encoding="utf-8"?>\n` +
|
|
89
|
+
`<D:multistatus xmlns:D="DAV:">` +
|
|
90
|
+
`<D:response>` +
|
|
91
|
+
`<D:href>${escapeXml(href)}</D:href>` +
|
|
92
|
+
`<D:status>HTTP/1.1 404 Not Found</D:status>` +
|
|
93
|
+
`</D:response>` +
|
|
94
|
+
`</D:multistatus>\n`);
|
|
95
|
+
}
|
|
96
|
+
// ── Helpers ────────────────────────────────────────
|
|
97
|
+
const XML_ESCAPES = {
|
|
98
|
+
"&": "&",
|
|
99
|
+
"<": "<",
|
|
100
|
+
">": ">",
|
|
101
|
+
'"': """,
|
|
102
|
+
"'": "'",
|
|
103
|
+
};
|
|
104
|
+
export function escapeXml(s) {
|
|
105
|
+
return s.replace(/[&<>"']/g, (c) => XML_ESCAPES[c] ?? c);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Encode one path segment per RFC 3986. Path-segment-safe, but
|
|
109
|
+
* percent-encodes anything outside the allowed set so spaces, CJK
|
|
110
|
+
* characters etc. survive transit.
|
|
111
|
+
*/
|
|
112
|
+
export function encodePathSegment(seg) {
|
|
113
|
+
// encodeURIComponent encodes too aggressively (escapes /, ?, #) but
|
|
114
|
+
// for a single segment that's exactly what we want — we then assemble
|
|
115
|
+
// segments with literal `/` ourselves.
|
|
116
|
+
return encodeURIComponent(seg)
|
|
117
|
+
.replace(/'/g, "%27")
|
|
118
|
+
.replace(/\(/g, "%28")
|
|
119
|
+
.replace(/\)/g, "%29");
|
|
120
|
+
}
|
|
121
|
+
const RFC1123_DAYS = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
|
122
|
+
const RFC1123_MONTHS = [
|
|
123
|
+
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
|
124
|
+
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
|
|
125
|
+
];
|
|
126
|
+
export function rfc1123(unixSec) {
|
|
127
|
+
const d = new Date(unixSec * 1000);
|
|
128
|
+
const dayName = RFC1123_DAYS[d.getUTCDay()];
|
|
129
|
+
const day = String(d.getUTCDate()).padStart(2, "0");
|
|
130
|
+
const monthName = RFC1123_MONTHS[d.getUTCMonth()];
|
|
131
|
+
const year = d.getUTCFullYear();
|
|
132
|
+
const hh = String(d.getUTCHours()).padStart(2, "0");
|
|
133
|
+
const mm = String(d.getUTCMinutes()).padStart(2, "0");
|
|
134
|
+
const ss = String(d.getUTCSeconds()).padStart(2, "0");
|
|
135
|
+
return `${dayName}, ${day} ${monthName} ${year} ${hh}:${mm}:${ss} GMT`;
|
|
136
|
+
}
|
|
137
|
+
export function iso8601(unixSec) {
|
|
138
|
+
return new Date(unixSec * 1000).toISOString();
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Parse a Depth header. Returns 0, 1, or "infinity"; defaults to
|
|
142
|
+
* infinity per RFC 4918, but we cap at 1 because directory walks at
|
|
143
|
+
* arbitrary depth are a DOS surface.
|
|
144
|
+
*/
|
|
145
|
+
export function parseDepth(header) {
|
|
146
|
+
if (header === undefined || header === null)
|
|
147
|
+
return 1;
|
|
148
|
+
const s = String(header).trim().toLowerCase();
|
|
149
|
+
if (s === "0")
|
|
150
|
+
return 0;
|
|
151
|
+
if (s === "1")
|
|
152
|
+
return 1;
|
|
153
|
+
// "infinity" defaults to 1 — we do not walk arbitrary depth
|
|
154
|
+
return 1;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=xml-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml-builder.js","sourceRoot":"","sources":["../../../src/services/webdav/xml-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { FileMount } from "./runtime/types.js";
|
|
2
|
+
export declare class WorkspaceBuilderError extends Error {
|
|
3
|
+
reason: string;
|
|
4
|
+
constructor(message: string, reason: string);
|
|
5
|
+
}
|
|
6
|
+
export interface RebuildWorkspaceArgs {
|
|
7
|
+
/** Absolute host path of the instance's openclaw-home directory. */
|
|
8
|
+
openclawHome: string;
|
|
9
|
+
/** Absolute host path of FILES_ROOT (~/.jishushell/files). */
|
|
10
|
+
filesRoot: string;
|
|
11
|
+
/** Validated mount set; pass through validateMounts before calling. */
|
|
12
|
+
mounts: FileMount[];
|
|
13
|
+
/** Owning instance — used by isolation rule. */
|
|
14
|
+
instanceId: string;
|
|
15
|
+
}
|
|
16
|
+
export interface RebuildResult {
|
|
17
|
+
/** What kind of workspace we produced. */
|
|
18
|
+
layout: "named" | "root" | "empty";
|
|
19
|
+
/** For "named", the alias → resolved abs target map for audit. */
|
|
20
|
+
symlinks: Record<string, string>;
|
|
21
|
+
}
|
|
22
|
+
export declare function rebuildWorkspace(args: RebuildWorkspaceArgs): RebuildResult;
|
|
23
|
+
/**
|
|
24
|
+
* For audit / UI. Given the live workspace, report the layout in
|
|
25
|
+
* structural form without touching it.
|
|
26
|
+
*/
|
|
27
|
+
export declare function describeWorkspace(openclawHome: string): RebuildResult & {
|
|
28
|
+
exists: boolean;
|
|
29
|
+
};
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build the workspace symlink layout for an instance (M1 W2 PR-2).
|
|
3
|
+
*
|
|
4
|
+
* Given a validated FileMount[] and the host paths involved, this module
|
|
5
|
+
* (re)creates `${openclawHome}/workspace/` so that:
|
|
6
|
+
*
|
|
7
|
+
* - For named mounts: workspace is a real directory whose entries
|
|
8
|
+
* are alias symlinks → FILES_ROOT/{mount.path}
|
|
9
|
+
*
|
|
10
|
+
* - For a single root mount: workspace itself is a symlink →
|
|
11
|
+
* FILES_ROOT/{mount.path}, replacing the directory wholesale
|
|
12
|
+
*
|
|
13
|
+
* Why we don't touch `${openclawHome}/.openclaw/workspace/`:
|
|
14
|
+
* That subtree is OpenClaw's private state directory (skills config,
|
|
15
|
+
* sessions, mcporter.json). We give the user-facing mount surface a
|
|
16
|
+
* separate top-level directory `workspace/` directly under HOME,
|
|
17
|
+
* keeping the two namespaces strictly disjoint.
|
|
18
|
+
*
|
|
19
|
+
* Safety contract — refuses to clobber unknown content:
|
|
20
|
+
* - If workspace/ already contains plain files or non-symlink dirs
|
|
21
|
+
* (i.e. data we don't recognize), throw rather than touch.
|
|
22
|
+
* - Existing symlinks ARE removed — they were placed by a prior
|
|
23
|
+
* rebuildWorkspace call.
|
|
24
|
+
* - This means a *one-time legacy migration* (PR-7) must run first
|
|
25
|
+
* for instances whose workspace currently contains real data.
|
|
26
|
+
*/
|
|
27
|
+
import * as fs from "node:fs";
|
|
28
|
+
import * as path from "node:path";
|
|
29
|
+
import { validateMounts, effectiveAlias, ensureMountTargets, } from "./files-mounts.js";
|
|
30
|
+
export class WorkspaceBuilderError extends Error {
|
|
31
|
+
reason;
|
|
32
|
+
constructor(message, reason) {
|
|
33
|
+
super(message);
|
|
34
|
+
this.reason = reason;
|
|
35
|
+
this.name = "WorkspaceBuilderError";
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const WORKSPACE_DIR_NAME = "workspace";
|
|
39
|
+
export function rebuildWorkspace(args) {
|
|
40
|
+
const { openclawHome, filesRoot, mounts, instanceId } = args;
|
|
41
|
+
// Validate up front — caller may have skipped this; we are the last
|
|
42
|
+
// line of defense before fs writes.
|
|
43
|
+
const v = validateMounts(mounts, instanceId);
|
|
44
|
+
if (!v.ok) {
|
|
45
|
+
const summary = v.errors.slice(0, 5).map((e) => e.message).join("; ");
|
|
46
|
+
throw new WorkspaceBuilderError(`mount set is invalid: ${summary}`, "invalid-mounts");
|
|
47
|
+
}
|
|
48
|
+
// Make sure all mount targets exist on the host so docker can bind
|
|
49
|
+
// them and so symlinks resolve.
|
|
50
|
+
ensureMountTargets(filesRoot, mounts);
|
|
51
|
+
if (!fs.existsSync(openclawHome)) {
|
|
52
|
+
fs.mkdirSync(openclawHome, { recursive: true });
|
|
53
|
+
}
|
|
54
|
+
const ws = path.join(openclawHome, WORKSPACE_DIR_NAME);
|
|
55
|
+
// Resolve mode: empty list → empty workspace; one root mount →
|
|
56
|
+
// root layout; otherwise named.
|
|
57
|
+
if (mounts.length === 0) {
|
|
58
|
+
clearWorkspace(ws);
|
|
59
|
+
return { layout: "empty", symlinks: {} };
|
|
60
|
+
}
|
|
61
|
+
const rootMount = mounts.find((m) => m.alias === null || m.alias === "");
|
|
62
|
+
if (rootMount) {
|
|
63
|
+
// Root mode is exclusive (validateMounts has already enforced
|
|
64
|
+
// that mounts.length === 1). Workspace itself becomes a symlink.
|
|
65
|
+
const target = path.join(filesRoot, rootMount.path);
|
|
66
|
+
replaceWithSymlink(ws, target);
|
|
67
|
+
return { layout: "root", symlinks: { "": target } };
|
|
68
|
+
}
|
|
69
|
+
// Named mode: workspace is a real directory; each entry is a symlink.
|
|
70
|
+
const symlinks = {};
|
|
71
|
+
if (fs.existsSync(ws)) {
|
|
72
|
+
const lst = fs.lstatSync(ws);
|
|
73
|
+
if (lst.isSymbolicLink()) {
|
|
74
|
+
// Was previously root-mode; remove and recreate as dir
|
|
75
|
+
fs.unlinkSync(ws);
|
|
76
|
+
fs.mkdirSync(ws);
|
|
77
|
+
}
|
|
78
|
+
else if (lst.isDirectory()) {
|
|
79
|
+
pruneSymlinkChildren(ws);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
throw new WorkspaceBuilderError(`workspace at ${ws} is a file; refusing to clobber`, "non-directory");
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
fs.mkdirSync(ws);
|
|
87
|
+
}
|
|
88
|
+
for (const m of mounts) {
|
|
89
|
+
const alias = effectiveAlias(m);
|
|
90
|
+
if (alias === null)
|
|
91
|
+
continue; // shouldn't happen here (rootMount filtered)
|
|
92
|
+
const target = path.join(filesRoot, m.path);
|
|
93
|
+
const linkPath = path.join(ws, alias);
|
|
94
|
+
fs.symlinkSync(target, linkPath);
|
|
95
|
+
symlinks[alias] = target;
|
|
96
|
+
}
|
|
97
|
+
return { layout: "named", symlinks };
|
|
98
|
+
}
|
|
99
|
+
function clearWorkspace(ws) {
|
|
100
|
+
if (!fs.existsSync(ws)) {
|
|
101
|
+
fs.mkdirSync(ws, { recursive: true });
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const lst = fs.lstatSync(ws);
|
|
105
|
+
if (lst.isSymbolicLink()) {
|
|
106
|
+
fs.unlinkSync(ws);
|
|
107
|
+
fs.mkdirSync(ws);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (lst.isDirectory()) {
|
|
111
|
+
pruneSymlinkChildren(ws);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
throw new WorkspaceBuilderError(`workspace at ${ws} is a file; refusing to clobber`, "non-directory");
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Remove every entry under ws/ that is a symlink. Refuse if any entry
|
|
118
|
+
* is a plain file or non-symlink directory — that means a previous
|
|
119
|
+
* version had real data here that hasn't been migrated yet (PR-7).
|
|
120
|
+
*/
|
|
121
|
+
function pruneSymlinkChildren(ws) {
|
|
122
|
+
for (const name of fs.readdirSync(ws)) {
|
|
123
|
+
const full = path.join(ws, name);
|
|
124
|
+
const lst = fs.lstatSync(full);
|
|
125
|
+
if (lst.isSymbolicLink()) {
|
|
126
|
+
fs.unlinkSync(full);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
throw new WorkspaceBuilderError(`workspace contains non-symlink entry ${name}; legacy migration required before mount changes`, "needs-migration");
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/** Replace `target` with a symlink to `linkTarget`, safe against existing
|
|
134
|
+
* symlinks (atomic via unlink+symlinkSync). Symlink children of an
|
|
135
|
+
* existing directory are pruned first; plain files trigger the legacy
|
|
136
|
+
* migration error. */
|
|
137
|
+
function replaceWithSymlink(target, linkTarget) {
|
|
138
|
+
if (fs.existsSync(target)) {
|
|
139
|
+
const lst = fs.lstatSync(target);
|
|
140
|
+
if (lst.isSymbolicLink()) {
|
|
141
|
+
fs.unlinkSync(target);
|
|
142
|
+
}
|
|
143
|
+
else if (lst.isDirectory()) {
|
|
144
|
+
// Reuse the same prune-or-throw policy as named mode so the
|
|
145
|
+
// named → root transition is symmetric with named → named.
|
|
146
|
+
pruneSymlinkChildren(target);
|
|
147
|
+
// After pruning, dir must be empty — otherwise pruneSymlinkChildren
|
|
148
|
+
// would have thrown.
|
|
149
|
+
fs.rmdirSync(target);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
throw new WorkspaceBuilderError(`workspace at ${target} is a regular file; refusing to clobber`, "non-directory");
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
fs.symlinkSync(linkTarget, target);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* For audit / UI. Given the live workspace, report the layout in
|
|
159
|
+
* structural form without touching it.
|
|
160
|
+
*/
|
|
161
|
+
export function describeWorkspace(openclawHome) {
|
|
162
|
+
const ws = path.join(openclawHome, WORKSPACE_DIR_NAME);
|
|
163
|
+
if (!fs.existsSync(ws)) {
|
|
164
|
+
return { exists: false, layout: "empty", symlinks: {} };
|
|
165
|
+
}
|
|
166
|
+
const lst = fs.lstatSync(ws);
|
|
167
|
+
if (lst.isSymbolicLink()) {
|
|
168
|
+
const target = fs.readlinkSync(ws);
|
|
169
|
+
return { exists: true, layout: "root", symlinks: { "": target } };
|
|
170
|
+
}
|
|
171
|
+
if (!lst.isDirectory()) {
|
|
172
|
+
return { exists: true, layout: "empty", symlinks: {} };
|
|
173
|
+
}
|
|
174
|
+
const symlinks = {};
|
|
175
|
+
for (const name of fs.readdirSync(ws)) {
|
|
176
|
+
const full = path.join(ws, name);
|
|
177
|
+
const childLst = fs.lstatSync(full);
|
|
178
|
+
if (!childLst.isSymbolicLink())
|
|
179
|
+
continue;
|
|
180
|
+
symlinks[name] = fs.readlinkSync(full);
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
exists: true,
|
|
184
|
+
layout: Object.keys(symlinks).length === 0 ? "empty" : "named",
|
|
185
|
+
symlinks,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=workspace-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-builder.js","sourceRoot":"","sources":["../../src/services/workspace-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EACL,cAAc,EACd,cAAc,EACd,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAG3B,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACV;IAApC,YAAY,OAAe,EAAS,MAAc;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC;QADmB,WAAM,GAAN,MAAM,CAAQ;QAEhD,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAoBD,MAAM,kBAAkB,GAAG,WAAW,CAAC;AAEvC,MAAM,UAAU,gBAAgB,CAC9B,IAA0B;IAE1B,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAE7D,oEAAoE;IACpE,oCAAoC;IACpC,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC7C,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACV,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,IAAI,qBAAqB,CAC7B,yBAAyB,OAAO,EAAE,EAClC,gBAAgB,CACjB,CAAC;IACJ,CAAC;IAED,mEAAmE;IACnE,gCAAgC;IAChC,kBAAkB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAEtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;IAEvD,+DAA+D;IAC/D,gCAAgC;IAChC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,cAAc,CAAC,EAAE,CAAC,CAAC;QACnB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC3C,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAC3B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,EAAE,CAC1C,CAAC;IAEF,IAAI,SAAS,EAAE,CAAC;QACd,8DAA8D;QAC9D,iEAAiE;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACpD,kBAAkB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC;IACtD,CAAC;IAED,sEAAsE;IACtE,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAE5C,IAAI,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC;YACzB,uDAAuD;YACvD,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAClB,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;aAAM,IAAI,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;YAC7B,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,qBAAqB,CAC7B,gBAAgB,EAAE,iCAAiC,EACnD,eAAe,CAChB,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS,CAAC,6CAA6C;QAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACtC,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACjC,QAAQ,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;IAC3B,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,cAAc,CAAC,EAAU;IAChC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;QACvB,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC7B,IAAI,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC;QACzB,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAClB,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACjB,OAAO;IACT,CAAC;IACD,IAAI,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;QACtB,oBAAoB,CAAC,EAAE,CAAC,CAAC;QACzB,OAAO;IACT,CAAC;IACD,MAAM,IAAI,qBAAqB,CAC7B,gBAAgB,EAAE,iCAAiC,EACnD,eAAe,CAChB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,EAAU;IACtC,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC;YACzB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,qBAAqB,CAC7B,wCAAwC,IAAI,kDAAkD,EAC9F,iBAAiB,CAClB,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;uBAGuB;AACvB,SAAS,kBAAkB,CAAC,MAAc,EAAE,UAAkB;IAC5D,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC;YACzB,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;aAAM,IAAI,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;YAC7B,4DAA4D;YAC5D,2DAA2D;YAC3D,oBAAoB,CAAC,MAAM,CAAC,CAAC;YAC7B,oEAAoE;YACpE,qBAAqB;YACrB,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,qBAAqB,CAC7B,gBAAgB,MAAM,yCAAyC,EAC/D,eAAe,CAChB,CAAC;QACJ,CAAC;IACH,CAAC;IACD,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,YAAoB;IAEpB,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;IACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC1D,CAAC;IACD,MAAM,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC7B,IAAI,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC;IACpE,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;QACvB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACzD,CAAC;IACD,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE;YAAE,SAAS;QACzC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;QAC9D,QAAQ;KACT,CAAC;AACJ,CAAC"}
|