@clawos-dev/clawd 0.2.114-beta.231.042ed43 → 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 +81 -11
  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;
@@ -42351,12 +42407,26 @@ function buildAppBuilderHandlers(deps) {
42351
42407
  `session ${f.sessionId} is not bound to any project; cannot stop dev server`
42352
42408
  );
42353
42409
  }
42354
- if (!devServerLifecycle.isRunning(projectName)) {
42355
- deps.logger?.info("app-builder.stop-dev-server.already-stopped", { name: projectName });
42356
- return { response: { ok: true } };
42410
+ deps.logger?.info("app-builder.stop-dev-server.called", {
42411
+ name: projectName,
42412
+ sessionId: f.sessionId,
42413
+ isRunning: devServerLifecycle.isRunning(projectName)
42414
+ });
42415
+ if (devServerLifecycle.isRunning(projectName)) {
42416
+ await devServerLifecycle.stopForProject(projectName);
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
+ });
42357
42429
  }
42358
- deps.logger?.info("app-builder.stop-dev-server.called", { name: projectName, sessionId: f.sessionId });
42359
- await devServerLifecycle.stopForProject(projectName);
42360
42430
  await setStageAndBroadcast(projectName, "stopped");
42361
42431
  return { response: { ok: true } };
42362
42432
  };
@@ -42519,7 +42589,7 @@ function buildMethodHandlers(deps) {
42519
42589
 
42520
42590
  // src/app-builder/project-store.ts
42521
42591
  var import_node_fs29 = require("fs");
42522
- var import_node_child_process7 = require("child_process");
42592
+ var import_node_child_process8 = require("child_process");
42523
42593
  var import_node_path41 = require("path");
42524
42594
  init_protocol();
42525
42595
  var PROJECTS_DIR = "projects";
@@ -42619,7 +42689,7 @@ var ProjectStore = class {
42619
42689
  async scaffold(name, template = DEFAULT_TEMPLATE) {
42620
42690
  const scriptPath = (0, import_node_path41.join)(this.personaRoot, SCAFFOLD_SCRIPT_REL);
42621
42691
  return await new Promise((resolve6, reject) => {
42622
- 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], {
42623
42693
  cwd: this.personaRoot,
42624
42694
  env: { ...process.env, PATH: process.env.PATH ?? "" },
42625
42695
  stdio: ["ignore", "pipe", "pipe"]
@@ -42688,7 +42758,7 @@ var ProjectStore = class {
42688
42758
  };
42689
42759
 
42690
42760
  // src/app-builder/dev-server-supervisor.ts
42691
- var import_node_child_process8 = require("child_process");
42761
+ var import_node_child_process9 = require("child_process");
42692
42762
  var import_node_events2 = require("events");
42693
42763
  var DEFAULT_READY_PATTERN = /Local:\s+https?:\/\//;
42694
42764
  var DevServerSupervisor = class extends import_node_events2.EventEmitter {
@@ -42725,7 +42795,7 @@ var DevServerSupervisor = class extends import_node_events2.EventEmitter {
42725
42795
  tunnelHost: args.tunnelHost,
42726
42796
  devCommand: cmd
42727
42797
  });
42728
- const child = (0, import_node_child_process8.spawn)("sh", ["-c", cmd], {
42798
+ const child = (0, import_node_child_process9.spawn)("sh", ["-c", cmd], {
42729
42799
  cwd: args.cwd,
42730
42800
  env,
42731
42801
  stdio: "pipe",
@@ -43097,7 +43167,7 @@ function computeGrantForFrame(method, frame) {
43097
43167
  }
43098
43168
 
43099
43169
  // src/extension/runtime.ts
43100
- var import_node_child_process9 = require("child_process");
43170
+ var import_node_child_process10 = require("child_process");
43101
43171
  var import_node_path42 = __toESM(require("path"), 1);
43102
43172
  var import_promises10 = require("timers/promises");
43103
43173
 
@@ -43205,7 +43275,7 @@ var Runtime = class {
43205
43275
  CLAWOS_EXT_PORT: String(port),
43206
43276
  CLAWOS_EXT_ID: extId
43207
43277
  };
43208
- const child = (0, import_node_child_process9.spawn)("sh", ["-c", cmd], {
43278
+ const child = (0, import_node_child_process10.spawn)("sh", ["-c", cmd], {
43209
43279
  cwd: dir,
43210
43280
  env,
43211
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-beta.231.042ed43",
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",