instar 1.3.1655 → 1.3.1657

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 (101) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +76 -1
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/core/DeliverMessageHandler.d.ts +20 -0
  5. package/dist/core/DeliverMessageHandler.d.ts.map +1 -1
  6. package/dist/core/DeliverMessageHandler.js +13 -0
  7. package/dist/core/DeliverMessageHandler.js.map +1 -1
  8. package/dist/core/GitLeaseStore.d.ts +13 -0
  9. package/dist/core/GitLeaseStore.d.ts.map +1 -1
  10. package/dist/core/GitLeaseStore.js +24 -0
  11. package/dist/core/GitLeaseStore.js.map +1 -1
  12. package/dist/core/LeaseCoordinator.d.ts +9 -0
  13. package/dist/core/LeaseCoordinator.d.ts.map +1 -1
  14. package/dist/core/LeaseCoordinator.js +41 -6
  15. package/dist/core/LeaseCoordinator.js.map +1 -1
  16. package/dist/core/PendingInboundStore.d.ts +2 -0
  17. package/dist/core/PendingInboundStore.d.ts.map +1 -1
  18. package/dist/core/PendingInboundStore.js +6 -0
  19. package/dist/core/PendingInboundStore.js.map +1 -1
  20. package/dist/core/PostUpdateMigrator.d.ts +6 -0
  21. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  22. package/dist/core/PostUpdateMigrator.js +43 -0
  23. package/dist/core/PostUpdateMigrator.js.map +1 -1
  24. package/dist/core/QueueDrainLoop.d.ts +1 -0
  25. package/dist/core/QueueDrainLoop.d.ts.map +1 -1
  26. package/dist/core/QueueDrainLoop.js +3 -0
  27. package/dist/core/QueueDrainLoop.js.map +1 -1
  28. package/dist/core/SessionManager.d.ts +6 -0
  29. package/dist/core/SessionManager.d.ts.map +1 -1
  30. package/dist/core/SessionManager.js +18 -0
  31. package/dist/core/SessionManager.js.map +1 -1
  32. package/dist/core/poolReadiness.d.ts.map +1 -1
  33. package/dist/core/poolReadiness.js +6 -2
  34. package/dist/core/poolReadiness.js.map +1 -1
  35. package/dist/core/poolTransferReason.d.ts +12 -0
  36. package/dist/core/poolTransferReason.d.ts.map +1 -0
  37. package/dist/core/poolTransferReason.js +16 -0
  38. package/dist/core/poolTransferReason.js.map +1 -0
  39. package/dist/core/roleFollowRestart.d.ts +27 -0
  40. package/dist/core/roleFollowRestart.d.ts.map +1 -0
  41. package/dist/core/roleFollowRestart.js +53 -0
  42. package/dist/core/roleFollowRestart.js.map +1 -0
  43. package/dist/core/types.d.ts +2 -0
  44. package/dist/core/types.d.ts.map +1 -1
  45. package/dist/core/types.js.map +1 -1
  46. package/dist/data/standards-guard-index.json +50 -2
  47. package/dist/data/standards-guard-index.meta.json +3 -3
  48. package/dist/data/standards-registry.md +13 -4
  49. package/dist/data/standards-registry.meta.json +3 -3
  50. package/dist/messaging/telegram-origin/TelegramOriginRuntime.d.ts +43 -0
  51. package/dist/messaging/telegram-origin/TelegramOriginRuntime.d.ts.map +1 -1
  52. package/dist/messaging/telegram-origin/TelegramOriginRuntime.js +22 -3
  53. package/dist/messaging/telegram-origin/TelegramOriginRuntime.js.map +1 -1
  54. package/dist/monitoring/DashboardInsightEngine.d.ts +6 -2
  55. package/dist/monitoring/DashboardInsightEngine.d.ts.map +1 -1
  56. package/dist/monitoring/DashboardInsightEngine.js +7 -3
  57. package/dist/monitoring/DashboardInsightEngine.js.map +1 -1
  58. package/dist/monitoring/MaturationLadder.d.ts +2 -0
  59. package/dist/monitoring/MaturationLadder.d.ts.map +1 -1
  60. package/dist/monitoring/MaturationLadder.js +5 -0
  61. package/dist/monitoring/MaturationLadder.js.map +1 -1
  62. package/dist/native/InstarWedgeCanary.app/Contents/MacOS/InstarWedgeCanary +0 -0
  63. package/dist/native/instar-desktop-host +0 -0
  64. package/dist/scaffold/templates.d.ts.map +1 -1
  65. package/dist/scaffold/templates.js +1 -0
  66. package/dist/scaffold/templates.js.map +1 -1
  67. package/dist/server/CapabilityIndex.d.ts.map +1 -1
  68. package/dist/server/CapabilityIndex.js +10 -0
  69. package/dist/server/CapabilityIndex.js.map +1 -1
  70. package/dist/server/mobilePairingRoutes.d.ts.map +1 -1
  71. package/dist/server/mobilePairingRoutes.js +16 -4
  72. package/dist/server/mobilePairingRoutes.js.map +1 -1
  73. package/dist/server/mobilePhonesMessagesRoutes.d.ts +142 -0
  74. package/dist/server/mobilePhonesMessagesRoutes.d.ts.map +1 -0
  75. package/dist/server/mobilePhonesMessagesRoutes.js +419 -0
  76. package/dist/server/mobilePhonesMessagesRoutes.js.map +1 -0
  77. package/dist/server/routes.d.ts.map +1 -1
  78. package/dist/server/routes.js +72 -4
  79. package/dist/server/routes.js.map +1 -1
  80. package/dist/users/wireMemoryPrivacy.d.ts.map +1 -1
  81. package/dist/users/wireMemoryPrivacy.js +9 -2
  82. package/dist/users/wireMemoryPrivacy.js.map +1 -1
  83. package/package.json +1 -1
  84. package/scripts/safe-merge.mjs +2 -0
  85. package/src/data/builtin-manifest.json +64 -64
  86. package/src/data/standards-guard-index.json +50 -2
  87. package/src/data/standards-guard-index.meta.json +3 -3
  88. package/src/data/standards-registry.md +13 -4
  89. package/src/data/standards-registry.meta.json +3 -3
  90. package/src/scaffold/templates.ts +1 -0
  91. package/upgrades/1.3.1656.md +46 -0
  92. package/upgrades/1.3.1657.md +38 -0
  93. package/upgrades/side-effects/lease-takeover-no-shared-medium.md +51 -0
  94. package/upgrades/side-effects/lease-takeover-role-restart.md +49 -0
  95. package/upgrades/side-effects/maturation-path-amendment.eli16.md +7 -0
  96. package/upgrades/side-effects/maturation-path-amendment.md +68 -0
  97. package/upgrades/side-effects/memory-privacy-opt-in-existing-agents.md +78 -0
  98. package/upgrades/side-effects/mobile-native-phones-messages.md +102 -0
  99. package/upgrades/side-effects/pool-reading-honesty.md +49 -0
  100. package/upgrades/side-effects/session-pool-no-silent-drop.md +48 -0
  101. package/upgrades/side-effects/test-lsfiles-buffer.md +54 -0
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"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"}
@@ -240,6 +240,7 @@ import { DispatchScopeEnforcer } from '../core/DispatchScopeEnforcer.js';
240
240
  import { TrustRecovery } from '../core/TrustRecovery.js';
241
241
  import { DegradationReporter } from '../monitoring/DegradationReporter.js';
242
242
  import { gitLeaseHasNoRemote, reportLeaseMediumSelection, selectLeaseMedium } from '../core/leaseMediumSelection.js';
243
+ import { decideRoleRestart, readLastRoleRestart, requestRoleRestart } from '../core/roleFollowRestart.js';
243
244
  import { HumanAsDetectorLog, observeInboundMessage } from '../monitoring/HumanAsDetectorLog.js';
244
245
  import { creditUsherOnMiss } from '../core/UsherActedCorrelator.js';
245
246
  import { resolveStableNodeBinary } from '../utils/resolveNodeBinary.js';
@@ -5605,7 +5606,12 @@ export async function startServer(options) {
5605
5606
  const leaseGitRef = leaseMedium.medium === 'local' ? undefined : gitSyncRef;
5606
5607
  const leaseStoreName = leaseGitRef ? 'GitLeaseStore' : 'LocalLeaseStore';
5607
5608
  coordinator.attachLeaseMediumProvider(() => ({ ...leaseMedium, store: leaseStoreName }));
5608
- if (leaseGitRef && gitLeaseHasNoRemote(config.projectDir) === true) {
5609
+ // Read live: a peer can join and a preferred machine can be named without a restart.
5610
+ const survivorMayHold = () => !config.multiMachine?.leaseSelfHeal?.preferredAwakeMachineId
5611
+ && Object.entries(idMgr.loadRegistry().machines ?? {}).some(([id, entry]) => id !== selfMachineId && !entry.revokedAt);
5612
+ const takeoverFixOn = !!config.multiMachine?.leaseSelfHeal?.soloCaptainHold?.enabled
5613
+ && !config.multiMachine?.leaseSelfHeal?.preferredAwakeMachineId;
5614
+ if (leaseGitRef && !takeoverFixOn && gitLeaseHasNoRemote(config.projectDir) === true) {
5609
5615
  _takeoverReadiness = { state: 'failing', reason: 'this machine uses the git lease with no git remote, so it cannot take over' };
5610
5616
  }
5611
5617
  try {
@@ -5646,6 +5652,8 @@ export async function startServer(options) {
5646
5652
  registryAbsPath: idMgr.registryPath,
5647
5653
  pullRebase: () => gs.pullRebase(),
5648
5654
  commitAndPush: (msg, paths) => gs.commitAndPush(msg, paths),
5655
+ localCommitIsFinal: () => !!config.multiMachine?.leaseSelfHeal?.soloCaptainHold?.enabled
5656
+ && survivorMayHold() && gitLeaseHasNoRemote(config.projectDir) === true,
5649
5657
  logger: (m) => console.log(pc.dim(m)),
5650
5658
  });
5651
5659
  }
@@ -5822,6 +5830,7 @@ export async function startServer(options) {
5822
5830
  return !!pref && pref === selfMachineId;
5823
5831
  },
5824
5832
  allPeersPresumedGone: leaseLiveness.allPeersPresumedGone,
5833
+ survivorMayHold,
5825
5834
  onSelfSuspend: (reason) => console.log(pc.yellow(` [lease] self-suspend: ${reason}`)),
5826
5835
  onEscalate: (info) => console.log(pc.yellow(` [lease] split-brain escalation: ${info.reason} (holder ${info.holder})`)),
5827
5836
  logger: (m) => console.log(pc.dim(m)),
@@ -6519,6 +6528,10 @@ export async function startServer(options) {
6519
6528
  };
6520
6529
  sessionManager.on('sessionComplete', (session) => sessionManager.releaseMemorySession(session));
6521
6530
  await _memoryWiring.ready.catch((err) => console.error('[memory-privacy] boot probe failed; scoped conversations stay refused:', err));
6531
+ await sessionManager.retireBoundedSessionsWhenPrivacyOff()
6532
+ .then((names) => { if (names.length)
6533
+ console.log(`[memory-privacy] off: ended ${names.length} bounded session(s)`); })
6534
+ .catch((err) => console.error('[memory-privacy] could not end bounded sessions:', err));
6522
6535
  // Native hook events (docs/specs/native-hook-events.md D4): reconcile the
6523
6536
  // reporter entries in .claude/settings.json to this machine's decision at
6524
6537
  // boot (a flag flip takes effect at the next restart, not the next
@@ -7742,6 +7755,44 @@ export async function startServer(options) {
7742
7755
  console.log(pc.green(' Permission-Prompt Auto-Resolver: enabled (always-on safety floor)'));
7743
7756
  }
7744
7757
  let scheduler;
7758
+ // lease-takeover-role-restart: the scheduler below exists only on a machine awake at boot,
7759
+ // so a role change restarts once and this same path builds what the new role needs.
7760
+ // Losing authority stops jobs NOW, whatever a restart is waiting on: a throttled restart
7761
+ // must never mean jobs running in two places.
7762
+ const bootAwake = coordinator.isAwake;
7763
+ const reconcileRole = () => {
7764
+ try {
7765
+ const nowAwake = coordinator.isAwake;
7766
+ if (nowAwake === bootAwake)
7767
+ return;
7768
+ const lease = config.multiMachine?.leaseSelfHeal;
7769
+ const peer = Object.entries(coordinator.managers.identityManager.loadRegistry().machines ?? {})
7770
+ .some(([id, entry]) => id !== coordinator.identity?.machineId && !entry.revokedAt);
7771
+ const decision = decideRoleRestart({
7772
+ applies: !!lease?.soloCaptainHold?.enabled && !lease?.preferredAwakeMachineId && peer,
7773
+ bootAwake, nowAwake, lastRestartAtMs: readLastRoleRestart(config.stateDir), nowMs: Date.now(),
7774
+ });
7775
+ if (decision === 'restart') {
7776
+ console.log(pc.yellow(` [lease] role is now ${coordinator.role}: restarting once so boot builds what it needs`));
7777
+ requestRoleRestart({ stateDir: config.stateDir }, nowAwake);
7778
+ }
7779
+ }
7780
+ catch (err) {
7781
+ console.warn(` [lease] role restart check failed: ${err instanceof Error ? err.message : String(err)}`); // @silent-fallback-ok: logged, and the timer below retries
7782
+ }
7783
+ };
7784
+ coordinator.on('roleChange', (_from, to) => {
7785
+ const lease = config.multiMachine?.leaseSelfHeal;
7786
+ if (lease?.soloCaptainHold?.enabled && !lease?.preferredAwakeMachineId) {
7787
+ if (to === 'awake')
7788
+ scheduler?.resume();
7789
+ else
7790
+ scheduler?.pause();
7791
+ }
7792
+ reconcileRole();
7793
+ });
7794
+ // A change inside the restart window, or a failed request, is retried until the role matches.
7795
+ setInterval(reconcileRole, 60_000).unref?.();
7745
7796
  if (config.scheduler.enabled && coordinator.isAwake) {
7746
7797
  scheduler = new JobScheduler(config.scheduler, sessionManager, state, config.stateDir);
7747
7798
  scheduler.notifyDestinationHasOtherReaders = (job) => {
@@ -25387,6 +25438,30 @@ export async function startServer(options) {
25387
25438
  deliverSeenFallback.add(messageId);
25388
25439
  return true;
25389
25440
  },
25441
+ // session-pool-no-silent-drop: mirrors every silent return in onAccepted below.
25442
+ // A dashboard start needs no channel. Anything else needs the pool on and the
25443
+ // channel it belongs to, or it would be acked here and lost.
25444
+ refusal: {
25445
+ canServe: (cmd) => {
25446
+ if (parseDashboardCreatePayload(cmd.payload) && typeof cmd.messageId === 'string'
25447
+ && cmd.messageId.startsWith(`dashboard-create:${cmd.session}:`))
25448
+ return true;
25449
+ if (_sessionPoolStage() === 'dark')
25450
+ return false;
25451
+ return isSlackSessionKey(cmd.session) ? !!_slackInboundDispatch : !!telegram;
25452
+ },
25453
+ alreadyReceived: (messageId, session) => {
25454
+ try {
25455
+ if (_inboundQueue)
25456
+ return _inboundQueue.hasRemoteReceipt(session, messageId);
25457
+ }
25458
+ catch { /* @silent-fallback-ok — unreadable receipts fall through to the next tier */ }
25459
+ if (messageLedger)
25460
+ return messageLedger.get(messageId) !== null;
25461
+ return deliverSeenFallback.has(messageId);
25462
+ },
25463
+ onCannotServe: (cmd) => console.warn(` [session-pool] refused forwarded message for ${cmd.session}: this machine cannot serve it (stage ${_sessionPoolStage()})`),
25464
+ },
25390
25465
  // §3.4 sender re-validation, hardened by the §2.D wiring gate: a carried
25391
25466
  // envelope whose userId no longer resolves on THIS machine NACKs
25392
25467
  // `sender-rejected` — BUT the gate never arms against a degenerate /