@dsiloed/silo-link 1.19.11 → 1.19.14

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 (37) hide show
  1. package/README.md +8 -0
  2. package/dist/cable/subscription-manager.d.ts +26 -1
  3. package/dist/cable/subscription-manager.d.ts.map +1 -1
  4. package/dist/cable/subscription-manager.js +72 -13
  5. package/dist/cable/subscription-manager.js.map +1 -1
  6. package/dist/cli/file-log.d.ts +58 -3
  7. package/dist/cli/file-log.d.ts.map +1 -1
  8. package/dist/cli/file-log.js +110 -7
  9. package/dist/cli/file-log.js.map +1 -1
  10. package/dist/core/agent-launcher.d.ts +19 -0
  11. package/dist/core/agent-launcher.d.ts.map +1 -1
  12. package/dist/core/base-tmux-launcher.d.ts +82 -19
  13. package/dist/core/base-tmux-launcher.d.ts.map +1 -1
  14. package/dist/core/base-tmux-launcher.js +304 -76
  15. package/dist/core/base-tmux-launcher.js.map +1 -1
  16. package/dist/core/bridge.d.ts.map +1 -1
  17. package/dist/core/bridge.js +9 -4
  18. package/dist/core/bridge.js.map +1 -1
  19. package/dist/core/claude-launcher.d.ts +7 -2
  20. package/dist/core/claude-launcher.d.ts.map +1 -1
  21. package/dist/core/claude-launcher.js +41 -18
  22. package/dist/core/claude-launcher.js.map +1 -1
  23. package/dist/core/codex-launcher.d.ts +1 -1
  24. package/dist/core/codex-launcher.d.ts.map +1 -1
  25. package/dist/core/codex-launcher.js +17 -14
  26. package/dist/core/codex-launcher.js.map +1 -1
  27. package/dist/core/gemini-launcher.d.ts +1 -1
  28. package/dist/core/gemini-launcher.d.ts.map +1 -1
  29. package/dist/core/gemini-launcher.js +17 -14
  30. package/dist/core/gemini-launcher.js.map +1 -1
  31. package/dist/core/transcript-usage.d.ts +9 -0
  32. package/dist/core/transcript-usage.d.ts.map +1 -1
  33. package/dist/core/transcript-usage.js +19 -0
  34. package/dist/core/transcript-usage.js.map +1 -1
  35. package/dist/types/index.d.ts +2 -0
  36. package/dist/types/index.d.ts.map +1 -1
  37. package/package.json +2 -1
package/README.md CHANGED
@@ -129,6 +129,14 @@ silolink start
129
129
  silolink start --daemon
130
130
  ```
131
131
 
132
+ The daemon owns its log: every run appends (never truncates) to
133
+ `~/.silolink/logs/silolink-<env>.log`, with a session-start banner and an ISO-8601
134
+ timestamp on every line. Do **not** wrap `start` in `| tee` or redirect its output
135
+ into that same file (`>> ~/.silolink/logs/silolink-<env>.log`) — the daemon detects
136
+ an fd that already is the log and won't double-write, but the redirect is redundant.
137
+ Send a wrapper's stdout/stderr to `/dev/null`; when stdout is not a terminal the
138
+ daemon mutes console output anyway (set `SILOLINK_CONSOLE=1` to keep it).
139
+
132
140
  ### Managing the Daemon
133
141
 
134
142
  ```bash
@@ -3,6 +3,17 @@ import type { MessageQueue } from '../core/message-queue.js';
3
3
  import type { SessionManager } from '../core/session-manager.js';
4
4
  import type { AgentLauncher } from '../core/agent-launcher.js';
5
5
  import type { DSiloedClient } from '../api/dsiloed-client.js';
6
+ import type { Session } from '../types/index.js';
7
+ export declare const DEFAULT_LAUNCH_GRACE_MS: number;
8
+ export interface SubscriptionManagerOptions {
9
+ staleInboundGraceMs?: number;
10
+ }
11
+ export interface StaleInboundDecision {
12
+ recycle: boolean;
13
+ reason: string;
14
+ paneName: string | null;
15
+ idleMs: number;
16
+ }
6
17
  export declare class SubscriptionManager {
7
18
  private cableClient;
8
19
  private messageQueue;
@@ -14,7 +25,9 @@ export declare class SubscriptionManager {
14
25
  private recentContentHashes;
15
26
  private pendingMessages;
16
27
  private launchingConversations;
17
- constructor(cableClient: ActionCableClient, messageQueue: MessageQueue, sessionManager: SessionManager, launcher?: AgentLauncher, dsiloedClient?: DSiloedClient, launcherResolver?: (provider?: string) => AgentLauncher);
28
+ private staleInboundGraceMs;
29
+ private recycleTimestamps;
30
+ constructor(cableClient: ActionCableClient, messageQueue: MessageQueue, sessionManager: SessionManager, launcher?: AgentLauncher, dsiloedClient?: DSiloedClient, launcherResolver?: (provider?: string) => AgentLauncher, options?: SubscriptionManagerOptions);
18
31
  subscribe(conversationId: number): void;
19
32
  unsubscribe(conversationId: number): void;
20
33
  /**
@@ -32,6 +45,18 @@ export declare class SubscriptionManager {
32
45
  */
33
46
  private resolveAgentAndLaunch;
34
47
  private handleCableMessage;
48
+ /** The launcher that owns a session's provider, falling back to the default. */
49
+ private launcherForSession;
50
+ /**
51
+ * Should an inbound message recycle this session? MCP silence alone is not
52
+ * evidence (poll tools don't bump lastActivity); the pane must be present,
53
+ * NOT actively thinking and frozen past the launcher's threshold — the same
54
+ * bar the periodic wedged-session reaper applies. Launch-pending entries and
55
+ * sessions inside the launch grace window are never recycled.
56
+ */
57
+ evaluateStaleOnInbound(session: Session, launcher: AgentLauncher | null, now?: number): StaleInboundDecision;
58
+ /** Count of stale-on-inbound recycles within the trailing window (health). */
59
+ recyclesWithin(windowMs: number, now?: number): number;
35
60
  /**
36
61
  * Auto-launch a session for an inbound message that found no live session —
37
62
  * UNLESS the conversation's most recent backend session is an already-ended
@@ -1 +1 @@
1
- {"version":3,"file":"subscription-manager.d.ts","sourceRoot":"","sources":["../../src/cable/subscription-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAM9D,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,QAAQ,CAAuB;IAIvC,OAAO,CAAC,gBAAgB,CAAgD;IACxE,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,kBAAkB,CAAgB;IAE1C,OAAO,CAAC,mBAAmB,CAA6C;IAExE,OAAO,CAAC,eAAe,CAA4C;IAQnE,OAAO,CAAC,sBAAsB,CAA0B;gBAGtD,WAAW,EAAE,iBAAiB,EAC9B,YAAY,EAAE,YAAY,EAC1B,cAAc,EAAE,cAAc,EAC9B,QAAQ,CAAC,EAAE,aAAa,EACxB,aAAa,CAAC,EAAE,aAAa,EAC7B,gBAAgB,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,aAAa;IAczD,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAIvC,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAIzC;;OAEG;IACH,2BAA2B,IAAI,IAAI;IAanC;;;OAGG;IACH,oBAAoB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAarE,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAO/C;;OAEG;YACW,qBAAqB;IAyBnC,OAAO,CAAC,kBAAkB;IAoG1B;;;;;;;;;OASG;YACW,eAAe;IAoE7B,kFAAkF;IAClF,OAAO,CAAC,qBAAqB;CAQ9B"}
1
+ {"version":3,"file":"subscription-manager.d.ts","sourceRoot":"","sources":["../../src/cable/subscription-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAwC,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAUvF,eAAO,MAAM,uBAAuB,QAAiB,CAAC;AAEtD,MAAM,WAAW,0BAA0B;IACzC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,QAAQ,CAAuB;IAIvC,OAAO,CAAC,gBAAgB,CAAgD;IACxE,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,kBAAkB,CAAgB;IAE1C,OAAO,CAAC,mBAAmB,CAA6C;IAExE,OAAO,CAAC,eAAe,CAA4C;IAQnE,OAAO,CAAC,sBAAsB,CAA0B;IACxD,OAAO,CAAC,mBAAmB,CAAS;IAEpC,OAAO,CAAC,iBAAiB,CAAgB;gBAGvC,WAAW,EAAE,iBAAiB,EAC9B,YAAY,EAAE,YAAY,EAC1B,cAAc,EAAE,cAAc,EAC9B,QAAQ,CAAC,EAAE,aAAa,EACxB,aAAa,CAAC,EAAE,aAAa,EAC7B,gBAAgB,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,aAAa,EACvD,OAAO,GAAE,0BAA+B;IAiB1C,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAIvC,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAIzC;;OAEG;IACH,2BAA2B,IAAI,IAAI;IAanC;;;OAGG;IACH,oBAAoB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAarE,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAO/C;;OAEG;YACW,qBAAqB;IAyBnC,OAAO,CAAC,kBAAkB;IA0G1B,gFAAgF;IAChF,OAAO,CAAC,kBAAkB;IAW1B;;;;;;OAMG;IACH,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,EAAE,GAAG,GAAE,MAAmB,GAAG,oBAAoB;IAexH,8EAA8E;IAC9E,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM;IAKlE;;;;;;;;;OASG;YACW,eAAe;IAoE7B,kFAAkF;IAClF,OAAO,CAAC,qBAAqB;CAQ9B"}
@@ -1,5 +1,12 @@
1
1
  const MAX_TRACKED_IDS = 100;
2
2
  const DEDUP_WINDOW_MS = 30_000; // 30-second window for content dedup
3
+ // Stale-on-inbound: no "work" MCP call for this long makes a session a recycle
4
+ // CANDIDATE (poll tools don't bump lastActivity, so silence alone is not proof).
5
+ const STALE_INBOUND_MS = 5 * 60 * 1000;
6
+ // A session younger than this is never recycled on inbound: a pane can take
7
+ // minutes to register, or register under another conversation (2026-08-24,
8
+ // conv 3369's pre-registered entry with a launch-time lastActivity).
9
+ export const DEFAULT_LAUNCH_GRACE_MS = 10 * 60 * 1000;
3
10
  export class SubscriptionManager {
4
11
  cableClient;
5
12
  messageQueue;
@@ -23,13 +30,19 @@ export class SubscriptionManager {
23
30
  // before relaunch"), losing the first message. SessionManager.pendingLaunch()
24
31
  // only covers deliberate control-channel launches, not auto-launch's own.
25
32
  launchingConversations = new Set();
26
- constructor(cableClient, messageQueue, sessionManager, launcher, dsiloedClient, launcherResolver) {
33
+ staleInboundGraceMs;
34
+ // Stale-on-inbound recycles this process lifetime (fed to the health block).
35
+ recycleTimestamps = [];
36
+ constructor(cableClient, messageQueue, sessionManager, launcher, dsiloedClient, launcherResolver, options = {}) {
27
37
  this.cableClient = cableClient;
28
38
  this.messageQueue = messageQueue;
29
39
  this.sessionManager = sessionManager;
30
40
  this.launcher = launcher || null;
31
41
  this.launcherResolver = launcherResolver || null;
32
42
  this.dsiloedClient = dsiloedClient || null;
43
+ this.staleInboundGraceMs = typeof options.staleInboundGraceMs === 'number' && options.staleInboundGraceMs >= 0
44
+ ? options.staleInboundGraceMs
45
+ : DEFAULT_LAUNCH_GRACE_MS;
33
46
  this.cableClient.on('message', (event) => {
34
47
  this.handleCableMessage(event.conversationId, event.data);
35
48
  });
@@ -156,24 +169,27 @@ export class SubscriptionManager {
156
169
  // Route to correct session by conversation ID
157
170
  const session = this.sessionManager.getByConversationId(conversationId);
158
171
  if (session) {
159
- // Check if session is stale (no MCP activity for 5+ minutes).
160
- // This catches cases where Claude went idle and stopped generating
161
- // but didn't unregister — the tmux is alive but nobody is polling.
162
- // Note: 5 minutes (not 2) to avoid false positives during long tool
163
- // calls (e.g. Agent subprocesses, large file operations) where Claude
164
- // is busy but not making SiloLink MCP calls.
165
- const staleCutoff = 5 * 60 * 1000; // 5 minutes
166
- const sessionAge = Date.now() - session.lastActivity.getTime();
167
- if (sessionAge > staleCutoff && this.launcher?.isEnabled()) {
168
- console.log(`[SiloLink] Session ${session.sessionId} is stale (no MCP activity for ${Math.round(sessionAge / 60000)}min) — recycling for conv=${conversationId}`);
169
- // Kill the stale tmux session
170
- this.launcher.killByConversation(conversationId, 'stale-on-inbound');
172
+ // The session's OWN launcher (Gemini/Codex sessions used to be judged —
173
+ // and left un-killed — by the default launcher, then reaped as orphans).
174
+ const launcher = this.launcherForSession(session);
175
+ const decision = this.evaluateStaleOnInbound(session, launcher, now);
176
+ if (decision.recycle && launcher) {
177
+ const idleMin = Math.round(decision.idleMs / 60000);
178
+ console.log(`[SiloLink] Session ${session.sessionId} is stale (no MCP activity for ${idleMin}min, ` +
179
+ `pane ${decision.paneName ?? 'n/a'} ${decision.reason}) — recycling for conv=${conversationId}`);
180
+ // Kill the wedged tmux session
181
+ launcher.killByConversation(conversationId, 'stale-on-inbound');
182
+ this.recycleTimestamps.push(now);
171
183
  // Clean up the dead session
172
184
  this.messageQueue.clearSession(session.sessionId);
173
185
  this.sessionManager.unregister(session.sessionId);
174
186
  // Fall through to the auto-launch path below
175
187
  }
176
188
  else {
189
+ if (decision.idleMs > STALE_INBOUND_MS) {
190
+ console.log(`[SiloLink] Session ${session.sessionId} silent ${Math.round(decision.idleMs / 60000)}min but NOT recycled ` +
191
+ `(${decision.reason}, pane ${decision.paneName ?? 'n/a'}) — enqueuing for conv=${conversationId}`);
192
+ }
177
193
  console.log(`[SiloLink] Enqueuing to session ${session.sessionId}`);
178
194
  this.messageQueue.enqueue(session.sessionId, inbound);
179
195
  return;
@@ -189,6 +205,49 @@ export class SubscriptionManager {
189
205
  console.log(`[SiloLink] No active session for conversation ${conversationId} (launcher disabled)`);
190
206
  }
191
207
  }
208
+ /** The launcher that owns a session's provider, falling back to the default. */
209
+ launcherForSession(session) {
210
+ if (this.launcherResolver) {
211
+ try {
212
+ return this.launcherResolver(session.agentProvider) ?? this.launcher;
213
+ }
214
+ catch {
215
+ return this.launcher;
216
+ }
217
+ }
218
+ return this.launcher;
219
+ }
220
+ /**
221
+ * Should an inbound message recycle this session? MCP silence alone is not
222
+ * evidence (poll tools don't bump lastActivity); the pane must be present,
223
+ * NOT actively thinking and frozen past the launcher's threshold — the same
224
+ * bar the periodic wedged-session reaper applies. Launch-pending entries and
225
+ * sessions inside the launch grace window are never recycled.
226
+ */
227
+ evaluateStaleOnInbound(session, launcher, now = Date.now()) {
228
+ const idleMs = now - session.lastActivity.getTime();
229
+ const no = (reason, paneName = null) => ({ recycle: false, reason, paneName, idleMs });
230
+ if (idleMs <= STALE_INBOUND_MS)
231
+ return no('recent-mcp-activity');
232
+ if (!launcher || !launcher.isEnabled())
233
+ return no('launcher-disabled');
234
+ if (session.mcpSessionId.startsWith('launch-pending-'))
235
+ return no('launch-pending');
236
+ const ageMs = now - session.createdAt.getTime();
237
+ if (ageMs < this.staleInboundGraceMs)
238
+ return no(`in-launch-grace:${Math.round(ageMs / 60000)}min`);
239
+ if (typeof launcher.isSessionWedged !== 'function')
240
+ return no('launcher-cannot-judge-pane');
241
+ const verdict = launcher.isSessionWedged(session.conversationId);
242
+ if (!verdict.wedged)
243
+ return no(verdict.reason, verdict.paneName);
244
+ return { recycle: true, reason: verdict.reason, paneName: verdict.paneName, idleMs };
245
+ }
246
+ /** Count of stale-on-inbound recycles within the trailing window (health). */
247
+ recyclesWithin(windowMs, now = Date.now()) {
248
+ this.recycleTimestamps = this.recycleTimestamps.filter(t => now - t < windowMs);
249
+ return this.recycleTimestamps.length;
250
+ }
192
251
  /**
193
252
  * Auto-launch a session for an inbound message that found no live session —
194
253
  * UNLESS the conversation's most recent backend session is an already-ended
@@ -1 +1 @@
1
- {"version":3,"file":"subscription-manager.js","sourceRoot":"","sources":["../../src/cable/subscription-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subscription-manager.js","sourceRoot":"","sources":["../../src/cable/subscription-manager.ts"],"names":[],"mappings":"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"}
@@ -7,15 +7,70 @@
7
7
  * the file with O_TRUNC before the CLI prints anything. The daemon now owns its log —
8
8
  * opened with O_APPEND, under ~/.silolink/logs/ — so no wrapper is needed and a
9
9
  * double-start can never clobber history.
10
+ *
11
+ * 2026-08-24 (doug daemon, pop-os): a start script that redirected
12
+ * `>> ~/.silolink/logs/silolink-doug.log 2>&1` made fd 1/2 the SAME file the tee
13
+ * appends to, so 107 of 471 boot lines were doubled — and nothing in the file
14
+ * carried a timestamp except the boot banner. The tee now (1) fstat-compares fd 1/2
15
+ * against the log file and skips the tee for an fd that already IS the log,
16
+ * (2) stamps every line it writes to the file with an ISO-8601 timestamp, and
17
+ * (3) mutes console output for non-TTY fds (the file is the single sink) unless
18
+ * SILOLINK_CONSOLE=1 asks to keep it.
10
19
  */
11
20
  export declare function logFilePath(env?: string): string;
21
+ /** Per-fd line-boundary tracker so a timestamp is only ever inserted at a line start. */
22
+ export interface LineStampState {
23
+ atLineStart: boolean;
24
+ }
25
+ /**
26
+ * Prefix every line START in `text` with `<iso timestamp> `. Chunks may hold many
27
+ * newlines or none at all; the state carries the "are we at a line start" bit across
28
+ * chunks so a line split over several writes is stamped exactly once. Empty lines
29
+ * (a bare "\n" at a line start) are left blank rather than stamped.
30
+ */
31
+ export declare function stampLines(text: string, state: LineStampState, now?: () => string): string;
32
+ /** True when `fd` refers to the same inode as `filePath` (i.e. the fd IS the log file). */
33
+ export declare function fdIsFile(fd: number, filePath: string): boolean;
34
+ export interface FileLogStatus {
35
+ path: string;
36
+ bytes: number;
37
+ stdout_is_log: boolean;
38
+ stderr_is_log: boolean;
39
+ console_muted: boolean;
40
+ }
41
+ /** Snapshot of the attached file log for the health block (null when not attached). */
42
+ export declare function getFileLogStatus(): FileLogStatus | null;
43
+ export interface AttachOptions {
44
+ /** Override for tests: explicit log file path (default: logFilePath(env)). */
45
+ path?: string;
46
+ /** Override for tests: which fds back stdout/stderr (default 1 and 2). */
47
+ fds?: {
48
+ stdout: number;
49
+ stderr: number;
50
+ };
51
+ /** Override for tests: TTY-ness of each std stream (default: the real isTTY). */
52
+ isTTY?: {
53
+ stdout: boolean;
54
+ stderr: boolean;
55
+ };
56
+ /** Override for tests: SILOLINK_CONSOLE value (default: process.env). */
57
+ consoleEnv?: string | undefined;
58
+ /** Override for tests: timestamp source. */
59
+ now?: () => string;
60
+ }
12
61
  /**
13
62
  * Tee all stdout/stderr writes of THIS process into the env's append-mode log file,
14
- * prefixed by a timestamped session-start banner. Console behavior is unchanged —
15
- * tmux operators still see live output; the file is additive.
63
+ * prefixed by a timestamped session-start banner, with every subsequent line stamped.
64
+ *
65
+ * Per fd:
66
+ * - fd IS the log file (operator redirected `>> silolink-<env>.log`): write the stamped
67
+ * chunk through the ORIGINAL fd only — never also through the tee (no doubled lines).
68
+ * - fd is a TTY, or SILOLINK_CONSOLE=1: tee to the file (stamped) AND echo raw to the fd.
69
+ * - otherwise (fd is /dev/null, a pipe, some other file): file only — the file is the
70
+ * single sink and the redirect target stops accumulating a second copy.
16
71
  *
17
72
  * Returns the log path (for printing), or null when the log file could not be
18
73
  * opened — logging must never prevent the bridge from starting.
19
74
  */
20
- export declare function attachFileLog(env: string | undefined, version: string): string | null;
75
+ export declare function attachFileLog(env: string | undefined, version: string, opts?: AttachOptions): string | null;
21
76
  //# sourceMappingURL=file-log.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-log.d.ts","sourceRoot":"","sources":["../../src/cli/file-log.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAGhD;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA0BrF"}
1
+ {"version":3,"file":"file-log.d.ts","sourceRoot":"","sources":["../../src/cli/file-log.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAGhD;AAED,yFAAyF;AACzF,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,GAAE,MAAM,MAAuC,GAAG,MAAM,CAc1H;AAED,2FAA2F;AAC3F,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQ9D;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;CACxB;AAID,uFAAuF;AACvF,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,IAAI,CAKvD;AAED,MAAM,WAAW,aAAa;IAC5B,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,GAAG,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,iFAAiF;IACjF,KAAK,CAAC,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;IAC7C,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,4CAA4C;IAC5C,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,aAAkB,GAAG,MAAM,GAAG,IAAI,CA8D/G"}
@@ -10,39 +10,142 @@ import { getConfigDir } from '../config/config-manager.js';
10
10
  * the file with O_TRUNC before the CLI prints anything. The daemon now owns its log —
11
11
  * opened with O_APPEND, under ~/.silolink/logs/ — so no wrapper is needed and a
12
12
  * double-start can never clobber history.
13
+ *
14
+ * 2026-08-24 (doug daemon, pop-os): a start script that redirected
15
+ * `>> ~/.silolink/logs/silolink-doug.log 2>&1` made fd 1/2 the SAME file the tee
16
+ * appends to, so 107 of 471 boot lines were doubled — and nothing in the file
17
+ * carried a timestamp except the boot banner. The tee now (1) fstat-compares fd 1/2
18
+ * against the log file and skips the tee for an fd that already IS the log,
19
+ * (2) stamps every line it writes to the file with an ISO-8601 timestamp, and
20
+ * (3) mutes console output for non-TTY fds (the file is the single sink) unless
21
+ * SILOLINK_CONSOLE=1 asks to keep it.
13
22
  */
14
23
  export function logFilePath(env) {
15
24
  const slug = env || 'default';
16
25
  return path.join(getConfigDir(), 'logs', `silolink-${slug}.log`);
17
26
  }
27
+ /**
28
+ * Prefix every line START in `text` with `<iso timestamp> `. Chunks may hold many
29
+ * newlines or none at all; the state carries the "are we at a line start" bit across
30
+ * chunks so a line split over several writes is stamped exactly once. Empty lines
31
+ * (a bare "\n" at a line start) are left blank rather than stamped.
32
+ */
33
+ export function stampLines(text, state, now = () => new Date().toISOString()) {
34
+ if (!text)
35
+ return text;
36
+ let out = '';
37
+ let i = 0;
38
+ while (i < text.length) {
39
+ const nl = text.indexOf('\n', i);
40
+ const end = nl === -1 ? text.length : nl + 1;
41
+ const seg = text.slice(i, end);
42
+ if (state.atLineStart && seg !== '\n')
43
+ out += `${now()} `;
44
+ out += seg;
45
+ state.atLineStart = seg.endsWith('\n');
46
+ i = end;
47
+ }
48
+ return out;
49
+ }
50
+ /** True when `fd` refers to the same inode as `filePath` (i.e. the fd IS the log file). */
51
+ export function fdIsFile(fd, filePath) {
52
+ try {
53
+ const a = fs.fstatSync(fd);
54
+ const b = fs.statSync(filePath);
55
+ return a.dev === b.dev && a.ino === b.ino;
56
+ }
57
+ catch {
58
+ return false;
59
+ }
60
+ }
61
+ let current = null;
62
+ /** Snapshot of the attached file log for the health block (null when not attached). */
63
+ export function getFileLogStatus() {
64
+ if (!current)
65
+ return null;
66
+ let bytes = 0;
67
+ try {
68
+ bytes = fs.statSync(current.path).size;
69
+ }
70
+ catch { /* unreadable → 0 */ }
71
+ return { ...current, bytes };
72
+ }
18
73
  /**
19
74
  * Tee all stdout/stderr writes of THIS process into the env's append-mode log file,
20
- * prefixed by a timestamped session-start banner. Console behavior is unchanged —
21
- * tmux operators still see live output; the file is additive.
75
+ * prefixed by a timestamped session-start banner, with every subsequent line stamped.
76
+ *
77
+ * Per fd:
78
+ * - fd IS the log file (operator redirected `>> silolink-<env>.log`): write the stamped
79
+ * chunk through the ORIGINAL fd only — never also through the tee (no doubled lines).
80
+ * - fd is a TTY, or SILOLINK_CONSOLE=1: tee to the file (stamped) AND echo raw to the fd.
81
+ * - otherwise (fd is /dev/null, a pipe, some other file): file only — the file is the
82
+ * single sink and the redirect target stops accumulating a second copy.
22
83
  *
23
84
  * Returns the log path (for printing), or null when the log file could not be
24
85
  * opened — logging must never prevent the bridge from starting.
25
86
  */
26
- export function attachFileLog(env, version) {
87
+ export function attachFileLog(env, version, opts = {}) {
27
88
  try {
28
- const logPath = logFilePath(env);
89
+ const logPath = opts.path ?? logFilePath(env);
29
90
  fs.mkdirSync(path.dirname(logPath), { recursive: true });
30
91
  const stream = fs.createWriteStream(logPath, { flags: 'a' });
31
92
  stream.write(`\n===== SiloLink session start ${new Date().toISOString()} ` +
32
93
  `(env=${env || 'default'} pid=${process.pid} v${version}) =====\n`);
33
- for (const std of [process.stdout, process.stderr]) {
94
+ // Make sure the file exists on disk before fstat comparison (createWriteStream opens lazily).
95
+ try {
96
+ fs.closeSync(fs.openSync(logPath, 'a'));
97
+ }
98
+ catch { /* best effort */ }
99
+ const fds = opts.fds ?? { stdout: 1, stderr: 2 };
100
+ const tty = opts.isTTY ?? { stdout: !!process.stdout.isTTY, stderr: !!process.stderr.isTTY };
101
+ const consoleEnv = 'consoleEnv' in opts ? opts.consoleEnv : process.env.SILOLINK_CONSOLE;
102
+ const keepConsole = consoleEnv === '1';
103
+ const now = opts.now;
104
+ const streams = [
105
+ ['stdout', process.stdout],
106
+ ['stderr', process.stderr],
107
+ ];
108
+ const isLog = { stdout: false, stderr: false };
109
+ let muted = false;
110
+ for (const [name, std] of streams) {
111
+ const fdIsLog = fdIsFile(fds[name], logPath);
112
+ isLog[name] = fdIsLog;
113
+ const echo = tty[name] || keepConsole;
114
+ if (!fdIsLog && !echo)
115
+ muted = true;
116
+ const state = { atLineStart: true };
34
117
  const orig = std.write.bind(std);
35
118
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
36
119
  std.write = (chunk, ...args) => {
120
+ const encoding = typeof args[0] === 'string' ? args[0] : undefined;
121
+ const text = typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString(encoding || 'utf8');
122
+ let stamped;
123
+ try {
124
+ stamped = stampLines(text, state, now);
125
+ }
126
+ catch {
127
+ stamped = text;
128
+ }
129
+ if (fdIsLog) {
130
+ // The fd already lands in the log: write the stamped text there once.
131
+ return orig(stamped, ...args.filter((a) => typeof a !== 'string'));
132
+ }
37
133
  try {
38
- stream.write(chunk);
134
+ stream.write(stamped);
39
135
  }
40
136
  catch {
41
137
  // Never let file-log failures break console output.
42
138
  }
43
- return orig(chunk, ...args);
139
+ if (echo)
140
+ return orig(chunk, ...args);
141
+ // Muted: honor a trailing callback so callers awaiting drain never hang.
142
+ const cb = args[args.length - 1];
143
+ if (typeof cb === 'function')
144
+ process.nextTick(cb);
145
+ return true;
44
146
  };
45
147
  }
148
+ current = { path: logPath, stdout_is_log: isLog.stdout, stderr_is_log: isLog.stderr, console_muted: muted };
46
149
  return logPath;
47
150
  }
48
151
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"file-log.js","sourceRoot":"","sources":["../../src/cli/file-log.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,MAAM,IAAI,GAAG,GAAG,IAAI,SAAS,CAAC;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,YAAY,IAAI,MAAM,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,GAAuB,EAAE,OAAe;IACpE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QACjC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CACV,kCAAkC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,GAAG;YAC3D,QAAQ,GAAG,IAAI,SAAS,QAAQ,OAAO,CAAC,GAAG,KAAK,OAAO,WAAW,CACrE,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjC,8DAA8D;YAC7D,GAAW,CAAC,KAAK,GAAG,CAAC,KAAU,EAAE,GAAG,IAAW,EAAW,EAAE;gBAC3D,IAAI,CAAC;oBACH,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACtB,CAAC;gBAAC,MAAM,CAAC;oBACP,oDAAoD;gBACtD,CAAC;gBACD,OAAQ,IAAqC,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;YAChE,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"file-log.js","sourceRoot":"","sources":["../../src/cli/file-log.ts"],"names":[],"mappings":"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"}
@@ -48,6 +48,13 @@ export interface AgentProcess {
48
48
  * provider-specific process lifecycle: spawning, health checks, resumption,
49
49
  * and cleanup.
50
50
  */
51
+ export interface WedgeVerdict {
52
+ wedged: boolean;
53
+ /** Human-readable why (logged by callers): 'no-pane' | 'pane-gone' | 'pane-active' | 'frozen-Nmin' … */
54
+ reason: string;
55
+ /** The tmux pane name at decision time (null when the launcher tracks none). */
56
+ paneName: string | null;
57
+ }
51
58
  export interface AgentLauncher {
52
59
  /**
53
60
  * Launch a new agent process.
@@ -130,6 +137,10 @@ export interface AgentLauncher {
130
137
  sendTextAndSubmit(conversationId: number, text: string): boolean;
131
138
  /** Store the last resume/session ID for future resume */
132
139
  setLastResumeId(resumeId: string, conversationId?: number): void;
140
+ /** The resume id minted at launch for a conversation (Claude `--session-id`), if any. */
141
+ getMintedResumeId?(conversationId: number): string | undefined;
142
+ /** Pin the conversation's resume id on its registered Session now (minted id or discovery). */
143
+ syncResumeId?(conversationId: number): void;
133
144
  /** Launch a session triggered by an inbound message */
134
145
  launchOnMessage(conversationId?: number, triggerMessage?: string, llmAgentId?: number): Promise<boolean>;
135
146
  /** Internal launch — called by Bridge control channel handler */
@@ -144,6 +155,14 @@ export interface AgentLauncher {
144
155
  };
145
156
  /** Kill the session associated with a specific conversation */
146
157
  killByConversation(conversationId: number, reason?: string): void;
158
+ /**
159
+ * Is the conversation's pane wedged — present, NOT actively producing output,
160
+ * and frozen at least the launcher's FROZEN threshold? Built from the same
161
+ * primitives the periodic wedged-session reaper uses, so an inbound message
162
+ * can never recycle a pane the reaper would leave alone. Optional so
163
+ * non-tmux launchers may skip it (callers treat "absent" as not wedged).
164
+ */
165
+ isSessionWedged?(conversationId: number): WedgeVerdict;
147
166
  /** Kill all sessions */
148
167
  kill(): void;
149
168
  /** Send an interrupt to a session */
@@ -1 +1 @@
1
- {"version":3,"file":"agent-launcher.d.ts","sourceRoot":"","sources":["../../src/core/agent-launcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-launcher.d.ts","sourceRoot":"","sources":["../../src/core/agent-launcher.ts"],"names":[],"mappings":"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"}