jishushell 0.6.18 → 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 +1 -0
- package/apps/browserless-chromium-container.yaml +1 -0
- package/apps/filebrowser-container.yaml +1 -0
- package/apps/hermes-container.yaml +1 -7
- package/apps/immich-container-lite.yaml +337 -0
- package/apps/immich-container.yaml +371 -0
- package/apps/jishu-kb-container.yaml +26 -21
- package/apps/ollama-binary.yaml +1 -0
- package/apps/ollama-cpu-container.yaml +1 -0
- package/apps/ollama-with-hollama-binary.yaml +2 -0
- package/apps/openclaw-binary.yaml +4 -8
- package/apps/openclaw-container.yaml +1 -7
- package/apps/openclaw-with-ollama-container.yaml +1 -0
- package/apps/openclaw-with-searxng-container.yaml +20 -0
- package/apps/searxng-container.yaml +20 -0
- package/apps/weknora-container.yaml +5 -0
- package/dependencies/jishushell-panel-0.7.3.tgz +0 -0
- package/dist/cli/core.js +1 -1
- package/dist/cli/core.js.map +1 -1
- package/dist/cli/doctor.js +96 -0
- package/dist/cli/doctor.js.map +1 -1
- package/dist/config.d.ts +9 -1
- package/dist/config.js +72 -2
- package/dist/config.js.map +1 -1
- package/dist/install.js +60 -19
- 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/docker.d.ts +2 -0
- package/dist/routes/docker.js +58 -0
- package/dist/routes/docker.js.map +1 -0
- package/dist/routes/file-mounts.js +5 -8
- package/dist/routes/file-mounts.js.map +1 -1
- package/dist/routes/instances.d.ts +0 -14
- package/dist/routes/instances.js +44 -1184
- package/dist/routes/instances.js.map +1 -1
- package/dist/server.d.ts +6 -0
- package/dist/server.js +53 -20
- package/dist/server.js.map +1 -1
- package/dist/services/app-common/catalog-service.js +15 -5
- package/dist/services/app-common/catalog-service.js.map +1 -1
- package/dist/services/app-common/delete-service.js +5 -0
- package/dist/services/app-common/delete-service.js.map +1 -1
- package/dist/services/app-common/instance-store.js +3 -0
- package/dist/services/app-common/instance-store.js.map +1 -1
- package/dist/services/app-common/lifecycle-service.js +12 -4
- package/dist/services/app-common/lifecycle-service.js.map +1 -1
- 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/runtime-facts.js +2 -0
- package/dist/services/app-common/runtime-facts.js.map +1 -1
- package/dist/services/app-common/spec-materializer.d.ts +0 -1
- package/dist/services/app-common/spec-materializer.js +21 -87
- package/dist/services/app-common/spec-materializer.js.map +1 -1
- package/dist/services/app-common/status-refresh.js +25 -13
- package/dist/services/app-common/status-refresh.js.map +1 -1
- package/dist/services/app-modules/browserless/routes.js +5 -3
- package/dist/services/app-modules/browserless/routes.js.map +1 -1
- package/dist/services/capabilities/contract.d.ts +1 -2
- package/dist/services/capabilities/contract.js +0 -10
- package/dist/services/capabilities/contract.js.map +1 -1
- package/dist/services/capabilities/endpoint-validator.js +0 -1
- package/dist/services/capabilities/endpoint-validator.js.map +1 -1
- package/dist/services/capabilities/health.js +1 -1
- package/dist/services/capabilities/health.js.map +1 -1
- 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.js +19 -9
- package/dist/services/connections/admin.js.map +1 -1
- package/dist/services/connections/apply.d.ts +3 -9
- package/dist/services/connections/apply.js +0 -29
- package/dist/services/connections/apply.js.map +1 -1
- package/dist/services/connections/transactor.js +2 -2
- package/dist/services/connections/transactor.js.map +1 -1
- 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/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/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/manager.d.ts +6 -5
- package/dist/services/instances/manager.js +45 -51
- package/dist/services/instances/manager.js.map +1 -1
- 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/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/integrations/hermes/integration.d.ts +1 -1
- package/dist/services/integrations/hermes/integration.js +7 -8
- package/dist/services/integrations/hermes/integration.js.map +1 -1
- 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 +1 -0
- package/dist/services/integrations/index.js +1 -0
- package/dist/services/integrations/index.js.map +1 -1
- package/dist/services/integrations/installable/installers/integration.js +113 -7
- package/dist/services/integrations/installable/installers/integration.js.map +1 -1
- package/dist/services/integrations/jishukb/integration.d.ts +3 -1
- package/dist/services/integrations/jishukb/integration.js +121 -10
- package/dist/services/integrations/jishukb/integration.js.map +1 -1
- package/dist/services/integrations/openclaw/integration.d.ts +21 -7
- package/dist/services/integrations/openclaw/integration.js +385 -158
- package/dist/services/integrations/openclaw/integration.js.map +1 -1
- 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 +8 -4
- package/dist/services/integrations/openclaw/jishukb-shim.js +624 -17
- package/dist/services/integrations/openclaw/jishukb-shim.js.map +1 -1
- package/dist/services/integrations/openclaw/mcporter.d.ts +13 -0
- package/dist/services/integrations/openclaw/mcporter.js +31 -0
- package/dist/services/integrations/openclaw/mcporter.js.map +1 -1
- 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.js +4 -1
- package/dist/services/integrations/openclaw/routes.js.map +1 -1
- package/dist/services/integrations/types.d.ts +5 -17
- package/dist/services/repair/runtime-repair.js +68 -1
- package/dist/services/repair/runtime-repair.js.map +1 -1
- 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 +4 -0
- package/dist/services/runtime/driver-registry.js.map +1 -1
- package/dist/services/runtime/drivers/nomad.d.ts +1 -0
- package/dist/services/runtime/drivers/nomad.js +35 -5
- package/dist/services/runtime/drivers/nomad.js.map +1 -1
- 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 +1 -0
- package/dist/services/runtime/workload-compiler.js +29 -4
- package/dist/services/runtime/workload-compiler.js.map +1 -1
- package/dist/services/setup/setup-manager.js +29 -73
- package/dist/services/setup/setup-manager.js.map +1 -1
- 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-reconciler.js +53 -0
- package/dist/services/system/system-reconciler.js.map +1 -1
- package/dist/types.d.ts +19 -3
- 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 +0 -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/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.test-d.ts → decorate-request-reply.tst.ts} +4 -4
- package/node_modules/fastify/test/types/{dummy-plugin.ts → dummy-plugin.mts} +1 -1
- 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.test-d.ts → logger.tst.ts} +61 -62
- 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.test-d.ts → schema.tst.ts} +22 -22
- package/node_modules/fastify/test/types/{serverFactory.test-d.ts → serverFactory.tst.ts} +4 -4
- package/node_modules/fastify/test/types/tsconfig.json +9 -0
- package/node_modules/fastify/test/types/{type-provider.test-d.ts → type-provider.tst.ts} +256 -250
- 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/jishushell-panel/output/public/assets/{ApiKeyField-NKcbHjNz.js → ApiKeyField-Ce5d1xna.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/{Dashboard-Da1fL38t.js → Dashboard-BXame3yg.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/{HermesChatPanel-DZvmYsoh.js → HermesChatPanel-BHZtPCJd.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/{HermesConfigForm-BLUWlKwm.js → HermesConfigForm-CB3GbNX9.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/{InitPassword-BAKsshzk.js → InitPassword-Boab9F6g.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/InstanceDetail-DrIWCqo-.js +14 -0
- package/node_modules/jishushell-panel/output/public/assets/{Login-DHeOmwI8.js → Login-CzpOkNau.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/NewInstance-CANXyCcL.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/{ProviderRecommendations-H0ByEYF0.js → ProviderRecommendations-BABo9VOC.js} +1 -1
- 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-D-T6BxkQ.js → WeixinLoginPanel-B765Xz4C.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/{index-ERt6_ngA.js → index-Bs6DSbiR.js} +6 -6
- package/node_modules/jishushell-panel/output/public/assets/{registry-DF93EzIb.js → registry-sWIZsIEF.js} +2 -2
- package/node_modules/jishushell-panel/output/public/assets/{usePolling-DeoThIQn.js → usePolling-D4IDOQd_.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/vendor-i18n-Df8aUdv8.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/{vendor-react-Cc84NArf.js → vendor-react-0L0rjmYG.js} +3 -3
- package/node_modules/jishushell-panel/output/public/index.html +3 -3
- package/node_modules/jishushell-panel/package.json +1 -1
- package/node_modules/semver/classes/range.js +6 -2
- package/node_modules/semver/package.json +1 -1
- package/package.json +4 -4
- package/scripts/check-app-spec.mjs +4 -12
- package/scripts/check-architecture-boundaries.mjs +178 -0
- package/scripts/pack-gui-and-send-pi.sh +5 -3
- package/dependencies/jishushell-panel-0.6.18.tgz +0 -0
- package/dist/services/connections/suggestions.d.ts +0 -27
- package/dist/services/connections/suggestions.js +0 -124
- package/dist/services/connections/suggestions.js.map +0 -1
- package/node_modules/fastify/test/types/content-type-parser.test-d.ts +0 -72
- 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/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/using.test-d.ts +0 -17
- package/node_modules/jishushell-panel/output/public/assets/InstanceDetail-Dgyc_TX5.js +0 -14
- package/node_modules/jishushell-panel/output/public/assets/NewInstance-CIy0cYtp.js +0 -1
- package/node_modules/jishushell-panel/output/public/assets/Settings-DAT-UMfP.js +0 -1
- package/node_modules/jishushell-panel/output/public/assets/Setup-g3uckFYR.js +0 -1
- package/node_modules/jishushell-panel/output/public/assets/vendor-i18n-CS8DFbkQ.js +0 -1
|
@@ -9,10 +9,10 @@
|
|
|
9
9
|
from the instance cards, making the panel look like Hermes. -->
|
|
10
10
|
<link rel="icon" type="image/png" href="/favicon.png" />
|
|
11
11
|
<title>JishuShell</title>
|
|
12
|
-
<script type="module" crossorigin src="/assets/index-
|
|
12
|
+
<script type="module" crossorigin src="/assets/index-Bs6DSbiR.js"></script>
|
|
13
13
|
<link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-QTnfLwEv.js">
|
|
14
|
-
<link rel="modulepreload" crossorigin href="/assets/vendor-i18n-
|
|
15
|
-
<link rel="modulepreload" crossorigin href="/assets/vendor-react-
|
|
14
|
+
<link rel="modulepreload" crossorigin href="/assets/vendor-i18n-Df8aUdv8.js">
|
|
15
|
+
<link rel="modulepreload" crossorigin href="/assets/vendor-react-0L0rjmYG.js">
|
|
16
16
|
<link rel="modulepreload" crossorigin href="/assets/api-C70Gt678.js">
|
|
17
17
|
<link rel="stylesheet" crossorigin href="/assets/index-DnnqTf7s.css">
|
|
18
18
|
</head>
|
|
@@ -299,6 +299,10 @@ const replaceTildes = (comp, options) => {
|
|
|
299
299
|
|
|
300
300
|
const replaceTilde = (comp, options) => {
|
|
301
301
|
const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]
|
|
302
|
+
// if we're including prereleases in the match, then the lower bound is
|
|
303
|
+
// -0, the lowest possible prerelease value, just like x-ranges and carets.
|
|
304
|
+
// this keeps `~1.2` equivalent to the `1.2.x` x-range it's documented as.
|
|
305
|
+
const z = options.includePrerelease ? '-0' : ''
|
|
302
306
|
return comp.replace(r, (_, M, m, p, pr) => {
|
|
303
307
|
debug('tilde', comp, _, M, m, p, pr)
|
|
304
308
|
let ret
|
|
@@ -306,10 +310,10 @@ const replaceTilde = (comp, options) => {
|
|
|
306
310
|
if (isX(M)) {
|
|
307
311
|
ret = ''
|
|
308
312
|
} else if (isX(m)) {
|
|
309
|
-
ret = `>=${M}.0.0 <${+M + 1}.0.0-0`
|
|
313
|
+
ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`
|
|
310
314
|
} else if (isX(p)) {
|
|
311
315
|
// ~1.2 == >=1.2.0 <1.3.0-0
|
|
312
|
-
ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`
|
|
316
|
+
ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`
|
|
313
317
|
} else if (pr) {
|
|
314
318
|
debug('replaceTilde pr', pr)
|
|
315
319
|
ret = `>=${M}.${m}.${p}-${pr
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jishushell",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.3",
|
|
4
4
|
"description": "JishuShell — Raspberry Pi server management panel (Core + Web UI)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"jishushellPanel": {
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"openclaw-entry.sh",
|
|
29
29
|
"INSTALL-NOTICE",
|
|
30
30
|
"THIRD-PARTY-NOTICES",
|
|
31
|
-
"dependencies/jishushell-panel-0.
|
|
31
|
+
"dependencies/jishushell-panel-0.7.3.tgz"
|
|
32
32
|
],
|
|
33
33
|
"scripts": {
|
|
34
34
|
"build": "npm install && npm run compile:backend",
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
"build:pack": "npm run build && npm pack",
|
|
63
63
|
"build:pack:cli": "npm run build:pack",
|
|
64
64
|
"build:pack:gui": "npm run build && node scripts/pack-with-gui.mjs",
|
|
65
|
-
"check:contracts": "node --experimental-strip-types scripts/check-integration-isolation.ts && node scripts/check-app-path-boundaries.mjs && node scripts/check-open-core-boundaries.mjs && node scripts/check-colima-launchd.mjs",
|
|
65
|
+
"check:contracts": "node --experimental-strip-types scripts/check-integration-isolation.ts && node scripts/check-app-path-boundaries.mjs && node scripts/check-architecture-boundaries.mjs && node scripts/check-open-core-boundaries.mjs && node scripts/check-colima-launchd.mjs",
|
|
66
66
|
"check:open-core-boundaries": "node scripts/check-open-core-boundaries.mjs",
|
|
67
67
|
"check:i18n": "echo 'i18n checks live in sibling repo ../jishushell-panel.'",
|
|
68
68
|
"check:app-spec": "node scripts/check-app-spec.mjs",
|
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
"jsonwebtoken": "^9.0.2",
|
|
96
96
|
"systeminformation": "^5.23.0",
|
|
97
97
|
"yaml": "^2.8.3",
|
|
98
|
-
"jishushell-panel": "file:dependencies/jishushell-panel-0.
|
|
98
|
+
"jishushell-panel": "file:dependencies/jishushell-panel-0.7.3.tgz"
|
|
99
99
|
},
|
|
100
100
|
"optionalDependencies": {
|
|
101
101
|
"macos-temperature-sensor": "^1.0.4"
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Three provide classes:
|
|
6
6
|
* A. Bindable category — capability has CAPABILITY_CATEGORIES prefix
|
|
7
|
-
* (`llm-` / `search-` / `browser-`
|
|
7
|
+
* (`llm-` / `search-` / `browser-`). Must declare task,
|
|
8
8
|
* port (resolvable to a task port via host_port ?? port), protocol
|
|
9
9
|
* from category whitelist, optional health, description.
|
|
10
10
|
* B. Legacy bindable exact — capability is in LEGACY_BINDABLE_EXACT_ALLOWLIST
|
|
@@ -34,14 +34,13 @@ const APPS_DIR = process.env.APPS_DIR_OVERRIDE ?? join(__dirname, "..", "apps");
|
|
|
34
34
|
// deliberately small and closed: provider app ids stay free-form, but
|
|
35
35
|
// matching protocol must be explicit and statically checkable.
|
|
36
36
|
const CAPABILITY_CATEGORIES = new Set([
|
|
37
|
-
"llm", "search", "browser", "
|
|
37
|
+
"llm", "search", "browser", "files", "knowledge", "ui", "terminal",
|
|
38
38
|
]);
|
|
39
39
|
|
|
40
40
|
const INTERFACES_BY_KIND = {
|
|
41
41
|
llm: new Set(["openai-compatible"]),
|
|
42
42
|
search: new Set(["searxng-json"]),
|
|
43
43
|
browser: new Set(["cdp-ws"]),
|
|
44
|
-
mcp: new Set(["mcp-http", "mcp-sse", "mcp-stdio"]),
|
|
45
44
|
files: new Set(["web-file-manager"]),
|
|
46
45
|
knowledge: new Set(["kb-search"]),
|
|
47
46
|
ui: new Set(["web-ui"]),
|
|
@@ -68,7 +67,6 @@ const PROTOCOL_WHITELIST = {
|
|
|
68
67
|
llm: new Set(["http", "https"]),
|
|
69
68
|
search: new Set(["http", "https"]),
|
|
70
69
|
browser: new Set(["ws", "wss", "http", "https"]),
|
|
71
|
-
mcp: new Set(["http", "https", "ws", "sse"]),
|
|
72
70
|
// Filebrowser exposes an HTTP Web UI under /apps/filebrowser; webdav adds
|
|
73
71
|
// PROPFIND/PUT over the same HTTP origin. Both fit `http(s)`.
|
|
74
72
|
files: new Set(["http", "https"]),
|
|
@@ -99,12 +97,6 @@ function inferLegacyInterface(kind, capability, protocol) {
|
|
|
99
97
|
case "knowledge": return "kb-search";
|
|
100
98
|
case "ui": return "web-ui";
|
|
101
99
|
case "terminal": return "terminal";
|
|
102
|
-
case "mcp": {
|
|
103
|
-
const normalized = typeof protocol === "string" ? protocol.trim().toLowerCase() : "";
|
|
104
|
-
if (normalized === "sse") return "mcp-sse";
|
|
105
|
-
if (normalized === "stdio") return "mcp-stdio";
|
|
106
|
-
return "mcp-http";
|
|
107
|
-
}
|
|
108
100
|
default: return null;
|
|
109
101
|
}
|
|
110
102
|
}
|
|
@@ -440,8 +432,8 @@ for (const { file, spec } of specs) {
|
|
|
440
432
|
|
|
441
433
|
// ── §17 (PR 8): tool_schema validation — applies to any bindable
|
|
442
434
|
// capability that an LLM integration hook may turn into an MCP
|
|
443
|
-
// server entry (i.e. category A search
|
|
444
|
-
//
|
|
435
|
+
// server entry (i.e. category A search-, plus any future bindable
|
|
436
|
+
// cap). Warn-only this release; promoted to err in v0.5.
|
|
445
437
|
if (provide.tool_schema !== undefined) {
|
|
446
438
|
const ts = provide.tool_schema;
|
|
447
439
|
if (typeof ts !== "object" || ts === null) {
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Guard high-risk architecture boundaries that AI/codegen commonly crosses.
|
|
4
|
+
*
|
|
5
|
+
* These are intentionally small string checks. They do not prove correctness;
|
|
6
|
+
* they catch the easy regressions before review:
|
|
7
|
+
* - writing instance.json outside canonical writers
|
|
8
|
+
* - bringing install-time port shifting back into the AppSpec materializer
|
|
9
|
+
* - adding product-specific code to the generic instances route
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { readdirSync, readFileSync, statSync } from "node:fs";
|
|
13
|
+
import { relative, resolve, sep } from "node:path";
|
|
14
|
+
|
|
15
|
+
const REPO_ROOT = resolve(import.meta.dirname ?? ".", "..");
|
|
16
|
+
const SRC_ROOT = resolve(REPO_ROOT, "src");
|
|
17
|
+
|
|
18
|
+
const ALLOWED_INSTANCE_METADATA_WRITERS = new Set([
|
|
19
|
+
"src/services/app-common/create-pipeline.ts",
|
|
20
|
+
"src/services/app-common/instance-store.ts",
|
|
21
|
+
"src/services/instances/manager.ts",
|
|
22
|
+
]);
|
|
23
|
+
|
|
24
|
+
const INSTANCE_METADATA_WRITE_PATTERNS = [
|
|
25
|
+
/\bsafeWriteJson\s*\(\s*[^;\n]*(?:INSTANCE_METADATA_FILENAME|instanceMetaPath\s*\(|["']instance\.json["'])/,
|
|
26
|
+
/\bwriteFileSync\s*\(\s*[^;\n]*(?:INSTANCE_METADATA_FILENAME|instanceMetaPath\s*\(|["']instance\.json["'])/,
|
|
27
|
+
/\bsafeWriteJson\s*\(\s*(?:metaPath|instancePath)\b/,
|
|
28
|
+
/\bwriteFileSync\s*\(\s*(?:metaPath|instancePath)\b/,
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
const MATERIALIZER_FORBIDDEN_PATTERNS = [
|
|
32
|
+
{
|
|
33
|
+
pattern: /\bcollectDeclaredPorts\b/,
|
|
34
|
+
rule: "install materializer must not collect AppSpec ports for conflict checks",
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
pattern: /\bbuildPortShiftMap\b|\bportShift(?:Map)?\b/,
|
|
38
|
+
rule: "install materializer must not shift AppSpec port values",
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
pattern: /\breplacePortTokens\b/,
|
|
42
|
+
rule: "install materializer must not rewrite arbitrary YAML strings/numbers as ports",
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
pattern: /\bisPortInUse\s*\(/,
|
|
46
|
+
rule: "port availability belongs to the Core runtime allocator, not install materialization",
|
|
47
|
+
},
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
const INSTANCE_ROUTE_PRODUCT_PATTERNS = [
|
|
51
|
+
{
|
|
52
|
+
pattern: /\bopenclaw\b/i,
|
|
53
|
+
rule: "OpenClaw-specific HTTP behavior belongs in src/services/integrations/openclaw",
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
pattern: /\bhermes\b/i,
|
|
57
|
+
rule: "Hermes-specific HTTP behavior belongs in src/services/integrations/hermes",
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
pattern: /\bjishukb\b|\bjishu-kb\b/i,
|
|
61
|
+
rule: "JishuKB-specific HTTP behavior belongs in its integration/app boundary",
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
pattern: /\banythingllm\b/i,
|
|
65
|
+
rule: "AnythingLLM-specific HTTP behavior belongs in its integration/app boundary",
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
pattern: /\bbrowserless\b/i,
|
|
69
|
+
rule: "Browserless-specific HTTP behavior belongs in app-modules/browserless",
|
|
70
|
+
},
|
|
71
|
+
];
|
|
72
|
+
|
|
73
|
+
function isSourceFile(path) {
|
|
74
|
+
return path.endsWith(".ts") && !path.endsWith(".d.ts");
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function* walk(dir) {
|
|
78
|
+
for (const entry of readdirSync(dir)) {
|
|
79
|
+
const full = resolve(dir, entry);
|
|
80
|
+
const stat = statSync(full);
|
|
81
|
+
if (stat.isDirectory()) {
|
|
82
|
+
yield* walk(full);
|
|
83
|
+
} else if (stat.isFile() && isSourceFile(full)) {
|
|
84
|
+
yield full;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function relPath(abs) {
|
|
90
|
+
return relative(REPO_ROOT, abs).split(sep).join("/");
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function isCommentLine(line) {
|
|
94
|
+
const trimmed = line.trimStart();
|
|
95
|
+
return trimmed.startsWith("//") || trimmed.startsWith("*") || trimmed.startsWith("/*");
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function lineNumberAt(content, index) {
|
|
99
|
+
return content.slice(0, index).split("\n").length;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const violations = [];
|
|
103
|
+
|
|
104
|
+
for (const abs of walk(SRC_ROOT)) {
|
|
105
|
+
const rel = relPath(abs);
|
|
106
|
+
if (rel.includes("/legacy-migrator/") || rel.includes("/repair/")) continue;
|
|
107
|
+
|
|
108
|
+
const content = readFileSync(abs, "utf-8");
|
|
109
|
+
const allowedInstanceWriter = ALLOWED_INSTANCE_METADATA_WRITERS.has(rel);
|
|
110
|
+
|
|
111
|
+
if (!allowedInstanceWriter) {
|
|
112
|
+
for (const pattern of INSTANCE_METADATA_WRITE_PATTERNS) {
|
|
113
|
+
const re = new RegExp(pattern.source, "g");
|
|
114
|
+
let match;
|
|
115
|
+
while ((match = re.exec(content)) !== null) {
|
|
116
|
+
violations.push({
|
|
117
|
+
file: rel,
|
|
118
|
+
line: lineNumberAt(content, match.index),
|
|
119
|
+
rule: "instance-metadata-write-boundary",
|
|
120
|
+
detail: "Write instance.json through canonical instance-store/instances manager helpers.",
|
|
121
|
+
text: match[0],
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
{
|
|
129
|
+
const file = "src/services/app-common/spec-materializer.ts";
|
|
130
|
+
const content = readFileSync(resolve(REPO_ROOT, file), "utf-8");
|
|
131
|
+
const lines = content.split("\n");
|
|
132
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
133
|
+
const line = lines[i];
|
|
134
|
+
if (isCommentLine(line)) continue;
|
|
135
|
+
for (const { pattern, rule } of MATERIALIZER_FORBIDDEN_PATTERNS) {
|
|
136
|
+
if (!pattern.test(line)) continue;
|
|
137
|
+
violations.push({
|
|
138
|
+
file,
|
|
139
|
+
line: i + 1,
|
|
140
|
+
rule: "install-port-materializer-boundary",
|
|
141
|
+
detail: rule,
|
|
142
|
+
text: line.trim(),
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
{
|
|
149
|
+
const file = "src/routes/instances.ts";
|
|
150
|
+
const content = readFileSync(resolve(REPO_ROOT, file), "utf-8");
|
|
151
|
+
const lines = content.split("\n");
|
|
152
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
153
|
+
const line = lines[i];
|
|
154
|
+
if (isCommentLine(line)) continue;
|
|
155
|
+
for (const { pattern, rule } of INSTANCE_ROUTE_PRODUCT_PATTERNS) {
|
|
156
|
+
if (!pattern.test(line)) continue;
|
|
157
|
+
violations.push({
|
|
158
|
+
file,
|
|
159
|
+
line: i + 1,
|
|
160
|
+
rule: "instance-route-product-boundary",
|
|
161
|
+
detail: rule,
|
|
162
|
+
text: line.trim().slice(0, 160),
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (violations.length > 0) {
|
|
169
|
+
console.error(`check-architecture-boundaries FAILED: ${violations.length} violation(s)\n`);
|
|
170
|
+
for (const violation of violations) {
|
|
171
|
+
console.error(` ${violation.file}:${violation.line} [${violation.rule}]`);
|
|
172
|
+
console.error(` ${violation.detail}`);
|
|
173
|
+
console.error(` ${violation.text}`);
|
|
174
|
+
}
|
|
175
|
+
process.exit(1);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
console.log("check-architecture-boundaries OK");
|
|
@@ -3,10 +3,12 @@ set -euo pipefail
|
|
|
3
3
|
|
|
4
4
|
PANEL_ROOT="/home/eriyu01/work/jishushell-panel"
|
|
5
5
|
CORE_ROOT="/home/eriyu01/work/jishushell"
|
|
6
|
-
VERSION="0.6.16"
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
PANEL_VERSION="$(node -p "require('${PANEL_ROOT}/package.json').version")"
|
|
8
|
+
CORE_VERSION="$(node -p "require('${CORE_ROOT}/package.json').version")"
|
|
9
|
+
|
|
10
|
+
PANEL_TARBALL_NAME="jishushell-panel-${PANEL_VERSION}.tgz"
|
|
11
|
+
CORE_TARBALL_NAME="jishushell-${CORE_VERSION}.tgz"
|
|
10
12
|
|
|
11
13
|
PANEL_TARBALL="${PANEL_ROOT}/${PANEL_TARBALL_NAME}"
|
|
12
14
|
CORE_PANEL_TARBALL="${CORE_ROOT}/dependencies/${PANEL_TARBALL_NAME}"
|
|
Binary file
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
export interface ConnectionSuggestion {
|
|
2
|
-
id: string;
|
|
3
|
-
consumerInstanceId: string;
|
|
4
|
-
consumerName: string;
|
|
5
|
-
instanceId: string;
|
|
6
|
-
slot: string;
|
|
7
|
-
capability: string;
|
|
8
|
-
candidate: {
|
|
9
|
-
providerId: string;
|
|
10
|
-
capability: string;
|
|
11
|
-
name?: string;
|
|
12
|
-
protocol: string;
|
|
13
|
-
status: string;
|
|
14
|
-
hostPort: number;
|
|
15
|
-
path?: string;
|
|
16
|
-
};
|
|
17
|
-
reason: string;
|
|
18
|
-
}
|
|
19
|
-
export declare function computeSuggestions(): ConnectionSuggestion[];
|
|
20
|
-
/**
|
|
21
|
-
* Mark a suggestion as dismissed. Persisted on the consumer instance so
|
|
22
|
-
* subsequent computeSuggestions() invocations skip it for the TTL window.
|
|
23
|
-
*
|
|
24
|
-
* `id` follows the format `${consumerInstanceId}::${slot}::...` — the
|
|
25
|
-
* leading two segments are enough to identify the slot to dismiss.
|
|
26
|
-
*/
|
|
27
|
-
export declare function dismissSuggestion(id: string): Promise<void>;
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Panel-only Suggestions engine — scans every app instance for unbound `requires`
|
|
3
|
-
* slots that *could* be filled from the current capability registry, and
|
|
4
|
-
* emits one suggestion per (consumer, slot, candidate). The Dashboard
|
|
5
|
-
* polls this so the user gets a low-friction "you can connect X to Y"
|
|
6
|
-
* prompt without having to dig into each instance.
|
|
7
|
-
*
|
|
8
|
-
* Dismissals are stored on the consumer's `instance.json.dismissedSuggestions`
|
|
9
|
-
* (per-slot, 30-day TTL).
|
|
10
|
-
*/
|
|
11
|
-
import * as capabilityRegistry from "../capabilities/registry.js";
|
|
12
|
-
import * as instanceManager from "../instances/manager.js";
|
|
13
|
-
import { getInstanceInstallRecord } from "../app-common/service.js";
|
|
14
|
-
import { resolveConnections } from "./resolver.js";
|
|
15
|
-
import { capabilityMatchesRequire } from "../capabilities/contract.js";
|
|
16
|
-
import { readCanonicalSpecForInstance } from "../app-common/instance-store.js";
|
|
17
|
-
import { resolveExecutionOwnerFromMetadata } from "../app-common/execution-owner.js";
|
|
18
|
-
import { getIntegration } from "../integrations/index.js";
|
|
19
|
-
import { safeReadJson, safeWriteJson } from "../../utils/safe-json.js";
|
|
20
|
-
const DISMISS_TTL_MS = 30 * 24 * 60 * 60 * 1000;
|
|
21
|
-
export function computeSuggestions() {
|
|
22
|
-
const out = [];
|
|
23
|
-
const allInstances = instanceManager.listInstances();
|
|
24
|
-
for (const inst of allInstances) {
|
|
25
|
-
const instanceId = String(inst.id ?? "");
|
|
26
|
-
let spec = getInstanceInstallRecord(instanceId)?.spec ?? null;
|
|
27
|
-
if (!spec) {
|
|
28
|
-
spec = readCanonicalSpecForInstance(instanceId);
|
|
29
|
-
if (!spec)
|
|
30
|
-
continue;
|
|
31
|
-
}
|
|
32
|
-
const persisted = (inst.connections ?? {});
|
|
33
|
-
const dismissed = (inst.dismissedSuggestions ?? []);
|
|
34
|
-
const dismissedSlots = new Set(dismissed
|
|
35
|
-
.filter((d) => new Date(d.until).getTime() > Date.now())
|
|
36
|
-
.map((d) => d.slot));
|
|
37
|
-
let pending = [];
|
|
38
|
-
try {
|
|
39
|
-
const r = resolveConnections(spec, { connections: persisted }, "preCreate");
|
|
40
|
-
pending = r.pending;
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
continue;
|
|
44
|
-
}
|
|
45
|
-
for (const p of pending) {
|
|
46
|
-
if (dismissedSlots.has(p.slot))
|
|
47
|
-
continue;
|
|
48
|
-
const req = (spec.requires ?? []).find((item) => item.inject_as === p.slot);
|
|
49
|
-
if (!req)
|
|
50
|
-
continue;
|
|
51
|
-
const candidates = enumerateCandidates(req);
|
|
52
|
-
// Same agent-on-agent guard as the Connections-tab dropdown: agent
|
|
53
|
-
// consumers of `llm` should never be offered another agent's
|
|
54
|
-
// `llm-agent` (would chain agent → agent → real model).
|
|
55
|
-
const owner = resolveExecutionOwnerFromMetadata(instanceId, inst);
|
|
56
|
-
const consumerIsAgent = owner.type === "integration"
|
|
57
|
-
&& getIntegration(owner.integrationKind).manifest?.connectionRole === "agent";
|
|
58
|
-
const running = candidates.filter((e) => {
|
|
59
|
-
if (e.status !== "running")
|
|
60
|
-
return false;
|
|
61
|
-
if (e.instanceId === inst.id)
|
|
62
|
-
return false;
|
|
63
|
-
if (consumerIsAgent && req.capability === "llm" && e.capability === "llm-agent")
|
|
64
|
-
return false;
|
|
65
|
-
return true;
|
|
66
|
-
});
|
|
67
|
-
if (running.length === 0)
|
|
68
|
-
continue;
|
|
69
|
-
// Single candidate → suggest it; multiple → suggest the running ones.
|
|
70
|
-
const top = running[0];
|
|
71
|
-
out.push({
|
|
72
|
-
id: `${inst.id}::${p.slot}::${top.instanceId}::${top.capability}`,
|
|
73
|
-
consumerInstanceId: inst.id,
|
|
74
|
-
consumerName: inst.name ?? inst.id,
|
|
75
|
-
instanceId,
|
|
76
|
-
slot: p.slot,
|
|
77
|
-
capability: p.capability,
|
|
78
|
-
candidate: {
|
|
79
|
-
providerId: top.instanceId,
|
|
80
|
-
capability: top.capability,
|
|
81
|
-
name: top.name,
|
|
82
|
-
protocol: top.protocol,
|
|
83
|
-
status: top.status,
|
|
84
|
-
hostPort: top.hostPort,
|
|
85
|
-
path: top.path,
|
|
86
|
-
},
|
|
87
|
-
reason: p.reason,
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
return out;
|
|
92
|
-
}
|
|
93
|
-
function enumerateCandidates(req) {
|
|
94
|
-
const file = capabilityRegistry.snapshot();
|
|
95
|
-
const out = [];
|
|
96
|
-
for (const list of Object.values(file.providersByCapability ?? {})) {
|
|
97
|
-
for (const entry of list) {
|
|
98
|
-
if (capabilityMatchesRequire(req, entry))
|
|
99
|
-
out.push(entry);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
return out;
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Mark a suggestion as dismissed. Persisted on the consumer instance so
|
|
106
|
-
* subsequent computeSuggestions() invocations skip it for the TTL window.
|
|
107
|
-
*
|
|
108
|
-
* `id` follows the format `${consumerInstanceId}::${slot}::...` — the
|
|
109
|
-
* leading two segments are enough to identify the slot to dismiss.
|
|
110
|
-
*/
|
|
111
|
-
export async function dismissSuggestion(id) {
|
|
112
|
-
const parts = id.split("::");
|
|
113
|
-
if (parts.length < 2)
|
|
114
|
-
throw new Error(`Invalid suggestion id: ${id}`);
|
|
115
|
-
const [consumerInstanceId, slot] = parts;
|
|
116
|
-
const path = instanceManager.instanceMetaPath(consumerInstanceId);
|
|
117
|
-
const cur = (safeReadJson(path, `instance:${consumerInstanceId}`) ?? {});
|
|
118
|
-
const list = Array.isArray(cur.dismissedSuggestions) ? cur.dismissedSuggestions : [];
|
|
119
|
-
const filtered = list.filter((d) => d.slot !== slot);
|
|
120
|
-
filtered.push({ slot, until: new Date(Date.now() + DISMISS_TTL_MS).toISOString() });
|
|
121
|
-
cur.dismissedSuggestions = filtered;
|
|
122
|
-
safeWriteJson(path, cur);
|
|
123
|
-
}
|
|
124
|
-
//# sourceMappingURL=suggestions.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"suggestions.js","sourceRoot":"","sources":["../../../src/services/connections/suggestions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,kBAAkB,MAAM,6BAA6B,CAAC;AAElE,OAAO,KAAK,eAAe,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAqBvE,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEhD,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,MAAM,YAAY,GAAG,eAAe,CAAC,aAAa,EAAE,CAAC;IAErD,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,IAAI,IAAI,GAAmB,wBAAwB,CAAC,UAAU,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;QAC9E,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,4BAA4B,CAAC,UAAU,CAAC,CAAC;YAChD,IAAI,CAAC,IAAI;gBAAE,SAAS;QACtB,CAAC;QAED,MAAM,SAAS,GAAG,CAAE,IAAY,CAAC,WAAW,IAAI,EAAE,CAA4B,CAAC;QAC/E,MAAM,SAAS,GAAG,CAAE,IAAY,CAAC,oBAAoB,IAAI,EAAE,CAA2C,CAAC;QACvG,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,SAAS;aACN,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;aACvD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CACtB,CAAC;QAEF,IAAI,OAAO,GAA8D,EAAE,CAAC;QAC5E,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,kBAAkB,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,SAAgB,EAAE,EAAE,WAAW,CAAC,CAAC;YACnF,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;gBAAE,SAAS;YAEzC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;YAC5E,IAAI,CAAC,GAAG;gBAAE,SAAS;YACnB,MAAM,UAAU,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;YAC5C,mEAAmE;YACnE,6DAA6D;YAC7D,wDAAwD;YACxD,MAAM,KAAK,GAAG,iCAAiC,CAC7C,UAAU,EACV,IAA+B,CAChC,CAAC;YACF,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,KAAK,aAAa;mBAC/C,cAAc,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC;YAChF,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;gBACtC,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;oBAAE,OAAO,KAAK,CAAC;gBACzC,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,EAAE;oBAAE,OAAO,KAAK,CAAC;gBAC3C,IAAI,eAAe,IAAI,GAAG,CAAC,UAAU,KAAK,KAAK,IAAI,CAAC,CAAC,UAAU,KAAK,WAAW;oBAAE,OAAO,KAAK,CAAC;gBAC9F,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;YACH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACnC,sEAAsE;YACtE,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC;gBACP,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,UAAU,EAAE;gBACjE,kBAAkB,EAAE,IAAI,CAAC,EAAE;gBAC3B,YAAY,EAAG,IAAY,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE;gBAC3C,UAAU;gBACV,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,SAAS,EAAE;oBACT,UAAU,EAAE,GAAG,CAAC,UAAU;oBAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;oBAC1B,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,IAAI,EAAE,GAAG,CAAC,IAAI;iBACf;gBACD,MAAM,EAAE,CAAC,CAAC,MAAM;aACjB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAe;IAC1C,MAAM,IAAI,GAAG,kBAAkB,CAAC,QAAQ,EAAE,CAAC;IAC3C,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,IAAI,EAAE,CAAC,EAAE,CAAC;QACnE,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YACzB,IAAI,wBAAwB,CAAC,GAAG,EAAE,KAAK,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EAAU;IAChD,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC;IACtE,MAAM,CAAC,kBAAkB,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;IACzC,MAAM,IAAI,GAAG,eAAe,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG,CAAC,YAAY,CAAM,IAAI,EAAE,YAAY,kBAAkB,EAAE,CAAC,IAAI,EAAE,CAAQ,CAAC;IACrF,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;IACrF,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC1D,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACpF,GAAG,CAAC,oBAAoB,GAAG,QAAQ,CAAC;IACpC,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import fastify, { FastifyBodyParser } from '../../fastify'
|
|
2
|
-
import { expectError, expectType } from 'tsd'
|
|
3
|
-
import { IncomingMessage } from 'node:http'
|
|
4
|
-
import { FastifyRequest } from '../../types/request'
|
|
5
|
-
|
|
6
|
-
expectType<void>(fastify().addContentTypeParser('contentType', function (request, payload, done) {
|
|
7
|
-
expectType<FastifyRequest>(request)
|
|
8
|
-
expectType<IncomingMessage>(payload)
|
|
9
|
-
done(null)
|
|
10
|
-
}))
|
|
11
|
-
|
|
12
|
-
// Body limit options
|
|
13
|
-
|
|
14
|
-
expectType<void>(fastify().addContentTypeParser('contentType', { bodyLimit: 99 }, function (request, payload, done) {
|
|
15
|
-
expectType<FastifyRequest>(request)
|
|
16
|
-
expectType<IncomingMessage>(payload)
|
|
17
|
-
done(null)
|
|
18
|
-
}))
|
|
19
|
-
|
|
20
|
-
// Array for contentType
|
|
21
|
-
|
|
22
|
-
expectType<void>(fastify().addContentTypeParser(['contentType'], function (request, payload, done) {
|
|
23
|
-
expectType<FastifyRequest>(request)
|
|
24
|
-
expectType<IncomingMessage>(payload)
|
|
25
|
-
done(null)
|
|
26
|
-
}))
|
|
27
|
-
|
|
28
|
-
// Body Parser - the generic after addContentTypeParser enforces the type of the `body` parameter as well as the value of the `parseAs` property
|
|
29
|
-
|
|
30
|
-
expectType<void>(fastify().addContentTypeParser<string>('bodyContentType', { parseAs: 'string' }, function (request, body, done) {
|
|
31
|
-
expectType<FastifyRequest>(request)
|
|
32
|
-
expectType<string>(body)
|
|
33
|
-
done(null)
|
|
34
|
-
}))
|
|
35
|
-
|
|
36
|
-
expectType<void>(fastify().addContentTypeParser<Buffer>('bodyContentType', { parseAs: 'buffer' }, function (request, body, done) {
|
|
37
|
-
expectType<FastifyRequest>(request)
|
|
38
|
-
expectType<Buffer>(body)
|
|
39
|
-
done(null)
|
|
40
|
-
}))
|
|
41
|
-
|
|
42
|
-
expectType<void>(fastify().addContentTypeParser('contentType', async function (request: FastifyRequest, payload: IncomingMessage) {
|
|
43
|
-
expectType<FastifyRequest>(request)
|
|
44
|
-
expectType<IncomingMessage>(payload)
|
|
45
|
-
return null
|
|
46
|
-
}))
|
|
47
|
-
|
|
48
|
-
expectType<void>(fastify().addContentTypeParser<string>('bodyContentType', { parseAs: 'string' }, async function (request: FastifyRequest, body: string) {
|
|
49
|
-
expectType<FastifyRequest>(request)
|
|
50
|
-
expectType<string>(body)
|
|
51
|
-
return null
|
|
52
|
-
}))
|
|
53
|
-
|
|
54
|
-
expectType<void>(fastify().addContentTypeParser<Buffer>('bodyContentType', { parseAs: 'buffer' }, async function (request: FastifyRequest, body: Buffer) {
|
|
55
|
-
expectType<FastifyRequest>(request)
|
|
56
|
-
expectType<Buffer>(body)
|
|
57
|
-
return null
|
|
58
|
-
}))
|
|
59
|
-
|
|
60
|
-
expectType<FastifyBodyParser<string>>(fastify().getDefaultJsonParser('error', 'ignore'))
|
|
61
|
-
|
|
62
|
-
expectError(fastify().getDefaultJsonParser('error', 'skip'))
|
|
63
|
-
|
|
64
|
-
expectError(fastify().getDefaultJsonParser('nothing', 'ignore'))
|
|
65
|
-
|
|
66
|
-
expectType<void>(fastify().removeAllContentTypeParsers())
|
|
67
|
-
expectError(fastify().removeAllContentTypeParsers('contentType'))
|
|
68
|
-
|
|
69
|
-
expectType<void>(fastify().removeContentTypeParser('contentType'))
|
|
70
|
-
expectType<void>(fastify().removeContentTypeParser(/contentType+.*/))
|
|
71
|
-
expectType<void>(fastify().removeContentTypeParser(['contentType', /contentType+.*/]))
|
|
72
|
-
expectError(fastify().removeContentTypeParser({}))
|