instar 1.3.843 → 1.3.845

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/dashboard/subscriptions.js +4 -0
  2. package/dist/commands/server.d.ts.map +1 -1
  3. package/dist/commands/server.js +32 -0
  4. package/dist/commands/server.js.map +1 -1
  5. package/dist/monitoring/ResumeQueue.d.ts +6 -0
  6. package/dist/monitoring/ResumeQueue.d.ts.map +1 -1
  7. package/dist/monitoring/ResumeQueue.js +7 -2
  8. package/dist/monitoring/ResumeQueue.js.map +1 -1
  9. package/dist/monitoring/ResumeQueueDrainer.d.ts +4 -0
  10. package/dist/monitoring/ResumeQueueDrainer.d.ts.map +1 -1
  11. package/dist/monitoring/ResumeQueueDrainer.js +14 -0
  12. package/dist/monitoring/ResumeQueueDrainer.js.map +1 -1
  13. package/dist/server/routes.d.ts.map +1 -1
  14. package/dist/server/routes.js +60 -1
  15. package/dist/server/routes.js.map +1 -1
  16. package/dist/threadline/ListenerSessionManager.d.ts +26 -0
  17. package/dist/threadline/ListenerSessionManager.d.ts.map +1 -1
  18. package/dist/threadline/ListenerSessionManager.js +115 -1
  19. package/dist/threadline/ListenerSessionManager.js.map +1 -1
  20. package/dist/threadline/ThreadlineMCPServer.d.ts +2 -0
  21. package/dist/threadline/ThreadlineMCPServer.d.ts.map +1 -1
  22. package/dist/threadline/ThreadlineMCPServer.js +2 -0
  23. package/dist/threadline/ThreadlineMCPServer.js.map +1 -1
  24. package/dist/threadline/ThreadlineReapRecovery.d.ts +12 -0
  25. package/dist/threadline/ThreadlineReapRecovery.d.ts.map +1 -0
  26. package/dist/threadline/ThreadlineReapRecovery.js +60 -0
  27. package/dist/threadline/ThreadlineReapRecovery.js.map +1 -0
  28. package/dist/threadline/ThreadlineRouter.d.ts.map +1 -1
  29. package/dist/threadline/ThreadlineRouter.js +5 -2
  30. package/dist/threadline/ThreadlineRouter.js.map +1 -1
  31. package/dist/threadline/mcp-http-client.d.ts.map +1 -1
  32. package/dist/threadline/mcp-http-client.js +1 -0
  33. package/dist/threadline/mcp-http-client.js.map +1 -1
  34. package/package.json +1 -1
  35. package/src/data/builtin-manifest.json +46 -46
  36. package/upgrades/1.3.844.md +24 -0
  37. package/upgrades/1.3.845.md +21 -0
  38. package/upgrades/side-effects/enrollment-completion-drift-clear-lag.md +36 -0
  39. package/upgrades/side-effects/threadline-warm-reap-redrive.md +91 -0
@@ -561,6 +561,10 @@ export function buildMatrixModel(poolScope, pendingScope, transient = {}) {
561
561
  else if (cellStatus.get(key) === 'needs-reauth' && pendingLogin && pendingLogin.paneAlive === false) state = 'broken';
562
562
  else if (cellStatus.get(key) === 'needs-reauth' && pendingLogin) state = 'in-progress';
563
563
  else if (t && t.state === 'expired') state = 'expired';
564
+ // A validated completion is newer evidence than the pool snapshot that
565
+ // still says needs-reauth/identity-drifted. Keep the success ceremony
566
+ // visible while the targeted post-login verification catches the row up.
567
+ else if (t && t.state === 'just-verified' && cellStatus.get(key) === 'needs-reauth') state = 'just-verified';
564
568
  else if (cellStatus.get(key) === 'needs-reauth') state = 'needs-reauth';
565
569
  else if (cellStatus.get(key) === 'active') state = 'active';
566
570
  else if ((pendingLogin && pendingLogin.paneAlive === false) || (t && t.state === 'broken')) state = 'broken';
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA0DH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAU3D,OAAO,EAAE,eAAe,EAAiC,MAAM,iCAAiC,CAAC;AA0BjG,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AA6H7D,OAAO,KAAK,EAAW,oBAAoB,EAAe,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAgFtD;;;;;;;;;;;;;;;;;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;AAqoDD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,oBAAoB,GAAG,IAAI,GACxC;IACD,YAAY,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB,CAqBA;AAED,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,EAQrD,oBAAoB,CAAC,EAAE,MAAM;IAC3B,YAAY,EAAE,OAAO,kBAAkB,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,GACP,IAAI,CAssBN;AAgmBD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA8/nBtE;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;AA0DH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAU3D,OAAO,EAAE,eAAe,EAAiC,MAAM,iCAAiC,CAAC;AA0BjG,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AA6H7D,OAAO,KAAK,EAAW,oBAAoB,EAAe,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAgFtD;;;;;;;;;;;;;;;;;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;AAqoDD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,oBAAoB,GAAG,IAAI,GACxC;IACD,YAAY,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB,CAqBA;AAED,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,EAQrD,oBAAoB,CAAC,EAAE,MAAM;IAC3B,YAAY,EAAE,OAAO,kBAAkB,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,GACP,IAAI,CAssBN;AAgmBD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA8hoBtE;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"}
@@ -8387,6 +8387,17 @@ export async function startServer(options) {
8387
8387
  const rqCfg = config.monitoring?.resumeQueue ?? {};
8388
8388
  let resumeQueue = null;
8389
8389
  let resumeDrainer = null;
8390
+ // Constructed later in boot than the resume queue. These late-bound refs let
8391
+ // the queue's callbacks recover an unbound warm Threadline worker without
8392
+ // weakening boot ordering or inventing a second recovery loop.
8393
+ let threadlineRouterForResume = null;
8394
+ let listenerManagerForResume = null;
8395
+ const { createThreadlineReapRecovery } = await import('../threadline/ThreadlineReapRecovery.js');
8396
+ const threadlineReapRecovery = createThreadlineReapRecovery({
8397
+ localAgent: config.projectName,
8398
+ manager: () => listenerManagerForResume,
8399
+ router: () => threadlineRouterForResume,
8400
+ });
8390
8401
  let autonomousLivenessReconciler = null;
8391
8402
  let enforcedTerminationWatchdog = null;
8392
8403
  let prHandLease = null;
@@ -8670,6 +8681,8 @@ export async function startServer(options) {
8670
8681
  throw new Error('telegram adapter not available');
8671
8682
  return await spawnSessionForTopic(sessionManager, telegram, entry.sessionName, entry.topicId, continuationPrompt, topicMemory, undefined, undefined, undefined, { cwd: entry.worktreePath ?? entry.cwd });
8672
8683
  },
8684
+ threadlineMessagePending: threadlineReapRecovery.pending,
8685
+ respawnThread: threadlineReapRecovery.respawn,
8673
8686
  triggerJob: async (slug) => {
8674
8687
  if (!scheduler)
8675
8688
  return 'skipped';
@@ -9336,6 +9349,21 @@ export async function startServer(options) {
9336
9349
  // a throw fails toward NO injection (status-quo no-revive), never a spawn.
9337
9350
  let candidateReason = e.reason;
9338
9351
  let candidateWorkEvidence = e.workEvidence ?? [];
9352
+ const threadMatch = threadResumeMap.getBySessionName(e.session.tmuxSession)[0];
9353
+ const threadInbound = threadMatch && listenerManagerForResume
9354
+ ? listenerManagerForResume.readLatestCanonicalInboxForThread(threadMatch.threadId)
9355
+ : null;
9356
+ const unsettledThreadInbound = threadInbound && listenerManagerForResume
9357
+ && !listenerManagerForResume.hasCanonicalReplyFor(threadInbound.threadId, threadInbound.id)
9358
+ ? threadInbound
9359
+ : null;
9360
+ if (unsettledThreadInbound) {
9361
+ // The durable canonical inbound plus absence of a later outbound is
9362
+ // direct evidence that an injected turn still needs completion.
9363
+ // Reuse the existing strong `pending-injection` vocabulary so an
9364
+ // unbound A2A worker is eligible without relaxing weak-evidence rules.
9365
+ candidateWorkEvidence = [...candidateWorkEvidence, 'pending-injection'];
9366
+ }
9339
9367
  if (e.reason === 'age-limit' &&
9340
9368
  topicId != null &&
9341
9369
  autonomousRunRemainingForTopic(config.stateDir, topicId) != null) {
@@ -9359,6 +9387,8 @@ export async function startServer(options) {
9359
9387
  sessionName: e.session.name,
9360
9388
  tmuxSession: e.session.tmuxSession,
9361
9389
  topicId,
9390
+ threadId: unsettledThreadInbound?.threadId,
9391
+ threadlineMessageId: unsettledThreadInbound?.id,
9362
9392
  jobSlug: e.session.jobSlug,
9363
9393
  jobResumeOptIn: jobDef?.resumeOnReap === true,
9364
9394
  resumeUuid: topicId != null ? (_topicResumeMap?.get(topicId) ?? null) : null,
@@ -14759,6 +14789,7 @@ export async function startServer(options) {
14759
14789
  undefined, // nowFn
14760
14790
  warmSessionPool, // Warm-Session A2A (null when disabled)
14761
14791
  warmEnabled, warmTrustFloor, warmEnabled ? killWarmSessionByName : null);
14792
+ threadlineRouterForResume = threadlineRouter;
14762
14793
  // Warm-Session A2A reap tick — kill warm sessions idle past their TTL so a
14763
14794
  // flood can't pin processes. Gated on warmEnabled; .unref() so it never holds
14764
14795
  // the process open; cleared on shutdown. Eviction is lossless (the next
@@ -14896,6 +14927,7 @@ export async function startServer(options) {
14896
14927
  const listenerManager = config.threadline?.relayEnabled
14897
14928
  ? new ListenerSessionManager(config.stateDir, config.authToken ?? '', config.threadline)
14898
14929
  : null;
14930
+ listenerManagerForResume = listenerManager;
14899
14931
  // A2A Delivery Tracker — durable per-peer delivery lifecycle + peer-health
14900
14932
  // ("communications never just die out", A2A-DURABLE-DELIVERY-SPEC.md / #939).
14901
14933
  // Recording-only: it never gates a send. Always constructed (cheap SQLite,