instar 1.3.91 → 1.3.92

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 (141) hide show
  1. package/.claude/skills/autonomous/hooks/autonomous-stop-hook.sh +17 -0
  2. package/dashboard/index.html +108 -0
  3. package/dist/commands/server.d.ts.map +1 -1
  4. package/dist/commands/server.js +207 -1
  5. package/dist/commands/server.js.map +1 -1
  6. package/dist/config/ConfigDefaults.d.ts.map +1 -1
  7. package/dist/config/ConfigDefaults.js +30 -0
  8. package/dist/config/ConfigDefaults.js.map +1 -1
  9. package/dist/config/LiveConfig.d.ts +3 -1
  10. package/dist/config/LiveConfig.d.ts.map +1 -1
  11. package/dist/config/LiveConfig.js +4 -1
  12. package/dist/config/LiveConfig.js.map +1 -1
  13. package/dist/config/stageWriteGuard.d.ts +23 -0
  14. package/dist/config/stageWriteGuard.d.ts.map +1 -0
  15. package/dist/config/stageWriteGuard.js +33 -0
  16. package/dist/config/stageWriteGuard.js.map +1 -0
  17. package/dist/core/DeliverMessageHandler.d.ts +33 -0
  18. package/dist/core/DeliverMessageHandler.d.ts.map +1 -0
  19. package/dist/core/DeliverMessageHandler.js +34 -0
  20. package/dist/core/DeliverMessageHandler.js.map +1 -0
  21. package/dist/core/LeaseCoordinator.d.ts +39 -2
  22. package/dist/core/LeaseCoordinator.d.ts.map +1 -1
  23. package/dist/core/LeaseCoordinator.js +45 -9
  24. package/dist/core/LeaseCoordinator.js.map +1 -1
  25. package/dist/core/MachineIdentity.d.ts +28 -1
  26. package/dist/core/MachineIdentity.d.ts.map +1 -1
  27. package/dist/core/MachineIdentity.js +81 -1
  28. package/dist/core/MachineIdentity.js.map +1 -1
  29. package/dist/core/MachineLoadBroker.d.ts +94 -0
  30. package/dist/core/MachineLoadBroker.d.ts.map +1 -0
  31. package/dist/core/MachineLoadBroker.js +87 -0
  32. package/dist/core/MachineLoadBroker.js.map +1 -0
  33. package/dist/core/MachinePoolRegistry.d.ts +94 -0
  34. package/dist/core/MachinePoolRegistry.d.ts.map +1 -0
  35. package/dist/core/MachinePoolRegistry.js +150 -0
  36. package/dist/core/MachinePoolRegistry.js.map +1 -0
  37. package/dist/core/MeshRpc.d.ts +165 -0
  38. package/dist/core/MeshRpc.d.ts.map +1 -0
  39. package/dist/core/MeshRpc.js +156 -0
  40. package/dist/core/MeshRpc.js.map +1 -0
  41. package/dist/core/MeshRpcClient.d.ts +59 -0
  42. package/dist/core/MeshRpcClient.d.ts.map +1 -0
  43. package/dist/core/MeshRpcClient.js +58 -0
  44. package/dist/core/MeshRpcClient.js.map +1 -0
  45. package/dist/core/MultiMachineCoordinator.d.ts +11 -0
  46. package/dist/core/MultiMachineCoordinator.d.ts.map +1 -1
  47. package/dist/core/MultiMachineCoordinator.js +13 -0
  48. package/dist/core/MultiMachineCoordinator.js.map +1 -1
  49. package/dist/core/NicknameAssigner.d.ts +51 -0
  50. package/dist/core/NicknameAssigner.d.ts.map +1 -0
  51. package/dist/core/NicknameAssigner.js +91 -0
  52. package/dist/core/NicknameAssigner.js.map +1 -0
  53. package/dist/core/NicknameCommand.d.ts +28 -0
  54. package/dist/core/NicknameCommand.d.ts.map +1 -0
  55. package/dist/core/NicknameCommand.js +69 -0
  56. package/dist/core/NicknameCommand.js.map +1 -0
  57. package/dist/core/PlacementExecutor.d.ts +71 -0
  58. package/dist/core/PlacementExecutor.d.ts.map +1 -0
  59. package/dist/core/PlacementExecutor.js +156 -0
  60. package/dist/core/PlacementExecutor.js.map +1 -0
  61. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  62. package/dist/core/PostUpdateMigrator.js +21 -0
  63. package/dist/core/PostUpdateMigrator.js.map +1 -1
  64. package/dist/core/RebalancePlanner.d.ts +48 -0
  65. package/dist/core/RebalancePlanner.d.ts.map +1 -0
  66. package/dist/core/RebalancePlanner.js +71 -0
  67. package/dist/core/RebalancePlanner.js.map +1 -0
  68. package/dist/core/SessionOwnership.d.ts +103 -0
  69. package/dist/core/SessionOwnership.d.ts.map +1 -0
  70. package/dist/core/SessionOwnership.js +0 -0
  71. package/dist/core/SessionOwnership.js.map +1 -0
  72. package/dist/core/SessionOwnershipRegistry.d.ts +115 -0
  73. package/dist/core/SessionOwnershipRegistry.d.ts.map +1 -0
  74. package/dist/core/SessionOwnershipRegistry.js +128 -0
  75. package/dist/core/SessionOwnershipRegistry.js.map +1 -0
  76. package/dist/core/SessionPoolE2EResultStore.d.ts +45 -0
  77. package/dist/core/SessionPoolE2EResultStore.d.ts.map +1 -0
  78. package/dist/core/SessionPoolE2EResultStore.js +66 -0
  79. package/dist/core/SessionPoolE2EResultStore.js.map +1 -0
  80. package/dist/core/SessionRouter.d.ts +95 -0
  81. package/dist/core/SessionRouter.d.ts.map +1 -0
  82. package/dist/core/SessionRouter.js +151 -0
  83. package/dist/core/SessionRouter.js.map +1 -0
  84. package/dist/core/StageAdvancer.d.ts +47 -0
  85. package/dist/core/StageAdvancer.d.ts.map +1 -0
  86. package/dist/core/StageAdvancer.js +70 -0
  87. package/dist/core/StageAdvancer.js.map +1 -0
  88. package/dist/core/TransferByNickname.d.ts +51 -0
  89. package/dist/core/TransferByNickname.d.ts.map +1 -0
  90. package/dist/core/TransferByNickname.js +50 -0
  91. package/dist/core/TransferByNickname.js.map +1 -0
  92. package/dist/core/TransferOrchestrator.d.ts +113 -0
  93. package/dist/core/TransferOrchestrator.d.ts.map +1 -0
  94. package/dist/core/TransferOrchestrator.js +79 -0
  95. package/dist/core/TransferOrchestrator.js.map +1 -0
  96. package/dist/core/types.d.ts +177 -1
  97. package/dist/core/types.d.ts.map +1 -1
  98. package/dist/core/types.js.map +1 -1
  99. package/dist/scaffold/templates.d.ts.map +1 -1
  100. package/dist/scaffold/templates.js +5 -0
  101. package/dist/scaffold/templates.js.map +1 -1
  102. package/dist/server/AgentServer.d.ts +8 -0
  103. package/dist/server/AgentServer.d.ts.map +1 -1
  104. package/dist/server/AgentServer.js +4 -0
  105. package/dist/server/AgentServer.js.map +1 -1
  106. package/dist/server/CapabilityIndex.d.ts.map +1 -1
  107. package/dist/server/CapabilityIndex.js +14 -0
  108. package/dist/server/CapabilityIndex.js.map +1 -1
  109. package/dist/server/routes.d.ts +12 -0
  110. package/dist/server/routes.d.ts.map +1 -1
  111. package/dist/server/routes.js +91 -0
  112. package/dist/server/routes.js.map +1 -1
  113. package/package.json +1 -1
  114. package/src/data/builtin-manifest.json +64 -64
  115. package/src/scaffold/templates.ts +5 -0
  116. package/upgrades/1.3.92.md +63 -0
  117. package/upgrades/side-effects/session-pool-capability-classification.md +16 -0
  118. package/upgrades/side-effects/session-pool-review-fixes.md +23 -0
  119. package/upgrades/side-effects/session-pool-track-a-router-lease.md +29 -0
  120. package/upgrades/side-effects/session-pool-track-b-agent-awareness.md +29 -0
  121. package/upgrades/side-effects/session-pool-track-b-nicknames.md +35 -0
  122. package/upgrades/side-effects/session-pool-track-b-pool-api.md +36 -0
  123. package/upgrades/side-effects/session-pool-track-b-registry.md +31 -0
  124. package/upgrades/side-effects/session-pool-track-b-wiring.md +39 -0
  125. package/upgrades/side-effects/session-pool-track-c-dispatcher.md +24 -0
  126. package/upgrades/side-effects/session-pool-track-c-meshrpc.md +35 -0
  127. package/upgrades/side-effects/session-pool-track-c-route-wiring.md +31 -0
  128. package/upgrades/side-effects/session-pool-track-d-ownership-fsm.md +31 -0
  129. package/upgrades/side-effects/session-pool-track-d-registry.md +27 -0
  130. package/upgrades/side-effects/session-pool-track-d-wiring.md +30 -0
  131. package/upgrades/side-effects/session-pool-track-e-boot-wiring.md +20 -0
  132. package/upgrades/side-effects/session-pool-track-e-placement-core.md +17 -0
  133. package/upgrades/side-effects/session-pool-track-e-router.md +23 -0
  134. package/upgrades/side-effects/session-pool-track-f-config.md +12 -0
  135. package/upgrades/side-effects/session-pool-track-f-handoff-core.md +17 -0
  136. package/upgrades/side-effects/session-pool-track-g-load-broker.md +16 -0
  137. package/upgrades/side-effects/session-pool-track-h-gate-wiring.md +17 -0
  138. package/upgrades/side-effects/session-pool-track-h-mesh-client.md +15 -0
  139. package/upgrades/side-effects/session-pool-track-h-rebalance.md +13 -0
  140. package/upgrades/side-effects/session-pool-track-h-rollout-gate.md +17 -0
  141. package/upgrades/side-effects/session-pool-track-h-stage-guard.md +16 -0
@@ -6241,6 +6241,97 @@ export function createRoutes(ctx) {
6241
6241
  res.status(400).json({ error: err instanceof Error ? err.message : String(err) });
6242
6242
  }
6243
6243
  });
6244
+ // ── Multi-Machine Session Pool (§L2): the live machine-pool view ──────
6245
+ //
6246
+ // GET /pool — router holder + every machine's capacity (nickname, hardware,
6247
+ // liveness, load, clock-skew status). Backs the Machines dashboard tab. Always
6248
+ // 200 (Bearer-auth via the global middleware); `enabled:false` + an empty/
6249
+ // single-machine view on installs where the pool registry isn't wired (dark).
6250
+ router.get('/pool', (_req, res) => {
6251
+ const sync = ctx.coordinator ? ctx.coordinator.getSyncStatus() : null;
6252
+ const machines = ctx.machinePoolRegistry ? ctx.machinePoolRegistry.getCapacities() : [];
6253
+ res.json({
6254
+ enabled: !!ctx.machinePoolRegistry,
6255
+ router: sync
6256
+ ? {
6257
+ holder: sync.leaseHolder,
6258
+ epoch: sync.leaseEpoch,
6259
+ holdsLease: sync.holdsLease,
6260
+ awakeMachineCount: sync.awakeMachineCount,
6261
+ splitBrainState: sync.splitBrainState,
6262
+ }
6263
+ : null,
6264
+ machines,
6265
+ });
6266
+ });
6267
+ // GET /session-pool/e2e-results — the rollout gate's observable state (§Rollout).
6268
+ // Read-only; returns the latest E2E result per stage + whether each verifies. The
6269
+ // StageAdvancer gates activation on these; this surfaces them (no mutation here).
6270
+ router.get('/session-pool/e2e-results', (_req, res) => {
6271
+ const store = ctx.sessionPoolE2EResultStore;
6272
+ if (!store) {
6273
+ res.status(503).json({ error: 'session-pool rollout gate not available (dark / single-machine install)' });
6274
+ return;
6275
+ }
6276
+ const stages = [0, 1, 2, 3];
6277
+ const latestPerStage = stages.map((stage) => {
6278
+ const row = store.getLatestForStage(stage);
6279
+ return { stage, result: row?.result ?? null, commitSha: row?.commitSha ?? null, ranAt: row?.ranAt ?? null, verified: row ? store.verify(row) : null };
6280
+ });
6281
+ res.json({ latestPerStage, total: store.all().length });
6282
+ });
6283
+ // PATCH /pool/machines/:id — rename a machine (§L2 user-editable nickname).
6284
+ // Body: { nickname: string }. Validates format + pool-uniqueness; a collision
6285
+ // is rejected (400), an unknown machine is 404, a malformed nickname is 400.
6286
+ // Metadata-only — renaming NEVER moves a session or touches lease/ownership.
6287
+ router.patch('/pool/machines/:id', (req, res) => {
6288
+ const idMgr = ctx.coordinator?.managers?.identityManager ?? null;
6289
+ if (!idMgr) {
6290
+ res.status(503).json({ error: 'machine registry not available (single-machine install)' });
6291
+ return;
6292
+ }
6293
+ const nickname = (req.body ?? {}).nickname;
6294
+ if (typeof nickname !== 'string') {
6295
+ res.status(400).json({ error: 'nickname (string) is required' });
6296
+ return;
6297
+ }
6298
+ try {
6299
+ idMgr.updateNickname(req.params.id, nickname);
6300
+ res.json({ ok: true, machineId: req.params.id, nickname: nickname.trim() });
6301
+ }
6302
+ catch (err) {
6303
+ const msg = err instanceof Error ? err.message : String(err);
6304
+ res.status(/not found/i.test(msg) ? 404 : 400).json({ error: msg });
6305
+ }
6306
+ });
6307
+ // POST /mesh/rpc — the MeshRpc receive endpoint (§L0). Body = a signed,
6308
+ // recipient-bound MeshEnvelope. The dispatcher runs verify→RBAC→nonce-burn→
6309
+ // handler and returns a typed reason + HTTP status (401/403 auth, 409 freshness,
6310
+ // 501 unimplemented). NOTE: m2m authenticity is the ENVELOPE's own Ed25519
6311
+ // signature (verified by the dispatcher), independent of the Bearer middleware.
6312
+ router.post('/mesh/rpc', async (req, res) => {
6313
+ if (!ctx.meshRpcDispatcher) {
6314
+ res.status(503).json({ error: 'mesh-rpc not configured (single-machine install)' });
6315
+ return;
6316
+ }
6317
+ const env = req.body;
6318
+ if (!env || typeof env !== 'object' || typeof env.sender !== 'string') {
6319
+ res.status(400).json({ error: 'a signed MeshEnvelope is required' });
6320
+ return;
6321
+ }
6322
+ try {
6323
+ const r = await ctx.meshRpcDispatcher.dispatch(env);
6324
+ if (r.ok) {
6325
+ res.json({ ok: true, result: r.result });
6326
+ }
6327
+ else {
6328
+ res.status(r.status).json({ ok: false, reason: r.reason });
6329
+ }
6330
+ }
6331
+ catch (err) {
6332
+ res.status(500).json({ error: err instanceof Error ? err.message : String(err) });
6333
+ }
6334
+ });
6244
6335
  // POST /projects/:id/drift-check — run the drift checker for a given
6245
6336
  // round and return the verdict. Wraps ProjectDriftChecker.run().
6246
6337
  //