@dsiloed/silo-link 1.19.15 → 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.
- package/README.md +8 -0
- package/dist/api/backend-health.d.ts +44 -0
- package/dist/api/backend-health.d.ts.map +1 -0
- package/dist/api/backend-health.js +80 -0
- package/dist/api/backend-health.js.map +1 -0
- package/dist/api/dsiloed-client.d.ts +7 -3
- package/dist/api/dsiloed-client.d.ts.map +1 -1
- package/dist/api/dsiloed-client.js +29 -4
- package/dist/api/dsiloed-client.js.map +1 -1
- package/dist/cable/subscription-manager.d.ts +26 -1
- package/dist/cable/subscription-manager.d.ts.map +1 -1
- package/dist/cable/subscription-manager.js +72 -13
- package/dist/cable/subscription-manager.js.map +1 -1
- package/dist/cli/claude-md-block.d.ts +1 -1
- package/dist/cli/claude-md-block.d.ts.map +1 -1
- package/dist/cli/claude-md-block.js +3 -1
- package/dist/cli/claude-md-block.js.map +1 -1
- package/dist/cli/file-log.d.ts +58 -3
- package/dist/cli/file-log.d.ts.map +1 -1
- package/dist/cli/file-log.js +110 -7
- package/dist/cli/file-log.js.map +1 -1
- package/dist/core/agent-launcher.d.ts +26 -0
- package/dist/core/agent-launcher.d.ts.map +1 -1
- package/dist/core/auto-updater.d.ts +11 -0
- package/dist/core/auto-updater.d.ts.map +1 -1
- package/dist/core/auto-updater.js +84 -15
- package/dist/core/auto-updater.js.map +1 -1
- package/dist/core/base-tmux-launcher.d.ts +66 -20
- package/dist/core/base-tmux-launcher.d.ts.map +1 -1
- package/dist/core/base-tmux-launcher.js +236 -76
- package/dist/core/base-tmux-launcher.js.map +1 -1
- package/dist/core/bridge.d.ts +28 -0
- package/dist/core/bridge.d.ts.map +1 -1
- package/dist/core/bridge.js +217 -25
- package/dist/core/bridge.js.map +1 -1
- package/dist/core/claude-launcher.d.ts +11 -4
- package/dist/core/claude-launcher.d.ts.map +1 -1
- package/dist/core/claude-launcher.js +59 -16
- package/dist/core/claude-launcher.js.map +1 -1
- package/dist/core/codex-launcher.d.ts +3 -3
- package/dist/core/codex-launcher.d.ts.map +1 -1
- package/dist/core/codex-launcher.js +9 -5
- package/dist/core/codex-launcher.js.map +1 -1
- package/dist/core/gemini-launcher.d.ts +3 -3
- package/dist/core/gemini-launcher.d.ts.map +1 -1
- package/dist/core/gemini-launcher.js +9 -5
- package/dist/core/gemini-launcher.js.map +1 -1
- package/dist/core/health-monitor.d.ts +87 -0
- package/dist/core/health-monitor.d.ts.map +1 -0
- package/dist/core/health-monitor.js +93 -0
- package/dist/core/health-monitor.js.map +1 -0
- package/dist/core/idle-completion.d.ts +38 -0
- package/dist/core/idle-completion.d.ts.map +1 -0
- package/dist/core/idle-completion.js +52 -0
- package/dist/core/idle-completion.js.map +1 -0
- package/dist/core/launch-binding.d.ts +52 -0
- package/dist/core/launch-binding.d.ts.map +1 -0
- package/dist/core/launch-binding.js +81 -0
- package/dist/core/launch-binding.js.map +1 -0
- package/dist/core/transcript-usage.d.ts +9 -0
- package/dist/core/transcript-usage.d.ts.map +1 -1
- package/dist/core/transcript-usage.js +19 -0
- package/dist/core/transcript-usage.js.map +1 -1
- package/dist/core/usage-ledger.d.ts +1 -1
- package/dist/core/usage-ledger.d.ts.map +1 -1
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +15 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/register-tools.d.ts +2 -0
- package/dist/mcp/tools/register-tools.d.ts.map +1 -1
- package/dist/mcp/tools/register-tools.js +154 -36
- package/dist/mcp/tools/register-tools.js.map +1 -1
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +3 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-launcher.d.ts","sourceRoot":"","sources":["../../src/core/codex-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;
|
|
1
|
+
{"version":3,"file":"codex-launcher.d.ts","sourceRoot":"","sources":["../../src/core/codex-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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,aAAc,SAAQ,gBAAgB;gBAE/C,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;IAiB3B,SAAS,CAAC,UAAU,IAAI,MAAM;IAM9B,SAAS,CAAC,OAAO,IAAI,MAAM,EAAE;IAK7B,SAAS,CAAC,UAAU,IAAI,MAAM,EAAE;IAOhC,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;IAwEpH,SAAS,CAAC,YAAY,IAAI,OAAO;IAIjC,SAAS,CAAC,mBAAmB,IAAI,MAAM;IAcvC,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;IAW/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;;;;;;;;;;;OAWG;cACgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI;IA4B/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;IAmD1C;;;;;OAKG;IACH,OAAO,CAAC,SAAS;IAKjB;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAgBvB;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB;CAK5B"}
|
|
@@ -2,7 +2,7 @@ import { existsSync, mkdirSync, writeFileSync, readFileSync, copyFileSync } from
|
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
4
|
import { BaseTmuxLauncher } from './base-tmux-launcher.js';
|
|
5
|
-
import { locateCodexTranscript, parseCodexTranscript, codexCostBasis, isResumableCodexTranscript, } from './transcript-usage.js';
|
|
5
|
+
import { locateCodexTranscript, parseCodexTranscript, codexCostBasis, isResumableCodexTranscript, transcriptTouchedSince, } from './transcript-usage.js';
|
|
6
6
|
/**
|
|
7
7
|
* Codex CLI (OpenAI) implementation of the AgentLauncher interface.
|
|
8
8
|
*
|
|
@@ -69,7 +69,7 @@ export class CodexLauncher extends BaseTmuxLauncher {
|
|
|
69
69
|
formatPrompt(prompt) {
|
|
70
70
|
return this.adaptPromptForCodex(prompt);
|
|
71
71
|
}
|
|
72
|
-
async setupMcpConfig(cwd, toolAllowlist) {
|
|
72
|
+
async setupMcpConfig(cwd, toolAllowlist, launch) {
|
|
73
73
|
if (!this.config.jwt) {
|
|
74
74
|
throw new Error('No JWT in config. Run "silolink config" to log in.');
|
|
75
75
|
}
|
|
@@ -117,7 +117,7 @@ export class CodexLauncher extends BaseTmuxLauncher {
|
|
|
117
117
|
'# Managed by SiloLink — MCP servers (regenerated each launch). stdio via bundled mcp-remote.',
|
|
118
118
|
'[mcp_servers.silolink]',
|
|
119
119
|
`command = ${tomlStr(bridge.command)}`,
|
|
120
|
-
`args = ${tomlArray([...bridge.args, `http://localhost:${this.config.mcp_port}/mcp
|
|
120
|
+
`args = ${tomlArray([...bridge.args, `http://localhost:${this.config.mcp_port}/mcp`, ...this.launchHeaderArgs(launch)])}`,
|
|
121
121
|
`env = { PATH = ${tomlStr(pathEnv)} }`,
|
|
122
122
|
'',
|
|
123
123
|
'[mcp_servers.silolink_server]',
|
|
@@ -195,7 +195,7 @@ export class CodexLauncher extends BaseTmuxLauncher {
|
|
|
195
195
|
// (-> matching session_meta) + the resumed session id. cost_basis reflects the
|
|
196
196
|
// live codex auth mode (API key = real $, ChatGPT sign-in = imputed).
|
|
197
197
|
extractTranscriptUsage(cwd, cliSessionId) {
|
|
198
|
-
const transcriptPath = locateCodexTranscript(cwd, cliSessionId ??
|
|
198
|
+
const transcriptPath = locateCodexTranscript(cwd, cliSessionId ?? null);
|
|
199
199
|
if (!transcriptPath)
|
|
200
200
|
return null;
|
|
201
201
|
const usage = parseCodexTranscript(readFileSync(transcriptPath, 'utf-8'));
|
|
@@ -215,10 +215,14 @@ export class CodexLauncher extends BaseTmuxLauncher {
|
|
|
215
215
|
* setupMcpConfig has set that up + the env-prefixed launch points codex there,
|
|
216
216
|
* so the rollout lands where we look.
|
|
217
217
|
*/
|
|
218
|
-
detectResumeId(cwd) {
|
|
218
|
+
detectResumeId(cwd, notBefore) {
|
|
219
219
|
const transcriptPath = locateCodexTranscript(cwd, null);
|
|
220
220
|
if (!transcriptPath)
|
|
221
221
|
return null;
|
|
222
|
+
if (notBefore && !transcriptTouchedSince(transcriptPath, notBefore)) {
|
|
223
|
+
console.warn(`[CodexLauncher] Skipping resume capture — rollout ${transcriptPath} predates this pane (started ${notBefore.toISOString()}); it belongs to an earlier session in this cwd.`);
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
222
226
|
// Don't pin a meta-only rollout (session killed during warm-up before any
|
|
223
227
|
// real event) — `codex resume <uuid>` on it would fail and loop. A fresh
|
|
224
228
|
// launch is the safe fallback. See isResumableCodexTranscript.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-launcher.js","sourceRoot":"","sources":["../../src/core/codex-launcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC3F,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAOlC,OAAO,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"codex-launcher.js","sourceRoot":"","sources":["../../src/core/codex-launcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import type { MessageQueue } from './message-queue.js';
|
|
|
4
4
|
import type { DSiloedClient } from '../api/dsiloed-client.js';
|
|
5
5
|
import type { WorkspaceManager } from './workspace-manager.js';
|
|
6
6
|
import type { UsageLedger } from './usage-ledger.js';
|
|
7
|
-
import { BaseTmuxLauncher } from './base-tmux-launcher.js';
|
|
7
|
+
import { BaseTmuxLauncher, type LaunchIdentity } from './base-tmux-launcher.js';
|
|
8
8
|
import { type UsageEntry } from './transcript-usage.js';
|
|
9
9
|
/**
|
|
10
10
|
* Gemini CLI implementation of the AgentLauncher interface.
|
|
@@ -21,7 +21,7 @@ export declare class GeminiLauncher extends BaseTmuxLauncher {
|
|
|
21
21
|
protected getArgs(): string[];
|
|
22
22
|
protected getReadyIndicator(): string[];
|
|
23
23
|
protected formatPrompt(prompt: string): string;
|
|
24
|
-
protected setupMcpConfig(cwd: string, toolAllowlist?: string[] | null): Promise<void>;
|
|
24
|
+
protected setupMcpConfig(cwd: string, toolAllowlist?: string[] | null, launch?: LaunchIdentity): Promise<void>;
|
|
25
25
|
protected checkEnabled(): boolean;
|
|
26
26
|
protected getWorkingDirectory(): string;
|
|
27
27
|
protected isAutoRespawnConfigured(): boolean;
|
|
@@ -50,7 +50,7 @@ export declare class GeminiLauncher extends BaseTmuxLauncher {
|
|
|
50
50
|
* session (the relaunch path is best-effort and never blocks). We still capture
|
|
51
51
|
* + wire it symmetrically so resume works as soon as the CLI supports it.
|
|
52
52
|
*/
|
|
53
|
-
protected detectResumeId(cwd: string): string | null;
|
|
53
|
+
protected detectResumeId(cwd: string, notBefore?: Date): string | null;
|
|
54
54
|
protected buildLaunchPrompt(reason: string, conversationId: number | undefined, agentContext: string, workspaceContext: string): {
|
|
55
55
|
prompt: string;
|
|
56
56
|
extraArgs: string[];
|
|
@@ -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;
|
|
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"}
|
|
@@ -2,7 +2,7 @@ import { existsSync, mkdirSync, writeFileSync, readFileSync } from 'node:fs';
|
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
4
|
import { BaseTmuxLauncher } from './base-tmux-launcher.js';
|
|
5
|
-
import { locateGeminiTranscript, parseGeminiTranscript, geminiCostBasis, isResumableGeminiTranscript, } from './transcript-usage.js';
|
|
5
|
+
import { locateGeminiTranscript, parseGeminiTranscript, geminiCostBasis, isResumableGeminiTranscript, transcriptTouchedSince, } from './transcript-usage.js';
|
|
6
6
|
/**
|
|
7
7
|
* Gemini CLI implementation of the AgentLauncher interface.
|
|
8
8
|
*
|
|
@@ -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 = {
|
|
@@ -160,7 +160,7 @@ export class GeminiLauncher extends BaseTmuxLauncher {
|
|
|
160
160
|
// launch cwd (-> project slug) + the resumed session id. cost_basis reflects
|
|
161
161
|
// the live Gemini auth mode (API key = real $, OAuth = imputed).
|
|
162
162
|
extractTranscriptUsage(cwd, cliSessionId) {
|
|
163
|
-
const transcriptPath = locateGeminiTranscript(cwd, cliSessionId ??
|
|
163
|
+
const transcriptPath = locateGeminiTranscript(cwd, cliSessionId ?? null);
|
|
164
164
|
if (!transcriptPath)
|
|
165
165
|
return null;
|
|
166
166
|
const usage = parseGeminiTranscript(readFileSync(transcriptPath, 'utf-8'));
|
|
@@ -179,10 +179,14 @@ export class GeminiLauncher extends BaseTmuxLauncher {
|
|
|
179
179
|
* session (the relaunch path is best-effort and never blocks). We still capture
|
|
180
180
|
* + wire it symmetrically so resume works as soon as the CLI supports it.
|
|
181
181
|
*/
|
|
182
|
-
detectResumeId(cwd) {
|
|
182
|
+
detectResumeId(cwd, notBefore) {
|
|
183
183
|
const transcriptPath = locateGeminiTranscript(cwd, null);
|
|
184
184
|
if (!transcriptPath)
|
|
185
185
|
return null;
|
|
186
|
+
if (notBefore && !transcriptTouchedSince(transcriptPath, notBefore)) {
|
|
187
|
+
console.warn(`[GeminiLauncher] Skipping resume capture — transcript ${transcriptPath} predates this pane (started ${notBefore.toISOString()}); it belongs to an earlier session in this cwd.`);
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
186
190
|
// Don't pin a header-only stub (session killed during warm-up before any
|
|
187
191
|
// turn) — resuming it would land in an empty/invalid session. A fresh launch
|
|
188
192
|
// is the safe fallback. See isResumableGeminiTranscript.
|
|
@@ -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,
|
|
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":"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"}
|
|
@@ -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"}
|