instar 1.3.604 → 1.3.606

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 (65) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +104 -0
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/config/ConfigDefaults.d.ts.map +1 -1
  5. package/dist/config/ConfigDefaults.js +28 -0
  6. package/dist/config/ConfigDefaults.js.map +1 -1
  7. package/dist/core/AutonomousSessions.d.ts +24 -0
  8. package/dist/core/AutonomousSessions.d.ts.map +1 -1
  9. package/dist/core/AutonomousSessions.js +22 -0
  10. package/dist/core/AutonomousSessions.js.map +1 -1
  11. package/dist/core/PostUpdateMigrator.d.ts +13 -0
  12. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  13. package/dist/core/PostUpdateMigrator.js +101 -0
  14. package/dist/core/PostUpdateMigrator.js.map +1 -1
  15. package/dist/core/devGatedFeatures.d.ts.map +1 -1
  16. package/dist/core/devGatedFeatures.js +6 -0
  17. package/dist/core/devGatedFeatures.js.map +1 -1
  18. package/dist/core/types.d.ts +49 -0
  19. package/dist/core/types.d.ts.map +1 -1
  20. package/dist/core/types.js.map +1 -1
  21. package/dist/feedback-factory/processing/FeedbackProcessingService.d.ts +70 -0
  22. package/dist/feedback-factory/processing/FeedbackProcessingService.d.ts.map +1 -0
  23. package/dist/feedback-factory/processing/FeedbackProcessingService.js +74 -0
  24. package/dist/feedback-factory/processing/FeedbackProcessingService.js.map +1 -0
  25. package/dist/feedback-factory/store/JsonlFeedbackStore.d.ts +34 -0
  26. package/dist/feedback-factory/store/JsonlFeedbackStore.d.ts.map +1 -1
  27. package/dist/feedback-factory/store/JsonlFeedbackStore.js +59 -0
  28. package/dist/feedback-factory/store/JsonlFeedbackStore.js.map +1 -1
  29. package/dist/monitoring/AutonomousProgressHeartbeat.d.ts +169 -0
  30. package/dist/monitoring/AutonomousProgressHeartbeat.d.ts.map +1 -0
  31. package/dist/monitoring/AutonomousProgressHeartbeat.js +296 -0
  32. package/dist/monitoring/AutonomousProgressHeartbeat.js.map +1 -0
  33. package/dist/monitoring/ProxyCoordinator.d.ts +1 -1
  34. package/dist/monitoring/ProxyCoordinator.d.ts.map +1 -1
  35. package/dist/monitoring/autonomousHeartbeatScrub.d.ts +44 -0
  36. package/dist/monitoring/autonomousHeartbeatScrub.d.ts.map +1 -0
  37. package/dist/monitoring/autonomousHeartbeatScrub.js +81 -0
  38. package/dist/monitoring/autonomousHeartbeatScrub.js.map +1 -0
  39. package/dist/monitoring/sentinelWiring.d.ts +14 -0
  40. package/dist/monitoring/sentinelWiring.d.ts.map +1 -1
  41. package/dist/monitoring/sentinelWiring.js +19 -0
  42. package/dist/monitoring/sentinelWiring.js.map +1 -1
  43. package/dist/scaffold/templates.d.ts.map +1 -1
  44. package/dist/scaffold/templates.js +12 -0
  45. package/dist/scaffold/templates.js.map +1 -1
  46. package/dist/server/AgentServer.d.ts +5 -0
  47. package/dist/server/AgentServer.d.ts.map +1 -1
  48. package/dist/server/AgentServer.js +34 -0
  49. package/dist/server/AgentServer.js.map +1 -1
  50. package/dist/server/CapabilityIndex.d.ts.map +1 -1
  51. package/dist/server/CapabilityIndex.js +21 -0
  52. package/dist/server/CapabilityIndex.js.map +1 -1
  53. package/dist/server/routes.d.ts +4 -0
  54. package/dist/server/routes.d.ts.map +1 -1
  55. package/dist/server/routes.js +45 -0
  56. package/dist/server/routes.js.map +1 -1
  57. package/package.json +1 -1
  58. package/src/data/builtin-manifest.json +64 -64
  59. package/src/scaffold/templates/jobs/instar/feedback-factory-process.md +35 -0
  60. package/src/scaffold/templates.ts +12 -0
  61. package/upgrades/1.3.605.md +29 -0
  62. package/upgrades/1.3.606.md +28 -0
  63. package/upgrades/side-effects/autonomous-progress-heartbeat-ratchet-fix.md +36 -0
  64. package/upgrades/side-effects/autonomous-progress-heartbeat.md +40 -0
  65. package/upgrades/side-effects/feedback-processor-job.md +60 -0
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAoCH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAS3D,OAAO,EAAE,eAAe,EAAiC,MAAM,iCAAiC,CAAC;AAwBjG,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAkH7D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAsBtD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC1C,OAAO,CAUT;AAyID,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;2DACuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAg4CD,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,eAAe,EACzB,cAAc,EAAE,cAAc,EAC9B,YAAY,CAAC,EAAE,YAAY,EAC3B,WAAW,CAAC,EAAE,WAAW,EACzB,WAAW,CAAC,EAAE,WAAW,EACzB,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EAGvE,UAAU,CAAC,EAAE,MAAM,OAAO,8BAA8B,EAAE,WAAW,GAAG,IAAI,EAK5E,qBAAqB,CAAC,EAAE,MAAM,OAAO,gCAAgC,EAAE,kBAAkB,GAAG,IAAI,EAKhG,mBAAmB,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,GACpD,IAAI,CA8eN;AA2lBD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAo4dtE;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;AAoCH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAS3D,OAAO,EAAE,eAAe,EAAiC,MAAM,iCAAiC,CAAC;AAwBjG,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAkH7D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAsBtD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC1C,OAAO,CAUT;AAyID,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;2DACuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAg4CD,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,eAAe,EACzB,cAAc,EAAE,cAAc,EAC9B,YAAY,CAAC,EAAE,YAAY,EAC3B,WAAW,CAAC,EAAE,WAAW,EACzB,WAAW,CAAC,EAAE,WAAW,EACzB,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EAGvE,UAAU,CAAC,EAAE,MAAM,OAAO,8BAA8B,EAAE,WAAW,GAAG,IAAI,EAK5E,qBAAqB,CAAC,EAAE,MAAM,OAAO,gCAAgC,EAAE,kBAAkB,GAAG,IAAI,EAKhG,mBAAmB,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,GACpD,IAAI,CA8eN;AA2lBD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAq/dtE;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"}
@@ -8841,6 +8841,11 @@ export async function startServer(options) {
8841
8841
  let socketRecoveryActive;
8842
8842
  let silenceRecoveryActive;
8843
8843
  let wedgeRecoveryActive;
8844
+ // Lifted out of the trio block so AutonomousProgressHeartbeat (wired later,
8845
+ // near PromiseBeacon) can read ActiveWorkSilenceSentinel's ALREADY-COMPUTED
8846
+ // lastOutputAt snapshot (predicate #8 — a shared/cached read, never its own
8847
+ // tmux capture). undefined when the silence sentinel is disabled.
8848
+ let sharedOutputTracker;
8844
8849
  {
8845
8850
  const { SocketDisconnectSentinel } = await import('../monitoring/SocketDisconnectSentinel.js');
8846
8851
  const { ActiveWorkSilenceSentinel } = await import('../monitoring/ActiveWorkSilenceSentinel.js');
@@ -8894,6 +8899,9 @@ export async function startServer(options) {
8894
8899
  const silenceCfg = config.monitoring?.activeWorkSilenceSentinel ?? { enabled: true };
8895
8900
  if (silenceCfg.enabled !== false) {
8896
8901
  const tracker = new OutputActivityTracker(sessionSurface);
8902
+ // Share this tracker's snapshot with AutonomousProgressHeartbeat
8903
+ // (predicate #8 reads its lastOutputAt — never its own capture).
8904
+ sharedOutputTracker = tracker;
8897
8905
  // Auto-heal ladder (DARK, off by default): when a confirmed-silent session
8898
8906
  // can't be nudged back, respawn it fresh (conversation preserved via
8899
8907
  // --resume) instead of only asking the user. Gated by autoRecover; the
@@ -10404,6 +10412,102 @@ export async function startServer(options) {
10404
10412
  });
10405
10413
  promiseBeacon.start();
10406
10414
  globalThis.__instarPromiseBeacon = promiseBeacon;
10415
+ // ── AutonomousProgressHeartbeat ──────────────────────────────────
10416
+ // Hedged, change-gated, sparse liveness BACKSTOP for an autonomous run
10417
+ // gone silent-to-user while its terminal output is STILL changing. NOT
10418
+ // the suppressed PromiseBeacon §B1 filler — much higher bar (long
10419
+ // user-silence gate + corroborated recent output change from
10420
+ // ActiveWorkSilenceSentinel's shared snapshot + per-topic cooldown +
10421
+ // widening per-run backoff + hard cap + the shared one-voice lease).
10422
+ // DEV-GATED dark: enabled via resolveDevAgentGate (LIVE on a dev agent,
10423
+ // DARK on the fleet); dryRun defaults true (would-emit log, no send).
10424
+ // Spec: docs/specs/autonomous-progress-heartbeat.md.
10425
+ try {
10426
+ const ahRawCfg = config.monitoring?.autonomousHeartbeat ?? {};
10427
+ const ahEnabled = resolveDevAgentGate(ahRawCfg.enabled, config);
10428
+ if (ahEnabled && telegram) {
10429
+ const { AutonomousProgressHeartbeat } = await import('../monitoring/AutonomousProgressHeartbeat.js');
10430
+ const { activeAutonomousJobs, autonomousRunRemainingForTopic, readAutonomousRunMarkers, } = await import('../core/AutonomousSessions.js');
10431
+ const { ParallelActivityIndex: AHParallelActivityIndex } = await import('../core/ParallelActivityIndex.js');
10432
+ // Own ParallelActivityIndex (focus source) — fetched ONCE per tick
10433
+ // and indexed by topic inside the deps closure.
10434
+ const ahActivityIndex = new AHParallelActivityIndex({ stateDir: config.stateDir });
10435
+ const localTelegram2 = telegram;
10436
+ const autonomousHeartbeat = new AutonomousProgressHeartbeat({
10437
+ listActiveAutonomousRuns: () => {
10438
+ const out = [];
10439
+ const now = Date.now();
10440
+ for (const job of activeAutonomousJobs(config.stateDir)) {
10441
+ if (job.topic == null)
10442
+ continue; // legacy single-file job has no topic
10443
+ const remaining = autonomousRunRemainingForTopic(config.stateDir, job.topic, now);
10444
+ if (!remaining)
10445
+ continue;
10446
+ const topicId = Number(job.topic);
10447
+ if (!Number.isFinite(topicId))
10448
+ continue;
10449
+ out.push({
10450
+ topicId,
10451
+ sessionName: localTelegram2.getSessionForTopic(topicId) ?? null,
10452
+ remainingSeconds: remaining.remainingSeconds,
10453
+ });
10454
+ }
10455
+ return out;
10456
+ },
10457
+ getRunMarkers: (topicId) => readAutonomousRunMarkers(config.stateDir, topicId),
10458
+ isSessionAlive: (name) => sessionManager.isSessionAlive(name),
10459
+ getTopicHistory: (topicId) => localTelegram2.getTopicHistory(topicId, 50).map((e) => ({
10460
+ fromUser: e.fromUser,
10461
+ at: new Date(e.timestamp).getTime(),
10462
+ })),
10463
+ // Predicate #8 — read ActiveWorkSilenceSentinel's ALREADY-computed
10464
+ // snapshot (the shared OutputActivityTracker). NEVER a capture.
10465
+ // undefined when the silence sentinel is disabled → fails closed.
10466
+ getSharedLastOutputAt: (name) => sharedOutputTracker ? sharedOutputTracker.lastOutputAtFor(name) : null,
10467
+ getFocusForTopic: (() => {
10468
+ // Index the cross-topic activities ONCE per tick (O(1)/topic).
10469
+ let cachedAt = 0;
10470
+ let cache = new Map();
10471
+ return (topicId) => {
10472
+ const now = Date.now();
10473
+ if (now - cachedAt > 5_000) {
10474
+ cache = new Map(ahActivityIndex.activities(now).map((a) => [a.topicId, a.focus]));
10475
+ cachedAt = now;
10476
+ }
10477
+ return cache.get(topicId) ?? null;
10478
+ };
10479
+ })(),
10480
+ proxyCoordinator,
10481
+ sendMessage: async (topicId, text, metadata) => {
10482
+ const url = `http://localhost:${config.port}/telegram/reply/${topicId}`;
10483
+ const response = await fetch(url, {
10484
+ method: 'POST',
10485
+ headers: {
10486
+ 'Content-Type': 'application/json',
10487
+ 'Authorization': `Bearer ${config.authToken}`,
10488
+ },
10489
+ body: JSON.stringify({ text, metadata }),
10490
+ });
10491
+ if (!response.ok)
10492
+ throw new Error(`Autonomous-heartbeat reply failed: ${response.status}`);
10493
+ },
10494
+ }, {
10495
+ enabled: true, // gate already resolved above
10496
+ dryRun: ahRawCfg.dryRun !== false,
10497
+ silenceThresholdMinutes: ahRawCfg.silenceThresholdMinutes,
10498
+ tickIntervalMs: ahRawCfg.tickIntervalMs,
10499
+ maxHeartbeatsPerRun: ahRawCfg.maxHeartbeatsPerRun,
10500
+ recentOutputChangeWindowMs: ahRawCfg.recentOutputChangeWindowMs,
10501
+ });
10502
+ autonomousHeartbeat.start();
10503
+ globalThis.__instarAutonomousHeartbeat = autonomousHeartbeat;
10504
+ guardRegistry.register('monitoring.autonomousHeartbeat.enabled', () => autonomousHeartbeat.guardStatus());
10505
+ console.log(pc.green(` AutonomousProgressHeartbeat enabled (silence backstop — ${(ahRawCfg.dryRun !== false) ? 'dry-run observe-only' : 'LIVE'})`));
10506
+ }
10507
+ }
10508
+ catch (err) {
10509
+ console.warn('[AutonomousProgressHeartbeat] init failed (non-fatal):', err.message);
10510
+ }
10407
10511
  // ── "keep watching" resume detector ─────────────────────────────
10408
10512
  // When a user replies on a topic that has any auto-paused beacons,
10409
10513
  // a literal "keep watching" match resumes them. Brittle detector