@dsiloed/silo-link 1.19.14 → 1.19.16

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 (71) hide show
  1. package/dist/api/backend-health.d.ts +44 -0
  2. package/dist/api/backend-health.d.ts.map +1 -0
  3. package/dist/api/backend-health.js +80 -0
  4. package/dist/api/backend-health.js.map +1 -0
  5. package/dist/api/dsiloed-client.d.ts +7 -3
  6. package/dist/api/dsiloed-client.d.ts.map +1 -1
  7. package/dist/api/dsiloed-client.js +29 -4
  8. package/dist/api/dsiloed-client.js.map +1 -1
  9. package/dist/cli/claude-md-block.d.ts +1 -1
  10. package/dist/cli/claude-md-block.d.ts.map +1 -1
  11. package/dist/cli/claude-md-block.js +3 -1
  12. package/dist/cli/claude-md-block.js.map +1 -1
  13. package/dist/core/agent-launcher.d.ts +7 -0
  14. package/dist/core/agent-launcher.d.ts.map +1 -1
  15. package/dist/core/auto-updater.d.ts +11 -0
  16. package/dist/core/auto-updater.d.ts.map +1 -1
  17. package/dist/core/auto-updater.js +84 -15
  18. package/dist/core/auto-updater.js.map +1 -1
  19. package/dist/core/base-tmux-launcher.d.ts +24 -1
  20. package/dist/core/base-tmux-launcher.d.ts.map +1 -1
  21. package/dist/core/base-tmux-launcher.js +73 -3
  22. package/dist/core/base-tmux-launcher.js.map +1 -1
  23. package/dist/core/bridge.d.ts +28 -0
  24. package/dist/core/bridge.d.ts.map +1 -1
  25. package/dist/core/bridge.js +208 -21
  26. package/dist/core/bridge.js.map +1 -1
  27. package/dist/core/claude-launcher.d.ts +4 -2
  28. package/dist/core/claude-launcher.d.ts.map +1 -1
  29. package/dist/core/claude-launcher.js +29 -8
  30. package/dist/core/claude-launcher.js.map +1 -1
  31. package/dist/core/codex-launcher.d.ts +2 -2
  32. package/dist/core/codex-launcher.d.ts.map +1 -1
  33. package/dist/core/codex-launcher.js +2 -2
  34. package/dist/core/codex-launcher.js.map +1 -1
  35. package/dist/core/gemini-launcher.d.ts +2 -2
  36. package/dist/core/gemini-launcher.d.ts.map +1 -1
  37. package/dist/core/gemini-launcher.js +2 -2
  38. package/dist/core/gemini-launcher.js.map +1 -1
  39. package/dist/core/health-monitor.d.ts +87 -0
  40. package/dist/core/health-monitor.d.ts.map +1 -0
  41. package/dist/core/health-monitor.js +93 -0
  42. package/dist/core/health-monitor.js.map +1 -0
  43. package/dist/core/idle-completion.d.ts +38 -0
  44. package/dist/core/idle-completion.d.ts.map +1 -0
  45. package/dist/core/idle-completion.js +52 -0
  46. package/dist/core/idle-completion.js.map +1 -0
  47. package/dist/core/launch-binding.d.ts +52 -0
  48. package/dist/core/launch-binding.d.ts.map +1 -0
  49. package/dist/core/launch-binding.js +81 -0
  50. package/dist/core/launch-binding.js.map +1 -0
  51. package/dist/core/usage-ledger.d.ts +1 -1
  52. package/dist/core/usage-ledger.d.ts.map +1 -1
  53. package/dist/mcp/server.d.ts +4 -0
  54. package/dist/mcp/server.d.ts.map +1 -1
  55. package/dist/mcp/server.js +15 -0
  56. package/dist/mcp/server.js.map +1 -1
  57. package/dist/mcp/tools/register-tools.d.ts +2 -0
  58. package/dist/mcp/tools/register-tools.d.ts.map +1 -1
  59. package/dist/mcp/tools/register-tools.js +154 -36
  60. package/dist/mcp/tools/register-tools.js.map +1 -1
  61. package/dist/types/index.d.ts +5 -0
  62. package/dist/types/index.d.ts.map +1 -1
  63. package/package.json +3 -1
  64. package/dist/core/baseline-verify.d.ts +0 -54
  65. package/dist/core/baseline-verify.d.ts.map +0 -1
  66. package/dist/core/baseline-verify.js +0 -164
  67. package/dist/core/baseline-verify.js.map +0 -1
  68. package/dist/core/openai-launcher.d.ts +0 -33
  69. package/dist/core/openai-launcher.d.ts.map +0 -1
  70. package/dist/core/openai-launcher.js +0 -38
  71. package/dist/core/openai-launcher.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"gemini-launcher.d.ts","sourceRoot":"","sources":["../../src/core/gemini-launcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;GAQG;AACH,qBAAa,cAAe,SAAQ,gBAAgB;gBAEhD,MAAM,EAAE,cAAc,EACtB,cAAc,EAAE,cAAc,EAC9B,aAAa,CAAC,EAAE,aAAa,EAC7B,YAAY,CAAC,EAAE,YAAY,EAC3B,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,WAAW,CAAC,EAAE,WAAW;IAO3B,SAAS,CAAC,UAAU,IAAI,MAAM;IAI9B,SAAS,CAAC,OAAO,IAAI,MAAM,EAAE;IAI7B,SAAS,CAAC,iBAAiB,IAAI,MAAM,EAAE;IAIvC,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;cAI9B,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA+E3F,SAAS,CAAC,YAAY,IAAI,OAAO;IAKjC,SAAS,CAAC,mBAAmB,IAAI,MAAM;IAgBvC,SAAS,CAAC,uBAAuB,IAAI,OAAO;IAI5C,SAAS,CAAC,gBAAgB,IAAI,MAAM;IAIpC,SAAS,CAAC,kBAAkB,IAAI,MAAM;IAMtC,SAAS,CAAC,kBAAkB,IAAI,OAAO;IAIvC,SAAS,CAAC,gBAAgB,IAAI,MAAM,GAAG,SAAS;IAIhD,SAAS,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAO/C,SAAS,CAAC,aAAa,IAAI,MAAM;IAIjC,SAAS,CAAC,UAAU,IAAI,MAAM;IAI9B,SAAS,CAAC,SAAS,IAAI,MAAM;IAI7B,SAAS,CAAC,kBAAkB,IAAI,MAAM;IAOtC,SAAS,CAAC,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,KAAK,EAAE,UAAU,EAAE,CAAA;KAAE,GAAG,IAAI;IAU7J;;;;;;;;;;OAUG;cACgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI;IAuB/E,SAAS,CAAC,iBAAiB,CACzB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,GACvB;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE;IA2C1C;;;;;OAKG;IACH,OAAO,CAAC,0BAA0B;IA0BlC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;CAK7B"}
1
+ {"version":3,"file":"gemini-launcher.d.ts","sourceRoot":"","sources":["../../src/core/gemini-launcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;GAQG;AACH,qBAAa,cAAe,SAAQ,gBAAgB;gBAEhD,MAAM,EAAE,cAAc,EACtB,cAAc,EAAE,cAAc,EAC9B,aAAa,CAAC,EAAE,aAAa,EAC7B,YAAY,CAAC,EAAE,YAAY,EAC3B,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,WAAW,CAAC,EAAE,WAAW;IAO3B,SAAS,CAAC,UAAU,IAAI,MAAM;IAI9B,SAAS,CAAC,OAAO,IAAI,MAAM,EAAE;IAI7B,SAAS,CAAC,iBAAiB,IAAI,MAAM,EAAE;IAIvC,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;cAI9B,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA+EpH,SAAS,CAAC,YAAY,IAAI,OAAO;IAKjC,SAAS,CAAC,mBAAmB,IAAI,MAAM;IAgBvC,SAAS,CAAC,uBAAuB,IAAI,OAAO;IAI5C,SAAS,CAAC,gBAAgB,IAAI,MAAM;IAIpC,SAAS,CAAC,kBAAkB,IAAI,MAAM;IAMtC,SAAS,CAAC,kBAAkB,IAAI,OAAO;IAIvC,SAAS,CAAC,gBAAgB,IAAI,MAAM,GAAG,SAAS;IAIhD,SAAS,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAO/C,SAAS,CAAC,aAAa,IAAI,MAAM;IAIjC,SAAS,CAAC,UAAU,IAAI,MAAM;IAI9B,SAAS,CAAC,SAAS,IAAI,MAAM;IAI7B,SAAS,CAAC,kBAAkB,IAAI,MAAM;IAOtC,SAAS,CAAC,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,KAAK,EAAE,UAAU,EAAE,CAAA;KAAE,GAAG,IAAI;IAU7J;;;;;;;;;;OAUG;cACgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI;IAuB/E,SAAS,CAAC,iBAAiB,CACzB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,GACvB;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE;IA2C1C;;;;;OAKG;IACH,OAAO,CAAC,0BAA0B;IA0BlC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;CAK7B"}
@@ -29,7 +29,7 @@ export class GeminiLauncher extends BaseTmuxLauncher {
29
29
  formatPrompt(prompt) {
30
30
  return this.adaptPromptForGemini(prompt);
31
31
  }
32
- async setupMcpConfig(cwd, toolAllowlist) {
32
+ async setupMcpConfig(cwd, toolAllowlist, launch) {
33
33
  // Pre-accept Gemini's per-folder trust prompt for this cwd. Gemini CLI
34
34
  // gates loading local config (MCP servers, GEMINI.md, skills) behind an
35
35
  // interactive "Do you trust the files in this folder?" dialog that `--yolo`
@@ -81,7 +81,7 @@ export class GeminiLauncher extends BaseTmuxLauncher {
81
81
  const spawnEnv = { PATH: this.mcpSpawnPathEnv() };
82
82
  mcpServers.silolink = {
83
83
  command: bridge.command,
84
- args: [...bridge.args, `http://localhost:${this.config.mcp_port}/mcp`],
84
+ args: [...bridge.args, `http://localhost:${this.config.mcp_port}/mcp`, ...this.launchHeaderArgs(launch)],
85
85
  env: { ...spawnEnv },
86
86
  };
87
87
  mcpServers.silolink_server = {
@@ -1 +1 @@
1
- {"version":3,"file":"gemini-launcher.js","sourceRoot":"","sources":["../../src/core/gemini-launcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAOlC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EACL,sBAAsB,EAAE,qBAAqB,EAAE,eAAe,EAC9D,2BAA2B,EAAE,sBAAsB,GAEpD,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;GAQG;AACH,MAAM,OAAO,cAAe,SAAQ,gBAAgB;IAClD,YACE,MAAsB,EACtB,cAA8B,EAC9B,aAA6B,EAC7B,YAA2B,EAC3B,gBAAmC,EACnC,WAAyB;QAEzB,KAAK,CAAC,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC;IAC5F,CAAC;IAED,kCAAkC;IAExB,UAAU;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,QAAQ,CAAC;IAChD,CAAC;IAES,OAAO;QACf,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpB,CAAC;IAES,iBAAiB;QACzB,OAAO,CAAC,mBAAmB,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IACtD,CAAC;IAES,YAAY,CAAC,MAAc;QACnC,OAAO,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAES,KAAK,CAAC,cAAc,CAAC,GAAW,EAAE,aAA+B;QACzE,uEAAuE;QACvE,wEAAwE;QACxE,4EAA4E;QAC5E,2EAA2E;QAC3E,4EAA4E;QAC5E,0EAA0E;QAC1E,qDAAqD;QACrD,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC;QAErC,2DAA2D;QAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;QAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QAED,6EAA6E;QAC7E,IAAI,UAAU,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,wDAAwD,CAAC;QAC7F,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,aAAa,CAAC,CAAC;YACtD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACvD,UAAU,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,CAAC;QAED,qEAAqE;QACrE,oEAAoE;QACpE,uEAAuE;QACvE,mEAAmE;QACnE,iEAAiE;QACjE,mEAAmE;QACnE,iEAAiE;QACjE,sEAAsE;QACtE,sEAAsE;QACtE,sEAAsE;QACtE,cAAc;QACd,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACvC,MAAM,kBAAkB,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QAC5D,IAAI,CAAC;YACH,IAAI,QAAQ,GAA4B,EAAE,CAAC;YAC3C,IAAI,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACnC,MAAM,GAAG,GAAG,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC7D,IAAI,GAAG,EAAE,CAAC;oBACR,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YAED,MAAM,UAAU,GAAG,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAA4B,CAAC;YAE1E,oEAAoE;YACpE,+DAA+D;YAC/D,wEAAwE;YACxE,mEAAmE;YACnE,iEAAiE;YACjE,MAAM,MAAM,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;YACjD,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YAClD,UAAU,CAAC,QAAQ,GAAG;gBACpB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,oBAAoB,IAAI,CAAC,MAAM,CAAC,QAAQ,MAAM,CAAC;gBACtE,GAAG,EAAE,EAAE,GAAG,QAAQ,EAAE;aACrB,CAAC;YAEF,UAAU,CAAC,eAAe,GAAG;gBAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,IAAI,EAAE;oBACJ,GAAG,MAAM,CAAC,IAAI,EAAE,UAAU;oBAC1B,UAAU,EAAE,yBAAyB,KAAK,EAAE;iBAC7C;gBACD,GAAG,EAAE,EAAE,GAAG,QAAQ,EAAE;aACrB,CAAC;YAEF,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;YACjC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1C,aAAa,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,sDAAsD,kBAAkB,WAAW,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;QACtH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,wCAAwC,kBAAkB,KAAK,GAAG,EAAE,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IAES,YAAY;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;QAC1C,OAAO,CAAC,CAAC,OAAO,CAAC;IACnB,CAAC;IAES,mBAAmB;QAC3B,mEAAmE;QACnE,gEAAgE;QAChE,4BAA4B;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACnF,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC;gBACH,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,wCAAwC,GAAG,EAAE,CAAC,CAAC;YAC7D,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,iDAAiD,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAES,uBAAuB;QAC/B,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;IAC3C,CAAC;IAES,gBAAgB;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,sBAAsB,IAAI,KAAK,CAAC;IACrD,CAAC;IAES,kBAAkB;QAC1B,OAAO,IAAI,CAAC,MAAM,CAAC,yBAAyB,IAAI,CAAC,CAAC;IACpD,CAAC;IAED,4EAA4E;IAC5E,8EAA8E;IACpE,kBAAkB;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAES,gBAAgB;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC;IAC3C,CAAC;IAES,WAAW;QACnB,OAAO;YACL,gBAAgB,EAAE,oBAAoB,IAAI,CAAC,MAAM,CAAC,QAAQ,MAAM;YAChE,uBAAuB,EAAE,QAAQ;SAClC,CAAC;IACJ,CAAC;IAES,aAAa;QACrB,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAES,UAAU;QAClB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAES,SAAS;QACjB,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAES,kBAAkB;QAC1B,OAAO,yBAAyB,CAAC;IACnC,CAAC;IAED,4EAA4E;IAC5E,6EAA6E;IAC7E,iEAAiE;IACvD,sBAAsB,CAAC,GAAW,EAAE,YAA4B;QACxE,MAAM,cAAc,GAAG,sBAAsB,CAAC,GAAG,EAAE,YAAY,IAAI,IAAI,CAAC,CAAC;QACzE,IAAI,CAAC,cAAc;YAAE,OAAO,IAAI,CAAC;QAEjC,MAAM,KAAK,GAAG,qBAAqB,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEpC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE,CAAC;IACtE,CAAC;IAED;;;;;;;;;;OAUG;IACgB,cAAc,CAAC,GAAW,EAAE,SAAgB;QAC7D,MAAM,cAAc,GAAG,sBAAsB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACzD,IAAI,CAAC,cAAc;YAAE,OAAO,IAAI,CAAC;QACjC,IAAI,SAAS,IAAI,CAAC,sBAAsB,CAAC,cAAc,EAAE,SAAS,CAAC,EAAE,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,yDAAyD,cAAc,gCAAgC,SAAS,CAAC,WAAW,EAAE,kDAAkD,CAAC,CAAC;YAC/L,OAAO,IAAI,CAAC;QACd,CAAC;QACD,yEAAyE;QACzE,6EAA6E;QAC7E,yDAAyD;QACzD,IAAI,CAAC,2BAA2B,CAAC,cAAc,CAAC,EAAE,CAAC;YACjD,OAAO,CAAC,IAAI,CAAC,yDAAyD,cAAc,6CAA6C,CAAC,CAAC;YACnI,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzE,MAAM,EAAE,GAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAA4B,CAAC,SAAS,CAAC;YACvE,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAES,iBAAiB,CACzB,MAAc,EACd,cAAkC,EAClC,YAAoB,EACpB,gBAAwB;QAExB,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEtD,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QAC1D,IAAI,YAAY,IAAI,CAAC,MAAM,KAAK,cAAc,IAAI,MAAM,KAAK,iBAAiB,CAAC,EAAE,CAAC;YAChF,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YACzC,OAAO;gBACL,MAAM,EAAE,yCAAyC,GAAG,gBAAgB;gBACpE,SAAS;aACV,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,KAAK,cAAc,IAAI,MAAM,KAAK,iBAAiB,EAAE,CAAC;YAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,qBAAqB,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAC9B,MAAM,cAAc,GAAG,cAAc;gBACnC,CAAC,CAAC,wBAAwB,cAAc,GAAG,YAAY,IAAI;gBAC3D,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;YACzD,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB;gBAC5C,CAAC,CAAC,uDAAuD,IAAI,CAAC,qBAAqB,GAAG;gBACtF,CAAC,CAAC,EAAE,CAAC;YACP,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;YAClC,OAAO;gBACL,MAAM,EAAE;oBACN,iEAAiE,cAAc,qHAAqH;oBACpM,WAAW;oBACX,YAAY;oBACZ,gBAAgB;iBACjB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC5B,SAAS;aACV,CAAC;QACJ,CAAC;QAED,OAAO;YACL,MAAM,EAAE,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC,qBAAqB,IAAI,IAAI,CAAC,MAAM,CAAC,qBAAqB;gBAC9F,iDAAiD,CAAC,GAAG,YAAY,GAAG,gBAAgB;YACtF,SAAS;SACV,CAAC;IACJ,CAAC;IAED,0BAA0B;IAE1B;;;;;OAKG;IACK,0BAA0B,CAAC,GAAW;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAAC;QACpE,IAAI,OAAO,GAA2B,EAAE,CAAC;QAEzC,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1B,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;gBACnD,IAAI,GAAG;oBAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,oCAAoC,SAAS,gCAAgC,GAAG,EAAE,CAAC,CAAC;YACjG,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,cAAc;YAAE,OAAO,CAAC,oCAAoC;QAEjF,OAAO,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC;QAC9B,IAAI,CAAC;YACH,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YACjF,OAAO,CAAC,GAAG,CAAC,yDAAyD,GAAG,EAAE,CAAC,CAAC;QAC9E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,oDAAoD,SAAS,KAAK,GAAG,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,oBAAoB,CAAC,MAAc;QACzC,OAAO,MAAM;aACV,OAAO,CAAC,kBAAkB,EAAE,WAAW,CAAC;aACxC,OAAO,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACzC,CAAC;CACF"}
1
+ {"version":3,"file":"gemini-launcher.js","sourceRoot":"","sources":["../../src/core/gemini-launcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ import { getFileLogStatus } from '../cli/file-log.js';
2
+ import type { BackendHealthSnapshot } from '../api/backend-health.js';
3
+ import type { UsageLedgerEntry } from './usage-ledger.js';
4
+ /**
5
+ * Daemon health block.
6
+ *
7
+ * Everything that went wrong on 2026-08-23/24 had been invisible for weeks:
8
+ * six weeks of 403s, a frozen .mcp.json JWT, a credential-less boot,
9
+ * cross-env reaper kills, recycler kills, unpinned updates, resume flapping.
10
+ * The subsystems now feed this monitor; the Bridge ships `snapshot()` as
11
+ * `health` in every ActionCable heartbeat (the backend stores it on the
12
+ * daemon row and derives coded issues) and logs one `[HEALTH] {...}` line an
13
+ * hour so the file log carries the state too. Keep the payload small (< 2 KB).
14
+ */
15
+ export interface HealthSnapshot {
16
+ credentials_present: boolean | null;
17
+ claude_resolved: boolean | null;
18
+ mcp_config: {
19
+ last_write_ok: boolean | null;
20
+ last_write_at: string | null;
21
+ jwt_exp: string | null;
22
+ };
23
+ backend: BackendHealthSnapshot;
24
+ usage_ledger: {
25
+ unsettled: number;
26
+ oldest: string | null;
27
+ };
28
+ sessions: {
29
+ recycles_24h: number;
30
+ reaped_at_boot: number;
31
+ resume_captures_1h: number;
32
+ };
33
+ launch: {
34
+ last_failed_at: string | null;
35
+ last_error: string | null;
36
+ };
37
+ updater: {
38
+ state: string;
39
+ latest: string | null;
40
+ pinned: boolean | null;
41
+ };
42
+ log: {
43
+ path: string;
44
+ bytes: number;
45
+ stdout_is_log: boolean;
46
+ } | null;
47
+ }
48
+ export type UpdaterState = 'unknown' | 'disabled' | 'checking' | 'current' | 'deferred' | 'notify' | 'installing' | 'failed' | 'pinned-refused';
49
+ export interface HealthFeeds {
50
+ backend?: () => BackendHealthSnapshot;
51
+ usageLedger?: () => UsageLedgerEntry[];
52
+ recycles24h?: () => number;
53
+ jwt?: () => string | undefined;
54
+ log?: () => ReturnType<typeof getFileLogStatus>;
55
+ }
56
+ export declare class HealthMonitor {
57
+ private feeds;
58
+ private credentialsPresent;
59
+ private claudeResolved;
60
+ private mcpWrite;
61
+ private reapedAtBoot;
62
+ private launchFailure;
63
+ private resumeCaptures;
64
+ private updater;
65
+ private hourly;
66
+ attach(feeds: HealthFeeds): void;
67
+ setCredentialsPresent(present: boolean | null): void;
68
+ setClaudeResolved(resolved: boolean | null): void;
69
+ noteMcpConfigWrite(ok: boolean, now?: number): void;
70
+ noteReapedAtBoot(count: number): void;
71
+ /** Record a session-launch failure (scrubbed short message) for the health block. */
72
+ noteLaunchFailure(error: string, now?: number): void;
73
+ noteResumeCapture(now?: number): void;
74
+ setUpdater(patch: Partial<{
75
+ state: UpdaterState;
76
+ latest: string | null;
77
+ pinned: boolean | null;
78
+ }>): void;
79
+ snapshot(now?: number): HealthSnapshot;
80
+ /** One `[HEALTH] {...}` line per hour (plus one at start). */
81
+ startHourlyLog(intervalMs?: number): void;
82
+ stop(): void;
83
+ logLine(): void;
84
+ }
85
+ /** Process-wide instance the subsystems feed (launchers, client, updater, file log). */
86
+ export declare const healthMonitor: HealthMonitor;
87
+ //# sourceMappingURL=health-monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-monitor.d.ts","sourceRoot":"","sources":["../../src/core/health-monitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ import { decodeJwtExpMs } from '../config/jwt-generator.js';
2
+ import { getFileLogStatus } from '../cli/file-log.js';
3
+ const HOUR_MS = 60 * 60 * 1000;
4
+ export class HealthMonitor {
5
+ feeds = {};
6
+ credentialsPresent = null;
7
+ claudeResolved = null;
8
+ mcpWrite = null;
9
+ reapedAtBoot = 0;
10
+ launchFailure = null;
11
+ resumeCaptures = [];
12
+ updater = { state: 'unknown', latest: null, pinned: null };
13
+ hourly = null;
14
+ attach(feeds) {
15
+ this.feeds = { ...this.feeds, ...feeds };
16
+ }
17
+ setCredentialsPresent(present) { this.credentialsPresent = present; }
18
+ setClaudeResolved(resolved) { this.claudeResolved = resolved; }
19
+ noteMcpConfigWrite(ok, now = Date.now()) { this.mcpWrite = { ok, at: now }; }
20
+ noteReapedAtBoot(count) { this.reapedAtBoot += count; }
21
+ /** Record a session-launch failure (scrubbed short message) for the health block. */
22
+ noteLaunchFailure(error, now = Date.now()) {
23
+ const scrubbed = String(error).replace(/\s+/g, ' ').trim().slice(0, 200);
24
+ this.launchFailure = { at: now, error: scrubbed };
25
+ }
26
+ noteResumeCapture(now = Date.now()) {
27
+ this.resumeCaptures.push(now);
28
+ this.resumeCaptures = this.resumeCaptures.filter(t => now - t < HOUR_MS);
29
+ }
30
+ setUpdater(patch) {
31
+ this.updater = { ...this.updater, ...patch };
32
+ }
33
+ snapshot(now = Date.now()) {
34
+ const safe = (fn, fallback) => {
35
+ try {
36
+ return fn ? fn() : fallback;
37
+ }
38
+ catch {
39
+ return fallback;
40
+ }
41
+ };
42
+ const ledger = safe(this.feeds.usageLedger, []);
43
+ const oldest = ledger.reduce((acc, e) => (acc === null || e.createdAt < acc ? e.createdAt : acc), null);
44
+ const jwtExp = decodeJwtExpMs(safe(this.feeds.jwt, undefined));
45
+ const log = safe(this.feeds.log ?? getFileLogStatus, null);
46
+ this.resumeCaptures = this.resumeCaptures.filter(t => now - t < HOUR_MS);
47
+ return {
48
+ credentials_present: this.credentialsPresent,
49
+ claude_resolved: this.claudeResolved,
50
+ mcp_config: {
51
+ last_write_ok: this.mcpWrite?.ok ?? null,
52
+ last_write_at: this.mcpWrite ? new Date(this.mcpWrite.at).toISOString() : null,
53
+ jwt_exp: jwtExp ? new Date(jwtExp).toISOString() : null,
54
+ },
55
+ backend: safe(this.feeds.backend, { consecutive_403: {}, blocked: [], last_429_at: null, last_5xx_at: null }),
56
+ usage_ledger: { unsettled: ledger.length, oldest },
57
+ sessions: {
58
+ recycles_24h: safe(this.feeds.recycles24h, 0),
59
+ reaped_at_boot: this.reapedAtBoot,
60
+ resume_captures_1h: this.resumeCaptures.length,
61
+ },
62
+ launch: {
63
+ last_failed_at: this.launchFailure ? new Date(this.launchFailure.at).toISOString() : null,
64
+ last_error: this.launchFailure?.error ?? null,
65
+ },
66
+ updater: { ...this.updater },
67
+ log: log ? { path: log.path, bytes: log.bytes, stdout_is_log: log.stdout_is_log } : null,
68
+ };
69
+ }
70
+ /** One `[HEALTH] {...}` line per hour (plus one at start). */
71
+ startHourlyLog(intervalMs = HOUR_MS) {
72
+ if (this.hourly)
73
+ return;
74
+ this.logLine();
75
+ this.hourly = setInterval(() => this.logLine(), intervalMs);
76
+ this.hourly.unref?.();
77
+ }
78
+ stop() {
79
+ if (this.hourly) {
80
+ clearInterval(this.hourly);
81
+ this.hourly = null;
82
+ }
83
+ }
84
+ logLine() {
85
+ try {
86
+ console.log(`[HEALTH] ${JSON.stringify(this.snapshot())}`);
87
+ }
88
+ catch { /* never let health logging break anything */ }
89
+ }
90
+ }
91
+ /** Process-wide instance the subsystems feed (launchers, client, updater, file log). */
92
+ export const healthMonitor = new HealthMonitor();
93
+ //# sourceMappingURL=health-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-monitor.js","sourceRoot":"","sources":["../../src/core/health-monitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAsCtD,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE/B,MAAM,OAAO,aAAa;IAChB,KAAK,GAAgB,EAAE,CAAC;IACxB,kBAAkB,GAAmB,IAAI,CAAC;IAC1C,cAAc,GAAmB,IAAI,CAAC;IACtC,QAAQ,GAAuC,IAAI,CAAC;IACpD,YAAY,GAAG,CAAC,CAAC;IACjB,aAAa,GAAyC,IAAI,CAAC;IAC3D,cAAc,GAAa,EAAE,CAAC;IAC9B,OAAO,GAA2E,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACnI,MAAM,GAA0C,IAAI,CAAC;IAE7D,MAAM,CAAC,KAAkB;QACvB,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC;IAC3C,CAAC;IAED,qBAAqB,CAAC,OAAuB,IAAU,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAC3F,iBAAiB,CAAC,QAAwB,IAAU,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC;IACrF,kBAAkB,CAAC,EAAW,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE,IAAU,IAAI,CAAC,QAAQ,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACpG,gBAAgB,CAAC,KAAa,IAAU,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,CAAC,CAAC;IACrE,qFAAqF;IACrF,iBAAiB,CAAC,KAAa,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;QACvD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACzE,IAAI,CAAC,aAAa,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACpD,CAAC;IACD,iBAAiB,CAAC,MAAc,IAAI,CAAC,GAAG,EAAE;QACxC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAC3E,CAAC;IACD,UAAU,CAAC,KAAsF;QAC/F,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;IAC/C,CAAC;IAED,QAAQ,CAAC,MAAc,IAAI,CAAC,GAAG,EAAE;QAC/B,MAAM,IAAI,GAAG,CAAI,EAAyB,EAAE,QAAW,EAAK,EAAE;YAC5D,IAAI,CAAC;gBAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO,QAAQ,CAAC;YAAC,CAAC;QACjE,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAwB,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAgB,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QACvH,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;QAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,gBAAgB,EAAE,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;QACzE,OAAO;YACL,mBAAmB,EAAE,IAAI,CAAC,kBAAkB;YAC5C,eAAe,EAAE,IAAI,CAAC,cAAc;YACpC,UAAU,EAAE;gBACV,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,IAAI;gBACxC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;gBAC9E,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;aACxD;YACD,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;YAC7G,YAAY,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE;YAClD,QAAQ,EAAE;gBACR,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC7C,cAAc,EAAE,IAAI,CAAC,YAAY;gBACjC,kBAAkB,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM;aAC/C;YACD,MAAM,EAAE;gBACN,cAAc,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;gBACzF,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,IAAI,IAAI;aAC9C;YACD,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;YAC5B,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI;SACzF,CAAC;IACJ,CAAC;IAED,8DAA8D;IAC9D,cAAc,CAAC,aAAqB,OAAO;QACzC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;IACxB,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAAC,CAAC;IACtE,CAAC;IAED,OAAO;QACL,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC,CAAC,6CAA6C,CAAC,CAAC;IAC3D,CAAC;CACF;AAED,wFAAwF;AACxF,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { Session } from '../types/index.js';
2
+ /**
3
+ * Worker report-back starvation, daemon half (issue 4, 2026-08-24).
4
+ *
5
+ * A worker parked in remote_poll after its final report keeps heartbeating,
6
+ * so the backend's completion relay (which runs on complete!) never fires and
7
+ * the dispatcher never learns the work is done. The daemon now ends such a
8
+ * session itself, gracefully: it calls the backend complete endpoint with
9
+ * state 'idle_timeout' and then kills the pane.
10
+ *
11
+ * Two triggers, both pure functions of the Session's timestamps so they are
12
+ * unit-testable without a daemon:
13
+ * - final_report_idle: the session posted a report flagged `final` and no
14
+ * inbound work has arrived for `report_back_idle_ms` (default 2 min).
15
+ * - poll_idle: the session is in the poll loop (a remote_poll within the last
16
+ * two minutes) with zero work calls for `poll_idle_complete_ms`. OPT-IN
17
+ * (default 0 = disabled): envs that deliberately keep idle sessions alive
18
+ * (claude_idle_kill_after_ms of hours, auto-respawn off) must not have a
19
+ * daemon default end them after 20 min. The bridge additionally refuses
20
+ * to act on a poll_idle verdict while the pane is visibly active.
21
+ * Neither fires while the session still has undelivered inbound messages.
22
+ */
23
+ export declare const DEFAULT_REPORT_BACK_IDLE_MS: number;
24
+ export declare const DEFAULT_POLL_IDLE_COMPLETE_MS = 0;
25
+ export interface IdleCompletionConfig {
26
+ reportBackIdleMs: number;
27
+ pollIdleCompleteMs: number;
28
+ }
29
+ export type IdleCompletionReason = 'final_report_idle' | 'poll_idle';
30
+ export declare function idleCompletionConfig(config: {
31
+ report_back_idle_ms?: number;
32
+ poll_idle_complete_ms?: number;
33
+ }): IdleCompletionConfig;
34
+ export declare function idleCompletionVerdict(session: Session, cfg: IdleCompletionConfig, hasUndelivered: boolean, now?: number): {
35
+ reason: IdleCompletionReason;
36
+ idleMs: number;
37
+ } | null;
38
+ //# sourceMappingURL=idle-completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idle-completion.d.ts","sourceRoot":"","sources":["../../src/core/idle-completion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,2BAA2B,QAAgB,CAAC;AACzD,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAI/C,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,oBAAoB,GAAG,mBAAmB,GAAG,WAAW,CAAC;AAErE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAAE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAAC,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,oBAAoB,CAMnI;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,oBAAoB,EACzB,cAAc,EAAE,OAAO,EACvB,GAAG,GAAE,MAAmB,GACvB;IAAE,MAAM,EAAE,oBAAoB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAgBzD"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Worker report-back starvation, daemon half (issue 4, 2026-08-24).
3
+ *
4
+ * A worker parked in remote_poll after its final report keeps heartbeating,
5
+ * so the backend's completion relay (which runs on complete!) never fires and
6
+ * the dispatcher never learns the work is done. The daemon now ends such a
7
+ * session itself, gracefully: it calls the backend complete endpoint with
8
+ * state 'idle_timeout' and then kills the pane.
9
+ *
10
+ * Two triggers, both pure functions of the Session's timestamps so they are
11
+ * unit-testable without a daemon:
12
+ * - final_report_idle: the session posted a report flagged `final` and no
13
+ * inbound work has arrived for `report_back_idle_ms` (default 2 min).
14
+ * - poll_idle: the session is in the poll loop (a remote_poll within the last
15
+ * two minutes) with zero work calls for `poll_idle_complete_ms`. OPT-IN
16
+ * (default 0 = disabled): envs that deliberately keep idle sessions alive
17
+ * (claude_idle_kill_after_ms of hours, auto-respawn off) must not have a
18
+ * daemon default end them after 20 min. The bridge additionally refuses
19
+ * to act on a poll_idle verdict while the pane is visibly active.
20
+ * Neither fires while the session still has undelivered inbound messages.
21
+ */
22
+ export const DEFAULT_REPORT_BACK_IDLE_MS = 2 * 60 * 1000;
23
+ export const DEFAULT_POLL_IDLE_COMPLETE_MS = 0;
24
+ /** A remote_poll older than this means the CLI is no longer in its poll loop. */
25
+ const POLLING_RECENCY_MS = 2 * 60 * 1000;
26
+ export function idleCompletionConfig(config) {
27
+ const pick = (v, d) => (typeof v === 'number' && v >= 0 ? v : d);
28
+ return {
29
+ reportBackIdleMs: pick(config.report_back_idle_ms, DEFAULT_REPORT_BACK_IDLE_MS),
30
+ pollIdleCompleteMs: pick(config.poll_idle_complete_ms, DEFAULT_POLL_IDLE_COMPLETE_MS),
31
+ };
32
+ }
33
+ export function idleCompletionVerdict(session, cfg, hasUndelivered, now = Date.now()) {
34
+ if (hasUndelivered)
35
+ return null;
36
+ if (session.mcpSessionId.startsWith('launch-pending-'))
37
+ return null; // not registered yet
38
+ const lastWork = session.lastActivity.getTime();
39
+ if (session.finalReportAt && cfg.reportBackIdleMs > 0) {
40
+ const since = Math.max(session.finalReportAt.getTime(), lastWork);
41
+ const idleMs = now - since;
42
+ if (idleMs >= cfg.reportBackIdleMs)
43
+ return { reason: 'final_report_idle', idleMs };
44
+ }
45
+ if (cfg.pollIdleCompleteMs > 0 && session.lastPollAt && now - session.lastPollAt.getTime() <= POLLING_RECENCY_MS) {
46
+ const idleMs = now - lastWork;
47
+ if (idleMs >= cfg.pollIdleCompleteMs)
48
+ return { reason: 'poll_idle', idleMs };
49
+ }
50
+ return null;
51
+ }
52
+ //# sourceMappingURL=idle-completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idle-completion.js","sourceRoot":"","sources":["../../src/core/idle-completion.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AACzD,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC;AAC/C,iFAAiF;AACjF,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AASzC,MAAM,UAAU,oBAAoB,CAAC,MAAwE;IAC3G,MAAM,IAAI,GAAG,CAAC,CAAqB,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7F,OAAO;QACL,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,CAAC;QAC/E,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,6BAA6B,CAAC;KACtF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,OAAgB,EAChB,GAAyB,EACzB,cAAuB,EACvB,MAAc,IAAI,CAAC,GAAG,EAAE;IAExB,IAAI,cAAc;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,iBAAiB,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,qBAAqB;IAC1F,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;IAEhD,IAAI,OAAO,CAAC,aAAa,IAAI,GAAG,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC;QAC3B,IAAI,MAAM,IAAI,GAAG,CAAC,gBAAgB;YAAE,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,CAAC;IACrF,CAAC;IAED,IAAI,GAAG,CAAC,kBAAkB,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,IAAI,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,kBAAkB,EAAE,CAAC;QACjH,MAAM,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC;QAC9B,IAAI,MAAM,IAAI,GAAG,CAAC,kBAAkB;YAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;IAC/E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Launch → MCP transport binding.
3
+ *
4
+ * 2026-08-24 (conv 3369 / 3337): the daemon launched a pane for conversation
5
+ * 3369 and pre-registered its session, but the CC inside called
6
+ * remote_register with conversation_id 3337 (copied from boilerplate in its
7
+ * task text). The only caller identity remote_register had was the HTTP
8
+ * mcp-session-id — nothing tied a transport to the pane it ran in — so the
9
+ * daemon believed it, created a SECOND Session + AgentSession for 3337, and
10
+ * left 3369's pre-registered entry orphaned. One worker, two rows.
11
+ *
12
+ * Each launch now mints a token that rides into the spawned CLI's MCP config
13
+ * as an `X-SiloLink-Launch` header on the local silolink server entry. When
14
+ * the CLI's mcp-remote bridge initializes against this daemon, the MCP server
15
+ * reads the header and binds transport.sessionId → the launch. remote_register
16
+ * can then tell which pane is calling, adopt the pre-registered session for
17
+ * the LAUNCHED conversation, and hand the backend the agent_session_id /
18
+ * launch_correlation_id the launch payload carried.
19
+ */
20
+ export declare const LAUNCH_HEADER = "X-SiloLink-Launch";
21
+ export interface LaunchBinding {
22
+ token: string;
23
+ conversationId: number;
24
+ /** AgentSession row the backend pre-created for this launch, when the launch payload carried it. */
25
+ agentSessionId?: number;
26
+ /** Backend-side correlation id for the same row. */
27
+ launchCorrelationId?: string;
28
+ createdAt: number;
29
+ }
30
+ export interface LaunchLinkage {
31
+ agentSessionId?: number;
32
+ launchCorrelationId?: string;
33
+ }
34
+ export declare class LaunchBindingRegistry {
35
+ private byToken;
36
+ private byTransport;
37
+ private static readonly MAX_AGE_MS;
38
+ /** Called by the launcher when it writes a launch's MCP config. */
39
+ register(binding: Omit<LaunchBinding, 'createdAt'> & {
40
+ createdAt?: number;
41
+ }): LaunchBinding;
42
+ /** Called by the MCP server on transport initialize. Unknown tokens bind nothing. */
43
+ bindTransport(transportSessionId: string, token: string | undefined): LaunchBinding | undefined;
44
+ unbindTransport(transportSessionId: string): void;
45
+ forTransport(transportSessionId: string | undefined): LaunchBinding | undefined;
46
+ forConversation(conversationId: number): LaunchBinding | undefined;
47
+ /** Drop the launch binding once its conversation's session is gone for good. */
48
+ forgetConversation(conversationId: number): void;
49
+ size(): number;
50
+ private prune;
51
+ }
52
+ //# sourceMappingURL=launch-binding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-binding.d.ts","sourceRoot":"","sources":["../../src/core/launch-binding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,aAAa,sBAAsB,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,oGAAoG;IACpG,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAEzD,mEAAmE;IACnE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,GAAG;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,aAAa;IAW3F,qFAAqF;IACrF,aAAa,CAAC,kBAAkB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS;IAQ/F,eAAe,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI;IAIjD,YAAY,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS;IAI/E,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAOlE,gFAAgF;IAChF,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAShD,IAAI,IAAI,MAAM;IAId,OAAO,CAAC,KAAK;CAKd"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Launch → MCP transport binding.
3
+ *
4
+ * 2026-08-24 (conv 3369 / 3337): the daemon launched a pane for conversation
5
+ * 3369 and pre-registered its session, but the CC inside called
6
+ * remote_register with conversation_id 3337 (copied from boilerplate in its
7
+ * task text). The only caller identity remote_register had was the HTTP
8
+ * mcp-session-id — nothing tied a transport to the pane it ran in — so the
9
+ * daemon believed it, created a SECOND Session + AgentSession for 3337, and
10
+ * left 3369's pre-registered entry orphaned. One worker, two rows.
11
+ *
12
+ * Each launch now mints a token that rides into the spawned CLI's MCP config
13
+ * as an `X-SiloLink-Launch` header on the local silolink server entry. When
14
+ * the CLI's mcp-remote bridge initializes against this daemon, the MCP server
15
+ * reads the header and binds transport.sessionId → the launch. remote_register
16
+ * can then tell which pane is calling, adopt the pre-registered session for
17
+ * the LAUNCHED conversation, and hand the backend the agent_session_id /
18
+ * launch_correlation_id the launch payload carried.
19
+ */
20
+ export const LAUNCH_HEADER = 'X-SiloLink-Launch';
21
+ export class LaunchBindingRegistry {
22
+ byToken = new Map();
23
+ byTransport = new Map();
24
+ static MAX_AGE_MS = 24 * 60 * 60 * 1000;
25
+ /** Called by the launcher when it writes a launch's MCP config. */
26
+ register(binding) {
27
+ const full = { createdAt: Date.now(), ...binding };
28
+ // One live binding per conversation: a relaunch supersedes the old token.
29
+ for (const [tok, b] of this.byToken) {
30
+ if (b.conversationId === full.conversationId && tok !== full.token)
31
+ this.byToken.delete(tok);
32
+ }
33
+ this.byToken.set(full.token, full);
34
+ this.prune();
35
+ return full;
36
+ }
37
+ /** Called by the MCP server on transport initialize. Unknown tokens bind nothing. */
38
+ bindTransport(transportSessionId, token) {
39
+ if (!token)
40
+ return undefined;
41
+ const binding = this.byToken.get(token);
42
+ if (!binding)
43
+ return undefined;
44
+ this.byTransport.set(transportSessionId, binding);
45
+ return binding;
46
+ }
47
+ unbindTransport(transportSessionId) {
48
+ this.byTransport.delete(transportSessionId);
49
+ }
50
+ forTransport(transportSessionId) {
51
+ return transportSessionId ? this.byTransport.get(transportSessionId) : undefined;
52
+ }
53
+ forConversation(conversationId) {
54
+ for (const b of this.byToken.values()) {
55
+ if (b.conversationId === conversationId)
56
+ return b;
57
+ }
58
+ return undefined;
59
+ }
60
+ /** Drop the launch binding once its conversation's session is gone for good. */
61
+ forgetConversation(conversationId) {
62
+ for (const [tok, b] of this.byToken) {
63
+ if (b.conversationId === conversationId)
64
+ this.byToken.delete(tok);
65
+ }
66
+ for (const [tid, b] of this.byTransport) {
67
+ if (b.conversationId === conversationId)
68
+ this.byTransport.delete(tid);
69
+ }
70
+ }
71
+ size() {
72
+ return this.byToken.size;
73
+ }
74
+ prune(now = Date.now()) {
75
+ for (const [tok, b] of this.byToken) {
76
+ if (now - b.createdAt > LaunchBindingRegistry.MAX_AGE_MS)
77
+ this.byToken.delete(tok);
78
+ }
79
+ }
80
+ }
81
+ //# sourceMappingURL=launch-binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-binding.js","sourceRoot":"","sources":["../../src/core/launch-binding.ts"],"names":[],"mappings":"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"}
@@ -32,7 +32,7 @@ export interface UsageReconcileTarget {
32
32
  * Result of trying to settle one ledger entry.
33
33
  * Everything except 'failed' settles the entry; 'failed' keeps it for a retry.
34
34
  */
35
- export type UsageReconcileOutcome = 'reported' | 'no_usage' | 'rejected' | 'failed';
35
+ export type UsageReconcileOutcome = 'reported' | 'no_usage' | 'rejected' | 'failed' | 'blocked';
36
36
  /**
37
37
  * Disk-backed registry of sessions with potentially-unreported usage
38
38
  * (~/.silolink/usage-ledger.json). Entries are upserted while a session is
@@ -1 +1 @@
1
- {"version":3,"file":"usage-ledger.d.ts","sourceRoot":"","sources":["../../src/core/usage-ledger.ts"],"names":[],"mappings":"AAMA;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,2GAA2G;IAC3G,OAAO,EAAE,MAAM,CAAC;IAChB,qGAAqG;IACrG,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEpF;;;;;;GAMG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC;;;;;;;;;;;OAWG;gBACS,QAAQ,GAAE,MAA0B,EAAE,KAAK,CAAC,EAAE,MAAM;IAMhE;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,WAAW,GAAG,WAAW,CAAC,GAAG,IAAI;IAsBtE,GAAG,CAAC,cAAc,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAIzD,iHAAiH;IACjH,MAAM,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAIpC,MAAM,IAAI,gBAAgB,EAAE;IAI5B,OAAO,CAAC,IAAI;IASZ,OAAO,CAAC,IAAI;CAgBb"}
1
+ {"version":3,"file":"usage-ledger.d.ts","sourceRoot":"","sources":["../../src/core/usage-ledger.ts"],"names":[],"mappings":"AAMA;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,2GAA2G;IAC3G,OAAO,EAAE,MAAM,CAAC;IAChB,qGAAqG;IACrG,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEhG;;;;;;GAMG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC;;;;;;;;;;;OAWG;gBACS,QAAQ,GAAE,MAA0B,EAAE,KAAK,CAAC,EAAE,MAAM;IAMhE;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,WAAW,GAAG,WAAW,CAAC,GAAG,IAAI;IAsBtE,GAAG,CAAC,cAAc,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAIzD,iHAAiH;IACjH,MAAM,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAIpC,MAAM,IAAI,gBAAgB,EAAE;IAI5B,OAAO,CAAC,IAAI;IASZ,OAAO,CAAC,IAAI;CAgBb"}
@@ -6,6 +6,7 @@ import type { ActionCableClient } from '../cable/action-cable-client.js';
6
6
  import type { SiloLinkConfig } from '../types/index.js';
7
7
  import type { WorkspaceManager } from '../core/workspace-manager.js';
8
8
  import type { AgentLauncher } from '../core/agent-launcher.js';
9
+ import { type LaunchBindingRegistry } from '../core/launch-binding.js';
9
10
  interface McpServerDeps {
10
11
  config: SiloLinkConfig;
11
12
  sessionManager: SessionManager;
@@ -15,6 +16,7 @@ interface McpServerDeps {
15
16
  cableClient: ActionCableClient;
16
17
  workspaceManager?: WorkspaceManager;
17
18
  launcher?: AgentLauncher;
19
+ launchBindings?: LaunchBindingRegistry;
18
20
  startedAt?: () => Date | null;
19
21
  onModuleLoadFailure?: (err: Error) => void;
20
22
  probeStatus?: () => 'ok' | 'failing' | 'unknown';
@@ -34,6 +36,8 @@ export declare class SiloLinkMcpServer {
34
36
  constructor(deps: McpServerDeps);
35
37
  private createServerForSession;
36
38
  private setupRoutes;
39
+ /** Is the MCP transport for this session id currently open (the CLI's bridge is connected)? */
40
+ hasTransport(mcpSessionId: string): boolean;
37
41
  /**
38
42
  * Bind the MCP server, preferring `preferredPort`. If that port is already
39
43
  * in use (e.g. another agent's daemon on the same machine), increment and
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAO/D,UAAU,aAAa;IACrB,MAAM,EAAE,cAAc,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAK9B,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAG3C,WAAW,CAAC,EAAE,MAAM,IAAI,GAAG,SAAS,GAAG,SAAS,CAAC;CAClD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAKzD;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,UAAU,CAAyD;IAC3E,OAAO,CAAC,IAAI,CAAgB;gBAEhB,IAAI,EAAE,aAAa;IAO/B,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,WAAW;IA4HnB;;;;;OAKG;IACH,KAAK,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,SAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAwBzD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAe5B"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,EAAiB,KAAK,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAMtF,UAAU,aAAa;IACrB,MAAM,EAAE,cAAc,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,EAAE,aAAa,CAAC;IAGzB,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAK9B,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAG3C,WAAW,CAAC,EAAE,MAAM,IAAI,GAAG,SAAS,GAAG,SAAS,CAAC;CAClD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAKzD;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,UAAU,CAAyD;IAC3E,OAAO,CAAC,IAAI,CAAgB;gBAEhB,IAAI,EAAE,aAAa;IAO/B,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,WAAW;IAqInB,+FAA+F;IAC/F,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAI3C;;;;;OAKG;IACH,KAAK,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,SAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAwBzD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAe5B"}
@@ -7,6 +7,7 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
7
7
  import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
8
8
  import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
9
9
  import { registerTools } from './tools/register-tools.js';
10
+ import { LAUNCH_HEADER } from '../core/launch-binding.js';
10
11
  const __filename = fileURLToPath(import.meta.url);
11
12
  const __dirname = path.dirname(__filename);
12
13
  const pkg = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../../package.json'), 'utf-8'));
@@ -52,15 +53,25 @@ export class SiloLinkMcpServer {
52
53
  return;
53
54
  }
54
55
  if (!sessionId && isInitializeRequest(req.body)) {
56
+ const launchHeader = req.headers[LAUNCH_HEADER.toLowerCase()];
57
+ const launchToken = Array.isArray(launchHeader) ? launchHeader[0] : launchHeader;
55
58
  const transport = new StreamableHTTPServerTransport({
56
59
  sessionIdGenerator: () => randomUUID(),
57
60
  onsessioninitialized: (newSessionId) => {
58
61
  this.transports.set(newSessionId, transport);
62
+ const bound = this.deps.launchBindings?.bindTransport(newSessionId, launchToken);
63
+ if (bound) {
64
+ console.log(`[MCP] transport ${newSessionId} bound to launched conversation ${bound.conversationId}`);
65
+ }
66
+ else if (launchToken) {
67
+ console.warn(`[MCP] transport ${newSessionId} presented an unknown launch token — not bound`);
68
+ }
59
69
  },
60
70
  });
61
71
  transport.onclose = () => {
62
72
  if (transport.sessionId) {
63
73
  this.transports.delete(transport.sessionId);
74
+ this.deps.launchBindings?.unbindTransport(transport.sessionId);
64
75
  }
65
76
  };
66
77
  const server = this.createServerForSession(transport);
@@ -155,6 +166,10 @@ export class SiloLinkMcpServer {
155
166
  }
156
167
  });
157
168
  }
169
+ /** Is the MCP transport for this session id currently open (the CLI's bridge is connected)? */
170
+ hasTransport(mcpSessionId) {
171
+ return this.transports.has(mcpSessionId);
172
+ }
158
173
  /**
159
174
  * Bind the MCP server, preferring `preferredPort`. If that port is already
160
175
  * in use (e.g. another agent's daemon on the same machine), increment and