jishushell 0.4.24 → 0.5.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/INSTALL-NOTICE +11 -0
  2. package/apps/anythingllm-container.yaml +287 -0
  3. package/apps/browserless-chromium-container.yaml +90 -0
  4. package/apps/filebrowser-container.yaml +163 -0
  5. package/apps/hermes-container.yaml +36 -2
  6. package/apps/ollama-binary.yaml +91 -90
  7. package/apps/ollama-cpu-container.yaml +8 -1
  8. package/apps/ollama-with-hollama-binary.yaml +91 -90
  9. package/apps/openclaw-binary.yaml +38 -1
  10. package/apps/openclaw-container.yaml +45 -2
  11. package/apps/openclaw-with-ollama-container.yaml +11 -2
  12. package/apps/openclaw-with-searxng-container.yaml +26 -2
  13. package/apps/openwebui-container.yaml +45 -1
  14. package/apps/playwright-container.yaml +7 -1
  15. package/apps/searxng-container.yaml +58 -7
  16. package/apps/weknora-container.yaml +471 -0
  17. package/dist/cli/app.js +79 -9
  18. package/dist/cli/app.js.map +1 -1
  19. package/dist/cli/doctor.d.ts +12 -12
  20. package/dist/cli/doctor.js +242 -55
  21. package/dist/cli/doctor.js.map +1 -1
  22. package/dist/cli/llm.d.ts +4 -3
  23. package/dist/cli/llm.js +4 -3
  24. package/dist/cli/llm.js.map +1 -1
  25. package/dist/cli/panel.d.ts +6 -5
  26. package/dist/cli/panel.js +10 -9
  27. package/dist/cli/panel.js.map +1 -1
  28. package/dist/config.d.ts +19 -0
  29. package/dist/config.js +99 -1
  30. package/dist/config.js.map +1 -1
  31. package/dist/control.d.ts +7 -6
  32. package/dist/control.js +7 -6
  33. package/dist/control.js.map +1 -1
  34. package/dist/install.js +3 -3
  35. package/dist/install.js.map +1 -1
  36. package/dist/routes/agent-apps.d.ts +1 -1
  37. package/dist/routes/agent-apps.js +1 -1
  38. package/dist/routes/apps.js +44 -11
  39. package/dist/routes/apps.js.map +1 -1
  40. package/dist/routes/auth.js +5 -2
  41. package/dist/routes/auth.js.map +1 -1
  42. package/dist/routes/backup.js +64 -11
  43. package/dist/routes/backup.js.map +1 -1
  44. package/dist/routes/external-mounts.d.ts +17 -0
  45. package/dist/routes/external-mounts.js +73 -0
  46. package/dist/routes/external-mounts.js.map +1 -0
  47. package/dist/routes/file-mounts.d.ts +13 -0
  48. package/dist/routes/file-mounts.js +90 -0
  49. package/dist/routes/file-mounts.js.map +1 -0
  50. package/dist/routes/files-organize.d.ts +28 -0
  51. package/dist/routes/files-organize.js +167 -0
  52. package/dist/routes/files-organize.js.map +1 -0
  53. package/dist/routes/files.d.ts +31 -0
  54. package/dist/routes/files.js +321 -0
  55. package/dist/routes/files.js.map +1 -0
  56. package/dist/routes/instances.js +826 -17
  57. package/dist/routes/instances.js.map +1 -1
  58. package/dist/routes/internal.d.ts +2 -0
  59. package/dist/routes/internal.js +59 -0
  60. package/dist/routes/internal.js.map +1 -0
  61. package/dist/routes/llm.js +24 -35
  62. package/dist/routes/llm.js.map +1 -1
  63. package/dist/routes/setup.js +10 -10
  64. package/dist/routes/setup.js.map +1 -1
  65. package/dist/routes/system.js +1 -1
  66. package/dist/routes/system.js.map +1 -1
  67. package/dist/routes/webdav.d.ts +17 -0
  68. package/dist/routes/webdav.js +114 -0
  69. package/dist/routes/webdav.js.map +1 -0
  70. package/dist/server.d.ts +9 -0
  71. package/dist/server.js +751 -20
  72. package/dist/server.js.map +1 -1
  73. package/dist/services/agent-apps/catalog.js +4 -3
  74. package/dist/services/agent-apps/catalog.js.map +1 -1
  75. package/dist/services/agent-apps/index.d.ts +1 -1
  76. package/dist/services/agent-apps/index.js +1 -1
  77. package/dist/services/agent-apps/installers/adapter.d.ts +1 -1
  78. package/dist/services/agent-apps/installers/adapter.js +1 -1
  79. package/dist/services/agent-apps/installers/shell-script.d.ts +1 -1
  80. package/dist/services/agent-apps/installers/shell-script.js +3 -3
  81. package/dist/services/agent-apps/installers/shell-script.js.map +1 -1
  82. package/dist/services/agent-apps/types.d.ts +2 -2
  83. package/dist/services/agent-apps/types.js +1 -1
  84. package/dist/services/app/app-compiler.d.ts +1 -1
  85. package/dist/services/app/app-compiler.js +5 -5
  86. package/dist/services/app/app-compiler.js.map +1 -1
  87. package/dist/services/app/app-manager.d.ts +25 -1
  88. package/dist/services/app/app-manager.js +829 -150
  89. package/dist/services/app/app-manager.js.map +1 -1
  90. package/dist/services/app/custom-manager.js.map +1 -1
  91. package/dist/services/app/hermes-agent-manager.js +7 -4
  92. package/dist/services/app/hermes-agent-manager.js.map +1 -1
  93. package/dist/services/app/ollama-manager.js +1 -1
  94. package/dist/services/app/ollama-manager.js.map +1 -1
  95. package/dist/services/app/openclaw-manager.js +20 -3
  96. package/dist/services/app/openclaw-manager.js.map +1 -1
  97. package/dist/services/app/platform-transform.d.ts +32 -0
  98. package/dist/services/app/platform-transform.js +65 -0
  99. package/dist/services/app/platform-transform.js.map +1 -0
  100. package/dist/services/app/provide-resolver.d.ts +29 -0
  101. package/dist/services/app/provide-resolver.js +112 -0
  102. package/dist/services/app/provide-resolver.js.map +1 -0
  103. package/dist/services/app-passwords.d.ts +61 -0
  104. package/dist/services/app-passwords.js +173 -0
  105. package/dist/services/app-passwords.js.map +1 -0
  106. package/dist/services/backup-manager.d.ts +11 -0
  107. package/dist/services/backup-manager.js +177 -4
  108. package/dist/services/backup-manager.js.map +1 -1
  109. package/dist/services/capability-endpoint-validator.d.ts +41 -0
  110. package/dist/services/capability-endpoint-validator.js +104 -0
  111. package/dist/services/capability-endpoint-validator.js.map +1 -0
  112. package/dist/services/capability-health.d.ts +16 -0
  113. package/dist/services/capability-health.js +121 -0
  114. package/dist/services/capability-health.js.map +1 -0
  115. package/dist/services/capability-registry.d.ts +106 -0
  116. package/dist/services/capability-registry.js +313 -0
  117. package/dist/services/capability-registry.js.map +1 -0
  118. package/dist/services/connection-apply.d.ts +91 -0
  119. package/dist/services/connection-apply.js +475 -0
  120. package/dist/services/connection-apply.js.map +1 -0
  121. package/dist/services/connection-resolver.d.ts +65 -0
  122. package/dist/services/connection-resolver.js +281 -0
  123. package/dist/services/connection-resolver.js.map +1 -0
  124. package/dist/services/connection-transactor.d.ts +39 -0
  125. package/dist/services/connection-transactor.js +351 -0
  126. package/dist/services/connection-transactor.js.map +1 -0
  127. package/dist/services/external-mounts.d.ts +40 -0
  128. package/dist/services/external-mounts.js +187 -0
  129. package/dist/services/external-mounts.js.map +1 -0
  130. package/dist/services/files-manager.d.ts +252 -0
  131. package/dist/services/files-manager.js +1075 -0
  132. package/dist/services/files-manager.js.map +1 -0
  133. package/dist/services/files-mounts.d.ts +42 -0
  134. package/dist/services/files-mounts.js +207 -0
  135. package/dist/services/files-mounts.js.map +1 -0
  136. package/dist/services/instance-manager.d.ts +13 -0
  137. package/dist/services/instance-manager.js +138 -46
  138. package/dist/services/instance-manager.js.map +1 -1
  139. package/dist/services/llm-proxy/index.d.ts +16 -2
  140. package/dist/services/llm-proxy/index.js +48 -44
  141. package/dist/services/llm-proxy/index.js.map +1 -1
  142. package/dist/services/llm-proxy/probe.d.ts +6 -0
  143. package/dist/services/llm-proxy/probe.js +85 -0
  144. package/dist/services/llm-proxy/probe.js.map +1 -0
  145. package/dist/services/llm-proxy/ssrf.d.ts +1 -0
  146. package/dist/services/llm-proxy/ssrf.js +24 -9
  147. package/dist/services/llm-proxy/ssrf.js.map +1 -1
  148. package/dist/services/nomad-manager.d.ts +4 -0
  149. package/dist/services/nomad-manager.js +428 -35
  150. package/dist/services/nomad-manager.js.map +1 -1
  151. package/dist/services/organize/applier.d.ts +46 -0
  152. package/dist/services/organize/applier.js +218 -0
  153. package/dist/services/organize/applier.js.map +1 -0
  154. package/dist/services/organize/rules.d.ts +57 -0
  155. package/dist/services/organize/rules.js +286 -0
  156. package/dist/services/organize/rules.js.map +1 -0
  157. package/dist/services/organize/scanner.d.ts +50 -0
  158. package/dist/services/organize/scanner.js +366 -0
  159. package/dist/services/organize/scanner.js.map +1 -0
  160. package/dist/services/organize/store.d.ts +14 -0
  161. package/dist/services/organize/store.js +82 -0
  162. package/dist/services/organize/store.js.map +1 -0
  163. package/dist/services/panel-manager.js +20 -1
  164. package/dist/services/panel-manager.js.map +1 -1
  165. package/dist/services/process-manager.js +4 -3
  166. package/dist/services/process-manager.js.map +1 -1
  167. package/dist/services/runtime/adapters/hermes.d.ts +30 -1
  168. package/dist/services/runtime/adapters/hermes.js +219 -6
  169. package/dist/services/runtime/adapters/hermes.js.map +1 -1
  170. package/dist/services/runtime/adapters/openclaw-mcporter.d.ts +45 -0
  171. package/dist/services/runtime/adapters/openclaw-mcporter.js +108 -0
  172. package/dist/services/runtime/adapters/openclaw-mcporter.js.map +1 -0
  173. package/dist/services/runtime/adapters/openclaw-routes.d.ts +8 -2
  174. package/dist/services/runtime/adapters/openclaw-routes.js +68 -0
  175. package/dist/services/runtime/adapters/openclaw-routes.js.map +1 -1
  176. package/dist/services/runtime/adapters/openclaw.d.ts +177 -0
  177. package/dist/services/runtime/adapters/openclaw.js +1171 -11
  178. package/dist/services/runtime/adapters/openclaw.js.map +1 -1
  179. package/dist/services/runtime/instance.d.ts +1 -1
  180. package/dist/services/runtime/instance.js +1 -1
  181. package/dist/services/runtime/instance.js.map +1 -1
  182. package/dist/services/runtime/mcp-shims/anythingllm-shim.d.ts +46 -0
  183. package/dist/services/runtime/mcp-shims/anythingllm-shim.js +281 -0
  184. package/dist/services/runtime/mcp-shims/anythingllm-shim.js.map +1 -0
  185. package/dist/services/runtime/mcp-shims/drive-shim.d.ts +54 -0
  186. package/dist/services/runtime/mcp-shims/drive-shim.js +489 -0
  187. package/dist/services/runtime/mcp-shims/drive-shim.js.map +1 -0
  188. package/dist/services/runtime/mcp-shims/firewall.d.ts +26 -0
  189. package/dist/services/runtime/mcp-shims/firewall.js +129 -0
  190. package/dist/services/runtime/mcp-shims/firewall.js.map +1 -0
  191. package/dist/services/runtime/mcp-shims/searxng-shim.d.ts +27 -0
  192. package/dist/services/runtime/mcp-shims/searxng-shim.js +125 -0
  193. package/dist/services/runtime/mcp-shims/searxng-shim.js.map +1 -0
  194. package/dist/services/runtime/mcp-shims/write-mcp-entry.d.ts +83 -0
  195. package/dist/services/runtime/mcp-shims/write-mcp-entry.js +127 -0
  196. package/dist/services/runtime/mcp-shims/write-mcp-entry.js.map +1 -0
  197. package/dist/services/runtime/migrations.d.ts +8 -0
  198. package/dist/services/runtime/migrations.js +100 -0
  199. package/dist/services/runtime/migrations.js.map +1 -1
  200. package/dist/services/runtime/types.d.ts +46 -0
  201. package/dist/services/setup-manager.js +99 -24
  202. package/dist/services/setup-manager.js.map +1 -1
  203. package/dist/services/suggestions.d.ts +27 -0
  204. package/dist/services/suggestions.js +133 -0
  205. package/dist/services/suggestions.js.map +1 -0
  206. package/dist/services/task-registry.js +4 -2
  207. package/dist/services/task-registry.js.map +1 -1
  208. package/dist/services/telemetry/device-fingerprint.d.ts +1 -1
  209. package/dist/services/telemetry/device-fingerprint.js +1 -1
  210. package/dist/services/types-shim.d.ts +16 -0
  211. package/dist/services/types-shim.js +2 -0
  212. package/dist/services/types-shim.js.map +1 -0
  213. package/dist/services/webdav/server.d.ts +24 -0
  214. package/dist/services/webdav/server.js +420 -0
  215. package/dist/services/webdav/server.js.map +1 -0
  216. package/dist/services/webdav/xml-builder.d.ts +73 -0
  217. package/dist/services/webdav/xml-builder.js +156 -0
  218. package/dist/services/webdav/xml-builder.js.map +1 -0
  219. package/dist/services/workspace-builder.d.ts +29 -0
  220. package/dist/services/workspace-builder.js +188 -0
  221. package/dist/services/workspace-builder.js.map +1 -0
  222. package/dist/types.d.ts +231 -1
  223. package/dist/utils/instance-lock.d.ts +22 -0
  224. package/dist/utils/instance-lock.js +48 -0
  225. package/dist/utils/instance-lock.js.map +1 -0
  226. package/dist/utils/path-locks.d.ts +30 -0
  227. package/dist/utils/path-locks.js +63 -0
  228. package/dist/utils/path-locks.js.map +1 -0
  229. package/dist/utils/path-safety.d.ts +41 -0
  230. package/dist/utils/path-safety.js +119 -0
  231. package/dist/utils/path-safety.js.map +1 -0
  232. package/dist/utils/safe-json.js +55 -22
  233. package/dist/utils/safe-json.js.map +1 -1
  234. package/dist/utils/safe-write.d.ts +24 -0
  235. package/dist/utils/safe-write.js +82 -0
  236. package/dist/utils/safe-write.js.map +1 -0
  237. package/install/jishu-install.sh +323 -27
  238. package/install/jishu-uninstall.sh +353 -20
  239. package/package.json +18 -1
  240. package/public/assets/Dashboard-BdWPtroF.js +1 -0
  241. package/public/assets/{HermesChatPanel-mFSureyc.js → HermesChatPanel-B_2HlVBQ.js} +1 -1
  242. package/public/assets/HermesConfigForm-DVlhg3WV.js +4 -0
  243. package/public/assets/{InitPassword-CVA8wQA6.js → InitPassword-D7glTExX.js} +1 -1
  244. package/public/assets/InstanceDetail-CxSy2cpe.js +92 -0
  245. package/public/assets/{Login-BWsZH2mu.js → Login-Cfr5c2sv.js} +1 -1
  246. package/public/assets/NewInstance-BIYDmJis.js +1 -0
  247. package/public/assets/ProviderRecommendations-BuRnvRcI.js +1 -0
  248. package/public/assets/Settings-Cc-tYBil.js +1 -0
  249. package/public/assets/Setup-lGZEk5jq.js +1 -0
  250. package/public/assets/{WeixinLoginPanel-CnjR8xMu.js → WeixinLoginPanel-CoGqzxeV.js} +2 -2
  251. package/public/assets/index-87IJXG-w.css +1 -0
  252. package/public/assets/index-BZc5zH7u.js +19 -0
  253. package/public/assets/providers-DtNXh9JD.js +1 -0
  254. package/public/assets/registry-BWnkJgZ1.js +2 -0
  255. package/public/assets/{usePolling-Do5Erqm_.js → usePolling-CwwT9KrC.js} +1 -1
  256. package/public/assets/{vendor-i18n-ucpM0OR0.js → vendor-i18n-y9V7Sfuu.js} +1 -1
  257. package/public/assets/{vendor-react-Bk1hRGiY.js → vendor-react-BWrEVJVb.js} +6 -6
  258. package/public/index.html +4 -4
  259. package/scripts/check-app-spec.mjs +457 -0
  260. package/scripts/check-i18n.mjs +154 -0
  261. package/scripts/check-new-file-tests.mjs +230 -0
  262. package/scripts/check-quarantine-expiry.mjs +105 -0
  263. package/scripts/perf/README.md +49 -0
  264. package/scripts/perf/auth.js +99 -0
  265. package/scripts/perf/config.js +63 -0
  266. package/scripts/perf/instances.js +143 -0
  267. package/scripts/perf/proxy.js +96 -0
  268. package/scripts/run.sh +4 -4
  269. package/scripts/smoke/files-w1.sh +142 -0
  270. package/scripts/smoke-backend.mjs +122 -0
  271. package/scripts/smoke-post-publish.mjs +346 -0
  272. package/public/assets/Dashboard-B-JoOjBQ.js +0 -1
  273. package/public/assets/HermesConfigForm-DvR05LK1.js +0 -4
  274. package/public/assets/InstanceDetail-DcZW2QGO.js +0 -91
  275. package/public/assets/NewInstance-BCIrAd86.js +0 -1
  276. package/public/assets/Settings-xkDcduFz.js +0 -1
  277. package/public/assets/Setup-Cfuwj4gV.js +0 -1
  278. package/public/assets/index-CPhVFEsx.css +0 -1
  279. package/public/assets/index-DQsM6Joa.js +0 -19
  280. package/public/assets/providers-V-vwrExZ.js +0 -1
  281. package/public/assets/registry-B4UFJdpA.js +0 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-health.js","sourceRoot":"","sources":["../../src/services/capability-health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ export type CapabilityStatus = "running" | "stopped" | "unknown";
2
+ /**
3
+ * Single provider entry in the registry. v3.4.x extends the legacy 5-field
4
+ * shape (instanceId / hostPort / address / path / registered_at) to ~10
5
+ * fields so the Connections UI can render rich metadata without re-querying
6
+ * each provider's spec.
7
+ */
8
+ export interface CapabilityEntry {
9
+ instanceId: string;
10
+ name?: string;
11
+ capability: string;
12
+ host: string;
13
+ hostPort: number;
14
+ path?: string;
15
+ address: string;
16
+ protocol: string;
17
+ visibility?: "external" | "internal" | string;
18
+ status: CapabilityStatus;
19
+ lastSeenRunningAt?: string;
20
+ registeredAt: string;
21
+ /**
22
+ * §17 (PR 8) — when present, MCP-binding adapters expose this
23
+ * capability through the jishushell MCP firewall using the schema
24
+ * here, instead of letting the upstream MCP package's `tools/list`
25
+ * descriptions reach the LLM. Copied verbatim from the producing
26
+ * spec's `provides[].tool_schema` at registerProvider time.
27
+ */
28
+ toolSchema?: import("../types.js").ToolSchema;
29
+ /**
30
+ * §6 (PR B) — auth config for consumers of this capability. Copied
31
+ * verbatim from the producing spec's `provides[].auth` at registerProvider
32
+ * time. Absent = no auth required.
33
+ */
34
+ auth?: import("../types.js").AppProvideAuth;
35
+ }
36
+ /**
37
+ * Legacy shape kept side-by-side during PR 1-3 transition.
38
+ */
39
+ interface LegacyCapabilityEntry {
40
+ instanceId: string;
41
+ hostPort: number;
42
+ address: string;
43
+ path?: string;
44
+ registered_at: string;
45
+ }
46
+ interface CapabilityRegistryFile {
47
+ /**
48
+ * v3.4.x new shape: a capability may have multiple providers (e.g. two
49
+ * Ollama instances). UI lets users pick among candidates.
50
+ */
51
+ providersByCapability?: Record<string, CapabilityEntry[]>;
52
+ /**
53
+ * Legacy shape: single entry per capability, last-writer-wins. PR 1 keeps
54
+ * it dual-written; PR 3 removes it.
55
+ */
56
+ capabilities?: Record<string, LegacyCapabilityEntry>;
57
+ }
58
+ /**
59
+ * Read the registry, migrating any legacy-only entries on the fly. Always
60
+ * returns both shapes populated — the compat layer relies on this.
61
+ */
62
+ export declare function readRegistry(): CapabilityRegistryFile;
63
+ /**
64
+ * Compat-view accessor: returns the **first** provider for a capability in
65
+ * legacy 5-field shape. PR 3 sub-step 3f deletes this function once all
66
+ * call sites are switched to `getProviderEntry` / `listProviders`.
67
+ */
68
+ export declare function getCapabilityEntry(capability: string): LegacyCapabilityEntry | undefined;
69
+ /**
70
+ * List all providers for a capability. Used by Connections UI candidate
71
+ * dropdown and PR 3 multi-candidate resolution.
72
+ */
73
+ export declare function listProviders(capability: string): CapabilityEntry[];
74
+ /**
75
+ * Locate a specific provider by composite key. The `(instanceId, capability)`
76
+ * pair is required (v3.1 §5.3) because one instance may publish multiple
77
+ * capabilities (`ollama-binary` provides both `ollama-api` and
78
+ * `ollama-terminal`); `instanceId` alone is not unique.
79
+ */
80
+ export declare function getProviderEntry(instanceId: string, capability: string): CapabilityEntry | undefined;
81
+ /**
82
+ * Register or update a single provider entry. Writes to both the new
83
+ * `providersByCapability` list and the legacy `capabilities` map (compat
84
+ * layer; PR 3 sub-step 3f drops the legacy write).
85
+ */
86
+ export declare function registerProvider(entry: CapabilityEntry): void;
87
+ /**
88
+ * Mark all providers from a given instance as `stopped` instead of deleting
89
+ * them, so the Connections UI can still show them as candidates (greyed out).
90
+ * Replaces the previous `unregisterCapabilities` semantics on stop (§5.4).
91
+ */
92
+ export declare function setProviderStatus(instanceId: string, status: CapabilityStatus): void;
93
+ /**
94
+ * Remove all providers for an instance permanently — used for uninstall /
95
+ * delete, NOT for stop (§5.4). After PR 3 sub-step 3c this is the only
96
+ * path that strips entries from the registry.
97
+ */
98
+ export declare function unregisterProviders(instanceId: string): void;
99
+ /**
100
+ * Snapshot of the full registry (read-only). UI / suggestion engine consumes.
101
+ * Same dedup semantics as `listProviders` so callers iterating the snapshot
102
+ * (e.g. category-prefix candidate matching in `routes/instances.ts`) don't
103
+ * leak duplicates.
104
+ */
105
+ export declare function snapshot(): CapabilityRegistryFile;
106
+ export {};
@@ -0,0 +1,313 @@
1
+ /**
2
+ * Capability registry — Layer 1 of the app interconnection design (§5).
3
+ *
4
+ * Stores `~/.jishushell/apps/capability-registry.json` mapping capability
5
+ * names to a list of provider entries. PR 1 introduces a schema migration
6
+ * from the legacy `capabilities: Record<cap, Entry>` (single entry per
7
+ * capability, last-writer-wins) to `providersByCapability: Record<cap, Entry[]>`
8
+ * supporting multi-candidate providers.
9
+ *
10
+ * **Compat layer (v3.4.x §10.1)**: dual read/write keeps the legacy
11
+ * `capabilities` field in sync with the new `providersByCapability` so the
12
+ * legacy `resolveRequires` / `listProvidedCapabilities` paths in app-manager.ts
13
+ * continue working until PR 3 finishes the call-site migration. PR 3 sub-step
14
+ * 3f deletes both the compat layer and the legacy `capabilities` field.
15
+ */
16
+ import { join } from "path";
17
+ import { homedir } from "os";
18
+ import * as config from "../config.js";
19
+ import { safeReadJson, safeWriteJson } from "../utils/safe-json.js";
20
+ /**
21
+ * Resolve APPS_DIR lazily so partial test mocks of `../config` (which
22
+ * commonly stub only some exports) don't trip module-load time. Mirrors
23
+ * the pattern used in `app-manager.ts:44-46` — guard with `name in config`
24
+ * so vitest's strict mock proxy doesn't throw on undefined property access.
25
+ */
26
+ function getAppsDir() {
27
+ const value = "APPS_DIR" in config
28
+ ? config.APPS_DIR
29
+ : undefined;
30
+ if (typeof value === "string" && value.trim())
31
+ return value;
32
+ const home = "JISHUSHELL_HOME" in config
33
+ ? config.JISHUSHELL_HOME
34
+ : undefined;
35
+ if (typeof home === "string" && home.trim())
36
+ return join(home, "apps");
37
+ return join(process.env.HOME ?? homedir(), ".jishushell", "apps");
38
+ }
39
+ function getRegistryPath() {
40
+ return join(getAppsDir(), "capability-registry.json");
41
+ }
42
+ function readRegistryFile() {
43
+ const raw = safeReadJson(getRegistryPath(), "capability-registry");
44
+ if (!raw)
45
+ return { providersByCapability: {}, capabilities: {} };
46
+ // Ensure both fields exist so call sites don't have to null-check.
47
+ return {
48
+ providersByCapability: raw.providersByCapability ?? {},
49
+ capabilities: raw.capabilities ?? {},
50
+ };
51
+ }
52
+ function writeRegistryFile(reg) {
53
+ safeWriteJson(getRegistryPath(), reg, true);
54
+ }
55
+ /**
56
+ * Project a v3.4.x entry down to the legacy 5-field shape so the legacy
57
+ * `capabilities` map stays consistent with `providersByCapability` during
58
+ * the PR 1-3 transition.
59
+ */
60
+ function toLegacyEntry(entry) {
61
+ const legacy = {
62
+ instanceId: entry.instanceId,
63
+ hostPort: entry.hostPort,
64
+ address: entry.address,
65
+ registered_at: entry.registeredAt,
66
+ };
67
+ if (entry.path)
68
+ legacy.path = entry.path;
69
+ return legacy;
70
+ }
71
+ /**
72
+ * Promote a legacy entry read from disk into the v3.4.x shape so call sites
73
+ * never have to handle two formats. Called during migration on first read.
74
+ */
75
+ function fromLegacyEntry(legacy, capability) {
76
+ // Best-effort host extraction — legacy address is `host:port[/path]`.
77
+ // Strip the path tail first, then split on the last colon to handle IPv6.
78
+ let host = "127.0.0.1";
79
+ const base = legacy.address.split("/")[0];
80
+ const colonIdx = base.lastIndexOf(":");
81
+ if (colonIdx > 0)
82
+ host = base.slice(0, colonIdx);
83
+ return {
84
+ instanceId: legacy.instanceId,
85
+ capability,
86
+ host,
87
+ hostPort: legacy.hostPort,
88
+ path: legacy.path,
89
+ address: legacy.address,
90
+ protocol: "http",
91
+ status: "unknown",
92
+ registeredAt: legacy.registered_at,
93
+ };
94
+ }
95
+ /**
96
+ * Migrate any legacy-only entries on read so subsequent operations see a
97
+ * uniform `providersByCapability` view. Idempotent.
98
+ */
99
+ function migrate(reg) {
100
+ const providers = reg.providersByCapability ?? {};
101
+ const legacy = reg.capabilities ?? {};
102
+ let changed = false;
103
+ for (const [cap, legacyEntry] of Object.entries(legacy)) {
104
+ const list = providers[cap] ?? [];
105
+ const alreadyMigrated = list.some((e) => e.instanceId === legacyEntry.instanceId && e.hostPort === legacyEntry.hostPort);
106
+ if (!alreadyMigrated) {
107
+ providers[cap] = [...list, fromLegacyEntry(legacyEntry, cap)];
108
+ changed = true;
109
+ }
110
+ }
111
+ if (changed) {
112
+ return { providersByCapability: providers, capabilities: legacy };
113
+ }
114
+ return { providersByCapability: providers, capabilities: legacy };
115
+ }
116
+ /**
117
+ * Set the `path` property only when truthy so equality comparisons (used by
118
+ * `removeProvider` to dedupe) don't see a spurious `path: undefined` mismatch.
119
+ */
120
+ function ensureProvidersField(reg) {
121
+ if (!reg.providersByCapability)
122
+ reg.providersByCapability = {};
123
+ return reg.providersByCapability;
124
+ }
125
+ function ensureLegacyField(reg) {
126
+ if (!reg.capabilities)
127
+ reg.capabilities = {};
128
+ return reg.capabilities;
129
+ }
130
+ // ── Public API ───────────────────────────────────────────────────────────
131
+ /**
132
+ * Read the registry, migrating any legacy-only entries on the fly. Always
133
+ * returns both shapes populated — the compat layer relies on this.
134
+ */
135
+ export function readRegistry() {
136
+ return migrate(readRegistryFile());
137
+ }
138
+ /**
139
+ * Compat-view accessor: returns the **first** provider for a capability in
140
+ * legacy 5-field shape. PR 3 sub-step 3f deletes this function once all
141
+ * call sites are switched to `getProviderEntry` / `listProviders`.
142
+ */
143
+ export function getCapabilityEntry(capability) {
144
+ const reg = readRegistry();
145
+ // Prefer running providers when more than one candidate exists, so
146
+ // `resolveRequires` (single-candidate fallback) hands consumers the
147
+ // currently usable provider rather than a stale stopped entry.
148
+ const list = reg.providersByCapability?.[capability] ?? [];
149
+ const running = list.find((e) => e.status === "running");
150
+ if (running)
151
+ return toLegacyEntry(running);
152
+ // No running candidate. Don't hand back a `stopped` entry — that would
153
+ // mask `markCapabilitiesStopped`'s intent (see setProviderStatus's
154
+ // legacy-delete branch) and let resolveRequires return a stale URL. An
155
+ // `unknown`-status entry is acceptable as a degraded fallback (e.g.
156
+ // pre-PR 1 registry rows that never carried explicit status).
157
+ const unknown = list.find((e) => e.status !== "stopped");
158
+ if (unknown)
159
+ return toLegacyEntry(unknown);
160
+ // Fall through to the legacy field in case migration missed something.
161
+ return reg.capabilities?.[capability];
162
+ }
163
+ /**
164
+ * Defensive dedup for stored provider lists. Older registry files may
165
+ * contain duplicate `(instanceId, capability)` rows from earlier
166
+ * registration paths that wrote without the current upsert logic — they
167
+ * surface in the UI as ghost candidates with stale `name: null` /
168
+ * mismatched ports. Collapse to the most-recently-registered row, and
169
+ * drop entries that have never been observed running (status="unknown"
170
+ * with no `lastSeenRunningAt`) since those are unambiguous bug residue.
171
+ */
172
+ function dedupeProviderList(list) {
173
+ const cleaned = list.filter((e) => !(e.status === "stopped" && !e.lastSeenRunningAt));
174
+ const byInstance = new Map();
175
+ for (const entry of cleaned) {
176
+ const prev = byInstance.get(entry.instanceId);
177
+ if (!prev) {
178
+ byInstance.set(entry.instanceId, entry);
179
+ continue;
180
+ }
181
+ const prevTs = prev.registeredAt ?? "";
182
+ const curTs = entry.registeredAt ?? "";
183
+ if (curTs >= prevTs)
184
+ byInstance.set(entry.instanceId, entry);
185
+ }
186
+ return Array.from(byInstance.values());
187
+ }
188
+ /**
189
+ * List all providers for a capability. Used by Connections UI candidate
190
+ * dropdown and PR 3 multi-candidate resolution.
191
+ */
192
+ export function listProviders(capability) {
193
+ const reg = readRegistry();
194
+ return dedupeProviderList(reg.providersByCapability?.[capability] ?? []);
195
+ }
196
+ /**
197
+ * Locate a specific provider by composite key. The `(instanceId, capability)`
198
+ * pair is required (v3.1 §5.3) because one instance may publish multiple
199
+ * capabilities (`ollama-binary` provides both `ollama-api` and
200
+ * `ollama-terminal`); `instanceId` alone is not unique.
201
+ */
202
+ export function getProviderEntry(instanceId, capability) {
203
+ return listProviders(capability).find((e) => e.instanceId === instanceId);
204
+ }
205
+ /**
206
+ * Register or update a single provider entry. Writes to both the new
207
+ * `providersByCapability` list and the legacy `capabilities` map (compat
208
+ * layer; PR 3 sub-step 3f drops the legacy write).
209
+ */
210
+ export function registerProvider(entry) {
211
+ const reg = readRegistry();
212
+ const providers = ensureProvidersField(reg);
213
+ const legacy = ensureLegacyField(reg);
214
+ const list = providers[entry.capability] ?? [];
215
+ const existingIdx = list.findIndex((e) => e.instanceId === entry.instanceId);
216
+ if (existingIdx >= 0) {
217
+ list[existingIdx] = entry;
218
+ }
219
+ else {
220
+ list.push(entry);
221
+ }
222
+ providers[entry.capability] = list;
223
+ // Compat write: keep the legacy single-entry view consistent. When more
224
+ // than one provider exists, the legacy field reflects the most recently
225
+ // registered one (matching the previous last-writer-wins behavior).
226
+ legacy[entry.capability] = toLegacyEntry(entry);
227
+ writeRegistryFile(reg);
228
+ }
229
+ /**
230
+ * Mark all providers from a given instance as `stopped` instead of deleting
231
+ * them, so the Connections UI can still show them as candidates (greyed out).
232
+ * Replaces the previous `unregisterCapabilities` semantics on stop (§5.4).
233
+ */
234
+ export function setProviderStatus(instanceId, status) {
235
+ const reg = readRegistry();
236
+ const providers = ensureProvidersField(reg);
237
+ const legacy = ensureLegacyField(reg);
238
+ const now = new Date().toISOString();
239
+ let changed = false;
240
+ for (const [cap, list] of Object.entries(providers)) {
241
+ for (const entry of list) {
242
+ if (entry.instanceId !== instanceId)
243
+ continue;
244
+ if (entry.status === status)
245
+ continue;
246
+ entry.status = status;
247
+ if (status === "running")
248
+ entry.lastSeenRunningAt = now;
249
+ changed = true;
250
+ }
251
+ // Re-sync legacy field: stopped instances lose their legacy entry only
252
+ // if no other running provider remains for that capability, so older
253
+ // resolveRequires call sites keep finding *something* until PR 3.
254
+ const stillRunning = list.find((e) => e.status === "running");
255
+ if (stillRunning) {
256
+ legacy[cap] = toLegacyEntry(stillRunning);
257
+ }
258
+ else if (list.length > 0 && status === "stopped") {
259
+ // No running provider for this capability — drop the legacy entry so
260
+ // resolveRequires throws cleanly instead of handing back a stale URL.
261
+ delete legacy[cap];
262
+ }
263
+ }
264
+ if (changed)
265
+ writeRegistryFile(reg);
266
+ }
267
+ /**
268
+ * Remove all providers for an instance permanently — used for uninstall /
269
+ * delete, NOT for stop (§5.4). After PR 3 sub-step 3c this is the only
270
+ * path that strips entries from the registry.
271
+ */
272
+ export function unregisterProviders(instanceId) {
273
+ const reg = readRegistry();
274
+ const providers = ensureProvidersField(reg);
275
+ const legacy = ensureLegacyField(reg);
276
+ let changed = false;
277
+ for (const cap of Object.keys(providers)) {
278
+ const list = providers[cap];
279
+ const filtered = list.filter((e) => e.instanceId !== instanceId);
280
+ if (filtered.length !== list.length) {
281
+ changed = true;
282
+ if (filtered.length === 0) {
283
+ delete providers[cap];
284
+ }
285
+ else {
286
+ providers[cap] = filtered;
287
+ }
288
+ }
289
+ }
290
+ for (const cap of Object.keys(legacy)) {
291
+ if (legacy[cap].instanceId === instanceId) {
292
+ delete legacy[cap];
293
+ changed = true;
294
+ }
295
+ }
296
+ if (changed)
297
+ writeRegistryFile(reg);
298
+ }
299
+ /**
300
+ * Snapshot of the full registry (read-only). UI / suggestion engine consumes.
301
+ * Same dedup semantics as `listProviders` so callers iterating the snapshot
302
+ * (e.g. category-prefix candidate matching in `routes/instances.ts`) don't
303
+ * leak duplicates.
304
+ */
305
+ export function snapshot() {
306
+ const reg = readRegistry();
307
+ const cleanProviders = {};
308
+ for (const [cap, list] of Object.entries(reg.providersByCapability ?? {})) {
309
+ cleanProviders[cap] = dedupeProviderList(list);
310
+ }
311
+ return { ...reg, providersByCapability: cleanProviders };
312
+ }
313
+ //# sourceMappingURL=capability-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-registry.js","sourceRoot":"","sources":["../../src/services/capability-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Layer 3 — connection apply hooks (§7 of the design).
3
+ *
4
+ * Two parallel tables:
5
+ *
6
+ * - PERSIST_HOOKS: invoked by `PUT /api/instances/:id/connections`.
7
+ * Writes durable state. LLM/proxy-upstream goes through saveInstanceConfig;
8
+ * LLM/openai-env, search, browser, default ENV all go through
9
+ * `ctx.writeConnectionEnv()` — that abstraction routes the env to
10
+ * `instance.runtime.env` for OpenClaw, the Hermes adapter `.env` for
11
+ * Hermes, and `instance.json["connections-env"]` for generic apps.
12
+ * MCP merges into mcporter.json.
13
+ *
14
+ * - RUNTIME_HOOKS: invoked at every start. Returns an env map only;
15
+ * never writes files. nomad-manager merges the result into the task
16
+ * env so the new bindings take effect on restart.
17
+ *
18
+ * Sub-step status: PR 4 implements LLM (both modes), Search, default-ENV.
19
+ * PR 5 lands MCP + Browser.
20
+ */
21
+ import * as capabilityRegistry from "./capability-registry.js";
22
+ import type { CapabilityEntry } from "./capability-registry.js";
23
+ import type { ResolvedConnection } from "./connection-resolver.js";
24
+ import type { AppInstance } from "./types-shim.js";
25
+ export declare function buildHttpBaseUrl(entry: CapabilityEntry, opts?: {
26
+ suffix?: string;
27
+ }): string;
28
+ export declare function buildWsUrl(entry: CapabilityEntry, opts?: {
29
+ suffix?: string;
30
+ }): string;
31
+ export interface ApplyContext {
32
+ registry: typeof capabilityRegistry;
33
+ /**
34
+ * RuntimeAdapter handle for adapter-managed consumers (OpenClaw / Hermes).
35
+ * `null` for generic container apps without an adapter — `writeConnectionEnv`
36
+ * then routes to `instance.json["connections-env"]`.
37
+ */
38
+ adapter: {
39
+ applyConnectionEnv?(instanceId: string, env: Record<string, string>): Promise<void>;
40
+ getConnectionRuntimeEnv?(instanceId: string): Record<string, string>;
41
+ } | null;
42
+ /** Persist env into whichever durable location matches the consumer type. */
43
+ writeConnectionEnv(instance: AppInstance, env: Record<string, string>): Promise<void>;
44
+ }
45
+ export type PersistApplyHook = (instance: AppInstance, binding: ResolvedConnection, ctx: ApplyContext) => Promise<void>;
46
+ export type RuntimeApplyHook = (instance: AppInstance, binding: ResolvedConnection) => Record<string, string> | Promise<Record<string, string>>;
47
+ /**
48
+ * §7 — resolve the auth token for a provider instance at apply time.
49
+ *
50
+ * Returns the bare token string (no "Bearer " prefix — that's the consumer's
51
+ * call to format). Returns `null` when:
52
+ * - entry.auth is absent or kind === "none"
53
+ * - tokenSource refers to data that doesn't exist on disk
54
+ *
55
+ * Supported tokenSource patterns:
56
+ * instance.env.<NAME> → read from `~/.jishushell/instances/<provider-id>/{model.env,provider.env,.env}`
57
+ * instance.config.<path> → read from openclaw.json via dotted path (e.g. "x-jishushell.proxy.token")
58
+ * proxy.token → read llmProxy.getInstanceToken(provider-id)
59
+ */
60
+ export declare function resolveProviderToken(entry: CapabilityEntry): Promise<string | null>;
61
+ export declare const persistLlmConnection: PersistApplyHook;
62
+ export declare const runtimeLlmConnection: RuntimeApplyHook;
63
+ export declare const persistSearchConnection: PersistApplyHook;
64
+ export declare const runtimeSearchConnection: RuntimeApplyHook;
65
+ export declare const persistBrowserConnection: PersistApplyHook;
66
+ export declare const runtimeBrowserConnection: RuntimeApplyHook;
67
+ export declare const persistFilesConnection: PersistApplyHook;
68
+ export declare const runtimeFilesConnection: RuntimeApplyHook;
69
+ export declare const persistDefaultConnection: PersistApplyHook;
70
+ export declare const runtimeDefaultConnection: RuntimeApplyHook;
71
+ export declare const persistMcpConnection: PersistApplyHook;
72
+ export declare const runtimeMcpConnection: RuntimeApplyHook;
73
+ export type UnpersistApplyHook = (instance: AppInstance, slot: string, ctx: ApplyContext) => Promise<void>;
74
+ export declare const PERSIST_HOOKS: Record<string, PersistApplyHook>;
75
+ export declare const UNPERSIST_HOOKS: Record<string, UnpersistApplyHook>;
76
+ export declare const RUNTIME_HOOKS: Record<string, RuntimeApplyHook>;
77
+ /**
78
+ * Re-resolve `connections` for a consumer instance against the live capability
79
+ * registry and render every binding through RUNTIME_HOOKS into a flat env map.
80
+ *
81
+ * Use this at every start (not at PUT time) so that provider port / address
82
+ * changes propagate without requiring the user to re-bind. preCreate mode is
83
+ * used to stay tolerant: a missing required binding is surfaced via the
84
+ * Connections badge, not by failing start with a stale provider URL.
85
+ *
86
+ * Failures are caught and logged — start should never block on env merging.
87
+ */
88
+ export declare function renderRuntimeConnectionsEnv(spec: import("../types.js").AppSpec, instance: {
89
+ id: string;
90
+ connections?: import("../types.js").InstanceConnections;
91
+ }): Promise<Record<string, string>>;