@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.
Files changed (266) hide show
  1. package/README.md +11 -26
  2. package/dist/__tests__/chat.integration.test.js +19 -19
  3. package/dist/__tests__/chat.integration.test.js.map +1 -1
  4. package/dist/__tests__/dev.test.d.ts +2 -0
  5. package/dist/__tests__/dev.test.d.ts.map +1 -0
  6. package/dist/__tests__/dev.test.js +25 -0
  7. package/dist/__tests__/dev.test.js.map +1 -0
  8. package/dist/__tests__/init-memory.test.js +1 -14
  9. package/dist/__tests__/init-memory.test.js.map +1 -1
  10. package/dist/__tests__/token.test.d.ts +2 -0
  11. package/dist/__tests__/token.test.d.ts.map +1 -0
  12. package/dist/__tests__/token.test.js +52 -0
  13. package/dist/__tests__/token.test.js.map +1 -0
  14. package/dist/bundled-skills/lobu/SKILL.md +95 -7
  15. package/dist/commands/_lib/apply/__tests__/client.test.d.ts +2 -0
  16. package/dist/commands/_lib/apply/__tests__/client.test.d.ts.map +1 -0
  17. package/dist/commands/_lib/apply/__tests__/client.test.js +23 -0
  18. package/dist/commands/_lib/apply/__tests__/client.test.js.map +1 -0
  19. package/dist/commands/_lib/apply/__tests__/desired-state.test.d.ts +2 -0
  20. package/dist/commands/_lib/apply/__tests__/desired-state.test.d.ts.map +1 -0
  21. package/dist/commands/_lib/apply/__tests__/desired-state.test.js +140 -0
  22. package/dist/commands/_lib/apply/__tests__/desired-state.test.js.map +1 -0
  23. package/dist/commands/_lib/apply/__tests__/diff.test.d.ts +2 -0
  24. package/dist/commands/_lib/apply/__tests__/diff.test.d.ts.map +1 -0
  25. package/dist/commands/_lib/apply/__tests__/diff.test.js +378 -0
  26. package/dist/commands/_lib/apply/__tests__/diff.test.js.map +1 -0
  27. package/dist/commands/_lib/apply/apply-cmd.d.ts +12 -0
  28. package/dist/commands/_lib/apply/apply-cmd.d.ts.map +1 -0
  29. package/dist/commands/_lib/apply/apply-cmd.js +183 -0
  30. package/dist/commands/_lib/apply/apply-cmd.js.map +1 -0
  31. package/dist/commands/_lib/apply/client.d.ts +130 -0
  32. package/dist/commands/_lib/apply/client.d.ts.map +1 -0
  33. package/dist/commands/_lib/apply/client.js +243 -0
  34. package/dist/commands/_lib/apply/client.js.map +1 -0
  35. package/dist/commands/_lib/apply/desired-state.d.ts +71 -0
  36. package/dist/commands/_lib/apply/desired-state.d.ts.map +1 -0
  37. package/dist/commands/_lib/apply/desired-state.js +600 -0
  38. package/dist/commands/_lib/apply/desired-state.js.map +1 -0
  39. package/dist/commands/_lib/apply/diff.d.ts +76 -0
  40. package/dist/commands/_lib/apply/diff.d.ts.map +1 -0
  41. package/dist/commands/_lib/apply/diff.js +323 -0
  42. package/dist/commands/_lib/apply/diff.js.map +1 -0
  43. package/dist/commands/_lib/apply/prompt.d.ts +13 -0
  44. package/dist/commands/_lib/apply/prompt.d.ts.map +1 -0
  45. package/dist/commands/_lib/apply/prompt.js +19 -0
  46. package/dist/commands/_lib/apply/prompt.js.map +1 -0
  47. package/dist/commands/_lib/apply/render.d.ts +9 -0
  48. package/dist/commands/_lib/apply/render.d.ts.map +1 -0
  49. package/dist/commands/_lib/apply/render.js +92 -0
  50. package/dist/commands/_lib/apply/render.js.map +1 -0
  51. package/dist/commands/agent.d.ts +27 -0
  52. package/dist/commands/agent.d.ts.map +1 -0
  53. package/dist/commands/agent.js +111 -0
  54. package/dist/commands/agent.js.map +1 -0
  55. package/dist/commands/apply.d.ts +3 -0
  56. package/dist/commands/apply.d.ts.map +1 -0
  57. package/dist/commands/apply.js +5 -0
  58. package/dist/commands/apply.js.map +1 -0
  59. package/dist/commands/chat.d.ts.map +1 -1
  60. package/dist/commands/chat.js +5 -5
  61. package/dist/commands/chat.js.map +1 -1
  62. package/dist/commands/dev.d.ts +8 -3
  63. package/dist/commands/dev.d.ts.map +1 -1
  64. package/dist/commands/dev.js +128 -124
  65. package/dist/commands/dev.js.map +1 -1
  66. package/dist/commands/doctor.d.ts +6 -0
  67. package/dist/commands/doctor.d.ts.map +1 -0
  68. package/dist/commands/doctor.js +75 -0
  69. package/dist/commands/doctor.js.map +1 -0
  70. package/dist/commands/eval.d.ts +1 -0
  71. package/dist/commands/eval.d.ts.map +1 -1
  72. package/dist/commands/eval.js +7 -4
  73. package/dist/commands/eval.js.map +1 -1
  74. package/dist/commands/init.d.ts +2 -9
  75. package/dist/commands/init.d.ts.map +1 -1
  76. package/dist/commands/init.js +34 -248
  77. package/dist/commands/init.js.map +1 -1
  78. package/dist/commands/login.d.ts +11 -3
  79. package/dist/commands/login.d.ts.map +1 -1
  80. package/dist/commands/login.js +109 -251
  81. package/dist/commands/login.js.map +1 -1
  82. package/dist/commands/logout.d.ts.map +1 -1
  83. package/dist/commands/logout.js +12 -11
  84. package/dist/commands/logout.js.map +1 -1
  85. package/dist/commands/memory/_lib/agent-detect.d.ts +9 -0
  86. package/dist/commands/memory/_lib/agent-detect.d.ts.map +1 -0
  87. package/dist/commands/memory/_lib/agent-detect.js +82 -0
  88. package/dist/commands/memory/_lib/agent-detect.js.map +1 -0
  89. package/dist/commands/memory/_lib/browser-auth-cmd.d.ts +19 -0
  90. package/dist/commands/memory/_lib/browser-auth-cmd.d.ts.map +1 -0
  91. package/dist/commands/memory/_lib/browser-auth-cmd.js +635 -0
  92. package/dist/commands/memory/_lib/browser-auth-cmd.js.map +1 -0
  93. package/dist/commands/memory/_lib/browser.d.ts +2 -0
  94. package/dist/commands/memory/_lib/browser.d.ts.map +1 -0
  95. package/dist/commands/memory/_lib/browser.js +26 -0
  96. package/dist/commands/memory/_lib/browser.js.map +1 -0
  97. package/dist/commands/memory/_lib/errors.d.ts +13 -0
  98. package/dist/commands/memory/_lib/errors.d.ts.map +1 -0
  99. package/dist/commands/memory/_lib/errors.js +23 -0
  100. package/dist/commands/memory/_lib/errors.js.map +1 -0
  101. package/dist/commands/memory/_lib/init-wizard.d.ts +12 -0
  102. package/dist/commands/memory/_lib/init-wizard.d.ts.map +1 -0
  103. package/dist/commands/memory/_lib/init-wizard.js +182 -0
  104. package/dist/commands/memory/_lib/init-wizard.js.map +1 -0
  105. package/dist/commands/memory/_lib/install-targets.d.ts +15 -0
  106. package/dist/commands/memory/_lib/install-targets.d.ts.map +1 -0
  107. package/dist/commands/memory/_lib/install-targets.js +209 -0
  108. package/dist/commands/memory/_lib/install-targets.js.map +1 -0
  109. package/dist/commands/memory/_lib/mcp.d.ts +20 -0
  110. package/dist/commands/memory/_lib/mcp.d.ts.map +1 -0
  111. package/dist/commands/memory/_lib/mcp.js +182 -0
  112. package/dist/commands/memory/_lib/mcp.js.map +1 -0
  113. package/dist/commands/memory/_lib/openclaw-auth.d.ts +41 -0
  114. package/dist/commands/memory/_lib/openclaw-auth.d.ts.map +1 -0
  115. package/dist/commands/memory/_lib/openclaw-auth.js +133 -0
  116. package/dist/commands/memory/_lib/openclaw-auth.js.map +1 -0
  117. package/dist/commands/memory/_lib/openclaw-auth.test.d.ts +2 -0
  118. package/dist/commands/memory/_lib/openclaw-auth.test.d.ts.map +1 -0
  119. package/dist/commands/memory/_lib/openclaw-auth.test.js +9 -0
  120. package/dist/commands/memory/_lib/openclaw-auth.test.js.map +1 -0
  121. package/dist/commands/memory/_lib/openclaw-cmd.d.ts +15 -0
  122. package/dist/commands/memory/_lib/openclaw-cmd.d.ts.map +1 -0
  123. package/dist/commands/memory/_lib/openclaw-cmd.js +208 -0
  124. package/dist/commands/memory/_lib/openclaw-cmd.js.map +1 -0
  125. package/dist/commands/memory/_lib/output.d.ts +5 -0
  126. package/dist/commands/memory/_lib/output.d.ts.map +1 -0
  127. package/dist/commands/memory/_lib/output.js +17 -0
  128. package/dist/commands/memory/_lib/output.js.map +1 -0
  129. package/dist/commands/memory/_lib/schema.d.ts +93 -0
  130. package/dist/commands/memory/_lib/schema.d.ts.map +1 -0
  131. package/dist/commands/memory/_lib/schema.js +192 -0
  132. package/dist/commands/memory/_lib/schema.js.map +1 -0
  133. package/dist/commands/memory/_lib/seed-cmd.d.ts +9 -0
  134. package/dist/commands/memory/_lib/seed-cmd.d.ts.map +1 -0
  135. package/dist/commands/memory/_lib/seed-cmd.js +516 -0
  136. package/dist/commands/memory/_lib/seed-cmd.js.map +1 -0
  137. package/dist/commands/memory/browser-auth.d.ts +3 -0
  138. package/dist/commands/memory/browser-auth.d.ts.map +1 -0
  139. package/dist/commands/memory/browser-auth.js +5 -0
  140. package/dist/commands/memory/browser-auth.js.map +1 -0
  141. package/dist/commands/memory/configure.d.ts +3 -0
  142. package/dist/commands/memory/configure.d.ts.map +1 -0
  143. package/dist/commands/memory/configure.js +5 -0
  144. package/dist/commands/memory/configure.js.map +1 -0
  145. package/dist/commands/memory/health.d.ts +3 -0
  146. package/dist/commands/memory/health.d.ts.map +1 -0
  147. package/dist/commands/memory/health.js +5 -0
  148. package/dist/commands/memory/health.js.map +1 -0
  149. package/dist/commands/memory/init.d.ts +8 -0
  150. package/dist/commands/memory/init.d.ts.map +1 -0
  151. package/dist/commands/memory/init.js +65 -0
  152. package/dist/commands/memory/init.js.map +1 -0
  153. package/dist/commands/memory/org.d.ts +7 -0
  154. package/dist/commands/memory/org.d.ts.map +1 -0
  155. package/dist/commands/memory/org.js +22 -0
  156. package/dist/commands/memory/org.js.map +1 -0
  157. package/dist/commands/memory/run.d.ts +8 -0
  158. package/dist/commands/memory/run.d.ts.map +1 -0
  159. package/dist/commands/memory/run.js +58 -0
  160. package/dist/commands/memory/run.js.map +1 -0
  161. package/dist/commands/memory/seed.d.ts +3 -0
  162. package/dist/commands/memory/seed.d.ts.map +1 -0
  163. package/dist/commands/memory/seed.js +5 -0
  164. package/dist/commands/memory/seed.js.map +1 -0
  165. package/dist/commands/org.d.ts +10 -0
  166. package/dist/commands/org.d.ts.map +1 -0
  167. package/dist/commands/org.js +34 -0
  168. package/dist/commands/org.js.map +1 -0
  169. package/dist/commands/{connections/platforms.d.ts → platforms/platform-prompts.d.ts} +5 -5
  170. package/dist/commands/platforms/platform-prompts.d.ts.map +1 -0
  171. package/dist/commands/{connections/platforms.js → platforms/platform-prompts.js} +24 -24
  172. package/dist/commands/platforms/platform-prompts.js.map +1 -0
  173. package/dist/commands/status.d.ts +4 -1
  174. package/dist/commands/status.d.ts.map +1 -1
  175. package/dist/commands/status.js +15 -84
  176. package/dist/commands/status.js.map +1 -1
  177. package/dist/commands/token.d.ts +17 -0
  178. package/dist/commands/token.d.ts.map +1 -0
  179. package/dist/commands/token.js +55 -0
  180. package/dist/commands/token.js.map +1 -0
  181. package/dist/index.d.ts.map +1 -1
  182. package/dist/index.js +303 -88
  183. package/dist/index.js.map +1 -1
  184. package/dist/internal/__tests__/api-client.test.d.ts +2 -0
  185. package/dist/internal/__tests__/api-client.test.d.ts.map +1 -0
  186. package/dist/internal/__tests__/api-client.test.js +95 -0
  187. package/dist/internal/__tests__/api-client.test.js.map +1 -0
  188. package/dist/internal/__tests__/context.test.d.ts +2 -0
  189. package/dist/internal/__tests__/context.test.d.ts.map +1 -0
  190. package/dist/internal/__tests__/context.test.js +77 -0
  191. package/dist/internal/__tests__/context.test.js.map +1 -0
  192. package/dist/internal/api-client.d.ts +39 -0
  193. package/dist/internal/api-client.d.ts.map +1 -0
  194. package/dist/internal/api-client.js +217 -0
  195. package/dist/internal/api-client.js.map +1 -0
  196. package/dist/internal/context.d.ts +10 -1
  197. package/dist/internal/context.d.ts.map +1 -1
  198. package/dist/internal/context.js +109 -2
  199. package/dist/internal/context.js.map +1 -1
  200. package/dist/internal/credentials.d.ts +12 -2
  201. package/dist/internal/credentials.d.ts.map +1 -1
  202. package/dist/internal/credentials.js +47 -54
  203. package/dist/internal/credentials.js.map +1 -1
  204. package/dist/internal/gateway-url.d.ts +4 -4
  205. package/dist/internal/gateway-url.d.ts.map +1 -1
  206. package/dist/internal/gateway-url.js +6 -5
  207. package/dist/internal/gateway-url.js.map +1 -1
  208. package/dist/internal/index.d.ts +5 -3
  209. package/dist/internal/index.d.ts.map +1 -1
  210. package/dist/internal/index.js +3 -2
  211. package/dist/internal/index.js.map +1 -1
  212. package/dist/internal/local-env.d.ts +2 -0
  213. package/dist/internal/local-env.d.ts.map +1 -0
  214. package/dist/internal/local-env.js +32 -0
  215. package/dist/internal/local-env.js.map +1 -0
  216. package/dist/internal/oauth.d.ts +82 -0
  217. package/dist/internal/oauth.d.ts.map +1 -0
  218. package/dist/internal/oauth.js +234 -0
  219. package/dist/internal/oauth.js.map +1 -0
  220. package/dist/server.bundle.mjs +72219 -0
  221. package/dist/templates/.env.tmpl +7 -3
  222. package/dist/templates/README.md.tmpl +20 -53
  223. package/package.json +60 -6
  224. package/dist/__tests__/skills.test.d.ts +0 -2
  225. package/dist/__tests__/skills.test.d.ts.map +0 -1
  226. package/dist/__tests__/skills.test.js +0 -33
  227. package/dist/__tests__/skills.test.js.map +0 -1
  228. package/dist/commands/connections/add.d.ts +0 -2
  229. package/dist/commands/connections/add.d.ts.map +0 -1
  230. package/dist/commands/connections/add.js +0 -46
  231. package/dist/commands/connections/add.js.map +0 -1
  232. package/dist/commands/connections/list.d.ts +0 -2
  233. package/dist/commands/connections/list.d.ts.map +0 -1
  234. package/dist/commands/connections/list.js +0 -25
  235. package/dist/commands/connections/list.js.map +0 -1
  236. package/dist/commands/connections/platforms.d.ts.map +0 -1
  237. package/dist/commands/connections/platforms.js.map +0 -1
  238. package/dist/commands/providers/add.d.ts +0 -2
  239. package/dist/commands/providers/add.d.ts.map +0 -1
  240. package/dist/commands/providers/add.js +0 -50
  241. package/dist/commands/providers/add.js.map +0 -1
  242. package/dist/commands/providers/list.d.ts +0 -2
  243. package/dist/commands/providers/list.d.ts.map +0 -1
  244. package/dist/commands/providers/list.js +0 -22
  245. package/dist/commands/providers/list.js.map +0 -1
  246. package/dist/commands/secrets.d.ts +0 -8
  247. package/dist/commands/secrets.d.ts.map +0 -1
  248. package/dist/commands/secrets.js +0 -98
  249. package/dist/commands/secrets.js.map +0 -1
  250. package/dist/commands/skills/add.d.ts +0 -5
  251. package/dist/commands/skills/add.d.ts.map +0 -1
  252. package/dist/commands/skills/add.js +0 -27
  253. package/dist/commands/skills/add.js.map +0 -1
  254. package/dist/commands/skills/list.d.ts +0 -2
  255. package/dist/commands/skills/list.d.ts.map +0 -1
  256. package/dist/commands/skills/list.js +0 -19
  257. package/dist/commands/skills/list.js.map +0 -1
  258. package/dist/commands/skills/registry.d.ts +0 -19
  259. package/dist/commands/skills/registry.d.ts.map +0 -1
  260. package/dist/commands/skills/registry.js +0 -76
  261. package/dist/commands/skills/registry.js.map +0 -1
  262. package/dist/config/agent-helpers.d.ts +0 -38
  263. package/dist/config/agent-helpers.d.ts.map +0 -1
  264. package/dist/config/agent-helpers.js +0 -58
  265. package/dist/config/agent-helpers.js.map +0 -1
  266. 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