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,281 @@
1
+ /**
2
+ * Layer 2 — resolveConnections (§6.3 of the app interconnection design).
3
+ *
4
+ * Drop-in replacement for the legacy `app-manager.resolveRequires(spec)`.
5
+ * The new function takes both the consumer spec and the consumer instance
6
+ * (so it can read `instance.connections` UI bindings), and runs in one of
7
+ * two modes:
8
+ *
9
+ * - "preCreate": install / create-instance path. The consumer instance
10
+ * does not yet have UI-driven bindings. Only legacy single-candidate
11
+ * fallback resolves; everything else is collected into `pending` and
12
+ * never throws — install completes even if optional providers are
13
+ * missing.
14
+ * - "runtime": startApp path. UI bindings are honored; missing required
15
+ * bindings throw `MISSING_REQUIRED_CONNECTION (412)`; multi-candidate
16
+ * unbound prefix requires throw `AMBIGUOUS_CONNECTION (409)`; mismatched
17
+ * bindings throw `INVALID_BINDING (400)`.
18
+ *
19
+ * The return shape `{ resolved, pending }` lets each caller decide what to
20
+ * do (write env, throw, write to task event for UI display).
21
+ */
22
+ import * as capabilityRegistry from "./capability-registry.js";
23
+ // ── Category whitelist (§4.1) ────────────────────────────────────────────
24
+ const CAPABILITY_CATEGORIES = new Set(["llm", "search", "browser", "mcp", "files", "knowledge"]);
25
+ export function isCategoryToken(s) {
26
+ return CAPABILITY_CATEGORIES.has(s);
27
+ }
28
+ /**
29
+ * Extract the category of a provide-side capability name. Returns the
30
+ * category token ("llm" / "search" / "browser" / "mcp") when the name is
31
+ * `<token>-something`; null for legacy exact names like `ollama-api`.
32
+ */
33
+ export function categoryFromProviderCapability(cap) {
34
+ const dash = cap.indexOf("-");
35
+ if (dash <= 0)
36
+ return null;
37
+ const head = cap.slice(0, dash);
38
+ return CAPABILITY_CATEGORIES.has(head) ? head : null;
39
+ }
40
+ /**
41
+ * For LLM `proxy-upstream` mode: convert a provide capability like
42
+ * `llm-ollama` to the providerKind token (`ollama` / `vllm` / `sglang` /
43
+ * `custom`) the embedded llm-proxy expects on `x-jishushell.proxy.upstream.providerId`.
44
+ */
45
+ export function providerKindFromCapability(cap) {
46
+ const m = cap.match(/^llm-(ollama|vllm|sglang)$/);
47
+ if (m)
48
+ return m[1];
49
+ return "custom";
50
+ }
51
+ // ── Errors with stable code field ────────────────────────────────────────
52
+ export class ConnectionError extends Error {
53
+ code;
54
+ statusCode;
55
+ details;
56
+ constructor(code, statusCode, message, details) {
57
+ super(message);
58
+ this.code = code;
59
+ this.statusCode = statusCode;
60
+ if (details)
61
+ this.details = details;
62
+ }
63
+ }
64
+ // ── validateBoundEntries (§6.3) ──────────────────────────────────────────
65
+ function reqMatchesEntry(req, entry) {
66
+ if (isCategoryToken(req.capability)) {
67
+ // Prefix-match: `llm` matches `llm-ollama` / `llm-vllm` etc.
68
+ return entry.capability === req.capability ||
69
+ entry.capability.startsWith(req.capability + "-");
70
+ }
71
+ // Exact match for legacy bindable names.
72
+ return entry.capability === req.capability;
73
+ }
74
+ function validateBoundEntries(req, entries) {
75
+ const cardinality = req.cardinality ?? "one";
76
+ for (const entry of entries) {
77
+ if (!reqMatchesEntry(req, entry)) {
78
+ throw new ConnectionError("INVALID_BINDING", 400, `Slot '${req.inject_as}' bound to provider '${entry.instanceId}' with capability '${entry.capability}', which does not match require '${req.capability}'`, { slot: req.inject_as, expected: req.capability, got: entry.capability });
79
+ }
80
+ }
81
+ if (cardinality === "one" && entries.length !== 1) {
82
+ throw new ConnectionError("INVALID_BINDING", 400, `Slot '${req.inject_as}' has cardinality:one but ${entries.length} providers bound`, { slot: req.inject_as, count: entries.length });
83
+ }
84
+ if (cardinality === "many" && entries.length === 0) {
85
+ throw new ConnectionError("INVALID_BINDING", 400, `Slot '${req.inject_as}' has cardinality:many but no providers bound`, { slot: req.inject_as });
86
+ }
87
+ }
88
+ // ── Helpers for category derivation ─────────────────────────────────────
89
+ function categoryFor(req, entries) {
90
+ if (isCategoryToken(req.capability))
91
+ return req.capability;
92
+ // Legacy exact require: derive from first entry's provide capability.
93
+ for (const e of entries) {
94
+ const cat = categoryFromProviderCapability(e.capability);
95
+ if (cat)
96
+ return cat;
97
+ }
98
+ return "default";
99
+ }
100
+ // ── Main API ─────────────────────────────────────────────────────────────
101
+ /**
102
+ * Resolve all `requires` on `spec` against the registry + the instance's
103
+ * persisted bindings.
104
+ *
105
+ * @param spec Consumer app spec (`requires[]` is the input)
106
+ * @param instance Consumer app instance shape — may be a stub
107
+ * `{ connections: {} }` during create-instance / install
108
+ * (preCreate mode) or the live instance.json (runtime).
109
+ * @param mode Affects error semantics: preCreate never throws on
110
+ * missing/ambiguous; runtime throws.
111
+ */
112
+ export function resolveConnections(spec, instance, mode) {
113
+ const resolved = [];
114
+ const pending = [];
115
+ if (!spec.requires || spec.requires.length === 0) {
116
+ return { resolved, pending };
117
+ }
118
+ const connectionsMap = instance.connections ?? {};
119
+ for (const req of spec.requires) {
120
+ const isRequired = req.required !== false;
121
+ const cardinality = req.cardinality ?? "one";
122
+ const persisted = connectionsMap[req.inject_as];
123
+ // ── User explicit disconnect ───────────────────────────────────────
124
+ if (persisted === null) {
125
+ if (isRequired && mode === "runtime") {
126
+ throw new ConnectionError("MISSING_REQUIRED_CONNECTION", 412, `Required connection '${req.inject_as}' (${req.capability}) is explicitly disconnected`, { slot: req.inject_as, capability: req.capability });
127
+ }
128
+ pending.push({
129
+ slot: req.inject_as,
130
+ capability: req.capability,
131
+ required: isRequired,
132
+ reason: "user-disconnected",
133
+ });
134
+ continue;
135
+ }
136
+ // ── User-driven binding (UI) ───────────────────────────────────────
137
+ if (persisted) {
138
+ const entries = collectEntriesFromBinding(persisted);
139
+ validateBoundEntries(req, entries);
140
+ // Status check (running) — preCreate skips since instance not yet
141
+ // alive, runtime requires running provider.
142
+ if (mode === "runtime") {
143
+ for (const entry of entries) {
144
+ if (entry.status !== "running") {
145
+ throw new ConnectionError("PROVIDER_NOT_RUNNING", 409, `Provider '${entry.instanceId}' for slot '${req.inject_as}' is not running (status=${entry.status})`, { slot: req.inject_as, providerId: entry.instanceId, status: entry.status });
146
+ }
147
+ }
148
+ }
149
+ resolved.push({
150
+ slot: req.inject_as,
151
+ capability: req.capability,
152
+ category: categoryFor(req, entries),
153
+ required: isRequired,
154
+ apply: req.apply,
155
+ cardinality,
156
+ entries,
157
+ source: "ui-binding",
158
+ });
159
+ continue;
160
+ }
161
+ // ── No persisted binding — try legacy single-candidate fallback ────
162
+ // Legacy exact require with a single registered provider auto-resolves
163
+ // (this preserves the meta-app "open the box and it works" UX). Prefix
164
+ // requires with multiple candidates always fall through to pending /
165
+ // throw — the user must pick.
166
+ if (!isCategoryToken(req.capability)) {
167
+ const list = capabilityRegistry.listProviders(req.capability);
168
+ const running = list.filter((e) => e.status === "running");
169
+ if (running.length === 1) {
170
+ resolved.push({
171
+ slot: req.inject_as,
172
+ capability: req.capability,
173
+ category: categoryFor(req, running),
174
+ required: isRequired,
175
+ apply: req.apply,
176
+ cardinality,
177
+ entries: [running[0]],
178
+ source: "legacy-fallback",
179
+ });
180
+ continue;
181
+ }
182
+ if (running.length > 1) {
183
+ if (isRequired && mode === "runtime") {
184
+ throw new ConnectionError("AMBIGUOUS_CONNECTION", 409, `Slot '${req.inject_as}' (${req.capability}) has ${running.length} candidates; user must pick one in Connections tab`, { slot: req.inject_as, capability: req.capability, count: running.length });
185
+ }
186
+ pending.push({
187
+ slot: req.inject_as,
188
+ capability: req.capability,
189
+ required: isRequired,
190
+ reason: "ambiguous",
191
+ });
192
+ continue;
193
+ }
194
+ // No candidates running for legacy exact name.
195
+ }
196
+ else {
197
+ // Prefix-semantic require — never auto-fall-back, always require UI.
198
+ const candidates = enumerateCandidatesForPrefix(req.capability);
199
+ if (candidates.length > 0) {
200
+ // We have providers but none bound — UI selection required.
201
+ if (isRequired && mode === "runtime") {
202
+ throw new ConnectionError("USER_SELECTION_REQUIRED", 409, `Required prefix slot '${req.inject_as}' (${req.capability}) has ${candidates.length} candidate(s); user must bind in Connections tab`, { slot: req.inject_as, capability: req.capability, count: candidates.length });
203
+ }
204
+ pending.push({
205
+ slot: req.inject_as,
206
+ capability: req.capability,
207
+ required: isRequired,
208
+ reason: "needs-ui-binding",
209
+ });
210
+ continue;
211
+ }
212
+ }
213
+ // No candidates at all.
214
+ if (isRequired && mode === "runtime") {
215
+ throw new ConnectionError("MISSING_REQUIRED_CONNECTION", 412, `Required connection '${req.inject_as}' (${req.capability}) has no candidates`, { slot: req.inject_as, capability: req.capability });
216
+ }
217
+ pending.push({
218
+ slot: req.inject_as,
219
+ capability: req.capability,
220
+ required: isRequired,
221
+ reason: "no-candidate",
222
+ });
223
+ }
224
+ return { resolved, pending };
225
+ }
226
+ function collectEntriesFromBinding(binding) {
227
+ if (!binding)
228
+ return [];
229
+ if (binding.kind === "single") {
230
+ const entry = capabilityRegistry.getProviderEntry(binding.providerId, binding.capability);
231
+ if (entry)
232
+ return [entry];
233
+ throw new ConnectionError("INVALID_PROVIDER_ID", 400, `Bound providerId '${binding.providerId}' (capability '${binding.capability}') not found in registry`, { providerId: binding.providerId, capability: binding.capability });
234
+ }
235
+ // many
236
+ const entries = [];
237
+ const missing = [];
238
+ for (const ref of binding.providers ?? []) {
239
+ const entry = capabilityRegistry.getProviderEntry(ref.providerId, ref.capability);
240
+ if (entry)
241
+ entries.push(entry);
242
+ else
243
+ missing.push(ref);
244
+ }
245
+ if (missing.length > 0) {
246
+ throw new ConnectionError("INVALID_PROVIDER_ID", 400, `${missing.length} bound providers not found in registry`, { missing });
247
+ }
248
+ return entries;
249
+ }
250
+ function enumerateCandidatesForPrefix(prefixToken) {
251
+ // Walk the registry snapshot and gather any entry whose capability name
252
+ // starts with `<prefixToken>-`.
253
+ const file = capabilityRegistry.snapshot();
254
+ const out = [];
255
+ const map = file.providersByCapability ?? {};
256
+ for (const [cap, list] of Object.entries(map)) {
257
+ if (cap.startsWith(prefixToken + "-") || cap === prefixToken) {
258
+ out.push(...list);
259
+ }
260
+ }
261
+ return out;
262
+ }
263
+ /**
264
+ * Convenience helper: resolved → flat env map (for default-ENV legacy
265
+ * fallback path used in install Phase 1, see §6.4 lazy materialization).
266
+ * Only entries with category=="default" are projected; LLM/MCP/Search/Browser
267
+ * categories use their own apply hooks (PR 4) and are skipped here.
268
+ */
269
+ export function resolvedToLegacyEnv(resolved) {
270
+ const out = {};
271
+ for (const r of resolved) {
272
+ if (r.category !== "default")
273
+ continue;
274
+ if (r.entries.length === 0)
275
+ continue;
276
+ // For multi-entry default ENV: join addresses with comma (rare path).
277
+ out[r.slot] = r.entries.map((e) => e.address).join(",");
278
+ }
279
+ return out;
280
+ }
281
+ //# sourceMappingURL=connection-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-resolver.js","sourceRoot":"","sources":["../../src/services/connection-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { ResolvedConnection } from "./connection-resolver.js";
2
+ import type { ApplyContext } from "./connection-apply.js";
3
+ import type { AppSpec, InstanceConnections } from "../types.js";
4
+ import type { AppInstance } from "./types-shim.js";
5
+ export interface TransactorInput {
6
+ instance: AppInstance;
7
+ spec: AppSpec;
8
+ newConnections: InstanceConnections;
9
+ /** Persist instance.json — supplied by caller (route handler). */
10
+ saveInstanceJson: (id: string, mutator: (cur: AppInstance) => AppInstance) => Promise<void>;
11
+ readInstanceJson: (id: string) => Promise<AppInstance>;
12
+ /** RuntimeAdapter for adapter-managed consumers; null for generic apps. */
13
+ adapter: ApplyContext["adapter"];
14
+ }
15
+ export interface TransactorResult {
16
+ resolved: ResolvedConnection[];
17
+ }
18
+ /**
19
+ * Raw-bytes snapshot of a side-effect file. `bytes === null` means the file
20
+ * did not exist at snapshot time — rollback should `unlink` it.
21
+ */
22
+ interface FileSnapshot {
23
+ path: string;
24
+ bytes: Buffer | null;
25
+ /** Set when the file existed but could not be read (e.g. EACCES). Rollback skips these entries to avoid destroying data. */
26
+ readError?: boolean;
27
+ }
28
+ export declare function applyConnections(input: TransactorInput): Promise<TransactorResult>;
29
+ /**
30
+ * Test-only export so unit tests can exercise the snapshot/restore path
31
+ * without spinning up the full transactor. Production code should not
32
+ * import these names directly.
33
+ */
34
+ export declare const __testing__: {
35
+ snapshotSideEffectFiles: (instanceId: string) => FileSnapshot[];
36
+ applyFileSnapshots: (snapshots: FileSnapshot[]) => void;
37
+ validateResolvedEndpoints: (resolved: ResolvedConnection[]) => Promise<void>;
38
+ };
39
+ export {};