instar 1.2.35 → 1.2.37

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 (39) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +20 -67
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/core/AutoUpdater.d.ts.map +1 -1
  5. package/dist/core/AutoUpdater.js +25 -1
  6. package/dist/core/AutoUpdater.js.map +1 -1
  7. package/dist/core/PostUpdateMigrator.d.ts +1 -0
  8. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  9. package/dist/core/PostUpdateMigrator.js +91 -0
  10. package/dist/core/PostUpdateMigrator.js.map +1 -1
  11. package/dist/core/version-skew.d.ts +77 -0
  12. package/dist/core/version-skew.d.ts.map +1 -0
  13. package/dist/core/version-skew.js +144 -0
  14. package/dist/core/version-skew.js.map +1 -0
  15. package/dist/lifeline/RestartOrchestrator.d.ts +1 -1
  16. package/dist/lifeline/RestartOrchestrator.d.ts.map +1 -1
  17. package/dist/lifeline/TelegramLifeline.d.ts +14 -0
  18. package/dist/lifeline/TelegramLifeline.d.ts.map +1 -1
  19. package/dist/lifeline/TelegramLifeline.js +60 -0
  20. package/dist/lifeline/TelegramLifeline.js.map +1 -1
  21. package/dist/lifeline/rateLimitState.d.ts +1 -1
  22. package/dist/lifeline/rateLimitState.d.ts.map +1 -1
  23. package/dist/lifeline/rateLimitState.js +16 -11
  24. package/dist/lifeline/rateLimitState.js.map +1 -1
  25. package/dist/server/routes.d.ts.map +1 -1
  26. package/dist/server/routes.js +20 -0
  27. package/dist/server/routes.js.map +1 -1
  28. package/dist/tunnel/TunnelManager.d.ts +99 -62
  29. package/dist/tunnel/TunnelManager.d.ts.map +1 -1
  30. package/dist/tunnel/TunnelManager.js +340 -395
  31. package/dist/tunnel/TunnelManager.js.map +1 -1
  32. package/package.json +1 -1
  33. package/scripts/instar-dev-precommit.js +128 -0
  34. package/src/data/builtin-manifest.json +64 -64
  35. package/src/templates/scripts/instar-watchdog.sh +80 -3
  36. package/upgrades/1.2.36.md +111 -0
  37. package/upgrades/1.2.37.md +53 -0
  38. package/upgrades/side-effects/auto-updater-lifeline-coordination.md +199 -0
  39. package/upgrades/side-effects/tunnel-manager-rewrite.md +129 -0
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAkQH,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;2DACuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAiqDD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAyjLtE;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;AAkQH,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;2DACuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAiqDD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA4gLtE;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"}
@@ -6758,75 +6758,28 @@ export async function startServer(options) {
6758
6758
  catch { /* best-effort */ }
6759
6759
  console.log('[Housekeeping] Periodic cleanup completed');
6760
6760
  }, HOUSEKEEPING_INTERVAL_MS);
6761
- // Start tunnel AFTER server is listening (with retry on failure)
6761
+ // Start tunnel AFTER server is listening.
6762
+ //
6763
+ // The TunnelManager is now the single owner of the detect → attempt →
6764
+ // fall-back → notify lifecycle (per
6765
+ // specs/dev-infrastructure/tunnel-failure-resilience.md). The old
6766
+ // startup-retry ladder + background-retry scheduler + Lifeline
6767
+ // failure message that used to live here are RETIRED; the manager
6768
+ // handles backoff internally, schedules the post-exhausted self-heal
6769
+ // retry, and (once the notifier sink is wired in the next PR of the
6770
+ // chain) emits user-facing messages via the two-channel notifier.
6771
+ //
6772
+ // Failure on initial start is non-fatal: the manager keeps trying
6773
+ // in the background, and the post-exhausted retry timer keeps the
6774
+ // agent recoverable without requiring a server restart.
6762
6775
  if (tunnel) {
6763
- tunnel.enableAutoReconnect();
6764
- const maxRetries = 5;
6765
- let tunnelStarted = false;
6766
- for (let attempt = 1; attempt <= maxRetries; attempt++) {
6767
- try {
6768
- const tunnelUrl = await tunnel.start();
6769
- console.log(pc.green(` Tunnel active: ${pc.bold(tunnelUrl)}`));
6770
- tunnelStarted = true;
6771
- break;
6772
- }
6773
- catch (err) {
6774
- const msg = err instanceof Error ? err.message : String(err);
6775
- if (attempt < maxRetries) {
6776
- const delay = Math.min(15_000 * Math.pow(2, attempt - 1), 120_000); // 15s, 30s, 60s, 120s
6777
- console.log(pc.yellow(` Tunnel failed (attempt ${attempt}/${maxRetries}): ${msg}`));
6778
- console.log(pc.yellow(` Retrying in ${delay / 1000}s...`));
6779
- await new Promise(r => setTimeout(r, delay));
6780
- }
6781
- else {
6782
- console.error(pc.red(` Tunnel failed after ${maxRetries} attempts: ${msg}`));
6783
- }
6784
- }
6776
+ try {
6777
+ const tunnelUrl = await tunnel.start();
6778
+ console.log(pc.green(` Tunnel active: ${pc.bold(tunnelUrl)}`));
6785
6779
  }
6786
- // If tunnel didn't start, schedule background retries
6787
- if (!tunnelStarted) {
6788
- const retryIntervals = [5, 10, 20]; // minutes
6789
- console.log(pc.yellow(` Will retry tunnel in ${retryIntervals[0]} minutes...`));
6790
- const scheduleRetry = (index) => {
6791
- if (index >= retryIntervals.length)
6792
- return;
6793
- setTimeout(async () => {
6794
- try {
6795
- const tunnelUrl = await tunnel.start();
6796
- console.log(pc.green(`[tunnel] Connected: ${tunnelUrl}`));
6797
- if (tunnelUrl) {
6798
- const tunnelType = (config.tunnel?.type || 'quick');
6799
- if (telegram) {
6800
- await telegram.broadcastDashboardUrl(tunnelUrl, tunnelType).catch(() => { });
6801
- }
6802
- if (_slackAdapter) {
6803
- await _slackAdapter.broadcastDashboardUrl(tunnelUrl).catch(() => { });
6804
- }
6805
- }
6806
- }
6807
- catch (retryErr) {
6808
- const msg = retryErr instanceof Error ? retryErr.message : String(retryErr);
6809
- console.error(`[tunnel] Retry failed: ${msg}`);
6810
- if (index + 1 < retryIntervals.length) {
6811
- console.log(`[tunnel] Will retry in ${retryIntervals[index + 1]} minutes...`);
6812
- scheduleRetry(index + 1);
6813
- }
6814
- else {
6815
- console.error('[tunnel] All retries exhausted. Tunnel unavailable until server restart.');
6816
- if (telegram) {
6817
- try {
6818
- const lifelineId = telegram.getLifelineTopicId?.();
6819
- if (lifelineId) {
6820
- await telegram.sendToTopic(lifelineId, '⚠️ Tunnel failed after all retries. Dashboard link is unavailable until the server is restarted.').catch(() => { });
6821
- }
6822
- }
6823
- catch { /* best-effort notification */ }
6824
- }
6825
- }
6826
- }
6827
- }, retryIntervals[index] * 60_000);
6828
- };
6829
- scheduleRetry(0);
6780
+ catch (err) {
6781
+ const msg = err instanceof Error ? err.message : String(err);
6782
+ console.error(pc.red(` Tunnel start failed (manager will keep retrying in background): ${msg}`));
6830
6783
  }
6831
6784
  }
6832
6785
  // ── Dashboard Topic: always-available link ──────────────────────────