clawdlets 0.2.1 → 0.2.4

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 (180) hide show
  1. package/dist/main.mjs +5037 -0
  2. package/node_modules/@clawdlets/clf-queue/package.json +5 -3
  3. package/node_modules/@clawdlets/core/dist/lib/clawdlets-config.d.ts +8 -0
  4. package/node_modules/@clawdlets/core/dist/lib/clawdlets-config.d.ts.map +1 -1
  5. package/node_modules/@clawdlets/core/dist/lib/clawdlets-config.js +6 -2
  6. package/node_modules/@clawdlets/core/dist/lib/clawdlets-config.js.map +1 -1
  7. package/node_modules/@clawdlets/core/package.json +1 -1
  8. package/package.json +16 -13
  9. package/dist/commands/bootstrap.d.ts +0 -43
  10. package/dist/commands/bootstrap.d.ts.map +0 -1
  11. package/dist/commands/bootstrap.js +0 -318
  12. package/dist/commands/bootstrap.js.map +0 -1
  13. package/dist/commands/bot.d.ts +0 -2
  14. package/dist/commands/bot.d.ts.map +0 -1
  15. package/dist/commands/bot.js +0 -97
  16. package/dist/commands/bot.js.map +0 -1
  17. package/dist/commands/cattle/common.d.ts +0 -29
  18. package/dist/commands/cattle/common.d.ts.map +0 -1
  19. package/dist/commands/cattle/common.js +0 -102
  20. package/dist/commands/cattle/common.js.map +0 -1
  21. package/dist/commands/cattle/destroy.d.ts +0 -33
  22. package/dist/commands/cattle/destroy.d.ts.map +0 -1
  23. package/dist/commands/cattle/destroy.js +0 -72
  24. package/dist/commands/cattle/destroy.js.map +0 -1
  25. package/dist/commands/cattle/list.d.ts +0 -20
  26. package/dist/commands/cattle/list.d.ts.map +0 -1
  27. package/dist/commands/cattle/list.js +0 -78
  28. package/dist/commands/cattle/list.js.map +0 -1
  29. package/dist/commands/cattle/logs.d.ts +0 -34
  30. package/dist/commands/cattle/logs.d.ts.map +0 -1
  31. package/dist/commands/cattle/logs.js +0 -55
  32. package/dist/commands/cattle/logs.js.map +0 -1
  33. package/dist/commands/cattle/persona.d.ts +0 -2
  34. package/dist/commands/cattle/persona.d.ts.map +0 -1
  35. package/dist/commands/cattle/persona.js +0 -85
  36. package/dist/commands/cattle/persona.js.map +0 -1
  37. package/dist/commands/cattle/reap.d.ts +0 -20
  38. package/dist/commands/cattle/reap.d.ts.map +0 -1
  39. package/dist/commands/cattle/reap.js +0 -60
  40. package/dist/commands/cattle/reap.js.map +0 -1
  41. package/dist/commands/cattle/spawn.d.ts +0 -73
  42. package/dist/commands/cattle/spawn.d.ts.map +0 -1
  43. package/dist/commands/cattle/spawn.js +0 -147
  44. package/dist/commands/cattle/spawn.js.map +0 -1
  45. package/dist/commands/cattle/ssh.d.ts +0 -20
  46. package/dist/commands/cattle/ssh.d.ts.map +0 -1
  47. package/dist/commands/cattle/ssh.js +0 -37
  48. package/dist/commands/cattle/ssh.js.map +0 -1
  49. package/dist/commands/cattle.d.ts +0 -2
  50. package/dist/commands/cattle.d.ts.map +0 -1
  51. package/dist/commands/cattle.js +0 -21
  52. package/dist/commands/cattle.js.map +0 -1
  53. package/dist/commands/config.d.ts +0 -2
  54. package/dist/commands/config.d.ts.map +0 -1
  55. package/dist/commands/config.js +0 -148
  56. package/dist/commands/config.js.map +0 -1
  57. package/dist/commands/doctor.d.ts +0 -35
  58. package/dist/commands/doctor.d.ts.map +0 -1
  59. package/dist/commands/doctor.js +0 -65
  60. package/dist/commands/doctor.js.map +0 -1
  61. package/dist/commands/env.d.ts +0 -22
  62. package/dist/commands/env.d.ts.map +0 -1
  63. package/dist/commands/env.js +0 -132
  64. package/dist/commands/env.js.map +0 -1
  65. package/dist/commands/fleet.d.ts +0 -2
  66. package/dist/commands/fleet.d.ts.map +0 -1
  67. package/dist/commands/fleet.js +0 -61
  68. package/dist/commands/fleet.js.map +0 -1
  69. package/dist/commands/host.d.ts +0 -2
  70. package/dist/commands/host.d.ts.map +0 -1
  71. package/dist/commands/host.js +0 -277
  72. package/dist/commands/host.js.map +0 -1
  73. package/dist/commands/image.d.ts +0 -2
  74. package/dist/commands/image.d.ts.map +0 -1
  75. package/dist/commands/image.js +0 -133
  76. package/dist/commands/image.js.map +0 -1
  77. package/dist/commands/infra.d.ts +0 -2
  78. package/dist/commands/infra.d.ts.map +0 -1
  79. package/dist/commands/infra.js +0 -171
  80. package/dist/commands/infra.js.map +0 -1
  81. package/dist/commands/lockdown.d.ts +0 -25
  82. package/dist/commands/lockdown.d.ts.map +0 -1
  83. package/dist/commands/lockdown.js +0 -93
  84. package/dist/commands/lockdown.js.map +0 -1
  85. package/dist/commands/project.d.ts +0 -2
  86. package/dist/commands/project.d.ts.map +0 -1
  87. package/dist/commands/project.js +0 -264
  88. package/dist/commands/project.js.map +0 -1
  89. package/dist/commands/secrets/common.d.ts +0 -8
  90. package/dist/commands/secrets/common.d.ts.map +0 -1
  91. package/dist/commands/secrets/common.js +0 -20
  92. package/dist/commands/secrets/common.js.map +0 -1
  93. package/dist/commands/secrets/init.d.ts +0 -39
  94. package/dist/commands/secrets/init.d.ts.map +0 -1
  95. package/dist/commands/secrets/init.js +0 -455
  96. package/dist/commands/secrets/init.js.map +0 -1
  97. package/dist/commands/secrets/path.d.ts +0 -11
  98. package/dist/commands/secrets/path.d.ts.map +0 -1
  99. package/dist/commands/secrets/path.js +0 -24
  100. package/dist/commands/secrets/path.js.map +0 -1
  101. package/dist/commands/secrets/sync.d.ts +0 -25
  102. package/dist/commands/secrets/sync.d.ts.map +0 -1
  103. package/dist/commands/secrets/sync.js +0 -67
  104. package/dist/commands/secrets/sync.js.map +0 -1
  105. package/dist/commands/secrets/verify.d.ts +0 -28
  106. package/dist/commands/secrets/verify.d.ts.map +0 -1
  107. package/dist/commands/secrets/verify.js +0 -118
  108. package/dist/commands/secrets/verify.js.map +0 -1
  109. package/dist/commands/secrets.d.ts +0 -2
  110. package/dist/commands/secrets.d.ts.map +0 -1
  111. package/dist/commands/secrets.js +0 -18
  112. package/dist/commands/secrets.js.map +0 -1
  113. package/dist/commands/server/common.d.ts +0 -3
  114. package/dist/commands/server/common.d.ts.map +0 -1
  115. package/dist/commands/server/common.js +0 -3
  116. package/dist/commands/server/common.js.map +0 -1
  117. package/dist/commands/server/deploy.d.ts +0 -53
  118. package/dist/commands/server/deploy.d.ts.map +0 -1
  119. package/dist/commands/server/deploy.js +0 -177
  120. package/dist/commands/server/deploy.js.map +0 -1
  121. package/dist/commands/server/github-sync.d.ts +0 -2
  122. package/dist/commands/server/github-sync.d.ts.map +0 -1
  123. package/dist/commands/server/github-sync.js +0 -166
  124. package/dist/commands/server/github-sync.js.map +0 -1
  125. package/dist/commands/server/manifest.d.ts +0 -28
  126. package/dist/commands/server/manifest.d.ts.map +0 -1
  127. package/dist/commands/server/manifest.js +0 -82
  128. package/dist/commands/server/manifest.js.map +0 -1
  129. package/dist/commands/server.d.ts +0 -2
  130. package/dist/commands/server.d.ts.map +0 -1
  131. package/dist/commands/server.js +0 -267
  132. package/dist/commands/server.js.map +0 -1
  133. package/dist/commands/ssh-target.d.ts +0 -3
  134. package/dist/commands/ssh-target.d.ts.map +0 -1
  135. package/dist/commands/ssh-target.js +0 -15
  136. package/dist/commands/ssh-target.js.map +0 -1
  137. package/dist/lib/context.d.ts +0 -21
  138. package/dist/lib/context.d.ts.map +0 -1
  139. package/dist/lib/context.js +0 -19
  140. package/dist/lib/context.js.map +0 -1
  141. package/dist/lib/deploy-gate.d.ts +0 -9
  142. package/dist/lib/deploy-gate.d.ts.map +0 -1
  143. package/dist/lib/deploy-gate.js +0 -20
  144. package/dist/lib/deploy-gate.js.map +0 -1
  145. package/dist/lib/deploy-manifest.d.ts +0 -11
  146. package/dist/lib/deploy-manifest.d.ts.map +0 -1
  147. package/dist/lib/deploy-manifest.js +0 -46
  148. package/dist/lib/deploy-manifest.js.map +0 -1
  149. package/dist/lib/doctor-render.d.ts +0 -14
  150. package/dist/lib/doctor-render.d.ts.map +0 -1
  151. package/dist/lib/doctor-render.js +0 -131
  152. package/dist/lib/doctor-render.js.map +0 -1
  153. package/dist/lib/host-resolve.d.ts +0 -6
  154. package/dist/lib/host-resolve.d.ts.map +0 -1
  155. package/dist/lib/host-resolve.js +0 -20
  156. package/dist/lib/host-resolve.js.map +0 -1
  157. package/dist/lib/linux-build.d.ts +0 -8
  158. package/dist/lib/linux-build.d.ts.map +0 -1
  159. package/dist/lib/linux-build.js +0 -15
  160. package/dist/lib/linux-build.js.map +0 -1
  161. package/dist/lib/manifest-signature.d.ts +0 -17
  162. package/dist/lib/manifest-signature.d.ts.map +0 -1
  163. package/dist/lib/manifest-signature.js +0 -52
  164. package/dist/lib/manifest-signature.js.map +0 -1
  165. package/dist/lib/template-spec.d.ts +0 -9
  166. package/dist/lib/template-spec.d.ts.map +0 -1
  167. package/dist/lib/template-spec.js +0 -50
  168. package/dist/lib/template-spec.js.map +0 -1
  169. package/dist/lib/version.d.ts +0 -3
  170. package/dist/lib/version.d.ts.map +0 -1
  171. package/dist/lib/version.js +0 -17
  172. package/dist/lib/version.js.map +0 -1
  173. package/dist/lib/wizard.d.ts +0 -10
  174. package/dist/lib/wizard.d.ts.map +0 -1
  175. package/dist/lib/wizard.js +0 -25
  176. package/dist/lib/wizard.js.map +0 -1
  177. package/dist/main.d.ts +0 -3
  178. package/dist/main.d.ts.map +0 -1
  179. package/dist/main.js +0 -50
  180. package/dist/main.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../src/commands/bot.ts"],"names":[],"mappings":"AA6FA,eAAO,MAAM,GAAG,qDAGd,CAAC"}
@@ -1,97 +0,0 @@
1
- import process from "node:process";
2
- import { defineCommand } from "citty";
3
- import * as p from "@clack/prompts";
4
- import { findRepoRoot } from "@clawdlets/core/lib/repo";
5
- import { ClawdletsConfigSchema, loadClawdletsConfig, writeClawdletsConfig } from "@clawdlets/core/lib/clawdlets-config";
6
- import { cancelFlow, navOnCancel, NAV_EXIT } from "../lib/wizard.js";
7
- function validateBotId(value) {
8
- const v = value.trim();
9
- if (!v)
10
- return "bot id required";
11
- if (!/^[a-z][a-z0-9_-]*$/.test(v))
12
- return "use: [a-z][a-z0-9_-]*";
13
- return undefined;
14
- }
15
- const list = defineCommand({
16
- meta: { name: "list", description: "List bots (from fleet/clawdlets.json)." },
17
- args: {},
18
- async run({ args }) {
19
- const repoRoot = findRepoRoot(process.cwd());
20
- const { config } = loadClawdletsConfig({ repoRoot });
21
- console.log((config.fleet.botOrder || []).join("\n"));
22
- },
23
- });
24
- const add = defineCommand({
25
- meta: { name: "add", description: "Add a bot id to fleet/clawdlets.json." },
26
- args: {
27
- bot: { type: "string", description: "Bot id (e.g. maren)." },
28
- interactive: { type: "boolean", description: "Prompt for missing inputs (requires TTY).", default: false },
29
- },
30
- async run({ args }) {
31
- const repoRoot = findRepoRoot(process.cwd());
32
- const { configPath, config } = loadClawdletsConfig({ repoRoot });
33
- let botId = String(args.bot || "").trim();
34
- if (!botId) {
35
- if (!args.interactive)
36
- throw new Error("missing --bot (or pass --interactive)");
37
- if (!process.stdout.isTTY)
38
- throw new Error("--interactive requires a TTY");
39
- p.intro("clawdlets bot add");
40
- const v = await p.text({ message: "Bot id", placeholder: "maren", validate: validateBotId });
41
- if (p.isCancel(v)) {
42
- const nav = await navOnCancel({ flow: "bot add", canBack: false });
43
- if (nav === NAV_EXIT)
44
- cancelFlow();
45
- return;
46
- }
47
- botId = String(v).trim();
48
- }
49
- const err = validateBotId(botId);
50
- if (err)
51
- throw new Error(err);
52
- const existingBots = config.fleet.botOrder;
53
- if (existingBots.includes(botId) || config.fleet.bots[botId]) {
54
- console.log(`ok: already present: ${botId}`);
55
- return;
56
- }
57
- const next = {
58
- ...config,
59
- fleet: {
60
- ...config.fleet,
61
- botOrder: [...existingBots, botId],
62
- bots: { ...config.fleet.bots, [botId]: {} },
63
- },
64
- };
65
- const validated = ClawdletsConfigSchema.parse(next);
66
- await writeClawdletsConfig({ configPath, config: validated });
67
- console.log(`ok: added bot ${botId}`);
68
- },
69
- });
70
- const rm = defineCommand({
71
- meta: { name: "rm", description: "Remove a bot id from fleet/clawdlets.json." },
72
- args: {
73
- bot: { type: "string", description: "Bot id to remove.", },
74
- },
75
- async run({ args }) {
76
- const repoRoot = findRepoRoot(process.cwd());
77
- const { configPath, config } = loadClawdletsConfig({ repoRoot });
78
- const botId = String(args.bot || "").trim();
79
- if (!botId)
80
- throw new Error("missing --bot");
81
- const existingBots = config.fleet.botOrder;
82
- if (!existingBots.includes(botId) && !config.fleet.bots[botId])
83
- throw new Error(`bot not found: ${botId}`);
84
- const nextBots = existingBots.filter((b) => b !== botId);
85
- const nextBotsRecord = { ...config.fleet.bots };
86
- delete nextBotsRecord[botId];
87
- const next = { ...config, fleet: { ...config.fleet, botOrder: nextBots, bots: nextBotsRecord } };
88
- const validated = ClawdletsConfigSchema.parse(next);
89
- await writeClawdletsConfig({ configPath, config: validated });
90
- console.log(`ok: removed bot ${botId}`);
91
- },
92
- });
93
- export const bot = defineCommand({
94
- meta: { name: "bot", description: "Manage fleet bots." },
95
- subCommands: { add, list, rm },
96
- });
97
- //# sourceMappingURL=bot.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bot.js","sourceRoot":"","sources":["../../src/commands/bot.ts"],"names":[],"mappings":"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"}
@@ -1,29 +0,0 @@
1
- import { type CattleTask } from "@clawdlets/core/lib/cattle-task";
2
- import type { CattleServer } from "@clawdlets/core/lib/hcloud-cattle";
3
- export declare function requireEnabled(params: {
4
- enabled: boolean;
5
- hint: string;
6
- }): void;
7
- export declare function requireFile(pathname: string, label: string): void;
8
- export declare function readJsonFile(filePath: string): unknown;
9
- export declare function requireTtlSeconds(ttlRaw: string): {
10
- seconds: number;
11
- normalized: string;
12
- };
13
- export declare function unixSecondsNow(): number;
14
- export declare function formatAgeSeconds(seconds: number): string;
15
- export declare function formatTable(rows: string[][]): string;
16
- export declare function resolveTailscaleIpv4(hostname: string): Promise<string>;
17
- export declare function loadTaskFromFile(taskFile: string): CattleTask;
18
- export declare function waitForClfJobTerminal(params: {
19
- client: {
20
- show: (jobId: string) => Promise<{
21
- job: any;
22
- }>;
23
- };
24
- jobId: string;
25
- timeoutMs: number;
26
- pollMs: number;
27
- }): Promise<any>;
28
- export declare function resolveOne(servers: CattleServer[], idOrName: string): CattleServer;
29
- //# sourceMappingURL=common.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../src/commands/cattle/common.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgD,KAAK,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAChH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEtE,wBAAgB,cAAc,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAG/E;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAGjE;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAOtD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAIzF;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAUxD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CAWpD;AAED,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO5E;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAK7D;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,MAAM,EAAE;QAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;YAAE,GAAG,EAAE,GAAG,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,GAAG,CAAC,CAWf;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,CAQlF"}
@@ -1,102 +0,0 @@
1
- import fs from "node:fs";
2
- import { capture } from "@clawdlets/core/lib/run";
3
- import { parseTtlToSeconds } from "@clawdlets/core/lib/ttl";
4
- import { CattleTaskSchema, CATTLE_TASK_SCHEMA_VERSION } from "@clawdlets/core/lib/cattle-task";
5
- export function requireEnabled(params) {
6
- if (params.enabled)
7
- return;
8
- throw new Error(params.hint);
9
- }
10
- export function requireFile(pathname, label) {
11
- if (fs.existsSync(pathname))
12
- return;
13
- throw new Error(`${label} missing: ${pathname}`);
14
- }
15
- export function readJsonFile(filePath) {
16
- const raw = fs.readFileSync(filePath, "utf8");
17
- try {
18
- return JSON.parse(raw);
19
- }
20
- catch (e) {
21
- throw new Error(`invalid JSON: ${filePath} (${String(e?.message || e)})`);
22
- }
23
- }
24
- export function requireTtlSeconds(ttlRaw) {
25
- const parsed = parseTtlToSeconds(ttlRaw);
26
- if (!parsed)
27
- throw new Error(`invalid --ttl: ${ttlRaw} (expected e.g. 30m, 2h, 1d)`);
28
- return { seconds: parsed.seconds, normalized: parsed.raw };
29
- }
30
- export function unixSecondsNow() {
31
- return Math.floor(Date.now() / 1000);
32
- }
33
- export function formatAgeSeconds(seconds) {
34
- const s = Math.max(0, Math.floor(seconds));
35
- const d = Math.floor(s / 86400);
36
- const h = Math.floor((s % 86400) / 3600);
37
- const m = Math.floor((s % 3600) / 60);
38
- const ss = s % 60;
39
- if (d > 0)
40
- return `${d}d${h}h`;
41
- if (h > 0)
42
- return `${h}h${m}m`;
43
- if (m > 0)
44
- return `${m}m${ss}s`;
45
- return `${ss}s`;
46
- }
47
- export function formatTable(rows) {
48
- if (rows.length === 0)
49
- return "";
50
- const widths = [];
51
- for (const r of rows) {
52
- for (let i = 0; i < r.length; i++) {
53
- widths[i] = Math.max(widths[i] || 0, String(r[i] ?? "").length);
54
- }
55
- }
56
- return rows
57
- .map((r) => r.map((c, i) => String(c ?? "").padEnd(widths[i] || 0)).join(" ").trimEnd())
58
- .join("\n");
59
- }
60
- export async function resolveTailscaleIpv4(hostname) {
61
- const name = String(hostname || "").trim();
62
- if (!name)
63
- throw new Error("hostname missing for tailscale ip resolution");
64
- const out = await capture("tailscale", ["ip", "--1", "--4", name], { maxOutputBytes: 4096 });
65
- const ip = out.trim();
66
- if (!ip)
67
- throw new Error(`tailscale ip returned empty output for ${name}`);
68
- return ip;
69
- }
70
- export function loadTaskFromFile(taskFile) {
71
- const raw = readJsonFile(taskFile);
72
- const parsed = CattleTaskSchema.safeParse(raw);
73
- if (!parsed.success)
74
- throw new Error(`invalid task file (expected schemaVersion ${CATTLE_TASK_SCHEMA_VERSION}): ${taskFile}`);
75
- return parsed.data;
76
- }
77
- export async function waitForClfJobTerminal(params) {
78
- const start = Date.now();
79
- while (true) {
80
- const res = await params.client.show(params.jobId);
81
- const job = res.job;
82
- if (job?.status === "done" || job?.status === "failed" || job?.status === "canceled")
83
- return job;
84
- if (Date.now() - start > params.timeoutMs) {
85
- throw new Error(`timeout waiting for job ${params.jobId} (last=${String(job?.status || "")})`);
86
- }
87
- await new Promise((r) => setTimeout(r, params.pollMs));
88
- }
89
- }
90
- export function resolveOne(servers, idOrName) {
91
- const v = String(idOrName || "").trim();
92
- if (!v)
93
- throw new Error("missing id/name");
94
- const byId = servers.find((s) => s.id === v);
95
- if (byId)
96
- return byId;
97
- const byName = servers.find((s) => s.name === v);
98
- if (byName)
99
- return byName;
100
- throw new Error(`cattle server not found: ${v}`);
101
- }
102
- //# sourceMappingURL=common.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/commands/cattle/common.ts"],"names":[],"mappings":"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"}
@@ -1,33 +0,0 @@
1
- export declare const cattleDestroy: import("citty").CommandDef<{
2
- runtimeDir: {
3
- type: "string";
4
- description: string;
5
- };
6
- envFile: {
7
- type: "string";
8
- description: string;
9
- };
10
- host: {
11
- type: "string";
12
- description: string;
13
- };
14
- idOrName: {
15
- type: "string";
16
- description: string;
17
- };
18
- all: {
19
- type: "boolean";
20
- description: string;
21
- default: false;
22
- };
23
- persona: {
24
- type: "string";
25
- description: string;
26
- };
27
- dryRun: {
28
- type: "boolean";
29
- description: string;
30
- default: false;
31
- };
32
- }>;
33
- //# sourceMappingURL=destroy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"destroy.d.ts","sourceRoot":"","sources":["../../../src/commands/cattle/destroy.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkExB,CAAC"}
@@ -1,72 +0,0 @@
1
- import process from "node:process";
2
- import { defineCommand } from "citty";
3
- import { loadDeployCreds } from "@clawdlets/core/lib/deploy-creds";
4
- import { safeCattleLabelValue } from "@clawdlets/core/lib/cattle-planner";
5
- import { openCattleState } from "@clawdlets/core/lib/cattle-state";
6
- import { CATTLE_LABEL_PERSONA, buildCattleLabelSelector, destroyCattleServer, listCattleServers, } from "@clawdlets/core/lib/hcloud-cattle";
7
- import { loadHostContextOrExit } from "../../lib/context.js";
8
- import { formatTable, requireEnabled, resolveOne, unixSecondsNow } from "./common.js";
9
- export const cattleDestroy = defineCommand({
10
- meta: { name: "destroy", description: "Destroy cattle servers (Hetzner delete)." },
11
- args: {
12
- runtimeDir: { type: "string", description: "Runtime directory (default: .clawdlets)." },
13
- envFile: { type: "string", description: "Env file for deploy creds (default: <runtimeDir>/env)." },
14
- host: { type: "string", description: "Host name (defaults to clawdlets.json defaultHost / sole host)." },
15
- idOrName: { type: "string", description: "Cattle server id or name." },
16
- all: { type: "boolean", description: "Destroy all cattle servers.", default: false },
17
- persona: { type: "string", description: "Filter by persona (with --all)." },
18
- dryRun: { type: "boolean", description: "Print plan without deleting.", default: false },
19
- },
20
- async run({ args }) {
21
- const cwd = process.cwd();
22
- const ctx = loadHostContextOrExit({ cwd, runtimeDir: args.runtimeDir, hostArg: args.host });
23
- if (!ctx)
24
- return;
25
- const { layout, config } = ctx;
26
- requireEnabled({
27
- enabled: Boolean(config.cattle?.enabled),
28
- hint: "cattle is disabled (set cattle.enabled=true in fleet/clawdlets.json)",
29
- });
30
- const deployCreds = loadDeployCreds({ cwd, runtimeDir: args.runtimeDir, envFile: args.envFile });
31
- const hcloudToken = String(deployCreds.values.HCLOUD_TOKEN || "").trim();
32
- if (!hcloudToken)
33
- throw new Error("missing HCLOUD_TOKEN (set in .clawdlets/env or env var; run: clawdlets env init)");
34
- const personaFilterRaw = String(args.persona || "").trim();
35
- const personaFilter = personaFilterRaw ? safeCattleLabelValue(personaFilterRaw, "persona") : "";
36
- const servers = await listCattleServers({
37
- token: hcloudToken,
38
- labelSelector: buildCattleLabelSelector(personaFilter ? { [CATTLE_LABEL_PERSONA]: personaFilter } : {}),
39
- });
40
- const targets = [];
41
- if (args.all) {
42
- targets.push(...servers);
43
- }
44
- else {
45
- const idOrName = String(args.idOrName || "").trim();
46
- if (!idOrName)
47
- throw new Error("missing <idOrName> (or pass --all)");
48
- targets.push(resolveOne(servers, idOrName));
49
- }
50
- if (targets.length === 0) {
51
- console.log("ok: no matching cattle servers");
52
- return;
53
- }
54
- const st = openCattleState(layout.cattleDbPath);
55
- try {
56
- if (args.dryRun) {
57
- console.log(formatTable([["ID", "NAME", "PERSONA", "TASK", "STATUS"], ...targets.map((s) => [s.id, s.name, s.persona || "-", s.taskId || "-", s.status])]));
58
- return;
59
- }
60
- const now = unixSecondsNow();
61
- for (const t of targets) {
62
- await destroyCattleServer({ token: hcloudToken, id: t.id });
63
- st.markDeletedById(t.id, now);
64
- }
65
- }
66
- finally {
67
- st.close();
68
- }
69
- console.log(`ok: destroyed ${targets.length} cattle server(s)`);
70
- },
71
- });
72
- //# sourceMappingURL=destroy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"destroy.js","sourceRoot":"","sources":["../../../src/commands/cattle/destroy.ts"],"names":[],"mappings":"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"}
@@ -1,20 +0,0 @@
1
- export declare const cattleList: import("citty").CommandDef<{
2
- runtimeDir: {
3
- type: "string";
4
- description: string;
5
- };
6
- envFile: {
7
- type: "string";
8
- description: string;
9
- };
10
- host: {
11
- type: "string";
12
- description: string;
13
- };
14
- json: {
15
- type: "boolean";
16
- description: string;
17
- default: false;
18
- };
19
- }>;
20
- //# sourceMappingURL=list.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/cattle/list.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;EA0ErB,CAAC"}
@@ -1,78 +0,0 @@
1
- import process from "node:process";
2
- import { defineCommand } from "citty";
3
- import { loadDeployCreds } from "@clawdlets/core/lib/deploy-creds";
4
- import { openCattleState } from "@clawdlets/core/lib/cattle-state";
5
- import { buildCattleLabelSelector, listCattleServers } from "@clawdlets/core/lib/hcloud-cattle";
6
- import { loadHostContextOrExit } from "../../lib/context.js";
7
- import { formatAgeSeconds, formatTable, requireEnabled, unixSecondsNow } from "./common.js";
8
- export const cattleList = defineCommand({
9
- meta: { name: "list", description: "List active cattle servers (Hetzner + local state reconciliation)." },
10
- args: {
11
- runtimeDir: { type: "string", description: "Runtime directory (default: .clawdlets)." },
12
- envFile: { type: "string", description: "Env file for deploy creds (default: <runtimeDir>/env)." },
13
- host: { type: "string", description: "Host name (defaults to clawdlets.json defaultHost / sole host)." },
14
- json: { type: "boolean", description: "Output JSON.", default: false },
15
- },
16
- async run({ args }) {
17
- const cwd = process.cwd();
18
- const ctx = loadHostContextOrExit({ cwd, runtimeDir: args.runtimeDir, hostArg: args.host });
19
- if (!ctx)
20
- return;
21
- const { layout, config } = ctx;
22
- requireEnabled({
23
- enabled: Boolean(config.cattle?.enabled),
24
- hint: "cattle is disabled (set cattle.enabled=true in fleet/clawdlets.json)",
25
- });
26
- const deployCreds = loadDeployCreds({ cwd, runtimeDir: args.runtimeDir, envFile: args.envFile });
27
- const hcloudToken = String(deployCreds.values.HCLOUD_TOKEN || "").trim();
28
- if (!hcloudToken)
29
- throw new Error("missing HCLOUD_TOKEN (set in .clawdlets/env or env var; run: clawdlets env init)");
30
- const servers = await listCattleServers({ token: hcloudToken, labelSelector: buildCattleLabelSelector() });
31
- const now = unixSecondsNow();
32
- const byId = new Map();
33
- for (const s of servers)
34
- byId.set(s.id, s);
35
- const st = openCattleState(layout.cattleDbPath);
36
- try {
37
- const activeLocal = st.listActive();
38
- const remoteIds = new Set(servers.map((s) => s.id));
39
- for (const local of activeLocal) {
40
- if (!remoteIds.has(local.id))
41
- st.markDeletedById(local.id, now);
42
- }
43
- for (const s of servers) {
44
- const existing = st.findActiveByIdOrName(s.id);
45
- st.upsertServer({
46
- id: s.id,
47
- name: s.name,
48
- persona: s.persona || existing?.persona || "",
49
- task: existing?.task || s.taskId || "",
50
- taskId: s.taskId || existing?.taskId || "",
51
- ttlSeconds: s.ttlSeconds,
52
- createdAt: Math.floor(s.createdAt.getTime() / 1000),
53
- expiresAt: Math.floor(s.expiresAt.getTime() / 1000),
54
- labels: s.labels || existing?.labels || {},
55
- lastStatus: s.status,
56
- lastIpv4: s.ipv4,
57
- });
58
- }
59
- }
60
- finally {
61
- st.close();
62
- }
63
- const sorted = [...servers].sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime() || a.id.localeCompare(b.id));
64
- if (args.json) {
65
- console.log(JSON.stringify({ servers: sorted }, null, 2));
66
- return;
67
- }
68
- const rows = [
69
- ["ID", "NAME", "PERSONA", "TASK", "STATUS", "TTL"],
70
- ...sorted.map((s) => {
71
- const ttlLeft = Math.max(0, Math.floor(s.expiresAt.getTime() / 1000) - now);
72
- return [s.id, s.name, s.persona || "-", s.taskId || "-", s.status, formatAgeSeconds(ttlLeft)];
73
- }),
74
- ];
75
- console.log(formatTable(rows));
76
- },
77
- });
78
- //# sourceMappingURL=list.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/cattle/list.ts"],"names":[],"mappings":"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"}
@@ -1,34 +0,0 @@
1
- export declare const cattleLogs: import("citty").CommandDef<{
2
- runtimeDir: {
3
- type: "string";
4
- description: string;
5
- };
6
- envFile: {
7
- type: "string";
8
- description: string;
9
- };
10
- host: {
11
- type: "string";
12
- description: string;
13
- };
14
- idOrName: {
15
- type: "string";
16
- description: string;
17
- required: true;
18
- };
19
- lines: {
20
- type: "string";
21
- description: string;
22
- default: string;
23
- };
24
- since: {
25
- type: "string";
26
- description: string;
27
- };
28
- follow: {
29
- type: "boolean";
30
- description: string;
31
- default: false;
32
- };
33
- }>;
34
- //# sourceMappingURL=logs.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../../src/commands/cattle/logs.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkDrB,CAAC"}
@@ -1,55 +0,0 @@
1
- import process from "node:process";
2
- import { defineCommand } from "citty";
3
- import { loadDeployCreds } from "@clawdlets/core/lib/deploy-creds";
4
- import { buildCattleLabelSelector, listCattleServers } from "@clawdlets/core/lib/hcloud-cattle";
5
- import { shellQuote, sshRun } from "@clawdlets/core/lib/ssh-remote";
6
- import { loadHostContextOrExit } from "../../lib/context.js";
7
- import { requireEnabled, resolveOne, resolveTailscaleIpv4 } from "./common.js";
8
- export const cattleLogs = defineCommand({
9
- meta: { name: "logs", description: "Stream logs from a cattle VM over tailnet SSH." },
10
- args: {
11
- runtimeDir: { type: "string", description: "Runtime directory (default: .clawdlets)." },
12
- envFile: { type: "string", description: "Env file for deploy creds (default: <runtimeDir>/env)." },
13
- host: { type: "string", description: "Host name (defaults to clawdlets.json defaultHost / sole host)." },
14
- idOrName: { type: "string", description: "Cattle server id or name.", required: true },
15
- lines: { type: "string", description: "Number of lines (default: 200).", default: "200" },
16
- since: { type: "string", description: "Time window (journalctl syntax, e.g. '10m ago')." },
17
- follow: { type: "boolean", description: "Follow logs.", default: false },
18
- },
19
- async run({ args }) {
20
- const cwd = process.cwd();
21
- const ctx = loadHostContextOrExit({ cwd, runtimeDir: args.runtimeDir, hostArg: args.host });
22
- if (!ctx)
23
- return;
24
- const { config } = ctx;
25
- requireEnabled({
26
- enabled: Boolean(config.cattle?.enabled),
27
- hint: "cattle is disabled (set cattle.enabled=true in fleet/clawdlets.json)",
28
- });
29
- const deployCreds = loadDeployCreds({ cwd, runtimeDir: args.runtimeDir, envFile: args.envFile });
30
- const hcloudToken = String(deployCreds.values.HCLOUD_TOKEN || "").trim();
31
- if (!hcloudToken)
32
- throw new Error("missing HCLOUD_TOKEN (set in .clawdlets/env or env var; run: clawdlets env init)");
33
- const servers = await listCattleServers({ token: hcloudToken, labelSelector: buildCattleLabelSelector() });
34
- const server = resolveOne(servers, String(args.idOrName || ""));
35
- const ip = await resolveTailscaleIpv4(server.name);
36
- const targetHost = `admin@${ip}`;
37
- const n = String(args.lines || "200").trim() || "200";
38
- if (!/^\d+$/.test(n) || Number(n) <= 0)
39
- throw new Error(`invalid --lines: ${n}`);
40
- const since = args.since ? String(args.since).trim() : "";
41
- const remoteCmd = [
42
- "sudo",
43
- "journalctl",
44
- "-u",
45
- shellQuote("clawdlets-cattle.service"),
46
- "-n",
47
- shellQuote(n),
48
- ...(since ? ["--since", shellQuote(since)] : []),
49
- ...(args.follow ? ["-f"] : []),
50
- "--no-pager",
51
- ].join(" ");
52
- await sshRun(targetHost, remoteCmd, { redact: [] });
53
- },
54
- });
55
- //# sourceMappingURL=logs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../src/commands/cattle/logs.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare const cattlePersona: import("citty").CommandDef<import("citty").ArgsDef>;
2
- //# sourceMappingURL=persona.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"persona.d.ts","sourceRoot":"","sources":["../../../src/commands/cattle/persona.ts"],"names":[],"mappings":"AAoFA,eAAO,MAAM,aAAa,qDAGxB,CAAC"}