jishushell 0.4.24 → 0.4.30
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/INSTALL-NOTICE +11 -0
- package/apps/browserless-chromium-container.yaml +78 -0
- package/apps/hermes-container.yaml +36 -2
- package/apps/ollama-binary.yaml +91 -90
- package/apps/ollama-cpu-container.yaml +8 -1
- package/apps/ollama-with-hollama-binary.yaml +91 -90
- package/apps/openclaw-binary.yaml +30 -1
- package/apps/openclaw-container.yaml +37 -2
- package/apps/openclaw-with-ollama-container.yaml +11 -2
- package/apps/openclaw-with-searxng-container.yaml +22 -2
- package/apps/openwebui-container.yaml +45 -1
- package/apps/playwright-container.yaml +7 -1
- package/apps/searxng-container.yaml +54 -4
- package/dist/cli/app.js +79 -9
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/doctor.d.ts +12 -12
- package/dist/cli/doctor.js +242 -55
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/llm.d.ts +4 -3
- package/dist/cli/llm.js +4 -3
- package/dist/cli/llm.js.map +1 -1
- package/dist/cli/panel.d.ts +6 -5
- package/dist/cli/panel.js +10 -9
- package/dist/cli/panel.js.map +1 -1
- package/dist/control.d.ts +7 -6
- package/dist/control.js +7 -6
- package/dist/control.js.map +1 -1
- package/dist/routes/agent-apps.d.ts +1 -1
- package/dist/routes/agent-apps.js +1 -1
- package/dist/routes/apps.js +44 -11
- package/dist/routes/apps.js.map +1 -1
- package/dist/routes/auth.js +3 -0
- package/dist/routes/auth.js.map +1 -1
- package/dist/routes/instances.js +787 -16
- package/dist/routes/instances.js.map +1 -1
- package/dist/routes/llm.js +24 -35
- package/dist/routes/llm.js.map +1 -1
- package/dist/routes/setup.js +1 -1
- package/dist/routes/setup.js.map +1 -1
- package/dist/server.d.ts +9 -0
- package/dist/server.js +410 -17
- package/dist/server.js.map +1 -1
- package/dist/services/agent-apps/catalog.js +4 -3
- package/dist/services/agent-apps/catalog.js.map +1 -1
- package/dist/services/agent-apps/index.d.ts +1 -1
- package/dist/services/agent-apps/index.js +1 -1
- package/dist/services/agent-apps/installers/adapter.d.ts +1 -1
- package/dist/services/agent-apps/installers/adapter.js +1 -1
- package/dist/services/agent-apps/installers/shell-script.d.ts +1 -1
- package/dist/services/agent-apps/installers/shell-script.js +3 -3
- package/dist/services/agent-apps/installers/shell-script.js.map +1 -1
- package/dist/services/agent-apps/types.d.ts +2 -2
- package/dist/services/agent-apps/types.js +1 -1
- package/dist/services/app/app-manager.d.ts +24 -1
- package/dist/services/app/app-manager.js +664 -116
- package/dist/services/app/app-manager.js.map +1 -1
- package/dist/services/app/hermes-agent-manager.js +6 -4
- package/dist/services/app/hermes-agent-manager.js.map +1 -1
- package/dist/services/app/provide-resolver.d.ts +29 -0
- package/dist/services/app/provide-resolver.js +112 -0
- package/dist/services/app/provide-resolver.js.map +1 -0
- package/dist/services/capability-endpoint-validator.d.ts +41 -0
- package/dist/services/capability-endpoint-validator.js +104 -0
- package/dist/services/capability-endpoint-validator.js.map +1 -0
- package/dist/services/capability-health.d.ts +16 -0
- package/dist/services/capability-health.js +121 -0
- package/dist/services/capability-health.js.map +1 -0
- package/dist/services/capability-registry.d.ts +106 -0
- package/dist/services/capability-registry.js +313 -0
- package/dist/services/capability-registry.js.map +1 -0
- package/dist/services/connection-apply.d.ts +89 -0
- package/dist/services/connection-apply.js +421 -0
- package/dist/services/connection-apply.js.map +1 -0
- package/dist/services/connection-resolver.d.ts +65 -0
- package/dist/services/connection-resolver.js +281 -0
- package/dist/services/connection-resolver.js.map +1 -0
- package/dist/services/connection-transactor.d.ts +37 -0
- package/dist/services/connection-transactor.js +341 -0
- package/dist/services/connection-transactor.js.map +1 -0
- package/dist/services/instance-manager.d.ts +13 -0
- package/dist/services/instance-manager.js +137 -23
- package/dist/services/instance-manager.js.map +1 -1
- package/dist/services/llm-proxy/index.d.ts +16 -2
- package/dist/services/llm-proxy/index.js +48 -44
- package/dist/services/llm-proxy/index.js.map +1 -1
- package/dist/services/llm-proxy/probe.d.ts +6 -0
- package/dist/services/llm-proxy/probe.js +85 -0
- package/dist/services/llm-proxy/probe.js.map +1 -0
- package/dist/services/llm-proxy/ssrf.d.ts +1 -0
- package/dist/services/llm-proxy/ssrf.js +18 -7
- package/dist/services/llm-proxy/ssrf.js.map +1 -1
- package/dist/services/nomad-manager.js +375 -16
- package/dist/services/nomad-manager.js.map +1 -1
- package/dist/services/process-manager.js +1 -1
- package/dist/services/process-manager.js.map +1 -1
- package/dist/services/runtime/adapters/hermes.d.ts +30 -1
- package/dist/services/runtime/adapters/hermes.js +218 -5
- package/dist/services/runtime/adapters/hermes.js.map +1 -1
- package/dist/services/runtime/adapters/openclaw-mcporter.d.ts +45 -0
- package/dist/services/runtime/adapters/openclaw-mcporter.js +108 -0
- package/dist/services/runtime/adapters/openclaw-mcporter.js.map +1 -0
- package/dist/services/runtime/adapters/openclaw.d.ts +87 -0
- package/dist/services/runtime/adapters/openclaw.js +250 -2
- package/dist/services/runtime/adapters/openclaw.js.map +1 -1
- package/dist/services/runtime/mcp-shims/firewall.d.ts +26 -0
- package/dist/services/runtime/mcp-shims/firewall.js +129 -0
- package/dist/services/runtime/mcp-shims/firewall.js.map +1 -0
- package/dist/services/runtime/mcp-shims/searxng-shim.d.ts +27 -0
- package/dist/services/runtime/mcp-shims/searxng-shim.js +125 -0
- package/dist/services/runtime/mcp-shims/searxng-shim.js.map +1 -0
- package/dist/services/runtime/mcp-shims/write-mcp-entry.d.ts +83 -0
- package/dist/services/runtime/mcp-shims/write-mcp-entry.js +127 -0
- package/dist/services/runtime/mcp-shims/write-mcp-entry.js.map +1 -0
- package/dist/services/runtime/migrations.d.ts +8 -0
- package/dist/services/runtime/migrations.js +100 -0
- package/dist/services/runtime/migrations.js.map +1 -1
- package/dist/services/runtime/types.d.ts +15 -0
- package/dist/services/setup-manager.js +6 -6
- package/dist/services/setup-manager.js.map +1 -1
- package/dist/services/suggestions.d.ts +27 -0
- package/dist/services/suggestions.js +133 -0
- package/dist/services/suggestions.js.map +1 -0
- package/dist/services/task-registry.js +4 -2
- package/dist/services/task-registry.js.map +1 -1
- package/dist/services/telemetry/device-fingerprint.d.ts +1 -1
- package/dist/services/telemetry/device-fingerprint.js +1 -1
- package/dist/services/types-shim.d.ts +16 -0
- package/dist/services/types-shim.js +2 -0
- package/dist/services/types-shim.js.map +1 -0
- package/dist/types.d.ts +171 -1
- package/dist/utils/instance-lock.d.ts +22 -0
- package/dist/utils/instance-lock.js +48 -0
- package/dist/utils/instance-lock.js.map +1 -0
- package/dist/utils/safe-json.js +55 -22
- package/dist/utils/safe-json.js.map +1 -1
- package/install/jishu-install.sh +323 -27
- package/install/jishu-uninstall.sh +353 -20
- package/package.json +3 -1
- package/public/assets/Dashboard-rkWp-CXd.js +1 -0
- package/public/assets/{HermesChatPanel-mFSureyc.js → HermesChatPanel-_GHoklgo.js} +1 -1
- package/public/assets/HermesConfigForm-anDnwUp_.js +4 -0
- package/public/assets/{InitPassword-CVA8wQA6.js → InitPassword-ZU9_-hDr.js} +1 -1
- package/public/assets/InstanceDetail-CN0FH1aw.js +92 -0
- package/public/assets/{Login-BWsZH2mu.js → Login-BItXqYAJ.js} +1 -1
- package/public/assets/NewInstance-BousE6kY.js +1 -0
- package/public/assets/ProviderRecommendations-DFYj7Fb6.js +1 -0
- package/public/assets/Settings-Bttc6QmM.js +1 -0
- package/public/assets/Setup-Bsxx1zgj.js +1 -0
- package/public/assets/{WeixinLoginPanel-CnjR8xMu.js → WeixinLoginPanel-DPZpAKgO.js} +2 -2
- package/public/assets/index-8xZy1z5k.css +1 -0
- package/public/assets/index-Dw3HhUYE.js +19 -0
- package/public/assets/providers-DtNXh9JD.js +1 -0
- package/public/assets/registry-5s2UB6is.js +2 -0
- package/public/index.html +2 -2
- package/scripts/check-app-spec.mjs +443 -0
- package/scripts/check-i18n.mjs +154 -0
- package/scripts/run.sh +4 -4
- package/public/assets/Dashboard-B-JoOjBQ.js +0 -1
- package/public/assets/HermesConfigForm-DvR05LK1.js +0 -4
- package/public/assets/InstanceDetail-DcZW2QGO.js +0 -91
- package/public/assets/NewInstance-BCIrAd86.js +0 -1
- package/public/assets/Settings-xkDcduFz.js +0 -1
- package/public/assets/Setup-Cfuwj4gV.js +0 -1
- package/public/assets/index-CPhVFEsx.css +0 -1
- package/public/assets/index-DQsM6Joa.js +0 -19
- package/public/assets/providers-V-vwrExZ.js +0 -1
- 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"]);
|
|
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,37 @@
|
|
|
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
|
+
}
|
|
26
|
+
export declare function applyConnections(input: TransactorInput): Promise<TransactorResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Test-only export so unit tests can exercise the snapshot/restore path
|
|
29
|
+
* without spinning up the full transactor. Production code should not
|
|
30
|
+
* import these names directly.
|
|
31
|
+
*/
|
|
32
|
+
export declare const __testing__: {
|
|
33
|
+
snapshotSideEffectFiles: (instanceId: string) => FileSnapshot[];
|
|
34
|
+
applyFileSnapshots: (snapshots: FileSnapshot[]) => void;
|
|
35
|
+
validateResolvedEndpoints: (resolved: ResolvedConnection[]) => Promise<void>;
|
|
36
|
+
};
|
|
37
|
+
export {};
|