svamp-cli 0.2.245 → 0.2.247

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 (26) hide show
  1. package/dist/{agentCommands-DvLTS2bk.mjs → agentCommands-DOzMhE_G.mjs} +5 -5
  2. package/dist/{auth-JDjru_js.mjs → auth-B_ZnoKX0.mjs} +1 -1
  3. package/dist/cli.mjs +82 -68
  4. package/dist/{commands-QyDnDry4.mjs → commands-BENx03Oz.mjs} +2 -2
  5. package/dist/{commands-DfTq3rS3.mjs → commands-Bm5q9G35.mjs} +1 -1
  6. package/dist/{commands-CIa6EEAk.mjs → commands-C2u9U3y6.mjs} +2 -2
  7. package/dist/{commands-Bt8pK8MS.mjs → commands-CxOPcoWa.mjs} +1 -1
  8. package/dist/{commands-jFRw1VYy.mjs → commands-F6j9TF4Q.mjs} +6 -6
  9. package/dist/{commands-CRsGX1t1.mjs → commands-_rMwFmFH.mjs} +1 -1
  10. package/dist/{commands-CnVo5S8W.mjs → commands-vCeWXvYJ.mjs} +1 -1
  11. package/dist/{fleet-gkqGOfvU.mjs → fleet-pMXCRilx.mjs} +12 -4
  12. package/dist/{frpc-Dp9dDwDE.mjs → frpc-Di-y4cWK.mjs} +5 -2
  13. package/dist/{headlessCli-BIOe8SSK.mjs → headlessCli-D6k9Pnum.mjs} +2 -2
  14. package/dist/{httpServer-B1KVQJfm.mjs → httpServer-CSMZTpoh.mjs} +25 -3
  15. package/dist/index.mjs +1 -1
  16. package/dist/{package-ZEiIG_qH.mjs → package-BJYmQjS2.mjs} +2 -2
  17. package/dist/{rpc-CdbgL61q.mjs → rpc-BncvIQMO.mjs} +1 -1
  18. package/dist/{rpc-Wp_ufnPT.mjs → rpc-DbY7NUhj.mjs} +2 -2
  19. package/dist/{run-BgPz-Shl.mjs → run-1BBi0_ol.mjs} +104 -23
  20. package/dist/{run-hCQkcg9-.mjs → run-CYx_Rhiu.mjs} +1 -1
  21. package/dist/{runStore-BKgHQGNO.mjs → runStore-C5IyfbON.mjs} +1 -1
  22. package/dist/{scheduler-BUo_8paQ.mjs → scheduler-BkXOKjHn.mjs} +30 -4
  23. package/dist/{serveCommands-bEavErQo.mjs → serveCommands-CESRU6-1.mjs} +5 -5
  24. package/dist/{serveManager-3zR_v1Xj.mjs → serveManager-BZtpClpC.mjs} +36 -19
  25. package/dist/{sideband-l39JbmHM.mjs → sideband-BqD4-WWR.mjs} +1 -1
  26. package/package.json +2 -2
@@ -4,7 +4,7 @@ import * as fs from 'fs';
4
4
  import * as http from 'http';
5
5
  import * as net from 'net';
6
6
  import * as path from 'path';
7
- import { k as getHyphaServerUrl, S as ServeAuth, l as hasCookieToken } from './run-BgPz-Shl.mjs';
7
+ import { k as getHyphaServerUrl, S as ServeAuth, l as hasCookieToken } from './run-1BBi0_ol.mjs';
8
8
  import 'os';
9
9
  import 'fs/promises';
10
10
  import 'url';
@@ -599,23 +599,40 @@ class ServeManager {
599
599
  }
600
600
  this.log(`Auth OK '${mountName}': ${userEmail}`);
601
601
  }
602
- if (req.method === "PUT" && mount && mount.directory) {
603
- const filePath = path.join(mount.directory, basePath);
604
- fs.mkdirSync(path.dirname(filePath), { recursive: true });
605
- const ws = fs.createWriteStream(filePath);
606
- req.pipe(ws);
607
- ws.on("finish", () => {
608
- res.writeHead(201);
609
- res.end();
610
- });
611
- ws.on("error", (err) => {
612
- res.writeHead(500);
613
- res.end(err.message);
614
- });
615
- return;
616
- }
617
- if (req.method === "DELETE" && mount && mount.directory) {
618
- const filePath = path.join(mount.directory, basePath);
602
+ const resolveContained = () => {
603
+ const base = path.resolve(mount.directory);
604
+ const fp = path.resolve(path.join(base, basePath));
605
+ if (fp !== base && !fp.startsWith(base + path.sep)) return null;
606
+ return fp;
607
+ };
608
+ if ((req.method === "PUT" || req.method === "DELETE") && mount && mount.directory) {
609
+ if (mount.access === "public") {
610
+ this.log(`Write DENY '${mountName}': ${req.method} not allowed on a public (unauthenticated) mount`);
611
+ res.writeHead(403, { "Content-Type": "text/plain" });
612
+ res.end("Write access denied: public mounts are read-only.");
613
+ return;
614
+ }
615
+ const filePath = resolveContained();
616
+ if (!filePath) {
617
+ this.log(`Write DENY '${mountName}': path escapes mount root (${basePath})`);
618
+ res.writeHead(403, { "Content-Type": "text/plain" });
619
+ res.end("Forbidden: path escapes mount root.");
620
+ return;
621
+ }
622
+ if (req.method === "PUT") {
623
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
624
+ const ws = fs.createWriteStream(filePath);
625
+ req.pipe(ws);
626
+ ws.on("finish", () => {
627
+ res.writeHead(201);
628
+ res.end();
629
+ });
630
+ ws.on("error", (err) => {
631
+ res.writeHead(500);
632
+ res.end(err.message);
633
+ });
634
+ return;
635
+ }
619
636
  try {
620
637
  fs.unlinkSync(filePath);
621
638
  res.writeHead(204);
@@ -733,7 +750,7 @@ class ServeManager {
733
750
  const mount = this.mounts.get(mountName);
734
751
  const subdomainOverride = mount?.access === "link" && mount.linkToken ? /* @__PURE__ */ new Map([[this.port, buildLinkSubdomain(subdomainSafe, mount.linkToken)]]) : void 0;
735
752
  try {
736
- const { FrpcTunnel } = await import('./frpc-Dp9dDwDE.mjs');
753
+ const { FrpcTunnel } = await import('./frpc-Di-y4cWK.mjs');
737
754
  let tunnel;
738
755
  tunnel = new FrpcTunnel({
739
756
  name: tunnelName,
@@ -1,4 +1,4 @@
1
- import { R as READ_ONLY_TOOLS, B as loadMachineContext, C as buildMachineInstructions, D as machineToolsForRole, E as buildMachineTools } from './run-BgPz-Shl.mjs';
1
+ import { R as READ_ONLY_TOOLS, B as loadMachineContext, C as buildMachineInstructions, D as machineToolsForRole, E as buildMachineTools } from './run-1BBi0_ol.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.245",
3
+ "version": "0.2.247",
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-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-btw-proxy-env.mjs && npx tsx test/test-output-formatters.mjs && npx tsx test/test-inbox-guard.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-machine-service-logic.mjs && npx tsx test/test-interactive-helpers.mjs && npx tsx test/test-codex-backend.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-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-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-workflow-runs.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-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-channel-binding.mjs && npx tsx test/test-channel-identity.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",
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-btw-proxy-env.mjs && npx tsx test/test-output-formatters.mjs && npx tsx test/test-inbox-guard.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-machine-service-logic.mjs && npx tsx test/test-interactive-helpers.mjs && npx tsx test/test-codex-backend.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-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-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-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-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-channel-binding.mjs && npx tsx test/test-channel-identity.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-graceful-restart.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",