svamp-cli 0.2.289 → 0.2.291
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-C7-LgldE.mjs → adminCommands-DuA0IQ8B.mjs} +1 -1
- package/dist/{agentCommands-B7HQJo3X.mjs → agentCommands-CoPsnzwK.mjs} +5 -5
- package/dist/{auth-BB_4_6P7.mjs → auth-Dj_Pcii4.mjs} +1 -1
- package/dist/{cli-BH5LIMPI.mjs → cli-CuzIOUig.mjs} +72 -68
- package/dist/cli.mjs +2 -2
- package/dist/{commands-BaVcBOKA.mjs → commands-B-VYM4sA.mjs} +1 -1
- package/dist/commands-B9puiDBS.mjs +329 -0
- package/dist/{commands-Cf9KT-Ob.mjs → commands-Bfgme-kK.mjs} +2 -2
- package/dist/{commands-BNxsrqSl.mjs → commands-Cx8mEjjt.mjs} +2 -2
- package/dist/{commands-CZSPOqtd.mjs → commands-DSI9ZUTG.mjs} +1 -1
- package/dist/{commands-BsiQdwUs.mjs → commands-DwQIShcm.mjs} +2 -2
- package/dist/{commands-Bb-RzoKB.mjs → commands-eBqn9KgI.mjs} +1 -1
- package/dist/{commands-DFSD7jBH.mjs → commands-kahqMkYE.mjs} +8 -8
- package/dist/{fleet-2c-iNucb.mjs → fleet-CqbZhBG2.mjs} +1 -1
- package/dist/{frpc-CuvdlU0g.mjs → frpc-BeGCyERl.mjs} +45 -27
- package/dist/{headlessCli-CftEZbxm.mjs → headlessCli-CJiHG0gu.mjs} +2 -2
- package/dist/index.mjs +1 -1
- package/dist/{notifyCommands-1q8COUDd.mjs → notifyCommands-CXjWSZHe.mjs} +1 -1
- package/dist/package-C0aVCX6O.mjs +64 -0
- package/dist/{rpc-DMpJef5v.mjs → rpc-1Ic_yDzC.mjs} +1 -1
- package/dist/{rpc-C9U0Ho27.mjs → rpc-DiG_DaMK.mjs} +1 -1
- package/dist/{run-BNeZiySO.mjs → run-CKLU1B02.mjs} +119 -26
- package/dist/{run-CCENV09o.mjs → run-DZJuuuAu.mjs} +1 -1
- package/dist/{scheduler-CAUwniWA.mjs → scheduler-C5Gk_hYP.mjs} +1 -1
- package/dist/{serveCommands-XJVDS4zB.mjs → serveCommands-Dipn0QHs.mjs} +5 -5
- package/dist/{sideband-DB4Uipz9.mjs → sideband-BCMGW33d.mjs} +1 -1
- package/package.json +46 -46
- package/dist/package-DrTlgNWY.mjs +0 -64
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
var name = "svamp-cli";
|
|
2
|
+
var version = "0.2.291";
|
|
3
|
+
var description = "Svamp CLI — AI workspace daemon on Hypha Cloud";
|
|
4
|
+
var author = "Amun AI AB";
|
|
5
|
+
var license = "SEE LICENSE IN LICENSE";
|
|
6
|
+
var type = "module";
|
|
7
|
+
var bin = {
|
|
8
|
+
svamp: "./bin/svamp.mjs"
|
|
9
|
+
};
|
|
10
|
+
var files = [
|
|
11
|
+
"dist",
|
|
12
|
+
"bin"
|
|
13
|
+
];
|
|
14
|
+
var main = "./dist/index.mjs";
|
|
15
|
+
var exports$1 = {
|
|
16
|
+
".": "./dist/index.mjs",
|
|
17
|
+
"./cli": "./dist/cli.mjs"
|
|
18
|
+
};
|
|
19
|
+
var scripts = {
|
|
20
|
+
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",
|
|
21
|
+
typecheck: "tsc --noEmit",
|
|
22
|
+
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-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-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-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-session-access-fallback.mjs && npx tsx test/test-interactive-helpers.mjs && npx tsx test/test-codex-app-server.mjs && npx tsx test/test-acp-backend.mjs && npx tsx test/test-acp-bridge.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-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-idle.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-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",
|
|
23
|
+
"test:hypha": "node --no-warnings test/test-hypha-service.mjs",
|
|
24
|
+
dev: "tsx src/cli.ts",
|
|
25
|
+
"dev:daemon": "tsx src/cli.ts daemon start-sync",
|
|
26
|
+
"test:e2e": "node --no-warnings test/e2e-session-tests.mjs",
|
|
27
|
+
"test:frpc": "npx tsx test/test-frpc-e2e.mjs",
|
|
28
|
+
prepublishOnly: "yarn build"
|
|
29
|
+
};
|
|
30
|
+
var dependencies = {
|
|
31
|
+
"@agentclientprotocol/sdk": "^0.14.1",
|
|
32
|
+
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
33
|
+
"hypha-rpc": "0.21.42",
|
|
34
|
+
"node-pty": "1.2.0-beta.11",
|
|
35
|
+
ws: "^8.18.0",
|
|
36
|
+
yaml: "^2.8.2",
|
|
37
|
+
zod: "^3.24.4"
|
|
38
|
+
};
|
|
39
|
+
var devDependencies = {
|
|
40
|
+
"@types/node": ">=20",
|
|
41
|
+
"@types/ws": "^8.5.14",
|
|
42
|
+
pkgroll: "^2.14.2",
|
|
43
|
+
tsx: "^4.20.6",
|
|
44
|
+
typescript: "5.9.3"
|
|
45
|
+
};
|
|
46
|
+
var packageManager = "yarn@1.22.22";
|
|
47
|
+
var _package = {
|
|
48
|
+
name: name,
|
|
49
|
+
version: version,
|
|
50
|
+
description: description,
|
|
51
|
+
author: author,
|
|
52
|
+
license: license,
|
|
53
|
+
type: type,
|
|
54
|
+
bin: bin,
|
|
55
|
+
files: files,
|
|
56
|
+
main: main,
|
|
57
|
+
exports: exports$1,
|
|
58
|
+
scripts: scripts,
|
|
59
|
+
dependencies: dependencies,
|
|
60
|
+
devDependencies: devDependencies,
|
|
61
|
+
packageManager: packageManager
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
export { author, bin, _package as default, dependencies, description, devDependencies, exports$1 as exports, files, license, main, name, packageManager, scripts, type, version };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { j as resolveProjectRoot, u as updateIssue, k as getIssue, l as resumeIssue, p as pauseIssue, m as addComment, n as addIssue, o as listIssues, q as searchIssues, t as isVisibleTo } from './run-
|
|
1
|
+
import { j as resolveProjectRoot, u as updateIssue, k as getIssue, l as resumeIssue, p as pauseIssue, m as addComment, n as addIssue, o as listIssues, q as searchIssues, t as isVisibleTo } from './run-CKLU1B02.mjs';
|
|
2
2
|
import 'os';
|
|
3
3
|
import 'fs/promises';
|
|
4
4
|
import 'fs';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { j as resolveProjectRoot, v as getRun, w as listRuns, x as getWorkflow, y as runWorkflow, z as setWorkflowEnabled, A as removeWorkflow, B as saveWorkflow, C as rawWorkflow, D as listWorkflows } from './run-
|
|
1
|
+
import { j as resolveProjectRoot, v as getRun, w as listRuns, x as getWorkflow, y as runWorkflow, z as setWorkflowEnabled, A as removeWorkflow, B as saveWorkflow, C as rawWorkflow, D as listWorkflows } from './run-CKLU1B02.mjs';
|
|
2
2
|
import 'os';
|
|
3
3
|
import 'fs/promises';
|
|
4
4
|
import 'fs';
|
|
@@ -2973,7 +2973,7 @@ Connection: close\r
|
|
|
2973
2973
|
const mount = this.mounts.get(mountName);
|
|
2974
2974
|
const subdomainOverride = mount?.access === "link" && mount.linkToken ? /* @__PURE__ */ new Map([[this.port, buildLinkSubdomain(subdomainSafe, mount.linkToken)]]) : void 0;
|
|
2975
2975
|
try {
|
|
2976
|
-
const { FrpcTunnel } = await import('./frpc-
|
|
2976
|
+
const { FrpcTunnel } = await import('./frpc-BeGCyERl.mjs');
|
|
2977
2977
|
let tunnel;
|
|
2978
2978
|
tunnel = new FrpcTunnel({
|
|
2979
2979
|
name: tunnelName,
|
|
@@ -3269,11 +3269,17 @@ function buildCodexProviderArgs(cfg) {
|
|
|
3269
3269
|
if (cfg.model) configArgs.push("-c", `model=${JSON.stringify(cfg.model)}`);
|
|
3270
3270
|
return { configArgs, env: { [CODEX_PROVIDER_KEY_ENV]: cfg.apiKey }, model: cfg.model };
|
|
3271
3271
|
}
|
|
3272
|
+
function codexForcedModel(env = process.env) {
|
|
3273
|
+
const f = (env.SVAMP_CODEX_FORCE_MODEL || "").toLowerCase();
|
|
3274
|
+
if (!f || f === "0" || f === "false" || f === "no" || f === "off") return void 0;
|
|
3275
|
+
return env.SVAMP_CODEX_MODEL || env.LLM_MODEL || void 0;
|
|
3276
|
+
}
|
|
3272
3277
|
|
|
3273
3278
|
var codexProvider = /*#__PURE__*/Object.freeze({
|
|
3274
3279
|
__proto__: null,
|
|
3275
3280
|
CODEX_PROVIDER_KEY_ENV: CODEX_PROVIDER_KEY_ENV,
|
|
3276
3281
|
buildCodexProviderArgs: buildCodexProviderArgs,
|
|
3282
|
+
codexForcedModel: codexForcedModel,
|
|
3277
3283
|
codexPermissionSettings: codexPermissionSettings,
|
|
3278
3284
|
hasCustomProvider: hasCustomProvider,
|
|
3279
3285
|
resolveCodexProvider: resolveCodexProvider
|
|
@@ -4361,6 +4367,48 @@ function renderMessage(channel, { sender = {}, body = {}, query = {}, callId, no
|
|
|
4361
4367
|
return renderTemplate(channel.template || DEFAULT_TEMPLATE, ctx);
|
|
4362
4368
|
}
|
|
4363
4369
|
|
|
4370
|
+
class StatelessDispatchLimiter {
|
|
4371
|
+
constructor(maxConcurrent, maxPerSender) {
|
|
4372
|
+
this.maxConcurrent = maxConcurrent;
|
|
4373
|
+
this.maxPerSender = maxPerSender;
|
|
4374
|
+
}
|
|
4375
|
+
inflight = 0;
|
|
4376
|
+
perSender = /* @__PURE__ */ new Map();
|
|
4377
|
+
/** Try to reserve a dispatch slot for `sender`. Returns false (reserve nothing) if either cap
|
|
4378
|
+
* is already at its limit. On true, the caller MUST call release(sender) exactly once. */
|
|
4379
|
+
tryAcquire(sender) {
|
|
4380
|
+
const key = sender || "anonymous";
|
|
4381
|
+
if (this.inflight >= this.maxConcurrent) return false;
|
|
4382
|
+
const s = this.perSender.get(key) || 0;
|
|
4383
|
+
if (s >= this.maxPerSender) return false;
|
|
4384
|
+
this.inflight++;
|
|
4385
|
+
this.perSender.set(key, s + 1);
|
|
4386
|
+
return true;
|
|
4387
|
+
}
|
|
4388
|
+
/** Release a slot previously reserved by tryAcquire. Clamped so a double-release can't drive
|
|
4389
|
+
* the counters negative. */
|
|
4390
|
+
release(sender) {
|
|
4391
|
+
const key = sender || "anonymous";
|
|
4392
|
+
if (this.inflight > 0) this.inflight--;
|
|
4393
|
+
const s = (this.perSender.get(key) || 0) - 1;
|
|
4394
|
+
if (s > 0) this.perSender.set(key, s);
|
|
4395
|
+
else this.perSender.delete(key);
|
|
4396
|
+
}
|
|
4397
|
+
/** Current total in-flight dispatches (for diagnostics/tests). */
|
|
4398
|
+
get active() {
|
|
4399
|
+
return this.inflight;
|
|
4400
|
+
}
|
|
4401
|
+
}
|
|
4402
|
+
function statelessDispatchCaps(env = process.env) {
|
|
4403
|
+
const num = (v, dflt) => {
|
|
4404
|
+
const n = Number(v);
|
|
4405
|
+
return Number.isFinite(n) && n > 0 ? Math.floor(n) : dflt;
|
|
4406
|
+
};
|
|
4407
|
+
const concurrent = num(env.SVAMP_CHANNEL_MAX_CONCURRENT, 6);
|
|
4408
|
+
const perSender = Math.min(num(env.SVAMP_CHANNEL_MAX_PER_SENDER, 2), concurrent);
|
|
4409
|
+
return { concurrent, perSender };
|
|
4410
|
+
}
|
|
4411
|
+
|
|
4364
4412
|
const MAX_PER_CHANNEL = 200;
|
|
4365
4413
|
const TTL_MS = 60 * 60 * 1e3;
|
|
4366
4414
|
const COMPACT_EVERY = 500;
|
|
@@ -4588,6 +4636,11 @@ class ChannelOutbox {
|
|
|
4588
4636
|
}
|
|
4589
4637
|
}
|
|
4590
4638
|
|
|
4639
|
+
var outbox = /*#__PURE__*/Object.freeze({
|
|
4640
|
+
__proto__: null,
|
|
4641
|
+
ChannelOutbox: ChannelOutbox
|
|
4642
|
+
});
|
|
4643
|
+
|
|
4591
4644
|
function getParamNames(fn) {
|
|
4592
4645
|
const src = fn.toString();
|
|
4593
4646
|
const match = src.match(/^(?:async\s+)?(?:function\s*\w*)?\s*\(([^)]*)\)/);
|
|
@@ -5816,7 +5869,7 @@ async function registerMachineService(server, machineId, metadata, daemonState,
|
|
|
5816
5869
|
const tunnels = handlers.tunnels;
|
|
5817
5870
|
if (!tunnels) throw new Error("Tunnel management not available");
|
|
5818
5871
|
if (tunnels.has(params.name)) throw new Error(`Tunnel '${params.name}' already running`);
|
|
5819
|
-
const { FrpcTunnel } = await import('./frpc-
|
|
5872
|
+
const { FrpcTunnel } = await import('./frpc-BeGCyERl.mjs');
|
|
5820
5873
|
const tunnel = new FrpcTunnel({
|
|
5821
5874
|
name: params.name,
|
|
5822
5875
|
ports: params.ports,
|
|
@@ -6292,7 +6345,7 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
|
|
|
6292
6345
|
}
|
|
6293
6346
|
const deps = buildSessionDeps(rpc, { cwd, ownerEmail: owner });
|
|
6294
6347
|
const sender = { name: context?.user?.email || context?.user?.id || "user", kind: "user", verified: true };
|
|
6295
|
-
const { toolsForRole } = await import('./sideband-
|
|
6348
|
+
const { toolsForRole } = await import('./sideband-BCMGW33d.mjs');
|
|
6296
6349
|
const r2 = await runWiseAgent({ message: params.message, sender, config: { tools: toolsForRole(role2) }, deps, transport, model: resolved.model });
|
|
6297
6350
|
return fmt(r2);
|
|
6298
6351
|
}
|
|
@@ -6379,6 +6432,8 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
|
|
|
6379
6432
|
return handler(...callArgs);
|
|
6380
6433
|
}
|
|
6381
6434
|
};
|
|
6435
|
+
const _caps = statelessDispatchCaps();
|
|
6436
|
+
const statelessLimiter = new StatelessDispatchLimiter(_caps.concurrent, _caps.perSender);
|
|
6382
6437
|
const dispatchStateless = async (c, dir, kwargs, context) => {
|
|
6383
6438
|
const u = context?.user;
|
|
6384
6439
|
const r = resolveSender(c, {
|
|
@@ -6390,8 +6445,12 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
|
|
|
6390
6445
|
});
|
|
6391
6446
|
if (r.error || !r.sender) return { error: r.error || "unauthorized" };
|
|
6392
6447
|
const callId = "call_" + Math.random().toString(16).slice(2, 12);
|
|
6448
|
+
const senderKey = (r.sender.name || "anonymous").toLowerCase();
|
|
6449
|
+
if (!statelessLimiter.tryAcquire(senderKey)) {
|
|
6450
|
+
return { ok: false, call_id: callId, status: "busy", error: "channel is busy (too many concurrent requests) \u2014 retry shortly" };
|
|
6451
|
+
}
|
|
6393
6452
|
const rendered = renderMessage(c, { sender: r.sender, body: { message: kwargs.message }, callId });
|
|
6394
|
-
const { queryCore } = await import('./commands-
|
|
6453
|
+
const { queryCore } = await import('./commands-B-VYM4sA.mjs');
|
|
6395
6454
|
const timeout = c.reply?.timeout_sec || 120;
|
|
6396
6455
|
let result;
|
|
6397
6456
|
try {
|
|
@@ -6399,6 +6458,7 @@ QUESTION: ${params.question || "Summarize this concisely."}` }
|
|
|
6399
6458
|
} catch (e) {
|
|
6400
6459
|
return { ok: false, call_id: callId, status: "error", error: e?.message || String(e) };
|
|
6401
6460
|
} finally {
|
|
6461
|
+
statelessLimiter.release(senderKey);
|
|
6402
6462
|
if (result?.sessionId) {
|
|
6403
6463
|
try {
|
|
6404
6464
|
handlers.deleteSession?.(result.sessionId);
|
|
@@ -6462,7 +6522,7 @@ ${d?.error || "not found"}`;
|
|
|
6462
6522
|
if ("error" in res) return { error: res.error };
|
|
6463
6523
|
if (res.tier === "stateless") return dispatchStateless(res.c, res.dir, kwargs, context);
|
|
6464
6524
|
if ("stopped" in res) return { error: `session ${res.sessionId.slice(0, 8)} is stopped \u2014 resume it to reach this channel` };
|
|
6465
|
-
return res.rpc.channelSend({ channel: kwargs.channel, message: kwargs.message, from: kwargs.from, key: kwargs.key, session: kwargs.session, reply_to: kwargs.reply_to }, context);
|
|
6525
|
+
return res.rpc.channelSend({ channel: kwargs.channel, message: kwargs.message, from: kwargs.from, key: kwargs.key, session: kwargs.session, reply_to: kwargs.reply_to, no_reply: kwargs.no_reply }, context);
|
|
6466
6526
|
},
|
|
6467
6527
|
// Async reply retrieval for queue-mode channels — long-poll the channel outbox
|
|
6468
6528
|
// for replies addressed to the caller. Routed to the session the message landed
|
|
@@ -6723,7 +6783,9 @@ function recordWake(now) {
|
|
|
6723
6783
|
}
|
|
6724
6784
|
function senderIsHuman(message) {
|
|
6725
6785
|
const f = message.from || "";
|
|
6726
|
-
|
|
6786
|
+
if (!(f.startsWith("cli:") || f.startsWith("user:"))) return false;
|
|
6787
|
+
if (message.verified === false) return false;
|
|
6788
|
+
return true;
|
|
6727
6789
|
}
|
|
6728
6790
|
function senderKey(message) {
|
|
6729
6791
|
return message.fromSession || message.from || "unknown";
|
|
@@ -7734,7 +7796,8 @@ function createSessionStore(server, sessionId, initialMetadata, initialAgentStat
|
|
|
7734
7796
|
}
|
|
7735
7797
|
if (c.action?.kind === "loop") return { error: "loop channels are served by the channel server, not channelSend" };
|
|
7736
7798
|
const queue = c.reply?.mode === "queue";
|
|
7737
|
-
const
|
|
7799
|
+
const wantReply = queue && !params.no_reply;
|
|
7800
|
+
const replySession = wantReply ? params.reply_to?.session : void 0;
|
|
7738
7801
|
const inboxMsg = {
|
|
7739
7802
|
messageId: callId,
|
|
7740
7803
|
body: xmlEscape(String(params.message ?? "").slice(0, 16 * 1024)),
|
|
@@ -7745,12 +7808,12 @@ function createSessionStore(server, sessionId, initialMetadata, initialAgentStat
|
|
|
7745
7808
|
channel: c.name,
|
|
7746
7809
|
subject: c.name,
|
|
7747
7810
|
...replySession ? { fromSession: replySession, threadId: callId } : {},
|
|
7748
|
-
...
|
|
7811
|
+
...wantReply ? { channelId: c.id, correlationId: callId } : {}
|
|
7749
7812
|
};
|
|
7750
7813
|
await rpcHandlers.sendInboxMessage(inboxMsg, ownerCtx);
|
|
7751
7814
|
channelStore.recordCall(c.id, { sender: r.sender.name, verified: r.sender.verified, callId, outcome: "delivered" });
|
|
7752
7815
|
syncChannelsToMetadata();
|
|
7753
|
-
return { ok: true, call_id: callId, status:
|
|
7816
|
+
return { ok: true, call_id: callId, status: wantReply ? "queued" : "accepted", ...wantReply ? { correlationId: callId } : {} };
|
|
7754
7817
|
} catch (e) {
|
|
7755
7818
|
channelStore.recordCall(c.id, { sender: r.sender.name, verified: r.sender.verified, callId, outcome: "error" });
|
|
7756
7819
|
return { ok: false, call_id: callId, status: "error", error: e?.message || String(e) };
|
|
@@ -9388,10 +9451,27 @@ class SessionArtifactSync {
|
|
|
9388
9451
|
async listRemoteSessions() {
|
|
9389
9452
|
if (!this.initialized || !this.artifactManager || !this.collectionId) return [];
|
|
9390
9453
|
try {
|
|
9391
|
-
const
|
|
9392
|
-
|
|
9393
|
-
|
|
9394
|
-
|
|
9454
|
+
const PAGE = 100;
|
|
9455
|
+
const children = [];
|
|
9456
|
+
const seen = /* @__PURE__ */ new Set();
|
|
9457
|
+
for (let offset = 0; ; offset += PAGE) {
|
|
9458
|
+
const page = await this.artifactManager.list({
|
|
9459
|
+
parent_id: this.collectionId,
|
|
9460
|
+
offset,
|
|
9461
|
+
limit: PAGE,
|
|
9462
|
+
_rkwargs: true
|
|
9463
|
+
});
|
|
9464
|
+
if (!Array.isArray(page) || page.length === 0) break;
|
|
9465
|
+
let fresh = 0;
|
|
9466
|
+
for (const c of page) {
|
|
9467
|
+
const k = String(c?.id ?? c?.manifest?.id ?? c?.alias ?? `${offset}:${fresh}`);
|
|
9468
|
+
if (seen.has(k)) continue;
|
|
9469
|
+
seen.add(k);
|
|
9470
|
+
children.push(c);
|
|
9471
|
+
fresh++;
|
|
9472
|
+
}
|
|
9473
|
+
if (page.length < PAGE || fresh === 0) break;
|
|
9474
|
+
}
|
|
9395
9475
|
return (children || []).map((child) => ({
|
|
9396
9476
|
sessionId: child.manifest?.sessionId || child.alias?.replace("session-", ""),
|
|
9397
9477
|
machineId: child.manifest?.machineId,
|
|
@@ -12497,6 +12577,13 @@ function shouldIsolate(input) {
|
|
|
12497
12577
|
return input.optionsSecurityContext !== null && input.optionsSecurityContext !== void 0;
|
|
12498
12578
|
}
|
|
12499
12579
|
|
|
12580
|
+
function classifyRestoreContinuation(opts) {
|
|
12581
|
+
if (opts.isOrphaned) return "none";
|
|
12582
|
+
if (opts.loopActive) return "loop-resume";
|
|
12583
|
+
if (opts.wasProcessing && opts.hasResumeId) return "auto-continue";
|
|
12584
|
+
return "none";
|
|
12585
|
+
}
|
|
12586
|
+
|
|
12500
12587
|
function getShareBaseUrl() {
|
|
12501
12588
|
return getSvampWebBaseUrl();
|
|
12502
12589
|
}
|
|
@@ -16187,7 +16274,7 @@ async function startDaemon(options) {
|
|
|
16187
16274
|
try {
|
|
16188
16275
|
const dir = loadSessionIndex()[sessionId]?.directory;
|
|
16189
16276
|
if (!dir) return;
|
|
16190
|
-
const { reconcileServiceLinks } = await import('./agentCommands-
|
|
16277
|
+
const { reconcileServiceLinks } = await import('./agentCommands-CoPsnzwK.mjs');
|
|
16191
16278
|
const configPath = getSvampConfigPath(dir, sessionId);
|
|
16192
16279
|
const config = readSvampConfig(configPath);
|
|
16193
16280
|
const entries = Array.from(urls.entries());
|
|
@@ -16205,7 +16292,7 @@ async function startDaemon(options) {
|
|
|
16205
16292
|
}
|
|
16206
16293
|
}
|
|
16207
16294
|
async function createExposedTunnel(spec) {
|
|
16208
|
-
const { FrpcTunnel } = await import('./frpc-
|
|
16295
|
+
const { FrpcTunnel } = await import('./frpc-BeGCyERl.mjs');
|
|
16209
16296
|
const tunnel = new FrpcTunnel({
|
|
16210
16297
|
name: spec.name,
|
|
16211
16298
|
ports: spec.ports,
|
|
@@ -18421,11 +18508,11 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
|
|
|
18421
18508
|
});
|
|
18422
18509
|
},
|
|
18423
18510
|
onIssue: async (params) => {
|
|
18424
|
-
const { issueRpc } = await import('./rpc-
|
|
18511
|
+
const { issueRpc } = await import('./rpc-1Ic_yDzC.mjs');
|
|
18425
18512
|
return issueRpc(params?.cwd || directory, params || {}, { notifySession: notifyIssueOwner, rekickLoopOwner });
|
|
18426
18513
|
},
|
|
18427
18514
|
onWorkflow: async (params) => {
|
|
18428
|
-
const { workflowRpc } = await import('./rpc-
|
|
18515
|
+
const { workflowRpc } = await import('./rpc-DiG_DaMK.mjs');
|
|
18429
18516
|
return workflowRpc(params?.cwd || directory, params || {});
|
|
18430
18517
|
},
|
|
18431
18518
|
onRipgrep: async (args, cwd) => {
|
|
@@ -18797,7 +18884,8 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
|
|
|
18797
18884
|
logger.log(`[${agentName} Session ${sessionId}] Ignoring meta.permissionMode='${msgMeta.permissionMode}' from sendMessage (current: ${currentPermissionMode}; use switchMode to change)`);
|
|
18798
18885
|
}
|
|
18799
18886
|
{
|
|
18800
|
-
const
|
|
18887
|
+
const forcedModel = agentName === "codex" ? codexForcedModel() : void 0;
|
|
18888
|
+
const rawModel = forcedModel || (typeof msgMeta?.model === "string" && msgMeta.model ? msgMeta.model : void 0);
|
|
18801
18889
|
const desiredModel = rawModel || agentConfig?.default_model || void 0;
|
|
18802
18890
|
if (desiredModel !== appliedAgentModel) {
|
|
18803
18891
|
agentBackend?.setModel?.(desiredModel);
|
|
@@ -19037,11 +19125,11 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
|
|
|
19037
19125
|
});
|
|
19038
19126
|
},
|
|
19039
19127
|
onIssue: async (params) => {
|
|
19040
|
-
const { issueRpc } = await import('./rpc-
|
|
19128
|
+
const { issueRpc } = await import('./rpc-1Ic_yDzC.mjs');
|
|
19041
19129
|
return issueRpc(params?.cwd || directory, params || {}, { notifySession: notifyIssueOwner, rekickLoopOwner });
|
|
19042
19130
|
},
|
|
19043
19131
|
onWorkflow: async (params) => {
|
|
19044
|
-
const { workflowRpc } = await import('./rpc-
|
|
19132
|
+
const { workflowRpc } = await import('./rpc-DiG_DaMK.mjs');
|
|
19045
19133
|
return workflowRpc(params?.cwd || directory, params || {});
|
|
19046
19134
|
},
|
|
19047
19135
|
onRipgrep: async (args, cwd) => {
|
|
@@ -19217,7 +19305,7 @@ ${capturedError}${buildClaudeErrorHint(capturedError)}`;
|
|
|
19217
19305
|
}
|
|
19218
19306
|
}
|
|
19219
19307
|
}
|
|
19220
|
-
const codexModel = options2.model || agentConfig?.default_model || provider.model || void 0;
|
|
19308
|
+
const codexModel = codexForcedModel() || options2.model || agentConfig?.default_model || provider.model || void 0;
|
|
19221
19309
|
const codexPerm = codexPermissionSettings(currentPermissionMode);
|
|
19222
19310
|
logger.log(`[Agent Session ${sessionId}] Codex backend: app-server (model=${codexModel ?? "default"}${provider.apiBase ? `, provider=${provider.apiBase}` : ""}${accountDesc ? `, account=${accountDesc}` : ""}, mode=${currentPermissionMode} \u2192 approval=${codexPerm.approvalPolicy}/sandbox=${codexPerm.sandbox})`);
|
|
19223
19311
|
if (acpResumeThreadId) logger.log(`[Agent Session ${sessionId}] Resuming Codex thread ${acpResumeThreadId} (restart recovery)`);
|
|
@@ -19992,10 +20080,15 @@ ${oracle.output.trim().slice(0, 500)}`, "\u{1F501} Continuing loop");
|
|
|
19992
20080
|
break;
|
|
19993
20081
|
}
|
|
19994
20082
|
}
|
|
19995
|
-
|
|
20083
|
+
const _restoreAction = classifyRestoreContinuation({
|
|
20084
|
+
wasProcessing: !!persisted.wasProcessing,
|
|
20085
|
+
hasResumeId: !!persisted.claudeResumeId,
|
|
20086
|
+
isOrphaned: !!isOrphaned,
|
|
20087
|
+
loopActive: isLoopActiveForSession(persisted.directory, persisted.sessionId)
|
|
20088
|
+
});
|
|
20089
|
+
if (_restoreAction === "auto-continue") {
|
|
19996
20090
|
sessionsToAutoContinue.push(persisted.sessionId);
|
|
19997
|
-
}
|
|
19998
|
-
if (!isOrphaned && !persisted.wasProcessing && isLoopActiveForSession(persisted.directory, persisted.sessionId)) {
|
|
20091
|
+
} else if (_restoreAction === "loop-resume") {
|
|
19999
20092
|
sessionsToLoopResume.push({ sessionId: persisted.sessionId, directory: persisted.directory });
|
|
20000
20093
|
}
|
|
20001
20094
|
} else {
|
|
@@ -20156,7 +20249,7 @@ ${oracle.output.trim().slice(0, 500)}`, "\u{1F501} Continuing loop");
|
|
|
20156
20249
|
const PING_TIMEOUT_MS = 15e3;
|
|
20157
20250
|
const POST_RECONNECT_GRACE_MS = 2e4;
|
|
20158
20251
|
const RECONNECT_JITTER_MS = 2500;
|
|
20159
|
-
const { WorkflowScheduler } = await import('./scheduler-
|
|
20252
|
+
const { WorkflowScheduler } = await import('./scheduler-C5Gk_hYP.mjs');
|
|
20160
20253
|
const workflowScheduler = new WorkflowScheduler({
|
|
20161
20254
|
projectRoots: () => {
|
|
20162
20255
|
const dirs = /* @__PURE__ */ new Set();
|
|
@@ -20779,4 +20872,4 @@ var run = /*#__PURE__*/Object.freeze({
|
|
|
20779
20872
|
writeStopMarker: writeStopMarker
|
|
20780
20873
|
});
|
|
20781
20874
|
|
|
20782
|
-
export { listSkillFiles as $, removeWorkflow as A, saveWorkflow as B, rawWorkflow as C, listWorkflows as D, isWorkflowEnabled as E, workflowCrons as F, cronMatches as G, summarize as H, workflowSteps as I, parseJwtEmail as J, computeCollectionConfigUpdate as K, SYSTEM_COLLECTION_CONFIG as L, loadMachineContext as M, buildMachineInstructions as N, machineToolsForRole as O, buildMachineTools as P, parseFrontmatter as Q, READ_ONLY_TOOLS as R, SharingNotificationSync as S, getSkillsServer as T, getSkillsWorkspaceName as U, getSkillsCollectionName as V, fetchWithTimeout as W, searchSkills as X, SKILLS_DIR as Y, getSkillInfo as Z, downloadSkillFile as _, createSessionStore as a, resolveModel as a0, clearStopMarker as a1, stopMarkerExists as a2,
|
|
20875
|
+
export { listSkillFiles as $, removeWorkflow as A, saveWorkflow as B, rawWorkflow as C, listWorkflows as D, isWorkflowEnabled as E, workflowCrons as F, cronMatches as G, summarize as H, workflowSteps as I, parseJwtEmail as J, computeCollectionConfigUpdate as K, SYSTEM_COLLECTION_CONFIG as L, loadMachineContext as M, buildMachineInstructions as N, machineToolsForRole as O, buildMachineTools as P, parseFrontmatter as Q, READ_ONLY_TOOLS as R, SharingNotificationSync as S, getSkillsServer as T, getSkillsWorkspaceName as U, getSkillsCollectionName as V, fetchWithTimeout as W, searchSkills as X, SKILLS_DIR as Y, getSkillInfo as Z, downloadSkillFile as _, createSessionStore as a, resolveModel as a0, clearStopMarker as a1, stopMarkerExists as a2, ChannelStore as a3, gatewayBase as a4, genKey as a5, formatHandle as a6, normalizeAllowedUser as a7, loadSecurityContextConfig as a8, resolveSecurityContext as a9, run as aA, buildSecurityContextFromFlags as aa, mergeSecurityContexts as ab, buildSessionShareUrl as ac, computeOutboundHop as ad, registerAwaitingReply as ae, buildMachineShareUrl as af, parseHandle as ag, handleMatchesMetadata as ah, describeMisconfiguration as ai, buildMachineDeps as aj, applyClaudeProxyEnv as ak, composeSessionId as al, generateFriendlyName as am, generateHookSettings as an, staticFileServer as ao, instanceConfig as ap, claudeAuth as aq, codexProvider as ar, outbox as as, projectInfo as at, DefaultTransport$1 as au, acpBackend as av, acpAgentConfig as aw, codexAppServerBackend as ax, GeminiTransport$1 as ay, api 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{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(import.meta.url);import {
|
|
1
|
+
import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(import.meta.url);import { ak as applyClaudeProxyEnv, al as composeSessionId, am as generateFriendlyName, c as connectToHypha, a as createSessionStore, r as registerMachineService, an as generateHookSettings } from './run-CKLU1B02.mjs';
|
|
2
2
|
import os from 'node:os';
|
|
3
3
|
import { resolve, join } from 'node:path';
|
|
4
4
|
import { existsSync, readFileSync, watch } from 'node:fs';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { j as resolveProjectRoot, D as listWorkflows, E as isWorkflowEnabled, F as workflowCrons, y as runWorkflow, G as cronMatches } from './run-
|
|
1
|
+
import { j as resolveProjectRoot, D as listWorkflows, E as isWorkflowEnabled, F as workflowCrons, y as runWorkflow, G as cronMatches } from './run-CKLU1B02.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-B-VYM4sA.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-B-VYM4sA.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-B-VYM4sA.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-B-VYM4sA.mjs');
|
|
206
206
|
const all = hasFlag(args, "--all", "-a");
|
|
207
207
|
const json = hasFlag(args, "--json");
|
|
208
208
|
const sessionId = getFlag(args, "--session");
|
|
@@ -235,7 +235,7 @@ async function serveList(args, machineId) {
|
|
|
235
235
|
}
|
|
236
236
|
}
|
|
237
237
|
async function serveInfo(machineId) {
|
|
238
|
-
const { connectAndGetMachine } = await import('./commands-
|
|
238
|
+
const { connectAndGetMachine } = await import('./commands-B-VYM4sA.mjs');
|
|
239
239
|
const { machine, server } = await connectAndGetMachine(machineId);
|
|
240
240
|
try {
|
|
241
241
|
const info = await machine.serveInfo();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { R as READ_ONLY_TOOLS, M as loadMachineContext, N as buildMachineInstructions, O as machineToolsForRole, P as buildMachineTools } from './run-
|
|
1
|
+
import { R as READ_ONLY_TOOLS, M as loadMachineContext, N as buildMachineInstructions, O as machineToolsForRole, P as buildMachineTools } from './run-CKLU1B02.mjs';
|
|
2
2
|
import 'node:child_process';
|
|
3
3
|
import 'os';
|
|
4
4
|
import 'fs/promises';
|
package/package.json
CHANGED
|
@@ -1,48 +1,48 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
2
|
+
"name": "svamp-cli",
|
|
3
|
+
"version": "0.2.291",
|
|
4
|
+
"description": "Svamp CLI — AI workspace daemon on Hypha Cloud",
|
|
5
|
+
"author": "Amun AI AB",
|
|
6
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"bin": {
|
|
9
|
+
"svamp": "./bin/svamp.mjs"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"bin"
|
|
14
|
+
],
|
|
15
|
+
"main": "./dist/index.mjs",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": "./dist/index.mjs",
|
|
18
|
+
"./cli": "./dist/cli.mjs"
|
|
19
|
+
},
|
|
20
|
+
"scripts": {
|
|
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
|
+
"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-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-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-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-session-access-fallback.mjs && npx tsx test/test-interactive-helpers.mjs && npx tsx test/test-codex-app-server.mjs && npx tsx test/test-acp-backend.mjs && npx tsx test/test-acp-bridge.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-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-idle.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-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",
|
|
24
|
+
"test:hypha": "node --no-warnings test/test-hypha-service.mjs",
|
|
25
|
+
"dev": "tsx src/cli.ts",
|
|
26
|
+
"dev:daemon": "tsx src/cli.ts daemon start-sync",
|
|
27
|
+
"test:e2e": "node --no-warnings test/e2e-session-tests.mjs",
|
|
28
|
+
"test:frpc": "npx tsx test/test-frpc-e2e.mjs",
|
|
29
|
+
"prepublishOnly": "yarn build"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@agentclientprotocol/sdk": "^0.14.1",
|
|
33
|
+
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
34
|
+
"hypha-rpc": "0.21.42",
|
|
35
|
+
"node-pty": "1.2.0-beta.11",
|
|
36
|
+
"ws": "^8.18.0",
|
|
37
|
+
"yaml": "^2.8.2",
|
|
38
|
+
"zod": "^3.24.4"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@types/node": ">=20",
|
|
42
|
+
"@types/ws": "^8.5.14",
|
|
43
|
+
"pkgroll": "^2.14.2",
|
|
44
|
+
"tsx": "^4.20.6",
|
|
45
|
+
"typescript": "5.9.3"
|
|
46
|
+
},
|
|
47
|
+
"packageManager": "yarn@1.22.22"
|
|
48
48
|
}
|