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,935 @@
|
|
|
1
|
+
import { existsSync, mkdtempSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, unlinkSync, writeFileSync, chmodSync, chownSync, lstatSync, } from "fs";
|
|
2
|
+
import { homedir, tmpdir } from "os";
|
|
3
|
+
import { join, dirname } from "path";
|
|
4
|
+
import { spawn, spawnSync } from "child_process";
|
|
5
|
+
import * as config from "../../config.js";
|
|
6
|
+
import { emitTask } from "../tasks/registry.js";
|
|
7
|
+
import { createInvalidSudoPasswordError, isSudoAuthenticationError, isSudoNoNewPrivilegesError, isSudoPasswordRequiredError, prepareSudoAskpassEnv, SUDO_PASSTHROUGH_ENV_KEYS, } from "../../utils/sudo-askpass.js";
|
|
8
|
+
import { listBuiltinAppSpecs } from "./catalog-service.js";
|
|
9
|
+
import { getInstanceInstallRecordRuntimeStatus } from "./execution-service.js";
|
|
10
|
+
import { ANONYMOUS_DOWNLOAD_IMAGE_ALLOWLIST, ANONYMOUS_DOWNLOAD_IMAGE_REPOSITORY_ALLOWLIST, CURRENT_JISHUSHELL_VERSION, DEFAULT_LIFECYCLE_PATH, MACOS_LIFECYCLE_PATH_PROBES, expandPath, } from "./app-shared.js";
|
|
11
|
+
function parseComparableVersion(version, label) {
|
|
12
|
+
const normalized = version
|
|
13
|
+
.trim()
|
|
14
|
+
.replace(/^>=\s*/, "")
|
|
15
|
+
.replace(/^v/i, "")
|
|
16
|
+
.replace(/[-+].*$/, "");
|
|
17
|
+
const match = normalized.match(/^(\d+)(?:\.(\d+))?(?:\.(\d+))?$/);
|
|
18
|
+
if (!match) {
|
|
19
|
+
throw new Error(`${label} '${version}' 格式无效,应为 x.y.z`);
|
|
20
|
+
}
|
|
21
|
+
return [
|
|
22
|
+
Number(match[1] ?? 0),
|
|
23
|
+
Number(match[2] ?? 0),
|
|
24
|
+
Number(match[3] ?? 0),
|
|
25
|
+
];
|
|
26
|
+
}
|
|
27
|
+
function compareVersions(left, right) {
|
|
28
|
+
for (let index = 0; index < 3; index++) {
|
|
29
|
+
if (left[index] > right[index])
|
|
30
|
+
return 1;
|
|
31
|
+
if (left[index] < right[index])
|
|
32
|
+
return -1;
|
|
33
|
+
}
|
|
34
|
+
return 0;
|
|
35
|
+
}
|
|
36
|
+
function requiredJishuShellVersion(spec) {
|
|
37
|
+
const required = spec.jishushell?.min_version?.trim();
|
|
38
|
+
if (!required) {
|
|
39
|
+
throw new Error(`App '${spec.id}' 缺少 jishushell.min_version,请先在 YAML 中声明支持的最低 JishuShell 版本`);
|
|
40
|
+
}
|
|
41
|
+
return required;
|
|
42
|
+
}
|
|
43
|
+
function ensureCompatibleJishuShellVersion(spec) {
|
|
44
|
+
const required = requiredJishuShellVersion(spec);
|
|
45
|
+
const current = parseComparableVersion(CURRENT_JISHUSHELL_VERSION, "当前 JishuShell 版本");
|
|
46
|
+
const minimum = parseComparableVersion(required, "jishushell.min_version");
|
|
47
|
+
if (compareVersions(current, minimum) < 0) {
|
|
48
|
+
throw new Error(`当前 JishuShell 版本 ${CURRENT_JISHUSHELL_VERSION} 低于应用要求 ${required},请先升级 JishuShell`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function buildDeterministicPath(basePath, extraPaths = []) {
|
|
52
|
+
return [basePath ?? "", DEFAULT_LIFECYCLE_PATH, dirname(process.execPath), ...extraPaths]
|
|
53
|
+
.flatMap((entry) => entry.split(":"))
|
|
54
|
+
.map((entry) => entry.trim())
|
|
55
|
+
.filter(Boolean)
|
|
56
|
+
.filter((entry, index, entries) => entries.indexOf(entry) === index)
|
|
57
|
+
.join(":");
|
|
58
|
+
}
|
|
59
|
+
function buildLifecycleEnv() {
|
|
60
|
+
const extraPaths = process.platform === "darwin"
|
|
61
|
+
? MACOS_LIFECYCLE_PATH_PROBES.filter((entry) => existsSync(entry))
|
|
62
|
+
: [];
|
|
63
|
+
const mergedPath = buildDeterministicPath(process.env.PATH, extraPaths);
|
|
64
|
+
// Surface core callback hooks to lifecycle scripts and internal shims.
|
|
65
|
+
// Managed instance helpers such as the OpenClaw drive shim use
|
|
66
|
+
// JISHUSHELL_CORE_URL + JISHUSHELL_INTERNAL_TOKEN together with
|
|
67
|
+
// X-Jishushell-Instance to call Core-owned internal routes without a user
|
|
68
|
+
// JWT. Best-effort: if the token file or port lookup fails we just omit
|
|
69
|
+
// the vars and the caller gets a clean "missing env" failure path.
|
|
70
|
+
const coreHooks = {};
|
|
71
|
+
try {
|
|
72
|
+
coreHooks.JISHUSHELL_CORE_URL = `http://127.0.0.1:${config.getCorePort()}`;
|
|
73
|
+
coreHooks.JISHUSHELL_INTERNAL_TOKEN = config.getInternalMcpToken();
|
|
74
|
+
// LAN host that *other* services (and the post_start script's curls into
|
|
75
|
+
// its own service) can reach. AnythingLLM binds eth0 via Nomad's
|
|
76
|
+
// `external` host_network, so the panel-host loopback (127.0.0.1) won't
|
|
77
|
+
// reach 18097 — post_start needs to hit the LAN IP to check its own
|
|
78
|
+
// health. getCoreLanHost() returns the same IP Nomad publishes ports on.
|
|
79
|
+
coreHooks.JISHUSHELL_LAN_HOST = config.getCoreLanHost();
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// tolerate — only post_start cares
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
...process.env,
|
|
86
|
+
HOME: process.env.HOME ?? homedir(),
|
|
87
|
+
PATH: mergedPath,
|
|
88
|
+
...coreHooks,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function buildSudoWrappedCommand(cmd, args, env, execOptions) {
|
|
92
|
+
const sudoArgs = execOptions?.sudoPassword ? ["-k", "-A"] : ["-n"];
|
|
93
|
+
const envArgs = SUDO_PASSTHROUGH_ENV_KEYS.flatMap((key) => {
|
|
94
|
+
const value = env[key];
|
|
95
|
+
return typeof value === "string" && value.length > 0 ? [`${key}=${value}`] : [];
|
|
96
|
+
});
|
|
97
|
+
return {
|
|
98
|
+
command: "sudo",
|
|
99
|
+
args: [...sudoArgs, "--", "env", ...envArgs, cmd, ...args],
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function createLifecycleSudoError(stderr, fallbackDisplay, hasPassword) {
|
|
103
|
+
const message = sanitizeTaskLine(stderr).trim();
|
|
104
|
+
if (isSudoNoNewPrivilegesError(message)) {
|
|
105
|
+
return createNoNewPrivilegesSudoError();
|
|
106
|
+
}
|
|
107
|
+
if (isSudoAuthenticationError(message)) {
|
|
108
|
+
return createInvalidSudoPasswordError();
|
|
109
|
+
}
|
|
110
|
+
if (!hasPassword && isSudoPasswordRequiredError(message)) {
|
|
111
|
+
return new Error("该生命周期步骤需要 sudo 密码;请在页面弹窗中输入后重试。");
|
|
112
|
+
}
|
|
113
|
+
if (message) {
|
|
114
|
+
return new Error(message);
|
|
115
|
+
}
|
|
116
|
+
return new Error(`lifecycle sudo step failed: ${fallbackDisplay}`);
|
|
117
|
+
}
|
|
118
|
+
function materializeLifecycleInstanceTokens(value, instanceId) {
|
|
119
|
+
if (!instanceId)
|
|
120
|
+
return value;
|
|
121
|
+
if (typeof value === "string") {
|
|
122
|
+
return value.replace(/\$\{instance\.id\}/g, instanceId);
|
|
123
|
+
}
|
|
124
|
+
if (Array.isArray(value)) {
|
|
125
|
+
return value.map((entry) => materializeLifecycleInstanceTokens(entry, instanceId));
|
|
126
|
+
}
|
|
127
|
+
if (value && typeof value === "object") {
|
|
128
|
+
const rewritten = {};
|
|
129
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
130
|
+
rewritten[key] = materializeLifecycleInstanceTokens(entry, instanceId);
|
|
131
|
+
}
|
|
132
|
+
return rewritten;
|
|
133
|
+
}
|
|
134
|
+
return value;
|
|
135
|
+
}
|
|
136
|
+
function coreSystemdServicePath() {
|
|
137
|
+
const override = process.env.JISHUSHELL_CORE_SYSTEMD_SERVICE_PATH?.trim();
|
|
138
|
+
return override || "/etc/systemd/system/jishushell.service";
|
|
139
|
+
}
|
|
140
|
+
function isLikelySystemdServiceProcess() {
|
|
141
|
+
return Boolean(process.env.INVOCATION_ID
|
|
142
|
+
|| process.env.JOURNAL_STREAM
|
|
143
|
+
|| process.env.NOTIFY_SOCKET
|
|
144
|
+
|| process.env.JISHUSHELL_CORE_SYSTEMD_SERVICE_PATH?.trim());
|
|
145
|
+
}
|
|
146
|
+
function maybeRepairCoreAutostartNoNewPrivileges() {
|
|
147
|
+
if (!isLikelySystemdServiceProcess())
|
|
148
|
+
return null;
|
|
149
|
+
const servicePath = coreSystemdServicePath();
|
|
150
|
+
if (!existsSync(servicePath))
|
|
151
|
+
return null;
|
|
152
|
+
let unitText = "";
|
|
153
|
+
try {
|
|
154
|
+
unitText = readFileSync(servicePath, "utf-8");
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return { servicePath, detected: true, updated: false };
|
|
158
|
+
}
|
|
159
|
+
if (!/^\s*NoNewPrivileges\s*=\s*true\s*$/mi.test(unitText)) {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
const nextText = unitText.replace(/^\s*NoNewPrivileges\s*=\s*true\s*\n?/gim, "");
|
|
163
|
+
if (nextText === unitText) {
|
|
164
|
+
return { servicePath, detected: true, updated: false };
|
|
165
|
+
}
|
|
166
|
+
try {
|
|
167
|
+
writeFileSync(servicePath, nextText);
|
|
168
|
+
return { servicePath, detected: true, updated: true };
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return { servicePath, detected: true, updated: false };
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function manualInstallCommandForSpec(spec) {
|
|
175
|
+
if (spec.id === "ollama-binary") {
|
|
176
|
+
return "jishushell app install ollama";
|
|
177
|
+
}
|
|
178
|
+
const builtin = listBuiltinAppSpecs().find((entry) => entry.id === spec.id);
|
|
179
|
+
if (!builtin)
|
|
180
|
+
return null;
|
|
181
|
+
return `jishushell app install ${spec.id}`;
|
|
182
|
+
}
|
|
183
|
+
function createNoNewPrivilegesSudoError(manualInstallCommand) {
|
|
184
|
+
const repair = maybeRepairCoreAutostartNoNewPrivileges();
|
|
185
|
+
const restartCommand = "sudo systemctl daemon-reload && sudo systemctl restart jishushell";
|
|
186
|
+
const parts = ["当前运行环境禁止 sudo 提权(no new privileges),面板内无法继续后续安装。"];
|
|
187
|
+
if (repair?.updated) {
|
|
188
|
+
parts.push(`已从自启文件 ${repair.servicePath} 移除 NoNewPrivileges=true。请在系统终端执行以下命令后重试:\n${restartCommand}`);
|
|
189
|
+
}
|
|
190
|
+
else if (repair?.detected) {
|
|
191
|
+
parts.push(`检测到自启文件 ${repair.servicePath} 仍包含 NoNewPrivileges=true。请在系统终端删除该行后执行:\n${restartCommand}`);
|
|
192
|
+
}
|
|
193
|
+
if (manualInstallCommand) {
|
|
194
|
+
parts.push(`当前安装已停止。你也可以在系统终端手动执行 ${manualInstallCommand}。`);
|
|
195
|
+
}
|
|
196
|
+
return new Error(parts.join("\n"));
|
|
197
|
+
}
|
|
198
|
+
export function decorateInstallError(error, spec) {
|
|
199
|
+
const original = error instanceof Error ? error : new Error(String(error));
|
|
200
|
+
if (!isSudoNoNewPrivilegesError(original.message) && !/NoNewPrivileges=true/i.test(original.message)) {
|
|
201
|
+
return original;
|
|
202
|
+
}
|
|
203
|
+
return createNoNewPrivilegesSudoError(manualInstallCommandForSpec(spec) ?? undefined);
|
|
204
|
+
}
|
|
205
|
+
export async function validateSudoPassword(sudoPassword) {
|
|
206
|
+
if (!sudoPassword) {
|
|
207
|
+
throw new Error("请输入 sudo 密码");
|
|
208
|
+
}
|
|
209
|
+
if (typeof process.getuid === "function" && process.getuid() === 0) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
const preparedEnv = prepareLifecycleExecEnv({ sudoPassword });
|
|
213
|
+
try {
|
|
214
|
+
await new Promise((resolve, reject) => {
|
|
215
|
+
const child = spawn("sudo", ["-k", "-A", "true"], {
|
|
216
|
+
stdio: ["ignore", "ignore", "pipe"],
|
|
217
|
+
env: preparedEnv.env,
|
|
218
|
+
timeout: 15_000,
|
|
219
|
+
});
|
|
220
|
+
let stderr = "";
|
|
221
|
+
child.stderr?.on("data", (chunk) => {
|
|
222
|
+
stderr += chunk.toString("utf-8");
|
|
223
|
+
});
|
|
224
|
+
child.on("close", (code) => {
|
|
225
|
+
if (code === 0) {
|
|
226
|
+
resolve();
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
const message = sanitizeTaskLine(stderr).trim();
|
|
230
|
+
if (isSudoNoNewPrivilegesError(message)) {
|
|
231
|
+
reject(createNoNewPrivilegesSudoError());
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
if (isSudoAuthenticationError(message)) {
|
|
235
|
+
reject(createInvalidSudoPasswordError());
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
resolve();
|
|
239
|
+
});
|
|
240
|
+
child.on("error", (_error) => {
|
|
241
|
+
resolve();
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
finally {
|
|
246
|
+
preparedEnv.cleanup();
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
function prepareLifecycleExecEnv(execOptions, envOverrides) {
|
|
250
|
+
const env = {
|
|
251
|
+
...buildLifecycleEnv(),
|
|
252
|
+
...(envOverrides ?? {}),
|
|
253
|
+
};
|
|
254
|
+
const sudoPassword = execOptions?.sudoPassword;
|
|
255
|
+
if (!sudoPassword) {
|
|
256
|
+
return { env, cleanup: () => undefined };
|
|
257
|
+
}
|
|
258
|
+
return prepareSudoAskpassEnv(sudoPassword, env);
|
|
259
|
+
}
|
|
260
|
+
function shouldBypassDockerCredentialHelperForDownloadImage(image) {
|
|
261
|
+
const trimmedImage = image.trim();
|
|
262
|
+
return ANONYMOUS_DOWNLOAD_IMAGE_ALLOWLIST.has(trimmedImage)
|
|
263
|
+
|| ANONYMOUS_DOWNLOAD_IMAGE_REPOSITORY_ALLOWLIST.has(normalizeDockerImageRepository(trimmedImage));
|
|
264
|
+
}
|
|
265
|
+
function normalizeDockerImageRepository(image) {
|
|
266
|
+
const digestIndex = image.indexOf("@");
|
|
267
|
+
const imageWithoutDigest = digestIndex >= 0 ? image.slice(0, digestIndex) : image;
|
|
268
|
+
const lastSlashIndex = imageWithoutDigest.lastIndexOf("/");
|
|
269
|
+
const lastColonIndex = imageWithoutDigest.lastIndexOf(":");
|
|
270
|
+
return lastColonIndex > lastSlashIndex
|
|
271
|
+
? imageWithoutDigest.slice(0, lastColonIndex)
|
|
272
|
+
: imageWithoutDigest;
|
|
273
|
+
}
|
|
274
|
+
function createAnonymousDockerConfig() {
|
|
275
|
+
const dockerConfigDir = mkdtempSync(join(tmpdir(), "jishushell-docker-config-"));
|
|
276
|
+
writeFileSync(join(dockerConfigDir, "config.json"), `${JSON.stringify({ auths: {} }, null, 2)}\n`, { mode: 0o600 });
|
|
277
|
+
return {
|
|
278
|
+
envOverrides: {
|
|
279
|
+
DOCKER_CONFIG: dockerConfigDir,
|
|
280
|
+
},
|
|
281
|
+
cleanup: () => {
|
|
282
|
+
try {
|
|
283
|
+
rmSync(dockerConfigDir, { recursive: true, force: true });
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
// best effort cleanup for one-shot anonymous docker config files
|
|
287
|
+
}
|
|
288
|
+
},
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
const ANSI_ESCAPE_RE = /\u001B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g;
|
|
292
|
+
function sanitizeTaskLine(line) {
|
|
293
|
+
return line
|
|
294
|
+
.replace(ANSI_ESCAPE_RE, "")
|
|
295
|
+
.replace(/[\u0000-\u0008\u000B-\u001F\u007F]/g, "")
|
|
296
|
+
.trimEnd();
|
|
297
|
+
}
|
|
298
|
+
export function emitInstallTaskLog(task, message) {
|
|
299
|
+
if (!task)
|
|
300
|
+
return;
|
|
301
|
+
const line = sanitizeTaskLine(message).trim();
|
|
302
|
+
if (!line)
|
|
303
|
+
return;
|
|
304
|
+
emitTask(task, { type: "log", message: line });
|
|
305
|
+
}
|
|
306
|
+
export function selectRollbackUninstallSteps(steps, ownedArtifacts) {
|
|
307
|
+
if (!steps?.length)
|
|
308
|
+
return [];
|
|
309
|
+
const ownedImages = new Set(ownedArtifacts.filter((a) => a.type === "image").map((a) => a.path));
|
|
310
|
+
const ownedDirs = new Set(ownedArtifacts.filter((a) => a.type === "dir").map((a) => a.path));
|
|
311
|
+
const ownedBinaries = new Set(ownedArtifacts.filter((a) => a.type === "binary").map((a) => a.path));
|
|
312
|
+
return steps.filter((step) => {
|
|
313
|
+
if ("deleteImage" in step)
|
|
314
|
+
return ownedImages.has(step.deleteImage);
|
|
315
|
+
if ("deleteDir" in step)
|
|
316
|
+
return ownedDirs.has(expandPath(step.deleteDir));
|
|
317
|
+
if ("deleteBinary" in step)
|
|
318
|
+
return ownedBinaries.has(expandPath(step.deleteBinary));
|
|
319
|
+
if ("run" in step)
|
|
320
|
+
return true;
|
|
321
|
+
return false;
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
function spawnStep(label, display, cmd, args, task) {
|
|
325
|
+
return spawnStepWithTimeout(label, display, display, cmd, args, 300_000, task);
|
|
326
|
+
}
|
|
327
|
+
const DOCKER_PULL_RETRY_ATTEMPTS = 3;
|
|
328
|
+
// spawnStep's 5-min default is fine for small CLI calls but starves real-world
|
|
329
|
+
// image pulls on ARM + SD-card hardware. Hermes is ~2.4 GB compressed and may
|
|
330
|
+
// not extract in 5 min on a Raspberry Pi. 30 min leaves headroom while still
|
|
331
|
+
// capping runaway failures (total retry budget 90 min).
|
|
332
|
+
const DOCKER_PULL_TIMEOUT_MS = 1_800_000;
|
|
333
|
+
// Separate from the total timeout above: if docker pull stops producing any
|
|
334
|
+
// stdout/stderr for long enough, treat it as stalled and retry rather than
|
|
335
|
+
// waiting the full 30 minutes.
|
|
336
|
+
//
|
|
337
|
+
// Why 600s (not 180s): on slow links (especially Docker Hub from China to
|
|
338
|
+
// edge devices), large single layers — AnythingLLM ~500MB, Hermes ~2.4GB —
|
|
339
|
+
// can spend 5-8 minutes between progress lines without TTY. 180s
|
|
340
|
+
// idle was killing pulls that were actually making progress, then rolling
|
|
341
|
+
// back the partially-completed image. Layer cache is preserved across
|
|
342
|
+
// retries (docker dedupes by layer sha), so a higher idle ceiling lets each
|
|
343
|
+
// big layer finish without throwing away the layers already on disk.
|
|
344
|
+
const DOCKER_PULL_IDLE_TIMEOUT_MS = 600_000;
|
|
345
|
+
export async function pullDockerImageStep(label, image, display, task, timeoutMs = DOCKER_PULL_TIMEOUT_MS, idleTimeoutMs) {
|
|
346
|
+
if (await dockerImageExists(image)) {
|
|
347
|
+
const skipMessage = `[lifecycle:${label}] docker image '${image}' already exists locally; skipping pull`;
|
|
348
|
+
process.stdout.write(` ${skipMessage}\n`);
|
|
349
|
+
emitInstallTaskLog(task, skipMessage);
|
|
350
|
+
return false;
|
|
351
|
+
}
|
|
352
|
+
const anonymousDockerConfig = shouldBypassDockerCredentialHelperForDownloadImage(image)
|
|
353
|
+
? createAnonymousDockerConfig()
|
|
354
|
+
: null;
|
|
355
|
+
let lastError;
|
|
356
|
+
try {
|
|
357
|
+
for (let attempt = 1; attempt <= DOCKER_PULL_RETRY_ATTEMPTS; attempt++) {
|
|
358
|
+
try {
|
|
359
|
+
await spawnStepWithTimeout(label, display, display, "docker", ["pull", image], timeoutMs, task, undefined, undefined, {
|
|
360
|
+
idleTimeoutMs: idleTimeoutMs ?? Math.min(DOCKER_PULL_IDLE_TIMEOUT_MS, timeoutMs),
|
|
361
|
+
envOverrides: anonymousDockerConfig?.envOverrides,
|
|
362
|
+
stallMessageHint: "Docker credential resolution (for example docker-credential-desktop) may be involved.",
|
|
363
|
+
});
|
|
364
|
+
return true;
|
|
365
|
+
}
|
|
366
|
+
catch (error) {
|
|
367
|
+
if (await dockerImageExists(image)) {
|
|
368
|
+
const recoveredMessage = `[lifecycle:${label}] docker image '${image}' is present locally after pull failure/timeout; treating step as successful`;
|
|
369
|
+
process.stdout.write(` ${recoveredMessage}\n`);
|
|
370
|
+
emitInstallTaskLog(task, recoveredMessage);
|
|
371
|
+
return true;
|
|
372
|
+
}
|
|
373
|
+
lastError = error;
|
|
374
|
+
if (attempt === DOCKER_PULL_RETRY_ATTEMPTS) {
|
|
375
|
+
break;
|
|
376
|
+
}
|
|
377
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
378
|
+
const retryMessage = `[lifecycle:${label}] docker pull failed for ${image} (attempt ${attempt}/${DOCKER_PULL_RETRY_ATTEMPTS}): ${reason}; retrying`;
|
|
379
|
+
process.stdout.write(` ${retryMessage}\n`);
|
|
380
|
+
emitInstallTaskLog(task, retryMessage);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
finally {
|
|
385
|
+
anonymousDockerConfig?.cleanup();
|
|
386
|
+
}
|
|
387
|
+
throw (lastError instanceof Error ? lastError : new Error(String(lastError)));
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* In-flight background pulls keyed by image tag. Used by
|
|
391
|
+
* `pullDockerImageInBackground` to dedup concurrent requests so repeated
|
|
392
|
+
* UI clicks for the same not-yet-local image don't queue duplicate pulls.
|
|
393
|
+
*/
|
|
394
|
+
const inFlightBackgroundPulls = new Map();
|
|
395
|
+
/**
|
|
396
|
+
* Fire-and-forget background docker pull. Used by `*-manager.ts`
|
|
397
|
+
* (custom / hermes / ollama) when an instance is requested with an image
|
|
398
|
+
* that's not yet local: kicks off a pull in the background and the caller
|
|
399
|
+
* asks the user to retry later (HTTP 202).
|
|
400
|
+
*
|
|
401
|
+
* Wraps the same `pullDockerImageStep` used by full installs, so it
|
|
402
|
+
* inherits the same protections — total timeout (30 min), idle timeout
|
|
403
|
+
* (10 min of silence on the pull's stdout/stderr terminates it), 3
|
|
404
|
+
* retries, and a post-failure `dockerImageExists` recovery check — that
|
|
405
|
+
* a bare `exec("docker pull ...", { timeout: 0 })` lacks. Docker Desktop
|
|
406
|
+
* on macOS can hang the CLI for tens of minutes after the image has been
|
|
407
|
+
* fully downloaded (the final manifest/tag write step occasionally
|
|
408
|
+
* deadlocks); the idle timer kills the hung CLI and the recovery check
|
|
409
|
+
* picks up the image if the tag did make it through.
|
|
410
|
+
*
|
|
411
|
+
* Concurrent calls for the same image dedup onto a single in-flight pull
|
|
412
|
+
* so repeated UI clicks don't waste retries.
|
|
413
|
+
*
|
|
414
|
+
* Always resolves — errors are logged via console.warn so the
|
|
415
|
+
* fire-and-forget caller doesn't have to attach a `.catch` handler.
|
|
416
|
+
*/
|
|
417
|
+
export function pullDockerImageInBackground(label, image) {
|
|
418
|
+
const existing = inFlightBackgroundPulls.get(image);
|
|
419
|
+
if (existing)
|
|
420
|
+
return existing;
|
|
421
|
+
const promise = (async () => {
|
|
422
|
+
try {
|
|
423
|
+
await pullDockerImageStep(`${label}-background`, image, `docker pull ${image} (background)`);
|
|
424
|
+
}
|
|
425
|
+
catch (err) {
|
|
426
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
427
|
+
console.warn(`[${label}] Background pull of ${image} failed: ${reason}`);
|
|
428
|
+
}
|
|
429
|
+
finally {
|
|
430
|
+
inFlightBackgroundPulls.delete(image);
|
|
431
|
+
}
|
|
432
|
+
})();
|
|
433
|
+
inFlightBackgroundPulls.set(image, promise);
|
|
434
|
+
return promise;
|
|
435
|
+
}
|
|
436
|
+
async function dockerImageExists(image) {
|
|
437
|
+
return new Promise((resolve) => {
|
|
438
|
+
const child = spawn("docker", ["image", "inspect", image], {
|
|
439
|
+
stdio: "ignore",
|
|
440
|
+
env: buildLifecycleEnv(),
|
|
441
|
+
});
|
|
442
|
+
let settled = false;
|
|
443
|
+
const finish = (value) => {
|
|
444
|
+
if (settled)
|
|
445
|
+
return;
|
|
446
|
+
settled = true;
|
|
447
|
+
resolve(value);
|
|
448
|
+
};
|
|
449
|
+
// `docker image inspect` is a local-only daemon API call that should
|
|
450
|
+
// return in milliseconds. In practice, when dockerd itself wedges
|
|
451
|
+
// (the same failure mode that causes `docker pull` to hang), `docker
|
|
452
|
+
// image inspect` hangs too. Without this timeout the inspect call
|
|
453
|
+
// ties up the install lifecycle's post-failure recovery check, which
|
|
454
|
+
// in turn keeps the install lock held indefinitely. 10s is generous
|
|
455
|
+
// for a healthy daemon and short enough that a wedged daemon doesn't
|
|
456
|
+
// block install retry/recovery.
|
|
457
|
+
const watchdog = setTimeout(() => {
|
|
458
|
+
try {
|
|
459
|
+
child.kill("SIGKILL");
|
|
460
|
+
}
|
|
461
|
+
catch {
|
|
462
|
+
/* already exited */
|
|
463
|
+
}
|
|
464
|
+
finish(false);
|
|
465
|
+
}, 10_000);
|
|
466
|
+
watchdog.unref?.();
|
|
467
|
+
child.on("close", (code) => {
|
|
468
|
+
clearTimeout(watchdog);
|
|
469
|
+
finish(code === 0);
|
|
470
|
+
});
|
|
471
|
+
child.on("error", () => {
|
|
472
|
+
clearTimeout(watchdog);
|
|
473
|
+
finish(false);
|
|
474
|
+
});
|
|
475
|
+
});
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* Force-terminate a spawned child: send `SIGTERM`, then escalate to
|
|
479
|
+
* `SIGKILL` after a grace period if the process is still alive.
|
|
480
|
+
*
|
|
481
|
+
* Needed because some CLIs (notably `docker` on macOS when its daemon
|
|
482
|
+
* has wedged) block on a daemon round-trip and ignore `SIGTERM` until
|
|
483
|
+
* the daemon responds. Without `SIGKILL` escalation the parent
|
|
484
|
+
* `child.on("close")` handler never fires, the lifecycle promise never
|
|
485
|
+
* resolves, and the install task hangs forever holding its lock.
|
|
486
|
+
*
|
|
487
|
+
* The grace period must be long enough for well-behaved children to
|
|
488
|
+
* flush buffers and exit cleanly on SIGTERM (avoid corrupt artifacts in
|
|
489
|
+
* the common case) but short enough that a hung child doesn't waste a
|
|
490
|
+
* meaningful slice of the parent's overall budget. 30s is the sweet
|
|
491
|
+
* spot in practice for docker-class tooling.
|
|
492
|
+
*/
|
|
493
|
+
function forceTerminateChild(child, label) {
|
|
494
|
+
try {
|
|
495
|
+
child.kill("SIGTERM");
|
|
496
|
+
}
|
|
497
|
+
catch {
|
|
498
|
+
/* already exited */
|
|
499
|
+
}
|
|
500
|
+
// Unref'd so it doesn't keep the event loop alive. If the child
|
|
501
|
+
// exited cleanly under SIGTERM before this fires, `kill("SIGKILL")`
|
|
502
|
+
// on a dead process is a harmless no-op (and we try/catch around it
|
|
503
|
+
// anyway). We deliberately do NOT register an extra `on("close")`
|
|
504
|
+
// listener to cancel this timer — some lifecycle paths use bare
|
|
505
|
+
// mock children whose `on` is single-slot and a second listener
|
|
506
|
+
// would clobber the parent's reject handler.
|
|
507
|
+
const killTimer = setTimeout(() => {
|
|
508
|
+
if (child.exitCode !== null || child.signalCode !== null)
|
|
509
|
+
return;
|
|
510
|
+
process.stdout.write(` [lifecycle:${label}] child ignored SIGTERM after 30s; escalating to SIGKILL\n`);
|
|
511
|
+
try {
|
|
512
|
+
child.kill("SIGKILL");
|
|
513
|
+
}
|
|
514
|
+
catch {
|
|
515
|
+
/* already exited */
|
|
516
|
+
}
|
|
517
|
+
}, 30_000);
|
|
518
|
+
killTimer.unref?.();
|
|
519
|
+
}
|
|
520
|
+
function spawnStepWithTimeout(label, display, taskDisplay, cmd, args, timeoutMs, task, execOptions, sudo, runOptions) {
|
|
521
|
+
process.stdout.write(` [lifecycle:${label}] ${display}\n`);
|
|
522
|
+
emitInstallTaskLog(task, `[lifecycle:${label}] ${taskDisplay}`);
|
|
523
|
+
return new Promise((resolve, reject) => {
|
|
524
|
+
const preparedEnv = prepareLifecycleExecEnv(sudo ? execOptions : undefined, runOptions?.envOverrides);
|
|
525
|
+
let cleaned = false;
|
|
526
|
+
let heartbeatTimer = null;
|
|
527
|
+
let idleTimer = null;
|
|
528
|
+
let stdoutPending = "";
|
|
529
|
+
let stderrPending = "";
|
|
530
|
+
let capturedStderr = "";
|
|
531
|
+
let forcedError = null;
|
|
532
|
+
let totalTimeoutTimer = null;
|
|
533
|
+
const cleanupPreparedEnv = () => {
|
|
534
|
+
if (cleaned)
|
|
535
|
+
return;
|
|
536
|
+
cleaned = true;
|
|
537
|
+
if (heartbeatTimer) {
|
|
538
|
+
clearInterval(heartbeatTimer);
|
|
539
|
+
heartbeatTimer = null;
|
|
540
|
+
}
|
|
541
|
+
if (idleTimer) {
|
|
542
|
+
clearTimeout(idleTimer);
|
|
543
|
+
idleTimer = null;
|
|
544
|
+
}
|
|
545
|
+
if (totalTimeoutTimer) {
|
|
546
|
+
clearTimeout(totalTimeoutTimer);
|
|
547
|
+
totalTimeoutTimer = null;
|
|
548
|
+
}
|
|
549
|
+
preparedEnv.cleanup();
|
|
550
|
+
};
|
|
551
|
+
const spawnTarget = sudo
|
|
552
|
+
? buildSudoWrappedCommand(cmd, args, preparedEnv.env, execOptions)
|
|
553
|
+
: { command: cmd, args };
|
|
554
|
+
const captureOutput = Boolean(task) || Boolean(sudo) || Boolean(runOptions?.idleTimeoutMs);
|
|
555
|
+
const child = spawn(spawnTarget.command, spawnTarget.args, {
|
|
556
|
+
stdio: captureOutput ? ["ignore", "pipe", "pipe"] : "inherit",
|
|
557
|
+
// Node's spawn `timeout` sends SIGTERM at the deadline but has no
|
|
558
|
+
// SIGKILL escalation, so a child that ignores SIGTERM (docker CLI
|
|
559
|
+
// on macOS when its daemon is wedged) still blocks the parent's
|
|
560
|
+
// `child.on("close")`. We keep this here so callers / tests can
|
|
561
|
+
// observe the configured budget on the spawn options, and add the
|
|
562
|
+
// `totalKillEscalationTimer` below to SIGKILL after a grace.
|
|
563
|
+
timeout: timeoutMs,
|
|
564
|
+
env: preparedEnv.env,
|
|
565
|
+
});
|
|
566
|
+
// SIGKILL escalation for the total-timeout case. Node's `timeout`
|
|
567
|
+
// option above will have sent SIGTERM at `timeoutMs`; if the child
|
|
568
|
+
// hasn't exited within `timeoutMs + 30s` we force it. Independent
|
|
569
|
+
// of the idle timer's escalation (which `forceTerminateChild`
|
|
570
|
+
// handles inline) — covers the path where output keeps flowing but
|
|
571
|
+
// the total budget is blown.
|
|
572
|
+
totalTimeoutTimer = setTimeout(() => {
|
|
573
|
+
if (child.exitCode !== null || child.signalCode !== null)
|
|
574
|
+
return;
|
|
575
|
+
const totalSeconds = Math.max(1, Math.round(timeoutMs / 1000));
|
|
576
|
+
const timeoutMessage = `[lifecycle:${label}] child ignored spawn-timeout SIGTERM ${totalSeconds}s+30s ago; escalating to SIGKILL`;
|
|
577
|
+
process.stdout.write(` ${timeoutMessage}\n`);
|
|
578
|
+
emitInstallTaskLog(task, timeoutMessage);
|
|
579
|
+
if (!forcedError) {
|
|
580
|
+
forcedError = new Error(`lifecycle '${label}' step exceeded ${totalSeconds}s total budget: ${display}`);
|
|
581
|
+
}
|
|
582
|
+
try {
|
|
583
|
+
child.kill("SIGKILL");
|
|
584
|
+
}
|
|
585
|
+
catch {
|
|
586
|
+
/* already exited */
|
|
587
|
+
}
|
|
588
|
+
}, timeoutMs + 30_000);
|
|
589
|
+
totalTimeoutTimer.unref?.();
|
|
590
|
+
const resetIdleTimer = () => {
|
|
591
|
+
if (!runOptions?.idleTimeoutMs)
|
|
592
|
+
return;
|
|
593
|
+
if (idleTimer)
|
|
594
|
+
clearTimeout(idleTimer);
|
|
595
|
+
idleTimer = setTimeout(() => {
|
|
596
|
+
const idleSeconds = Math.max(1, Math.round(runOptions.idleTimeoutMs / 1000));
|
|
597
|
+
const stallMessageSuffix = runOptions.stallMessageHint ? ` ${runOptions.stallMessageHint}` : "";
|
|
598
|
+
const stallMessage = `[lifecycle:${label}] no output for ${idleSeconds}s; terminating stalled step: ${taskDisplay}${stallMessageSuffix}`;
|
|
599
|
+
process.stdout.write(` ${stallMessage}\n`);
|
|
600
|
+
emitInstallTaskLog(task, stallMessage);
|
|
601
|
+
forcedError = new Error(`lifecycle '${label}' step stalled after ${idleSeconds}s with no output: ${display}${stallMessageSuffix}`);
|
|
602
|
+
forceTerminateChild(child, label);
|
|
603
|
+
}, runOptions.idleTimeoutMs);
|
|
604
|
+
idleTimer.unref?.();
|
|
605
|
+
};
|
|
606
|
+
resetIdleTimer();
|
|
607
|
+
if (captureOutput) {
|
|
608
|
+
const startedAt = Date.now();
|
|
609
|
+
const flushPendingLine = (line) => {
|
|
610
|
+
if (!task)
|
|
611
|
+
return;
|
|
612
|
+
emitInstallTaskLog(task, line);
|
|
613
|
+
};
|
|
614
|
+
const handleChunk = (chunk, stream) => {
|
|
615
|
+
resetIdleTimer();
|
|
616
|
+
const text = typeof chunk === "string" ? chunk : chunk.toString("utf-8");
|
|
617
|
+
if (stream === "stderr") {
|
|
618
|
+
capturedStderr += text;
|
|
619
|
+
}
|
|
620
|
+
if (!task) {
|
|
621
|
+
if (stream === "stdout")
|
|
622
|
+
process.stdout.write(text);
|
|
623
|
+
else
|
|
624
|
+
process.stderr.write(text);
|
|
625
|
+
return;
|
|
626
|
+
}
|
|
627
|
+
const normalized = `${stream === "stdout" ? stdoutPending : stderrPending}${text}`
|
|
628
|
+
.replace(/\r\n/g, "\n")
|
|
629
|
+
.replace(/\r/g, "\n");
|
|
630
|
+
const lines = normalized.split("\n");
|
|
631
|
+
const pending = lines.pop() ?? "";
|
|
632
|
+
if (stream === "stdout")
|
|
633
|
+
stdoutPending = pending;
|
|
634
|
+
else
|
|
635
|
+
stderrPending = pending;
|
|
636
|
+
for (const line of lines) {
|
|
637
|
+
flushPendingLine(line);
|
|
638
|
+
}
|
|
639
|
+
};
|
|
640
|
+
child.stdout?.on("data", (data) => handleChunk(data, "stdout"));
|
|
641
|
+
child.stderr?.on("data", (data) => handleChunk(data, "stderr"));
|
|
642
|
+
if (task) {
|
|
643
|
+
heartbeatTimer = setInterval(() => {
|
|
644
|
+
const elapsedSeconds = Math.max(1, Math.round((Date.now() - startedAt) / 1000));
|
|
645
|
+
emitInstallTaskLog(task, `[lifecycle:${label}] still running (${elapsedSeconds}s): ${taskDisplay}`);
|
|
646
|
+
}, 10_000);
|
|
647
|
+
child.on("close", () => {
|
|
648
|
+
flushPendingLine(stdoutPending);
|
|
649
|
+
flushPendingLine(stderrPending);
|
|
650
|
+
});
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
child.on("close", (code) => {
|
|
654
|
+
cleanupPreparedEnv();
|
|
655
|
+
if (forcedError)
|
|
656
|
+
reject(forcedError);
|
|
657
|
+
else if (code === 0)
|
|
658
|
+
resolve();
|
|
659
|
+
else if (sudo)
|
|
660
|
+
reject(createLifecycleSudoError(capturedStderr, display, Boolean(execOptions?.sudoPassword)));
|
|
661
|
+
else
|
|
662
|
+
reject(new Error(`lifecycle '${label}' step failed (exit ${code ?? 1}): ${display}`));
|
|
663
|
+
});
|
|
664
|
+
child.on("error", (err) => {
|
|
665
|
+
cleanupPreparedEnv();
|
|
666
|
+
if (forcedError) {
|
|
667
|
+
reject(forcedError);
|
|
668
|
+
return;
|
|
669
|
+
}
|
|
670
|
+
if (sudo && err.code === "ENOENT") {
|
|
671
|
+
reject(new Error("当前环境未检测到 sudo,无法执行需要 sudo 的生命周期步骤。请以 root 身份重试。"));
|
|
672
|
+
return;
|
|
673
|
+
}
|
|
674
|
+
reject(new Error(`lifecycle '${label}' step error: ${err.message}`));
|
|
675
|
+
});
|
|
676
|
+
});
|
|
677
|
+
}
|
|
678
|
+
function lifecycleRunStepDisplay(label, index) {
|
|
679
|
+
if (label === "pre_install") {
|
|
680
|
+
return `run step ${index + 1}`;
|
|
681
|
+
}
|
|
682
|
+
return "$";
|
|
683
|
+
}
|
|
684
|
+
async function commandExists(command) {
|
|
685
|
+
return new Promise((resolve) => {
|
|
686
|
+
const quoted = command.replace(/'/g, "'\\''");
|
|
687
|
+
const child = spawn("sh", ["-c", `command -v '${quoted}' > /dev/null 2>&1`], {
|
|
688
|
+
stdio: "ignore",
|
|
689
|
+
env: buildLifecycleEnv(),
|
|
690
|
+
});
|
|
691
|
+
child.on("close", (code) => resolve(code === 0));
|
|
692
|
+
child.on("error", () => resolve(false));
|
|
693
|
+
});
|
|
694
|
+
}
|
|
695
|
+
// Recursively chown a path. Owner format is "uid:gid" (numeric only, e.g.
|
|
696
|
+
// "0:0" or "1000:1000"). Used by container apps whose images run as a
|
|
697
|
+
// different uid than the service user — without this, bind-mounted data
|
|
698
|
+
// dirs end up unwritable for the in-container process and fail with
|
|
699
|
+
// SQLite "readonly database" or chroma init errors.
|
|
700
|
+
function parseOwnerSpec(owner) {
|
|
701
|
+
const m = /^(\d+):(\d+)$/.exec(owner);
|
|
702
|
+
if (!m)
|
|
703
|
+
throw new Error(`chown owner must be "uid:gid" (numeric), got "${owner}"`);
|
|
704
|
+
return { uid: Number(m[1]), gid: Number(m[2]) };
|
|
705
|
+
}
|
|
706
|
+
function chownRecursive(path, uid, gid) {
|
|
707
|
+
chownSync(path, uid, gid);
|
|
708
|
+
let stat;
|
|
709
|
+
try {
|
|
710
|
+
stat = lstatSync(path);
|
|
711
|
+
}
|
|
712
|
+
catch {
|
|
713
|
+
return;
|
|
714
|
+
}
|
|
715
|
+
if (!stat.isDirectory())
|
|
716
|
+
return;
|
|
717
|
+
for (const entry of readdirSync(path)) {
|
|
718
|
+
chownRecursive(join(path, entry), uid, gid);
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
/**
|
|
722
|
+
* Try chowning via direct fs syscall first; on EPERM (core runs as a
|
|
723
|
+
* non-root user with no CAP_CHOWN) fall back to `sudo -n chown`. The
|
|
724
|
+
* fallback only succeeds where passwordless sudo is configured for the
|
|
725
|
+
* service user (the canonical Pi setup); on other hosts the original
|
|
726
|
+
* EPERM bubbles up as a clear error.
|
|
727
|
+
*/
|
|
728
|
+
function chownWithSudoFallback(path, uid, gid, recursive) {
|
|
729
|
+
try {
|
|
730
|
+
if (recursive)
|
|
731
|
+
chownRecursive(path, uid, gid);
|
|
732
|
+
else
|
|
733
|
+
chownSync(path, uid, gid);
|
|
734
|
+
return;
|
|
735
|
+
}
|
|
736
|
+
catch (e) {
|
|
737
|
+
if (e?.code !== "EPERM" && e?.code !== "EACCES")
|
|
738
|
+
throw e;
|
|
739
|
+
}
|
|
740
|
+
const args = [
|
|
741
|
+
"-n",
|
|
742
|
+
"chown",
|
|
743
|
+
...(recursive ? ["-R"] : []),
|
|
744
|
+
`${uid}:${gid}`,
|
|
745
|
+
path,
|
|
746
|
+
];
|
|
747
|
+
const r = spawnSync("sudo", args, { stdio: ["ignore", "ignore", "pipe"] });
|
|
748
|
+
if (r.status !== 0) {
|
|
749
|
+
const stderr = r.stderr ? r.stderr.toString().trim() : "";
|
|
750
|
+
throw new Error(`chown ${recursive ? "-R " : ""}${uid}:${gid} ${path} failed: service user lacks CAP_CHOWN and passwordless sudo also failed${stderr ? `: ${stderr}` : ""}`);
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
async function downloadBinaryStep(label, url, dest, chmod, task) {
|
|
754
|
+
const expanded = expandPath(dest);
|
|
755
|
+
process.stdout.write(` [lifecycle:${label}] downloadBinary: ${url} → ${expanded}\n`);
|
|
756
|
+
emitInstallTaskLog(task, `[lifecycle:${label}] downloadBinary: ${url} -> ${expanded}`);
|
|
757
|
+
mkdirSync(dirname(expanded), { recursive: true });
|
|
758
|
+
const tmp = expanded + ".tmp";
|
|
759
|
+
const res = await fetch(url);
|
|
760
|
+
if (!res.ok)
|
|
761
|
+
throw new Error(`downloadBinary: HTTP ${res.status} ${url}`);
|
|
762
|
+
const buf = await res.arrayBuffer();
|
|
763
|
+
writeFileSync(tmp, Buffer.from(buf), { mode: 0o644 });
|
|
764
|
+
renameSync(tmp, expanded);
|
|
765
|
+
if (chmod)
|
|
766
|
+
chmodSync(expanded, parseInt(chmod, 8));
|
|
767
|
+
}
|
|
768
|
+
export async function runLifecycleSteps(steps, label, artifacts, task, execOptions, ownedArtifacts, instanceId) {
|
|
769
|
+
if (!steps || steps.length === 0)
|
|
770
|
+
return;
|
|
771
|
+
for (const [index, rawStep] of steps.entries()) {
|
|
772
|
+
const step = materializeLifecycleInstanceTokens(rawStep, instanceId);
|
|
773
|
+
if ("run" in step) {
|
|
774
|
+
if (step.ifFileExists && !existsSync(expandPath(step.ifFileExists))) {
|
|
775
|
+
continue;
|
|
776
|
+
}
|
|
777
|
+
const timeoutMs = step.timeout_ms ?? 300_000;
|
|
778
|
+
const display = label === "pre_install"
|
|
779
|
+
? lifecycleRunStepDisplay(label, index)
|
|
780
|
+
: `${lifecycleRunStepDisplay(label, index)} ${step.run}`;
|
|
781
|
+
const taskDisplay = `run step ${index + 1}`;
|
|
782
|
+
try {
|
|
783
|
+
await spawnStepWithTimeout(label, display, taskDisplay, "sh", ["-c", step.run], timeoutMs, task, execOptions, step.sudo === true);
|
|
784
|
+
}
|
|
785
|
+
catch (error) {
|
|
786
|
+
if (step.successIfCommandExists && await commandExists(step.successIfCommandExists)) {
|
|
787
|
+
process.stdout.write(` [lifecycle:${label}] command '${step.successIfCommandExists}' detected after failure/timeout; treating step as successful\n`);
|
|
788
|
+
emitInstallTaskLog(task, `[lifecycle:${label}] command '${step.successIfCommandExists}' detected after failure/timeout; treating step as successful`);
|
|
789
|
+
continue;
|
|
790
|
+
}
|
|
791
|
+
throw error;
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
else if ("checkNotCommand" in step) {
|
|
795
|
+
const cmd = step.checkNotCommand;
|
|
796
|
+
const found = await commandExists(cmd);
|
|
797
|
+
if (found) {
|
|
798
|
+
throw new Error(step.message ??
|
|
799
|
+
`系统中已检测到 '${cmd}',建议直接使用系统版本,无需重复安装。如需由 Nomad 统一管理,请先卸载系统版本`);
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
else if ("downloadImage" in step) {
|
|
803
|
+
const pulled = await pullDockerImageStep(label, step.downloadImage, `downloadImage: ${step.downloadImage}`, task, step.timeout_ms, step.idle_timeout_ms);
|
|
804
|
+
artifacts?.push({ type: "image", path: step.downloadImage });
|
|
805
|
+
if (pulled)
|
|
806
|
+
ownedArtifacts?.push({ type: "image", path: step.downloadImage });
|
|
807
|
+
}
|
|
808
|
+
else if ("deleteImage" in step) {
|
|
809
|
+
await spawnStep(label, `deleteImage: ${step.deleteImage}`, "sh", [
|
|
810
|
+
"-c",
|
|
811
|
+
`docker rmi -f ${step.deleteImage} 2>/dev/null || true`,
|
|
812
|
+
], task);
|
|
813
|
+
}
|
|
814
|
+
else if ("downloadBinary" in step) {
|
|
815
|
+
const { url, dest, chmod } = step.downloadBinary;
|
|
816
|
+
await downloadBinaryStep(label, url, dest, chmod, task);
|
|
817
|
+
artifacts?.push({ type: "binary", path: expandPath(dest) });
|
|
818
|
+
}
|
|
819
|
+
else if ("deleteBinary" in step) {
|
|
820
|
+
const p = expandPath(step.deleteBinary);
|
|
821
|
+
process.stdout.write(` [lifecycle:${label}] deleteBinary: ${p}\n`);
|
|
822
|
+
emitInstallTaskLog(task, `[lifecycle:${label}] deleteBinary: ${p}`);
|
|
823
|
+
try {
|
|
824
|
+
unlinkSync(p);
|
|
825
|
+
}
|
|
826
|
+
catch (e) {
|
|
827
|
+
if (e.code !== "ENOENT")
|
|
828
|
+
throw e;
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
else if ("mkdir" in step) {
|
|
832
|
+
const p = expandPath(step.mkdir);
|
|
833
|
+
process.stdout.write(` [lifecycle:${label}] mkdir: ${p}\n`);
|
|
834
|
+
emitInstallTaskLog(task, `[lifecycle:${label}] mkdir: ${p}`);
|
|
835
|
+
// Ownership semantics for rollback (Step 3):
|
|
836
|
+
// - If `p` did not exist before this step, this install attempt
|
|
837
|
+
// created it → claim ownership (push into `ownedArtifacts`) so a
|
|
838
|
+
// subsequent rollback may safely `rm -rf` it.
|
|
839
|
+
// - If `p` already existed, treat it as a dependency only (push into
|
|
840
|
+
// `artifacts`). User-pre-existing directories (e.g. a shared
|
|
841
|
+
// `~/.config/<app>` the user already populated) must never be
|
|
842
|
+
// deleted by our rollback path.
|
|
843
|
+
// `mkdir -p` is idempotent for the already-exists case, so the
|
|
844
|
+
// observable filesystem result is identical either way; only the
|
|
845
|
+
// rollback bookkeeping differs.
|
|
846
|
+
const preExisting = existsSync(p);
|
|
847
|
+
mkdirSync(p, { recursive: true });
|
|
848
|
+
artifacts?.push({ type: "dir", path: p });
|
|
849
|
+
if (!preExisting)
|
|
850
|
+
ownedArtifacts?.push({ type: "dir", path: p });
|
|
851
|
+
}
|
|
852
|
+
else if ("chown" in step) {
|
|
853
|
+
const p = expandPath(step.chown.path);
|
|
854
|
+
const { uid, gid } = parseOwnerSpec(step.chown.owner);
|
|
855
|
+
const recursive = step.chown.recursive !== false;
|
|
856
|
+
const tag = recursive ? "chown -R" : "chown";
|
|
857
|
+
process.stdout.write(` [lifecycle:${label}] ${tag} ${uid}:${gid} ${p}\n`);
|
|
858
|
+
emitInstallTaskLog(task, `[lifecycle:${label}] ${tag} ${uid}:${gid} ${p}`);
|
|
859
|
+
if (!existsSync(p)) {
|
|
860
|
+
// chown only makes sense if the target exists; surface a clear
|
|
861
|
+
// error rather than letting fs throw an opaque ENOENT later.
|
|
862
|
+
throw new Error(`chown target does not exist: ${p}`);
|
|
863
|
+
}
|
|
864
|
+
try {
|
|
865
|
+
chownWithSudoFallback(p, uid, gid, recursive);
|
|
866
|
+
}
|
|
867
|
+
catch (chownErr) {
|
|
868
|
+
// In pre_start, chown failures are non-fatal: on macOS Docker/Colima
|
|
869
|
+
// the VM handles UID mapping for bind-mounts, so the container can
|
|
870
|
+
// write even without matching ownership. Failing fatally here blocks
|
|
871
|
+
// any non-root service user from starting the app.
|
|
872
|
+
if (label === "pre_start") {
|
|
873
|
+
const msg = `[lifecycle:${label}] ${tag} ${uid}:${gid} ${p} failed (non-fatal): ${chownErr.message}`;
|
|
874
|
+
process.stdout.write(` ${msg}\n`);
|
|
875
|
+
emitInstallTaskLog(task, msg);
|
|
876
|
+
}
|
|
877
|
+
else {
|
|
878
|
+
throw chownErr;
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
else if ("deleteDir" in step) {
|
|
883
|
+
const p = expandPath(step.deleteDir);
|
|
884
|
+
process.stdout.write(` [lifecycle:${label}] deleteDir: ${p}\n`);
|
|
885
|
+
emitInstallTaskLog(task, `[lifecycle:${label}] deleteDir: ${p}`);
|
|
886
|
+
rmSync(p, { recursive: true, force: true });
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
}
|
|
890
|
+
export function cleanupArtifacts(artifacts, task) {
|
|
891
|
+
for (let i = artifacts.length - 1; i >= 0; i--) {
|
|
892
|
+
const a = artifacts[i];
|
|
893
|
+
try {
|
|
894
|
+
switch (a.type) {
|
|
895
|
+
case "image":
|
|
896
|
+
process.stdout.write(` [cleanup] removing image: ${a.path}\n`);
|
|
897
|
+
emitInstallTaskLog(task, `[cleanup] removing image: ${a.path}`);
|
|
898
|
+
spawn("docker", ["rmi", "-f", a.path], { stdio: "ignore" }).unref();
|
|
899
|
+
break;
|
|
900
|
+
case "binary":
|
|
901
|
+
process.stdout.write(` [cleanup] removing binary: ${a.path}\n`);
|
|
902
|
+
emitInstallTaskLog(task, `[cleanup] removing binary: ${a.path}`);
|
|
903
|
+
unlinkSync(a.path);
|
|
904
|
+
break;
|
|
905
|
+
case "dir":
|
|
906
|
+
process.stdout.write(` [cleanup] removing dir: ${a.path}\n`);
|
|
907
|
+
emitInstallTaskLog(task, `[cleanup] removing dir: ${a.path}`);
|
|
908
|
+
rmSync(a.path, { recursive: true, force: true });
|
|
909
|
+
break;
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
catch {
|
|
913
|
+
// best-effort
|
|
914
|
+
}
|
|
915
|
+
}
|
|
916
|
+
}
|
|
917
|
+
export async function runPostStartSteps(spec, instanceId) {
|
|
918
|
+
await runLifecycleSteps(spec.lifecycle?.post_start, "post_start", undefined, undefined, undefined, undefined, instanceId);
|
|
919
|
+
}
|
|
920
|
+
export async function runPreStartSteps(spec, instanceId) {
|
|
921
|
+
await runLifecycleSteps(spec.lifecycle?.pre_start, "pre_start", undefined, undefined, undefined, undefined, instanceId);
|
|
922
|
+
}
|
|
923
|
+
export async function waitForAppRuntimeRunning(instanceId, timeoutMs = 30_000, pollIntervalMs = 1_000) {
|
|
924
|
+
const deadline = Date.now() + timeoutMs;
|
|
925
|
+
while (Date.now() < deadline) {
|
|
926
|
+
const status = await getInstanceInstallRecordRuntimeStatus(instanceId);
|
|
927
|
+
if (status.status === "running")
|
|
928
|
+
return true;
|
|
929
|
+
if (status.status === "dead" || status.status === "failed")
|
|
930
|
+
return false;
|
|
931
|
+
await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
|
|
932
|
+
}
|
|
933
|
+
return false;
|
|
934
|
+
}
|
|
935
|
+
//# sourceMappingURL=lifecycle-scripts.js.map
|