@wrongstack/tools 0.292.1 → 0.295.0

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 (248) hide show
  1. package/dist/_env.d.ts +1 -1
  2. package/dist/_env.d.ts.map +1 -1
  3. package/dist/_fetch-guard.d.ts.map +1 -1
  4. package/dist/_spawn-stream.d.ts +1 -1
  5. package/dist/_spawn-stream.d.ts.map +1 -1
  6. package/dist/_util.d.ts +1 -1
  7. package/dist/_util.d.ts.map +1 -1
  8. package/dist/audit.d.ts +1 -1
  9. package/dist/audit.d.ts.map +1 -1
  10. package/dist/audit.js +81 -16
  11. package/dist/audit.js.map +2 -2
  12. package/dist/bash.d.ts +1 -1
  13. package/dist/bash.d.ts.map +1 -1
  14. package/dist/bash.js +66 -52
  15. package/dist/bash.js.map +3 -3
  16. package/dist/batch-tool-use.d.ts +1 -1
  17. package/dist/batch-tool-use.d.ts.map +1 -1
  18. package/dist/batch-tool-use.js +1 -1
  19. package/dist/batch-tool-use.js.map +1 -1
  20. package/dist/browser/index.js +10 -1
  21. package/dist/browser/index.js.map +2 -2
  22. package/dist/browser/manager.d.ts +2 -0
  23. package/dist/browser/manager.d.ts.map +1 -1
  24. package/dist/browser/tools.d.ts +1 -1
  25. package/dist/browser/tools.d.ts.map +1 -1
  26. package/dist/builtin.d.ts +1 -1
  27. package/dist/builtin.d.ts.map +1 -1
  28. package/dist/builtin.js +1394 -553
  29. package/dist/builtin.js.map +4 -4
  30. package/dist/codebase-index/background-indexer.d.ts +2 -2
  31. package/dist/codebase-index/background-indexer.d.ts.map +1 -1
  32. package/dist/codebase-index/bm25.d.ts +3 -1
  33. package/dist/codebase-index/bm25.d.ts.map +1 -1
  34. package/dist/codebase-index/codebase-index-tool.d.ts +1 -1
  35. package/dist/codebase-index/codebase-index-tool.d.ts.map +1 -1
  36. package/dist/codebase-index/codebase-search-tool.d.ts +1 -1
  37. package/dist/codebase-index/codebase-search-tool.d.ts.map +1 -1
  38. package/dist/codebase-index/codebase-stats-tool.d.ts +1 -1
  39. package/dist/codebase-index/codebase-stats-tool.d.ts.map +1 -1
  40. package/dist/codebase-index/generic-parser.d.ts +34 -0
  41. package/dist/codebase-index/generic-parser.d.ts.map +1 -0
  42. package/dist/codebase-index/go-parser.d.ts +1 -1
  43. package/dist/codebase-index/go-parser.d.ts.map +1 -1
  44. package/dist/codebase-index/index.d.ts +4 -2
  45. package/dist/codebase-index/index.d.ts.map +1 -1
  46. package/dist/codebase-index/index.js +1036 -341
  47. package/dist/codebase-index/index.js.map +4 -4
  48. package/dist/codebase-index/indexer.d.ts +6 -1
  49. package/dist/codebase-index/indexer.d.ts.map +1 -1
  50. package/dist/codebase-index/json-parser.d.ts +1 -1
  51. package/dist/codebase-index/languages.d.ts +25 -0
  52. package/dist/codebase-index/languages.d.ts.map +1 -0
  53. package/dist/codebase-index/py-parser.d.ts +9 -1
  54. package/dist/codebase-index/py-parser.d.ts.map +1 -1
  55. package/dist/codebase-index/refs-extractor.d.ts.map +1 -1
  56. package/dist/codebase-index/rs-parser.d.ts +1 -1
  57. package/dist/codebase-index/rs-parser.d.ts.map +1 -1
  58. package/dist/codebase-index/schema.d.ts +9 -2
  59. package/dist/codebase-index/schema.d.ts.map +1 -1
  60. package/dist/codebase-index/spawn-gate.d.ts +15 -0
  61. package/dist/codebase-index/spawn-gate.d.ts.map +1 -0
  62. package/dist/codebase-index/ts-parser.d.ts +2 -2
  63. package/dist/codebase-index/ts-parser.d.ts.map +1 -1
  64. package/dist/codebase-index/worker.js +961 -317
  65. package/dist/codebase-index/worker.js.map +4 -4
  66. package/dist/codebase-index/writer.d.ts +83 -4
  67. package/dist/codebase-index/writer.d.ts.map +1 -1
  68. package/dist/codebase-index/yaml-parser.d.ts +1 -1
  69. package/dist/design.d.ts +5 -2
  70. package/dist/design.d.ts.map +1 -1
  71. package/dist/design.js +36 -3
  72. package/dist/design.js.map +2 -2
  73. package/dist/diff.d.ts +1 -1
  74. package/dist/diff.d.ts.map +1 -1
  75. package/dist/diff.js +2 -2
  76. package/dist/diff.js.map +1 -1
  77. package/dist/document.d.ts +1 -1
  78. package/dist/document.d.ts.map +1 -1
  79. package/dist/document.js +1 -1
  80. package/dist/document.js.map +1 -1
  81. package/dist/e2e.d.ts +1 -1
  82. package/dist/e2e.d.ts.map +1 -1
  83. package/dist/e2e.js +1 -1
  84. package/dist/e2e.js.map +1 -1
  85. package/dist/edit.d.ts +1 -1
  86. package/dist/edit.d.ts.map +1 -1
  87. package/dist/edit.js +3 -3
  88. package/dist/edit.js.map +2 -2
  89. package/dist/exec.d.ts +1 -1
  90. package/dist/exec.d.ts.map +1 -1
  91. package/dist/exec.js +60 -21
  92. package/dist/exec.js.map +3 -3
  93. package/dist/fetch.d.ts +1 -1
  94. package/dist/fetch.d.ts.map +1 -1
  95. package/dist/fetch.js +4 -5
  96. package/dist/fetch.js.map +2 -2
  97. package/dist/format.d.ts +1 -1
  98. package/dist/format.d.ts.map +1 -1
  99. package/dist/format.js +81 -16
  100. package/dist/format.js.map +2 -2
  101. package/dist/git.d.ts +1 -1
  102. package/dist/git.d.ts.map +1 -1
  103. package/dist/git.js +3 -2
  104. package/dist/git.js.map +2 -2
  105. package/dist/glob.d.ts +1 -1
  106. package/dist/glob.d.ts.map +1 -1
  107. package/dist/glob.js +2 -2
  108. package/dist/glob.js.map +1 -1
  109. package/dist/grep.d.ts +1 -1
  110. package/dist/grep.d.ts.map +1 -1
  111. package/dist/grep.js +4 -3
  112. package/dist/grep.js.map +2 -2
  113. package/dist/index.d.ts +4 -4
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.js +1657 -705
  116. package/dist/index.js.map +4 -4
  117. package/dist/install.d.ts +1 -1
  118. package/dist/install.d.ts.map +1 -1
  119. package/dist/install.js +85 -17
  120. package/dist/install.js.map +2 -2
  121. package/dist/json.d.ts +1 -1
  122. package/dist/json.d.ts.map +1 -1
  123. package/dist/json.js +2 -2
  124. package/dist/json.js.map +2 -2
  125. package/dist/kanban.d.ts +4 -3
  126. package/dist/kanban.d.ts.map +1 -1
  127. package/dist/kanban.js +94 -27
  128. package/dist/kanban.js.map +2 -2
  129. package/dist/languages/execute-tool.d.ts +1 -1
  130. package/dist/languages/execute-tool.d.ts.map +1 -1
  131. package/dist/languages/execute.d.ts +1 -1
  132. package/dist/languages/execute.d.ts.map +1 -1
  133. package/dist/languages/index.d.ts +1 -1
  134. package/dist/languages/index.d.ts.map +1 -1
  135. package/dist/languages/index.js +99 -17
  136. package/dist/languages/index.js.map +2 -2
  137. package/dist/languages/package-tool.d.ts +3 -4
  138. package/dist/languages/package-tool.d.ts.map +1 -1
  139. package/dist/languages/plan.d.ts.map +1 -1
  140. package/dist/languages/profiles/additional.d.ts.map +1 -1
  141. package/dist/languages/profiles/primary.d.ts.map +1 -1
  142. package/dist/languages/tool.d.ts +1 -1
  143. package/dist/languages/tool.d.ts.map +1 -1
  144. package/dist/lint.d.ts +1 -1
  145. package/dist/lint.d.ts.map +1 -1
  146. package/dist/lint.js +81 -16
  147. package/dist/lint.js.map +2 -2
  148. package/dist/logs.d.ts +1 -1
  149. package/dist/logs.d.ts.map +1 -1
  150. package/dist/logs.js +2 -2
  151. package/dist/logs.js.map +1 -1
  152. package/dist/memory.d.ts +1 -1
  153. package/dist/memory.d.ts.map +1 -1
  154. package/dist/memory.js +1 -1
  155. package/dist/memory.js.map +1 -1
  156. package/dist/mode.d.ts +1 -1
  157. package/dist/mode.d.ts.map +1 -1
  158. package/dist/mode.js.map +1 -1
  159. package/dist/outdated.d.ts +1 -1
  160. package/dist/outdated.d.ts.map +1 -1
  161. package/dist/outdated.js +101 -19
  162. package/dist/outdated.js.map +2 -2
  163. package/dist/pack.d.ts +1 -1
  164. package/dist/pack.js +1394 -553
  165. package/dist/pack.js.map +4 -4
  166. package/dist/patch.d.ts +1 -1
  167. package/dist/patch.d.ts.map +1 -1
  168. package/dist/patch.js +2 -2
  169. package/dist/patch.js.map +1 -1
  170. package/dist/plan.d.ts +1 -1
  171. package/dist/plan.d.ts.map +1 -1
  172. package/dist/plan.js +7 -7
  173. package/dist/plan.js.map +2 -2
  174. package/dist/process-guardian.d.ts +7 -0
  175. package/dist/process-guardian.d.ts.map +1 -1
  176. package/dist/process-registry-persistent.d.ts +5 -0
  177. package/dist/process-registry-persistent.d.ts.map +1 -1
  178. package/dist/process-registry.d.ts +9 -1
  179. package/dist/process-registry.d.ts.map +1 -1
  180. package/dist/process-registry.js +18 -3
  181. package/dist/process-registry.js.map +2 -2
  182. package/dist/ps-slash.js +54 -15
  183. package/dist/ps-slash.js.map +2 -2
  184. package/dist/read.d.ts +1 -1
  185. package/dist/read.d.ts.map +1 -1
  186. package/dist/read.js +3 -2
  187. package/dist/read.js.map +2 -2
  188. package/dist/replace.d.ts +1 -1
  189. package/dist/replace.d.ts.map +1 -1
  190. package/dist/replace.js +4 -4
  191. package/dist/replace.js.map +2 -2
  192. package/dist/scaffold.d.ts +1 -1
  193. package/dist/scaffold.d.ts.map +1 -1
  194. package/dist/scaffold.js +2 -2
  195. package/dist/scaffold.js.map +1 -1
  196. package/dist/search.d.ts +1 -1
  197. package/dist/search.d.ts.map +1 -1
  198. package/dist/search.js +4 -4
  199. package/dist/search.js.map +2 -2
  200. package/dist/session-kanban.d.ts +4 -1
  201. package/dist/session-kanban.d.ts.map +1 -1
  202. package/dist/session-kanban.js +23 -15
  203. package/dist/session-kanban.js.map +2 -2
  204. package/dist/set-working-dir.d.ts +1 -1
  205. package/dist/set-working-dir.d.ts.map +1 -1
  206. package/dist/skill.d.ts +1 -1
  207. package/dist/skill.d.ts.map +1 -1
  208. package/dist/skill.js +2 -5
  209. package/dist/skill.js.map +2 -2
  210. package/dist/spawn-background.d.ts.map +1 -1
  211. package/dist/task.d.ts +3 -2
  212. package/dist/task.d.ts.map +1 -1
  213. package/dist/task.js +6 -8
  214. package/dist/task.js.map +2 -2
  215. package/dist/test.d.ts +1 -1
  216. package/dist/test.d.ts.map +1 -1
  217. package/dist/test.js +81 -16
  218. package/dist/test.js.map +2 -2
  219. package/dist/todo.d.ts +2 -1
  220. package/dist/todo.d.ts.map +1 -1
  221. package/dist/todo.js +4 -4
  222. package/dist/todo.js.map +2 -2
  223. package/dist/tool-help.d.ts +1 -1
  224. package/dist/tool-help.d.ts.map +1 -1
  225. package/dist/tool-help.js.map +1 -1
  226. package/dist/tool-search.d.ts +1 -1
  227. package/dist/tool-search.d.ts.map +1 -1
  228. package/dist/tool-search.js.map +1 -1
  229. package/dist/tool-tier.d.ts +16 -0
  230. package/dist/tool-tier.d.ts.map +1 -0
  231. package/dist/tool-tier.js +22233 -0
  232. package/dist/tool-tier.js.map +7 -0
  233. package/dist/tool-use.d.ts +1 -1
  234. package/dist/tool-use.d.ts.map +1 -1
  235. package/dist/tool-use.js.map +1 -1
  236. package/dist/tree.d.ts +1 -1
  237. package/dist/tree.d.ts.map +1 -1
  238. package/dist/tree.js +2 -2
  239. package/dist/tree.js.map +1 -1
  240. package/dist/typecheck.d.ts +1 -1
  241. package/dist/typecheck.d.ts.map +1 -1
  242. package/dist/typecheck.js +81 -16
  243. package/dist/typecheck.js.map +2 -2
  244. package/dist/write.d.ts +1 -1
  245. package/dist/write.d.ts.map +1 -1
  246. package/dist/write.js +3 -2
  247. package/dist/write.js.map +2 -2
  248. package/package.json +7 -3
package/dist/bash.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { type Tool } from '@wrongstack/core';
1
+ import type { Tool } from '@wrongstack/core/types';
2
2
  interface BashInput {
3
3
  command: string;
4
4
  timeout_ms?: number | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../src/bash.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,IAAI,EAEV,MAAM,kBAAkB,CAAC;AAS1B,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAClC;AAED,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AA4BD,eAAO,MAAM,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,CAoqBhD,CAAC;AAGF,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../src/bash.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,IAAI,EAAmB,MAAM,wBAAwB,CAAC;AASpE,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAClC;AAED,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AA4BD,eAAO,MAAM,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,CAyoBhD,CAAC;AAGF,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC"}
package/dist/bash.js CHANGED
@@ -5,16 +5,16 @@ import {
5
5
  emitProcessCompleted,
6
6
  emitProcessOutput,
7
7
  emitProcessStarted
8
- } from "@wrongstack/core";
8
+ } from "@wrongstack/core/observability";
9
9
 
10
10
  // src/_env.ts
11
- import { buildChildEnv } from "@wrongstack/core";
11
+ import { buildChildEnv } from "@wrongstack/core/utils";
12
12
 
13
13
  // src/_output-spool.ts
14
14
  import { createWriteStream, mkdirSync } from "node:fs";
15
15
  import * as fsp from "node:fs/promises";
16
16
  import * as path from "node:path";
17
- import { wstackGlobalRoot } from "@wrongstack/core";
17
+ import { wstackGlobalRoot } from "@wrongstack/core/utils";
18
18
  var SPOOL_RETENTION_MS = 7 * 24 * 60 * 60 * 1e3;
19
19
  var SPOOL_WRITE_HWM_BYTES = 4 * 1024 * 1024;
20
20
  var sweepStarted = false;
@@ -118,7 +118,7 @@ function createOutputSpool(opts) {
118
118
  }
119
119
 
120
120
  // src/_util.ts
121
- import * as Core from "@wrongstack/core";
121
+ import * as Core from "@wrongstack/core/utils";
122
122
  var COMMAND_OUTPUT_MAX_BYTES = 32768;
123
123
  var REPEAT_RUN_THRESHOLD = 3;
124
124
  function collapseCarriageReturns(text) {
@@ -387,7 +387,7 @@ var CircuitBreaker = class {
387
387
  };
388
388
 
389
389
  // src/_redact-command.ts
390
- import { expectDefined } from "@wrongstack/core";
390
+ import { expectDefined } from "@wrongstack/core/utils";
391
391
  var SENSITIVE_FLAG_PATTERNS = [
392
392
  // --flag=value or --flag "value" (value captured up to next space or comma)
393
393
  /--(?:token|password|passwd|pwd|secret|api[-_]?key|api[-_]?secret|auth|credential|private[-_]?key|access[-_]?key|github[-_]?token|gh[-_]?token|bearer|jwt|oauth|pin|pincode|passphrase|access[-_]?token)(?:[=\s,][^\s]*)?/gi,
@@ -481,7 +481,12 @@ var ProcessRegistryImpl = class {
481
481
  this.breaker.setEnabled(false);
482
482
  }
483
483
  register(info) {
484
- this.processes.set(info.pid, { ...info, killed: false, protected: info.protected ?? false });
484
+ this.processes.set(info.pid, {
485
+ ...info,
486
+ killed: false,
487
+ protected: info.protected ?? false,
488
+ background: info.background ?? false
489
+ });
485
490
  }
486
491
  _isSafeSignalPid(pid) {
487
492
  return Number.isInteger(pid) && pid > 1 && pid !== process.pid && pid !== process.ppid;
@@ -534,12 +539,21 @@ var ProcessRegistryImpl = class {
534
539
  }
535
540
  return n;
536
541
  }
542
+ /** Count of active jobs explicitly launched in background mode. */
543
+ get activeBackgroundCount() {
544
+ let n = 0;
545
+ for (const p of this.processes.values()) {
546
+ if (p.background && !p.killed) n++;
547
+ }
548
+ return n;
549
+ }
537
550
  /**
538
551
  * Combined stats for observability — used by /ps and the TUI status bar.
539
552
  */
540
553
  stats() {
541
554
  return {
542
555
  activeCount: this.activeCount,
556
+ backgroundCount: this.activeBackgroundCount,
543
557
  totalCount: this.processes.size,
544
558
  breaker: this.breaker.snapshot()
545
559
  };
@@ -640,7 +654,7 @@ var ProcessRegistryImpl = class {
640
654
  this.autoKillTimer = setTimeout(() => {
641
655
  this.autoKillTimer = null;
642
656
  this.autoKillArmedAt = null;
643
- this.killAll({ force: false });
657
+ this.killAll({ force: false, preserveBackground: true });
644
658
  this.breaker.forceReset();
645
659
  this._emitBreakerCountdown();
646
660
  }, this.autoKillResetMs);
@@ -680,6 +694,7 @@ var ProcessRegistryImpl = class {
680
694
  if (!p) return false;
681
695
  if (p.killed) return true;
682
696
  if (p.protected) return false;
697
+ if (opts.preserveBackground && p.background) return false;
683
698
  const { force = false, graceMs = DEFAULT_GRACE_MS } = opts;
684
699
  const isWin2 = os.platform() === "win32";
685
700
  if (isWin2) {
@@ -790,8 +805,9 @@ import * as os3 from "node:os";
790
805
  // src/process-registry-persistent.ts
791
806
  import * as fs from "node:fs/promises";
792
807
  import * as os2 from "node:os";
808
+ import { wstackGlobalRoot as wstackGlobalRoot3 } from "@wrongstack/core/utils";
793
809
  import * as path2 from "node:path";
794
- var REGISTRY_FILE = ".wrongstack/process-registry.json";
810
+ var REGISTRY_FILE = "process-registry.json";
795
811
  function toErrorMessage(err) {
796
812
  return err instanceof Error ? err.message : String(err);
797
813
  }
@@ -809,7 +825,7 @@ function emitStructuredLog(level, event, message, error) {
809
825
  }
810
826
  var HEARTBEAT_INTERVAL_MS = 5e3;
811
827
  var STALE_THRESHOLD_MS = 3e4;
812
- var LOCKFILE = ".wrongstack/.process-registry.lock";
828
+ var LOCKFILE = ".process-registry.lock";
813
829
  function generateInstanceId() {
814
830
  const hostname2 = os2.hostname();
815
831
  const pid = process.pid;
@@ -898,12 +914,18 @@ var PersistentProcessRegistry = class {
898
914
  lockPath;
899
915
  baseRegistry;
900
916
  heartbeatInterval = null;
917
+ cleanupInterval = null;
918
+ heartbeatRunning = false;
919
+ cleanupRunning = false;
901
920
  isShuttingDown = false;
921
+ onProcessExit = () => {
922
+ void this.syncToPersistent();
923
+ };
902
924
  constructor(baseRegistry) {
903
925
  this.instanceId = generateInstanceId();
904
- const homeDir = os2.homedir();
905
- this.registryPath = path2.join(homeDir, REGISTRY_FILE);
906
- this.lockPath = path2.join(homeDir, LOCKFILE);
926
+ const globalRoot = wstackGlobalRoot3();
927
+ this.registryPath = path2.join(globalRoot, REGISTRY_FILE);
928
+ this.lockPath = path2.join(globalRoot, LOCKFILE);
907
929
  this.baseRegistry = baseRegistry ?? getProcessRegistry();
908
930
  this.ensureDirectory().catch((err) => {
909
931
  emitStructuredLog("warn", "process_registry.dir_create_failed", "PersistentProcessRegistry: failed to create .wrongstack directory", err);
@@ -922,16 +944,18 @@ var PersistentProcessRegistry = class {
922
944
  */
923
945
  start() {
924
946
  if (this.heartbeatInterval) return;
925
- this.syncToPersistent();
947
+ this.isShuttingDown = false;
948
+ this.heartbeat();
926
949
  this.heartbeatInterval = setInterval(() => {
927
950
  this.heartbeat();
928
951
  }, HEARTBEAT_INTERVAL_MS);
929
952
  this.heartbeatInterval.unref?.();
930
- setInterval(() => {
931
- this.cleanupStaleEntries();
932
- }, STALE_THRESHOLD_MS).unref?.();
953
+ this.cleanupInterval = setInterval(() => {
954
+ this.cleanup();
955
+ }, STALE_THRESHOLD_MS);
956
+ this.cleanupInterval.unref?.();
933
957
  this.registerMainProcess();
934
- process.on("exit", () => this.syncToPersistent());
958
+ process.on("exit", this.onProcessExit);
935
959
  }
936
960
  /**
937
961
  * Stop the heartbeat and clean up.
@@ -942,7 +966,12 @@ var PersistentProcessRegistry = class {
942
966
  clearInterval(this.heartbeatInterval);
943
967
  this.heartbeatInterval = null;
944
968
  }
945
- this.syncToPersistent();
969
+ if (this.cleanupInterval) {
970
+ clearInterval(this.cleanupInterval);
971
+ this.cleanupInterval = null;
972
+ }
973
+ process.off("exit", this.onProcessExit);
974
+ void this.syncToPersistent();
946
975
  }
947
976
  /**
948
977
  * Register the main WrongStack process as protected.
@@ -1026,8 +1055,18 @@ var PersistentProcessRegistry = class {
1026
1055
  * Send heartbeat to mark all this instance's processes as alive.
1027
1056
  */
1028
1057
  heartbeat() {
1029
- if (this.isShuttingDown) return;
1030
- this.syncToPersistent();
1058
+ if (this.isShuttingDown || this.heartbeatRunning) return;
1059
+ this.heartbeatRunning = true;
1060
+ void this.syncToPersistent().finally(() => {
1061
+ this.heartbeatRunning = false;
1062
+ });
1063
+ }
1064
+ cleanup() {
1065
+ if (this.isShuttingDown || this.cleanupRunning) return;
1066
+ this.cleanupRunning = true;
1067
+ void this.cleanupStaleEntries().finally(() => {
1068
+ this.cleanupRunning = false;
1069
+ });
1031
1070
  }
1032
1071
  /**
1033
1072
  * Sync this instance's processes to the persistent registry.
@@ -1781,14 +1820,12 @@ var bashTool = {
1781
1820
  const detached = !isWin2;
1782
1821
  const startedAt = Date.now();
1783
1822
  if (input.background) {
1784
- let buf2 = "";
1785
- let truncated = false;
1786
1823
  const child2 = spawn2(shell, args, {
1787
1824
  cwd: ctx.projectRoot,
1788
1825
  env,
1789
1826
  // PowerShell takes the script on stdin (no argv quoting); cmd.exe
1790
1827
  // and POSIX shells ignore stdin when given the command inline.
1791
- stdio: [plan.useStdin ? "pipe" : "ignore", "pipe", "pipe"],
1828
+ stdio: [plan.useStdin ? "pipe" : "ignore", "ignore", "ignore"],
1792
1829
  // win32: CreateProcess IGNORES CREATE_NO_WINDOW (windowsHide) when
1793
1830
  // DETACHED_PROCESS (detached: true) is set, so the console-less
1794
1831
  // cmd.exe's grandchildren (node, dev servers) each allocate a fresh
@@ -1807,8 +1844,8 @@ var bashTool = {
1807
1844
  }
1808
1845
  }
1809
1846
  const pid2 = child2.pid;
1810
- let stdoutBytes2 = 0;
1811
- let stderrBytes2 = 0;
1847
+ const stdoutBytes2 = 0;
1848
+ const stderrBytes2 = 0;
1812
1849
  let telemetryCompleted2 = false;
1813
1850
  emitProcessStarted({
1814
1851
  ...pid2 !== void 0 ? { pid: pid2 } : {},
@@ -1841,41 +1878,17 @@ var bashTool = {
1841
1878
  startedAt: Date.now(),
1842
1879
  sessionId: ctx.session?.id,
1843
1880
  child: child2,
1844
- processGroupLeader: detached && child2.pid === pid2
1881
+ processGroupLeader: detached && child2.pid === pid2,
1882
+ background: true
1845
1883
  });
1846
1884
  child2.on("close", () => registry.unregister(pid2));
1847
1885
  }
1848
- const onBgData = (chunk, stream) => {
1849
- if (stream === "stdout") stdoutBytes2 += chunk.byteLength;
1850
- else stderrBytes2 += chunk.byteLength;
1851
- emitProcessOutput({ pid: pid2, stream, chunk });
1852
- if (truncated) return;
1853
- const remain = MAX_OUTPUT - buf2.length;
1854
- if (remain > 0) {
1855
- buf2 += chunk.toString().slice(0, remain);
1856
- }
1857
- if (buf2.length >= MAX_OUTPUT) {
1858
- truncated = true;
1859
- child2.stdout?.off("data", onBgStdout);
1860
- child2.stderr?.off("data", onBgStderr);
1861
- }
1862
- };
1863
- const onBgStdout = (chunk) => onBgData(chunk, "stdout");
1864
- const onBgStderr = (chunk) => onBgData(chunk, "stderr");
1865
- child2.stdout?.on("data", onBgStdout);
1866
- child2.stderr?.on("data", onBgStderr);
1867
- const cleanupBackground = () => {
1868
- child2.stdout?.off("data", onBgStdout);
1869
- child2.stderr?.off("data", onBgStderr);
1870
- };
1871
1886
  child2.on("error", () => {
1872
- cleanupBackground();
1873
1887
  if (typeof pid2 === "number") registry.unregister(pid2);
1874
1888
  registry.afterCall(Date.now() - startedAt, true, bypassBreaker);
1875
1889
  completeBackground(1);
1876
1890
  });
1877
1891
  child2.on("close", (code, signal) => {
1878
- cleanupBackground();
1879
1892
  registry.afterCall(Date.now() - startedAt, false, bypassBreaker);
1880
1893
  completeBackground(code ?? (signal ? 1 : 0), signal ?? void 0);
1881
1894
  });
@@ -1883,7 +1896,7 @@ var bashTool = {
1883
1896
  yield {
1884
1897
  type: "final",
1885
1898
  output: {
1886
- output: normalizeCommandOutput(buf2),
1899
+ output: "",
1887
1900
  exit_code: null,
1888
1901
  timed_out: false,
1889
1902
  pid: pid2
@@ -2154,6 +2167,7 @@ ${hint}` : ""),
2154
2167
  for (const entry of registry.bySession(sessionId)) {
2155
2168
  if (entry.name !== "bash") continue;
2156
2169
  if (entry.child.exitCode !== null) continue;
2170
+ if (entry.background) continue;
2157
2171
  if (entry.protected) continue;
2158
2172
  registry.kill(entry.pid, { force: true });
2159
2173
  }