@1claw/cli 0.36.6 → 0.37.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provisioning.d.ts","sourceRoot":"","sources":["../../../src/lib/provisioning.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,OAAO,EAIH,KAAK,YAAY,EACpB,MAAM,oBAAoB,CAAC;AAS5B,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;CACxB;AAED,wBAAsB,uBAAuB,CACzC,aAAa,EAAE,MAAM,GACtB,OAAO,CAAC,eAAe,CAAC,CAkF1B;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BzE;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC5C,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;CAC9B,GAAG,OAAO,CAAC,MAAM,CAAC,CA0FlB;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAahE;AAED;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAgBnD;AAED,wBAAsB,cAAc,CAChC,IAAI,EAAE,MAAM,EACZ,QAAQ,SAAY,EACpB,SAAS,SAAQ,GAClB,OAAO,CAAC,OAAO,CAAC,CAalB"}
@@ -0,0 +1,256 @@
1
+ /**
2
+ * Shared provisioning and daemon lifecycle helpers used by both `init` and
3
+ * `spawn` commands. Extracted from init.ts to avoid duplication.
4
+ */
5
+ import ora from "ora";
6
+ import inquirer from "inquirer";
7
+ import { api } from "../client.js";
8
+ import { getToken } from "../config.js";
9
+ import { loginWithDevice } from "../auth.js";
10
+ import { printInfo } from "../output.js";
11
+ import { vaultExists, createVault, loadVault, saveVault, addSecret, getSecret, } from "../local-vault.js";
12
+ import { loadPolicy, savePolicy, setSecretPolicy, } from "../local-policy.js";
13
+ import { daemonSocketPath, daemonHealthy, startDaemonDetached, stopDaemon, } from "./daemon-control.js";
14
+ import { sanitizeName } from "./container-config.js";
15
+ export async function provisionCloudResources(containerName) {
16
+ const sid = sanitizeName(containerName);
17
+ const agentSpinner = ora("Provisioning agent...").start();
18
+ let agentId;
19
+ let apiKey;
20
+ try {
21
+ const res = await api("/agents", {
22
+ method: "POST",
23
+ body: {
24
+ name: `docker-agent-${sid}`.slice(0, 60),
25
+ description: "Created by `1claw init --docker`",
26
+ shroud_enabled: true,
27
+ intents_api_enabled: true,
28
+ auth_method: "api_key",
29
+ },
30
+ });
31
+ agentId = "agent" in res ? res.agent.id : res.id;
32
+ if (!res.api_key) {
33
+ agentSpinner.fail("Agent created but no API key returned.");
34
+ throw new Error("No agent API key returned by the API.");
35
+ }
36
+ apiKey = res.api_key;
37
+ agentSpinner.succeed(`Agent provisioned (${agentId.slice(0, 8)}…)`);
38
+ }
39
+ catch (err) {
40
+ agentSpinner.fail("Failed to provision agent.");
41
+ throw err;
42
+ }
43
+ const vaultSpinner = ora("Creating vault...").start();
44
+ let vaultId;
45
+ let vaultName;
46
+ try {
47
+ const vault = await api("/vaults", {
48
+ method: "POST",
49
+ body: {
50
+ name: `docker-vault-${sid}`.slice(0, 60),
51
+ description: "Created by `1claw init --docker`",
52
+ },
53
+ });
54
+ vaultId = vault.id;
55
+ vaultName = vault.name;
56
+ vaultSpinner.succeed(`Vault created (${vaultName})`);
57
+ }
58
+ catch (err) {
59
+ vaultSpinner.fail("Failed to create vault.");
60
+ throw err;
61
+ }
62
+ const policySpinner = ora("Binding vault and granting read policy...").start();
63
+ try {
64
+ await api(`/agents/${agentId}`, {
65
+ method: "PATCH",
66
+ body: { vault_ids: [vaultId] },
67
+ });
68
+ await api(`/vaults/${vaultId}/policies`, {
69
+ method: "POST",
70
+ body: {
71
+ principal_type: "agent",
72
+ principal_id: agentId,
73
+ secret_path_pattern: "secrets/*",
74
+ permissions: ["read"],
75
+ },
76
+ });
77
+ await api(`/vaults/${vaultId}/policies`, {
78
+ method: "POST",
79
+ body: {
80
+ principal_type: "agent",
81
+ principal_id: agentId,
82
+ secret_path_pattern: "providers/*",
83
+ permissions: ["read"],
84
+ },
85
+ });
86
+ policySpinner.succeed("Vault bound; read policies on secrets/* and providers/* granted.");
87
+ }
88
+ catch (err) {
89
+ policySpinner.fail("Failed to bind vault / create policy.");
90
+ throw err;
91
+ }
92
+ return { agentId, apiKey, vaultId, vaultName };
93
+ }
94
+ export async function resolvePassphrase(confirm) {
95
+ if (process.env.ONECLAW_VAULT_PASSPHRASE) {
96
+ return process.env.ONECLAW_VAULT_PASSPHRASE;
97
+ }
98
+ const { passphrase } = await inquirer.prompt([
99
+ {
100
+ type: "password",
101
+ name: "passphrase",
102
+ message: "Local vault passphrase:",
103
+ mask: "*",
104
+ validate: (v) => v.length >= 8 ? true : "Passphrase must be at least 8 characters",
105
+ },
106
+ ]);
107
+ if (confirm) {
108
+ const { confirmed } = await inquirer.prompt([
109
+ {
110
+ type: "password",
111
+ name: "confirmed",
112
+ message: "Confirm passphrase:",
113
+ mask: "*",
114
+ },
115
+ ]);
116
+ if (passphrase !== confirmed) {
117
+ throw new Error("Passphrases do not match.");
118
+ }
119
+ }
120
+ return passphrase;
121
+ }
122
+ export async function ensureDaemonRunning(opts) {
123
+ const socketPath = daemonSocketPath();
124
+ const alreadyRunning = await daemonHealthy(socketPath);
125
+ const storeKeys = opts.storeKeys ?? [];
126
+ const needVaultWrite = storeKeys.length > 0;
127
+ const needStart = !alreadyRunning;
128
+ const needReload = needVaultWrite && alreadyRunning;
129
+ if (!needVaultWrite && !needStart) {
130
+ return socketPath;
131
+ }
132
+ const creatingVault = !vaultExists();
133
+ let passphrase;
134
+ if (creatingVault) {
135
+ printInfo("No local vault found — creating one for the daemon.");
136
+ passphrase = await resolvePassphrase(true);
137
+ createVault(passphrase);
138
+ }
139
+ else {
140
+ passphrase = await resolvePassphrase(false);
141
+ try {
142
+ loadVault(passphrase);
143
+ }
144
+ catch {
145
+ throw new Error("Wrong passphrase for the existing local vault.\n" +
146
+ " • If you mistyped it, re-run and enter the correct passphrase.\n" +
147
+ " • If you've forgotten it, reset the vault with: 1claw local destroy --force\n" +
148
+ " (this permanently deletes the old local vault and its secrets), then re-run.");
149
+ }
150
+ }
151
+ if (needVaultWrite && passphrase) {
152
+ let vault;
153
+ try {
154
+ vault = loadVault(passphrase);
155
+ }
156
+ catch {
157
+ throw new Error("Wrong passphrase or corrupted local vault.");
158
+ }
159
+ const policy = loadPolicy();
160
+ for (const spec of storeKeys) {
161
+ if (spec.value !== undefined) {
162
+ addSecret(vault, spec.path, spec.value, spec.type ?? "api_key");
163
+ }
164
+ else if (!getSecret(vault, spec.path)) {
165
+ throw new Error(`Provider key secret "${spec.path}" not found in the local vault.\n` +
166
+ ` Add it first: 1claw local add ${spec.path}`);
167
+ }
168
+ setSecretPolicy(policy, spec.path, spec.policy);
169
+ }
170
+ saveVault(vault, passphrase);
171
+ savePolicy(policy);
172
+ }
173
+ if (needReload) {
174
+ const spinner = ora("Reloading daemon to pick up new secrets...").start();
175
+ await stopDaemon(socketPath);
176
+ const ok = await startDaemonDetached(passphrase, socketPath);
177
+ if (!ok) {
178
+ spinner.fail("Daemon did not come back up.");
179
+ throw new Error("Failed to reload the daemon.\n" +
180
+ " • Check status: 1claw daemon status\n" +
181
+ " • Start it manually (shows errors): 1claw daemon start");
182
+ }
183
+ spinner.succeed(`Daemon reloaded on ${socketPath}`);
184
+ }
185
+ else if (needStart) {
186
+ if (!passphrase)
187
+ passphrase = await resolvePassphrase(false);
188
+ const spinner = ora("Starting local daemon...").start();
189
+ const ok = await startDaemonDetached(passphrase, socketPath);
190
+ if (!ok) {
191
+ spinner.fail("Daemon did not become ready in time.");
192
+ throw new Error("Failed to start the daemon.\n" +
193
+ " • Check status: 1claw daemon status\n" +
194
+ " • Start it manually (shows errors): 1claw daemon start\n" +
195
+ " • Stop a stuck daemon: 1claw daemon stop\n" +
196
+ " • Forgot the vault passphrase? Reset it: 1claw local destroy --force");
197
+ }
198
+ spinner.succeed(`Daemon running on ${socketPath}`);
199
+ }
200
+ else {
201
+ printInfo(`Reusing running daemon at ${socketPath}`);
202
+ }
203
+ return socketPath;
204
+ }
205
+ export function defaultModelForProvider(provider) {
206
+ switch (provider.toLowerCase()) {
207
+ case "anthropic":
208
+ return "claude-3-5-haiku-latest";
209
+ case "google":
210
+ case "gemini":
211
+ return "gemini-2.5-flash";
212
+ case "mistral":
213
+ return "mistral-small-latest";
214
+ case "openai":
215
+ default:
216
+ return "gpt-4o-mini";
217
+ }
218
+ }
219
+ /**
220
+ * Ensure the user is authenticated. Prompts for login if needed.
221
+ * Returns true if authenticated, false if the user declined.
222
+ */
223
+ export async function ensureAuth() {
224
+ if (getToken())
225
+ return true;
226
+ printInfo("You need to log in to provision cloud resources.");
227
+ const { shouldLogin } = await inquirer.prompt([
228
+ {
229
+ type: "confirm",
230
+ name: "shouldLogin",
231
+ message: "Log in now? (choose No to run offline with --local)",
232
+ default: true,
233
+ },
234
+ ]);
235
+ if (!shouldLogin)
236
+ return false;
237
+ const auth = await loginWithDevice();
238
+ return !!auth;
239
+ }
240
+ export async function waitForHealthy(port, endpoint = "/health", timeoutMs = 30000) {
241
+ const deadline = Date.now() + timeoutMs;
242
+ const url = `http://localhost:${port}${endpoint}`;
243
+ while (Date.now() < deadline) {
244
+ try {
245
+ const res = await fetch(url);
246
+ if (res.ok)
247
+ return true;
248
+ }
249
+ catch {
250
+ // not up yet
251
+ }
252
+ await new Promise((r) => setTimeout(r, 500));
253
+ }
254
+ return false;
255
+ }
256
+ //# sourceMappingURL=provisioning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provisioning.js","sourceRoot":"","sources":["../../../src/lib/provisioning.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAgB,MAAM,cAAc,CAAC;AACvD,OAAO,EACH,WAAW,EACX,WAAW,EACX,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,GACZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACH,UAAU,EACV,UAAU,EACV,eAAe,GAElB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACH,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,UAAU,GACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAgBrD,MAAM,CAAC,KAAK,UAAU,uBAAuB,CACzC,aAAqB;IAErB,MAAM,GAAG,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;IAExC,MAAM,YAAY,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC;IAC1D,IAAI,OAAe,CAAC;IACpB,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,GAAG,CAGnB,SAAS,EAAE;YACT,MAAM,EAAE,MAAM;YACd,IAAI,EAAE;gBACF,IAAI,EAAE,gBAAgB,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;gBACxC,WAAW,EAAE,kCAAkC;gBAC/C,cAAc,EAAE,IAAI;gBACpB,mBAAmB,EAAE,IAAI;gBACzB,WAAW,EAAE,SAAS;aACzB;SACJ,CAAC,CAAC;QACH,OAAO,GAAG,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACf,YAAY,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YAC5D,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;QACrB,YAAY,CAAC,OAAO,CAAC,sBAAsB,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,YAAY,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAChD,MAAM,GAAG,CAAC;IACd,CAAC;IAED,MAAM,YAAY,GAAG,GAAG,CAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,CAAC;IACtD,IAAI,OAAe,CAAC;IACpB,IAAI,SAAiB,CAAC;IACtB,IAAI,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,GAAG,CAA+B,SAAS,EAAE;YAC7D,MAAM,EAAE,MAAM;YACd,IAAI,EAAE;gBACF,IAAI,EAAE,gBAAgB,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;gBACxC,WAAW,EAAE,kCAAkC;aAClD;SACJ,CAAC,CAAC;QACH,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC;QACnB,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;QACvB,YAAY,CAAC,OAAO,CAAC,kBAAkB,SAAS,GAAG,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,YAAY,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC7C,MAAM,GAAG,CAAC;IACd,CAAC;IAED,MAAM,aAAa,GAAG,GAAG,CAAC,2CAA2C,CAAC,CAAC,KAAK,EAAE,CAAC;IAC/E,IAAI,CAAC;QACD,MAAM,GAAG,CAAC,WAAW,OAAO,EAAE,EAAE;YAC5B,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE;SACjC,CAAC,CAAC;QACH,MAAM,GAAG,CAAC,WAAW,OAAO,WAAW,EAAE;YACrC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE;gBACF,cAAc,EAAE,OAAO;gBACvB,YAAY,EAAE,OAAO;gBACrB,mBAAmB,EAAE,WAAW;gBAChC,WAAW,EAAE,CAAC,MAAM,CAAC;aACxB;SACJ,CAAC,CAAC;QACH,MAAM,GAAG,CAAC,WAAW,OAAO,WAAW,EAAE;YACrC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE;gBACF,cAAc,EAAE,OAAO;gBACvB,YAAY,EAAE,OAAO;gBACrB,mBAAmB,EAAE,aAAa;gBAClC,WAAW,EAAE,CAAC,MAAM,CAAC;aACxB;SACJ,CAAC,CAAC;QACH,aAAa,CAAC,OAAO,CAAC,kEAAkE,CAAC,CAAC;IAC9F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,aAAa,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QAC5D,MAAM,GAAG,CAAC;IACd,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAgB;IACpD,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC;QACvC,OAAO,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;IAChD,CAAC;IACD,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QACzC;YACI,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,yBAAyB;YAClC,IAAI,EAAE,GAAG;YACT,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE,CACpB,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,0CAA0C;SACxE;KACJ,CAAC,CAAC;IACH,IAAI,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YACxC;gBACI,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,qBAAqB;gBAC9B,IAAI,EAAE,GAAG;aACZ;SACJ,CAAC,CAAC;QACH,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QACjD,CAAC;IACL,CAAC;IACD,OAAO,UAAU,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAEzC;IACG,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IACtC,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;IAEvD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;IACvC,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,CAAC,cAAc,CAAC;IAClC,MAAM,UAAU,GAAG,cAAc,IAAI,cAAc,CAAC;IAEpD,IAAI,CAAC,cAAc,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,OAAO,UAAU,CAAC;IACtB,CAAC;IAED,MAAM,aAAa,GAAG,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,UAA8B,CAAC;IAEnC,IAAI,aAAa,EAAE,CAAC;QAChB,SAAS,CAAC,qDAAqD,CAAC,CAAC;QACjE,UAAU,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC3C,WAAW,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;SAAM,CAAC;QACJ,UAAU,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC;YACD,SAAS,CAAC,UAAU,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACL,MAAM,IAAI,KAAK,CACX,kDAAkD;gBAC9C,oEAAoE;gBACpE,iFAAiF;gBACjF,kFAAkF,CACzF,CAAC;QACN,CAAC;IACL,CAAC;IAED,IAAI,cAAc,IAAI,UAAU,EAAE,CAAC;QAC/B,IAAI,KAAK,CAAC;QACV,IAAI,CAAC;YACD,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACL,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC3B,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC;YACpE,CAAC;iBAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CACX,wBAAwB,IAAI,CAAC,IAAI,mCAAmC;oBAChE,oCAAoC,IAAI,CAAC,IAAI,EAAE,CACtD,CAAC;YACN,CAAC;YACD,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC;QACD,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC7B,UAAU,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,CAAC,4CAA4C,CAAC,CAAC,KAAK,EAAE,CAAC;QAC1E,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;QAC7B,MAAM,EAAE,GAAG,MAAM,mBAAmB,CAAC,UAAW,EAAE,UAAU,CAAC,CAAC;QAC9D,IAAI,CAAC,EAAE,EAAE,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC7C,MAAM,IAAI,KAAK,CACX,gCAAgC;gBAC5B,0CAA0C;gBAC1C,2DAA2D,CAClE,CAAC;QACN,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,sBAAsB,UAAU,EAAE,CAAC,CAAC;IACxD,CAAC;SAAM,IAAI,SAAS,EAAE,CAAC;QACnB,IAAI,CAAC,UAAU;YAAE,UAAU,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC;QACxD,MAAM,EAAE,GAAG,MAAM,mBAAmB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC7D,IAAI,CAAC,EAAE,EAAE,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;YACrD,MAAM,IAAI,KAAK,CACX,+BAA+B;gBAC3B,0CAA0C;gBAC1C,6DAA6D;gBAC7D,+CAA+C;gBAC/C,yEAAyE,CAChF,CAAC;QACN,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACJ,SAAS,CAAC,6BAA6B,UAAU,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,QAAgB;IACpD,QAAQ,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7B,KAAK,WAAW;YACZ,OAAO,yBAAyB,CAAC;QACrC,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ;YACT,OAAO,kBAAkB,CAAC;QAC9B,KAAK,SAAS;YACV,OAAO,sBAAsB,CAAC;QAClC,KAAK,QAAQ,CAAC;QACd;YACI,OAAO,aAAa,CAAC;IAC7B,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC5B,IAAI,QAAQ,EAAE;QAAE,OAAO,IAAI,CAAC;IAE5B,SAAS,CAAC,kDAAkD,CAAC,CAAC;IAC9D,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QAC1C;YACI,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,qDAAqD;YAC9D,OAAO,EAAE,IAAI;SAChB;KACJ,CAAC,CAAC;IACH,IAAI,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC;IAE/B,MAAM,IAAI,GAAG,MAAM,eAAe,EAAE,CAAC;IACrC,OAAO,CAAC,CAAC,IAAI,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAChC,IAAY,EACZ,QAAQ,GAAG,SAAS,EACpB,SAAS,GAAG,KAAK;IAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,MAAM,GAAG,GAAG,oBAAoB,IAAI,GAAG,QAAQ,EAAE,CAAC;IAClD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,GAAG,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACL,aAAa;QACjB,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC"}
@@ -0,0 +1,20 @@
1
+ /** Check if the local cache is fresh enough to skip a fetch. */
2
+ export declare function isCacheFresh(): boolean;
3
+ /**
4
+ * Ensure templates are available locally. Tries (in order):
5
+ * 1. Bundled templates (from the agent-templates submodule)
6
+ * 2. Local cache (~/.config/1claw/templates/)
7
+ * 3. GitHub fetch (if online and cache is stale)
8
+ *
9
+ * Returns the directory containing the templates.
10
+ */
11
+ export declare function ensureTemplates(opts?: {
12
+ force?: boolean;
13
+ onProgress?: (msg: string) => void;
14
+ }): Promise<string>;
15
+ /**
16
+ * Fetch a single template on demand (for `1claw spawn <name>` when the
17
+ * template isn't cached or bundled).
18
+ */
19
+ export declare function fetchSingleTemplate(name: string, onProgress?: (msg: string) => void): Promise<string>;
20
+ //# sourceMappingURL=fetcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../../../src/templates/fetcher.ts"],"names":[],"mappings":"AA0CA,gEAAgE;AAChE,wBAAgB,YAAY,IAAI,OAAO,CAKtC;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,IAAI,CAAC,EAAE;IACzC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC,GAAG,OAAO,CAAC,MAAM,CAAC,CA6ClB;AAiGD;;;GAGG;AACH,wBAAsB,mBAAmB,CACrC,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GACnC,OAAO,CAAC,MAAM,CAAC,CAejB"}
@@ -0,0 +1,170 @@
1
+ import { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync, statSync, cpSync, } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { templatesCacheDir, bundledTemplatesDir } from "../lib/paths.js";
4
+ const REPO_OWNER = "1clawAI";
5
+ const REPO_NAME = "agent-templates";
6
+ const BRANCH = "main";
7
+ const CACHE_MAX_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours
8
+ function cacheMetaPath() {
9
+ return join(templatesCacheDir(), ".cache-meta.json");
10
+ }
11
+ function readCacheMeta() {
12
+ const p = cacheMetaPath();
13
+ if (!existsSync(p))
14
+ return null;
15
+ try {
16
+ return JSON.parse(readFileSync(p, "utf-8"));
17
+ }
18
+ catch {
19
+ return null;
20
+ }
21
+ }
22
+ function writeCacheMeta(meta) {
23
+ const dir = templatesCacheDir();
24
+ if (!existsSync(dir))
25
+ mkdirSync(dir, { recursive: true });
26
+ writeFileSync(cacheMetaPath(), JSON.stringify(meta, null, 2));
27
+ }
28
+ /** Check if the local cache is fresh enough to skip a fetch. */
29
+ export function isCacheFresh() {
30
+ const meta = readCacheMeta();
31
+ if (!meta)
32
+ return false;
33
+ const age = Date.now() - new Date(meta.fetchedAt).getTime();
34
+ return age < CACHE_MAX_AGE_MS;
35
+ }
36
+ /**
37
+ * Ensure templates are available locally. Tries (in order):
38
+ * 1. Bundled templates (from the agent-templates submodule)
39
+ * 2. Local cache (~/.config/1claw/templates/)
40
+ * 3. GitHub fetch (if online and cache is stale)
41
+ *
42
+ * Returns the directory containing the templates.
43
+ */
44
+ export async function ensureTemplates(opts) {
45
+ const force = opts?.force ?? false;
46
+ const onProgress = opts?.onProgress;
47
+ // Bundled templates always take priority (submodule is the source of truth)
48
+ const bundled = bundledTemplatesDir();
49
+ if (bundled && existsSync(bundled)) {
50
+ const hasTemplates = readdirSync(bundled).some((d) => statSync(join(bundled, d)).isDirectory() &&
51
+ existsSync(join(bundled, d, "template.yaml")));
52
+ if (hasTemplates) {
53
+ // Copy to cache so everything resolves from one place
54
+ syncBundledToCache(bundled);
55
+ return bundled;
56
+ }
57
+ }
58
+ const cacheDir = templatesCacheDir();
59
+ if (!force && isCacheFresh()) {
60
+ return cacheDir;
61
+ }
62
+ // Try fetching from GitHub
63
+ try {
64
+ onProgress?.("Fetching templates from GitHub...");
65
+ await fetchFromGitHub(cacheDir, onProgress);
66
+ return cacheDir;
67
+ }
68
+ catch (err) {
69
+ // Offline or rate-limited — fall back to cache if anything is there
70
+ if (existsSync(cacheDir) && readdirSync(cacheDir).length > 0) {
71
+ onProgress?.("GitHub unreachable — using cached templates.");
72
+ return cacheDir;
73
+ }
74
+ throw new Error(`Cannot fetch templates and no local cache exists.\n` +
75
+ ` Error: ${err instanceof Error ? err.message : String(err)}\n` +
76
+ ` • Check your internet connection\n` +
77
+ ` • Or initialize the agent-templates submodule: git submodule update --init packages/agent-templates`);
78
+ }
79
+ }
80
+ /** Fetch registry.yaml and individual templates from GitHub. */
81
+ async function fetchFromGitHub(cacheDir, onProgress) {
82
+ if (!existsSync(cacheDir))
83
+ mkdirSync(cacheDir, { recursive: true });
84
+ // Fetch registry.yaml
85
+ const registryUrl = `https://raw.githubusercontent.com/${REPO_OWNER}/${REPO_NAME}/${BRANCH}/registry.yaml`;
86
+ const registryRes = await fetch(registryUrl);
87
+ if (!registryRes.ok) {
88
+ throw new Error(`Failed to fetch registry.yaml: ${registryRes.status} ${registryRes.statusText}`);
89
+ }
90
+ const registryContent = await registryRes.text();
91
+ writeFileSync(join(cacheDir, "..", "registry.yaml"), registryContent);
92
+ // Parse to get template list
93
+ const { parse } = await import("yaml");
94
+ const registry = parse(registryContent);
95
+ const templateNames = registry.templates?.map((t) => t.name) ?? [];
96
+ // Fetch each template's files via the GitHub Contents API
97
+ for (const name of templateNames) {
98
+ onProgress?.(`Fetching template: ${name}`);
99
+ await fetchTemplate(cacheDir, name);
100
+ }
101
+ writeCacheMeta({
102
+ fetchedAt: new Date().toISOString(),
103
+ etag: registryRes.headers.get("etag") ?? undefined,
104
+ });
105
+ }
106
+ /** Fetch a single template's files from GitHub into the cache. */
107
+ async function fetchTemplate(cacheDir, name) {
108
+ const templateDir = join(cacheDir, name);
109
+ if (!existsSync(templateDir))
110
+ mkdirSync(templateDir, { recursive: true });
111
+ const contentsUrl = `https://api.github.com/repos/${REPO_OWNER}/${REPO_NAME}/contents/templates/${name}?ref=${BRANCH}`;
112
+ const res = await fetch(contentsUrl, {
113
+ headers: { Accept: "application/vnd.github.v3+json" },
114
+ });
115
+ if (!res.ok)
116
+ return; // skip if not found
117
+ const files = (await res.json());
118
+ for (const file of files) {
119
+ if (file.type !== "file" || !file.download_url)
120
+ continue;
121
+ try {
122
+ const fileRes = await fetch(file.download_url);
123
+ if (fileRes.ok) {
124
+ writeFileSync(join(templateDir, file.name), await fileRes.text());
125
+ }
126
+ }
127
+ catch {
128
+ // best-effort per file
129
+ }
130
+ }
131
+ }
132
+ /** Copy bundled templates (from submodule) into the cache directory. */
133
+ function syncBundledToCache(bundledDir) {
134
+ const cacheDir = templatesCacheDir();
135
+ if (!existsSync(cacheDir))
136
+ mkdirSync(cacheDir, { recursive: true });
137
+ for (const name of readdirSync(bundledDir)) {
138
+ const src = join(bundledDir, name);
139
+ if (!statSync(src).isDirectory())
140
+ continue;
141
+ if (!existsSync(join(src, "template.yaml")))
142
+ continue;
143
+ const dest = join(cacheDir, name);
144
+ try {
145
+ cpSync(src, dest, { recursive: true, force: true });
146
+ }
147
+ catch {
148
+ // best-effort
149
+ }
150
+ }
151
+ writeCacheMeta({ fetchedAt: new Date().toISOString() });
152
+ }
153
+ /**
154
+ * Fetch a single template on demand (for `1claw spawn <name>` when the
155
+ * template isn't cached or bundled).
156
+ */
157
+ export async function fetchSingleTemplate(name, onProgress) {
158
+ const cacheDir = templatesCacheDir();
159
+ if (!existsSync(cacheDir))
160
+ mkdirSync(cacheDir, { recursive: true });
161
+ onProgress?.(`Fetching template: ${name}`);
162
+ await fetchTemplate(cacheDir, name);
163
+ const dir = join(cacheDir, name);
164
+ if (!existsSync(join(dir, "template.yaml"))) {
165
+ throw new Error(`Template "${name}" not found in the template registry.\n` +
166
+ ` Run \`1claw spawn --list\` to see available templates.`);
167
+ }
168
+ return dir;
169
+ }
170
+ //# sourceMappingURL=fetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetcher.js","sourceRoot":"","sources":["../../../src/templates/fetcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ export interface TemplateDocker {
2
+ base_image: string;
3
+ context_files: string[];
4
+ env: Record<string, string>;
5
+ health_endpoint: string;
6
+ health_port: number;
7
+ }
8
+ export interface TemplateManifest {
9
+ name: string;
10
+ display_name: string;
11
+ version: string;
12
+ description: string;
13
+ author: string;
14
+ language: "python" | "node";
15
+ homepage?: string;
16
+ docker: TemplateDocker;
17
+ post_spawn_message?: string;
18
+ }
19
+ export interface RegistryEntry {
20
+ name: string;
21
+ display_name: string;
22
+ version: string;
23
+ language: string;
24
+ description: string;
25
+ }
26
+ export interface RegistryIndex {
27
+ version: number;
28
+ templates: RegistryEntry[];
29
+ }
30
+ /**
31
+ * Try to find a template directory, checking (in order):
32
+ * 1. Local cache (~/.config/1claw/templates/<name>/)
33
+ * 2. Bundled templates (packages/agent-templates/templates/<name>/ via submodule)
34
+ */
35
+ export declare function findTemplateDir(name: string): string | null;
36
+ /** Load and validate a single template manifest by name. */
37
+ export declare function loadTemplate(name: string): TemplateManifest;
38
+ /** Get the resolved directory path for a template. */
39
+ export declare function getTemplateDir(name: string): string;
40
+ /** List all available template names (cached + bundled, deduplicated). */
41
+ export declare function listTemplateNames(): string[];
42
+ /** List all available templates as manifests. */
43
+ export declare function listTemplates(): TemplateManifest[];
44
+ /** Parse the registry.yaml index (from bundled or fetched). */
45
+ export declare function parseRegistryIndex(content: string): RegistryIndex;
46
+ /** Load the bundled registry.yaml if available. */
47
+ export declare function loadBundledRegistry(): RegistryIndex | null;
48
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/templates/registry.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,aAAa,EAAE,CAAC;CAC9B;AAkED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAW3D;AAED,4DAA4D;AAC5D,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAkB3D;AAED,sDAAsD;AACtD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMnD;AAsBD,0EAA0E;AAC1E,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAQ5C;AAED,iDAAiD;AACjD,wBAAgB,aAAa,IAAI,gBAAgB,EAAE,CAElD;AAED,+DAA+D;AAC/D,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAgBjE;AAED,mDAAmD;AACnD,wBAAgB,mBAAmB,IAAI,aAAa,GAAG,IAAI,CAU1D"}