instar 0.23.8 → 0.23.10

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 (43) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +42 -9
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/commands/setup.d.ts.map +1 -1
  5. package/dist/commands/setup.js +16 -1
  6. package/dist/commands/setup.js.map +1 -1
  7. package/dist/core/SessionManager.d.ts.map +1 -1
  8. package/dist/core/SessionManager.js +8 -0
  9. package/dist/core/SessionManager.js.map +1 -1
  10. package/dist/knowledge/TreeGenerator.d.ts.map +1 -1
  11. package/dist/knowledge/TreeGenerator.js +13 -0
  12. package/dist/knowledge/TreeGenerator.js.map +1 -1
  13. package/dist/knowledge/TreeTriage.js +1 -1
  14. package/dist/knowledge/TreeTriage.js.map +1 -1
  15. package/dist/lifeline/TelegramLifeline.d.ts +9 -0
  16. package/dist/lifeline/TelegramLifeline.d.ts.map +1 -1
  17. package/dist/lifeline/TelegramLifeline.js +105 -4
  18. package/dist/lifeline/TelegramLifeline.js.map +1 -1
  19. package/dist/memory/MemoryIndex.d.ts.map +1 -1
  20. package/dist/memory/MemoryIndex.js +1 -0
  21. package/dist/memory/MemoryIndex.js.map +1 -1
  22. package/dist/memory/SemanticMemory.d.ts +5 -0
  23. package/dist/memory/SemanticMemory.d.ts.map +1 -1
  24. package/dist/memory/SemanticMemory.js +13 -0
  25. package/dist/memory/SemanticMemory.js.map +1 -1
  26. package/dist/memory/TopicMemory.d.ts +5 -0
  27. package/dist/memory/TopicMemory.d.ts.map +1 -1
  28. package/dist/memory/TopicMemory.js +13 -0
  29. package/dist/memory/TopicMemory.js.map +1 -1
  30. package/dist/server/routes.d.ts.map +1 -1
  31. package/dist/server/routes.js +93 -1
  32. package/dist/server/routes.js.map +1 -1
  33. package/dist/threadline/relay/RegistryStore.d.ts.map +1 -1
  34. package/dist/threadline/relay/RegistryStore.js +1 -0
  35. package/dist/threadline/relay/RegistryStore.js.map +1 -1
  36. package/dist/tunnel/TunnelManager.d.ts +22 -1
  37. package/dist/tunnel/TunnelManager.d.ts.map +1 -1
  38. package/dist/tunnel/TunnelManager.js +118 -1
  39. package/dist/tunnel/TunnelManager.js.map +1 -1
  40. package/package.json +1 -1
  41. package/src/data/builtin-manifest.json +49 -49
  42. package/upgrades/0.23.10.md +19 -0
  43. package/upgrades/0.23.9.md +35 -0
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAwPH,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;2DACuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA8gCD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAy1EtE;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDzE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuD5E"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAwPH,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;2DACuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA8gCD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAk3EtE;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDzE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuD5E"}
@@ -2511,6 +2511,15 @@ export async function startServer(options) {
2511
2511
  const sleepWakeDetector = new SleepWakeDetector();
2512
2512
  sleepWakeDetector.on('wake', async (event) => {
2513
2513
  console.log(`[SleepWake] Wake detected after ~${event.sleepDurationSeconds}s sleep`);
2514
+ // Checkpoint SQLite WAL files to flush stale locks from pre-sleep connections
2515
+ try {
2516
+ topicMemory?.checkpoint();
2517
+ }
2518
+ catch { /* non-critical */ }
2519
+ try {
2520
+ semanticMemory?.checkpoint();
2521
+ }
2522
+ catch { /* non-critical */ }
2514
2523
  // Re-validate tmux sessions
2515
2524
  try {
2516
2525
  const tmuxPath = detectTmuxPath();
@@ -2523,17 +2532,24 @@ export async function startServer(options) {
2523
2532
  catch {
2524
2533
  console.warn('[SleepWake] tmux check failed after wake');
2525
2534
  }
2526
- // Restart tunnel if configured
2535
+ // Restart tunnel if configured — use forceStop to handle zombie cloudflared
2536
+ // processes that may be hung after sleep. Race with a 15s overall timeout
2537
+ // to prevent the wake handler itself from blocking indefinitely.
2527
2538
  if (tunnel) {
2528
2539
  try {
2529
- await tunnel.stop();
2530
- const tunnelUrl = await tunnel.start();
2531
- console.log(`[SleepWake] Tunnel restarted: ${tunnelUrl}`);
2532
- // Re-broadcast dashboard URL after tunnel restart (quick tunnels get new URL)
2533
- if (telegram && tunnelUrl) {
2534
- const tunnelType = config.tunnel?.type || 'quick';
2535
- await telegram.broadcastDashboardUrl(tunnelUrl, tunnelType).catch(() => { });
2536
- }
2540
+ await Promise.race([
2541
+ (async () => {
2542
+ await tunnel.forceStop(5000);
2543
+ const tunnelUrl = await tunnel.start();
2544
+ console.log(`[SleepWake] Tunnel restarted: ${tunnelUrl}`);
2545
+ // Re-broadcast dashboard URL after tunnel restart (quick tunnels get new URL)
2546
+ if (telegram && tunnelUrl) {
2547
+ const tunnelType = config.tunnel?.type || 'quick';
2548
+ await telegram.broadcastDashboardUrl(tunnelUrl, tunnelType).catch(() => { });
2549
+ }
2550
+ })(),
2551
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Tunnel restart timed out after 15s')), 15_000)),
2552
+ ]);
2537
2553
  }
2538
2554
  catch (err) {
2539
2555
  console.error(`[SleepWake] Tunnel restart failed:`, err);
@@ -3109,6 +3125,7 @@ export async function startServer(options) {
3109
3125
  }
3110
3126
  // Start tunnel AFTER server is listening (with retry on failure)
3111
3127
  if (tunnel) {
3128
+ tunnel.enableAutoReconnect();
3112
3129
  const maxRetries = 5;
3113
3130
  let tunnelStarted = false;
3114
3131
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
@@ -3319,6 +3336,22 @@ export async function startServer(options) {
3319
3336
  };
3320
3337
  process.on('SIGINT', shutdown);
3321
3338
  process.on('SIGTERM', shutdown);
3339
+ // Last-resort SQLite cleanup — if the process crashes from an uncaught exception
3340
+ // (e.g., cloudflared crash cascade during sleep/wake), close databases to prevent
3341
+ // the "mutex lock failed" error on next start. This doesn't prevent the crash,
3342
+ // but ensures the next boot is clean.
3343
+ process.on('uncaughtException', (err) => {
3344
+ console.error('[FATAL] Uncaught exception — closing databases before crash:', err.message);
3345
+ try {
3346
+ topicMemory?.close();
3347
+ }
3348
+ catch { /* best effort */ }
3349
+ try {
3350
+ semanticMemory?.close();
3351
+ }
3352
+ catch { /* best effort */ }
3353
+ process.exit(1);
3354
+ });
3322
3355
  // Wire the ForegroundRestartWatcher to the graceful shutdown function.
3323
3356
  // This ensures auto-update restarts close all resources (especially SQLite
3324
3357
  // databases) before exiting, preventing the "mutex lock failed" crash.