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.
Files changed (281) hide show
  1. package/INSTALL-NOTICE +11 -0
  2. package/apps/anythingllm-container.yaml +287 -0
  3. package/apps/browserless-chromium-container.yaml +90 -0
  4. package/apps/filebrowser-container.yaml +163 -0
  5. package/apps/hermes-container.yaml +36 -2
  6. package/apps/ollama-binary.yaml +91 -90
  7. package/apps/ollama-cpu-container.yaml +8 -1
  8. package/apps/ollama-with-hollama-binary.yaml +91 -90
  9. package/apps/openclaw-binary.yaml +38 -1
  10. package/apps/openclaw-container.yaml +45 -2
  11. package/apps/openclaw-with-ollama-container.yaml +11 -2
  12. package/apps/openclaw-with-searxng-container.yaml +26 -2
  13. package/apps/openwebui-container.yaml +45 -1
  14. package/apps/playwright-container.yaml +7 -1
  15. package/apps/searxng-container.yaml +58 -7
  16. package/apps/weknora-container.yaml +471 -0
  17. package/dist/cli/app.js +79 -9
  18. package/dist/cli/app.js.map +1 -1
  19. package/dist/cli/doctor.d.ts +12 -12
  20. package/dist/cli/doctor.js +242 -55
  21. package/dist/cli/doctor.js.map +1 -1
  22. package/dist/cli/llm.d.ts +4 -3
  23. package/dist/cli/llm.js +4 -3
  24. package/dist/cli/llm.js.map +1 -1
  25. package/dist/cli/panel.d.ts +6 -5
  26. package/dist/cli/panel.js +10 -9
  27. package/dist/cli/panel.js.map +1 -1
  28. package/dist/config.d.ts +19 -0
  29. package/dist/config.js +99 -1
  30. package/dist/config.js.map +1 -1
  31. package/dist/control.d.ts +7 -6
  32. package/dist/control.js +7 -6
  33. package/dist/control.js.map +1 -1
  34. package/dist/install.js +3 -3
  35. package/dist/install.js.map +1 -1
  36. package/dist/routes/agent-apps.d.ts +1 -1
  37. package/dist/routes/agent-apps.js +1 -1
  38. package/dist/routes/apps.js +44 -11
  39. package/dist/routes/apps.js.map +1 -1
  40. package/dist/routes/auth.js +5 -2
  41. package/dist/routes/auth.js.map +1 -1
  42. package/dist/routes/backup.js +64 -11
  43. package/dist/routes/backup.js.map +1 -1
  44. package/dist/routes/external-mounts.d.ts +17 -0
  45. package/dist/routes/external-mounts.js +73 -0
  46. package/dist/routes/external-mounts.js.map +1 -0
  47. package/dist/routes/file-mounts.d.ts +13 -0
  48. package/dist/routes/file-mounts.js +90 -0
  49. package/dist/routes/file-mounts.js.map +1 -0
  50. package/dist/routes/files-organize.d.ts +28 -0
  51. package/dist/routes/files-organize.js +167 -0
  52. package/dist/routes/files-organize.js.map +1 -0
  53. package/dist/routes/files.d.ts +31 -0
  54. package/dist/routes/files.js +321 -0
  55. package/dist/routes/files.js.map +1 -0
  56. package/dist/routes/instances.js +826 -17
  57. package/dist/routes/instances.js.map +1 -1
  58. package/dist/routes/internal.d.ts +2 -0
  59. package/dist/routes/internal.js +59 -0
  60. package/dist/routes/internal.js.map +1 -0
  61. package/dist/routes/llm.js +24 -35
  62. package/dist/routes/llm.js.map +1 -1
  63. package/dist/routes/setup.js +10 -10
  64. package/dist/routes/setup.js.map +1 -1
  65. package/dist/routes/system.js +1 -1
  66. package/dist/routes/system.js.map +1 -1
  67. package/dist/routes/webdav.d.ts +17 -0
  68. package/dist/routes/webdav.js +114 -0
  69. package/dist/routes/webdav.js.map +1 -0
  70. package/dist/server.d.ts +9 -0
  71. package/dist/server.js +751 -20
  72. package/dist/server.js.map +1 -1
  73. package/dist/services/agent-apps/catalog.js +4 -3
  74. package/dist/services/agent-apps/catalog.js.map +1 -1
  75. package/dist/services/agent-apps/index.d.ts +1 -1
  76. package/dist/services/agent-apps/index.js +1 -1
  77. package/dist/services/agent-apps/installers/adapter.d.ts +1 -1
  78. package/dist/services/agent-apps/installers/adapter.js +1 -1
  79. package/dist/services/agent-apps/installers/shell-script.d.ts +1 -1
  80. package/dist/services/agent-apps/installers/shell-script.js +3 -3
  81. package/dist/services/agent-apps/installers/shell-script.js.map +1 -1
  82. package/dist/services/agent-apps/types.d.ts +2 -2
  83. package/dist/services/agent-apps/types.js +1 -1
  84. package/dist/services/app/app-compiler.d.ts +1 -1
  85. package/dist/services/app/app-compiler.js +5 -5
  86. package/dist/services/app/app-compiler.js.map +1 -1
  87. package/dist/services/app/app-manager.d.ts +25 -1
  88. package/dist/services/app/app-manager.js +829 -150
  89. package/dist/services/app/app-manager.js.map +1 -1
  90. package/dist/services/app/custom-manager.js.map +1 -1
  91. package/dist/services/app/hermes-agent-manager.js +7 -4
  92. package/dist/services/app/hermes-agent-manager.js.map +1 -1
  93. package/dist/services/app/ollama-manager.js +1 -1
  94. package/dist/services/app/ollama-manager.js.map +1 -1
  95. package/dist/services/app/openclaw-manager.js +20 -3
  96. package/dist/services/app/openclaw-manager.js.map +1 -1
  97. package/dist/services/app/platform-transform.d.ts +32 -0
  98. package/dist/services/app/platform-transform.js +65 -0
  99. package/dist/services/app/platform-transform.js.map +1 -0
  100. package/dist/services/app/provide-resolver.d.ts +29 -0
  101. package/dist/services/app/provide-resolver.js +112 -0
  102. package/dist/services/app/provide-resolver.js.map +1 -0
  103. package/dist/services/app-passwords.d.ts +61 -0
  104. package/dist/services/app-passwords.js +173 -0
  105. package/dist/services/app-passwords.js.map +1 -0
  106. package/dist/services/backup-manager.d.ts +11 -0
  107. package/dist/services/backup-manager.js +177 -4
  108. package/dist/services/backup-manager.js.map +1 -1
  109. package/dist/services/capability-endpoint-validator.d.ts +41 -0
  110. package/dist/services/capability-endpoint-validator.js +104 -0
  111. package/dist/services/capability-endpoint-validator.js.map +1 -0
  112. package/dist/services/capability-health.d.ts +16 -0
  113. package/dist/services/capability-health.js +121 -0
  114. package/dist/services/capability-health.js.map +1 -0
  115. package/dist/services/capability-registry.d.ts +106 -0
  116. package/dist/services/capability-registry.js +313 -0
  117. package/dist/services/capability-registry.js.map +1 -0
  118. package/dist/services/connection-apply.d.ts +91 -0
  119. package/dist/services/connection-apply.js +475 -0
  120. package/dist/services/connection-apply.js.map +1 -0
  121. package/dist/services/connection-resolver.d.ts +65 -0
  122. package/dist/services/connection-resolver.js +281 -0
  123. package/dist/services/connection-resolver.js.map +1 -0
  124. package/dist/services/connection-transactor.d.ts +39 -0
  125. package/dist/services/connection-transactor.js +351 -0
  126. package/dist/services/connection-transactor.js.map +1 -0
  127. package/dist/services/external-mounts.d.ts +40 -0
  128. package/dist/services/external-mounts.js +187 -0
  129. package/dist/services/external-mounts.js.map +1 -0
  130. package/dist/services/files-manager.d.ts +252 -0
  131. package/dist/services/files-manager.js +1075 -0
  132. package/dist/services/files-manager.js.map +1 -0
  133. package/dist/services/files-mounts.d.ts +42 -0
  134. package/dist/services/files-mounts.js +207 -0
  135. package/dist/services/files-mounts.js.map +1 -0
  136. package/dist/services/instance-manager.d.ts +13 -0
  137. package/dist/services/instance-manager.js +138 -46
  138. package/dist/services/instance-manager.js.map +1 -1
  139. package/dist/services/llm-proxy/index.d.ts +16 -2
  140. package/dist/services/llm-proxy/index.js +48 -44
  141. package/dist/services/llm-proxy/index.js.map +1 -1
  142. package/dist/services/llm-proxy/probe.d.ts +6 -0
  143. package/dist/services/llm-proxy/probe.js +85 -0
  144. package/dist/services/llm-proxy/probe.js.map +1 -0
  145. package/dist/services/llm-proxy/ssrf.d.ts +1 -0
  146. package/dist/services/llm-proxy/ssrf.js +24 -9
  147. package/dist/services/llm-proxy/ssrf.js.map +1 -1
  148. package/dist/services/nomad-manager.d.ts +4 -0
  149. package/dist/services/nomad-manager.js +428 -35
  150. package/dist/services/nomad-manager.js.map +1 -1
  151. package/dist/services/organize/applier.d.ts +46 -0
  152. package/dist/services/organize/applier.js +218 -0
  153. package/dist/services/organize/applier.js.map +1 -0
  154. package/dist/services/organize/rules.d.ts +57 -0
  155. package/dist/services/organize/rules.js +286 -0
  156. package/dist/services/organize/rules.js.map +1 -0
  157. package/dist/services/organize/scanner.d.ts +50 -0
  158. package/dist/services/organize/scanner.js +366 -0
  159. package/dist/services/organize/scanner.js.map +1 -0
  160. package/dist/services/organize/store.d.ts +14 -0
  161. package/dist/services/organize/store.js +82 -0
  162. package/dist/services/organize/store.js.map +1 -0
  163. package/dist/services/panel-manager.js +20 -1
  164. package/dist/services/panel-manager.js.map +1 -1
  165. package/dist/services/process-manager.js +4 -3
  166. package/dist/services/process-manager.js.map +1 -1
  167. package/dist/services/runtime/adapters/hermes.d.ts +30 -1
  168. package/dist/services/runtime/adapters/hermes.js +219 -6
  169. package/dist/services/runtime/adapters/hermes.js.map +1 -1
  170. package/dist/services/runtime/adapters/openclaw-mcporter.d.ts +45 -0
  171. package/dist/services/runtime/adapters/openclaw-mcporter.js +108 -0
  172. package/dist/services/runtime/adapters/openclaw-mcporter.js.map +1 -0
  173. package/dist/services/runtime/adapters/openclaw-routes.d.ts +8 -2
  174. package/dist/services/runtime/adapters/openclaw-routes.js +68 -0
  175. package/dist/services/runtime/adapters/openclaw-routes.js.map +1 -1
  176. package/dist/services/runtime/adapters/openclaw.d.ts +177 -0
  177. package/dist/services/runtime/adapters/openclaw.js +1171 -11
  178. package/dist/services/runtime/adapters/openclaw.js.map +1 -1
  179. package/dist/services/runtime/instance.d.ts +1 -1
  180. package/dist/services/runtime/instance.js +1 -1
  181. package/dist/services/runtime/instance.js.map +1 -1
  182. package/dist/services/runtime/mcp-shims/anythingllm-shim.d.ts +46 -0
  183. package/dist/services/runtime/mcp-shims/anythingllm-shim.js +281 -0
  184. package/dist/services/runtime/mcp-shims/anythingllm-shim.js.map +1 -0
  185. package/dist/services/runtime/mcp-shims/drive-shim.d.ts +54 -0
  186. package/dist/services/runtime/mcp-shims/drive-shim.js +489 -0
  187. package/dist/services/runtime/mcp-shims/drive-shim.js.map +1 -0
  188. package/dist/services/runtime/mcp-shims/firewall.d.ts +26 -0
  189. package/dist/services/runtime/mcp-shims/firewall.js +129 -0
  190. package/dist/services/runtime/mcp-shims/firewall.js.map +1 -0
  191. package/dist/services/runtime/mcp-shims/searxng-shim.d.ts +27 -0
  192. package/dist/services/runtime/mcp-shims/searxng-shim.js +125 -0
  193. package/dist/services/runtime/mcp-shims/searxng-shim.js.map +1 -0
  194. package/dist/services/runtime/mcp-shims/write-mcp-entry.d.ts +83 -0
  195. package/dist/services/runtime/mcp-shims/write-mcp-entry.js +127 -0
  196. package/dist/services/runtime/mcp-shims/write-mcp-entry.js.map +1 -0
  197. package/dist/services/runtime/migrations.d.ts +8 -0
  198. package/dist/services/runtime/migrations.js +100 -0
  199. package/dist/services/runtime/migrations.js.map +1 -1
  200. package/dist/services/runtime/types.d.ts +46 -0
  201. package/dist/services/setup-manager.js +99 -24
  202. package/dist/services/setup-manager.js.map +1 -1
  203. package/dist/services/suggestions.d.ts +27 -0
  204. package/dist/services/suggestions.js +133 -0
  205. package/dist/services/suggestions.js.map +1 -0
  206. package/dist/services/task-registry.js +4 -2
  207. package/dist/services/task-registry.js.map +1 -1
  208. package/dist/services/telemetry/device-fingerprint.d.ts +1 -1
  209. package/dist/services/telemetry/device-fingerprint.js +1 -1
  210. package/dist/services/types-shim.d.ts +16 -0
  211. package/dist/services/types-shim.js +2 -0
  212. package/dist/services/types-shim.js.map +1 -0
  213. package/dist/services/webdav/server.d.ts +24 -0
  214. package/dist/services/webdav/server.js +420 -0
  215. package/dist/services/webdav/server.js.map +1 -0
  216. package/dist/services/webdav/xml-builder.d.ts +73 -0
  217. package/dist/services/webdav/xml-builder.js +156 -0
  218. package/dist/services/webdav/xml-builder.js.map +1 -0
  219. package/dist/services/workspace-builder.d.ts +29 -0
  220. package/dist/services/workspace-builder.js +188 -0
  221. package/dist/services/workspace-builder.js.map +1 -0
  222. package/dist/types.d.ts +231 -1
  223. package/dist/utils/instance-lock.d.ts +22 -0
  224. package/dist/utils/instance-lock.js +48 -0
  225. package/dist/utils/instance-lock.js.map +1 -0
  226. package/dist/utils/path-locks.d.ts +30 -0
  227. package/dist/utils/path-locks.js +63 -0
  228. package/dist/utils/path-locks.js.map +1 -0
  229. package/dist/utils/path-safety.d.ts +41 -0
  230. package/dist/utils/path-safety.js +119 -0
  231. package/dist/utils/path-safety.js.map +1 -0
  232. package/dist/utils/safe-json.js +55 -22
  233. package/dist/utils/safe-json.js.map +1 -1
  234. package/dist/utils/safe-write.d.ts +24 -0
  235. package/dist/utils/safe-write.js +82 -0
  236. package/dist/utils/safe-write.js.map +1 -0
  237. package/install/jishu-install.sh +323 -27
  238. package/install/jishu-uninstall.sh +353 -20
  239. package/package.json +18 -1
  240. package/public/assets/Dashboard-BdWPtroF.js +1 -0
  241. package/public/assets/{HermesChatPanel-mFSureyc.js → HermesChatPanel-B_2HlVBQ.js} +1 -1
  242. package/public/assets/HermesConfigForm-DVlhg3WV.js +4 -0
  243. package/public/assets/{InitPassword-CVA8wQA6.js → InitPassword-D7glTExX.js} +1 -1
  244. package/public/assets/InstanceDetail-CxSy2cpe.js +92 -0
  245. package/public/assets/{Login-BWsZH2mu.js → Login-Cfr5c2sv.js} +1 -1
  246. package/public/assets/NewInstance-BIYDmJis.js +1 -0
  247. package/public/assets/ProviderRecommendations-BuRnvRcI.js +1 -0
  248. package/public/assets/Settings-Cc-tYBil.js +1 -0
  249. package/public/assets/Setup-lGZEk5jq.js +1 -0
  250. package/public/assets/{WeixinLoginPanel-CnjR8xMu.js → WeixinLoginPanel-CoGqzxeV.js} +2 -2
  251. package/public/assets/index-87IJXG-w.css +1 -0
  252. package/public/assets/index-BZc5zH7u.js +19 -0
  253. package/public/assets/providers-DtNXh9JD.js +1 -0
  254. package/public/assets/registry-BWnkJgZ1.js +2 -0
  255. package/public/assets/{usePolling-Do5Erqm_.js → usePolling-CwwT9KrC.js} +1 -1
  256. package/public/assets/{vendor-i18n-ucpM0OR0.js → vendor-i18n-y9V7Sfuu.js} +1 -1
  257. package/public/assets/{vendor-react-Bk1hRGiY.js → vendor-react-BWrEVJVb.js} +6 -6
  258. package/public/index.html +4 -4
  259. package/scripts/check-app-spec.mjs +457 -0
  260. package/scripts/check-i18n.mjs +154 -0
  261. package/scripts/check-new-file-tests.mjs +230 -0
  262. package/scripts/check-quarantine-expiry.mjs +105 -0
  263. package/scripts/perf/README.md +49 -0
  264. package/scripts/perf/auth.js +99 -0
  265. package/scripts/perf/config.js +63 -0
  266. package/scripts/perf/instances.js +143 -0
  267. package/scripts/perf/proxy.js +96 -0
  268. package/scripts/run.sh +4 -4
  269. package/scripts/smoke/files-w1.sh +142 -0
  270. package/scripts/smoke-backend.mjs +122 -0
  271. package/scripts/smoke-post-publish.mjs +346 -0
  272. package/public/assets/Dashboard-B-JoOjBQ.js +0 -1
  273. package/public/assets/HermesConfigForm-DvR05LK1.js +0 -4
  274. package/public/assets/InstanceDetail-DcZW2QGO.js +0 -91
  275. package/public/assets/NewInstance-BCIrAd86.js +0 -1
  276. package/public/assets/Settings-xkDcduFz.js +0 -1
  277. package/public/assets/Setup-Cfuwj4gV.js +0 -1
  278. package/public/assets/index-CPhVFEsx.css +0 -1
  279. package/public/assets/index-DQsM6Joa.js +0 -19
  280. package/public/assets/providers-V-vwrExZ.js +0 -1
  281. 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":"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"}
@@ -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
+ "&": "&amp;",
99
+ "<": "&lt;",
100
+ ">": "&gt;",
101
+ '"': "&quot;",
102
+ "'": "&apos;",
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":"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"}