svamp-cli 0.2.342 → 0.2.356

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 (67) hide show
  1. package/bin/skills/artifact/SKILL.md +19 -5
  2. package/bin/skills/crew/SKILL.md +62 -13
  3. package/dist/DefaultTransport-vfp78fug.mjs +47 -0
  4. package/dist/GeminiTransport-3OkhtFRO.mjs +130 -0
  5. package/dist/KimiTransport-D8n009Tr.mjs +141 -0
  6. package/dist/acpAgentConfig-CObOPlA8.mjs +48 -0
  7. package/dist/acpBackend-UaBD4zL3.mjs +925 -0
  8. package/dist/{adminCommands-CRTBDZan.mjs → adminCommands-BvsYnRDA.mjs} +2 -18
  9. package/dist/{agentCommands-BuO988tJ.mjs → agentCommands-D91RcjqQ.mjs} +6 -23
  10. package/dist/api-BHjyC0Ph.mjs +157 -0
  11. package/dist/{auth--WS0wezs.mjs → auth-CRz8TsEl.mjs} +1 -22
  12. package/dist/bootStatus-DqtNgJch.mjs +143 -0
  13. package/dist/claudeAuth-C0wc1GTM.mjs +291 -0
  14. package/dist/cli.mjs +2948 -5
  15. package/dist/codexAppServerBackend-VGsYtbqg.mjs +786 -0
  16. package/dist/codexProvider-BtxYc5Rj.mjs +68 -0
  17. package/dist/{commands-DDuGBSsz.mjs → commands-B-yczgz_.mjs} +115 -49
  18. package/dist/{commands-DU4B-4Gh.mjs → commands-BMeDrpSv.mjs} +55 -25
  19. package/dist/{commands-DXLOKJOj.mjs → commands-BbmypSgx.mjs} +62 -27
  20. package/dist/{commands-C0HQiu-S.mjs → commands-BkdbelFo.mjs} +78 -38
  21. package/dist/{commands-DXM17M6n.mjs → commands-C13-yE2R.mjs} +42 -19
  22. package/dist/{commands-BKb1g8Gq.mjs → commands-CoOc4qiw.mjs} +20 -30
  23. package/dist/{commands-BsKgZ5sQ.mjs → commands-DW5RnHZw.mjs} +2 -19
  24. package/dist/{commands-Cwxy-C5N.mjs → commands-sPvRcG3J.mjs} +10 -32
  25. package/dist/cron-hHGdb5kU.mjs +132 -0
  26. package/dist/detectIsolation-CrV8IFDv.mjs +339 -0
  27. package/dist/envFlag-COOuJ3AH.mjs +11 -0
  28. package/dist/fileLock-BMPwCrB6.mjs +80 -0
  29. package/dist/{fleet-BHzlAvnu.mjs → fleet-Ca-UjJNL.mjs} +122 -36
  30. package/dist/flushExit-C-i6SGjj.mjs +37 -0
  31. package/dist/friendlyName-1UZcyDhu.mjs +586 -0
  32. package/dist/{headlessCli-C2gvOpOt.mjs → headlessCli-C8HzQvis.mjs} +3 -21
  33. package/dist/hookSettings-FFc1pi8j.mjs +10546 -0
  34. package/dist/{httpServer-Be1Hcddr.mjs → httpServer-BzEDbOGn.mjs} +14 -5
  35. package/dist/hyphaClient-ybivOjZo.mjs +49 -0
  36. package/dist/index.mjs +40 -8
  37. package/dist/instance-CeHz5C8v.mjs +203 -0
  38. package/dist/kimiProvider-DbxODebR.mjs +69 -0
  39. package/dist/kimiSetup-NGsoYB5h.mjs +48 -0
  40. package/dist/loopVerify-DALtTk2V.mjs +444 -0
  41. package/dist/machineTools-DygM1jXW.mjs +580 -0
  42. package/dist/model-CUHojegn.mjs +66 -0
  43. package/dist/{notifyCommands-0aZUwKQK.mjs → notifyCommands-CCUE18Q-.mjs} +3 -18
  44. package/dist/package-BrsiNutS.mjs +64 -0
  45. package/dist/pinnedCodex-XW4qvOAe.mjs +11 -0
  46. package/dist/pinnedNono-5ZHb6328.mjs +15 -0
  47. package/dist/{rpc-rAQQ1q8t.mjs → rpc-CBkSkzsI.mjs} +38 -6
  48. package/dist/{rpc-B2Lc2BAB.mjs → rpc-ccY7xvlo.mjs} +33 -22
  49. package/dist/{run-C7QVfyw4.mjs → run-DCq3aEiF.mjs} +17 -9
  50. package/dist/run-DDmeV9K3.mjs +9826 -0
  51. package/dist/sandboxDetect-Cdzsj5TC.mjs +19 -0
  52. package/dist/{scheduler-CzF4lOe_.mjs → scheduler-BkVJ27Ki.mjs} +38 -6
  53. package/dist/securityContext-Cm5UTCuD.mjs +218 -0
  54. package/dist/serveAuth-4M0vwMyj.mjs +460 -0
  55. package/dist/{serveCommands-EIEqdaVu.mjs → serveCommands-CLhkccJM.mjs} +13 -34
  56. package/dist/sharingNotificationSync-qGIQ-3yf.mjs +359 -0
  57. package/dist/{sideband-BoutiRJi.mjs → sideband-68HhGT0i.mjs} +1 -21
  58. package/dist/store-B4E6NzG6.mjs +356 -0
  59. package/dist/store-fi0f-ff1.mjs +184 -0
  60. package/dist/types-57J3Re0n.mjs +17 -0
  61. package/dist/wantsHelp-6bMOeNUz.mjs +5 -0
  62. package/dist/wrapCommand-CdNawSaa.mjs +117 -0
  63. package/package.json +3 -3
  64. package/dist/cli-B24CmIli.mjs +0 -2780
  65. package/dist/package-CTbGYaJG.mjs +0 -64
  66. package/dist/run-CF4kAVPW.mjs +0 -26508
  67. package/dist/sandboxDetect-DNTcbgWD.mjs +0 -12
@@ -0,0 +1,291 @@
1
+ import { existsSync, readFileSync, mkdirSync, writeFileSync, chmodSync, renameSync, unlinkSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { w as withFileLock } from './fileLock-BMPwCrB6.mjs';
5
+ import { e as envFlagEnabled } from './envFlag-COOuJ3AH.mjs';
6
+
7
+ const EXAMPLE_HYPHA_PROXY_URL = "https://proxy.hypha.aicell.io";
8
+ const MODE_KEY = "SVAMP_CLAUDE_PROXY";
9
+ const HYPHA_PROXY_URL_KEY = "SVAMP_HYPHA_PROXY_URL";
10
+ const MANAGED_KEYS = /* @__PURE__ */ new Set([
11
+ MODE_KEY,
12
+ HYPHA_PROXY_URL_KEY,
13
+ "ANTHROPIC_BASE_URL",
14
+ "ANTHROPIC_API_KEY",
15
+ // #1521: the daemon merges the 1M-context beta into ANTHROPIC_BETAS at spawn (see
16
+ // applyLongContext1M). It is spawn-env-only — never written to ~/.svamp/.env — but it is a
17
+ // key the daemon owns, so it belongs in the inspection allow-list.
18
+ "ANTHROPIC_BETAS"
19
+ ]);
20
+ function normalizeProxyUrl(raw) {
21
+ const trimmed = raw.trim().replace(/\/+$/, "");
22
+ if (trimmed.endsWith("/v1")) {
23
+ throw new Error(
24
+ "Hypha proxy URL must not end in /v1 \u2014 the SDK appends it, producing double /v1/v1/messages"
25
+ );
26
+ }
27
+ return trimmed;
28
+ }
29
+ function resolveHyphaProxyUrl() {
30
+ const configured = (process.env[HYPHA_PROXY_URL_KEY] || "").trim();
31
+ if (!configured) return void 0;
32
+ try {
33
+ return normalizeProxyUrl(configured);
34
+ } catch {
35
+ return void 0;
36
+ }
37
+ }
38
+ function envFilePath() {
39
+ const svampHome = process.env.SVAMP_HOME || join(homedir(), ".svamp");
40
+ return join(svampHome, ".env");
41
+ }
42
+ function readEnvLines() {
43
+ const file = envFilePath();
44
+ if (!existsSync(file)) return [];
45
+ return readFileSync(file, "utf-8").split("\n");
46
+ }
47
+ function writeEnvLines(lines) {
48
+ const file = envFilePath();
49
+ const dir = join(file, "..");
50
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
51
+ while (lines.length > 0 && lines[lines.length - 1].trim() === "") {
52
+ lines.pop();
53
+ }
54
+ const body = lines.join("\n") + "\n";
55
+ const tmp = `${file}.tmp.${process.pid}.${Math.random().toString(36).slice(2, 10)}`;
56
+ try {
57
+ writeFileSync(tmp, body, { encoding: "utf-8", mode: 384 });
58
+ try {
59
+ chmodSync(tmp, 384);
60
+ } catch {
61
+ }
62
+ renameSync(tmp, file);
63
+ } catch (err) {
64
+ try {
65
+ unlinkSync(tmp);
66
+ } catch {
67
+ }
68
+ throw err;
69
+ }
70
+ try {
71
+ chmodSync(file, 384);
72
+ } catch {
73
+ }
74
+ }
75
+ function updateEnvFile(updates) {
76
+ withFileLock(`${envFilePath()}.lock`, () => updateEnvFileUnlocked(updates), {
77
+ deadlineMs: 2e3,
78
+ breakOnDeadOwner: true
79
+ });
80
+ }
81
+ function updateEnvFileUnlocked(updates) {
82
+ const lines = readEnvLines();
83
+ const kept = [];
84
+ const remainingUpdates = new Map(Object.entries(updates));
85
+ for (const line of lines) {
86
+ const trimmed = line.trim();
87
+ if (!trimmed || trimmed.startsWith("#")) {
88
+ kept.push(line);
89
+ continue;
90
+ }
91
+ const eq = trimmed.indexOf("=");
92
+ const key = eq === -1 ? trimmed : trimmed.slice(0, eq);
93
+ if (remainingUpdates.has(key)) {
94
+ const v = remainingUpdates.get(key);
95
+ remainingUpdates.delete(key);
96
+ if (v === void 0) continue;
97
+ kept.push(`${key}=${v}`);
98
+ continue;
99
+ }
100
+ kept.push(line);
101
+ }
102
+ for (const [key, v] of remainingUpdates) {
103
+ if (v === void 0) continue;
104
+ kept.push(`${key}=${v}`);
105
+ }
106
+ writeEnvLines(kept);
107
+ }
108
+ function currentMode() {
109
+ const raw = (process.env[MODE_KEY] || "").trim().toLowerCase();
110
+ if (raw === "hypha" || raw === "hypha-proxy") return "hypha";
111
+ if (raw === "custom") return "custom";
112
+ return "login";
113
+ }
114
+ function redactKey(key) {
115
+ if (!key) return void 0;
116
+ if (key.length <= 12) return "***";
117
+ return `${key.slice(0, 8)}\u2026${key.slice(-4)}`;
118
+ }
119
+ function getClaudeAuthStatus() {
120
+ const mode = currentMode();
121
+ if (mode === "hypha") {
122
+ const token = process.env.HYPHA_TOKEN;
123
+ const proxyUrl = resolveHyphaProxyUrl();
124
+ return {
125
+ mode,
126
+ baseUrl: proxyUrl,
127
+ apiKeyPreview: redactKey(token),
128
+ hyphaTokenMissing: !token,
129
+ hyphaProxyUrlMissing: !proxyUrl
130
+ };
131
+ }
132
+ if (mode === "custom") {
133
+ return {
134
+ mode,
135
+ baseUrl: process.env.ANTHROPIC_BASE_URL,
136
+ apiKeyPreview: redactKey(process.env.ANTHROPIC_API_KEY)
137
+ };
138
+ }
139
+ return { mode: "login" };
140
+ }
141
+ function setClaudeAuthHyphaProxy(url) {
142
+ if (!url || !url.trim()) {
143
+ throw new Error(
144
+ `A Hypha proxy URL is required (no default). Example: svamp daemon auth use-hypha-proxy ${EXAMPLE_HYPHA_PROXY_URL}`
145
+ );
146
+ }
147
+ updateEnvFile({
148
+ [MODE_KEY]: "hypha",
149
+ [HYPHA_PROXY_URL_KEY]: normalizeProxyUrl(url),
150
+ // Hypha mode resolves token live at spawn — no stored copy.
151
+ ANTHROPIC_BASE_URL: void 0,
152
+ ANTHROPIC_API_KEY: void 0
153
+ });
154
+ }
155
+ function setClaudeAuthLogin() {
156
+ updateEnvFile({
157
+ [MODE_KEY]: void 0,
158
+ [HYPHA_PROXY_URL_KEY]: void 0,
159
+ ANTHROPIC_BASE_URL: void 0,
160
+ ANTHROPIC_API_KEY: void 0
161
+ });
162
+ }
163
+ function setClaudeAuthCustom(baseUrl, apiKey) {
164
+ if (!baseUrl) throw new Error("ANTHROPIC_BASE_URL is required for custom mode");
165
+ if (!apiKey) throw new Error("ANTHROPIC_API_KEY is required for custom mode");
166
+ const trimmed = baseUrl.replace(/\/+$/, "");
167
+ if (trimmed.endsWith("/v1")) {
168
+ throw new Error(
169
+ "ANTHROPIC_BASE_URL must not end in /v1 \u2014 the SDK appends it, producing double /v1/v1/messages"
170
+ );
171
+ }
172
+ updateEnvFile({
173
+ [MODE_KEY]: "custom",
174
+ [HYPHA_PROXY_URL_KEY]: void 0,
175
+ ANTHROPIC_BASE_URL: trimmed,
176
+ ANTHROPIC_API_KEY: apiKey
177
+ });
178
+ }
179
+ function applyPromptCacheTtl(spawnEnv) {
180
+ if (envFlagEnabled(spawnEnv.FORCE_PROMPT_CACHING_5M) || envFlagEnabled(process.env.FORCE_PROMPT_CACHING_5M)) return;
181
+ const explicit1h = spawnEnv.ENABLE_PROMPT_CACHING_1H ?? process.env.ENABLE_PROMPT_CACHING_1H;
182
+ if (explicit1h === void 0) spawnEnv.ENABLE_PROMPT_CACHING_1H = "1";
183
+ }
184
+ const BETA_1M_TOKEN = "context-1m-2025-08-07";
185
+ let longContext1MEntitlement = "unknown";
186
+ function setLongContext1MEntitlement(state) {
187
+ longContext1MEntitlement = state;
188
+ }
189
+ function getLongContext1MEntitlement() {
190
+ return longContext1MEntitlement;
191
+ }
192
+ function isLongContextBetaUnavailableError(err) {
193
+ const text = typeof err === "string" ? err : err?.message ?? String(err ?? "");
194
+ return /long context beta is not (yet )?available/i.test(text);
195
+ }
196
+ const LONG_CONTEXT_ENTITLEMENT_RECHECK_MS = Number(process.env.SVAMP_1M_ENTITLEMENT_RECHECK_MS || 60 * 60 * 1e3);
197
+ async function probeLongContext1MEntitlement(baseUrl, apiKey, fetchImpl = fetch) {
198
+ if (!baseUrl || !apiKey) return longContext1MEntitlement;
199
+ try {
200
+ const resp = await fetchImpl(`${baseUrl.replace(/\/$/, "")}/v1/messages`, {
201
+ method: "POST",
202
+ headers: {
203
+ "content-type": "application/json",
204
+ authorization: `Bearer ${apiKey}`,
205
+ "anthropic-beta": BETA_1M_TOKEN
206
+ },
207
+ body: JSON.stringify({
208
+ model: "claude-haiku-4-5-20251001",
209
+ max_tokens: 1,
210
+ messages: [{ role: "user", content: "x" }]
211
+ }),
212
+ signal: AbortSignal.timeout(2e4)
213
+ });
214
+ if (resp.ok) {
215
+ setLongContext1MEntitlement("entitled");
216
+ return "entitled";
217
+ }
218
+ const text = await resp.text().catch(() => "");
219
+ if (isLongContextBetaUnavailableError(text)) {
220
+ setLongContext1MEntitlement("not-entitled");
221
+ return "not-entitled";
222
+ }
223
+ return longContext1MEntitlement;
224
+ } catch {
225
+ return longContext1MEntitlement;
226
+ }
227
+ }
228
+ function applyLongContext1M(spawnEnv) {
229
+ if (envFlagEnabled(spawnEnv.CLAUDE_CODE_DISABLE_1M_CONTEXT) || envFlagEnabled(process.env.CLAUDE_CODE_DISABLE_1M_CONTEXT)) return;
230
+ if (longContext1MEntitlement !== "entitled") return;
231
+ const existing = spawnEnv.ANTHROPIC_BETAS ?? process.env.ANTHROPIC_BETAS ?? "";
232
+ const betas = existing.split(",").map((b) => b.trim()).filter(Boolean);
233
+ if (!betas.includes(BETA_1M_TOKEN)) betas.push(BETA_1M_TOKEN);
234
+ spawnEnv.ANTHROPIC_BETAS = betas.join(",");
235
+ }
236
+ function applyTodoTools(spawnEnv) {
237
+ const override = spawnEnv.CLAUDE_CODE_ENABLE_TODO_TOOLS ?? process.env.CLAUDE_CODE_ENABLE_TODO_TOOLS;
238
+ if (override === void 0) spawnEnv.CLAUDE_CODE_ENABLE_TODO_TOOLS = "1";
239
+ }
240
+ function applyClaudeHygiene(spawnEnv) {
241
+ if ((spawnEnv.DISABLE_AUTOUPDATER ?? process.env.DISABLE_AUTOUPDATER) === void 0) {
242
+ spawnEnv.DISABLE_AUTOUPDATER = "1";
243
+ }
244
+ if ((spawnEnv.CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC ?? process.env.CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC) === void 0) {
245
+ spawnEnv.CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC = "1";
246
+ }
247
+ }
248
+ function applyClaudeProxyEnv(spawnEnv) {
249
+ const mode = currentMode();
250
+ applyTodoTools(spawnEnv);
251
+ applyClaudeHygiene(spawnEnv);
252
+ if (mode === "hypha") {
253
+ const proxyUrl = resolveHyphaProxyUrl();
254
+ if (!proxyUrl) {
255
+ delete spawnEnv.ANTHROPIC_BASE_URL;
256
+ delete spawnEnv.ANTHROPIC_API_KEY;
257
+ return `hypha mode but ${HYPHA_PROXY_URL_KEY} not configured \u2014 run \`svamp daemon auth use-hypha-proxy <URL>\`; falling back to login`;
258
+ }
259
+ const token = process.env.HYPHA_TOKEN;
260
+ if (!token) {
261
+ delete spawnEnv.ANTHROPIC_BASE_URL;
262
+ delete spawnEnv.ANTHROPIC_API_KEY;
263
+ return "hypha mode but HYPHA_TOKEN missing \u2014 falling back to login";
264
+ }
265
+ spawnEnv.ANTHROPIC_BASE_URL = proxyUrl;
266
+ spawnEnv.ANTHROPIC_API_KEY = token;
267
+ applyPromptCacheTtl(spawnEnv);
268
+ applyLongContext1M(spawnEnv);
269
+ return `hypha proxy (${proxyUrl}, 1h cache TTL, 1M context)`;
270
+ }
271
+ if (mode === "custom") {
272
+ const url = process.env.ANTHROPIC_BASE_URL;
273
+ const key = process.env.ANTHROPIC_API_KEY;
274
+ if (!url || !key) {
275
+ delete spawnEnv.ANTHROPIC_BASE_URL;
276
+ delete spawnEnv.ANTHROPIC_API_KEY;
277
+ return "custom mode but ANTHROPIC_BASE_URL/API_KEY missing \u2014 falling back to login";
278
+ }
279
+ spawnEnv.ANTHROPIC_BASE_URL = url;
280
+ spawnEnv.ANTHROPIC_API_KEY = key;
281
+ applyPromptCacheTtl(spawnEnv);
282
+ applyLongContext1M(spawnEnv);
283
+ return `custom proxy (${url}, 1h cache TTL, 1M context)`;
284
+ }
285
+ delete spawnEnv.ANTHROPIC_BASE_URL;
286
+ delete spawnEnv.ANTHROPIC_API_KEY;
287
+ return null;
288
+ }
289
+ const MANAGED_ENV_KEYS = Array.from(MANAGED_KEYS);
290
+
291
+ export { BETA_1M_TOKEN, EXAMPLE_HYPHA_PROXY_URL, LONG_CONTEXT_ENTITLEMENT_RECHECK_MS, MANAGED_ENV_KEYS, applyClaudeProxyEnv, getClaudeAuthStatus, getLongContext1MEntitlement, isLongContextBetaUnavailableError, normalizeProxyUrl, probeLongContext1MEntitlement, resolveHyphaProxyUrl, setClaudeAuthCustom, setClaudeAuthHyphaProxy, setClaudeAuthLogin, setLongContext1MEntitlement, updateEnvFile };