svamp-cli 0.2.313 → 0.2.315
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{adminCommands-DINkkchF.mjs → adminCommands-DzNor_Oi.mjs} +1 -1
- package/dist/{agentCommands-CqHUKyRM.mjs → agentCommands-RhxyIA_z.mjs} +5 -5
- package/dist/{auth-fmYi12gU.mjs → auth-DwbfJdef.mjs} +1 -1
- package/dist/{cli-C0K7bTFQ.mjs → cli-3UOhFKAA.mjs} +207 -73
- package/dist/cli.mjs +2 -2
- package/dist/{commands-B2KHp8-n.mjs → commands-8cNqkP6Q.mjs} +2 -2
- package/dist/{commands-CE9x3OVJ.mjs → commands-BTkUJBuQ.mjs} +1 -1
- package/dist/{commands-c57jjMV-.mjs → commands-C5Lmdg3I.mjs} +2 -2
- package/dist/{commands-lt3_KA5S.mjs → commands-Cfmfo9-g.mjs} +2 -2
- package/dist/{commands-BspIWEyi.mjs → commands-CjBsJQX-.mjs} +1 -1
- package/dist/{commands-DxwqcKtb.mjs → commands-Clvx4KkJ.mjs} +2 -2
- package/dist/{commands-BlSsMfW6.mjs → commands-DOXnuGx3.mjs} +8 -8
- package/dist/{commands-DMG7VDBo.mjs → commands-DpWQUbS1.mjs} +1 -1
- package/dist/{fleet-DX-cpu52.mjs → fleet-C9RYmsHH.mjs} +41 -2
- package/dist/{frpc-B5LHRKTD.mjs → frpc-pwqsONPX.mjs} +1 -1
- package/dist/{headlessCli-BE4CanO7.mjs → headlessCli-BoaIinBA.mjs} +2 -2
- package/dist/index.mjs +1 -1
- package/dist/{notifyCommands-Deh2F41t.mjs → notifyCommands-8hUYEN4j.mjs} +1 -1
- package/dist/{package-C9HRV5XP.mjs → package-D_KxkJI4.mjs} +2 -2
- package/dist/{rpc-BxOm5nyE.mjs → rpc-BFIy8FTe.mjs} +1 -1
- package/dist/{rpc-DOl276lO.mjs → rpc-DAcODVs3.mjs} +1 -1
- package/dist/{run-CDZ1g-Fa.mjs → run-CkmRGy8q.mjs} +1 -1
- package/dist/{run-DI8N2DhV.mjs → run-vEbmTx6x.mjs} +278 -25
- package/dist/{scheduler-C0WXBdL_.mjs → scheduler-DlDYY_wS.mjs} +1 -1
- package/dist/{serveCommands-DChM4ubY.mjs → serveCommands-wx5GnznD.mjs} +5 -5
- package/dist/{sideband-BdHdwflN.mjs → sideband-DU8QZetT.mjs} +1 -1
- package/package.json +2 -2
|
@@ -3153,7 +3153,7 @@ Connection: close\r
|
|
|
3153
3153
|
const mount = this.mounts.get(mountName);
|
|
3154
3154
|
const subdomainOverride = mount?.access === "link" && mount.linkToken ? /* @__PURE__ */ new Map([[this.port, buildLinkSubdomain(subdomainSafe, mount.linkToken)]]) : void 0;
|
|
3155
3155
|
try {
|
|
3156
|
-
const { FrpcTunnel } = await import('./frpc-
|
|
3156
|
+
const { FrpcTunnel } = await import('./frpc-pwqsONPX.mjs');
|
|
3157
3157
|
let tunnel;
|
|
3158
3158
|
tunnel = new FrpcTunnel({
|
|
3159
3159
|
name: tunnelName,
|
|
@@ -4354,6 +4354,11 @@ function fixedSessionId(c) {
|
|
|
4354
4354
|
const b = c.bind;
|
|
4355
4355
|
return b && typeof b.session === "string" ? b.session : void 0;
|
|
4356
4356
|
}
|
|
4357
|
+
function channelAsyncRepliable(c) {
|
|
4358
|
+
if (!c || c.system) return false;
|
|
4359
|
+
if ((c.action?.kind ?? "message") !== "message") return false;
|
|
4360
|
+
return bindMode(c) !== "stateless";
|
|
4361
|
+
}
|
|
4357
4362
|
class ChannelStore {
|
|
4358
4363
|
dir;
|
|
4359
4364
|
constructor(projectDir) {
|
|
@@ -4471,7 +4476,8 @@ function generateSkillBody(channel, ctx) {
|
|
|
4471
4476
|
const uploadUrl = `${gw}/upload`;
|
|
4472
4477
|
const key = ctx?.key || "<your-key>";
|
|
4473
4478
|
const isAgent = channel.action?.kind === "agent";
|
|
4474
|
-
|
|
4479
|
+
channel.reply?.mode === "queue";
|
|
4480
|
+
const asyncReply = channelAsyncRepliable(channel);
|
|
4475
4481
|
const recvUrl = `${gw}/receive`;
|
|
4476
4482
|
const hyphaOpen = (channel.identity?.hypha_allow || []).length > 0;
|
|
4477
4483
|
const mode = bindMode(channel);
|
|
@@ -4482,8 +4488,8 @@ function generateSkillBody(channel, ctx) {
|
|
|
4482
4488
|
const bindNote = mode === "stateless" ? `**Stateless channel** \u2014 each call spawns a fresh, isolated one-shot session (cold-start: a few seconds), runs, replies, and closes. No shared memory between calls.` : mode === "fixed" ? `Routes to a **fixed session** (\`${rSession}\`); reachable only while that session is live.` : rSession ? `Routes to **session \`${rSession}\`** (the one this instruction was copied from); reachable only while it is live, else a fresh stateless run answers.` : `**Dynamic channel** \u2014 pass \`session: "<id>"\` to target a specific live session, else a fresh stateless run answers.`;
|
|
4483
4489
|
const name = channel.skill?.name || channel.name;
|
|
4484
4490
|
const desc = channel.skill?.description || channel.description || `Send a message to the "${channel.name}" channel.`;
|
|
4485
|
-
const replyNote = isAgent ? `This is a **WISE Agent** channel: \`send()\` runs a fast assistant against the session's tools/skills and returns its answer synchronously in the result \`reply\`.` :
|
|
4486
|
-
const queueSection =
|
|
4491
|
+
const replyNote = isAgent ? `This is a **WISE Agent** channel: \`send()\` runs a fast assistant against the session's tools/skills and returns its answer synchronously in the result \`reply\`.` : asyncReply ? `This channel is **repliable**: \`send()\` usually returns \`{ status: "queued", correlationId }\` and the agent replies later \u2014 poll \`receive()\` (or GET /receive \xB7 /events) for replies addressed to you. **But it may also answer synchronously** with \`{ status: "completed", reply }\` (e.g. when the target session is gone and a fresh one-shot run handles the call) \u2014 always check \`status\` first and use \`reply\` directly when present; \`receive()\` has nothing to return for a one-shot.` : `Delivery is fire-and-forget \u2014 the message lands in the agent's inbox, tagged with your verified identity (\`from\`).`;
|
|
4492
|
+
const queueSection = asyncReply ? `
|
|
4487
4493
|
|
|
4488
4494
|
## Getting the reply
|
|
4489
4495
|
\`send()\` returns one of two shapes \u2014 **check \`status\` first**:
|
|
@@ -6286,7 +6292,7 @@ async function registerMachineService(server, machineId, metadata, daemonState,
|
|
|
6286
6292
|
const tunnels = handlers.tunnels;
|
|
6287
6293
|
if (!tunnels) throw new Error("Tunnel management not available");
|
|
6288
6294
|
if (tunnels.has(params.name)) throw new Error(`Tunnel '${params.name}' already running`);
|
|
6289
|
-
const { FrpcTunnel } = await import('./frpc-
|
|
6295
|
+
const { FrpcTunnel } = await import('./frpc-pwqsONPX.mjs');
|
|
6290
6296
|
const tunnel = new FrpcTunnel({
|
|
6291
6297
|
name: params.name,
|
|
6292
6298
|
ports: params.ports,
|
|
@@ -6779,7 +6785,7 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
|
|
|
6779
6785
|
}
|
|
6780
6786
|
const deps = buildSessionDeps(rpc, { cwd, ownerEmail: owner });
|
|
6781
6787
|
const sender = { name: context?.user?.email || context?.user?.id || "user", kind: "user", verified: true };
|
|
6782
|
-
const { toolsForRole } = await import('./sideband-
|
|
6788
|
+
const { toolsForRole } = await import('./sideband-DU8QZetT.mjs');
|
|
6783
6789
|
const r2 = await runWiseAgent({ message: params.message, sender, config: { tools: toolsForRole(role2) }, deps, transport, model: resolved.model });
|
|
6784
6790
|
return fmt(r2);
|
|
6785
6791
|
}
|
|
@@ -6884,7 +6890,7 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
|
|
|
6884
6890
|
return { ok: false, call_id: callId, status: "busy", error: "channel is busy (too many concurrent requests) \u2014 retry shortly" };
|
|
6885
6891
|
}
|
|
6886
6892
|
const rendered = renderMessage(c, { sender: r.sender, body: { message: kwargs.message }, callId });
|
|
6887
|
-
const { queryCore } = await import('./commands-
|
|
6893
|
+
const { queryCore } = await import('./commands-CjBsJQX-.mjs');
|
|
6888
6894
|
const timeout = c.reply?.timeout_sec || 120;
|
|
6889
6895
|
let result;
|
|
6890
6896
|
try {
|
|
@@ -6967,8 +6973,8 @@ ${d?.error || "not found"}`;
|
|
|
6967
6973
|
const res = resolveChannel(kwargs.channel, kwargs.session);
|
|
6968
6974
|
if ("error" in res) return { error: res.error };
|
|
6969
6975
|
const { c, dir } = res;
|
|
6970
|
-
if (c
|
|
6971
|
-
return { error: "this channel has no async replies (
|
|
6976
|
+
if (!channelAsyncRepliable(c)) {
|
|
6977
|
+
return { error: "this channel has no async replies (agent/loop/stateless channels reply synchronously)" };
|
|
6972
6978
|
}
|
|
6973
6979
|
const u = context?.user;
|
|
6974
6980
|
const r = resolveSender(c, {
|
|
@@ -8975,8 +8981,8 @@ function createSessionStore(server, sessionId, initialMetadata, initialAgentStat
|
|
|
8975
8981
|
syncChannelsToMetadata();
|
|
8976
8982
|
return { ok: true, call_id: callId, status: "accepted" };
|
|
8977
8983
|
}
|
|
8978
|
-
const
|
|
8979
|
-
const wantReply =
|
|
8984
|
+
const repliable = channelAsyncRepliable(c);
|
|
8985
|
+
const wantReply = repliable && !params.no_reply;
|
|
8980
8986
|
const replySession = wantReply ? params.reply_to?.session : void 0;
|
|
8981
8987
|
const inboxMsg = {
|
|
8982
8988
|
messageId: callId,
|
|
@@ -10094,7 +10100,7 @@ function handleClaudeMessage(ctx, msg) {
|
|
|
10094
10100
|
}
|
|
10095
10101
|
}
|
|
10096
10102
|
|
|
10097
|
-
const KNOWN_AGENT_LAUNCHERS = ["claude", "codex", "gemini"];
|
|
10103
|
+
const KNOWN_AGENT_LAUNCHERS = ["claude", "codex", "gemini", "kimi"];
|
|
10098
10104
|
function agentLauncherExists(cmd, env = process.env) {
|
|
10099
10105
|
if (!cmd) return false;
|
|
10100
10106
|
if (cmd.includes("/") || cmd.includes("\\")) return existsSync$1(cmd);
|
|
@@ -12157,7 +12163,8 @@ var acpBackend = /*#__PURE__*/Object.freeze({
|
|
|
12157
12163
|
});
|
|
12158
12164
|
|
|
12159
12165
|
const KNOWN_ACP_AGENTS = {
|
|
12160
|
-
gemini: { command: "gemini", args: ["--experimental-acp"] }
|
|
12166
|
+
gemini: { command: "gemini", args: ["--experimental-acp"] },
|
|
12167
|
+
kimi: { command: "kimi", args: ["acp"] }
|
|
12161
12168
|
};
|
|
12162
12169
|
const KNOWN_CODEX_AGENTS = {
|
|
12163
12170
|
codex: { command: "codex", args: ["app-server", "--listen", "stdio://"] }
|
|
@@ -13229,7 +13236,7 @@ const GEMINI_TOOL_PATTERNS = [
|
|
|
13229
13236
|
inputFields: ["thought", "thinking"]
|
|
13230
13237
|
}
|
|
13231
13238
|
];
|
|
13232
|
-
const AVAILABLE_MODELS = [
|
|
13239
|
+
const AVAILABLE_MODELS$1 = [
|
|
13233
13240
|
"gemini-2.5-pro",
|
|
13234
13241
|
"gemini-2.5-flash",
|
|
13235
13242
|
"gemini-2.5-flash-lite"
|
|
@@ -13261,7 +13268,7 @@ class GeminiTransport {
|
|
|
13261
13268
|
const msg = {
|
|
13262
13269
|
type: "status",
|
|
13263
13270
|
status: "error",
|
|
13264
|
-
detail: `Model not found. Available models: ${AVAILABLE_MODELS.join(", ")}`
|
|
13271
|
+
detail: `Model not found. Available models: ${AVAILABLE_MODELS$1.join(", ")}`
|
|
13265
13272
|
};
|
|
13266
13273
|
return { message: msg };
|
|
13267
13274
|
}
|
|
@@ -13334,6 +13341,244 @@ var GeminiTransport$1 = /*#__PURE__*/Object.freeze({
|
|
|
13334
13341
|
GeminiTransport: GeminiTransport
|
|
13335
13342
|
});
|
|
13336
13343
|
|
|
13344
|
+
const KIMI_TIMEOUTS = {
|
|
13345
|
+
init: 12e4,
|
|
13346
|
+
toolCall: 12e4,
|
|
13347
|
+
investigation: 6e5,
|
|
13348
|
+
think: 3e4,
|
|
13349
|
+
idle: 500
|
|
13350
|
+
};
|
|
13351
|
+
const KIMI_TOOL_PATTERNS = [
|
|
13352
|
+
{
|
|
13353
|
+
name: "change_title",
|
|
13354
|
+
patterns: ["change_title", "change-title", "svamp__change_title", "mcp__svamp__change_title"],
|
|
13355
|
+
inputFields: ["title"],
|
|
13356
|
+
emptyInputDefault: true
|
|
13357
|
+
},
|
|
13358
|
+
{
|
|
13359
|
+
name: "set_session_link",
|
|
13360
|
+
patterns: ["set_session_link", "set-session-link", "svamp__set_session_link", "mcp__svamp__set_session_link"],
|
|
13361
|
+
inputFields: ["url"]
|
|
13362
|
+
},
|
|
13363
|
+
{
|
|
13364
|
+
name: "save_memory",
|
|
13365
|
+
patterns: ["save_memory", "save-memory"],
|
|
13366
|
+
inputFields: ["memory", "content"]
|
|
13367
|
+
},
|
|
13368
|
+
{
|
|
13369
|
+
name: "think",
|
|
13370
|
+
patterns: ["think"],
|
|
13371
|
+
inputFields: ["thought", "thinking"]
|
|
13372
|
+
}
|
|
13373
|
+
];
|
|
13374
|
+
const AVAILABLE_MODELS = [
|
|
13375
|
+
"moonshotai/kimi-k2.5",
|
|
13376
|
+
"moonshotai/kimi-k3",
|
|
13377
|
+
"moonshotai/kimi-k2.7-code",
|
|
13378
|
+
"moonshotai/kimi-k2-thinking",
|
|
13379
|
+
"moonshotai/kimi-k2-turbo-preview",
|
|
13380
|
+
"kimi-for-coding/kimi-for-coding"
|
|
13381
|
+
];
|
|
13382
|
+
class KimiTransport {
|
|
13383
|
+
agentName = "kimi";
|
|
13384
|
+
getInitTimeout() {
|
|
13385
|
+
return KIMI_TIMEOUTS.init;
|
|
13386
|
+
}
|
|
13387
|
+
filterStdoutLine(line) {
|
|
13388
|
+
const trimmed = line.trim();
|
|
13389
|
+
if (!trimmed) return null;
|
|
13390
|
+
if (!trimmed.startsWith("{") && !trimmed.startsWith("[")) return null;
|
|
13391
|
+
try {
|
|
13392
|
+
const parsed = JSON.parse(trimmed);
|
|
13393
|
+
if (typeof parsed !== "object" || parsed === null) return null;
|
|
13394
|
+
return line;
|
|
13395
|
+
} catch {
|
|
13396
|
+
return null;
|
|
13397
|
+
}
|
|
13398
|
+
}
|
|
13399
|
+
handleStderr(text, context) {
|
|
13400
|
+
const trimmed = text.trim();
|
|
13401
|
+
if (!trimmed) return { message: null, suppress: true };
|
|
13402
|
+
if (trimmed.includes("no provider configured") || trimmed.includes("Authentication required") || trimmed.includes("Invalid Authentication") || trimmed.includes("authentication_error") || trimmed.includes("401")) {
|
|
13403
|
+
const msg = {
|
|
13404
|
+
type: "status",
|
|
13405
|
+
status: "error",
|
|
13406
|
+
detail: "Kimi has no valid provider configured. Run `svamp daemon kimi-auth use-moonshot <api-key>` (or `use-coding` / `set`) on this machine, then restart the daemon."
|
|
13407
|
+
};
|
|
13408
|
+
return { message: msg };
|
|
13409
|
+
}
|
|
13410
|
+
if (trimmed.includes("status 429") || trimmed.includes('code":429') || trimmed.includes("429") || trimmed.includes("rate limit") || trimmed.includes("RESOURCE_EXHAUSTED")) {
|
|
13411
|
+
return { message: null, suppress: false };
|
|
13412
|
+
}
|
|
13413
|
+
if (trimmed.includes("status 404") || trimmed.includes('code":404') || trimmed.includes("model_not_found")) {
|
|
13414
|
+
const msg = {
|
|
13415
|
+
type: "status",
|
|
13416
|
+
status: "error",
|
|
13417
|
+
detail: `Model not found. Example Kimi models: ${AVAILABLE_MODELS.join(", ")}`
|
|
13418
|
+
};
|
|
13419
|
+
return { message: msg };
|
|
13420
|
+
}
|
|
13421
|
+
if (context.hasActiveInvestigation) {
|
|
13422
|
+
const hasError = trimmed.includes("timeout") || trimmed.includes("Timeout") || trimmed.includes("failed") || trimmed.includes("Failed") || trimmed.includes("error") || trimmed.includes("Error");
|
|
13423
|
+
if (hasError) {
|
|
13424
|
+
return { message: null, suppress: false };
|
|
13425
|
+
}
|
|
13426
|
+
}
|
|
13427
|
+
return { message: null };
|
|
13428
|
+
}
|
|
13429
|
+
getToolPatterns() {
|
|
13430
|
+
return KIMI_TOOL_PATTERNS;
|
|
13431
|
+
}
|
|
13432
|
+
isInvestigationTool(toolCallId, toolKind) {
|
|
13433
|
+
const lowerId = toolCallId.toLowerCase();
|
|
13434
|
+
return lowerId.includes("codebase_investigator") || lowerId.includes("investigator") || typeof toolKind === "string" && toolKind.includes("investigator");
|
|
13435
|
+
}
|
|
13436
|
+
getToolCallTimeout(toolCallId, toolKind) {
|
|
13437
|
+
if (this.isInvestigationTool(toolCallId, toolKind)) return KIMI_TIMEOUTS.investigation;
|
|
13438
|
+
if (toolKind === "think") return KIMI_TIMEOUTS.think;
|
|
13439
|
+
return KIMI_TIMEOUTS.toolCall;
|
|
13440
|
+
}
|
|
13441
|
+
getIdleTimeout() {
|
|
13442
|
+
return KIMI_TIMEOUTS.idle;
|
|
13443
|
+
}
|
|
13444
|
+
extractToolNameFromId(toolCallId) {
|
|
13445
|
+
const lowerId = toolCallId.toLowerCase();
|
|
13446
|
+
for (const toolPattern of KIMI_TOOL_PATTERNS) {
|
|
13447
|
+
for (const pattern of toolPattern.patterns) {
|
|
13448
|
+
if (lowerId.includes(pattern.toLowerCase())) {
|
|
13449
|
+
return toolPattern.name;
|
|
13450
|
+
}
|
|
13451
|
+
}
|
|
13452
|
+
}
|
|
13453
|
+
return null;
|
|
13454
|
+
}
|
|
13455
|
+
isEmptyInput(input) {
|
|
13456
|
+
if (!input) return true;
|
|
13457
|
+
if (Array.isArray(input)) return input.length === 0;
|
|
13458
|
+
if (typeof input === "object") return Object.keys(input).length === 0;
|
|
13459
|
+
return false;
|
|
13460
|
+
}
|
|
13461
|
+
determineToolName(toolName, toolCallId, input, _context) {
|
|
13462
|
+
if (toolName !== "other" && toolName !== "Unknown tool") return toolName;
|
|
13463
|
+
const idToolName = this.extractToolNameFromId(toolCallId);
|
|
13464
|
+
if (idToolName) return idToolName;
|
|
13465
|
+
if (input && typeof input === "object" && !Array.isArray(input)) {
|
|
13466
|
+
const inputKeys = Object.keys(input);
|
|
13467
|
+
for (const toolPattern of KIMI_TOOL_PATTERNS) {
|
|
13468
|
+
if (toolPattern.inputFields) {
|
|
13469
|
+
const hasMatchingField = toolPattern.inputFields.some(
|
|
13470
|
+
(field) => inputKeys.some((key) => key.toLowerCase() === field.toLowerCase())
|
|
13471
|
+
);
|
|
13472
|
+
if (hasMatchingField) return toolPattern.name;
|
|
13473
|
+
}
|
|
13474
|
+
}
|
|
13475
|
+
}
|
|
13476
|
+
if (this.isEmptyInput(input) && toolName === "other") {
|
|
13477
|
+
const defaultTool = KIMI_TOOL_PATTERNS.find((p) => p.emptyInputDefault);
|
|
13478
|
+
if (defaultTool) return defaultTool.name;
|
|
13479
|
+
}
|
|
13480
|
+
return toolName;
|
|
13481
|
+
}
|
|
13482
|
+
}
|
|
13483
|
+
|
|
13484
|
+
var KimiTransport$1 = /*#__PURE__*/Object.freeze({
|
|
13485
|
+
__proto__: null,
|
|
13486
|
+
KIMI_TIMEOUTS: KIMI_TIMEOUTS,
|
|
13487
|
+
KimiTransport: KimiTransport
|
|
13488
|
+
});
|
|
13489
|
+
|
|
13490
|
+
const DEFAULT_KIMI_PROVIDER = "moonshotai";
|
|
13491
|
+
const DEFAULT_KIMI_MODEL_BY_PROVIDER = {
|
|
13492
|
+
moonshotai: "kimi-k2.5",
|
|
13493
|
+
"moonshotai-cn": "kimi-k2-turbo-preview",
|
|
13494
|
+
"kimi-for-coding": "kimi-for-coding"
|
|
13495
|
+
};
|
|
13496
|
+
function kimiDefaultModelId(cfg) {
|
|
13497
|
+
if (cfg.model) {
|
|
13498
|
+
const m = cfg.model.trim();
|
|
13499
|
+
return m.includes("/") ? m.split("/").pop() || void 0 : m;
|
|
13500
|
+
}
|
|
13501
|
+
return DEFAULT_KIMI_MODEL_BY_PROVIDER[cfg.provider];
|
|
13502
|
+
}
|
|
13503
|
+
function kimiSpawnEnv(_env = process.env) {
|
|
13504
|
+
return { KIMI_CLI_NO_AUTO_UPDATE: "1" };
|
|
13505
|
+
}
|
|
13506
|
+
function resolveKimiProvider(env = process.env) {
|
|
13507
|
+
return {
|
|
13508
|
+
provider: env.SVAMP_KIMI_PROVIDER || DEFAULT_KIMI_PROVIDER,
|
|
13509
|
+
apiKey: env.SVAMP_KIMI_API_KEY || env.LLM_API_KEY || void 0,
|
|
13510
|
+
apiBase: env.SVAMP_KIMI_API_BASE || env.LLM_API_BASE || void 0,
|
|
13511
|
+
model: env.SVAMP_KIMI_MODEL || env.LLM_MODEL || void 0
|
|
13512
|
+
};
|
|
13513
|
+
}
|
|
13514
|
+
function hasKimiProvider(cfg) {
|
|
13515
|
+
return !!cfg.apiKey;
|
|
13516
|
+
}
|
|
13517
|
+
function buildKimiCatalogAddArgs(cfg) {
|
|
13518
|
+
if (!hasKimiProvider(cfg)) return null;
|
|
13519
|
+
const args = ["provider", "catalog", "add", cfg.provider, "--api-key", cfg.apiKey];
|
|
13520
|
+
if (cfg.apiBase) args.push("--base-url", cfg.apiBase);
|
|
13521
|
+
const defaultModel = kimiDefaultModelId(cfg);
|
|
13522
|
+
if (defaultModel) args.push("--default-model", defaultModel);
|
|
13523
|
+
return args;
|
|
13524
|
+
}
|
|
13525
|
+
function kimiProviderConfigured(configTomlText, provider) {
|
|
13526
|
+
if (!configTomlText) return false;
|
|
13527
|
+
const header = `[providers.${provider}]`;
|
|
13528
|
+
const idx = configTomlText.indexOf(header);
|
|
13529
|
+
if (idx < 0) return false;
|
|
13530
|
+
const rest = configTomlText.slice(idx + header.length);
|
|
13531
|
+
const nextTable = rest.search(/\n\s*\[/);
|
|
13532
|
+
const block = nextTable < 0 ? rest : rest.slice(0, nextTable);
|
|
13533
|
+
return /(^|\n)\s*api_key\s*=/.test(block);
|
|
13534
|
+
}
|
|
13535
|
+
|
|
13536
|
+
var kimiProvider = /*#__PURE__*/Object.freeze({
|
|
13537
|
+
__proto__: null,
|
|
13538
|
+
DEFAULT_KIMI_MODEL_BY_PROVIDER: DEFAULT_KIMI_MODEL_BY_PROVIDER,
|
|
13539
|
+
DEFAULT_KIMI_PROVIDER: DEFAULT_KIMI_PROVIDER,
|
|
13540
|
+
buildKimiCatalogAddArgs: buildKimiCatalogAddArgs,
|
|
13541
|
+
hasKimiProvider: hasKimiProvider,
|
|
13542
|
+
kimiDefaultModelId: kimiDefaultModelId,
|
|
13543
|
+
kimiProviderConfigured: kimiProviderConfigured,
|
|
13544
|
+
kimiSpawnEnv: kimiSpawnEnv,
|
|
13545
|
+
resolveKimiProvider: resolveKimiProvider
|
|
13546
|
+
});
|
|
13547
|
+
|
|
13548
|
+
const KIMI_CONFIG_PATH = join$1(homedir$1(), ".kimi-code", "config.toml");
|
|
13549
|
+
function readKimiConfig() {
|
|
13550
|
+
try {
|
|
13551
|
+
return readFileSync(KIMI_CONFIG_PATH, "utf8");
|
|
13552
|
+
} catch {
|
|
13553
|
+
return null;
|
|
13554
|
+
}
|
|
13555
|
+
}
|
|
13556
|
+
function ensureKimiProviderConfigured(env = process.env, command = "kimi", log = () => {
|
|
13557
|
+
}) {
|
|
13558
|
+
const cfg = resolveKimiProvider(env);
|
|
13559
|
+
if (!hasKimiProvider(cfg)) return false;
|
|
13560
|
+
if (kimiProviderConfigured(readKimiConfig(), cfg.provider)) return true;
|
|
13561
|
+
const args = buildKimiCatalogAddArgs(cfg);
|
|
13562
|
+
if (!args) return false;
|
|
13563
|
+
try {
|
|
13564
|
+
execFileSync(command, args, {
|
|
13565
|
+
stdio: "ignore",
|
|
13566
|
+
timeout: 3e4,
|
|
13567
|
+
env: { ...process.env, KIMI_CLI_NO_AUTO_UPDATE: "1" }
|
|
13568
|
+
});
|
|
13569
|
+
log(`[kimi] configured provider '${cfg.provider}' in ${KIMI_CONFIG_PATH}`);
|
|
13570
|
+
return kimiProviderConfigured(readKimiConfig(), cfg.provider);
|
|
13571
|
+
} catch (err) {
|
|
13572
|
+
log(`[kimi] provider auto-config failed (${err?.message || err}); session may need kimi-auth`);
|
|
13573
|
+
return false;
|
|
13574
|
+
}
|
|
13575
|
+
}
|
|
13576
|
+
|
|
13577
|
+
var kimiSetup = /*#__PURE__*/Object.freeze({
|
|
13578
|
+
__proto__: null,
|
|
13579
|
+
ensureKimiProviderConfigured: ensureKimiProviderConfigured
|
|
13580
|
+
});
|
|
13581
|
+
|
|
13337
13582
|
function resolveTranscriptPath(cwd, claudeSessionId) {
|
|
13338
13583
|
let real;
|
|
13339
13584
|
try {
|
|
@@ -17970,7 +18215,7 @@ async function startDaemon(options) {
|
|
|
17970
18215
|
try {
|
|
17971
18216
|
const dir = loadSessionIndex()[sessionId]?.directory;
|
|
17972
18217
|
if (!dir) return;
|
|
17973
|
-
const { reconcileServiceLinks } = await import('./agentCommands-
|
|
18218
|
+
const { reconcileServiceLinks } = await import('./agentCommands-RhxyIA_z.mjs');
|
|
17974
18219
|
const configPath = getSvampConfigPath(dir, sessionId);
|
|
17975
18220
|
const config = readSvampConfig(configPath);
|
|
17976
18221
|
const entries = Array.from(urls.entries());
|
|
@@ -17988,7 +18233,7 @@ async function startDaemon(options) {
|
|
|
17988
18233
|
}
|
|
17989
18234
|
}
|
|
17990
18235
|
async function createExposedTunnel(spec) {
|
|
17991
|
-
const { FrpcTunnel } = await import('./frpc-
|
|
18236
|
+
const { FrpcTunnel } = await import('./frpc-pwqsONPX.mjs');
|
|
17992
18237
|
const tunnel = new FrpcTunnel({
|
|
17993
18238
|
name: spec.name,
|
|
17994
18239
|
ports: spec.ports,
|
|
@@ -20333,11 +20578,11 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
|
|
|
20333
20578
|
});
|
|
20334
20579
|
},
|
|
20335
20580
|
onIssue: async (params) => {
|
|
20336
|
-
const { issueRpc } = await import('./rpc-
|
|
20581
|
+
const { issueRpc } = await import('./rpc-DAcODVs3.mjs');
|
|
20337
20582
|
return issueRpc(params?.cwd || directory, params || {}, { notifySession: notifyIssueOwner, rekickLoopOwner });
|
|
20338
20583
|
},
|
|
20339
20584
|
onWorkflow: async (params) => {
|
|
20340
|
-
const { workflowRpc } = await import('./rpc-
|
|
20585
|
+
const { workflowRpc } = await import('./rpc-BFIy8FTe.mjs');
|
|
20341
20586
|
return workflowRpc(params?.cwd || directory, params || {});
|
|
20342
20587
|
},
|
|
20343
20588
|
onRipgrep: async (args, cwd) => {
|
|
@@ -21041,11 +21286,11 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
|
|
|
21041
21286
|
});
|
|
21042
21287
|
},
|
|
21043
21288
|
onIssue: async (params) => {
|
|
21044
|
-
const { issueRpc } = await import('./rpc-
|
|
21289
|
+
const { issueRpc } = await import('./rpc-DAcODVs3.mjs');
|
|
21045
21290
|
return issueRpc(params?.cwd || directory, params || {}, { notifySession: notifyIssueOwner, rekickLoopOwner });
|
|
21046
21291
|
},
|
|
21047
21292
|
onWorkflow: async (params) => {
|
|
21048
|
-
const { workflowRpc } = await import('./rpc-
|
|
21293
|
+
const { workflowRpc } = await import('./rpc-BFIy8FTe.mjs');
|
|
21049
21294
|
return workflowRpc(params?.cwd || directory, params || {});
|
|
21050
21295
|
},
|
|
21051
21296
|
onRipgrep: async (args, cwd) => {
|
|
@@ -21277,8 +21522,16 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
|
|
|
21277
21522
|
resumeThreadId: acpResumeThreadId
|
|
21278
21523
|
});
|
|
21279
21524
|
} else {
|
|
21280
|
-
const transportHandler = agentName === "gemini" ? new GeminiTransport() : new DefaultTransport(agentName);
|
|
21525
|
+
const transportHandler = agentName === "gemini" ? new GeminiTransport() : agentName === "kimi" ? new KimiTransport() : new DefaultTransport(agentName);
|
|
21281
21526
|
const acpConfig = KNOWN_ACP_AGENTS[agentName];
|
|
21527
|
+
let kimiEnv = {};
|
|
21528
|
+
if (agentName === "kimi") {
|
|
21529
|
+
try {
|
|
21530
|
+
ensureKimiProviderConfigured(process.env, acpConfig.command, logger.log);
|
|
21531
|
+
} catch {
|
|
21532
|
+
}
|
|
21533
|
+
kimiEnv = kimiSpawnEnv(process.env);
|
|
21534
|
+
}
|
|
21282
21535
|
agentBackend = new AcpBackend({
|
|
21283
21536
|
agentName,
|
|
21284
21537
|
cwd: directory,
|
|
@@ -21286,7 +21539,7 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
|
|
|
21286
21539
|
args: acpConfig.args,
|
|
21287
21540
|
// #0599: session identity (SVAMP_SESSION_ID/HANDLE/MACHINE_ID) so ACP terminal
|
|
21288
21541
|
// tools self-identify like Claude's do; applied last (identity wins).
|
|
21289
|
-
env: { ...options2.environmentVariables || {}, ...sessionIdentityEnv },
|
|
21542
|
+
env: { ...options2.environmentVariables || {}, ...kimiEnv, ...sessionIdentityEnv },
|
|
21290
21543
|
permissionHandler,
|
|
21291
21544
|
transportHandler,
|
|
21292
21545
|
log: logger.log,
|
|
@@ -22283,7 +22536,7 @@ ${oracle.output.trim().slice(0, 500)}`, "\u{1F501} Continuing loop");
|
|
|
22283
22536
|
const PING_TIMEOUT_MS = 15e3;
|
|
22284
22537
|
const POST_RECONNECT_GRACE_MS = 2e4;
|
|
22285
22538
|
const RECONNECT_JITTER_MS = 2500;
|
|
22286
|
-
const { WorkflowScheduler } = await import('./scheduler-
|
|
22539
|
+
const { WorkflowScheduler } = await import('./scheduler-DlDYY_wS.mjs');
|
|
22287
22540
|
const workflowProjectRoots = () => {
|
|
22288
22541
|
const dirs = /* @__PURE__ */ new Set();
|
|
22289
22542
|
for (const s of pidToTrackedSession.values()) {
|
|
@@ -22917,4 +23170,4 @@ var run = /*#__PURE__*/Object.freeze({
|
|
|
22917
23170
|
writeStopMarker: writeStopMarker
|
|
22918
23171
|
});
|
|
22919
23172
|
|
|
22920
|
-
export {
|
|
23173
|
+
export { getSkillInfo as $, removeWorkflow as A, validateWorkflowName as B, saveWorkflow as C, rawWorkflow as D, listWorkflows as E, isWorkflowEnabled as F, workflowSchedules as G, inZone as H, cronMatches as I, summarize as J, workflowSteps as K, parseJwtEmail as L, computeCollectionConfigUpdate as M, SYSTEM_COLLECTION_CONFIG as N, loadMachineContext as O, buildMachineInstructions as P, machineToolsForRole as Q, READ_ONLY_TOOLS as R, SharingNotificationSync as S, buildMachineTools as T, parseFrontmatter as U, getSkillsServer as V, getSkillsWorkspaceName as W, getSkillsCollectionName as X, fetchWithTimeout as Y, searchSkills as Z, SKILLS_DIR as _, createSessionStore as a, downloadSkillFile as a0, listSkillFiles as a1, resolveModel as a2, clearStopMarker as a3, stopMarkerExists as a4, formatHandle as a5, normalizeAllowedUser as a6, loadSecurityContextConfig as a7, resolveSecurityContext as a8, buildSecurityContextFromFlags as a9, kimiProvider as aA, kimiSetup as aB, api as aC, run as aD, mergeSecurityContexts as aa, buildSessionShareUrl as ab, computeOutboundHop as ac, registerAwaitingReply as ad, buildMachineShareUrl as ae, parseHandle as af, handleMatchesMetadata as ag, PINNED_CODEX_VERSION as ah, withFileLock as ai, describeMisconfiguration as aj, buildMachineDeps as ak, applyClaudeProxyEnv as al, composeSessionId as am, generateFriendlyName as an, generateHookSettings as ao, staticFileServer as ap, instanceConfig as aq, claudeAuth as ar, codexProvider as as, projectInfo as at, DefaultTransport$1 as au, acpBackend as av, acpAgentConfig as aw, codexAppServerBackend as ax, GeminiTransport$1 as ay, KimiTransport$1 as az, stopDaemon as b, connectToHypha as c, daemonStatus as d, getFrpsSubdomainHost as e, getFrpsServerPort as f, getHyphaServerUrl$1 as g, getFrpsServerAddr as h, shortId as i, resolveProjectRoot as j, getIssue as k, resumeIssue as l, addComment as m, addIssue as n, listIssues as o, pauseIssue as p, searchIssues as q, registerMachineService as r, startDaemon as s, isVisibleTo as t, updateIssue as u, getRun as v, listRuns as w, getWorkflow as x, runWorkflow as y, setWorkflowEnabled as z };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { j as resolveProjectRoot, E as listWorkflows, F as isWorkflowEnabled, G as workflowSchedules, H as inZone, y as runWorkflow, I as cronMatches } from './run-
|
|
1
|
+
import { j as resolveProjectRoot, E as listWorkflows, F as isWorkflowEnabled, G as workflowSchedules, H as inZone, y as runWorkflow, I as cronMatches } from './run-vEbmTx6x.mjs';
|
|
2
2
|
import 'os';
|
|
3
3
|
import 'fs/promises';
|
|
4
4
|
import 'fs';
|
|
@@ -54,7 +54,7 @@ async function handleServeCommand() {
|
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
56
|
async function serveAdd(args, machineId) {
|
|
57
|
-
const { connectAndGetMachine } = await import('./commands-
|
|
57
|
+
const { connectAndGetMachine } = await import('./commands-CjBsJQX-.mjs');
|
|
58
58
|
const pos = positionalArgs(args);
|
|
59
59
|
const name = pos[0];
|
|
60
60
|
if (!name) {
|
|
@@ -93,7 +93,7 @@ async function serveAdd(args, machineId) {
|
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
95
|
async function serveApply(args, machineId) {
|
|
96
|
-
const { connectAndGetMachine } = await import('./commands-
|
|
96
|
+
const { connectAndGetMachine } = await import('./commands-CjBsJQX-.mjs');
|
|
97
97
|
const fs = await import('fs');
|
|
98
98
|
const yaml = await import('yaml');
|
|
99
99
|
const file = positionalArgs(args)[0];
|
|
@@ -182,7 +182,7 @@ async function serveApply(args, machineId) {
|
|
|
182
182
|
}
|
|
183
183
|
}
|
|
184
184
|
async function serveRemove(args, machineId) {
|
|
185
|
-
const { connectAndGetMachine } = await import('./commands-
|
|
185
|
+
const { connectAndGetMachine } = await import('./commands-CjBsJQX-.mjs');
|
|
186
186
|
const pos = positionalArgs(args);
|
|
187
187
|
const name = pos[0];
|
|
188
188
|
if (!name) {
|
|
@@ -202,7 +202,7 @@ async function serveRemove(args, machineId) {
|
|
|
202
202
|
}
|
|
203
203
|
}
|
|
204
204
|
async function serveList(args, machineId) {
|
|
205
|
-
const { connectAndGetMachine } = await import('./commands-
|
|
205
|
+
const { connectAndGetMachine } = await import('./commands-CjBsJQX-.mjs');
|
|
206
206
|
const all = hasFlag(args, "--all", "-a");
|
|
207
207
|
const json = hasFlag(args, "--json");
|
|
208
208
|
const sessionId = getFlag(args, "--session");
|
|
@@ -236,7 +236,7 @@ async function serveList(args, machineId) {
|
|
|
236
236
|
}
|
|
237
237
|
}
|
|
238
238
|
async function serveInfo(machineId) {
|
|
239
|
-
const { connectAndGetMachine } = await import('./commands-
|
|
239
|
+
const { connectAndGetMachine } = await import('./commands-CjBsJQX-.mjs');
|
|
240
240
|
const { machine, server } = await connectAndGetMachine(machineId);
|
|
241
241
|
try {
|
|
242
242
|
const info = await machine.serveInfo();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { R as READ_ONLY_TOOLS, O as loadMachineContext, P as buildMachineInstructions, Q as machineToolsForRole, T as buildMachineTools } from './run-
|
|
1
|
+
import { R as READ_ONLY_TOOLS, O as loadMachineContext, P as buildMachineInstructions, Q as machineToolsForRole, T as buildMachineTools } from './run-vEbmTx6x.mjs';
|
|
2
2
|
import 'node:child_process';
|
|
3
3
|
import 'os';
|
|
4
4
|
import 'fs/promises';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "svamp-cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.315",
|
|
4
4
|
"description": "Svamp CLI — AI workspace daemon on Hypha Cloud",
|
|
5
5
|
"author": "Amun AI AB",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"scripts": {
|
|
21
21
|
"build": "rm -rf dist bin/skills bin/commands && mkdir -p bin/skills && cp -r ../../skills/artifact bin/skills/artifact && cp -r ../../skills/crew bin/skills/crew && cp -r ../../commands bin/commands && tsc --noEmit && pkgroll",
|
|
22
22
|
"typecheck": "tsc --noEmit",
|
|
23
|
-
"test": "npx tsx test/test-context-window.mjs && npx tsx test/test-ratelimit-retry.mjs && npx tsx test/test-instance-config.mjs && npx tsx test/test-authorize.mjs && npx tsx test/test-normalize-allowed-user.mjs && npx tsx test/test-share-url.mjs && npx tsx test/test-update-sharing-normalization.mjs && npx tsx test/test-sharing-notify-sync.mjs && npx tsx test/test-sharing-notify-resolve.mjs && npx tsx test/test-staged-homes-sweep.mjs && npx tsx test/test-session-helpers.mjs && npx tsx test/test-cli-routing.mjs && npx tsx test/test-security-context.mjs && npx tsx test/test-isolation-decision.mjs && npx tsx test/test-message-helpers.mjs && npx tsx test/test-stdin-delivery.mjs && npx tsx test/test-agent-config.mjs && npx tsx test/test-wrap-command.mjs && npx tsx test/test-credential-staging.mjs && npx tsx test/test-claude-auth.mjs && npx tsx test/test-backend-accounts.mjs && npx tsx test/test-codex-force-model.mjs && npx tsx test/test-backend-oauth.mjs && npx tsx test/test-btw-proxy-env.mjs && npx tsx test/test-output-formatters.mjs && npx tsx test/test-inbox-guard.mjs && npx tsx test/test-user-events.mjs && npx tsx test/test-migrate-children.mjs && npx tsx test/test-outpost-install.mjs && npx tsx test/test-outpost-setup.mjs && npx tsx test/test-outpost-pairing.mjs && npx tsx test/test-outpost-coordinator.mjs && npx tsx test/e2e-outpost-transport.mjs && npx tsx test/test-inbox-reconcile.mjs && npx tsx test/test-auto-topic.mjs && npx tsx test/test-project-info.mjs && npx tsx test/test-agent-types.mjs && npx tsx test/test-transport.mjs && npx tsx test/test-session-update-handlers.mjs && npx tsx test/test-session-scanner.mjs && npx tsx test/test-hypha-client.mjs && npx tsx test/test-hook-settings.mjs && npx tsx test/test-session-service-logic.mjs && npx tsx test/test-daemon-persistence.mjs && npx tsx test/test-detect-isolation.mjs && npx tsx test/test-isolation-disable.mjs && npx tsx test/test-machine-service-logic.mjs && npx tsx test/test-machine-session-visibility.mjs && npx tsx test/test-session-access-fallback.mjs && npx tsx test/test-session-rpc-role-map.mjs && npx tsx test/test-interactive-helpers.mjs && npx tsx test/test-pinned-codex.mjs && npx tsx test/test-codex-request-timeout.mjs && npx tsx test/test-codex-app-server.mjs && npx tsx test/e2e-codex-midturn-steer.mjs && npx tsx test/test-acp-backend.mjs && npx tsx test/test-acp-bridge.mjs && npx tsx test/test-listener-backoff.mjs && npx tsx test/test-session-identity-env.mjs && npx tsx test/test-hook-server.mjs && npx tsx test/test-session-commands.mjs && npx tsx test/test-interactive-console.mjs && npx tsx test/test-session-messages.mjs && npx tsx test/test-session-send-query.mjs && npx tsx test/test-skills.mjs && npx tsx test/test-agent-grouping.mjs && npx tsx test/test-machine-list-directory.mjs && npx tsx test/test-service-commands.mjs && npx tsx test/test-supervisor.mjs && npx tsx test/test-supervisor-lock.mjs && node test/test-supervisor-restart.mjs && npx tsx test/test-clear-detection.mjs && npx tsx test/test-compact-detect.mjs && npx tsx test/test-session-consolidation.mjs && npx tsx test/test-inbox-store.mjs && npx tsx test/test-inbox.mjs && npx tsx test/test-inbox-cross-machine.mjs && npx tsx test/test-issue-store.mjs && npx tsx test/test-issue-store-lock.mjs && npx tsx test/test-issue-close-gate.mjs && npx tsx test/test-loop-verify.mjs && npx tsx test/test-restore-decision.mjs && npx tsx test/test-issue-rpc.mjs && npx tsx test/test-issue-pause.mjs && npx tsx test/test-workflow-store.mjs && npx tsx test/test-workflow-rpc.mjs && npx tsx test/test-workflow-scheduler.mjs && npx tsx test/test-cron.mjs && npx tsx test/test-workflow-runs.mjs && npx tsx test/test-workflow-runs-lock.mjs && npx tsx test/test-workflow-idle.mjs && npx tsx test/test-workflow-reconcile.mjs && npx tsx test/test-serve-link-subdomain.mjs && npx tsx test/test-short-id.mjs && npx tsx test/test-transcript-edit.mjs && npx tsx test/test-edit-history.mjs && npx tsx test/test-friendly-name.mjs && npx tsx test/test-session-rpc-dispatch.mjs && npx tsx test/test-sandbox-cli.mjs && npx tsx test/test-serve-manager.mjs && npx tsx test/test-serve-ws-upgrade.mjs && npx tsx test/test-serve-auth.mjs && npx tsx test/test-static-file-server.mjs && npx tsx test/test-serve-stability.mjs && npx tsx test/test-frpc-e2e.mjs --unit-only && npx tsx test/test-frpc-status.mjs && node test/pinnedClaudeCode.test.mjs && node test/fleet.test.mjs && npx tsx test/test-session-file.mjs && npx tsx test/test-channel-rpc.mjs && npx tsx test/test-wise-agent.mjs && npx tsx test/test-channel-agent.mjs && npx tsx test/test-channels-service.mjs && npx tsx test/test-hotreload-seam.mjs && npx tsx test/test-hot-reload.mjs && npx tsx test/test-hot-reload-live.mjs && npx tsx test/test-session-core.mjs && npx tsx test/test-channel-async-reply.mjs && npx tsx test/test-outbox-reload.mjs && npx tsx test/test-channel-binding.mjs && npx tsx test/test-channel-store-lock.mjs && npx tsx test/test-channel-identity.mjs && npx tsx test/test-stateless-dispatch-limiter.mjs && npx tsx test/test-shared-session-identity.mjs && npx tsx test/test-wise-agent-auth.mjs && npx tsx test/test-channel-http.mjs && npx tsx test/test-channel-upload.mjs && npx tsx test/test-wise-voice.mjs && npx tsx test/test-wise-headless.mjs && npx tsx test/test-wise-machine.mjs && npx tsx test/test-crew-merge.mjs && npx tsx test/test-crew-verdict-routing.mjs && npx tsx test/test-crew-standalone.mjs && npx tsx test/test-session-links.mjs && npx tsx test/test-issue-loop-pause-guard.mjs && npx tsx test/test-artifact-guard.mjs && npx tsx test/test-artifact-sync-pagination.mjs && npx tsx test/test-graceful-restart.mjs && npx tsx test/test-flush-exit.mjs && npx tsx test/test-codex-skills.mjs",
|
|
23
|
+
"test": "npx tsx test/test-context-window.mjs && npx tsx test/test-ratelimit-retry.mjs && npx tsx test/test-instance-config.mjs && npx tsx test/test-authorize.mjs && npx tsx test/test-normalize-allowed-user.mjs && npx tsx test/test-share-url.mjs && npx tsx test/test-update-sharing-normalization.mjs && npx tsx test/test-sharing-notify-sync.mjs && npx tsx test/test-sharing-notify-resolve.mjs && npx tsx test/test-staged-homes-sweep.mjs && npx tsx test/test-session-helpers.mjs && npx tsx test/test-cli-routing.mjs && npx tsx test/test-security-context.mjs && npx tsx test/test-isolation-decision.mjs && npx tsx test/test-message-helpers.mjs && npx tsx test/test-stdin-delivery.mjs && npx tsx test/test-agent-config.mjs && npx tsx test/test-wrap-command.mjs && npx tsx test/test-credential-staging.mjs && npx tsx test/test-claude-auth.mjs && npx tsx test/test-backend-accounts.mjs && npx tsx test/test-codex-force-model.mjs && npx tsx test/test-backend-oauth.mjs && npx tsx test/test-btw-proxy-env.mjs && npx tsx test/test-output-formatters.mjs && npx tsx test/test-inbox-guard.mjs && npx tsx test/test-user-events.mjs && npx tsx test/test-migrate-children.mjs && npx tsx test/test-outpost-install.mjs && npx tsx test/test-outpost-setup.mjs && npx tsx test/test-outpost-pairing.mjs && npx tsx test/test-outpost-coordinator.mjs && npx tsx test/e2e-outpost-transport.mjs && npx tsx test/test-inbox-reconcile.mjs && npx tsx test/test-auto-topic.mjs && npx tsx test/test-project-info.mjs && npx tsx test/test-agent-types.mjs && npx tsx test/test-transport.mjs && npx tsx test/test-session-update-handlers.mjs && npx tsx test/test-session-scanner.mjs && npx tsx test/test-hypha-client.mjs && npx tsx test/test-hook-settings.mjs && npx tsx test/test-session-service-logic.mjs && npx tsx test/test-daemon-persistence.mjs && npx tsx test/test-detect-isolation.mjs && npx tsx test/test-isolation-disable.mjs && npx tsx test/test-machine-service-logic.mjs && npx tsx test/test-machine-session-visibility.mjs && npx tsx test/test-session-access-fallback.mjs && npx tsx test/test-session-rpc-role-map.mjs && npx tsx test/test-interactive-helpers.mjs && npx tsx test/test-pinned-codex.mjs && npx tsx test/test-codex-request-timeout.mjs && npx tsx test/test-codex-app-server.mjs && npx tsx test/e2e-codex-midturn-steer.mjs && npx tsx test/test-kimi-provider.mjs && npx tsx test/test-acp-backend.mjs && npx tsx test/test-acp-bridge.mjs && npx tsx test/test-listener-backoff.mjs && npx tsx test/test-session-identity-env.mjs && npx tsx test/test-hook-server.mjs && npx tsx test/test-session-commands.mjs && npx tsx test/test-interactive-console.mjs && npx tsx test/test-session-messages.mjs && npx tsx test/test-session-send-query.mjs && npx tsx test/test-skills.mjs && npx tsx test/test-agent-grouping.mjs && npx tsx test/test-machine-list-directory.mjs && npx tsx test/test-service-commands.mjs && npx tsx test/test-supervisor.mjs && npx tsx test/test-supervisor-lock.mjs && node test/test-supervisor-restart.mjs && npx tsx test/test-clear-detection.mjs && npx tsx test/test-compact-detect.mjs && npx tsx test/test-session-consolidation.mjs && npx tsx test/test-inbox-store.mjs && npx tsx test/test-inbox.mjs && npx tsx test/test-inbox-cross-machine.mjs && npx tsx test/test-issue-store.mjs && npx tsx test/test-issue-store-lock.mjs && npx tsx test/test-issue-close-gate.mjs && npx tsx test/test-loop-verify.mjs && npx tsx test/test-restore-decision.mjs && npx tsx test/test-issue-rpc.mjs && npx tsx test/test-issue-pause.mjs && npx tsx test/test-workflow-store.mjs && npx tsx test/test-workflow-rpc.mjs && npx tsx test/test-workflow-scheduler.mjs && npx tsx test/test-cron.mjs && npx tsx test/test-workflow-runs.mjs && npx tsx test/test-workflow-runs-lock.mjs && npx tsx test/test-workflow-idle.mjs && npx tsx test/test-workflow-reconcile.mjs && npx tsx test/test-serve-link-subdomain.mjs && npx tsx test/test-short-id.mjs && npx tsx test/test-transcript-edit.mjs && npx tsx test/test-edit-history.mjs && npx tsx test/test-friendly-name.mjs && npx tsx test/test-session-rpc-dispatch.mjs && npx tsx test/test-sandbox-cli.mjs && npx tsx test/test-serve-manager.mjs && npx tsx test/test-serve-ws-upgrade.mjs && npx tsx test/test-serve-auth.mjs && npx tsx test/test-static-file-server.mjs && npx tsx test/test-serve-stability.mjs && npx tsx test/test-frpc-e2e.mjs --unit-only && npx tsx test/test-frpc-status.mjs && node test/pinnedClaudeCode.test.mjs && node test/fleet.test.mjs && npx tsx test/test-session-file.mjs && npx tsx test/test-channel-rpc.mjs && npx tsx test/test-wise-agent.mjs && npx tsx test/test-channel-agent.mjs && npx tsx test/test-channels-service.mjs && npx tsx test/test-hotreload-seam.mjs && npx tsx test/test-hot-reload.mjs && npx tsx test/test-hot-reload-live.mjs && npx tsx test/test-session-core.mjs && npx tsx test/test-channel-async-reply.mjs && npx tsx test/test-outbox-reload.mjs && npx tsx test/test-channel-binding.mjs && npx tsx test/test-channel-store-lock.mjs && npx tsx test/test-channel-identity.mjs && npx tsx test/test-stateless-dispatch-limiter.mjs && npx tsx test/test-shared-session-identity.mjs && npx tsx test/test-wise-agent-auth.mjs && npx tsx test/test-channel-http.mjs && npx tsx test/test-channel-upload.mjs && npx tsx test/test-wise-voice.mjs && npx tsx test/test-wise-headless.mjs && npx tsx test/test-wise-machine.mjs && npx tsx test/test-crew-merge.mjs && npx tsx test/test-crew-verdict-routing.mjs && npx tsx test/test-crew-standalone.mjs && npx tsx test/test-session-links.mjs && npx tsx test/test-issue-loop-pause-guard.mjs && npx tsx test/test-artifact-guard.mjs && npx tsx test/test-artifact-sync-pagination.mjs && npx tsx test/test-graceful-restart.mjs && npx tsx test/test-flush-exit.mjs && npx tsx test/test-codex-skills.mjs",
|
|
24
24
|
"test:hypha": "node --no-warnings test/test-hypha-service.mjs",
|
|
25
25
|
"dev": "tsx src/cli.ts",
|
|
26
26
|
"dev:daemon": "tsx src/cli.ts daemon start-sync",
|