jishushell 0.6.5 → 0.7.3
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/apps/anythingllm-container.yaml +16 -170
- package/apps/browserless-chromium-container.yaml +16 -10
- package/apps/filebrowser-container.yaml +15 -9
- package/apps/hermes-container.yaml +20 -5
- package/apps/immich-container-lite.yaml +337 -0
- package/apps/immich-container.yaml +371 -0
- package/apps/jishu-kb-container.yaml +50 -177
- package/apps/ollama-binary.yaml +33 -28
- package/apps/ollama-cpu-container.yaml +6 -0
- package/apps/ollama-with-hollama-binary.yaml +35 -28
- package/apps/openclaw-binary.yaml +35 -15
- package/apps/openclaw-container.yaml +29 -11
- package/apps/openclaw-with-ollama-container.yaml +9 -2
- package/apps/openclaw-with-searxng-container.yaml +38 -6
- package/apps/searxng-container.yaml +31 -6
- package/apps/weknora-container.yaml +26 -21
- package/dependencies/jishushell-panel-0.7.3.tgz +0 -0
- package/dist/cli/app.js +244 -213
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/backup.js +15 -12
- package/dist/cli/backup.js.map +1 -1
- package/dist/cli/core.d.ts +4 -3
- package/dist/cli/core.js +392 -227
- package/dist/cli/core.js.map +1 -1
- package/dist/cli/doctor.d.ts +1 -1
- package/dist/cli/doctor.js +113 -10
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/job.js +62 -14
- package/dist/cli/job.js.map +1 -1
- package/dist/cli/llm.js +80 -11
- package/dist/cli/llm.js.map +1 -1
- package/dist/cli/managed-list.d.ts +1 -3
- package/dist/cli/managed-list.js +18 -16
- package/dist/cli/managed-list.js.map +1 -1
- package/dist/cli/migrate.d.ts +2 -0
- package/dist/cli/migrate.js +160 -0
- package/dist/cli/migrate.js.map +1 -0
- package/dist/cli.js +1 -0
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +32 -20
- package/dist/config.js +132 -51
- package/dist/config.js.map +1 -1
- package/dist/control.d.ts +6 -6
- package/dist/control.js +31 -23
- package/dist/control.js.map +1 -1
- package/dist/core.d.ts +5 -5
- package/dist/core.js +5 -5
- package/dist/core.js.map +1 -1
- package/dist/install.d.ts +2 -2
- package/dist/install.js +78 -37
- package/dist/install.js.map +1 -1
- package/dist/routes/admin.d.ts +2 -0
- package/dist/routes/admin.js +72 -0
- package/dist/routes/admin.js.map +1 -0
- package/dist/routes/apps.d.ts +1 -1
- package/dist/routes/apps.js +101 -193
- package/dist/routes/apps.js.map +1 -1
- package/dist/routes/auth.js +1 -1
- package/dist/routes/auth.js.map +1 -1
- package/dist/routes/backup.js +1 -1
- package/dist/routes/backup.js.map +1 -1
- package/dist/routes/docker.d.ts +2 -0
- package/dist/routes/docker.js +58 -0
- package/dist/routes/docker.js.map +1 -0
- package/dist/routes/external-mounts.d.ts +1 -1
- package/dist/routes/external-mounts.js +1 -1
- package/dist/routes/external-mounts.js.map +1 -1
- package/dist/routes/file-mounts.d.ts +4 -3
- package/dist/routes/file-mounts.js +49 -31
- package/dist/routes/file-mounts.js.map +1 -1
- package/dist/routes/files-organize.d.ts +2 -2
- package/dist/routes/files-organize.js +5 -5
- package/dist/routes/files-organize.js.map +1 -1
- package/dist/routes/files.d.ts +1 -1
- package/dist/routes/files.js +1 -1
- package/dist/routes/files.js.map +1 -1
- package/dist/routes/instances.d.ts +0 -8
- package/dist/routes/instances.js +202 -1560
- package/dist/routes/instances.js.map +1 -1
- package/dist/routes/integration-apps.d.ts +14 -0
- package/dist/routes/integration-apps.js +81 -0
- package/dist/routes/integration-apps.js.map +1 -0
- package/dist/routes/integrations.d.ts +9 -0
- package/dist/routes/integrations.js +12 -0
- package/dist/routes/integrations.js.map +1 -0
- package/dist/routes/llm-proxy.js +26 -3
- package/dist/routes/llm-proxy.js.map +1 -1
- package/dist/routes/setup.js +53 -38
- package/dist/routes/setup.js.map +1 -1
- package/dist/routes/system.js +108 -68
- package/dist/routes/system.js.map +1 -1
- package/dist/routes/webdav.d.ts +1 -1
- package/dist/routes/webdav.js +2 -2
- package/dist/routes/webdav.js.map +1 -1
- package/dist/server.d.ts +6 -0
- package/dist/server.js +368 -233
- package/dist/server.js.map +1 -1
- package/dist/services/app-common/app-compiler.js +186 -0
- package/dist/services/app-common/app-compiler.js.map +1 -0
- package/dist/services/app-common/app-shared.d.ts +15 -0
- package/dist/services/app-common/app-shared.js +64 -0
- package/dist/services/app-common/app-shared.js.map +1 -0
- package/dist/services/app-common/capability-service.d.ts +45 -0
- package/dist/services/app-common/capability-service.js +331 -0
- package/dist/services/app-common/capability-service.js.map +1 -0
- package/dist/services/app-common/catalog-service.d.ts +59 -0
- package/dist/services/app-common/catalog-service.js +318 -0
- package/dist/services/app-common/catalog-service.js.map +1 -0
- package/dist/services/app-common/create-pipeline.d.ts +26 -0
- package/dist/services/app-common/create-pipeline.js +298 -0
- package/dist/services/app-common/create-pipeline.js.map +1 -0
- package/dist/services/app-common/delete-service.d.ts +5 -0
- package/dist/services/app-common/delete-service.js +109 -0
- package/dist/services/app-common/delete-service.js.map +1 -0
- package/dist/services/app-common/execution-owner.d.ts +23 -0
- package/dist/services/app-common/execution-owner.js +124 -0
- package/dist/services/app-common/execution-owner.js.map +1 -0
- package/dist/services/app-common/execution-service.d.ts +23 -0
- package/dist/services/app-common/execution-service.js +105 -0
- package/dist/services/app-common/execution-service.js.map +1 -0
- package/dist/services/app-common/id-normalizer.d.ts +31 -0
- package/dist/services/app-common/id-normalizer.js +83 -0
- package/dist/services/app-common/id-normalizer.js.map +1 -0
- package/dist/services/app-common/install-store.d.ts +34 -0
- package/dist/services/app-common/install-store.js +261 -0
- package/dist/services/app-common/install-store.js.map +1 -0
- package/dist/services/app-common/instance-store.d.ts +78 -0
- package/dist/services/app-common/instance-store.js +498 -0
- package/dist/services/app-common/instance-store.js.map +1 -0
- package/dist/services/app-common/integration-refs.d.ts +17 -0
- package/dist/services/app-common/integration-refs.js +47 -0
- package/dist/services/app-common/integration-refs.js.map +1 -0
- package/dist/services/app-common/lifecycle-pipeline.d.ts +62 -0
- package/dist/services/app-common/lifecycle-pipeline.js +317 -0
- package/dist/services/app-common/lifecycle-pipeline.js.map +1 -0
- package/dist/services/app-common/lifecycle-scripts.d.ts +38 -0
- package/dist/services/app-common/lifecycle-scripts.js +935 -0
- package/dist/services/app-common/lifecycle-scripts.js.map +1 -0
- package/dist/services/app-common/lifecycle-service.d.ts +68 -0
- package/dist/services/app-common/lifecycle-service.js +475 -0
- package/dist/services/app-common/lifecycle-service.js.map +1 -0
- package/dist/services/app-common/ownership.d.ts +3 -0
- package/dist/services/app-common/ownership.js +11 -0
- package/dist/services/app-common/ownership.js.map +1 -0
- package/dist/services/app-common/paths.d.ts +29 -0
- package/dist/services/app-common/paths.js +34 -0
- package/dist/services/app-common/paths.js.map +1 -0
- package/dist/services/app-common/platform-transform.d.ts +32 -0
- package/dist/services/app-common/platform-transform.js +65 -0
- package/dist/services/app-common/platform-transform.js.map +1 -0
- package/dist/services/app-common/provide-resolver.d.ts +29 -0
- package/dist/services/app-common/provide-resolver.js +129 -0
- package/dist/services/app-common/provide-resolver.js.map +1 -0
- package/dist/services/app-common/remote-spec.d.ts +14 -0
- package/dist/services/app-common/remote-spec.js +58 -0
- package/dist/services/app-common/remote-spec.js.map +1 -0
- package/dist/services/app-common/runtime-builder.d.ts +1 -0
- package/dist/services/app-common/runtime-builder.js +2 -0
- package/dist/services/app-common/runtime-builder.js.map +1 -0
- package/dist/services/app-common/runtime-facts.d.ts +19 -0
- package/dist/services/app-common/runtime-facts.js +128 -0
- package/dist/services/app-common/runtime-facts.js.map +1 -0
- package/dist/services/app-common/service.d.ts +9 -0
- package/dist/services/app-common/service.js +10 -0
- package/dist/services/app-common/service.js.map +1 -0
- package/dist/services/app-common/spec-materializer.d.ts +8 -0
- package/dist/services/app-common/spec-materializer.js +295 -0
- package/dist/services/app-common/spec-materializer.js.map +1 -0
- package/dist/services/app-common/status-refresh.d.ts +33 -0
- package/dist/services/app-common/status-refresh.js +771 -0
- package/dist/services/app-common/status-refresh.js.map +1 -0
- package/dist/services/app-common/task-service.d.ts +29 -0
- package/dist/services/app-common/task-service.js +93 -0
- package/dist/services/app-common/task-service.js.map +1 -0
- package/dist/services/app-common/terminal-session-manager.js +157 -0
- package/dist/services/app-common/terminal-session-manager.js.map +1 -0
- package/dist/services/app-modules/browserless/routes.d.ts +9 -0
- package/dist/services/app-modules/browserless/routes.js +519 -0
- package/dist/services/app-modules/browserless/routes.js.map +1 -0
- package/dist/services/app-modules/routes.d.ts +2 -0
- package/dist/services/app-modules/routes.js +5 -0
- package/dist/services/app-modules/routes.js.map +1 -0
- package/dist/services/backup/backup-admin.d.ts +95 -0
- package/dist/services/backup/backup-admin.js +246 -0
- package/dist/services/backup/backup-admin.js.map +1 -0
- package/dist/services/backup/backup-manager.d.ts +264 -0
- package/dist/services/backup/backup-manager.js +2318 -0
- package/dist/services/backup/backup-manager.js.map +1 -0
- package/dist/services/backup/backup-verify.js +240 -0
- package/dist/services/backup/backup-verify.js.map +1 -0
- package/dist/services/capabilities/browser-policy.d.ts +14 -0
- package/dist/services/capabilities/browser-policy.js +141 -0
- package/dist/services/capabilities/browser-policy.js.map +1 -0
- package/dist/services/capabilities/contract.d.ts +49 -0
- package/dist/services/capabilities/contract.js +119 -0
- package/dist/services/capabilities/contract.js.map +1 -0
- package/dist/services/capabilities/endpoint-validator.d.ts +42 -0
- package/dist/services/capabilities/endpoint-validator.js +113 -0
- package/dist/services/capabilities/endpoint-validator.js.map +1 -0
- package/dist/services/capabilities/health.d.ts +16 -0
- package/dist/services/capabilities/health.js +121 -0
- package/dist/services/capabilities/health.js.map +1 -0
- package/dist/services/capabilities/registry.d.ts +56 -0
- package/dist/services/capabilities/registry.js +222 -0
- package/dist/services/capabilities/registry.js.map +1 -0
- package/dist/services/capabilities/sync.d.ts +7 -0
- package/dist/services/capabilities/sync.js +223 -0
- package/dist/services/capabilities/sync.js.map +1 -0
- package/dist/services/capability-proxy/html-rewriters/browserless.d.ts +1 -0
- package/dist/services/capability-proxy/html-rewriters/browserless.js +83 -0
- package/dist/services/capability-proxy/html-rewriters/browserless.js.map +1 -0
- package/dist/services/capability-proxy/html-rewriters/index.d.ts +12 -0
- package/dist/services/capability-proxy/html-rewriters/index.js +25 -0
- package/dist/services/capability-proxy/html-rewriters/index.js.map +1 -0
- package/dist/services/capability-proxy/html-rewriters/jishukb.d.ts +1 -0
- package/dist/services/capability-proxy/html-rewriters/jishukb.js +161 -0
- package/dist/services/capability-proxy/html-rewriters/jishukb.js.map +1 -0
- package/dist/services/capability-proxy/http.d.ts +7 -0
- package/dist/services/capability-proxy/http.js +555 -0
- package/dist/services/capability-proxy/http.js.map +1 -0
- package/dist/services/capability-proxy/terminal.d.ts +4 -0
- package/dist/services/capability-proxy/terminal.js +179 -0
- package/dist/services/capability-proxy/terminal.js.map +1 -0
- package/dist/services/connections/admin.d.ts +80 -0
- package/dist/services/connections/admin.js +337 -0
- package/dist/services/connections/admin.js.map +1 -0
- package/dist/services/connections/apply.d.ts +104 -0
- package/dist/services/connections/apply.js +415 -0
- package/dist/services/connections/apply.js.map +1 -0
- package/dist/services/connections/resolver.d.ts +82 -0
- package/dist/services/connections/resolver.js +289 -0
- package/dist/services/connections/resolver.js.map +1 -0
- package/dist/services/connections/transactor.d.ts +39 -0
- package/dist/services/connections/transactor.js +307 -0
- package/dist/services/connections/transactor.js.map +1 -0
- package/dist/services/files/bootstrap.d.ts +7 -0
- package/dist/services/files/bootstrap.js +16 -0
- package/dist/services/files/bootstrap.js.map +1 -0
- package/dist/services/files/external-mounts.js +187 -0
- package/dist/services/files/external-mounts.js.map +1 -0
- package/dist/services/files/files-manager.d.ts +265 -0
- package/dist/services/files/files-manager.js +1189 -0
- package/dist/services/files/files-manager.js.map +1 -0
- package/dist/services/files/files-mounts.d.ts +42 -0
- package/dist/services/files/files-mounts.js +207 -0
- package/dist/services/files/files-mounts.js.map +1 -0
- package/dist/services/files/organize/applier.js +218 -0
- package/dist/services/files/organize/applier.js.map +1 -0
- package/dist/services/files/organize/rules.js +286 -0
- package/dist/services/files/organize/rules.js.map +1 -0
- package/dist/services/files/organize/scanner.js +366 -0
- package/dist/services/files/organize/scanner.js.map +1 -0
- package/dist/services/files/organize/store.js +82 -0
- package/dist/services/files/organize/store.js.map +1 -0
- package/dist/services/files/photos/upload-page.d.ts +2 -0
- package/dist/services/files/photos/upload-page.js +248 -0
- package/dist/services/files/photos/upload-page.js.map +1 -0
- package/dist/services/files/photos/upload-store.d.ts +74 -0
- package/dist/services/files/photos/upload-store.js +432 -0
- package/dist/services/files/photos/upload-store.js.map +1 -0
- package/dist/services/files/webdav/server.d.ts +47 -0
- package/dist/services/files/webdav/server.js +329 -0
- package/dist/services/files/webdav/server.js.map +1 -0
- package/dist/services/files/webdav/xml-builder.js.map +1 -0
- package/dist/services/http/proxy-utils.d.ts +7 -0
- package/dist/services/http/proxy-utils.js +29 -0
- package/dist/services/http/proxy-utils.js.map +1 -0
- package/dist/services/http/request-utils.d.ts +3 -0
- package/dist/services/http/request-utils.js +23 -0
- package/dist/services/http/request-utils.js.map +1 -0
- package/dist/services/instances/admin.d.ts +23 -0
- package/dist/services/instances/admin.js +218 -0
- package/dist/services/instances/admin.js.map +1 -0
- package/dist/services/instances/clone.d.ts +26 -0
- package/dist/services/instances/clone.js +78 -0
- package/dist/services/instances/clone.js.map +1 -0
- package/dist/services/instances/config-admin.d.ts +17 -0
- package/dist/services/instances/config-admin.js +181 -0
- package/dist/services/instances/config-admin.js.map +1 -0
- package/dist/services/instances/manager.d.ts +232 -0
- package/dist/services/instances/manager.js +1342 -0
- package/dist/services/instances/manager.js.map +1 -0
- package/dist/services/instances/pairing.d.ts +17 -0
- package/dist/services/instances/pairing.js +53 -0
- package/dist/services/instances/pairing.js.map +1 -0
- package/dist/services/instances/passwords.js +173 -0
- package/dist/services/instances/passwords.js.map +1 -0
- package/dist/services/instances/status.d.ts +2 -0
- package/dist/services/instances/status.js +11 -0
- package/dist/services/instances/status.js.map +1 -0
- package/dist/services/instances/types.d.ts +21 -0
- package/dist/services/instances/types.js +2 -0
- package/dist/services/instances/types.js.map +1 -0
- package/dist/services/integrations/anythingllm/integration.d.ts +25 -0
- package/dist/services/integrations/anythingllm/integration.js +251 -0
- package/dist/services/integrations/anythingllm/integration.js.map +1 -0
- package/dist/services/integrations/catalog.d.ts +3 -0
- package/dist/services/integrations/catalog.js +73 -0
- package/dist/services/integrations/catalog.js.map +1 -0
- package/dist/services/integrations/custom/integration.d.ts +28 -0
- package/dist/services/integrations/custom/integration.js +179 -0
- package/dist/services/integrations/custom/integration.js.map +1 -0
- package/dist/services/integrations/hermes/integration.d.ts +194 -0
- package/dist/services/integrations/hermes/integration.js +1668 -0
- package/dist/services/integrations/hermes/integration.js.map +1 -0
- package/dist/services/integrations/immich/client.d.ts +93 -0
- package/dist/services/integrations/immich/client.js +458 -0
- package/dist/services/integrations/immich/client.js.map +1 -0
- package/dist/services/integrations/immich/config.d.ts +15 -0
- package/dist/services/integrations/immich/config.js +178 -0
- package/dist/services/integrations/immich/config.js.map +1 -0
- package/dist/services/integrations/immich/discovery.d.ts +9 -0
- package/dist/services/integrations/immich/discovery.js +101 -0
- package/dist/services/integrations/immich/discovery.js.map +1 -0
- package/dist/services/integrations/immich/gallery-renderer.d.ts +5 -0
- package/dist/services/integrations/immich/gallery-renderer.js +150 -0
- package/dist/services/integrations/immich/gallery-renderer.js.map +1 -0
- package/dist/services/integrations/immich/immich-shim.d.ts +11 -0
- package/dist/services/integrations/immich/immich-shim.js +439 -0
- package/dist/services/integrations/immich/immich-shim.js.map +1 -0
- package/dist/services/integrations/immich/integration.d.ts +18 -0
- package/dist/services/integrations/immich/integration.js +64 -0
- package/dist/services/integrations/immich/integration.js.map +1 -0
- package/dist/services/integrations/immich/photo-library.d.ts +4 -0
- package/dist/services/integrations/immich/photo-library.js +63 -0
- package/dist/services/integrations/immich/photo-library.js.map +1 -0
- package/dist/services/integrations/immich/review-executor.d.ts +3 -0
- package/dist/services/integrations/immich/review-executor.js +41 -0
- package/dist/services/integrations/immich/review-executor.js.map +1 -0
- package/dist/services/integrations/immich/review-session-service.d.ts +27 -0
- package/dist/services/integrations/immich/review-session-service.js +206 -0
- package/dist/services/integrations/immich/review-session-service.js.map +1 -0
- package/dist/services/integrations/immich/review-store.d.ts +47 -0
- package/dist/services/integrations/immich/review-store.js +347 -0
- package/dist/services/integrations/immich/review-store.js.map +1 -0
- package/dist/services/integrations/immich/routes.d.ts +7 -0
- package/dist/services/integrations/immich/routes.js +363 -0
- package/dist/services/integrations/immich/routes.js.map +1 -0
- package/dist/services/integrations/immich/types.d.ts +186 -0
- package/dist/services/integrations/immich/types.js +2 -0
- package/dist/services/integrations/immich/types.js.map +1 -0
- package/dist/services/integrations/index.d.ts +41 -0
- package/dist/services/integrations/index.js +60 -0
- package/dist/services/integrations/index.js.map +1 -0
- package/dist/services/integrations/installable/catalog.d.ts +33 -0
- package/dist/services/integrations/installable/catalog.js +88 -0
- package/dist/services/integrations/installable/catalog.js.map +1 -0
- package/dist/services/integrations/installable/index.d.ts +35 -0
- package/dist/services/integrations/installable/index.js +170 -0
- package/dist/services/integrations/installable/index.js.map +1 -0
- package/dist/services/integrations/installable/installers/integration-probes.d.ts +50 -0
- package/dist/services/integrations/installable/installers/integration-probes.js +231 -0
- package/dist/services/integrations/installable/installers/integration-probes.js.map +1 -0
- package/dist/services/integrations/installable/installers/integration.d.ts +30 -0
- package/dist/services/integrations/installable/installers/integration.js +283 -0
- package/dist/services/integrations/installable/installers/integration.js.map +1 -0
- package/dist/services/integrations/installable/installers/registry-probe.js.map +1 -0
- package/dist/services/integrations/installable/installers/shell-script.d.ts +46 -0
- package/dist/services/integrations/installable/installers/shell-script.js +487 -0
- package/dist/services/integrations/installable/installers/shell-script.js.map +1 -0
- package/dist/services/integrations/installable/types.d.ts +130 -0
- package/dist/services/integrations/installable/types.js +19 -0
- package/dist/services/integrations/installable/types.js.map +1 -0
- package/dist/services/integrations/jishukb/integration.d.ts +24 -0
- package/dist/services/integrations/jishukb/integration.js +300 -0
- package/dist/services/integrations/jishukb/integration.js.map +1 -0
- package/dist/services/integrations/openclaw/anythingllm-shim.d.ts +46 -0
- package/dist/services/integrations/openclaw/anythingllm-shim.js +281 -0
- package/dist/services/integrations/openclaw/anythingllm-shim.js.map +1 -0
- package/dist/services/integrations/openclaw/drive-shim.js +490 -0
- package/dist/services/integrations/openclaw/drive-shim.js.map +1 -0
- package/dist/services/integrations/openclaw/integration.d.ts +438 -0
- package/dist/services/integrations/openclaw/integration.js +4629 -0
- package/dist/services/integrations/openclaw/integration.js.map +1 -0
- package/dist/services/integrations/openclaw/jishukb-native-mcp.d.ts +58 -0
- package/dist/services/integrations/openclaw/jishukb-native-mcp.js +373 -0
- package/dist/services/integrations/openclaw/jishukb-native-mcp.js.map +1 -0
- package/dist/services/integrations/openclaw/jishukb-shim.d.ts +52 -0
- package/dist/services/integrations/openclaw/jishukb-shim.js +1357 -0
- package/dist/services/integrations/openclaw/jishukb-shim.js.map +1 -0
- package/dist/services/integrations/openclaw/mcporter-lite.js +276 -0
- package/dist/services/integrations/openclaw/mcporter-lite.js.map +1 -0
- package/dist/services/integrations/openclaw/mcporter.d.ts +59 -0
- package/dist/services/integrations/openclaw/mcporter.js +143 -0
- package/dist/services/integrations/openclaw/mcporter.js.map +1 -0
- package/dist/services/integrations/openclaw/native-mcp.d.ts +48 -0
- package/dist/services/integrations/openclaw/native-mcp.js +125 -0
- package/dist/services/integrations/openclaw/native-mcp.js.map +1 -0
- package/dist/services/integrations/openclaw/routes.d.ts +21 -0
- package/dist/services/integrations/openclaw/routes.js +1194 -0
- package/dist/services/integrations/openclaw/routes.js.map +1 -0
- package/dist/services/integrations/registry.d.ts +17 -0
- package/dist/services/integrations/registry.js +36 -0
- package/dist/services/integrations/registry.js.map +1 -0
- package/dist/services/integrations/routes.d.ts +2 -0
- package/dist/services/integrations/routes.js +9 -0
- package/dist/services/integrations/routes.js.map +1 -0
- package/dist/services/integrations/types.d.ts +457 -0
- package/dist/services/integrations/types.js +2 -0
- package/dist/services/integrations/types.js.map +1 -0
- package/dist/services/legacy-migrator/classifier.d.ts +44 -0
- package/dist/services/legacy-migrator/classifier.js +309 -0
- package/dist/services/legacy-migrator/classifier.js.map +1 -0
- package/dist/services/legacy-migrator/executor.d.ts +42 -0
- package/dist/services/legacy-migrator/executor.js +637 -0
- package/dist/services/legacy-migrator/executor.js.map +1 -0
- package/dist/services/legacy-migrator/index.d.ts +31 -0
- package/dist/services/legacy-migrator/index.js +34 -0
- package/dist/services/legacy-migrator/index.js.map +1 -0
- package/dist/services/legacy-migrator/planner.d.ts +8 -0
- package/dist/services/legacy-migrator/planner.js +154 -0
- package/dist/services/legacy-migrator/planner.js.map +1 -0
- package/dist/services/legacy-migrator/provider-settings.d.ts +6 -0
- package/dist/services/legacy-migrator/provider-settings.js +72 -0
- package/dist/services/legacy-migrator/provider-settings.js.map +1 -0
- package/dist/services/legacy-migrator/report.d.ts +9 -0
- package/dist/services/legacy-migrator/report.js +99 -0
- package/dist/services/legacy-migrator/report.js.map +1 -0
- package/dist/services/legacy-migrator/scanner.d.ts +13 -0
- package/dist/services/legacy-migrator/scanner.js +157 -0
- package/dist/services/legacy-migrator/scanner.js.map +1 -0
- package/dist/services/legacy-migrator/types.d.ts +97 -0
- package/dist/services/legacy-migrator/types.js +23 -0
- package/dist/services/legacy-migrator/types.js.map +1 -0
- package/dist/services/llm-proxy/instance-proxy.d.ts +17 -1
- package/dist/services/llm-proxy/instance-proxy.js +171 -44
- package/dist/services/llm-proxy/instance-proxy.js.map +1 -1
- package/dist/services/llm-proxy/probe.js +5 -14
- package/dist/services/llm-proxy/probe.js.map +1 -1
- package/dist/services/llm-proxy/providers.js +23 -31
- package/dist/services/llm-proxy/providers.js.map +1 -1
- package/dist/services/llm-proxy/ssrf.d.ts +11 -4
- package/dist/services/llm-proxy/ssrf.js +45 -7
- package/dist/services/llm-proxy/ssrf.js.map +1 -1
- package/dist/services/llm-proxy/validate-key.js +16 -37
- package/dist/services/llm-proxy/validate-key.js.map +1 -1
- package/dist/services/repair/runtime-repair.d.ts +22 -0
- package/dist/services/repair/runtime-repair.js +374 -0
- package/dist/services/repair/runtime-repair.js.map +1 -0
- package/dist/services/runtime/docker-network.d.ts +8 -0
- package/dist/services/runtime/docker-network.js +123 -0
- package/dist/services/runtime/docker-network.js.map +1 -0
- package/dist/services/runtime/driver-registry.d.ts +25 -0
- package/dist/services/runtime/driver-registry.js +22 -0
- package/dist/services/runtime/driver-registry.js.map +1 -0
- package/dist/services/runtime/drivers/nomad.d.ts +261 -0
- package/dist/services/runtime/drivers/nomad.js +3122 -0
- package/dist/services/runtime/drivers/nomad.js.map +1 -0
- package/dist/services/runtime/errors.d.ts +3 -3
- package/dist/services/runtime/errors.js +3 -3
- package/dist/services/runtime/instance.d.ts +14 -16
- package/dist/services/runtime/instance.js +93 -123
- package/dist/services/runtime/instance.js.map +1 -1
- package/dist/services/runtime/job-id.d.ts +1 -1
- package/dist/services/runtime/job-id.js +1 -1
- package/dist/services/runtime/mcp-shims/firewall.d.ts +2 -2
- package/dist/services/runtime/mcp-shims/firewall.js +2 -2
- package/dist/services/runtime/mcp-shims/searxng-shim.d.ts +3 -5
- package/dist/services/runtime/mcp-shims/searxng-shim.js +3 -5
- package/dist/services/runtime/mcp-shims/searxng-shim.js.map +1 -1
- package/dist/services/runtime/mcp-shims/write-mcp-entry.d.ts +20 -20
- package/dist/services/runtime/mcp-shims/write-mcp-entry.js +16 -16
- package/dist/services/runtime/mcp-shims/write-mcp-entry.js.map +1 -1
- package/dist/services/runtime/ownership-marker.d.ts +83 -0
- package/dist/services/runtime/ownership-marker.js +109 -0
- package/dist/services/runtime/ownership-marker.js.map +1 -0
- package/dist/services/runtime/service-manager.d.ts +2 -0
- package/dist/services/runtime/service-manager.js +18 -0
- package/dist/services/runtime/service-manager.js.map +1 -0
- package/dist/services/runtime/types.d.ts +23 -501
- package/dist/services/runtime/types.js +0 -12
- package/dist/services/runtime/types.js.map +1 -1
- package/dist/services/runtime/workload-compiler.d.ts +17 -0
- package/dist/services/runtime/workload-compiler.js +550 -0
- package/dist/services/runtime/workload-compiler.js.map +1 -0
- package/dist/services/runtime/workload-types.d.ts +11 -0
- package/dist/services/runtime/workload-types.js +2 -0
- package/dist/services/runtime/workload-types.js.map +1 -0
- package/dist/services/setup/core-manager.d.ts +50 -0
- package/dist/services/setup/core-manager.js +456 -0
- package/dist/services/setup/core-manager.js.map +1 -0
- package/dist/services/setup/plugin-installer.js +136 -0
- package/dist/services/setup/plugin-installer.js.map +1 -0
- package/dist/services/setup/setup-manager.d.ts +158 -0
- package/dist/services/setup/setup-manager.js +2724 -0
- package/dist/services/setup/setup-manager.js.map +1 -0
- package/dist/services/system/cli-command.d.ts +5 -0
- package/dist/services/system/cli-command.js +18 -0
- package/dist/services/system/cli-command.js.map +1 -0
- package/dist/services/system/macos-launchd.js +312 -0
- package/dist/services/system/macos-launchd.js.map +1 -0
- package/dist/services/system/repair-orchestrator.d.ts +71 -0
- package/dist/services/system/repair-orchestrator.js +412 -0
- package/dist/services/system/repair-orchestrator.js.map +1 -0
- package/dist/services/system/runtime-ownership.d.ts +36 -0
- package/dist/services/system/runtime-ownership.js +250 -0
- package/dist/services/system/runtime-ownership.js.map +1 -0
- package/dist/services/system/system-monitor.js +96 -0
- package/dist/services/system/system-monitor.js.map +1 -0
- package/dist/services/system/system-ollama-provider.d.ts +14 -0
- package/dist/services/system/system-ollama-provider.js +129 -0
- package/dist/services/system/system-ollama-provider.js.map +1 -0
- package/dist/services/system/system-reconciler.d.ts +59 -0
- package/dist/services/system/system-reconciler.js +763 -0
- package/dist/services/system/system-reconciler.js.map +1 -0
- package/dist/services/system/update-manager.d.ts +43 -0
- package/dist/services/system/update-manager.js +315 -0
- package/dist/services/system/update-manager.js.map +1 -0
- package/dist/services/system/upgrade-finalize.d.ts +80 -0
- package/dist/services/system/upgrade-finalize.js +507 -0
- package/dist/services/system/upgrade-finalize.js.map +1 -0
- package/dist/services/tasks/registry.d.ts +44 -0
- package/dist/services/tasks/registry.js +90 -0
- package/dist/services/tasks/registry.js.map +1 -0
- package/dist/services/telemetry/activation.d.ts +6 -2
- package/dist/services/telemetry/activation.js +6 -2
- package/dist/services/telemetry/activation.js.map +1 -1
- package/dist/services/telemetry/heartbeat.d.ts +6 -2
- package/dist/services/telemetry/heartbeat.js +6 -2
- package/dist/services/telemetry/heartbeat.js.map +1 -1
- package/dist/services/workspaces/builder.d.ts +29 -0
- package/dist/services/workspaces/builder.js +186 -0
- package/dist/services/workspaces/builder.js.map +1 -0
- package/dist/types.d.ts +350 -48
- package/dist/utils/instance-lock.d.ts +2 -2
- package/dist/utils/instance-lock.js +2 -2
- package/dist/utils/path-safety.js +1 -1
- package/dist/utils/service-user.d.ts +13 -0
- package/dist/utils/service-user.js +129 -0
- package/dist/utils/service-user.js.map +1 -0
- package/install/jishu-install.sh +107 -27
- package/install/jishu-uninstall.sh +8 -0
- package/install/post-install.sh +162 -185
- package/install/post-uninstall.sh +6 -0
- package/node_modules/@fastify/static/.github/workflows/ci.yml +1 -1
- package/node_modules/@fastify/static/.github/workflows/lock-threads.yml +19 -0
- package/node_modules/@fastify/static/LICENSE +1 -3
- package/node_modules/@fastify/static/example/server-benchmark.js +39 -0
- package/node_modules/@fastify/static/index.js +169 -23
- package/node_modules/@fastify/static/lib/dirList.js +20 -6
- package/node_modules/@fastify/static/package.json +10 -8
- package/node_modules/@fastify/static/test/dir-list.test.js +82 -0
- package/node_modules/@fastify/static/test/static.test.js +326 -4
- package/node_modules/@fastify/static/types/index.d.ts +0 -4
- package/node_modules/@fastify/static/types/index.test-d.ts +1 -1
- package/node_modules/brace-expansion/dist/commonjs/index.js +24 -14
- package/node_modules/brace-expansion/dist/commonjs/index.js.map +1 -1
- package/node_modules/brace-expansion/dist/esm/index.js +24 -14
- package/node_modules/brace-expansion/dist/esm/index.js.map +1 -1
- package/node_modules/brace-expansion/package.json +2 -2
- package/node_modules/content-disposition/README.md +21 -22
- package/node_modules/content-disposition/index.js +122 -44
- package/node_modules/content-disposition/package.json +16 -20
- package/node_modules/fast-uri/index.js +1 -1
- package/node_modules/fast-uri/package.json +1 -1
- package/node_modules/fast-uri/test/security.test.js +28 -0
- package/node_modules/fastify/SECURITY.md +1 -1
- package/node_modules/fastify/SPONSORS.md +6 -4
- package/node_modules/fastify/docs/Guides/Database.md +0 -28
- package/node_modules/fastify/docs/Guides/Ecosystem.md +13 -2
- package/node_modules/fastify/docs/Guides/Serverless.md +2 -2
- package/node_modules/fastify/docs/Guides/Write-Plugin.md +1 -1
- package/node_modules/fastify/docs/Reference/Encapsulation.md +27 -26
- package/node_modules/fastify/docs/Reference/Errors.md +10 -4
- package/node_modules/fastify/docs/Reference/HTTP2.md +10 -10
- package/node_modules/fastify/docs/Reference/Hooks.md +4 -4
- package/node_modules/fastify/docs/Reference/Index.md +14 -16
- package/node_modules/fastify/docs/Reference/LTS.md +12 -13
- package/node_modules/fastify/docs/Reference/Lifecycle.md +9 -8
- package/node_modules/fastify/docs/Reference/Logging.md +44 -39
- package/node_modules/fastify/docs/Reference/Middleware.md +21 -25
- package/node_modules/fastify/docs/Reference/Principles.md +2 -2
- package/node_modules/fastify/docs/Reference/Reply.md +6 -1
- package/node_modules/fastify/docs/Reference/Request.md +27 -16
- package/node_modules/fastify/docs/Reference/Routes.md +5 -2
- package/node_modules/fastify/docs/Reference/Server.md +31 -3
- package/node_modules/fastify/docs/Reference/Type-Providers.md +29 -5
- package/node_modules/fastify/docs/Reference/Validation-and-Serialization.md +15 -2
- package/node_modules/fastify/docs/Reference/Warnings.md +7 -6
- package/node_modules/fastify/eslint.config.js +7 -2
- package/node_modules/fastify/fastify.d.ts +8 -3
- package/node_modules/fastify/fastify.js +43 -14
- package/node_modules/fastify/lib/content-type-parser.js +13 -1
- package/node_modules/fastify/lib/decorate.js +11 -3
- package/node_modules/fastify/lib/error-handler.js +4 -3
- package/node_modules/fastify/lib/error-serializer.js +59 -59
- package/node_modules/fastify/lib/errors.js +16 -1
- package/node_modules/fastify/lib/four-oh-four.js +14 -9
- package/node_modules/fastify/lib/handle-request.js +11 -5
- package/node_modules/fastify/lib/plugin-override.js +2 -1
- package/node_modules/fastify/lib/plugin-utils.js +5 -5
- package/node_modules/fastify/lib/reply.js +63 -8
- package/node_modules/fastify/lib/request.js +14 -4
- package/node_modules/fastify/lib/route.js +20 -6
- package/node_modules/fastify/lib/schema-controller.js +1 -1
- package/node_modules/fastify/lib/schemas.js +37 -30
- package/node_modules/fastify/lib/symbols.js +3 -1
- package/node_modules/fastify/lib/validation.js +1 -13
- package/node_modules/fastify/lib/warnings.js +3 -3
- package/node_modules/fastify/package.json +13 -15
- package/node_modules/fastify/scripts/validate-ecosystem-links.js +1 -0
- package/node_modules/fastify/test/bundler/esbuild/package.json +1 -1
- package/node_modules/fastify/test/close-pipelining.test.js +1 -2
- package/node_modules/fastify/test/custom-http-server.test.js +38 -0
- package/node_modules/fastify/test/decorator-instance-properties.test.js +63 -0
- package/node_modules/fastify/test/diagnostics-channel/async-error-handler.test.js +74 -0
- package/node_modules/fastify/test/hooks.test.js +23 -0
- package/node_modules/fastify/test/http-methods/get.test.js +1 -1
- package/node_modules/fastify/test/http2/plain.test.js +135 -0
- package/node_modules/fastify/test/http2/secure-with-fallback.test.js +1 -1
- package/node_modules/fastify/test/https/https.test.js +1 -2
- package/node_modules/fastify/test/internals/errors.test.js +31 -1
- package/node_modules/fastify/test/internals/plugin.test.js +3 -1
- package/node_modules/fastify/test/internals/request.test.js +27 -3
- package/node_modules/fastify/test/internals/schema-controller-perf.test.js +33 -0
- package/node_modules/fastify/test/logger/logging.test.js +18 -1
- package/node_modules/fastify/test/logger/options.test.js +38 -1
- package/node_modules/fastify/test/reply-error.test.js +1 -1
- package/node_modules/fastify/test/reply-trailers.test.js +70 -0
- package/node_modules/fastify/test/request-media-type.test.js +105 -0
- package/node_modules/fastify/test/route-prefix.test.js +34 -0
- package/node_modules/fastify/test/router-options.test.js +222 -11
- package/node_modules/fastify/test/schema-serialization.test.js +108 -0
- package/node_modules/fastify/test/schema-validation.test.js +24 -0
- package/node_modules/fastify/test/scripts/validate-ecosystem-links.test.js +40 -57
- package/node_modules/fastify/test/throw.test.js +14 -0
- package/node_modules/fastify/test/trust-proxy.test.js +21 -0
- package/node_modules/fastify/test/types/content-type-parser.tst.ts +70 -0
- package/node_modules/fastify/test/types/decorate-request-reply.tst.ts +18 -0
- package/node_modules/fastify/test/types/dummy-plugin.mts +9 -0
- package/node_modules/fastify/test/types/errors.tst.ts +91 -0
- package/node_modules/fastify/test/types/fastify.tst.ts +351 -0
- package/node_modules/fastify/test/types/hooks.tst.ts +578 -0
- package/node_modules/fastify/test/types/instance.tst.ts +597 -0
- package/node_modules/fastify/test/types/logger.tst.ts +276 -0
- package/node_modules/fastify/test/types/plugin.tst.ts +96 -0
- package/node_modules/fastify/test/types/register.tst.ts +245 -0
- package/node_modules/fastify/test/types/reply.tst.ts +297 -0
- package/node_modules/fastify/test/types/request.tst.ts +199 -0
- package/node_modules/fastify/test/types/route.tst.ts +576 -0
- package/node_modules/fastify/test/types/schema.tst.ts +135 -0
- package/node_modules/fastify/test/types/serverFactory.tst.ts +37 -0
- package/node_modules/fastify/test/types/tsconfig.json +9 -0
- package/node_modules/fastify/test/types/type-provider.tst.ts +1219 -0
- package/node_modules/fastify/test/types/using.tst.ts +14 -0
- package/node_modules/fastify/types/errors.d.ts +3 -0
- package/node_modules/fastify/types/request.d.ts +23 -2
- package/node_modules/glob/README.md +39 -130
- package/node_modules/glob/dist/commonjs/glob.d.ts +8 -0
- package/node_modules/glob/dist/commonjs/glob.d.ts.map +1 -1
- package/node_modules/glob/dist/commonjs/glob.js +2 -1
- package/node_modules/glob/dist/commonjs/glob.js.map +1 -1
- package/node_modules/glob/dist/commonjs/index.min.js +4 -0
- package/node_modules/glob/dist/commonjs/index.min.js.map +7 -0
- package/node_modules/glob/dist/commonjs/pattern.d.ts +3 -0
- package/node_modules/glob/dist/commonjs/pattern.d.ts.map +1 -1
- package/node_modules/glob/dist/commonjs/pattern.js +4 -0
- package/node_modules/glob/dist/commonjs/pattern.js.map +1 -1
- package/node_modules/glob/dist/esm/glob.d.ts +8 -0
- package/node_modules/glob/dist/esm/glob.d.ts.map +1 -1
- package/node_modules/glob/dist/esm/glob.js +2 -1
- package/node_modules/glob/dist/esm/glob.js.map +1 -1
- package/node_modules/glob/dist/esm/index.min.js +4 -0
- package/node_modules/glob/dist/esm/index.min.js.map +7 -0
- package/node_modules/glob/dist/esm/pattern.d.ts +3 -0
- package/node_modules/glob/dist/esm/pattern.d.ts.map +1 -1
- package/node_modules/glob/dist/esm/pattern.js +4 -0
- package/node_modules/glob/dist/esm/pattern.js.map +1 -1
- package/node_modules/glob/package.json +38 -37
- package/node_modules/jishushell-panel/README.md +4 -4
- package/node_modules/jishushell-panel/output/dist/server.js +17 -6
- package/node_modules/jishushell-panel/output/dist/server.js.map +1 -1
- package/node_modules/jishushell-panel/output/public/assets/ApiKeyField-Ce5d1xna.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/Dashboard-BXame3yg.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/HermesChatPanel-BHZtPCJd.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/HermesConfigForm-CB3GbNX9.js +4 -0
- package/node_modules/jishushell-panel/output/public/assets/InitPassword-Boab9F6g.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/InstanceDetail-DrIWCqo-.js +14 -0
- package/node_modules/jishushell-panel/output/public/assets/Login-CzpOkNau.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/NewInstance-CANXyCcL.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/ProviderRecommendations-BABo9VOC.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/Settings-CKp5XxFh.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/Setup-C7xVDPow.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/WeixinLoginPanel-B765Xz4C.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/api-C70Gt678.js +4 -0
- package/node_modules/jishushell-panel/output/public/assets/index-Bs6DSbiR.js +23 -0
- package/node_modules/jishushell-panel/output/public/assets/index-DnnqTf7s.css +1 -0
- package/node_modules/jishushell-panel/output/public/assets/registry-sWIZsIEF.js +2 -0
- package/node_modules/jishushell-panel/output/public/assets/rolldown-runtime-QTnfLwEv.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/setup-task-q21GnI0E.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/usePolling-D4IDOQd_.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/vendor-i18n-Df8aUdv8.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/vendor-react-0L0rjmYG.js +8 -0
- package/node_modules/jishushell-panel/output/public/index.html +6 -4
- package/node_modules/jishushell-panel/package.json +2 -2
- package/node_modules/semver/classes/range.js +17 -4
- package/node_modules/semver/package.json +2 -2
- package/package.json +12 -64
- package/scripts/check-app-path-boundaries.mjs +121 -0
- package/scripts/check-app-spec.mjs +123 -29
- package/scripts/check-architecture-boundaries.mjs +178 -0
- package/scripts/check-colima-launchd.mjs +10 -8
- package/scripts/check-integration-isolation.ts +541 -0
- package/scripts/check-new-file-tests.mjs +11 -3
- package/scripts/check-open-core-boundaries.mjs +60 -10
- package/scripts/check-test-layering.sh +1 -1
- package/scripts/fixtures/instances/hermes-sample/instance.json +3 -2
- package/scripts/fixtures/instances/legacy-openclaw-sample/instance.json +1 -1
- package/scripts/local-web-upgrade-test.README +4 -3
- package/scripts/local-web-upgrade-test.example.env +2 -2
- package/scripts/local-web-upgrade-test.sh +14 -1
- package/scripts/pack-gui-and-send-pi.sh +43 -0
- package/scripts/perf/instances.js +1 -1
- package/scripts/prune-open-core-dist.mjs +89 -2
- package/scripts/smoke/hermes-bootstrap.sh +5 -5
- package/templates/hermes-entrypoint.sh +19 -29
- package/apps/openwebui-container.yaml +0 -97
- package/apps/playwright-container.yaml +0 -126
- package/dependencies/jishushell-panel-0.6.5.tgz +0 -0
- package/dist/crypto-shim.d.ts +0 -1
- package/dist/crypto-shim.js +0 -2
- package/dist/crypto-shim.js.map +0 -1
- package/dist/routes/agent-apps.d.ts +0 -14
- package/dist/routes/agent-apps.js +0 -77
- package/dist/routes/agent-apps.js.map +0 -1
- package/dist/routes/internal.d.ts +0 -2
- package/dist/routes/internal.js +0 -55
- package/dist/routes/internal.js.map +0 -1
- package/dist/routes/openclaw-routes.d.ts +0 -22
- package/dist/routes/openclaw-routes.js +0 -1020
- package/dist/routes/openclaw-routes.js.map +0 -1
- package/dist/routes/runtime.d.ts +0 -15
- package/dist/routes/runtime.js +0 -76
- package/dist/routes/runtime.js.map +0 -1
- package/dist/services/agent-apps/catalog.d.ts +0 -33
- package/dist/services/agent-apps/catalog.js +0 -88
- package/dist/services/agent-apps/catalog.js.map +0 -1
- package/dist/services/agent-apps/index.d.ts +0 -36
- package/dist/services/agent-apps/index.js +0 -171
- package/dist/services/agent-apps/index.js.map +0 -1
- package/dist/services/agent-apps/installers/adapter-probes.d.ts +0 -49
- package/dist/services/agent-apps/installers/adapter-probes.js +0 -230
- package/dist/services/agent-apps/installers/adapter-probes.js.map +0 -1
- package/dist/services/agent-apps/installers/adapter.d.ts +0 -30
- package/dist/services/agent-apps/installers/adapter.js +0 -171
- package/dist/services/agent-apps/installers/adapter.js.map +0 -1
- package/dist/services/agent-apps/installers/registry-probe.js.map +0 -1
- package/dist/services/agent-apps/installers/shell-script.d.ts +0 -47
- package/dist/services/agent-apps/installers/shell-script.js +0 -488
- package/dist/services/agent-apps/installers/shell-script.js.map +0 -1
- package/dist/services/agent-apps/types.d.ts +0 -128
- package/dist/services/agent-apps/types.js +0 -17
- package/dist/services/agent-apps/types.js.map +0 -1
- package/dist/services/app/app-compiler.js +0 -185
- package/dist/services/app/app-compiler.js.map +0 -1
- package/dist/services/app/app-manager.d.ts +0 -184
- package/dist/services/app/app-manager.js +0 -2933
- package/dist/services/app/app-manager.js.map +0 -1
- package/dist/services/app/custom-manager.d.ts +0 -27
- package/dist/services/app/custom-manager.js +0 -382
- package/dist/services/app/custom-manager.js.map +0 -1
- package/dist/services/app/hermes-agent-manager.d.ts +0 -20
- package/dist/services/app/hermes-agent-manager.js +0 -299
- package/dist/services/app/hermes-agent-manager.js.map +0 -1
- package/dist/services/app/id-normalizer.d.ts +0 -27
- package/dist/services/app/id-normalizer.js +0 -77
- package/dist/services/app/id-normalizer.js.map +0 -1
- package/dist/services/app/ollama-manager.d.ts +0 -18
- package/dist/services/app/ollama-manager.js +0 -224
- package/dist/services/app/ollama-manager.js.map +0 -1
- package/dist/services/app/openclaw-manager.d.ts +0 -63
- package/dist/services/app/openclaw-manager.js +0 -1215
- package/dist/services/app/openclaw-manager.js.map +0 -1
- package/dist/services/app/paths.d.ts +0 -27
- package/dist/services/app/paths.js +0 -40
- package/dist/services/app/paths.js.map +0 -1
- package/dist/services/app/platform-transform.d.ts +0 -32
- package/dist/services/app/platform-transform.js +0 -65
- package/dist/services/app/platform-transform.js.map +0 -1
- package/dist/services/app/provide-resolver.d.ts +0 -29
- package/dist/services/app/provide-resolver.js +0 -135
- package/dist/services/app/provide-resolver.js.map +0 -1
- package/dist/services/app/registry.d.ts +0 -17
- package/dist/services/app/registry.js +0 -31
- package/dist/services/app/registry.js.map +0 -1
- package/dist/services/app/remote-spec.d.ts +0 -14
- package/dist/services/app/remote-spec.js +0 -58
- package/dist/services/app/remote-spec.js.map +0 -1
- package/dist/services/app/terminal-session-manager.js +0 -157
- package/dist/services/app/terminal-session-manager.js.map +0 -1
- package/dist/services/app/types.d.ts +0 -74
- package/dist/services/app/types.js +0 -16
- package/dist/services/app/types.js.map +0 -1
- package/dist/services/app-config-admin.d.ts +0 -17
- package/dist/services/app-config-admin.js +0 -177
- package/dist/services/app-config-admin.js.map +0 -1
- package/dist/services/app-create-from-installed.d.ts +0 -23
- package/dist/services/app-create-from-installed.js +0 -75
- package/dist/services/app-create-from-installed.js.map +0 -1
- package/dist/services/app-passwords.js +0 -173
- package/dist/services/app-passwords.js.map +0 -1
- package/dist/services/backup-admin.d.ts +0 -101
- package/dist/services/backup-admin.js +0 -259
- package/dist/services/backup-admin.js.map +0 -1
- package/dist/services/backup-manager.d.ts +0 -264
- package/dist/services/backup-manager.js +0 -2263
- package/dist/services/backup-manager.js.map +0 -1
- package/dist/services/backup-verify.js +0 -240
- package/dist/services/backup-verify.js.map +0 -1
- package/dist/services/capability-endpoint-validator.d.ts +0 -41
- package/dist/services/capability-endpoint-validator.js +0 -114
- package/dist/services/capability-endpoint-validator.js.map +0 -1
- package/dist/services/capability-health.d.ts +0 -16
- package/dist/services/capability-health.js +0 -121
- package/dist/services/capability-health.js.map +0 -1
- package/dist/services/capability-registry.d.ts +0 -29
- package/dist/services/capability-registry.js +0 -176
- package/dist/services/capability-registry.js.map +0 -1
- package/dist/services/capability-sync.d.ts +0 -4
- package/dist/services/capability-sync.js +0 -220
- package/dist/services/capability-sync.js.map +0 -1
- package/dist/services/connection-admin.d.ts +0 -74
- package/dist/services/connection-admin.js +0 -287
- package/dist/services/connection-admin.js.map +0 -1
- package/dist/services/connection-apply.d.ts +0 -91
- package/dist/services/connection-apply.js +0 -471
- package/dist/services/connection-apply.js.map +0 -1
- package/dist/services/connection-resolver.d.ts +0 -65
- package/dist/services/connection-resolver.js +0 -281
- package/dist/services/connection-resolver.js.map +0 -1
- package/dist/services/connection-transactor.d.ts +0 -39
- package/dist/services/connection-transactor.js +0 -354
- package/dist/services/connection-transactor.js.map +0 -1
- package/dist/services/core-manager.d.ts +0 -50
- package/dist/services/core-manager.js +0 -411
- package/dist/services/core-manager.js.map +0 -1
- package/dist/services/external-mounts.js +0 -187
- package/dist/services/external-mounts.js.map +0 -1
- package/dist/services/files-manager.d.ts +0 -252
- package/dist/services/files-manager.js +0 -1156
- package/dist/services/files-manager.js.map +0 -1
- package/dist/services/files-mounts.d.ts +0 -42
- package/dist/services/files-mounts.js +0 -207
- package/dist/services/files-mounts.js.map +0 -1
- package/dist/services/instance-admin.d.ts +0 -26
- package/dist/services/instance-admin.js +0 -218
- package/dist/services/instance-admin.js.map +0 -1
- package/dist/services/instance-manager.d.ts +0 -192
- package/dist/services/instance-manager.js +0 -1289
- package/dist/services/instance-manager.js.map +0 -1
- package/dist/services/macos-launchd.js +0 -312
- package/dist/services/macos-launchd.js.map +0 -1
- package/dist/services/nomad-manager.d.ts +0 -307
- package/dist/services/nomad-manager.js +0 -3958
- package/dist/services/nomad-manager.js.map +0 -1
- package/dist/services/organize/applier.js +0 -218
- package/dist/services/organize/applier.js.map +0 -1
- package/dist/services/organize/rules.js +0 -286
- package/dist/services/organize/rules.js.map +0 -1
- package/dist/services/organize/scanner.js +0 -366
- package/dist/services/organize/scanner.js.map +0 -1
- package/dist/services/organize/store.js +0 -82
- package/dist/services/organize/store.js.map +0 -1
- package/dist/services/plugin-installer.js +0 -128
- package/dist/services/plugin-installer.js.map +0 -1
- package/dist/services/process-manager.d.ts +0 -25
- package/dist/services/process-manager.js +0 -568
- package/dist/services/process-manager.js.map +0 -1
- package/dist/services/runtime/adapters/custom.d.ts +0 -20
- package/dist/services/runtime/adapters/custom.js +0 -188
- package/dist/services/runtime/adapters/custom.js.map +0 -1
- package/dist/services/runtime/adapters/hermes.d.ts +0 -204
- package/dist/services/runtime/adapters/hermes.js +0 -1684
- package/dist/services/runtime/adapters/hermes.js.map +0 -1
- package/dist/services/runtime/adapters/openclaw-mcporter.d.ts +0 -45
- package/dist/services/runtime/adapters/openclaw-mcporter.js +0 -108
- package/dist/services/runtime/adapters/openclaw-mcporter.js.map +0 -1
- package/dist/services/runtime/adapters/openclaw.d.ts +0 -426
- package/dist/services/runtime/adapters/openclaw.js +0 -3975
- package/dist/services/runtime/adapters/openclaw.js.map +0 -1
- package/dist/services/runtime/index.d.ts +0 -34
- package/dist/services/runtime/index.js +0 -51
- package/dist/services/runtime/index.js.map +0 -1
- package/dist/services/runtime/mcp-shims/anythingllm-shim.d.ts +0 -46
- package/dist/services/runtime/mcp-shims/anythingllm-shim.js +0 -281
- package/dist/services/runtime/mcp-shims/anythingllm-shim.js.map +0 -1
- package/dist/services/runtime/mcp-shims/drive-shim.js +0 -490
- package/dist/services/runtime/mcp-shims/drive-shim.js.map +0 -1
- package/dist/services/runtime/mcp-shims/jishukb-shim.d.ts +0 -48
- package/dist/services/runtime/mcp-shims/jishukb-shim.js +0 -723
- package/dist/services/runtime/mcp-shims/jishukb-shim.js.map +0 -1
- package/dist/services/runtime/mcp-shims/mcporter-lite.js +0 -276
- package/dist/services/runtime/mcp-shims/mcporter-lite.js.map +0 -1
- package/dist/services/runtime/migrations.d.ts +0 -23
- package/dist/services/runtime/migrations.js +0 -125
- package/dist/services/runtime/migrations.js.map +0 -1
- package/dist/services/runtime/registry.d.ts +0 -13
- package/dist/services/runtime/registry.js +0 -32
- package/dist/services/runtime/registry.js.map +0 -1
- package/dist/services/runtime-identity.d.ts +0 -13
- package/dist/services/runtime-identity.js +0 -166
- package/dist/services/runtime-identity.js.map +0 -1
- package/dist/services/runtime-repair.d.ts +0 -52
- package/dist/services/runtime-repair.js +0 -352
- package/dist/services/runtime-repair.js.map +0 -1
- package/dist/services/setup-manager.d.ts +0 -158
- package/dist/services/setup-manager.js +0 -2740
- package/dist/services/setup-manager.js.map +0 -1
- package/dist/services/suggestions.d.ts +0 -27
- package/dist/services/suggestions.js +0 -133
- package/dist/services/suggestions.js.map +0 -1
- package/dist/services/system-monitor.js +0 -79
- package/dist/services/system-monitor.js.map +0 -1
- package/dist/services/system-ollama-provider.d.ts +0 -14
- package/dist/services/system-ollama-provider.js +0 -125
- package/dist/services/system-ollama-provider.js.map +0 -1
- package/dist/services/system-reconciler.d.ts +0 -72
- package/dist/services/system-reconciler.js +0 -600
- package/dist/services/system-reconciler.js.map +0 -1
- package/dist/services/task-registry.d.ts +0 -44
- package/dist/services/task-registry.js +0 -76
- package/dist/services/task-registry.js.map +0 -1
- package/dist/services/types-shim.d.ts +0 -16
- package/dist/services/types-shim.js +0 -2
- package/dist/services/types-shim.js.map +0 -1
- package/dist/services/update-manager.d.ts +0 -47
- package/dist/services/update-manager.js +0 -351
- package/dist/services/update-manager.js.map +0 -1
- package/dist/services/webdav/server.d.ts +0 -24
- package/dist/services/webdav/server.js +0 -420
- package/dist/services/webdav/server.js.map +0 -1
- package/dist/services/webdav/xml-builder.js.map +0 -1
- package/dist/services/workspace-builder.d.ts +0 -29
- package/dist/services/workspace-builder.js +0 -188
- package/dist/services/workspace-builder.js.map +0 -1
- package/node_modules/@fastify/static/.github/stale.yml +0 -21
- package/node_modules/@isaacs/cliui/LICENSE.md +0 -63
- package/node_modules/@isaacs/cliui/README.md +0 -151
- package/node_modules/@isaacs/cliui/dist/commonjs/ansi-regex/index.d.ts +0 -4
- package/node_modules/@isaacs/cliui/dist/commonjs/ansi-regex/index.d.ts.map +0 -1
- package/node_modules/@isaacs/cliui/dist/commonjs/ansi-regex/index.js +0 -16
- package/node_modules/@isaacs/cliui/dist/commonjs/ansi-regex/index.js.map +0 -1
- package/node_modules/@isaacs/cliui/dist/commonjs/ansi-styles/index.d.ts +0 -34
- package/node_modules/@isaacs/cliui/dist/commonjs/ansi-styles/index.d.ts.map +0 -1
- package/node_modules/@isaacs/cliui/dist/commonjs/ansi-styles/index.js +0 -170
- package/node_modules/@isaacs/cliui/dist/commonjs/ansi-styles/index.js.map +0 -1
- package/node_modules/@isaacs/cliui/dist/commonjs/eastasianwidth/index.d.ts +0 -6
- package/node_modules/@isaacs/cliui/dist/commonjs/eastasianwidth/index.d.ts.map +0 -1
- package/node_modules/@isaacs/cliui/dist/commonjs/eastasianwidth/index.js +0 -307
- package/node_modules/@isaacs/cliui/dist/commonjs/eastasianwidth/index.js.map +0 -1
- package/node_modules/@isaacs/cliui/dist/commonjs/emoji-regex/index.d.ts +0 -2
- package/node_modules/@isaacs/cliui/dist/commonjs/emoji-regex/index.d.ts.map +0 -1
- package/node_modules/@isaacs/cliui/dist/commonjs/emoji-regex/index.js +0 -7
- package/node_modules/@isaacs/cliui/dist/commonjs/emoji-regex/index.js.map +0 -1
- package/node_modules/@isaacs/cliui/dist/commonjs/index.d.ts +0 -41
- package/node_modules/@isaacs/cliui/dist/commonjs/index.d.ts.map +0 -1
- package/node_modules/@isaacs/cliui/dist/commonjs/index.js +0 -322
- package/node_modules/@isaacs/cliui/dist/commonjs/index.js.map +0 -1
- package/node_modules/@isaacs/cliui/dist/commonjs/index.min.js +0 -12
- package/node_modules/@isaacs/cliui/dist/commonjs/index.min.js.map +0 -7
- package/node_modules/@isaacs/cliui/dist/commonjs/package.json +0 -3
- package/node_modules/@isaacs/cliui/dist/commonjs/string-width/index.d.ts +0 -5
- package/node_modules/@isaacs/cliui/dist/commonjs/string-width/index.d.ts.map +0 -1
- package/node_modules/@isaacs/cliui/dist/commonjs/string-width/index.js +0 -49
- package/node_modules/@isaacs/cliui/dist/commonjs/string-width/index.js.map +0 -1
- package/node_modules/@isaacs/cliui/dist/commonjs/strip-ansi/index.d.ts +0 -2
- package/node_modules/@isaacs/cliui/dist/commonjs/strip-ansi/index.d.ts.map +0 -1
- package/node_modules/@isaacs/cliui/dist/commonjs/strip-ansi/index.js +0 -8
- package/node_modules/@isaacs/cliui/dist/commonjs/strip-ansi/index.js.map +0 -1
- package/node_modules/@isaacs/cliui/dist/commonjs/wrap-ansi/index.d.ts +0 -7
- package/node_modules/@isaacs/cliui/dist/commonjs/wrap-ansi/index.d.ts.map +0 -1
- package/node_modules/@isaacs/cliui/dist/commonjs/wrap-ansi/index.js +0 -176
- package/node_modules/@isaacs/cliui/dist/commonjs/wrap-ansi/index.js.map +0 -1
- package/node_modules/@isaacs/cliui/dist/esm/ansi-regex/index.d.ts +0 -4
- package/node_modules/@isaacs/cliui/dist/esm/ansi-regex/index.d.ts.map +0 -1
- package/node_modules/@isaacs/cliui/dist/esm/ansi-regex/index.js +0 -12
- package/node_modules/@isaacs/cliui/dist/esm/ansi-regex/index.js.map +0 -1
- package/node_modules/@isaacs/cliui/dist/esm/ansi-styles/index.d.ts +0 -34
- package/node_modules/@isaacs/cliui/dist/esm/ansi-styles/index.d.ts.map +0 -1
- package/node_modules/@isaacs/cliui/dist/esm/ansi-styles/index.js +0 -167
- package/node_modules/@isaacs/cliui/dist/esm/ansi-styles/index.js.map +0 -1
- package/node_modules/@isaacs/cliui/dist/esm/eastasianwidth/index.d.ts +0 -6
- package/node_modules/@isaacs/cliui/dist/esm/eastasianwidth/index.d.ts.map +0 -1
- package/node_modules/@isaacs/cliui/dist/esm/eastasianwidth/index.js +0 -299
- package/node_modules/@isaacs/cliui/dist/esm/eastasianwidth/index.js.map +0 -1
- package/node_modules/@isaacs/cliui/dist/esm/emoji-regex/index.d.ts +0 -2
- package/node_modules/@isaacs/cliui/dist/esm/emoji-regex/index.d.ts.map +0 -1
- package/node_modules/@isaacs/cliui/dist/esm/emoji-regex/index.js +0 -3
- package/node_modules/@isaacs/cliui/dist/esm/emoji-regex/index.js.map +0 -1
- package/node_modules/@isaacs/cliui/dist/esm/index.d.ts +0 -41
- package/node_modules/@isaacs/cliui/dist/esm/index.d.ts.map +0 -1
- package/node_modules/@isaacs/cliui/dist/esm/index.js +0 -317
- package/node_modules/@isaacs/cliui/dist/esm/index.js.map +0 -1
- package/node_modules/@isaacs/cliui/dist/esm/index.min.js +0 -12
- package/node_modules/@isaacs/cliui/dist/esm/index.min.js.map +0 -7
- package/node_modules/@isaacs/cliui/dist/esm/package.json +0 -3
- package/node_modules/@isaacs/cliui/dist/esm/string-width/index.d.ts +0 -5
- package/node_modules/@isaacs/cliui/dist/esm/string-width/index.d.ts.map +0 -1
- package/node_modules/@isaacs/cliui/dist/esm/string-width/index.js +0 -46
- package/node_modules/@isaacs/cliui/dist/esm/string-width/index.js.map +0 -1
- package/node_modules/@isaacs/cliui/dist/esm/strip-ansi/index.d.ts +0 -2
- package/node_modules/@isaacs/cliui/dist/esm/strip-ansi/index.d.ts.map +0 -1
- package/node_modules/@isaacs/cliui/dist/esm/strip-ansi/index.js +0 -4
- package/node_modules/@isaacs/cliui/dist/esm/strip-ansi/index.js.map +0 -1
- package/node_modules/@isaacs/cliui/dist/esm/wrap-ansi/index.d.ts +0 -7
- package/node_modules/@isaacs/cliui/dist/esm/wrap-ansi/index.d.ts.map +0 -1
- package/node_modules/@isaacs/cliui/dist/esm/wrap-ansi/index.js +0 -172
- package/node_modules/@isaacs/cliui/dist/esm/wrap-ansi/index.js.map +0 -1
- package/node_modules/@isaacs/cliui/package.json +0 -163
- package/node_modules/content-disposition/HISTORY.md +0 -60
- package/node_modules/cross-spawn/LICENSE +0 -21
- package/node_modules/cross-spawn/README.md +0 -89
- package/node_modules/cross-spawn/index.js +0 -39
- package/node_modules/cross-spawn/lib/enoent.js +0 -59
- package/node_modules/cross-spawn/lib/parse.js +0 -91
- package/node_modules/cross-spawn/lib/util/escape.js +0 -47
- package/node_modules/cross-spawn/lib/util/readShebang.js +0 -23
- package/node_modules/cross-spawn/lib/util/resolveCommand.js +0 -52
- package/node_modules/cross-spawn/package.json +0 -73
- package/node_modules/fastify/test/types/content-type-parser.test-d.ts +0 -72
- package/node_modules/fastify/test/types/decorate-request-reply.test-d.ts +0 -18
- package/node_modules/fastify/test/types/dummy-plugin.ts +0 -9
- package/node_modules/fastify/test/types/errors.test-d.ts +0 -90
- package/node_modules/fastify/test/types/fastify.test-d.ts +0 -352
- package/node_modules/fastify/test/types/hooks.test-d.ts +0 -550
- package/node_modules/fastify/test/types/import.ts +0 -2
- package/node_modules/fastify/test/types/instance.test-d.ts +0 -588
- package/node_modules/fastify/test/types/logger.test-d.ts +0 -277
- package/node_modules/fastify/test/types/plugin.test-d.ts +0 -97
- package/node_modules/fastify/test/types/register.test-d.ts +0 -237
- package/node_modules/fastify/test/types/reply.test-d.ts +0 -254
- package/node_modules/fastify/test/types/request.test-d.ts +0 -188
- package/node_modules/fastify/test/types/route.test-d.ts +0 -553
- package/node_modules/fastify/test/types/schema.test-d.ts +0 -135
- package/node_modules/fastify/test/types/serverFactory.test-d.ts +0 -37
- package/node_modules/fastify/test/types/type-provider.test-d.ts +0 -1213
- package/node_modules/fastify/test/types/using.test-d.ts +0 -17
- package/node_modules/foreground-child/LICENSE +0 -15
- package/node_modules/foreground-child/README.md +0 -128
- package/node_modules/foreground-child/dist/commonjs/all-signals.d.ts +0 -2
- package/node_modules/foreground-child/dist/commonjs/all-signals.d.ts.map +0 -1
- package/node_modules/foreground-child/dist/commonjs/all-signals.js +0 -58
- package/node_modules/foreground-child/dist/commonjs/all-signals.js.map +0 -1
- package/node_modules/foreground-child/dist/commonjs/index.d.ts +0 -58
- package/node_modules/foreground-child/dist/commonjs/index.d.ts.map +0 -1
- package/node_modules/foreground-child/dist/commonjs/index.js +0 -123
- package/node_modules/foreground-child/dist/commonjs/index.js.map +0 -1
- package/node_modules/foreground-child/dist/commonjs/package.json +0 -3
- package/node_modules/foreground-child/dist/commonjs/proxy-signals.d.ts +0 -6
- package/node_modules/foreground-child/dist/commonjs/proxy-signals.d.ts.map +0 -1
- package/node_modules/foreground-child/dist/commonjs/proxy-signals.js +0 -38
- package/node_modules/foreground-child/dist/commonjs/proxy-signals.js.map +0 -1
- package/node_modules/foreground-child/dist/commonjs/watchdog.d.ts +0 -10
- package/node_modules/foreground-child/dist/commonjs/watchdog.d.ts.map +0 -1
- package/node_modules/foreground-child/dist/commonjs/watchdog.js +0 -50
- package/node_modules/foreground-child/dist/commonjs/watchdog.js.map +0 -1
- package/node_modules/foreground-child/dist/esm/all-signals.d.ts +0 -2
- package/node_modules/foreground-child/dist/esm/all-signals.d.ts.map +0 -1
- package/node_modules/foreground-child/dist/esm/all-signals.js +0 -52
- package/node_modules/foreground-child/dist/esm/all-signals.js.map +0 -1
- package/node_modules/foreground-child/dist/esm/index.d.ts +0 -58
- package/node_modules/foreground-child/dist/esm/index.d.ts.map +0 -1
- package/node_modules/foreground-child/dist/esm/index.js +0 -115
- package/node_modules/foreground-child/dist/esm/index.js.map +0 -1
- package/node_modules/foreground-child/dist/esm/package.json +0 -3
- package/node_modules/foreground-child/dist/esm/proxy-signals.d.ts +0 -6
- package/node_modules/foreground-child/dist/esm/proxy-signals.d.ts.map +0 -1
- package/node_modules/foreground-child/dist/esm/proxy-signals.js +0 -34
- package/node_modules/foreground-child/dist/esm/proxy-signals.js.map +0 -1
- package/node_modules/foreground-child/dist/esm/watchdog.d.ts +0 -10
- package/node_modules/foreground-child/dist/esm/watchdog.d.ts.map +0 -1
- package/node_modules/foreground-child/dist/esm/watchdog.js +0 -46
- package/node_modules/foreground-child/dist/esm/watchdog.js.map +0 -1
- package/node_modules/foreground-child/package.json +0 -106
- package/node_modules/glob/dist/esm/bin.d.mts +0 -3
- package/node_modules/glob/dist/esm/bin.d.mts.map +0 -1
- package/node_modules/glob/dist/esm/bin.mjs +0 -346
- package/node_modules/glob/dist/esm/bin.mjs.map +0 -1
- package/node_modules/isexe/.npmignore +0 -2
- package/node_modules/isexe/LICENSE +0 -15
- package/node_modules/isexe/README.md +0 -51
- package/node_modules/isexe/index.js +0 -57
- package/node_modules/isexe/mode.js +0 -41
- package/node_modules/isexe/package.json +0 -31
- package/node_modules/isexe/test/basic.js +0 -221
- package/node_modules/isexe/windows.js +0 -42
- package/node_modules/jackspeak/LICENSE.md +0 -55
- package/node_modules/jackspeak/README.md +0 -394
- package/node_modules/jackspeak/dist/commonjs/index.d.ts +0 -323
- package/node_modules/jackspeak/dist/commonjs/index.d.ts.map +0 -1
- package/node_modules/jackspeak/dist/commonjs/index.js +0 -944
- package/node_modules/jackspeak/dist/commonjs/index.js.map +0 -1
- package/node_modules/jackspeak/dist/commonjs/index.min.js +0 -33
- package/node_modules/jackspeak/dist/commonjs/index.min.js.map +0 -7
- package/node_modules/jackspeak/dist/commonjs/package.json +0 -3
- package/node_modules/jackspeak/dist/esm/index.d.ts +0 -323
- package/node_modules/jackspeak/dist/esm/index.d.ts.map +0 -1
- package/node_modules/jackspeak/dist/esm/index.js +0 -936
- package/node_modules/jackspeak/dist/esm/index.js.map +0 -1
- package/node_modules/jackspeak/dist/esm/index.min.js +0 -33
- package/node_modules/jackspeak/dist/esm/index.min.js.map +0 -7
- package/node_modules/jackspeak/dist/esm/package.json +0 -3
- package/node_modules/jackspeak/package.json +0 -115
- package/node_modules/jishushell-panel/output/public/assets/ApiKeyField-D1i7zWXR.js +0 -1
- package/node_modules/jishushell-panel/output/public/assets/Dashboard-sWIvL43F.js +0 -1
- package/node_modules/jishushell-panel/output/public/assets/HermesChatPanel-DQ8RyvQY.js +0 -1
- package/node_modules/jishushell-panel/output/public/assets/HermesConfigForm-tIbPP1sB.js +0 -4
- package/node_modules/jishushell-panel/output/public/assets/InitPassword-C3Slq3Dd.js +0 -1
- package/node_modules/jishushell-panel/output/public/assets/InstanceDetail-7JqY9tq4.js +0 -92
- package/node_modules/jishushell-panel/output/public/assets/Login-BXLDJlQN.js +0 -1
- package/node_modules/jishushell-panel/output/public/assets/NewInstance-dLc5Xrpx.js +0 -1
- package/node_modules/jishushell-panel/output/public/assets/ProviderRecommendations-DIAXxesl.js +0 -1
- package/node_modules/jishushell-panel/output/public/assets/Settings-Bd5utbBh.js +0 -1
- package/node_modules/jishushell-panel/output/public/assets/Setup-Yn9_20FL.js +0 -1
- package/node_modules/jishushell-panel/output/public/assets/WeixinLoginPanel-C21doQTJ.js +0 -9
- package/node_modules/jishushell-panel/output/public/assets/index-CCkaIEjn.js +0 -20
- package/node_modules/jishushell-panel/output/public/assets/index-D7qxy-Vh.css +0 -1
- package/node_modules/jishushell-panel/output/public/assets/registry-B2ZQZXWL.js +0 -2
- package/node_modules/jishushell-panel/output/public/assets/usePolling-BFZm4do_.js +0 -1
- package/node_modules/jishushell-panel/output/public/assets/vendor-i18n-DqPtOicc.js +0 -9
- package/node_modules/jishushell-panel/output/public/assets/vendor-react-DW5juQin.js +0 -59
- package/node_modules/package-json-from-dist/LICENSE.md +0 -63
- package/node_modules/package-json-from-dist/README.md +0 -110
- package/node_modules/package-json-from-dist/dist/commonjs/index.d.ts +0 -89
- package/node_modules/package-json-from-dist/dist/commonjs/index.d.ts.map +0 -1
- package/node_modules/package-json-from-dist/dist/commonjs/index.js +0 -134
- package/node_modules/package-json-from-dist/dist/commonjs/index.js.map +0 -1
- package/node_modules/package-json-from-dist/dist/commonjs/package.json +0 -3
- package/node_modules/package-json-from-dist/dist/esm/index.d.ts +0 -89
- package/node_modules/package-json-from-dist/dist/esm/index.d.ts.map +0 -1
- package/node_modules/package-json-from-dist/dist/esm/index.js +0 -129
- package/node_modules/package-json-from-dist/dist/esm/index.js.map +0 -1
- package/node_modules/package-json-from-dist/dist/esm/package.json +0 -3
- package/node_modules/package-json-from-dist/package.json +0 -68
- package/node_modules/path-key/index.d.ts +0 -40
- package/node_modules/path-key/index.js +0 -16
- package/node_modules/path-key/license +0 -9
- package/node_modules/path-key/package.json +0 -39
- package/node_modules/path-key/readme.md +0 -61
- package/node_modules/safe-buffer/LICENSE +0 -21
- package/node_modules/safe-buffer/README.md +0 -584
- package/node_modules/safe-buffer/index.d.ts +0 -187
- package/node_modules/safe-buffer/index.js +0 -65
- package/node_modules/safe-buffer/package.json +0 -51
- package/node_modules/shebang-command/index.js +0 -19
- package/node_modules/shebang-command/license +0 -9
- package/node_modules/shebang-command/package.json +0 -34
- package/node_modules/shebang-command/readme.md +0 -34
- package/node_modules/shebang-regex/index.d.ts +0 -22
- package/node_modules/shebang-regex/index.js +0 -2
- package/node_modules/shebang-regex/license +0 -9
- package/node_modules/shebang-regex/package.json +0 -35
- package/node_modules/shebang-regex/readme.md +0 -33
- package/node_modules/signal-exit/LICENSE.txt +0 -16
- package/node_modules/signal-exit/README.md +0 -74
- package/node_modules/signal-exit/dist/cjs/browser.d.ts +0 -12
- package/node_modules/signal-exit/dist/cjs/browser.d.ts.map +0 -1
- package/node_modules/signal-exit/dist/cjs/browser.js +0 -10
- package/node_modules/signal-exit/dist/cjs/browser.js.map +0 -1
- package/node_modules/signal-exit/dist/cjs/index.d.ts +0 -48
- package/node_modules/signal-exit/dist/cjs/index.d.ts.map +0 -1
- package/node_modules/signal-exit/dist/cjs/index.js +0 -279
- package/node_modules/signal-exit/dist/cjs/index.js.map +0 -1
- package/node_modules/signal-exit/dist/cjs/package.json +0 -3
- package/node_modules/signal-exit/dist/cjs/signals.d.ts +0 -29
- package/node_modules/signal-exit/dist/cjs/signals.d.ts.map +0 -1
- package/node_modules/signal-exit/dist/cjs/signals.js +0 -42
- package/node_modules/signal-exit/dist/cjs/signals.js.map +0 -1
- package/node_modules/signal-exit/dist/mjs/browser.d.ts +0 -12
- package/node_modules/signal-exit/dist/mjs/browser.d.ts.map +0 -1
- package/node_modules/signal-exit/dist/mjs/browser.js +0 -4
- package/node_modules/signal-exit/dist/mjs/browser.js.map +0 -1
- package/node_modules/signal-exit/dist/mjs/index.d.ts +0 -48
- package/node_modules/signal-exit/dist/mjs/index.d.ts.map +0 -1
- package/node_modules/signal-exit/dist/mjs/index.js +0 -275
- package/node_modules/signal-exit/dist/mjs/index.js.map +0 -1
- package/node_modules/signal-exit/dist/mjs/package.json +0 -3
- package/node_modules/signal-exit/dist/mjs/signals.d.ts +0 -29
- package/node_modules/signal-exit/dist/mjs/signals.d.ts.map +0 -1
- package/node_modules/signal-exit/dist/mjs/signals.js +0 -39
- package/node_modules/signal-exit/dist/mjs/signals.js.map +0 -1
- package/node_modules/signal-exit/package.json +0 -106
- package/node_modules/which/CHANGELOG.md +0 -166
- package/node_modules/which/LICENSE +0 -15
- package/node_modules/which/README.md +0 -54
- package/node_modules/which/bin/node-which +0 -52
- package/node_modules/which/package.json +0 -43
- package/node_modules/which/which.js +0 -125
- package/scripts/check-adapter-isolation.ts +0 -293
- /package/dist/services/{app → app-common}/app-compiler.d.ts +0 -0
- /package/dist/services/{app → app-common}/terminal-session-manager.d.ts +0 -0
- /package/dist/services/{backup-verify.d.ts → backup/backup-verify.d.ts} +0 -0
- /package/dist/services/{external-mounts.d.ts → files/external-mounts.d.ts} +0 -0
- /package/dist/services/{organize → files/organize}/applier.d.ts +0 -0
- /package/dist/services/{organize → files/organize}/rules.d.ts +0 -0
- /package/dist/services/{organize → files/organize}/scanner.d.ts +0 -0
- /package/dist/services/{organize → files/organize}/store.d.ts +0 -0
- /package/dist/services/{webdav → files/webdav}/xml-builder.d.ts +0 -0
- /package/dist/services/{webdav → files/webdav}/xml-builder.js +0 -0
- /package/dist/services/{app-passwords.d.ts → instances/passwords.d.ts} +0 -0
- /package/dist/services/{agent-apps → integrations/installable}/installers/registry-probe.d.ts +0 -0
- /package/dist/services/{agent-apps → integrations/installable}/installers/registry-probe.js +0 -0
- /package/dist/services/{runtime/mcp-shims → integrations/openclaw}/drive-shim.d.ts +0 -0
- /package/dist/services/{runtime/mcp-shims → integrations/openclaw}/mcporter-lite.d.ts +0 -0
- /package/dist/services/{plugin-installer.d.ts → setup/plugin-installer.d.ts} +0 -0
- /package/dist/services/{macos-launchd.d.ts → system/macos-launchd.d.ts} +0 -0
- /package/dist/services/{system-monitor.d.ts → system/system-monitor.d.ts} +0 -0
|
@@ -0,0 +1,1189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FilesManager — POSIX file CRUD for `~/.jishushell/files/` (M1 W1 PR-3).
|
|
3
|
+
*
|
|
4
|
+
* Source-of-truth: real filesystem (POSIX). sqlite indexing comes in W5
|
|
5
|
+
* (NAS module) but does not change the truth model.
|
|
6
|
+
*
|
|
7
|
+
* Streaming-first:
|
|
8
|
+
* - readStream() → fs.createReadStream
|
|
9
|
+
* - writeStream() → atomicWriteStream (tmp + sha256 transform + fsync + rename)
|
|
10
|
+
*
|
|
11
|
+
* ETag policy (W1):
|
|
12
|
+
* - Weak ETag W/"<size>-<mtime_ms>" — no sha256 scan on GET
|
|
13
|
+
* - If-Match uses weak comparison
|
|
14
|
+
* - Strong ETag (sha256 from index) added in W5
|
|
15
|
+
*
|
|
16
|
+
* Soft delete:
|
|
17
|
+
* - DELETE moves to ~/.jishushell/files/.trash/{YYYY-MM-DD}/{name}.{epoch}
|
|
18
|
+
* - 30-day retention cleaner is W7+; W1 just creates the directory
|
|
19
|
+
*/
|
|
20
|
+
import * as fs from "node:fs";
|
|
21
|
+
import * as path from "node:path";
|
|
22
|
+
import { createHash } from "node:crypto";
|
|
23
|
+
import { DatabaseSync } from "node:sqlite";
|
|
24
|
+
import { resolveSafe, isHidden, PathSafetyError, } from "../../utils/path-safety.js";
|
|
25
|
+
import { atomicWriteStream } from "../../utils/safe-write.js";
|
|
26
|
+
import { withPathLock } from "../../utils/path-locks.js";
|
|
27
|
+
import { safeWriteJson, safeReadJson } from "../../utils/safe-json.js";
|
|
28
|
+
import { FILES_ROOT, FILES_TRASH_DIR, FILES_AUDIT_LOG, } from "../../config.js";
|
|
29
|
+
import { resolveAcrossMounts, } from "./external-mounts.js";
|
|
30
|
+
import { homedir } from "node:os";
|
|
31
|
+
export class FilesError extends Error {
|
|
32
|
+
code;
|
|
33
|
+
httpStatus;
|
|
34
|
+
constructor(message, code, httpStatus) {
|
|
35
|
+
super(message);
|
|
36
|
+
this.code = code;
|
|
37
|
+
this.httpStatus = httpStatus;
|
|
38
|
+
this.name = "FilesError";
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// ── Defaults ─────────────────────────────────────────
|
|
42
|
+
const DEFAULT_BLOCKED_EXTENSIONS = new Set([
|
|
43
|
+
".exe",
|
|
44
|
+
".bat",
|
|
45
|
+
".cmd",
|
|
46
|
+
".ps1",
|
|
47
|
+
".sh",
|
|
48
|
+
".bash",
|
|
49
|
+
".zsh",
|
|
50
|
+
".com",
|
|
51
|
+
".scr",
|
|
52
|
+
".msi",
|
|
53
|
+
".app",
|
|
54
|
+
]);
|
|
55
|
+
const DEFAULT_QUOTA_MB = 10240; // 10 GB
|
|
56
|
+
const DEFAULT_MAX_UPLOAD_MB = 50;
|
|
57
|
+
const DEFAULT_TEXT_PREVIEW_KB = 256;
|
|
58
|
+
// Extensions treated as indexable text even when MIME is not text/*
|
|
59
|
+
const INDEXABLE_EXTS = new Set([
|
|
60
|
+
".md", ".txt", ".log", ".csv", ".tsv", ".json", ".yaml", ".yml",
|
|
61
|
+
".toml", ".ini", ".cfg", ".js", ".ts", ".tsx", ".jsx", ".mjs", ".cjs",
|
|
62
|
+
".py", ".rb", ".go", ".rs", ".java", ".c", ".cpp", ".h", ".hpp",
|
|
63
|
+
".sh", ".html", ".css", ".xml", ".sql",
|
|
64
|
+
]);
|
|
65
|
+
// Minimal MIME map covering the formats Files Tab actually previews +
|
|
66
|
+
// common archive/binary types. Avoid pulling a 100KB dep for W1.
|
|
67
|
+
const MIME_MAP = {
|
|
68
|
+
".txt": "text/plain; charset=utf-8",
|
|
69
|
+
".md": "text/markdown; charset=utf-8",
|
|
70
|
+
".json": "application/json",
|
|
71
|
+
".yaml": "application/yaml",
|
|
72
|
+
".yml": "application/yaml",
|
|
73
|
+
".csv": "text/csv; charset=utf-8",
|
|
74
|
+
".log": "text/plain; charset=utf-8",
|
|
75
|
+
".html": "text/html; charset=utf-8",
|
|
76
|
+
".css": "text/css; charset=utf-8",
|
|
77
|
+
".js": "application/javascript",
|
|
78
|
+
".ts": "application/typescript",
|
|
79
|
+
".xml": "application/xml",
|
|
80
|
+
".jpg": "image/jpeg",
|
|
81
|
+
".jpeg": "image/jpeg",
|
|
82
|
+
".png": "image/png",
|
|
83
|
+
".webp": "image/webp",
|
|
84
|
+
".gif": "image/gif",
|
|
85
|
+
".svg": "image/svg+xml",
|
|
86
|
+
".bmp": "image/bmp",
|
|
87
|
+
".pdf": "application/pdf",
|
|
88
|
+
".mp3": "audio/mpeg",
|
|
89
|
+
".wav": "audio/wav",
|
|
90
|
+
".ogg": "audio/ogg",
|
|
91
|
+
".mp4": "video/mp4",
|
|
92
|
+
".webm": "video/webm",
|
|
93
|
+
".mov": "video/quicktime",
|
|
94
|
+
".zip": "application/zip",
|
|
95
|
+
".tar": "application/x-tar",
|
|
96
|
+
".gz": "application/gzip",
|
|
97
|
+
};
|
|
98
|
+
function lookupMime(p) {
|
|
99
|
+
const ext = path.extname(p).toLowerCase();
|
|
100
|
+
return MIME_MAP[ext] ?? "application/octet-stream";
|
|
101
|
+
}
|
|
102
|
+
// ── AI-FS W4: Knowledge-dir README ───────────────────
|
|
103
|
+
const KNOWLEDGE_README_TEMPLATE = `# \`.knowledge/\` — Core-managed AI metadata
|
|
104
|
+
|
|
105
|
+
This directory is **maintained by JishuShell core**, not by you.
|
|
106
|
+
|
|
107
|
+
It stores two kinds of artifacts that let the AI agent answer questions about
|
|
108
|
+
your files without re-reading them from scratch each time:
|
|
109
|
+
|
|
110
|
+
- **\`index.sqlite\`** — FTS5 full-text search index over text / markdown / code /
|
|
111
|
+
json / yaml content under \`~/.jishushell/files/\`. Rebuilt on demand when the
|
|
112
|
+
agent calls \`drive_reindex\`. Never auto-rebuilt on file changes.
|
|
113
|
+
- **\`<sha256>.json\`** — Per-file metadata sidecars. Each file is keyed by its
|
|
114
|
+
content hash, not its path, so renaming a file does not lose its tags or
|
|
115
|
+
notes. Schema: \`{ schema_version, sha256, size, mtime, indexed_at, tags?,
|
|
116
|
+
summary?, links?, agent_notes?, ... }\`.
|
|
117
|
+
|
|
118
|
+
## Why it's here, not somewhere hidden
|
|
119
|
+
|
|
120
|
+
You own this filesystem. We surface \`.knowledge/\` instead of stashing state
|
|
121
|
+
inside a database the panel keeps to itself, so backups, snapshots, and
|
|
122
|
+
disaster recovery work without coordinating with the panel. If you copy
|
|
123
|
+
\`~/.jishushell/files/\` to another machine, the AI knowledge moves with it.
|
|
124
|
+
|
|
125
|
+
## Safe to do
|
|
126
|
+
|
|
127
|
+
- **Browse it** — to satisfy curiosity.
|
|
128
|
+
- **Back it up** — it's part of your data, treat it like the rest of the tree.
|
|
129
|
+
- **Delete the whole directory** — the panel will recreate it next time the
|
|
130
|
+
agent uses \`drive_*\` tools; you just lose the cached index and any
|
|
131
|
+
agent-authored notes/tags.
|
|
132
|
+
|
|
133
|
+
## Don't do
|
|
134
|
+
|
|
135
|
+
- **Don't hand-edit** \`<sha256>.json\` files. Use the agent (or a future panel
|
|
136
|
+
UI) to write metadata. Hand-edits work but are not validated — easy to
|
|
137
|
+
corrupt schemas.
|
|
138
|
+
- **Don't rename or move this directory** — the panel hard-codes the path.
|
|
139
|
+
|
|
140
|
+
## Want to ignore it?
|
|
141
|
+
|
|
142
|
+
Filebrowser shows hidden dotfiles by default. If \`.knowledge/\` clutter bothers
|
|
143
|
+
you, toggle "Hide dotfiles" in your Filebrowser user settings; the panel doesn't
|
|
144
|
+
care whether you see it or not.
|
|
145
|
+
|
|
146
|
+
— jishushell @ AI-FS v1
|
|
147
|
+
`;
|
|
148
|
+
// ── Class ────────────────────────────────────────────
|
|
149
|
+
export class FilesManager {
|
|
150
|
+
filesRoot;
|
|
151
|
+
trashRoot;
|
|
152
|
+
auditLog;
|
|
153
|
+
quotaMb;
|
|
154
|
+
maxUploadMb;
|
|
155
|
+
textPreviewMaxKb;
|
|
156
|
+
blockedExtensions;
|
|
157
|
+
externalMounts;
|
|
158
|
+
_indexDb = null;
|
|
159
|
+
_indexDbRegistered = false;
|
|
160
|
+
constructor(cfg = {}) {
|
|
161
|
+
this.filesRoot = cfg.filesRoot ?? FILES_ROOT;
|
|
162
|
+
this.trashRoot = cfg.trashRoot ?? FILES_TRASH_DIR;
|
|
163
|
+
this.auditLog = cfg.auditLog ?? FILES_AUDIT_LOG;
|
|
164
|
+
this.quotaMb = cfg.quotaMb ?? DEFAULT_QUOTA_MB;
|
|
165
|
+
this.maxUploadMb = cfg.maxUploadMb ?? DEFAULT_MAX_UPLOAD_MB;
|
|
166
|
+
this.textPreviewMaxKb = cfg.textPreviewMaxKb ?? DEFAULT_TEXT_PREVIEW_KB;
|
|
167
|
+
this.blockedExtensions =
|
|
168
|
+
cfg.blockedExtensions ?? DEFAULT_BLOCKED_EXTENSIONS;
|
|
169
|
+
this.externalMounts = cfg.externalMounts ?? [];
|
|
170
|
+
fs.mkdirSync(this.filesRoot, { recursive: true });
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Replace the current external-mount set; used when core.json is
|
|
174
|
+
* mutated through routes/external-mounts.ts so a new mount becomes
|
|
175
|
+
* visible without restarting the server.
|
|
176
|
+
*/
|
|
177
|
+
setExternalMounts(mounts) {
|
|
178
|
+
this.externalMounts = [...mounts];
|
|
179
|
+
}
|
|
180
|
+
// ── Listing ─────────────────────────────────────
|
|
181
|
+
async list(relPath, opts = {}) {
|
|
182
|
+
const abs = this.resolve(relPath);
|
|
183
|
+
const stat = this.statOrThrow(abs);
|
|
184
|
+
if (!stat.isDirectory()) {
|
|
185
|
+
throw new FilesError("not a directory", "not-dir", 400);
|
|
186
|
+
}
|
|
187
|
+
const showHidden = opts.showHidden === true;
|
|
188
|
+
const names = fs.readdirSync(abs);
|
|
189
|
+
const entries = [];
|
|
190
|
+
for (const name of names) {
|
|
191
|
+
if (!showHidden && name.startsWith("."))
|
|
192
|
+
continue;
|
|
193
|
+
const childAbs = path.join(abs, name);
|
|
194
|
+
let childStat;
|
|
195
|
+
try {
|
|
196
|
+
// lstat: do NOT follow symlinks during listing (defense layer 3)
|
|
197
|
+
childStat = fs.lstatSync(childAbs);
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
// Skip symlinks entirely from listings — present as a separate concept
|
|
203
|
+
// if/when we want them. W1 hides them.
|
|
204
|
+
if (childStat.isSymbolicLink())
|
|
205
|
+
continue;
|
|
206
|
+
const entry = {
|
|
207
|
+
name,
|
|
208
|
+
is_dir: childStat.isDirectory(),
|
|
209
|
+
size: childStat.isDirectory() ? 0 : childStat.size,
|
|
210
|
+
mtime: Math.floor(childStat.mtimeMs / 1000),
|
|
211
|
+
etag: makeWeakETag(childStat),
|
|
212
|
+
};
|
|
213
|
+
if (entry.is_dir) {
|
|
214
|
+
try {
|
|
215
|
+
entry.child_count = fs.readdirSync(childAbs).length;
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
/* ignore */
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
entry.mime = lookupMime(name);
|
|
223
|
+
}
|
|
224
|
+
entries.push(entry);
|
|
225
|
+
}
|
|
226
|
+
// Merge external mount aliases as virtual entries when listing the
|
|
227
|
+
// root. Mounts inside subdirectories are not (intentionally) — keep
|
|
228
|
+
// mount surface flat at the top of files/.
|
|
229
|
+
if (relPath === "" && this.externalMounts.length > 0) {
|
|
230
|
+
const seen = new Set(entries.map((e) => e.name));
|
|
231
|
+
for (const m of this.externalMounts) {
|
|
232
|
+
if (seen.has(m.alias))
|
|
233
|
+
continue; // real entry shadows the mount
|
|
234
|
+
const mountRoot = m.host_path.startsWith("~")
|
|
235
|
+
? path.join(homedir(), m.host_path.slice(1))
|
|
236
|
+
: path.resolve(m.host_path);
|
|
237
|
+
let mtime = 0;
|
|
238
|
+
let childCount;
|
|
239
|
+
try {
|
|
240
|
+
const s = fs.statSync(mountRoot);
|
|
241
|
+
mtime = Math.floor(s.mtimeMs / 1000);
|
|
242
|
+
if (s.isDirectory()) {
|
|
243
|
+
try {
|
|
244
|
+
childCount = fs.readdirSync(mountRoot).filter((n) => !n.startsWith(".")).length;
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
/* permission denied — fine, leave undefined */
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
/* host path missing — still surface the alias so user sees the
|
|
253
|
+
configuration even if the underlying directory is unavailable */
|
|
254
|
+
}
|
|
255
|
+
entries.push({
|
|
256
|
+
name: m.alias,
|
|
257
|
+
is_dir: true,
|
|
258
|
+
size: 0,
|
|
259
|
+
mtime,
|
|
260
|
+
etag: `W/"mount-${m.alias}-${mtime}"`,
|
|
261
|
+
child_count: childCount,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
entries.sort(sortDirsFirst);
|
|
266
|
+
const quota = await this.quota();
|
|
267
|
+
return {
|
|
268
|
+
path: relPath,
|
|
269
|
+
entries,
|
|
270
|
+
quota_mb: quota.quota_mb,
|
|
271
|
+
used_mb: quota.used_mb,
|
|
272
|
+
available_mb: quota.available_mb,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
// ── Reading ─────────────────────────────────────
|
|
276
|
+
async stat(relPath) {
|
|
277
|
+
const abs = this.resolve(relPath);
|
|
278
|
+
const stat = this.statOrThrow(abs);
|
|
279
|
+
const isDir = stat.isDirectory();
|
|
280
|
+
return {
|
|
281
|
+
is_dir: isDir,
|
|
282
|
+
size: isDir ? 0 : stat.size,
|
|
283
|
+
mtime: Math.floor(stat.mtimeMs / 1000),
|
|
284
|
+
etag: makeWeakETag(stat),
|
|
285
|
+
mime: isDir ? undefined : lookupMime(relPath),
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
async readStream(relPath) {
|
|
289
|
+
const abs = this.resolve(relPath);
|
|
290
|
+
const stat = this.statOrThrow(abs);
|
|
291
|
+
if (stat.isDirectory()) {
|
|
292
|
+
throw new FilesError("path is a directory", "is-dir", 400);
|
|
293
|
+
}
|
|
294
|
+
return {
|
|
295
|
+
openStream: () => fs.createReadStream(abs),
|
|
296
|
+
etag: makeWeakETag(stat),
|
|
297
|
+
mime: lookupMime(relPath),
|
|
298
|
+
size: stat.size,
|
|
299
|
+
mtime: Math.floor(stat.mtimeMs / 1000),
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
async readSmall(relPath, maxBytes) {
|
|
303
|
+
const abs = this.resolve(relPath);
|
|
304
|
+
const stat = this.statOrThrow(abs);
|
|
305
|
+
if (stat.isDirectory()) {
|
|
306
|
+
throw new FilesError("path is a directory", "is-dir", 400);
|
|
307
|
+
}
|
|
308
|
+
const target = Math.min(stat.size, maxBytes);
|
|
309
|
+
const fd = fs.openSync(abs, "r");
|
|
310
|
+
let buf = Buffer.alloc(target);
|
|
311
|
+
try {
|
|
312
|
+
let offset = 0;
|
|
313
|
+
while (offset < target) {
|
|
314
|
+
const got = fs.readSync(fd, buf, offset, target - offset, offset);
|
|
315
|
+
if (got === 0)
|
|
316
|
+
break;
|
|
317
|
+
offset += got;
|
|
318
|
+
}
|
|
319
|
+
buf = buf.subarray(0, offset);
|
|
320
|
+
}
|
|
321
|
+
finally {
|
|
322
|
+
fs.closeSync(fd);
|
|
323
|
+
}
|
|
324
|
+
return {
|
|
325
|
+
buf,
|
|
326
|
+
etag: makeWeakETag(stat),
|
|
327
|
+
mime: lookupMime(relPath),
|
|
328
|
+
truncated: stat.size > maxBytes,
|
|
329
|
+
size: stat.size,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
// ── Writing ─────────────────────────────────────
|
|
333
|
+
async writeStream(relPath, source, opts = {}) {
|
|
334
|
+
if (relPath === "") {
|
|
335
|
+
throw new FilesError("cannot write to root", "invalid-path", 400);
|
|
336
|
+
}
|
|
337
|
+
this.checkExtension(relPath);
|
|
338
|
+
this.assertWritable(relPath);
|
|
339
|
+
const abs = this.resolve(relPath);
|
|
340
|
+
return withPathLock(abs, async () => {
|
|
341
|
+
// Defense layer 3 — ancestor symlinks are always rejected;
|
|
342
|
+
// a symlink AT the target is also rejected (we never write through
|
|
343
|
+
// a symlink, even with overwrite=true).
|
|
344
|
+
this.assertNoSymlinkInAncestors(abs);
|
|
345
|
+
let existedBefore = false;
|
|
346
|
+
let beforeSize = 0;
|
|
347
|
+
try {
|
|
348
|
+
const ls = fs.lstatSync(abs);
|
|
349
|
+
if (ls.isSymbolicLink()) {
|
|
350
|
+
throw new FilesError("target is a symlink", "symlink", 400);
|
|
351
|
+
}
|
|
352
|
+
if (ls.isDirectory()) {
|
|
353
|
+
throw new FilesError("target is a directory", "is-dir", 400);
|
|
354
|
+
}
|
|
355
|
+
existedBefore = true;
|
|
356
|
+
beforeSize = ls.size;
|
|
357
|
+
}
|
|
358
|
+
catch (e) {
|
|
359
|
+
if (e instanceof FilesError)
|
|
360
|
+
throw e;
|
|
361
|
+
if (e.code !== "ENOENT")
|
|
362
|
+
throw e;
|
|
363
|
+
}
|
|
364
|
+
if (existedBefore && opts.overwrite !== true) {
|
|
365
|
+
throw new FilesError("target exists (use overwrite=true)", "exists", 409);
|
|
366
|
+
}
|
|
367
|
+
if (existedBefore && opts.ifMatch !== undefined) {
|
|
368
|
+
const currentETag = makeWeakETag(fs.lstatSync(abs));
|
|
369
|
+
if (!weakETagMatch(opts.ifMatch, currentETag)) {
|
|
370
|
+
throw new FilesError("If-Match did not match current ETag", "etag-mismatch", 412);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
// Pre-check quota using expectedSize when available
|
|
374
|
+
if (opts.expectedSize !== undefined) {
|
|
375
|
+
const delta = opts.expectedSize - beforeSize;
|
|
376
|
+
if (delta > 0)
|
|
377
|
+
await this.assertQuotaAvailable(delta);
|
|
378
|
+
if (opts.expectedSize >
|
|
379
|
+
this.maxUploadMb * 1024 * 1024) {
|
|
380
|
+
throw new FilesError(`file size exceeds max_upload_mb=${this.maxUploadMb}`, "too-large", 413);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
fs.mkdirSync(path.dirname(abs), { recursive: true });
|
|
384
|
+
const result = await atomicWriteStream(abs, source, {
|
|
385
|
+
expectedSize: opts.expectedSize,
|
|
386
|
+
});
|
|
387
|
+
// Defensive: re-check size against max_upload_mb in case expectedSize
|
|
388
|
+
// was not provided (e.g. chunked client). If exceeded, soft-delete.
|
|
389
|
+
const finalStat = fs.lstatSync(abs);
|
|
390
|
+
if (finalStat.size > this.maxUploadMb * 1024 * 1024) {
|
|
391
|
+
// Move to trash so we don't lose user data, then throw
|
|
392
|
+
try {
|
|
393
|
+
await this.removeInternal(abs, relPath);
|
|
394
|
+
}
|
|
395
|
+
catch {
|
|
396
|
+
/* best-effort */
|
|
397
|
+
}
|
|
398
|
+
throw new FilesError(`file size exceeds max_upload_mb=${this.maxUploadMb}`, "too-large", 413);
|
|
399
|
+
}
|
|
400
|
+
const etag = makeWeakETag(finalStat);
|
|
401
|
+
this.audit("write", relPath, { size: result.size });
|
|
402
|
+
return { etag, size: result.size, mime: lookupMime(relPath) };
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Copy one file through the same path, mount, quota, extension, symlink,
|
|
407
|
+
* atomic-write, and audit boundary used by ordinary file writes.
|
|
408
|
+
*/
|
|
409
|
+
async copy(fromRel, toRel, overwrite = false) {
|
|
410
|
+
if (fromRel === "" || toRel === "") {
|
|
411
|
+
throw new FilesError("cannot copy root", "invalid-path", 400);
|
|
412
|
+
}
|
|
413
|
+
const fromAbs = this.resolve(fromRel);
|
|
414
|
+
const toAbs = this.resolve(toRel);
|
|
415
|
+
if (fromAbs === toAbs) {
|
|
416
|
+
throw new FilesError("source and target are the same", "same-path", 409);
|
|
417
|
+
}
|
|
418
|
+
const sourceStat = this.statOrThrow(fromAbs);
|
|
419
|
+
if (sourceStat.isDirectory()) {
|
|
420
|
+
throw new FilesError("recursive directory COPY is not supported in this build", "recursive-copy-unsupported", 502);
|
|
421
|
+
}
|
|
422
|
+
const result = await this.writeStream(toRel, fs.createReadStream(fromAbs), { overwrite, expectedSize: sourceStat.size });
|
|
423
|
+
this.audit("copy", fromRel, { to: toRel, size: result.size });
|
|
424
|
+
return result;
|
|
425
|
+
}
|
|
426
|
+
// ── mkdir / move / remove ───────────────────────
|
|
427
|
+
async mkdir(relPath) {
|
|
428
|
+
if (relPath === "") {
|
|
429
|
+
throw new FilesError("cannot mkdir root", "invalid-path", 400);
|
|
430
|
+
}
|
|
431
|
+
this.assertWritable(relPath);
|
|
432
|
+
const abs = this.resolve(relPath);
|
|
433
|
+
this.assertNoSymlinkInAncestors(abs);
|
|
434
|
+
try {
|
|
435
|
+
const ls = fs.lstatSync(abs);
|
|
436
|
+
if (ls.isSymbolicLink()) {
|
|
437
|
+
throw new FilesError("path is a symlink", "symlink", 400);
|
|
438
|
+
}
|
|
439
|
+
throw new FilesError("path already exists", "exists", 409);
|
|
440
|
+
}
|
|
441
|
+
catch (e) {
|
|
442
|
+
if (e instanceof FilesError)
|
|
443
|
+
throw e;
|
|
444
|
+
if (e.code !== "ENOENT")
|
|
445
|
+
throw e;
|
|
446
|
+
}
|
|
447
|
+
fs.mkdirSync(abs, { recursive: true });
|
|
448
|
+
this.audit("mkdir", relPath);
|
|
449
|
+
}
|
|
450
|
+
async move(fromRel, toRel, overwrite = false) {
|
|
451
|
+
if (fromRel === "" || toRel === "") {
|
|
452
|
+
throw new FilesError("cannot move root", "invalid-path", 400);
|
|
453
|
+
}
|
|
454
|
+
this.assertWritable(fromRel); // moving FROM a ro mount = removing
|
|
455
|
+
this.assertWritable(toRel); // moving TO a ro mount = creating
|
|
456
|
+
const fromAbs = this.resolve(fromRel);
|
|
457
|
+
const toAbs = this.resolve(toRel);
|
|
458
|
+
this.checkExtension(toRel);
|
|
459
|
+
// Defense layer 3 on both endpoints
|
|
460
|
+
this.assertNoSymlinkInAncestors(fromAbs);
|
|
461
|
+
this.assertNoSymlinkInAncestors(toAbs);
|
|
462
|
+
let fromLstat;
|
|
463
|
+
try {
|
|
464
|
+
fromLstat = fs.lstatSync(fromAbs);
|
|
465
|
+
}
|
|
466
|
+
catch (e) {
|
|
467
|
+
if (e.code === "ENOENT") {
|
|
468
|
+
throw new FilesError("source not found", "not-found", 404);
|
|
469
|
+
}
|
|
470
|
+
throw e;
|
|
471
|
+
}
|
|
472
|
+
if (fromLstat.isSymbolicLink()) {
|
|
473
|
+
throw new FilesError("source is a symlink", "symlink", 400);
|
|
474
|
+
}
|
|
475
|
+
// Lock both paths in deterministic order to avoid deadlock
|
|
476
|
+
const sorted = [fromAbs, toAbs].sort();
|
|
477
|
+
const [first, second] = [sorted[0], sorted[1]];
|
|
478
|
+
return withPathLock(first, () => withPathLock(second, async () => {
|
|
479
|
+
try {
|
|
480
|
+
const toLstat = fs.lstatSync(toAbs);
|
|
481
|
+
if (toLstat.isSymbolicLink()) {
|
|
482
|
+
throw new FilesError("target is a symlink", "symlink", 400);
|
|
483
|
+
}
|
|
484
|
+
if (!overwrite) {
|
|
485
|
+
throw new FilesError("target exists", "exists", 409);
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
catch (e) {
|
|
489
|
+
if (e instanceof FilesError)
|
|
490
|
+
throw e;
|
|
491
|
+
if (e.code !== "ENOENT")
|
|
492
|
+
throw e;
|
|
493
|
+
}
|
|
494
|
+
fs.mkdirSync(path.dirname(toAbs), { recursive: true });
|
|
495
|
+
fs.renameSync(fromAbs, toAbs);
|
|
496
|
+
this.audit("move", fromRel, { to: toRel });
|
|
497
|
+
}));
|
|
498
|
+
}
|
|
499
|
+
async remove(relPath) {
|
|
500
|
+
if (relPath === "") {
|
|
501
|
+
throw new FilesError("cannot remove root", "invalid-path", 400);
|
|
502
|
+
}
|
|
503
|
+
this.assertWritable(relPath);
|
|
504
|
+
const abs = this.resolve(relPath);
|
|
505
|
+
this.assertNoSymlinkInAncestors(abs);
|
|
506
|
+
let ls;
|
|
507
|
+
try {
|
|
508
|
+
ls = fs.lstatSync(abs);
|
|
509
|
+
}
|
|
510
|
+
catch (e) {
|
|
511
|
+
if (e.code === "ENOENT") {
|
|
512
|
+
throw new FilesError("path not found", "not-found", 404);
|
|
513
|
+
}
|
|
514
|
+
throw e;
|
|
515
|
+
}
|
|
516
|
+
if (ls.isSymbolicLink()) {
|
|
517
|
+
throw new FilesError("cannot remove symlink", "symlink", 400);
|
|
518
|
+
}
|
|
519
|
+
return withPathLock(abs, () => this.removeInternal(abs, relPath));
|
|
520
|
+
}
|
|
521
|
+
async removeInternal(abs, relPath) {
|
|
522
|
+
const trashDay = path.join(this.trashRoot, ymd());
|
|
523
|
+
fs.mkdirSync(trashDay, { recursive: true });
|
|
524
|
+
const baseName = path.basename(abs);
|
|
525
|
+
const ts = Date.now();
|
|
526
|
+
const trashTarget = path.join(trashDay, `${baseName}.${ts}`);
|
|
527
|
+
fs.renameSync(abs, trashTarget);
|
|
528
|
+
this.audit("remove", relPath, { trash: trashTarget });
|
|
529
|
+
}
|
|
530
|
+
// ── Path resolution ─────────────────────────────
|
|
531
|
+
/**
|
|
532
|
+
* Resolve a files/-relative path to its absolute host filesystem path.
|
|
533
|
+
*
|
|
534
|
+
* Why a public API: the drive-shim (and the agents that call it via MCP)
|
|
535
|
+
* needs to hand the resulting absolute path to IM channel plugins
|
|
536
|
+
* (Feishu / WeChat / Telegram / ...) that send files. Those plugins read
|
|
537
|
+
* from the local filesystem, not via HTTP. The OpenClaw container runs
|
|
538
|
+
* with host==container bind mounts (see buildVolumes in
|
|
539
|
+
* src/services/integrations/openclaw/integration.ts), so the same absolute
|
|
540
|
+
* string is valid on both sides; raw_exec / process service managers
|
|
541
|
+
* run the agent natively on the host, where the path is also directly
|
|
542
|
+
* usable.
|
|
543
|
+
*
|
|
544
|
+
* External mounts: a path whose first segment is an external mount
|
|
545
|
+
* alias resolves into the mount's host_path. The returned abs_path
|
|
546
|
+
* points at the real host location; external_mount is set so the
|
|
547
|
+
* caller can warn the user that this is outside files/. mode is
|
|
548
|
+
* propagated so writers know if it's read-only.
|
|
549
|
+
*
|
|
550
|
+
* Symlink policy: if the path resolves to a symlink we still surface
|
|
551
|
+
* the abs_path (callers may legitimately want to know where it points
|
|
552
|
+
* conceptually), but exists is reported as false to discourage handing
|
|
553
|
+
* symlinks to channel plugins.
|
|
554
|
+
*/
|
|
555
|
+
async resolveLocalPath(relPath) {
|
|
556
|
+
const r = this.resolveOp(relPath);
|
|
557
|
+
const out = {
|
|
558
|
+
abs_path: r.abs,
|
|
559
|
+
exists: false,
|
|
560
|
+
};
|
|
561
|
+
if (r.ext) {
|
|
562
|
+
out.external_mount = r.ext.alias;
|
|
563
|
+
out.external_mount_mode = r.ext.mode;
|
|
564
|
+
}
|
|
565
|
+
try {
|
|
566
|
+
const ls = fs.lstatSync(r.abs);
|
|
567
|
+
if (ls.isSymbolicLink()) {
|
|
568
|
+
return out; // exists stays false; symlinks are not handed out
|
|
569
|
+
}
|
|
570
|
+
out.exists = true;
|
|
571
|
+
out.is_dir = ls.isDirectory();
|
|
572
|
+
out.size = ls.size;
|
|
573
|
+
out.mtime = Math.floor(ls.mtimeMs / 1000);
|
|
574
|
+
}
|
|
575
|
+
catch (e) {
|
|
576
|
+
if (e?.code !== "ENOENT" && e?.code !== "ENOTDIR") {
|
|
577
|
+
throw new FilesError(`stat failed: ${e.message}`, "stat", 500);
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
return out;
|
|
581
|
+
}
|
|
582
|
+
// ── Quota ───────────────────────────────────────
|
|
583
|
+
async quota() {
|
|
584
|
+
const used = dirSize(this.filesRoot, this.trashRoot);
|
|
585
|
+
const trash = fs.existsSync(this.trashRoot) ? dirSize(this.trashRoot) : 0;
|
|
586
|
+
const usedMb = used / (1024 * 1024);
|
|
587
|
+
const trashMb = trash / (1024 * 1024);
|
|
588
|
+
return {
|
|
589
|
+
quota_mb: this.quotaMb,
|
|
590
|
+
used_mb: round(usedMb),
|
|
591
|
+
available_mb: round(Math.max(0, this.quotaMb - usedMb)),
|
|
592
|
+
trash_mb: round(trashMb),
|
|
593
|
+
};
|
|
594
|
+
}
|
|
595
|
+
async assertQuotaAvailable(deltaBytes) {
|
|
596
|
+
if (deltaBytes <= 0)
|
|
597
|
+
return;
|
|
598
|
+
const q = await this.quota();
|
|
599
|
+
const availBytes = q.available_mb * 1024 * 1024;
|
|
600
|
+
if (deltaBytes > availBytes) {
|
|
601
|
+
throw new FilesError("quota exceeded", "quota", 507);
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
// ── Audit ───────────────────────────────────────
|
|
605
|
+
audit(op, relPath, meta = {}) {
|
|
606
|
+
try {
|
|
607
|
+
const line = JSON.stringify({
|
|
608
|
+
ts: Math.floor(Date.now() / 1000),
|
|
609
|
+
op,
|
|
610
|
+
path: relPath,
|
|
611
|
+
...meta,
|
|
612
|
+
}) + "\n";
|
|
613
|
+
fs.mkdirSync(path.dirname(this.auditLog), { recursive: true });
|
|
614
|
+
fs.appendFileSync(this.auditLog, line);
|
|
615
|
+
}
|
|
616
|
+
catch (e) {
|
|
617
|
+
console.warn(`[files-audit] failed: ${e.message}`);
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
// ── Internals ───────────────────────────────────
|
|
621
|
+
/**
|
|
622
|
+
* Resolve a files/-relative path. If the first segment matches a
|
|
623
|
+
* registered external mount alias the path is virtualized into the
|
|
624
|
+
* mount's host_path; otherwise the path resolves under FILES_ROOT.
|
|
625
|
+
*
|
|
626
|
+
* Symlink defense (assertNoSymlinkInAncestors) and lstat checks in
|
|
627
|
+
* the calling op still run on the absolute path returned here, so
|
|
628
|
+
* symlinks INSIDE an external mount are still rejected.
|
|
629
|
+
*/
|
|
630
|
+
resolve(relPath) {
|
|
631
|
+
return this.resolveOp(relPath).abs;
|
|
632
|
+
}
|
|
633
|
+
resolveOp(relPath) {
|
|
634
|
+
if (this.externalMounts.length > 0) {
|
|
635
|
+
const m = resolveAcrossMounts(relPath, this.externalMounts);
|
|
636
|
+
if (m) {
|
|
637
|
+
const mountRoot = m.mount.host_path.startsWith("~")
|
|
638
|
+
? path.join(homedir(), m.mount.host_path.slice(1))
|
|
639
|
+
: path.resolve(m.mount.host_path);
|
|
640
|
+
try {
|
|
641
|
+
const abs = resolveSafe(mountRoot, m.remainder);
|
|
642
|
+
return { abs, ext: m.mount };
|
|
643
|
+
}
|
|
644
|
+
catch (e) {
|
|
645
|
+
if (e instanceof PathSafetyError) {
|
|
646
|
+
throw new FilesError(`invalid path: ${e.message}`, "invalid-path", 400);
|
|
647
|
+
}
|
|
648
|
+
throw e;
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
try {
|
|
653
|
+
return { abs: resolveSafe(this.filesRoot, relPath), ext: null };
|
|
654
|
+
}
|
|
655
|
+
catch (e) {
|
|
656
|
+
if (e instanceof PathSafetyError) {
|
|
657
|
+
throw new FilesError(`invalid path: ${e.message}`, "invalid-path", 400);
|
|
658
|
+
}
|
|
659
|
+
throw e;
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
/**
|
|
663
|
+
* Refuse mutations that target a read-only external mount. Called by
|
|
664
|
+
* write / move / delete / mkdir before any fs work.
|
|
665
|
+
*/
|
|
666
|
+
assertWritable(rel) {
|
|
667
|
+
const r = this.resolveOp(rel);
|
|
668
|
+
if (r.ext && r.ext.mode === "ro") {
|
|
669
|
+
throw new FilesError(`mount "${r.ext.alias}" is read-only`, "read-only", 403);
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
/**
|
|
673
|
+
* Defense layer 3 (per path-safety.ts header): refuse symlinks at the
|
|
674
|
+
* target path AND refuse paths that traverse a symlink in their parent
|
|
675
|
+
* chain inside the trust root.
|
|
676
|
+
*
|
|
677
|
+
* For external mounts the trust root is the mount's host_path (the
|
|
678
|
+
* user explicitly chose that directory; symlinks inside it are their
|
|
679
|
+
* own filesystem and not an attack we need to defend against). For
|
|
680
|
+
* regular files/ paths the trust root is FILES_ROOT.
|
|
681
|
+
*/
|
|
682
|
+
statOrThrow(abs) {
|
|
683
|
+
try {
|
|
684
|
+
const ls = fs.lstatSync(abs);
|
|
685
|
+
if (ls.isSymbolicLink()) {
|
|
686
|
+
throw new FilesError("symlink target is not allowed", "symlink", 400);
|
|
687
|
+
}
|
|
688
|
+
this.assertNoSymlinkInAncestors(abs);
|
|
689
|
+
return fs.statSync(abs);
|
|
690
|
+
}
|
|
691
|
+
catch (e) {
|
|
692
|
+
if (e instanceof FilesError)
|
|
693
|
+
throw e;
|
|
694
|
+
if (e.code === "ENOENT") {
|
|
695
|
+
throw new FilesError("path not found", "not-found", 404);
|
|
696
|
+
}
|
|
697
|
+
throw e;
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
/**
|
|
701
|
+
* Walk up from `abs` toward the relevant trust root and refuse if any
|
|
702
|
+
* intermediate component is a symlink. Trust root is FILES_ROOT for
|
|
703
|
+
* regular paths and the matching external-mount host_path for paths
|
|
704
|
+
* that fall inside an external mount.
|
|
705
|
+
*/
|
|
706
|
+
assertNoSymlinkInAncestors(abs) {
|
|
707
|
+
const trustRoot = this.trustRootFor(abs);
|
|
708
|
+
let cur = path.dirname(abs);
|
|
709
|
+
while (cur.length >= trustRoot.length && cur !== path.dirname(cur)) {
|
|
710
|
+
if (cur === trustRoot)
|
|
711
|
+
return;
|
|
712
|
+
try {
|
|
713
|
+
const s = fs.lstatSync(cur);
|
|
714
|
+
if (s.isSymbolicLink()) {
|
|
715
|
+
throw new FilesError("path traverses a symlink ancestor", "symlink", 400);
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
catch (e) {
|
|
719
|
+
if (e instanceof FilesError)
|
|
720
|
+
throw e;
|
|
721
|
+
if (e.code !== "ENOENT")
|
|
722
|
+
throw e;
|
|
723
|
+
// missing intermediate is OK — write side may create it
|
|
724
|
+
}
|
|
725
|
+
cur = path.dirname(cur);
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
/**
|
|
729
|
+
* Find the trust root for an absolute path: either an external mount's
|
|
730
|
+
* host_path (if abs is inside one) or FILES_ROOT.
|
|
731
|
+
*/
|
|
732
|
+
trustRootFor(abs) {
|
|
733
|
+
for (const m of this.externalMounts) {
|
|
734
|
+
const root = m.host_path.startsWith("~")
|
|
735
|
+
? path.join(homedir(), m.host_path.slice(1))
|
|
736
|
+
: path.resolve(m.host_path);
|
|
737
|
+
if (abs === root || abs.startsWith(root + path.sep))
|
|
738
|
+
return root;
|
|
739
|
+
}
|
|
740
|
+
return this.filesRoot;
|
|
741
|
+
}
|
|
742
|
+
checkExtension(relPath) {
|
|
743
|
+
const ext = path.extname(relPath).toLowerCase();
|
|
744
|
+
if (this.blockedExtensions.has(ext)) {
|
|
745
|
+
throw new FilesError(`extension ${ext} is blocked`, "blocked-ext", 400);
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
// ── Knowledge index (AI-FS W3) ───────────────────
|
|
749
|
+
/**
|
|
750
|
+
* Returns the knowledge directory path (does NOT create it).
|
|
751
|
+
*/
|
|
752
|
+
get knowledgeDir() {
|
|
753
|
+
return path.join(this.filesRoot, ".knowledge");
|
|
754
|
+
}
|
|
755
|
+
/**
|
|
756
|
+
* Returns the SQLite DB path.
|
|
757
|
+
*/
|
|
758
|
+
get indexDbPath() {
|
|
759
|
+
return path.join(this.knowledgeDir, "index.sqlite");
|
|
760
|
+
}
|
|
761
|
+
/**
|
|
762
|
+
* Returns the sidecar path for a given sha256.
|
|
763
|
+
*/
|
|
764
|
+
sidecarPath(sha256) {
|
|
765
|
+
return path.join(this.knowledgeDir, `${sha256}.json`);
|
|
766
|
+
}
|
|
767
|
+
/**
|
|
768
|
+
* Creates ~/.jishushell/files/.knowledge/ (mode 0700) and, on first
|
|
769
|
+
* creation only, writes a README.md explaining the directory is
|
|
770
|
+
* panel-private metadata. README is idempotent: only written when the
|
|
771
|
+
* file doesn't already exist, never overwritten.
|
|
772
|
+
*/
|
|
773
|
+
ensureKnowledgeDir() {
|
|
774
|
+
fs.mkdirSync(this.knowledgeDir, { recursive: true, mode: 0o700 });
|
|
775
|
+
const readmePath = path.join(this.knowledgeDir, "README.md");
|
|
776
|
+
if (!fs.existsSync(readmePath)) {
|
|
777
|
+
try {
|
|
778
|
+
fs.writeFileSync(readmePath, KNOWLEDGE_README_TEMPLATE, { encoding: "utf8", mode: 0o644 });
|
|
779
|
+
}
|
|
780
|
+
catch (e) {
|
|
781
|
+
try {
|
|
782
|
+
this.audit("knowledge-readme-warn", readmePath, { err: e.message });
|
|
783
|
+
}
|
|
784
|
+
catch { /* ignore */ }
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
/**
|
|
789
|
+
* Lazy-initialize the SQLite FTS5 handle. Creates the .knowledge dir
|
|
790
|
+
* and the schema on first call.
|
|
791
|
+
*/
|
|
792
|
+
getIndexDb() {
|
|
793
|
+
if (this._indexDb !== null)
|
|
794
|
+
return this._indexDb;
|
|
795
|
+
this.ensureKnowledgeDir();
|
|
796
|
+
const db = new DatabaseSync(this.indexDbPath);
|
|
797
|
+
// Migrate a legacy unicode61 index to the trigram tokenizer. unicode61
|
|
798
|
+
// does not segment CJK (a whole Chinese run becomes one token), so
|
|
799
|
+
// substring queries like "发票" never match. trigram indexes 3-char
|
|
800
|
+
// windows, which lets LIKE substring probes hit the index for Chinese.
|
|
801
|
+
// The index is a derived cache (POSIX is source of truth), so dropping
|
|
802
|
+
// and rebuilding it is safe.
|
|
803
|
+
const existing = db
|
|
804
|
+
.prepare("SELECT sql FROM sqlite_master WHERE type='table' AND name='docs'")
|
|
805
|
+
.get();
|
|
806
|
+
const needsMigration = !!existing?.sql && !/\btrigram\b/i.test(existing.sql);
|
|
807
|
+
if (needsMigration) {
|
|
808
|
+
db.exec("DROP TABLE docs");
|
|
809
|
+
}
|
|
810
|
+
db.exec(`
|
|
811
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS docs USING fts5(
|
|
812
|
+
sha256 UNINDEXED,
|
|
813
|
+
path,
|
|
814
|
+
content,
|
|
815
|
+
tags,
|
|
816
|
+
tokenize='trigram'
|
|
817
|
+
)
|
|
818
|
+
`);
|
|
819
|
+
this._indexDb = db;
|
|
820
|
+
// After a tokenizer migration the table is empty; repopulate from the
|
|
821
|
+
// POSIX tree so search isn't blank in the meantime. Fire-and-forget —
|
|
822
|
+
// getIndexDb() now returns the cached handle, so no re-migration.
|
|
823
|
+
if (needsMigration) {
|
|
824
|
+
this.reindex().catch((e) => {
|
|
825
|
+
this.audit("reindex-error", "", {
|
|
826
|
+
err: e?.message,
|
|
827
|
+
stack: e?.stack,
|
|
828
|
+
reason: "trigram-migration",
|
|
829
|
+
});
|
|
830
|
+
});
|
|
831
|
+
}
|
|
832
|
+
// Register process.exit close handler once per instance
|
|
833
|
+
if (!this._indexDbRegistered) {
|
|
834
|
+
this._indexDbRegistered = true;
|
|
835
|
+
process.once("beforeExit", () => {
|
|
836
|
+
try {
|
|
837
|
+
this._indexDb?.close();
|
|
838
|
+
}
|
|
839
|
+
catch { /* ignore */ }
|
|
840
|
+
});
|
|
841
|
+
}
|
|
842
|
+
return db;
|
|
843
|
+
}
|
|
844
|
+
/**
|
|
845
|
+
* Search the FTS5 index.
|
|
846
|
+
*/
|
|
847
|
+
async searchIndex(query, opts) {
|
|
848
|
+
const q = query.trim();
|
|
849
|
+
if (!q) {
|
|
850
|
+
throw new FilesError("query must not be empty", "invalid-query", 400);
|
|
851
|
+
}
|
|
852
|
+
// Return empty if DB doesn't exist yet (no reindex run)
|
|
853
|
+
if (!fs.existsSync(this.indexDbPath)) {
|
|
854
|
+
this.audit("search_index", "", { query: q, hits: 0 });
|
|
855
|
+
return [];
|
|
856
|
+
}
|
|
857
|
+
const db = this.getIndexDb();
|
|
858
|
+
const limit = Math.min(opts?.limit ?? 20, 100);
|
|
859
|
+
// High-recall substring matching. Split the query into whitespace-separated
|
|
860
|
+
// terms; a doc matching ANY term is a candidate, ranked by how many terms it
|
|
861
|
+
// matches. The trigram tokenizer lets these LIKE substring probes hit the
|
|
862
|
+
// index (CJK included). Semantic understanding and precise re-ranking are
|
|
863
|
+
// the agent's job, not the panel's — this is a dumb, high-recall surface.
|
|
864
|
+
const terms = q.split(/\s+/).filter(Boolean).slice(0, 16);
|
|
865
|
+
if (terms.length === 0) {
|
|
866
|
+
this.audit("search_index", "", { query: q, hits: 0 });
|
|
867
|
+
return [];
|
|
868
|
+
}
|
|
869
|
+
const escapeLike = (s) => s.replace(/([\\%_])/g, "\\$1");
|
|
870
|
+
const perTerm = "(content LIKE ? ESCAPE '\\' OR path LIKE ? ESCAPE '\\' OR tags LIKE ? ESCAPE '\\')";
|
|
871
|
+
const matchCountExpr = terms
|
|
872
|
+
.map(() => `(CASE WHEN ${perTerm} THEN 1 ELSE 0 END)`)
|
|
873
|
+
.join(" + ");
|
|
874
|
+
const whereExpr = terms.map(() => perTerm).join(" OR ");
|
|
875
|
+
// Positional params follow SQL text order: the match-count CASEs (SELECT
|
|
876
|
+
// clause) first, then the WHERE clause, then optional prefix, then limit.
|
|
877
|
+
const likeParams = [];
|
|
878
|
+
for (const t of terms) {
|
|
879
|
+
const pat = `%${escapeLike(t)}%`;
|
|
880
|
+
likeParams.push(pat, pat, pat);
|
|
881
|
+
}
|
|
882
|
+
let rows;
|
|
883
|
+
if (opts?.pathPrefix) {
|
|
884
|
+
const prefix = `${escapeLike(opts.pathPrefix)}%`;
|
|
885
|
+
rows = db.prepare(`SELECT path, sha256, content, (${matchCountExpr}) AS match_count
|
|
886
|
+
FROM docs
|
|
887
|
+
WHERE (${whereExpr}) AND path LIKE ? ESCAPE '\\'
|
|
888
|
+
ORDER BY match_count DESC
|
|
889
|
+
LIMIT ?`).all(...likeParams, ...likeParams, prefix, limit);
|
|
890
|
+
}
|
|
891
|
+
else {
|
|
892
|
+
rows = db.prepare(`SELECT path, sha256, content, (${matchCountExpr}) AS match_count
|
|
893
|
+
FROM docs
|
|
894
|
+
WHERE (${whereExpr})
|
|
895
|
+
ORDER BY match_count DESC
|
|
896
|
+
LIMIT ?`).all(...likeParams, ...likeParams, limit);
|
|
897
|
+
}
|
|
898
|
+
const hits = rows.map((r) => ({
|
|
899
|
+
path: r.path,
|
|
900
|
+
sha256: r.sha256,
|
|
901
|
+
snippet: buildSnippet(r.content, terms),
|
|
902
|
+
score: -r.match_count,
|
|
903
|
+
}));
|
|
904
|
+
this.audit("search_index", "", { query: q, hits: hits.length });
|
|
905
|
+
return hits;
|
|
906
|
+
}
|
|
907
|
+
/**
|
|
908
|
+
* Read a sidecar JSON for a file identified by sha256 or path.
|
|
909
|
+
*/
|
|
910
|
+
async getMeta(args) {
|
|
911
|
+
let sha256;
|
|
912
|
+
if (args.sha256) {
|
|
913
|
+
sha256 = args.sha256.toLowerCase();
|
|
914
|
+
if (!SHA256_RE.test(sha256)) {
|
|
915
|
+
throw new FilesError("invalid sha256 format", "invalid-sha256", 400);
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
else if (args.path) {
|
|
919
|
+
// Resolve path and stream-hash the file
|
|
920
|
+
const abs = this.resolve(args.path);
|
|
921
|
+
if (!fs.existsSync(abs)) {
|
|
922
|
+
throw new FilesError("path not found", "not-found", 404);
|
|
923
|
+
}
|
|
924
|
+
sha256 = await streamSha256(abs, 64 * 1024 * 1024);
|
|
925
|
+
}
|
|
926
|
+
else {
|
|
927
|
+
throw new FilesError("sha256 or path required", "invalid-args", 400);
|
|
928
|
+
}
|
|
929
|
+
this.audit("get_meta", sha256);
|
|
930
|
+
const sp = this.sidecarPath(sha256);
|
|
931
|
+
if (!fs.existsSync(sp))
|
|
932
|
+
return null;
|
|
933
|
+
const raw = safeReadJson(sp, "get_meta");
|
|
934
|
+
if (raw === null) {
|
|
935
|
+
this.audit("get_meta_warn", sha256, { warn: "sidecar malformed, treating as null" });
|
|
936
|
+
return null;
|
|
937
|
+
}
|
|
938
|
+
return raw;
|
|
939
|
+
}
|
|
940
|
+
/**
|
|
941
|
+
* Write (merge or replace) a sidecar for a given sha256.
|
|
942
|
+
*/
|
|
943
|
+
async setMeta(sha256, payload, opts) {
|
|
944
|
+
const normalizedSha = sha256.toLowerCase();
|
|
945
|
+
if (!SHA256_RE.test(normalizedSha)) {
|
|
946
|
+
throw new FilesError("invalid sha256 format", "invalid-sha256", 400);
|
|
947
|
+
}
|
|
948
|
+
// Validate payload is JSON-serializable and within size limit
|
|
949
|
+
let serialized;
|
|
950
|
+
try {
|
|
951
|
+
serialized = JSON.stringify(payload);
|
|
952
|
+
}
|
|
953
|
+
catch {
|
|
954
|
+
throw new FilesError("payload is not JSON-serializable", "invalid-payload", 400);
|
|
955
|
+
}
|
|
956
|
+
if (Buffer.byteLength(serialized, "utf8") > 64 * 1024) {
|
|
957
|
+
throw new FilesError("payload exceeds 64KB limit", "payload-too-large", 413);
|
|
958
|
+
}
|
|
959
|
+
const merge = opts?.merge !== false; // default true
|
|
960
|
+
this.ensureKnowledgeDir();
|
|
961
|
+
let base = {};
|
|
962
|
+
if (merge) {
|
|
963
|
+
const existing = safeReadJson(this.sidecarPath(normalizedSha), "set_meta");
|
|
964
|
+
if (existing !== null)
|
|
965
|
+
base = existing;
|
|
966
|
+
}
|
|
967
|
+
const now = Math.floor(Date.now() / 1000);
|
|
968
|
+
const merged = {
|
|
969
|
+
...base,
|
|
970
|
+
...payload,
|
|
971
|
+
schema_version: 1,
|
|
972
|
+
sha256: normalizedSha,
|
|
973
|
+
indexed_at: now,
|
|
974
|
+
size: base.size ?? 0,
|
|
975
|
+
mtime: base.mtime ?? 0,
|
|
976
|
+
};
|
|
977
|
+
safeWriteJson(this.sidecarPath(normalizedSha), merged);
|
|
978
|
+
this.audit("set_meta", normalizedSha, { merge });
|
|
979
|
+
return merged;
|
|
980
|
+
}
|
|
981
|
+
/**
|
|
982
|
+
* Walk the file tree and upsert text-indexable files into the FTS5 index.
|
|
983
|
+
*/
|
|
984
|
+
async reindex(opts) {
|
|
985
|
+
const walkRoot = opts?.pathPrefix
|
|
986
|
+
? path.join(this.filesRoot, opts.pathPrefix)
|
|
987
|
+
: this.filesRoot;
|
|
988
|
+
const result = { indexed: 0, skipped: 0, errors: 0 };
|
|
989
|
+
if (!fs.existsSync(walkRoot)) {
|
|
990
|
+
this.audit("reindex", opts?.pathPrefix ?? "/", result);
|
|
991
|
+
return result;
|
|
992
|
+
}
|
|
993
|
+
const db = this.getIndexDb();
|
|
994
|
+
const upsertDelete = db.prepare("DELETE FROM docs WHERE sha256 = ?");
|
|
995
|
+
const upsertInsert = db.prepare("INSERT INTO docs(sha256, path, content, tags) VALUES (?, ?, ?, ?)");
|
|
996
|
+
const stack = [walkRoot];
|
|
997
|
+
while (stack.length > 0) {
|
|
998
|
+
const cur = stack.pop();
|
|
999
|
+
let entries;
|
|
1000
|
+
try {
|
|
1001
|
+
entries = fs.readdirSync(cur, { withFileTypes: true });
|
|
1002
|
+
}
|
|
1003
|
+
catch (e) {
|
|
1004
|
+
result.errors++;
|
|
1005
|
+
this.audit("reindex-error", cur, { err: e?.message });
|
|
1006
|
+
continue;
|
|
1007
|
+
}
|
|
1008
|
+
for (const entry of entries) {
|
|
1009
|
+
const absEntry = path.join(cur, entry.name);
|
|
1010
|
+
// Compute rel path relative to filesRoot
|
|
1011
|
+
const relEntry = path.relative(this.filesRoot, absEntry);
|
|
1012
|
+
if (entry.isDirectory()) {
|
|
1013
|
+
// Skip panel-private dirs
|
|
1014
|
+
if (relEntry === ".knowledge" || relEntry.startsWith(".knowledge" + path.sep))
|
|
1015
|
+
continue;
|
|
1016
|
+
if (relEntry === ".trash" || relEntry.startsWith(".trash" + path.sep))
|
|
1017
|
+
continue;
|
|
1018
|
+
stack.push(absEntry);
|
|
1019
|
+
continue;
|
|
1020
|
+
}
|
|
1021
|
+
if (!entry.isFile())
|
|
1022
|
+
continue;
|
|
1023
|
+
// Skip non-indexable files
|
|
1024
|
+
const mime = lookupMime(entry.name);
|
|
1025
|
+
const ext = path.extname(entry.name).toLowerCase();
|
|
1026
|
+
if (!mime.startsWith("text/") && !INDEXABLE_EXTS.has(ext)) {
|
|
1027
|
+
result.skipped++;
|
|
1028
|
+
continue;
|
|
1029
|
+
}
|
|
1030
|
+
try {
|
|
1031
|
+
// Compute sha256 via streaming (full file) and read up to 512KB for content
|
|
1032
|
+
const sha = await streamSha256(absEntry);
|
|
1033
|
+
const stat = fs.statSync(absEntry);
|
|
1034
|
+
const readBytes = Math.min(stat.size, 512 * 1024);
|
|
1035
|
+
let content = "";
|
|
1036
|
+
if (readBytes > 0) {
|
|
1037
|
+
const fd = fs.openSync(absEntry, "r");
|
|
1038
|
+
try {
|
|
1039
|
+
const buf = Buffer.alloc(readBytes);
|
|
1040
|
+
let off = 0;
|
|
1041
|
+
while (off < readBytes) {
|
|
1042
|
+
const got = fs.readSync(fd, buf, off, readBytes - off, off);
|
|
1043
|
+
if (got === 0)
|
|
1044
|
+
break;
|
|
1045
|
+
off += got;
|
|
1046
|
+
}
|
|
1047
|
+
content = buf.subarray(0, off).toString("utf8");
|
|
1048
|
+
}
|
|
1049
|
+
finally {
|
|
1050
|
+
fs.closeSync(fd);
|
|
1051
|
+
}
|
|
1052
|
+
}
|
|
1053
|
+
// Load tags from existing sidecar if present
|
|
1054
|
+
const sp = this.sidecarPath(sha);
|
|
1055
|
+
let tags = "";
|
|
1056
|
+
if (fs.existsSync(sp)) {
|
|
1057
|
+
const sc = safeReadJson(sp, "reindex");
|
|
1058
|
+
if (sc?.tags && Array.isArray(sc.tags)) {
|
|
1059
|
+
tags = sc.tags.join(" ");
|
|
1060
|
+
}
|
|
1061
|
+
}
|
|
1062
|
+
upsertDelete.run(sha);
|
|
1063
|
+
upsertInsert.run(sha, relEntry, content, tags);
|
|
1064
|
+
result.indexed++;
|
|
1065
|
+
}
|
|
1066
|
+
catch (e) {
|
|
1067
|
+
result.errors++;
|
|
1068
|
+
this.audit("reindex-error", relEntry, { err: e?.message });
|
|
1069
|
+
}
|
|
1070
|
+
}
|
|
1071
|
+
}
|
|
1072
|
+
this.audit("reindex", opts?.pathPrefix ?? "/", result);
|
|
1073
|
+
return result;
|
|
1074
|
+
}
|
|
1075
|
+
}
|
|
1076
|
+
// ── Helpers ───────────────────────────────────────
|
|
1077
|
+
function makeWeakETag(stat) {
|
|
1078
|
+
return `W/"${stat.size}-${Math.floor(stat.mtimeMs)}"`;
|
|
1079
|
+
}
|
|
1080
|
+
function weakETagMatch(provided, current) {
|
|
1081
|
+
// RFC 7232 weak comparison: strip W/ from both, compare values
|
|
1082
|
+
const strip = (s) => s.replace(/^W\//, "");
|
|
1083
|
+
return strip(provided) === strip(current);
|
|
1084
|
+
}
|
|
1085
|
+
// Build a `<b>`-highlighted snippet around the first matched term. Replaces
|
|
1086
|
+
// FTS5 snippet() (which needs MATCH); we do substring search via LIKE instead.
|
|
1087
|
+
const SNIPPET_WINDOW = 30;
|
|
1088
|
+
function buildSnippet(content, terms) {
|
|
1089
|
+
if (!content)
|
|
1090
|
+
return "";
|
|
1091
|
+
const lc = content.toLowerCase();
|
|
1092
|
+
let best = -1;
|
|
1093
|
+
let bestLen = 0;
|
|
1094
|
+
for (const t of terms) {
|
|
1095
|
+
const idx = lc.indexOf(t.toLowerCase());
|
|
1096
|
+
if (idx !== -1 && (best === -1 || idx < best)) {
|
|
1097
|
+
best = idx;
|
|
1098
|
+
bestLen = t.length;
|
|
1099
|
+
}
|
|
1100
|
+
}
|
|
1101
|
+
const clean = (s) => s.replace(/\s+/g, " ").trim();
|
|
1102
|
+
if (best === -1) {
|
|
1103
|
+
// Shouldn't happen for a LIKE hit, but degrade gracefully.
|
|
1104
|
+
const head = clean(content.slice(0, SNIPPET_WINDOW * 2));
|
|
1105
|
+
return content.length > SNIPPET_WINDOW * 2 ? `${head}…` : head;
|
|
1106
|
+
}
|
|
1107
|
+
let start = Math.max(0, best - SNIPPET_WINDOW);
|
|
1108
|
+
let end = Math.min(content.length, best + bestLen + SNIPPET_WINDOW);
|
|
1109
|
+
// Don't split a surrogate pair (e.g. CJK Ext-B chars) at the window edges.
|
|
1110
|
+
const cc = (i) => content.charCodeAt(i);
|
|
1111
|
+
if (start > 0 && cc(start) >= 0xdc00 && cc(start) <= 0xdfff)
|
|
1112
|
+
start--;
|
|
1113
|
+
if (end < content.length && cc(end - 1) >= 0xd800 && cc(end - 1) <= 0xdbff)
|
|
1114
|
+
end++;
|
|
1115
|
+
const before = clean(content.slice(start, best));
|
|
1116
|
+
const match = clean(content.slice(best, best + bestLen));
|
|
1117
|
+
const after = clean(content.slice(best + bestLen, end));
|
|
1118
|
+
return `${start > 0 ? "…" : ""}${before}<b>${match}</b>${after}${end < content.length ? "…" : ""}`;
|
|
1119
|
+
}
|
|
1120
|
+
function ymd() {
|
|
1121
|
+
const d = new Date();
|
|
1122
|
+
const yyyy = d.getFullYear();
|
|
1123
|
+
const mm = String(d.getMonth() + 1).padStart(2, "0");
|
|
1124
|
+
const dd = String(d.getDate()).padStart(2, "0");
|
|
1125
|
+
return `${yyyy}-${mm}-${dd}`;
|
|
1126
|
+
}
|
|
1127
|
+
function round(n) {
|
|
1128
|
+
return Math.round(n * 10) / 10;
|
|
1129
|
+
}
|
|
1130
|
+
function sortDirsFirst(a, b) {
|
|
1131
|
+
if (a.is_dir !== b.is_dir)
|
|
1132
|
+
return a.is_dir ? -1 : 1;
|
|
1133
|
+
return a.name.localeCompare(b.name, "zh-CN", { sensitivity: "base" });
|
|
1134
|
+
}
|
|
1135
|
+
function dirSize(rootAbs, exclude) {
|
|
1136
|
+
if (!fs.existsSync(rootAbs))
|
|
1137
|
+
return 0;
|
|
1138
|
+
let total = 0;
|
|
1139
|
+
const stack = [rootAbs];
|
|
1140
|
+
while (stack.length > 0) {
|
|
1141
|
+
const cur = stack.pop();
|
|
1142
|
+
if (exclude && (cur === exclude || cur.startsWith(exclude + path.sep))) {
|
|
1143
|
+
continue;
|
|
1144
|
+
}
|
|
1145
|
+
let entries;
|
|
1146
|
+
try {
|
|
1147
|
+
entries = fs.readdirSync(cur, { withFileTypes: true });
|
|
1148
|
+
}
|
|
1149
|
+
catch {
|
|
1150
|
+
continue;
|
|
1151
|
+
}
|
|
1152
|
+
for (const e of entries) {
|
|
1153
|
+
const full = path.join(cur, e.name);
|
|
1154
|
+
if (e.isSymbolicLink())
|
|
1155
|
+
continue;
|
|
1156
|
+
if (e.isDirectory()) {
|
|
1157
|
+
stack.push(full);
|
|
1158
|
+
}
|
|
1159
|
+
else if (e.isFile()) {
|
|
1160
|
+
try {
|
|
1161
|
+
total += fs.statSync(full).size;
|
|
1162
|
+
}
|
|
1163
|
+
catch {
|
|
1164
|
+
/* ignore */
|
|
1165
|
+
}
|
|
1166
|
+
}
|
|
1167
|
+
}
|
|
1168
|
+
}
|
|
1169
|
+
return total;
|
|
1170
|
+
}
|
|
1171
|
+
// Re-export isHidden so callers don't need a second import for this common check
|
|
1172
|
+
export { isHidden };
|
|
1173
|
+
// ── Knowledge-index helpers ───────────────────────
|
|
1174
|
+
const SHA256_RE = /^[a-f0-9]{64}$/i;
|
|
1175
|
+
/**
|
|
1176
|
+
* Stream-hash a file with SHA-256 and return the hex digest.
|
|
1177
|
+
* Reads the entire file (or up to `maxBytes` for large files) without
|
|
1178
|
+
* loading it fully into memory.
|
|
1179
|
+
*/
|
|
1180
|
+
async function streamSha256(absPath, maxBytes) {
|
|
1181
|
+
return new Promise((resolve, reject) => {
|
|
1182
|
+
const hasher = createHash("sha256");
|
|
1183
|
+
const stream = fs.createReadStream(absPath, maxBytes !== undefined ? { end: maxBytes - 1 } : undefined);
|
|
1184
|
+
stream.on("data", (chunk) => hasher.update(chunk));
|
|
1185
|
+
stream.on("end", () => resolve(hasher.digest("hex")));
|
|
1186
|
+
stream.on("error", reject);
|
|
1187
|
+
});
|
|
1188
|
+
}
|
|
1189
|
+
//# sourceMappingURL=files-manager.js.map
|