@lobu/cli 5.0.0 → 6.0.0
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/README.md +11 -26
- package/dist/__tests__/chat.integration.test.js +19 -19
- package/dist/__tests__/chat.integration.test.js.map +1 -1
- package/dist/__tests__/dev.test.d.ts +2 -0
- package/dist/__tests__/dev.test.d.ts.map +1 -0
- package/dist/__tests__/dev.test.js +25 -0
- package/dist/__tests__/dev.test.js.map +1 -0
- package/dist/__tests__/init-memory.test.js +1 -14
- package/dist/__tests__/init-memory.test.js.map +1 -1
- package/dist/__tests__/token.test.d.ts +2 -0
- package/dist/__tests__/token.test.d.ts.map +1 -0
- package/dist/__tests__/token.test.js +52 -0
- package/dist/__tests__/token.test.js.map +1 -0
- package/dist/bundled-skills/lobu/SKILL.md +95 -7
- package/dist/commands/_lib/apply/__tests__/client.test.d.ts +2 -0
- package/dist/commands/_lib/apply/__tests__/client.test.d.ts.map +1 -0
- package/dist/commands/_lib/apply/__tests__/client.test.js +23 -0
- package/dist/commands/_lib/apply/__tests__/client.test.js.map +1 -0
- package/dist/commands/_lib/apply/__tests__/desired-state.test.d.ts +2 -0
- package/dist/commands/_lib/apply/__tests__/desired-state.test.d.ts.map +1 -0
- package/dist/commands/_lib/apply/__tests__/desired-state.test.js +140 -0
- package/dist/commands/_lib/apply/__tests__/desired-state.test.js.map +1 -0
- package/dist/commands/_lib/apply/__tests__/diff.test.d.ts +2 -0
- package/dist/commands/_lib/apply/__tests__/diff.test.d.ts.map +1 -0
- package/dist/commands/_lib/apply/__tests__/diff.test.js +378 -0
- package/dist/commands/_lib/apply/__tests__/diff.test.js.map +1 -0
- package/dist/commands/_lib/apply/apply-cmd.d.ts +12 -0
- package/dist/commands/_lib/apply/apply-cmd.d.ts.map +1 -0
- package/dist/commands/_lib/apply/apply-cmd.js +183 -0
- package/dist/commands/_lib/apply/apply-cmd.js.map +1 -0
- package/dist/commands/_lib/apply/client.d.ts +130 -0
- package/dist/commands/_lib/apply/client.d.ts.map +1 -0
- package/dist/commands/_lib/apply/client.js +243 -0
- package/dist/commands/_lib/apply/client.js.map +1 -0
- package/dist/commands/_lib/apply/desired-state.d.ts +71 -0
- package/dist/commands/_lib/apply/desired-state.d.ts.map +1 -0
- package/dist/commands/_lib/apply/desired-state.js +600 -0
- package/dist/commands/_lib/apply/desired-state.js.map +1 -0
- package/dist/commands/_lib/apply/diff.d.ts +76 -0
- package/dist/commands/_lib/apply/diff.d.ts.map +1 -0
- package/dist/commands/_lib/apply/diff.js +323 -0
- package/dist/commands/_lib/apply/diff.js.map +1 -0
- package/dist/commands/_lib/apply/prompt.d.ts +13 -0
- package/dist/commands/_lib/apply/prompt.d.ts.map +1 -0
- package/dist/commands/_lib/apply/prompt.js +19 -0
- package/dist/commands/_lib/apply/prompt.js.map +1 -0
- package/dist/commands/_lib/apply/render.d.ts +9 -0
- package/dist/commands/_lib/apply/render.d.ts.map +1 -0
- package/dist/commands/_lib/apply/render.js +92 -0
- package/dist/commands/_lib/apply/render.js.map +1 -0
- package/dist/commands/agent.d.ts +27 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +111 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/apply.d.ts +3 -0
- package/dist/commands/apply.d.ts.map +1 -0
- package/dist/commands/apply.js +5 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +5 -5
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/dev.d.ts +8 -3
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +128 -124
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/doctor.d.ts +6 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +75 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/eval.d.ts +1 -0
- package/dist/commands/eval.d.ts.map +1 -1
- package/dist/commands/eval.js +7 -4
- package/dist/commands/eval.js.map +1 -1
- package/dist/commands/init.d.ts +2 -9
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +34 -248
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts +11 -3
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +109 -251
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts.map +1 -1
- package/dist/commands/logout.js +12 -11
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/memory/_lib/agent-detect.d.ts +9 -0
- package/dist/commands/memory/_lib/agent-detect.d.ts.map +1 -0
- package/dist/commands/memory/_lib/agent-detect.js +82 -0
- package/dist/commands/memory/_lib/agent-detect.js.map +1 -0
- package/dist/commands/memory/_lib/browser-auth-cmd.d.ts +19 -0
- package/dist/commands/memory/_lib/browser-auth-cmd.d.ts.map +1 -0
- package/dist/commands/memory/_lib/browser-auth-cmd.js +635 -0
- package/dist/commands/memory/_lib/browser-auth-cmd.js.map +1 -0
- package/dist/commands/memory/_lib/browser.d.ts +2 -0
- package/dist/commands/memory/_lib/browser.d.ts.map +1 -0
- package/dist/commands/memory/_lib/browser.js +26 -0
- package/dist/commands/memory/_lib/browser.js.map +1 -0
- package/dist/commands/memory/_lib/errors.d.ts +13 -0
- package/dist/commands/memory/_lib/errors.d.ts.map +1 -0
- package/dist/commands/memory/_lib/errors.js +23 -0
- package/dist/commands/memory/_lib/errors.js.map +1 -0
- package/dist/commands/memory/_lib/init-wizard.d.ts +12 -0
- package/dist/commands/memory/_lib/init-wizard.d.ts.map +1 -0
- package/dist/commands/memory/_lib/init-wizard.js +182 -0
- package/dist/commands/memory/_lib/init-wizard.js.map +1 -0
- package/dist/commands/memory/_lib/install-targets.d.ts +15 -0
- package/dist/commands/memory/_lib/install-targets.d.ts.map +1 -0
- package/dist/commands/memory/_lib/install-targets.js +209 -0
- package/dist/commands/memory/_lib/install-targets.js.map +1 -0
- package/dist/commands/memory/_lib/mcp.d.ts +20 -0
- package/dist/commands/memory/_lib/mcp.d.ts.map +1 -0
- package/dist/commands/memory/_lib/mcp.js +182 -0
- package/dist/commands/memory/_lib/mcp.js.map +1 -0
- package/dist/commands/memory/_lib/openclaw-auth.d.ts +41 -0
- package/dist/commands/memory/_lib/openclaw-auth.d.ts.map +1 -0
- package/dist/commands/memory/_lib/openclaw-auth.js +133 -0
- package/dist/commands/memory/_lib/openclaw-auth.js.map +1 -0
- package/dist/commands/memory/_lib/openclaw-auth.test.d.ts +2 -0
- package/dist/commands/memory/_lib/openclaw-auth.test.d.ts.map +1 -0
- package/dist/commands/memory/_lib/openclaw-auth.test.js +9 -0
- package/dist/commands/memory/_lib/openclaw-auth.test.js.map +1 -0
- package/dist/commands/memory/_lib/openclaw-cmd.d.ts +15 -0
- package/dist/commands/memory/_lib/openclaw-cmd.d.ts.map +1 -0
- package/dist/commands/memory/_lib/openclaw-cmd.js +208 -0
- package/dist/commands/memory/_lib/openclaw-cmd.js.map +1 -0
- package/dist/commands/memory/_lib/output.d.ts +5 -0
- package/dist/commands/memory/_lib/output.d.ts.map +1 -0
- package/dist/commands/memory/_lib/output.js +17 -0
- package/dist/commands/memory/_lib/output.js.map +1 -0
- package/dist/commands/memory/_lib/schema.d.ts +93 -0
- package/dist/commands/memory/_lib/schema.d.ts.map +1 -0
- package/dist/commands/memory/_lib/schema.js +192 -0
- package/dist/commands/memory/_lib/schema.js.map +1 -0
- package/dist/commands/memory/_lib/seed-cmd.d.ts +9 -0
- package/dist/commands/memory/_lib/seed-cmd.d.ts.map +1 -0
- package/dist/commands/memory/_lib/seed-cmd.js +516 -0
- package/dist/commands/memory/_lib/seed-cmd.js.map +1 -0
- package/dist/commands/memory/browser-auth.d.ts +3 -0
- package/dist/commands/memory/browser-auth.d.ts.map +1 -0
- package/dist/commands/memory/browser-auth.js +5 -0
- package/dist/commands/memory/browser-auth.js.map +1 -0
- package/dist/commands/memory/configure.d.ts +3 -0
- package/dist/commands/memory/configure.d.ts.map +1 -0
- package/dist/commands/memory/configure.js +5 -0
- package/dist/commands/memory/configure.js.map +1 -0
- package/dist/commands/memory/health.d.ts +3 -0
- package/dist/commands/memory/health.d.ts.map +1 -0
- package/dist/commands/memory/health.js +5 -0
- package/dist/commands/memory/health.js.map +1 -0
- package/dist/commands/memory/init.d.ts +8 -0
- package/dist/commands/memory/init.d.ts.map +1 -0
- package/dist/commands/memory/init.js +65 -0
- package/dist/commands/memory/init.js.map +1 -0
- package/dist/commands/memory/org.d.ts +7 -0
- package/dist/commands/memory/org.d.ts.map +1 -0
- package/dist/commands/memory/org.js +22 -0
- package/dist/commands/memory/org.js.map +1 -0
- package/dist/commands/memory/run.d.ts +8 -0
- package/dist/commands/memory/run.d.ts.map +1 -0
- package/dist/commands/memory/run.js +58 -0
- package/dist/commands/memory/run.js.map +1 -0
- package/dist/commands/memory/seed.d.ts +3 -0
- package/dist/commands/memory/seed.d.ts.map +1 -0
- package/dist/commands/memory/seed.js +5 -0
- package/dist/commands/memory/seed.js.map +1 -0
- package/dist/commands/org.d.ts +10 -0
- package/dist/commands/org.d.ts.map +1 -0
- package/dist/commands/org.js +34 -0
- package/dist/commands/org.js.map +1 -0
- package/dist/commands/{connections/platforms.d.ts → platforms/platform-prompts.d.ts} +5 -5
- package/dist/commands/platforms/platform-prompts.d.ts.map +1 -0
- package/dist/commands/{connections/platforms.js → platforms/platform-prompts.js} +24 -24
- package/dist/commands/platforms/platform-prompts.js.map +1 -0
- package/dist/commands/status.d.ts +4 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +15 -84
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/token.d.ts +17 -0
- package/dist/commands/token.d.ts.map +1 -0
- package/dist/commands/token.js +55 -0
- package/dist/commands/token.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +303 -88
- package/dist/index.js.map +1 -1
- package/dist/internal/__tests__/api-client.test.d.ts +2 -0
- package/dist/internal/__tests__/api-client.test.d.ts.map +1 -0
- package/dist/internal/__tests__/api-client.test.js +95 -0
- package/dist/internal/__tests__/api-client.test.js.map +1 -0
- package/dist/internal/__tests__/context.test.d.ts +2 -0
- package/dist/internal/__tests__/context.test.d.ts.map +1 -0
- package/dist/internal/__tests__/context.test.js +77 -0
- package/dist/internal/__tests__/context.test.js.map +1 -0
- package/dist/internal/api-client.d.ts +39 -0
- package/dist/internal/api-client.d.ts.map +1 -0
- package/dist/internal/api-client.js +217 -0
- package/dist/internal/api-client.js.map +1 -0
- package/dist/internal/context.d.ts +10 -1
- package/dist/internal/context.d.ts.map +1 -1
- package/dist/internal/context.js +109 -2
- package/dist/internal/context.js.map +1 -1
- package/dist/internal/credentials.d.ts +12 -2
- package/dist/internal/credentials.d.ts.map +1 -1
- package/dist/internal/credentials.js +47 -54
- package/dist/internal/credentials.js.map +1 -1
- package/dist/internal/gateway-url.d.ts +4 -4
- package/dist/internal/gateway-url.d.ts.map +1 -1
- package/dist/internal/gateway-url.js +6 -5
- package/dist/internal/gateway-url.js.map +1 -1
- package/dist/internal/index.d.ts +5 -3
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +3 -2
- package/dist/internal/index.js.map +1 -1
- package/dist/internal/local-env.d.ts +2 -0
- package/dist/internal/local-env.d.ts.map +1 -0
- package/dist/internal/local-env.js +32 -0
- package/dist/internal/local-env.js.map +1 -0
- package/dist/internal/oauth.d.ts +82 -0
- package/dist/internal/oauth.d.ts.map +1 -0
- package/dist/internal/oauth.js +234 -0
- package/dist/internal/oauth.js.map +1 -0
- package/dist/server.bundle.mjs +72219 -0
- package/dist/templates/.env.tmpl +7 -3
- package/dist/templates/README.md.tmpl +20 -53
- package/package.json +60 -6
- package/dist/__tests__/skills.test.d.ts +0 -2
- package/dist/__tests__/skills.test.d.ts.map +0 -1
- package/dist/__tests__/skills.test.js +0 -33
- package/dist/__tests__/skills.test.js.map +0 -1
- package/dist/commands/connections/add.d.ts +0 -2
- package/dist/commands/connections/add.d.ts.map +0 -1
- package/dist/commands/connections/add.js +0 -46
- package/dist/commands/connections/add.js.map +0 -1
- package/dist/commands/connections/list.d.ts +0 -2
- package/dist/commands/connections/list.d.ts.map +0 -1
- package/dist/commands/connections/list.js +0 -25
- package/dist/commands/connections/list.js.map +0 -1
- package/dist/commands/connections/platforms.d.ts.map +0 -1
- package/dist/commands/connections/platforms.js.map +0 -1
- package/dist/commands/providers/add.d.ts +0 -2
- package/dist/commands/providers/add.d.ts.map +0 -1
- package/dist/commands/providers/add.js +0 -50
- package/dist/commands/providers/add.js.map +0 -1
- package/dist/commands/providers/list.d.ts +0 -2
- package/dist/commands/providers/list.d.ts.map +0 -1
- package/dist/commands/providers/list.js +0 -22
- package/dist/commands/providers/list.js.map +0 -1
- package/dist/commands/secrets.d.ts +0 -8
- package/dist/commands/secrets.d.ts.map +0 -1
- package/dist/commands/secrets.js +0 -98
- package/dist/commands/secrets.js.map +0 -1
- package/dist/commands/skills/add.d.ts +0 -5
- package/dist/commands/skills/add.d.ts.map +0 -1
- package/dist/commands/skills/add.js +0 -27
- package/dist/commands/skills/add.js.map +0 -1
- package/dist/commands/skills/list.d.ts +0 -2
- package/dist/commands/skills/list.d.ts.map +0 -1
- package/dist/commands/skills/list.js +0 -19
- package/dist/commands/skills/list.js.map +0 -1
- package/dist/commands/skills/registry.d.ts +0 -19
- package/dist/commands/skills/registry.d.ts.map +0 -1
- package/dist/commands/skills/registry.js +0 -76
- package/dist/commands/skills/registry.js.map +0 -1
- package/dist/config/agent-helpers.d.ts +0 -38
- package/dist/config/agent-helpers.d.ts.map +0 -1
- package/dist/config/agent-helpers.js +0 -58
- package/dist/config/agent-helpers.js.map +0 -1
- package/dist/templates/Dockerfile.worker.tmpl +0 -29
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { ApiError, ValidationError } from "../../memory/_lib/errors.js";
|
|
3
|
+
import { printError, printText } from "../../memory/_lib/output.js";
|
|
4
|
+
import { resolveApplyClient, } from "./client.js";
|
|
5
|
+
import { computeDiff, } from "./diff.js";
|
|
6
|
+
import { loadDesiredState } from "./desired-state.js";
|
|
7
|
+
import { confirmPlan } from "./prompt.js";
|
|
8
|
+
import { renderMissingSecrets, renderPlan, renderProgress } from "./render.js";
|
|
9
|
+
// ── Required-secrets check ─────────────────────────────────────────────────
|
|
10
|
+
/**
|
|
11
|
+
* v1 secret check: every `$VAR` referenced in lobu.toml must be present in
|
|
12
|
+
* the apply runner's environment. The file-loader already substitutes envs
|
|
13
|
+
* in-place during gateway boot, so this is the same set of names operators
|
|
14
|
+
* must satisfy at runtime — surfacing it pre-mutation gives the operator
|
|
15
|
+
* a cleaner failure than a silent empty-string config push.
|
|
16
|
+
*
|
|
17
|
+
* Plan §7 reserves cloud-side secret-list cross-checks for v3.
|
|
18
|
+
*/
|
|
19
|
+
function checkRequiredSecrets(state) {
|
|
20
|
+
const missing = state.requiredSecrets.filter((name) => process.env[name] === undefined || process.env[name] === "");
|
|
21
|
+
return { missing };
|
|
22
|
+
}
|
|
23
|
+
// ── Snapshot ───────────────────────────────────────────────────────────────
|
|
24
|
+
async function fetchRemoteSnapshot(client, state, only) {
|
|
25
|
+
const agents = only === "memory" ? [] : await client.listAgents();
|
|
26
|
+
const agentSettings = new Map();
|
|
27
|
+
const platformsByAgent = new Map();
|
|
28
|
+
if (only !== "memory") {
|
|
29
|
+
const desiredAgentIds = state.agents.map((a) => a.metadata.agentId);
|
|
30
|
+
const remoteAgentIds = new Set(agents.map((a) => a.agentId));
|
|
31
|
+
// Only GET settings for agents that exist; new agents have no remote
|
|
32
|
+
// settings to compare against.
|
|
33
|
+
const targetAgentIds = desiredAgentIds.filter((id) => remoteAgentIds.has(id));
|
|
34
|
+
for (const agentId of targetAgentIds) {
|
|
35
|
+
agentSettings.set(agentId, await client.getAgentSettings(agentId));
|
|
36
|
+
platformsByAgent.set(agentId, await client.listPlatforms(agentId));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const entityTypes = only === "agents" ? [] : await client.listEntityTypes();
|
|
40
|
+
const relationshipTypes = only === "agents" ? [] : await client.listRelationshipTypes();
|
|
41
|
+
return {
|
|
42
|
+
agents,
|
|
43
|
+
agentSettings,
|
|
44
|
+
platformsByAgent,
|
|
45
|
+
entityTypes,
|
|
46
|
+
relationshipTypes,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Execute the plan in dependency order. Plan §footgun-7: agents → settings →
|
|
51
|
+
* connections → entity types → relationship types. No retry loop, no
|
|
52
|
+
* topological sort. First failure prints partial progress and re-throws.
|
|
53
|
+
*/
|
|
54
|
+
async function executePlan(ctx) {
|
|
55
|
+
const rowsByKind = (kind) => ctx.plan.rows.filter((row) => row.kind === kind && row.verb !== "noop" && row.verb !== "drift");
|
|
56
|
+
// 1) Agents
|
|
57
|
+
for (const row of rowsByKind("agent")) {
|
|
58
|
+
if (row.kind !== "agent")
|
|
59
|
+
continue;
|
|
60
|
+
if (!row.desired)
|
|
61
|
+
continue;
|
|
62
|
+
const desired = ctx.state.agents.find((a) => a.metadata.agentId === row.id);
|
|
63
|
+
if (!desired)
|
|
64
|
+
continue;
|
|
65
|
+
if (row.verb === "create") {
|
|
66
|
+
await ctx.client.upsertAgent(desired.metadata);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
await ctx.client.patchAgentMetadata(row.id, {
|
|
70
|
+
name: desired.metadata.name,
|
|
71
|
+
description: desired.metadata.description,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
printText(renderProgress(row.verb, "agent", row.id));
|
|
75
|
+
}
|
|
76
|
+
// 2) Settings
|
|
77
|
+
for (const row of rowsByKind("settings")) {
|
|
78
|
+
if (row.kind !== "settings")
|
|
79
|
+
continue;
|
|
80
|
+
const desired = ctx.state.agents.find((a) => a.metadata.agentId === row.id);
|
|
81
|
+
if (!desired)
|
|
82
|
+
continue;
|
|
83
|
+
await ctx.client.patchAgentSettings(row.id, desired.settings);
|
|
84
|
+
printText(renderProgress(row.verb, "settings", row.id, row.changedFields ? `(${row.changedFields.join(", ")})` : undefined));
|
|
85
|
+
}
|
|
86
|
+
// 3) Platforms
|
|
87
|
+
for (const row of rowsByKind("platform")) {
|
|
88
|
+
if (row.kind !== "platform")
|
|
89
|
+
continue;
|
|
90
|
+
const desired = row.desired;
|
|
91
|
+
if (!desired)
|
|
92
|
+
continue;
|
|
93
|
+
const result = await ctx.client.upsertPlatform(row.agentId, desired.stableId, {
|
|
94
|
+
platform: desired.type,
|
|
95
|
+
...(desired.name ? { name: desired.name } : {}),
|
|
96
|
+
config: desired.config,
|
|
97
|
+
});
|
|
98
|
+
const detail = result.willRestart
|
|
99
|
+
? "(restarted)"
|
|
100
|
+
: result.noop
|
|
101
|
+
? "(noop on server)"
|
|
102
|
+
: undefined;
|
|
103
|
+
printText(renderProgress(row.verb, "platform", `${row.agentId}/${row.id}`, detail));
|
|
104
|
+
}
|
|
105
|
+
// 4) Entity types
|
|
106
|
+
for (const row of rowsByKind("entity-type")) {
|
|
107
|
+
if (row.kind !== "entity-type")
|
|
108
|
+
continue;
|
|
109
|
+
if (!row.desired)
|
|
110
|
+
continue;
|
|
111
|
+
await ctx.client.upsertEntityType(row.desired);
|
|
112
|
+
printText(renderProgress(row.verb, "entity-type", row.id));
|
|
113
|
+
}
|
|
114
|
+
// 5) Relationship types
|
|
115
|
+
for (const row of rowsByKind("relationship-type")) {
|
|
116
|
+
if (row.kind !== "relationship-type")
|
|
117
|
+
continue;
|
|
118
|
+
if (!row.desired)
|
|
119
|
+
continue;
|
|
120
|
+
await ctx.client.upsertRelationshipType(row.desired);
|
|
121
|
+
printText(renderProgress(row.verb, "relationship-type", row.id));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// ── Top-level command ──────────────────────────────────────────────────────
|
|
125
|
+
export async function applyCommand(opts = {}) {
|
|
126
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
127
|
+
const { state, configPath } = await loadDesiredState({ cwd });
|
|
128
|
+
printText(chalk.dim(`Config: ${configPath}`));
|
|
129
|
+
// Required secrets gate: fail before any network mutation.
|
|
130
|
+
const { missing } = checkRequiredSecrets(state);
|
|
131
|
+
if (missing.length > 0) {
|
|
132
|
+
printError(renderMissingSecrets(missing));
|
|
133
|
+
throw new ValidationError(`${missing.length} required secret${missing.length === 1 ? "" : "s"} missing — see above.`);
|
|
134
|
+
}
|
|
135
|
+
const { client, orgSlug } = await resolveApplyClient({
|
|
136
|
+
url: opts.url,
|
|
137
|
+
org: opts.org,
|
|
138
|
+
fetchImpl: opts.fetchImpl,
|
|
139
|
+
});
|
|
140
|
+
printText(chalk.dim(`Org: ${orgSlug}`));
|
|
141
|
+
const remote = await fetchRemoteSnapshot(client, state, opts.only);
|
|
142
|
+
const plan = computeDiff(state, remote, { only: opts.only });
|
|
143
|
+
printText(renderPlan(plan));
|
|
144
|
+
if (opts.dryRun) {
|
|
145
|
+
printText(chalk.dim("\nDry run — no changes applied."));
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (plan.counts.create === 0 && plan.counts.update === 0) {
|
|
149
|
+
printText(chalk.green("\nNothing to apply."));
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
// Build a plain-text summary for the inquirer prompt — chalk-decorated
|
|
153
|
+
// text confuses some terminals when re-printed by the prompt library.
|
|
154
|
+
const { create, update, noop, drift } = plan.counts;
|
|
155
|
+
const summaryLine = `${create} create, ${update} update, ${noop} noop, ${drift} drift`;
|
|
156
|
+
const approved = await confirmPlan({
|
|
157
|
+
yes: opts.yes ?? false,
|
|
158
|
+
summaryLine,
|
|
159
|
+
});
|
|
160
|
+
if (!approved) {
|
|
161
|
+
printText(chalk.dim("\nCancelled."));
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
printText(chalk.bold("\nApplying:"));
|
|
165
|
+
try {
|
|
166
|
+
await executePlan({ client, state, plan });
|
|
167
|
+
printText(chalk.green("\nApply complete."));
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
if (err instanceof ApiError) {
|
|
171
|
+
printError(`\n${err.message}`);
|
|
172
|
+
}
|
|
173
|
+
else if (err instanceof Error) {
|
|
174
|
+
printError(`\n${err.message}`);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
printError(`\n${String(err)}`);
|
|
178
|
+
}
|
|
179
|
+
printError("Apply halted on first failure. Re-run `lobu apply` once the underlying issue is resolved — every endpoint is idempotent.");
|
|
180
|
+
throw err;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=apply-cmd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-cmd.js","sourceRoot":"","sources":["../../../../src/commands/_lib/apply/apply-cmd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import type { AgentSettings } from "@lobu/core";
|
|
2
|
+
export interface RemoteAgent {
|
|
3
|
+
agentId: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface RemoteAgentDetail extends RemoteAgent {
|
|
8
|
+
settings?: AgentSettings | null;
|
|
9
|
+
}
|
|
10
|
+
export interface RemotePlatform {
|
|
11
|
+
id: string;
|
|
12
|
+
platform: string;
|
|
13
|
+
templateAgentId?: string;
|
|
14
|
+
config?: Record<string, unknown>;
|
|
15
|
+
status?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface RemoteEntityType {
|
|
18
|
+
slug: string;
|
|
19
|
+
name?: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
required?: string[];
|
|
22
|
+
properties?: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
export interface RemoteRelationshipType {
|
|
25
|
+
slug: string;
|
|
26
|
+
name?: string;
|
|
27
|
+
description?: string;
|
|
28
|
+
rules?: Array<{
|
|
29
|
+
source: string;
|
|
30
|
+
target: string;
|
|
31
|
+
}>;
|
|
32
|
+
}
|
|
33
|
+
export interface UpsertPlatformResult {
|
|
34
|
+
/** Server reports `noop: true` when the desired config matches what's stored. */
|
|
35
|
+
noop?: boolean;
|
|
36
|
+
/** When the config materially changed, the live worker is restarted. */
|
|
37
|
+
willRestart?: boolean;
|
|
38
|
+
updated?: boolean;
|
|
39
|
+
created?: boolean;
|
|
40
|
+
platform?: RemotePlatform;
|
|
41
|
+
}
|
|
42
|
+
export interface UpsertEntityTypeResult {
|
|
43
|
+
created?: boolean;
|
|
44
|
+
updated?: boolean;
|
|
45
|
+
noop?: boolean;
|
|
46
|
+
}
|
|
47
|
+
export interface ApplyClientConfig {
|
|
48
|
+
apiBaseUrl: string;
|
|
49
|
+
orgSlug: string;
|
|
50
|
+
token: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Typed wrappers for the existing server endpoints `lobu apply` calls.
|
|
54
|
+
*
|
|
55
|
+
* The class is open over an injectable `fetchImpl` so tests can stub the
|
|
56
|
+
* network without monkey-patching globals. Real callers leave `fetchImpl`
|
|
57
|
+
* unset and pick up `globalThis.fetch`.
|
|
58
|
+
*/
|
|
59
|
+
export declare class ApplyClient {
|
|
60
|
+
private readonly apiBaseUrl;
|
|
61
|
+
private readonly orgSlug;
|
|
62
|
+
private readonly token;
|
|
63
|
+
private readonly fetchImpl;
|
|
64
|
+
constructor(cfg: ApplyClientConfig, fetchImpl?: typeof fetch);
|
|
65
|
+
private request;
|
|
66
|
+
listAgents(): Promise<RemoteAgent[]>;
|
|
67
|
+
/**
|
|
68
|
+
* Idempotent create: PR-2 makes `POST /` return 200 with the existing
|
|
69
|
+
* payload when an agent of the same ID already exists in the same org.
|
|
70
|
+
* Cross-org collision still surfaces as 409 with a clear `error.code` —
|
|
71
|
+
* we re-throw verbatim so `lobu apply` can show the operator the link
|
|
72
|
+
* to the org-scoped IDs issue.
|
|
73
|
+
*/
|
|
74
|
+
upsertAgent(agent: {
|
|
75
|
+
agentId: string;
|
|
76
|
+
name: string;
|
|
77
|
+
description?: string;
|
|
78
|
+
}): Promise<RemoteAgent>;
|
|
79
|
+
patchAgentMetadata(agentId: string, agent: {
|
|
80
|
+
name?: string;
|
|
81
|
+
description?: string;
|
|
82
|
+
}): Promise<void>;
|
|
83
|
+
getAgentSettings(agentId: string): Promise<AgentSettings | null>;
|
|
84
|
+
patchAgentSettings(agentId: string, settings: Partial<AgentSettings>): Promise<void>;
|
|
85
|
+
listPlatforms(agentId: string): Promise<RemotePlatform[]>;
|
|
86
|
+
/**
|
|
87
|
+
* Stable-ID upsert.
|
|
88
|
+
*
|
|
89
|
+
* Server contract:
|
|
90
|
+
* PUT /:agentId/platforms/by-stable-id/:stableId
|
|
91
|
+
* body: { platform, name?, config }
|
|
92
|
+
* response when unchanged: { noop: true, platform }
|
|
93
|
+
* response when changed: { updated: true, willRestart: true, platform }
|
|
94
|
+
* response on first write: { created: true, platform }
|
|
95
|
+
*/
|
|
96
|
+
upsertPlatform(agentId: string, stableId: string, payload: {
|
|
97
|
+
platform: string;
|
|
98
|
+
name?: string;
|
|
99
|
+
config: Record<string, string>;
|
|
100
|
+
}): Promise<UpsertPlatformResult>;
|
|
101
|
+
listEntityTypes(): Promise<RemoteEntityType[]>;
|
|
102
|
+
upsertEntityType(entity: {
|
|
103
|
+
slug: string;
|
|
104
|
+
name?: string;
|
|
105
|
+
description?: string;
|
|
106
|
+
required?: string[];
|
|
107
|
+
properties?: Record<string, unknown>;
|
|
108
|
+
}): Promise<UpsertEntityTypeResult>;
|
|
109
|
+
listRelationshipTypes(): Promise<RemoteRelationshipType[]>;
|
|
110
|
+
upsertRelationshipType(rel: {
|
|
111
|
+
slug: string;
|
|
112
|
+
name?: string;
|
|
113
|
+
description?: string;
|
|
114
|
+
rules?: Array<{
|
|
115
|
+
source: string;
|
|
116
|
+
target: string;
|
|
117
|
+
}>;
|
|
118
|
+
}): Promise<UpsertEntityTypeResult>;
|
|
119
|
+
}
|
|
120
|
+
export interface ResolvedClient {
|
|
121
|
+
client: ApplyClient;
|
|
122
|
+
apiBaseUrl: string;
|
|
123
|
+
orgSlug: string;
|
|
124
|
+
}
|
|
125
|
+
export declare function resolveApplyClient(opts: {
|
|
126
|
+
url?: string;
|
|
127
|
+
org?: string;
|
|
128
|
+
fetchImpl?: typeof fetch;
|
|
129
|
+
}): Promise<ResolvedClient>;
|
|
130
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/commands/_lib/apply/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { resolveApiClient } from "../../../internal/index.js";
|
|
2
|
+
import { ApiError } from "../../memory/_lib/errors.js";
|
|
3
|
+
// ── Shape predicates ───────────────────────────────────────────────────────
|
|
4
|
+
function isRecord(value) {
|
|
5
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
6
|
+
}
|
|
7
|
+
function extractApiError(parsed, status, statusText) {
|
|
8
|
+
if (typeof parsed.error === "string") {
|
|
9
|
+
return { message: parsed.error };
|
|
10
|
+
}
|
|
11
|
+
if (isRecord(parsed.error)) {
|
|
12
|
+
const message = typeof parsed.error.message === "string"
|
|
13
|
+
? parsed.error.message
|
|
14
|
+
: `HTTP ${status} ${statusText}`;
|
|
15
|
+
const code = typeof parsed.error.code === "string" ? parsed.error.code : undefined;
|
|
16
|
+
return code ? { message, code } : { message };
|
|
17
|
+
}
|
|
18
|
+
return { message: `HTTP ${status} ${statusText}` };
|
|
19
|
+
}
|
|
20
|
+
async function parseResponseBody(res, url) {
|
|
21
|
+
const raw = await res.text();
|
|
22
|
+
if (!raw)
|
|
23
|
+
return {};
|
|
24
|
+
try {
|
|
25
|
+
const parsed = JSON.parse(raw);
|
|
26
|
+
return isRecord(parsed) ? parsed : { value: parsed };
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
throw new ApiError(`Invalid JSON from ${url}: ${raw.slice(0, 500)}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Typed wrappers for the existing server endpoints `lobu apply` calls.
|
|
34
|
+
*
|
|
35
|
+
* The class is open over an injectable `fetchImpl` so tests can stub the
|
|
36
|
+
* network without monkey-patching globals. Real callers leave `fetchImpl`
|
|
37
|
+
* unset and pick up `globalThis.fetch`.
|
|
38
|
+
*/
|
|
39
|
+
export class ApplyClient {
|
|
40
|
+
apiBaseUrl;
|
|
41
|
+
orgSlug;
|
|
42
|
+
token;
|
|
43
|
+
fetchImpl;
|
|
44
|
+
constructor(cfg, fetchImpl = fetch) {
|
|
45
|
+
this.apiBaseUrl = cfg.apiBaseUrl;
|
|
46
|
+
this.orgSlug = cfg.orgSlug;
|
|
47
|
+
this.token = cfg.token;
|
|
48
|
+
this.fetchImpl = fetchImpl;
|
|
49
|
+
}
|
|
50
|
+
// ── HTTP shape (mirrors openclaw-cmd.ts:postJson, locally scoped) ────────
|
|
51
|
+
async request(method, path, body, okStatuses = [200, 201, 204]) {
|
|
52
|
+
const url = `${this.apiBaseUrl}${path}`;
|
|
53
|
+
const init = {
|
|
54
|
+
method,
|
|
55
|
+
headers: {
|
|
56
|
+
"Content-Type": "application/json",
|
|
57
|
+
Authorization: `Bearer ${this.token}`,
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
if (body !== undefined)
|
|
61
|
+
init.body = JSON.stringify(body);
|
|
62
|
+
const res = await this.fetchImpl(url, init);
|
|
63
|
+
const parsed = await parseResponseBody(res, url);
|
|
64
|
+
if (!okStatuses.includes(res.status) && !res.ok) {
|
|
65
|
+
const { message, code } = extractApiError(parsed, res.status, res.statusText);
|
|
66
|
+
throw new ApiError(`${method} ${path} failed: ${message}${code ? ` [${code}]` : ""}`, res.status);
|
|
67
|
+
}
|
|
68
|
+
if (typeof parsed.error === "string" && parsed.error.length > 0) {
|
|
69
|
+
throw new ApiError(`${method} ${path} returned error: ${parsed.error}`, res.status);
|
|
70
|
+
}
|
|
71
|
+
return { status: res.status, body: parsed };
|
|
72
|
+
}
|
|
73
|
+
// ── Agents ────────────────────────────────────────────────────────────────
|
|
74
|
+
async listAgents() {
|
|
75
|
+
const { body } = await this.request("GET", `/api/${this.orgSlug}/agents`);
|
|
76
|
+
return body.agents ?? [];
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Idempotent create: PR-2 makes `POST /` return 200 with the existing
|
|
80
|
+
* payload when an agent of the same ID already exists in the same org.
|
|
81
|
+
* Cross-org collision still surfaces as 409 with a clear `error.code` —
|
|
82
|
+
* we re-throw verbatim so `lobu apply` can show the operator the link
|
|
83
|
+
* to the org-scoped IDs issue.
|
|
84
|
+
*/
|
|
85
|
+
async upsertAgent(agent) {
|
|
86
|
+
const { body } = await this.request("POST",
|
|
87
|
+
// No trailing slash — Hono matches `routes.post('/', ...)` mounted at
|
|
88
|
+
// `/api/:orgSlug/agents` against `/api/dev/agents`, not `/api/dev/agents/`.
|
|
89
|
+
`/api/${this.orgSlug}/agents`, agent, [200, 201]);
|
|
90
|
+
return body;
|
|
91
|
+
}
|
|
92
|
+
async patchAgentMetadata(agentId, agent) {
|
|
93
|
+
await this.request("PATCH", `/api/${this.orgSlug}/agents/${encodeURIComponent(agentId)}`, agent);
|
|
94
|
+
}
|
|
95
|
+
async getAgentSettings(agentId) {
|
|
96
|
+
try {
|
|
97
|
+
const { body } = await this.request("GET", `/api/${this.orgSlug}/agents/${encodeURIComponent(agentId)}/config`);
|
|
98
|
+
return body;
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
if (err instanceof ApiError && err.status === 404)
|
|
102
|
+
return null;
|
|
103
|
+
throw err;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async patchAgentSettings(agentId, settings) {
|
|
107
|
+
await this.request("PATCH", `/api/${this.orgSlug}/agents/${encodeURIComponent(agentId)}/config`, settings);
|
|
108
|
+
}
|
|
109
|
+
// ── Platforms ─────────────────────────────────────────────────────────────
|
|
110
|
+
async listPlatforms(agentId) {
|
|
111
|
+
const { body } = await this.request("GET", `/api/${this.orgSlug}/agents/${encodeURIComponent(agentId)}/platforms`);
|
|
112
|
+
return body.platforms ?? [];
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Stable-ID upsert.
|
|
116
|
+
*
|
|
117
|
+
* Server contract:
|
|
118
|
+
* PUT /:agentId/platforms/by-stable-id/:stableId
|
|
119
|
+
* body: { platform, name?, config }
|
|
120
|
+
* response when unchanged: { noop: true, platform }
|
|
121
|
+
* response when changed: { updated: true, willRestart: true, platform }
|
|
122
|
+
* response on first write: { created: true, platform }
|
|
123
|
+
*/
|
|
124
|
+
async upsertPlatform(agentId, stableId, payload) {
|
|
125
|
+
const { body } = await this.request("PUT", `/api/${this.orgSlug}/agents/${encodeURIComponent(agentId)}/platforms/by-stable-id/${encodeURIComponent(stableId)}`, payload);
|
|
126
|
+
return body;
|
|
127
|
+
}
|
|
128
|
+
// ── Memory schema ─────────────────────────────────────────────────────────
|
|
129
|
+
async listEntityTypes() {
|
|
130
|
+
const { body } = await this.request("POST", `/api/${this.orgSlug}/manage_entity_schema`, {
|
|
131
|
+
schema_type: "entity_type",
|
|
132
|
+
action: "list",
|
|
133
|
+
});
|
|
134
|
+
return body.entity_types ?? body.entityTypes ?? [];
|
|
135
|
+
}
|
|
136
|
+
async upsertEntityType(entity) {
|
|
137
|
+
// The admin tool exposes separate `create` / `update` actions and surfaces
|
|
138
|
+
// duplicates as a structured error code rather than a 4xx. Probe with
|
|
139
|
+
// `create`; on a duplicate-named-resource code, retry with `update`.
|
|
140
|
+
try {
|
|
141
|
+
await this.request("POST", `/api/${this.orgSlug}/manage_entity_schema`, {
|
|
142
|
+
schema_type: "entity_type",
|
|
143
|
+
action: "create",
|
|
144
|
+
...entity,
|
|
145
|
+
});
|
|
146
|
+
return { created: true };
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
if (err instanceof ApiError && isDuplicateError(err)) {
|
|
150
|
+
await this.request("POST", `/api/${this.orgSlug}/manage_entity_schema`, { schema_type: "entity_type", action: "update", ...entity });
|
|
151
|
+
return { updated: true };
|
|
152
|
+
}
|
|
153
|
+
throw err;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async listRelationshipTypes() {
|
|
157
|
+
const { body } = await this.request("POST", `/api/${this.orgSlug}/manage_entity_schema`, {
|
|
158
|
+
schema_type: "relationship_type",
|
|
159
|
+
action: "list",
|
|
160
|
+
});
|
|
161
|
+
return body.relationship_types ?? body.relationshipTypes ?? [];
|
|
162
|
+
}
|
|
163
|
+
async upsertRelationshipType(rel) {
|
|
164
|
+
const { rules, ...payload } = rel;
|
|
165
|
+
let result;
|
|
166
|
+
try {
|
|
167
|
+
await this.request("POST", `/api/${this.orgSlug}/manage_entity_schema`, {
|
|
168
|
+
schema_type: "relationship_type",
|
|
169
|
+
action: "create",
|
|
170
|
+
...payload,
|
|
171
|
+
});
|
|
172
|
+
result = { created: true };
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
if (err instanceof ApiError && isDuplicateError(err)) {
|
|
176
|
+
await this.request("POST", `/api/${this.orgSlug}/manage_entity_schema`, { schema_type: "relationship_type", action: "update", ...payload });
|
|
177
|
+
result = { updated: true };
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
throw err;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// Register rules separately via add_rule. Backend treats add_rule as
|
|
184
|
+
// idempotent; duplicate-add surfaces a structured error we can swallow.
|
|
185
|
+
if (rules?.length) {
|
|
186
|
+
for (const rule of rules) {
|
|
187
|
+
try {
|
|
188
|
+
await this.request("POST", `/api/${this.orgSlug}/manage_entity_schema`, {
|
|
189
|
+
schema_type: "relationship_type",
|
|
190
|
+
action: "add_rule",
|
|
191
|
+
slug: rel.slug,
|
|
192
|
+
source_entity_type_slug: rule.source,
|
|
193
|
+
target_entity_type_slug: rule.target,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
if (err instanceof ApiError && isDuplicateError(err))
|
|
198
|
+
continue;
|
|
199
|
+
throw err;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return result;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Recognise duplicate-name errors from the admin tools without substring
|
|
208
|
+
* matching the user-facing message. The server emits a structured code in
|
|
209
|
+
* `error.code` (e.g. `entity_type_exists`, `already_exists`) that the
|
|
210
|
+
* proxy surfaces in the error payload. This helper centralises that check
|
|
211
|
+
* so we can extend the code list as the server grows.
|
|
212
|
+
*
|
|
213
|
+
* Tradeoff: the existing `manage_entity_schema` handler doesn't currently
|
|
214
|
+
* stamp a stable code for every duplicate path. Until it does, we accept
|
|
215
|
+
* structured codes when present and fall back to the http status alone
|
|
216
|
+
* (any 4xx for a `create` action is treated as duplicate-or-bad-payload;
|
|
217
|
+
* the subsequent `update` will fail noisily on the latter).
|
|
218
|
+
*/
|
|
219
|
+
function isDuplicateError(err) {
|
|
220
|
+
if (typeof err.status === "number" && err.status >= 400 && err.status < 500) {
|
|
221
|
+
const message = err.message.toLowerCase();
|
|
222
|
+
if (message.includes("[entity_type_exists]") ||
|
|
223
|
+
message.includes("[relationship_type_exists]") ||
|
|
224
|
+
message.includes("[already_exists]")) {
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
// Fall back to status-only when no code is stamped. This is loose; we
|
|
228
|
+
// accept the loss because the v1 plan explicitly limits us to
|
|
229
|
+
// server endpoints whose error shape we don't control.
|
|
230
|
+
return err.status === 409 || err.status === 422 || err.status === 400;
|
|
231
|
+
}
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
export async function resolveApplyClient(opts) {
|
|
235
|
+
const { token, apiBaseUrl, orgSlug } = await resolveApiClient({
|
|
236
|
+
org: opts.org,
|
|
237
|
+
apiUrl: opts.url,
|
|
238
|
+
fetchImpl: opts.fetchImpl,
|
|
239
|
+
});
|
|
240
|
+
const client = new ApplyClient({ apiBaseUrl, orgSlug, token }, opts.fetchImpl);
|
|
241
|
+
return { client, apiBaseUrl, orgSlug };
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/commands/_lib/apply/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { AgentSettings } from "@lobu/core";
|
|
2
|
+
export declare function buildStablePlatformId(agentId: string, type: string, name?: string): string;
|
|
3
|
+
export interface DesiredAgentMetadata {
|
|
4
|
+
agentId: string;
|
|
5
|
+
name: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface DesiredPlatform {
|
|
9
|
+
/** Stable, content-addressed ID derived from `(agentId, type, name?)`. */
|
|
10
|
+
stableId: string;
|
|
11
|
+
type: string;
|
|
12
|
+
name?: string;
|
|
13
|
+
/** Raw config from lobu.toml — values may still contain `$VAR` references. */
|
|
14
|
+
config: Record<string, string>;
|
|
15
|
+
}
|
|
16
|
+
export interface DesiredEntityType {
|
|
17
|
+
slug: string;
|
|
18
|
+
name?: string;
|
|
19
|
+
description?: string;
|
|
20
|
+
required?: string[];
|
|
21
|
+
properties?: Record<string, unknown>;
|
|
22
|
+
metadata?: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
export interface DesiredRelationshipType {
|
|
25
|
+
slug: string;
|
|
26
|
+
name?: string;
|
|
27
|
+
description?: string;
|
|
28
|
+
rules?: Array<{
|
|
29
|
+
source: string;
|
|
30
|
+
target: string;
|
|
31
|
+
}>;
|
|
32
|
+
metadata?: Record<string, unknown>;
|
|
33
|
+
}
|
|
34
|
+
export interface DesiredAgent {
|
|
35
|
+
metadata: DesiredAgentMetadata;
|
|
36
|
+
/**
|
|
37
|
+
* Settings payload destined for `PATCH /:agentId/config`. Built from the
|
|
38
|
+
* lobu.toml fields the file-loader currently lifts: networkConfig,
|
|
39
|
+
* skillsConfig, egressConfig, preApprovedTools, guardrails, toolsConfig,
|
|
40
|
+
* nixConfig, mcpServers, modelSelection, providerModelPreferences,
|
|
41
|
+
* installedProviders, identityMd/soulMd/userMd.
|
|
42
|
+
*
|
|
43
|
+
* Persistence of egressConfig/preApprovedTools/guardrails depends on PR-1.
|
|
44
|
+
*/
|
|
45
|
+
settings: Partial<AgentSettings>;
|
|
46
|
+
platforms: DesiredPlatform[];
|
|
47
|
+
}
|
|
48
|
+
export interface DesiredState {
|
|
49
|
+
agents: DesiredAgent[];
|
|
50
|
+
memorySchema: {
|
|
51
|
+
entityTypes: DesiredEntityType[];
|
|
52
|
+
relationshipTypes: DesiredRelationshipType[];
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Names of env vars referenced as `$NAME` anywhere in lobu.toml. The CLI
|
|
56
|
+
* surfaces these to the user before mutating remote state so missing
|
|
57
|
+
* secrets fail loud instead of expanding to empty strings.
|
|
58
|
+
*/
|
|
59
|
+
requiredSecrets: string[];
|
|
60
|
+
}
|
|
61
|
+
export interface LoadDesiredStateOptions {
|
|
62
|
+
/** Project root (directory containing `lobu.toml`). */
|
|
63
|
+
cwd: string;
|
|
64
|
+
/** Env to resolve `$VAR` refs against; defaults to `process.env`. */
|
|
65
|
+
env?: NodeJS.ProcessEnv;
|
|
66
|
+
}
|
|
67
|
+
export declare function loadDesiredState(opts: LoadDesiredStateOptions): Promise<{
|
|
68
|
+
state: DesiredState;
|
|
69
|
+
configPath: string;
|
|
70
|
+
}>;
|
|
71
|
+
//# sourceMappingURL=desired-state.d.ts.map
|