@clawos-dev/clawd 0.2.114 → 0.2.115-beta.232.54af528

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 (2) hide show
  1. package/dist/cli.cjs +74 -6
  2. package/package.json +1 -1
package/dist/cli.cjs CHANGED
@@ -42096,6 +42096,62 @@ function buildExtensionHandlers(deps) {
42096
42096
  };
42097
42097
  }
42098
42098
 
42099
+ // src/app-builder/kill-port.ts
42100
+ var import_node_child_process7 = require("child_process");
42101
+ async function killPortOccupants(port, logger) {
42102
+ let pids;
42103
+ try {
42104
+ pids = await listPidsOnPort(port);
42105
+ } catch (err) {
42106
+ logger?.warn("app-builder.kill-port.lsof-failed", {
42107
+ port,
42108
+ error: err instanceof Error ? err.message : String(err)
42109
+ });
42110
+ return;
42111
+ }
42112
+ if (pids.length === 0) {
42113
+ logger?.info("app-builder.kill-port.no-occupants", { port });
42114
+ return;
42115
+ }
42116
+ for (const pid of pids) {
42117
+ try {
42118
+ process.kill(pid, "SIGKILL");
42119
+ logger?.info("app-builder.kill-port-occupant", { port, pid });
42120
+ } catch (err) {
42121
+ const code = err.code;
42122
+ if (code !== "ESRCH") {
42123
+ logger?.warn("app-builder.kill-port-occupant.failed", {
42124
+ port,
42125
+ pid,
42126
+ error: err instanceof Error ? err.message : String(err)
42127
+ });
42128
+ }
42129
+ }
42130
+ }
42131
+ }
42132
+ function listPidsOnPort(port) {
42133
+ return new Promise((resolve6, reject) => {
42134
+ (0, import_node_child_process7.execFile)(
42135
+ "lsof",
42136
+ ["-ti", `:${port}`],
42137
+ { timeout: 3e3 },
42138
+ (err, stdout) => {
42139
+ if (err && err.code === "ENOENT") {
42140
+ reject(new Error("lsof not found in PATH"));
42141
+ return;
42142
+ }
42143
+ const text = (stdout ?? "").toString().trim();
42144
+ if (!text) {
42145
+ resolve6([]);
42146
+ return;
42147
+ }
42148
+ const list = text.split("\n").map((s) => Number(s.trim())).filter((n) => Number.isInteger(n) && n > 0);
42149
+ resolve6(list);
42150
+ }
42151
+ );
42152
+ });
42153
+ }
42154
+
42099
42155
  // src/handlers/app-builder.ts
42100
42156
  init_protocol();
42101
42157
  var DEV_SERVER_READY_TIMEOUT_MS = 3e4;
@@ -42359,6 +42415,18 @@ function buildAppBuilderHandlers(deps) {
42359
42415
  if (devServerLifecycle.isRunning(projectName)) {
42360
42416
  await devServerLifecycle.stopForProject(projectName);
42361
42417
  }
42418
+ try {
42419
+ const projects = await store.list();
42420
+ const meta = projects.find((p2) => p2.name === projectName);
42421
+ if (meta) {
42422
+ await killPortOccupants(meta.port, deps.logger);
42423
+ }
42424
+ } catch (err) {
42425
+ deps.logger?.warn("app-builder.stop-dev-server.kill-port-skipped", {
42426
+ name: projectName,
42427
+ error: err instanceof Error ? err.message : String(err)
42428
+ });
42429
+ }
42362
42430
  await setStageAndBroadcast(projectName, "stopped");
42363
42431
  return { response: { ok: true } };
42364
42432
  };
@@ -42521,7 +42589,7 @@ function buildMethodHandlers(deps) {
42521
42589
 
42522
42590
  // src/app-builder/project-store.ts
42523
42591
  var import_node_fs29 = require("fs");
42524
- var import_node_child_process7 = require("child_process");
42592
+ var import_node_child_process8 = require("child_process");
42525
42593
  var import_node_path41 = require("path");
42526
42594
  init_protocol();
42527
42595
  var PROJECTS_DIR = "projects";
@@ -42621,7 +42689,7 @@ var ProjectStore = class {
42621
42689
  async scaffold(name, template = DEFAULT_TEMPLATE) {
42622
42690
  const scriptPath = (0, import_node_path41.join)(this.personaRoot, SCAFFOLD_SCRIPT_REL);
42623
42691
  return await new Promise((resolve6, reject) => {
42624
- const child = (0, import_node_child_process7.spawn)("bash", [scriptPath, name, template], {
42692
+ const child = (0, import_node_child_process8.spawn)("bash", [scriptPath, name, template], {
42625
42693
  cwd: this.personaRoot,
42626
42694
  env: { ...process.env, PATH: process.env.PATH ?? "" },
42627
42695
  stdio: ["ignore", "pipe", "pipe"]
@@ -42690,7 +42758,7 @@ var ProjectStore = class {
42690
42758
  };
42691
42759
 
42692
42760
  // src/app-builder/dev-server-supervisor.ts
42693
- var import_node_child_process8 = require("child_process");
42761
+ var import_node_child_process9 = require("child_process");
42694
42762
  var import_node_events2 = require("events");
42695
42763
  var DEFAULT_READY_PATTERN = /Local:\s+https?:\/\//;
42696
42764
  var DevServerSupervisor = class extends import_node_events2.EventEmitter {
@@ -42727,7 +42795,7 @@ var DevServerSupervisor = class extends import_node_events2.EventEmitter {
42727
42795
  tunnelHost: args.tunnelHost,
42728
42796
  devCommand: cmd
42729
42797
  });
42730
- const child = (0, import_node_child_process8.spawn)("sh", ["-c", cmd], {
42798
+ const child = (0, import_node_child_process9.spawn)("sh", ["-c", cmd], {
42731
42799
  cwd: args.cwd,
42732
42800
  env,
42733
42801
  stdio: "pipe",
@@ -43099,7 +43167,7 @@ function computeGrantForFrame(method, frame) {
43099
43167
  }
43100
43168
 
43101
43169
  // src/extension/runtime.ts
43102
- var import_node_child_process9 = require("child_process");
43170
+ var import_node_child_process10 = require("child_process");
43103
43171
  var import_node_path42 = __toESM(require("path"), 1);
43104
43172
  var import_promises10 = require("timers/promises");
43105
43173
 
@@ -43207,7 +43275,7 @@ var Runtime = class {
43207
43275
  CLAWOS_EXT_PORT: String(port),
43208
43276
  CLAWOS_EXT_ID: extId
43209
43277
  };
43210
- const child = (0, import_node_child_process9.spawn)("sh", ["-c", cmd], {
43278
+ const child = (0, import_node_child_process10.spawn)("sh", ["-c", cmd], {
43211
43279
  cwd: dir,
43212
43280
  env,
43213
43281
  stdio: ["ignore", "pipe", "pipe"],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clawos-dev/clawd",
3
- "version": "0.2.114",
3
+ "version": "0.2.115-beta.232.54af528",
4
4
  "description": "Standalone clawd daemon — Claude Code (and future Codex) session server over WebSocket",
5
5
  "type": "module",
6
6
  "license": "MIT",