@wrongstack/tools 0.295.0 → 0.296.2

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 (142) hide show
  1. package/dist/auto-proceed-loop-guard.d.ts +98 -0
  2. package/dist/auto-proceed-loop-guard.d.ts.map +1 -1
  3. package/dist/auto-proceed-loop-guard.js +119 -1
  4. package/dist/auto-proceed-loop-guard.js.map +2 -2
  5. package/dist/bash.js +92 -41
  6. package/dist/bash.js.map +2 -2
  7. package/dist/browser/index.js +17 -7
  8. package/dist/browser/index.js.map +2 -2
  9. package/dist/browser/network-guard-proxy.d.ts.map +1 -1
  10. package/dist/builtin.d.ts +2 -2
  11. package/dist/builtin.d.ts.map +1 -1
  12. package/dist/builtin.js +9158 -7302
  13. package/dist/builtin.js.map +4 -4
  14. package/dist/codebase-index/background-indexer.d.ts +28 -2
  15. package/dist/codebase-index/background-indexer.d.ts.map +1 -1
  16. package/dist/codebase-index/codebase-index-tool.d.ts.map +1 -1
  17. package/dist/codebase-index/dead-code-scan.d.ts +77 -0
  18. package/dist/codebase-index/dead-code-scan.d.ts.map +1 -0
  19. package/dist/codebase-index/generic-parser.d.ts.map +1 -1
  20. package/dist/codebase-index/index-service.d.ts +4 -3
  21. package/dist/codebase-index/index-service.d.ts.map +1 -1
  22. package/dist/codebase-index/index.d.ts +11 -8
  23. package/dist/codebase-index/index.d.ts.map +1 -1
  24. package/dist/codebase-index/index.js +5048 -3582
  25. package/dist/codebase-index/index.js.map +4 -4
  26. package/dist/codebase-index/indexer.d.ts +2 -0
  27. package/dist/codebase-index/indexer.d.ts.map +1 -1
  28. package/dist/codebase-index/parser-dispatch.d.ts +8 -0
  29. package/dist/codebase-index/parser-dispatch.d.ts.map +1 -0
  30. package/dist/codebase-index/project-server-cache.d.ts +11 -0
  31. package/dist/codebase-index/project-server-cache.d.ts.map +1 -0
  32. package/dist/codebase-index/project-server-client.d.ts +74 -0
  33. package/dist/codebase-index/project-server-client.d.ts.map +1 -0
  34. package/dist/codebase-index/project-server-endpoint.d.ts +24 -0
  35. package/dist/codebase-index/project-server-endpoint.d.ts.map +1 -0
  36. package/dist/codebase-index/project-server-protocol.d.ts +88 -0
  37. package/dist/codebase-index/project-server-protocol.d.ts.map +1 -0
  38. package/dist/codebase-index/project-server.d.ts +11 -0
  39. package/dist/codebase-index/project-server.d.ts.map +1 -0
  40. package/dist/codebase-index/project-server.js +5061 -0
  41. package/dist/codebase-index/project-server.js.map +7 -0
  42. package/dist/codebase-index/refs-extractor.d.ts +1 -0
  43. package/dist/codebase-index/refs-extractor.d.ts.map +1 -1
  44. package/dist/codebase-index/schema.d.ts +11 -0
  45. package/dist/codebase-index/schema.d.ts.map +1 -1
  46. package/dist/codebase-index/sqlite-runtime.d.ts +9 -0
  47. package/dist/codebase-index/sqlite-runtime.d.ts.map +1 -0
  48. package/dist/codebase-index/ts-parser.d.ts +5 -1
  49. package/dist/codebase-index/ts-parser.d.ts.map +1 -1
  50. package/dist/codebase-index/worker-protocol.d.ts +19 -1
  51. package/dist/codebase-index/worker-protocol.d.ts.map +1 -1
  52. package/dist/codebase-index/worker.js +3869 -3423
  53. package/dist/codebase-index/worker.js.map +4 -4
  54. package/dist/codebase-index/writer-admin.d.ts +16 -0
  55. package/dist/codebase-index/writer-admin.d.ts.map +1 -0
  56. package/dist/codebase-index/writer-bulk-insert.d.ts +25 -0
  57. package/dist/codebase-index/writer-bulk-insert.d.ts.map +1 -0
  58. package/dist/codebase-index/writer-graph-helpers.d.ts +52 -0
  59. package/dist/codebase-index/writer-graph-helpers.d.ts.map +1 -0
  60. package/dist/codebase-index/writer-graph-reader.d.ts +11 -0
  61. package/dist/codebase-index/writer-graph-reader.d.ts.map +1 -0
  62. package/dist/codebase-index/writer-helpers.d.ts +15 -0
  63. package/dist/codebase-index/writer-helpers.d.ts.map +1 -0
  64. package/dist/codebase-index/writer-pragmas.d.ts +3 -0
  65. package/dist/codebase-index/writer-pragmas.d.ts.map +1 -0
  66. package/dist/codebase-index/writer-ref-mapper.d.ts +11 -0
  67. package/dist/codebase-index/writer-ref-mapper.d.ts.map +1 -0
  68. package/dist/codebase-index/writer-schema.d.ts +7 -0
  69. package/dist/codebase-index/writer-schema.d.ts.map +1 -0
  70. package/dist/codebase-index/writer-search-helpers.d.ts +28 -0
  71. package/dist/codebase-index/writer-search-helpers.d.ts.map +1 -0
  72. package/dist/codebase-index/writer-store-pool.d.ts +45 -0
  73. package/dist/codebase-index/writer-store-pool.d.ts.map +1 -0
  74. package/dist/codebase-index/writer.d.ts +53 -88
  75. package/dist/codebase-index/writer.d.ts.map +1 -1
  76. package/dist/exec.js +92 -41
  77. package/dist/exec.js.map +2 -2
  78. package/dist/glob.d.ts.map +1 -1
  79. package/dist/glob.js +80 -30
  80. package/dist/glob.js.map +4 -4
  81. package/dist/grep.d.ts.map +1 -1
  82. package/dist/grep.js +87 -20
  83. package/dist/grep.js.map +4 -4
  84. package/dist/index.d.ts +3 -2
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +9610 -7755
  87. package/dist/index.js.map +4 -4
  88. package/dist/kanban-board-inputs.d.ts +34 -0
  89. package/dist/kanban-board-inputs.d.ts.map +1 -0
  90. package/dist/kanban-decomposition-actions.d.ts +4 -0
  91. package/dist/kanban-decomposition-actions.d.ts.map +1 -0
  92. package/dist/kanban-detail-actions.d.ts +3 -0
  93. package/dist/kanban-detail-actions.d.ts.map +1 -0
  94. package/dist/kanban-evidence-bridge.d.ts +21 -0
  95. package/dist/kanban-evidence-bridge.d.ts.map +1 -0
  96. package/dist/kanban-presence.d.ts +10 -0
  97. package/dist/kanban-presence.d.ts.map +1 -0
  98. package/dist/kanban-split-task-handler.d.ts +6 -0
  99. package/dist/kanban-split-task-handler.d.ts.map +1 -0
  100. package/dist/kanban-task-inputs.d.ts +73 -0
  101. package/dist/kanban-task-inputs.d.ts.map +1 -0
  102. package/dist/kanban-tool-results.d.ts +14 -0
  103. package/dist/kanban-tool-results.d.ts.map +1 -0
  104. package/dist/kanban-tool-schema.d.ts +5 -0
  105. package/dist/kanban-tool-schema.d.ts.map +1 -0
  106. package/dist/kanban-tool-types.d.ts +135 -0
  107. package/dist/kanban-tool-types.d.ts.map +1 -0
  108. package/dist/kanban.d.ts +2 -130
  109. package/dist/kanban.d.ts.map +1 -1
  110. package/dist/kanban.js +944 -582
  111. package/dist/kanban.js.map +4 -4
  112. package/dist/pack.js +9157 -7302
  113. package/dist/pack.js.map +4 -4
  114. package/dist/plan.js +2 -2
  115. package/dist/plan.js.map +2 -2
  116. package/dist/process-registry-persistent.d.ts +1 -0
  117. package/dist/process-registry-persistent.d.ts.map +1 -1
  118. package/dist/ps-slash.js +92 -41
  119. package/dist/ps-slash.js.map +2 -2
  120. package/dist/replace.js +8 -0
  121. package/dist/replace.js.map +2 -2
  122. package/dist/session-kanban.d.ts.map +1 -1
  123. package/dist/session-kanban.js +15 -20
  124. package/dist/session-kanban.js.map +2 -2
  125. package/dist/task.d.ts.map +1 -1
  126. package/dist/task.js +48 -6
  127. package/dist/task.js.map +2 -2
  128. package/dist/todo.d.ts.map +1 -1
  129. package/dist/todo.js +47 -5
  130. package/dist/todo.js.map +2 -2
  131. package/dist/tool-tier.js +9159 -7303
  132. package/dist/tool-tier.js.map +4 -4
  133. package/dist/tree.d.ts.map +1 -1
  134. package/dist/tree.js +2 -14
  135. package/dist/tree.js.map +2 -2
  136. package/dist/win32.d.ts +10 -0
  137. package/dist/win32.d.ts.map +1 -0
  138. package/dist/win32.js +67 -0
  139. package/dist/win32.js.map +7 -0
  140. package/package.json +9 -5
  141. package/dist/shim/node-sqlite.d.ts +0 -3
  142. package/dist/shim/node-sqlite.d.ts.map +0 -1
package/dist/exec.js CHANGED
@@ -1206,6 +1206,7 @@ function emitStructuredLog(level, event, message, error) {
1206
1206
  }
1207
1207
  var HEARTBEAT_INTERVAL_MS = 5e3;
1208
1208
  var STALE_THRESHOLD_MS = 3e4;
1209
+ var LOCK_STALE_MS = 3e4;
1209
1210
  var LOCKFILE = ".process-registry.lock";
1210
1211
  function generateInstanceId() {
1211
1212
  const hostname2 = os2.hostname();
@@ -1234,21 +1235,26 @@ async function acquireLock(lockfilePath, timeoutMs = 5e3) {
1234
1235
  try {
1235
1236
  const content = await fs2.readFile(lockfilePath, "utf-8");
1236
1237
  const parts = content.split(":");
1237
- const lockPidStr = parts[0] ?? "0";
1238
- const lockPid = parseInt(lockPidStr, 10);
1239
- if (process.platform !== "win32") {
1238
+ const lockPid = parseInt(parts[0] ?? "0", 10);
1239
+ const lockTs = Number(parts[parts.length - 1]);
1240
+ const staleByAge = Number.isFinite(lockTs) && Date.now() - lockTs > LOCK_STALE_MS;
1241
+ let holderDead = false;
1242
+ if (process.platform !== "win32" && Number.isFinite(lockPid) && lockPid > 0) {
1240
1243
  try {
1241
1244
  process.kill(lockPid, 0);
1242
1245
  } catch {
1243
- await fs2.unlink(lockfilePath);
1244
- continue;
1246
+ holderDead = true;
1245
1247
  }
1246
1248
  }
1247
- } catch {
1248
- try {
1249
- await fs2.unlink(lockfilePath);
1250
- } catch {
1249
+ if (holderDead || staleByAge) {
1250
+ await fs2.unlink(lockfilePath).catch(() => {
1251
+ });
1252
+ continue;
1251
1253
  }
1254
+ } catch {
1255
+ await fs2.unlink(lockfilePath).catch(() => {
1256
+ });
1257
+ continue;
1252
1258
  }
1253
1259
  await new Promise((r) => setTimeout(r, 100));
1254
1260
  continue;
@@ -1258,25 +1264,35 @@ async function acquireLock(lockfilePath, timeoutMs = 5e3) {
1258
1264
  }
1259
1265
  throw new Error(`Failed to acquire lock after ${timeoutMs}ms`);
1260
1266
  }
1267
+ function freshRegistryData() {
1268
+ return {
1269
+ version: 1,
1270
+ instances: /* @__PURE__ */ new Map(),
1271
+ protectedPatterns: ["wrongstack", "node"],
1272
+ lastCleanup: Date.now()
1273
+ };
1274
+ }
1261
1275
  async function readRegistryFile(filePath) {
1276
+ let content;
1262
1277
  try {
1263
- const content = await fs2.readFile(filePath, "utf-8");
1264
- const parsed = JSON.parse(content);
1265
- if (parsed.instances && Array.isArray(parsed.instances)) {
1266
- parsed.instances = new Map(parsed.instances);
1267
- }
1268
- return parsed;
1278
+ content = await fs2.readFile(filePath, "utf-8");
1269
1279
  } catch (err) {
1270
- if (isNodeError(err) && err.code === "ENOENT") {
1271
- return {
1272
- version: 1,
1273
- instances: /* @__PURE__ */ new Map(),
1274
- protectedPatterns: ["wrongstack", "node"],
1275
- lastCleanup: Date.now()
1276
- };
1277
- }
1280
+ if (isNodeError(err) && err.code === "ENOENT") return freshRegistryData();
1278
1281
  throw err;
1279
1282
  }
1283
+ try {
1284
+ const parsed = JSON.parse(content);
1285
+ if (!parsed || typeof parsed !== "object") return freshRegistryData();
1286
+ const base = freshRegistryData();
1287
+ return {
1288
+ version: 1,
1289
+ instances: Array.isArray(parsed.instances) ? new Map(parsed.instances) : base.instances,
1290
+ protectedPatterns: Array.isArray(parsed.protectedPatterns) ? parsed.protectedPatterns : base.protectedPatterns,
1291
+ lastCleanup: typeof parsed.lastCleanup === "number" ? parsed.lastCleanup : base.lastCleanup
1292
+ };
1293
+ } catch {
1294
+ return freshRegistryData();
1295
+ }
1280
1296
  }
1281
1297
  async function writeRegistryFile(filePath, data) {
1282
1298
  const tmpPath = `${filePath}.tmp.${process.pid}`;
@@ -1300,7 +1316,11 @@ var PersistentProcessRegistry = class {
1300
1316
  cleanupRunning = false;
1301
1317
  isShuttingDown = false;
1302
1318
  onProcessExit = () => {
1303
- void this.syncToPersistent();
1319
+ this.runInBackground(
1320
+ this.syncToPersistent(),
1321
+ "process_registry.exit_sync_failed",
1322
+ "PersistentProcessRegistry: exit sync failed"
1323
+ );
1304
1324
  };
1305
1325
  constructor(baseRegistry) {
1306
1326
  this.instanceId = generateInstanceId();
@@ -1320,6 +1340,11 @@ var PersistentProcessRegistry = class {
1320
1340
  if (!isNodeError(err) || err.code !== "EEXIST") throw err;
1321
1341
  }
1322
1342
  }
1343
+ runInBackground(operation, event, message) {
1344
+ void operation.catch((err) => {
1345
+ emitStructuredLog("warn", event, message, err);
1346
+ });
1347
+ }
1323
1348
  /**
1324
1349
  * Start the heartbeat and periodic cleanup tasks.
1325
1350
  */
@@ -1352,26 +1377,34 @@ var PersistentProcessRegistry = class {
1352
1377
  this.cleanupInterval = null;
1353
1378
  }
1354
1379
  process.off("exit", this.onProcessExit);
1355
- void this.syncToPersistent();
1380
+ this.runInBackground(
1381
+ this.syncToPersistent(),
1382
+ "process_registry.stop_sync_failed",
1383
+ "PersistentProcessRegistry: stop sync failed"
1384
+ );
1356
1385
  }
1357
1386
  /**
1358
1387
  * Register the main WrongStack process as protected.
1359
1388
  */
1360
1389
  registerMainProcess() {
1361
1390
  const mainPid = process.pid;
1362
- this.updatePersistentEntry({
1363
- pid: mainPid,
1364
- name: "wrongstack-main",
1365
- command: process.argv.slice(0, 3).join(" "),
1366
- startedAt: Date.now(),
1367
- lastHeartbeat: Date.now(),
1368
- instanceId: this.instanceId,
1369
- hostname: os2.hostname(),
1370
- protected: true,
1371
- spawnMode: "main",
1372
- parentPid: process.ppid,
1373
- platform: process.platform
1374
- });
1391
+ this.runInBackground(
1392
+ this.updatePersistentEntry({
1393
+ pid: mainPid,
1394
+ name: "wrongstack-main",
1395
+ command: process.argv.slice(0, 3).join(" "),
1396
+ startedAt: Date.now(),
1397
+ lastHeartbeat: Date.now(),
1398
+ instanceId: this.instanceId,
1399
+ hostname: os2.hostname(),
1400
+ protected: true,
1401
+ spawnMode: "main",
1402
+ parentPid: process.ppid,
1403
+ platform: process.platform
1404
+ }),
1405
+ "process_registry.main_register_failed",
1406
+ "PersistentProcessRegistry: failed to register main process"
1407
+ );
1375
1408
  }
1376
1409
  /**
1377
1410
  * Register a spawned child process with the persistent registry.
@@ -1394,7 +1427,11 @@ var PersistentProcessRegistry = class {
1394
1427
  if (sessionId) {
1395
1428
  entry.sessionId = sessionId;
1396
1429
  }
1397
- this.updatePersistentEntry(entry);
1430
+ this.runInBackground(
1431
+ this.updatePersistentEntry(entry),
1432
+ "process_registry.child_register_failed",
1433
+ "PersistentProcessRegistry: failed to register child process"
1434
+ );
1398
1435
  }
1399
1436
  /**
1400
1437
  * Update or add an entry in the persistent registry.
@@ -1438,14 +1475,28 @@ var PersistentProcessRegistry = class {
1438
1475
  heartbeat() {
1439
1476
  if (this.isShuttingDown || this.heartbeatRunning) return;
1440
1477
  this.heartbeatRunning = true;
1441
- void this.syncToPersistent().finally(() => {
1478
+ void this.syncToPersistent().catch((err) => {
1479
+ emitStructuredLog(
1480
+ "warn",
1481
+ "process_registry.heartbeat_failed",
1482
+ "PersistentProcessRegistry: heartbeat failed",
1483
+ err
1484
+ );
1485
+ }).finally(() => {
1442
1486
  this.heartbeatRunning = false;
1443
1487
  });
1444
1488
  }
1445
1489
  cleanup() {
1446
1490
  if (this.isShuttingDown || this.cleanupRunning) return;
1447
1491
  this.cleanupRunning = true;
1448
- void this.cleanupStaleEntries().finally(() => {
1492
+ void this.cleanupStaleEntries().catch((err) => {
1493
+ emitStructuredLog(
1494
+ "warn",
1495
+ "process_registry.periodic_cleanup_failed",
1496
+ "PersistentProcessRegistry: periodic cleanup failed",
1497
+ err
1498
+ );
1499
+ }).finally(() => {
1449
1500
  this.cleanupRunning = false;
1450
1501
  });
1451
1502
  }