@codedeck/codedeck 2026.3.1-4.63
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 +38 -0
- package/config/default.yaml +51 -0
- package/dist/agent/brain-dispatcher.d.ts +67 -0
- package/dist/agent/brain-dispatcher.d.ts.map +1 -0
- package/dist/agent/brain-dispatcher.js +136 -0
- package/dist/agent/brain-dispatcher.js.map +1 -0
- package/dist/agent/detect.d.ts +20 -0
- package/dist/agent/detect.d.ts.map +1 -0
- package/dist/agent/detect.js +187 -0
- package/dist/agent/detect.js.map +1 -0
- package/dist/agent/drivers/base.d.ts +57 -0
- package/dist/agent/drivers/base.d.ts.map +1 -0
- package/dist/agent/drivers/base.js +3 -0
- package/dist/agent/drivers/base.js.map +1 -0
- package/dist/agent/drivers/claude-code.d.ts +14 -0
- package/dist/agent/drivers/claude-code.d.ts.map +1 -0
- package/dist/agent/drivers/claude-code.js +112 -0
- package/dist/agent/drivers/claude-code.js.map +1 -0
- package/dist/agent/drivers/codex.d.ts +14 -0
- package/dist/agent/drivers/codex.d.ts.map +1 -0
- package/dist/agent/drivers/codex.js +77 -0
- package/dist/agent/drivers/codex.js.map +1 -0
- package/dist/agent/drivers/gemini.d.ts +24 -0
- package/dist/agent/drivers/gemini.d.ts.map +1 -0
- package/dist/agent/drivers/gemini.js +142 -0
- package/dist/agent/drivers/gemini.js.map +1 -0
- package/dist/agent/drivers/opencode.d.ts +18 -0
- package/dist/agent/drivers/opencode.d.ts.map +1 -0
- package/dist/agent/drivers/opencode.js +50 -0
- package/dist/agent/drivers/opencode.js.map +1 -0
- package/dist/agent/drivers/shell.d.ts +13 -0
- package/dist/agent/drivers/shell.d.ts.map +1 -0
- package/dist/agent/drivers/shell.js +30 -0
- package/dist/agent/drivers/shell.js.map +1 -0
- package/dist/agent/env-isolation.d.ts +26 -0
- package/dist/agent/env-isolation.d.ts.map +1 -0
- package/dist/agent/env-isolation.js +103 -0
- package/dist/agent/env-isolation.js.map +1 -0
- package/dist/agent/notify-setup.d.ts +18 -0
- package/dist/agent/notify-setup.d.ts.map +1 -0
- package/dist/agent/notify-setup.js +68 -0
- package/dist/agent/notify-setup.js.map +1 -0
- package/dist/agent/session-manager.d.ts +75 -0
- package/dist/agent/session-manager.d.ts.map +1 -0
- package/dist/agent/session-manager.js +407 -0
- package/dist/agent/session-manager.js.map +1 -0
- package/dist/agent/signal.d.ts +32 -0
- package/dist/agent/signal.d.ts.map +1 -0
- package/dist/agent/signal.js +199 -0
- package/dist/agent/signal.js.map +1 -0
- package/dist/agent/status-poller.d.ts +27 -0
- package/dist/agent/status-poller.d.ts.map +1 -0
- package/dist/agent/status-poller.js +76 -0
- package/dist/agent/status-poller.js.map +1 -0
- package/dist/agent/templates/brain-prompt.d.ts +14 -0
- package/dist/agent/templates/brain-prompt.d.ts.map +1 -0
- package/dist/agent/templates/brain-prompt.js +57 -0
- package/dist/agent/templates/brain-prompt.js.map +1 -0
- package/dist/agent/templates/identity.d.ts +19 -0
- package/dist/agent/templates/identity.d.ts.map +1 -0
- package/dist/agent/templates/identity.js +97 -0
- package/dist/agent/templates/identity.js.map +1 -0
- package/dist/agent/tmux.d.ts +90 -0
- package/dist/agent/tmux.d.ts.map +1 -0
- package/dist/agent/tmux.js +386 -0
- package/dist/agent/tmux.js.map +1 -0
- package/dist/autofix/audit-engine.d.ts +35 -0
- package/dist/autofix/audit-engine.d.ts.map +1 -0
- package/dist/autofix/audit-engine.js +144 -0
- package/dist/autofix/audit-engine.js.map +1 -0
- package/dist/autofix/branch-manager.d.ts +44 -0
- package/dist/autofix/branch-manager.d.ts.map +1 -0
- package/dist/autofix/branch-manager.js +97 -0
- package/dist/autofix/branch-manager.js.map +1 -0
- package/dist/autofix/decision-engine.d.ts +38 -0
- package/dist/autofix/decision-engine.d.ts.map +1 -0
- package/dist/autofix/decision-engine.js +115 -0
- package/dist/autofix/decision-engine.js.map +1 -0
- package/dist/autofix/index.d.ts +23 -0
- package/dist/autofix/index.d.ts.map +1 -0
- package/dist/autofix/index.js +192 -0
- package/dist/autofix/index.js.map +1 -0
- package/dist/autofix/prompt-builder.d.ts +25 -0
- package/dist/autofix/prompt-builder.d.ts.map +1 -0
- package/dist/autofix/prompt-builder.js +137 -0
- package/dist/autofix/prompt-builder.js.map +1 -0
- package/dist/autofix/report-parser.d.ts +18 -0
- package/dist/autofix/report-parser.d.ts.map +1 -0
- package/dist/autofix/report-parser.js +74 -0
- package/dist/autofix/report-parser.js.map +1 -0
- package/dist/autofix/state-machine.d.ts +40 -0
- package/dist/autofix/state-machine.d.ts.map +1 -0
- package/dist/autofix/state-machine.js +76 -0
- package/dist/autofix/state-machine.js.map +1 -0
- package/dist/bind/bind-flow.d.ts +15 -0
- package/dist/bind/bind-flow.d.ts.map +1 -0
- package/dist/bind/bind-flow.js +198 -0
- package/dist/bind/bind-flow.js.map +1 -0
- package/dist/config.d.ts +53 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +89 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon/codex-watcher.d.ts +46 -0
- package/dist/daemon/codex-watcher.d.ts.map +1 -0
- package/dist/daemon/codex-watcher.js +533 -0
- package/dist/daemon/codex-watcher.js.map +1 -0
- package/dist/daemon/command-handler.d.ts +6 -0
- package/dist/daemon/command-handler.d.ts.map +1 -0
- package/dist/daemon/command-handler.js +770 -0
- package/dist/daemon/command-handler.js.map +1 -0
- package/dist/daemon/discussion-orchestrator.d.ts +63 -0
- package/dist/daemon/discussion-orchestrator.d.ts.map +1 -0
- package/dist/daemon/discussion-orchestrator.js +482 -0
- package/dist/daemon/discussion-orchestrator.js.map +1 -0
- package/dist/daemon/gemini-watcher.d.ts +42 -0
- package/dist/daemon/gemini-watcher.d.ts.map +1 -0
- package/dist/daemon/gemini-watcher.js +463 -0
- package/dist/daemon/gemini-watcher.js.map +1 -0
- package/dist/daemon/hook-server.d.ts +42 -0
- package/dist/daemon/hook-server.d.ts.map +1 -0
- package/dist/daemon/hook-server.js +160 -0
- package/dist/daemon/hook-server.js.map +1 -0
- package/dist/daemon/jsonl-watcher.d.ts +35 -0
- package/dist/daemon/jsonl-watcher.d.ts.map +1 -0
- package/dist/daemon/jsonl-watcher.js +635 -0
- package/dist/daemon/jsonl-watcher.js.map +1 -0
- package/dist/daemon/lifecycle.d.ts +20 -0
- package/dist/daemon/lifecycle.d.ts.map +1 -0
- package/dist/daemon/lifecycle.js +331 -0
- package/dist/daemon/lifecycle.js.map +1 -0
- package/dist/daemon/server-link.d.ts +44 -0
- package/dist/daemon/server-link.d.ts.map +1 -0
- package/dist/daemon/server-link.js +232 -0
- package/dist/daemon/server-link.js.map +1 -0
- package/dist/daemon/subsession-manager.d.ts +37 -0
- package/dist/daemon/subsession-manager.d.ts.map +1 -0
- package/dist/daemon/subsession-manager.js +240 -0
- package/dist/daemon/subsession-manager.js.map +1 -0
- package/dist/daemon/terminal-parser.d.ts +42 -0
- package/dist/daemon/terminal-parser.d.ts.map +1 -0
- package/dist/daemon/terminal-parser.js +278 -0
- package/dist/daemon/terminal-parser.js.map +1 -0
- package/dist/daemon/terminal-streamer.d.ts +93 -0
- package/dist/daemon/terminal-streamer.d.ts.map +1 -0
- package/dist/daemon/terminal-streamer.js +451 -0
- package/dist/daemon/terminal-streamer.js.map +1 -0
- package/dist/daemon/timeline-emitter.d.ts +32 -0
- package/dist/daemon/timeline-emitter.d.ts.map +1 -0
- package/dist/daemon/timeline-emitter.js +97 -0
- package/dist/daemon/timeline-emitter.js.map +1 -0
- package/dist/daemon/timeline-event.d.ts +23 -0
- package/dist/daemon/timeline-event.d.ts.map +1 -0
- package/dist/daemon/timeline-event.js +7 -0
- package/dist/daemon/timeline-event.js.map +1 -0
- package/dist/daemon/timeline-store.d.ts +40 -0
- package/dist/daemon/timeline-store.d.ts.map +1 -0
- package/dist/daemon/timeline-store.js +153 -0
- package/dist/daemon/timeline-store.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +149 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/claude-mem.d.ts +9 -0
- package/dist/memory/claude-mem.d.ts.map +1 -0
- package/dist/memory/claude-mem.js +58 -0
- package/dist/memory/claude-mem.js.map +1 -0
- package/dist/memory/context-builder.d.ts +4 -0
- package/dist/memory/context-builder.d.ts.map +1 -0
- package/dist/memory/context-builder.js +35 -0
- package/dist/memory/context-builder.js.map +1 -0
- package/dist/memory/detector.d.ts +7 -0
- package/dist/memory/detector.d.ts.map +1 -0
- package/dist/memory/detector.js +17 -0
- package/dist/memory/detector.js.map +1 -0
- package/dist/memory/extractor.d.ts +21 -0
- package/dist/memory/extractor.d.ts.map +1 -0
- package/dist/memory/extractor.js +83 -0
- package/dist/memory/extractor.js.map +1 -0
- package/dist/memory/injector.d.ts +7 -0
- package/dist/memory/injector.d.ts.map +1 -0
- package/dist/memory/injector.js +18 -0
- package/dist/memory/injector.js.map +1 -0
- package/dist/memory/interface.d.ts +25 -0
- package/dist/memory/interface.d.ts.map +1 -0
- package/dist/memory/interface.js +3 -0
- package/dist/memory/interface.js.map +1 -0
- package/dist/memory/mem0.d.ts +12 -0
- package/dist/memory/mem0.d.ts.map +1 -0
- package/dist/memory/mem0.js +93 -0
- package/dist/memory/mem0.js.map +1 -0
- package/dist/router/command-parser.d.ts +33 -0
- package/dist/router/command-parser.d.ts.map +1 -0
- package/dist/router/command-parser.js +66 -0
- package/dist/router/command-parser.js.map +1 -0
- package/dist/router/message-router.d.ts +42 -0
- package/dist/router/message-router.d.ts.map +1 -0
- package/dist/router/message-router.js +222 -0
- package/dist/router/message-router.js.map +1 -0
- package/dist/router/response-collector.d.ts +28 -0
- package/dist/router/response-collector.d.ts.map +1 -0
- package/dist/router/response-collector.js +164 -0
- package/dist/router/response-collector.js.map +1 -0
- package/dist/store/project-store.d.ts +37 -0
- package/dist/store/project-store.d.ts.map +1 -0
- package/dist/store/project-store.js +70 -0
- package/dist/store/project-store.js.map +1 -0
- package/dist/store/session-store.d.ts +32 -0
- package/dist/store/session-store.d.ts.map +1 -0
- package/dist/store/session-store.js +67 -0
- package/dist/store/session-store.js.map +1 -0
- package/dist/tracker/branch.d.ts +24 -0
- package/dist/tracker/branch.d.ts.map +1 -0
- package/dist/tracker/branch.js +55 -0
- package/dist/tracker/branch.js.map +1 -0
- package/dist/tracker/github.d.ts +31 -0
- package/dist/tracker/github.d.ts.map +1 -0
- package/dist/tracker/github.js +117 -0
- package/dist/tracker/github.js.map +1 -0
- package/dist/tracker/gitlab.d.ts +31 -0
- package/dist/tracker/gitlab.d.ts.map +1 -0
- package/dist/tracker/gitlab.js +116 -0
- package/dist/tracker/gitlab.js.map +1 -0
- package/dist/tracker/index.d.ts +9 -0
- package/dist/tracker/index.d.ts.map +1 -0
- package/dist/tracker/index.js +28 -0
- package/dist/tracker/index.js.map +1 -0
- package/dist/tracker/interface.d.ts +39 -0
- package/dist/tracker/interface.d.ts.map +1 -0
- package/dist/tracker/interface.js +7 -0
- package/dist/tracker/interface.js.map +1 -0
- package/dist/tracker/priority.d.ts +19 -0
- package/dist/tracker/priority.d.ts.map +1 -0
- package/dist/tracker/priority.js +40 -0
- package/dist/tracker/priority.js.map +1 -0
- package/dist/util/logger.d.ts +4 -0
- package/dist/util/logger.d.ts.map +1 -0
- package/dist/util/logger.js +14 -0
- package/dist/util/logger.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,635 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Watches Claude Code JSONL transcript files for structured events.
|
|
4
|
+
*
|
|
5
|
+
* Claude Code writes every conversation turn to:
|
|
6
|
+
* ~/.claude/projects/{projectKey}/{sessionId}.jsonl
|
|
7
|
+
*
|
|
8
|
+
* Each line is a JSON object with type "assistant", "user", "result", or "system".
|
|
9
|
+
* This watcher tails the active JSONL file and emits structured timeline events —
|
|
10
|
+
* far more reliable than parsing raw PTY terminal output.
|
|
11
|
+
*
|
|
12
|
+
* Integration:
|
|
13
|
+
* - startWatching(sessionName, projectDir) when a claude-code session starts
|
|
14
|
+
* - stopWatching(sessionName) when it stops
|
|
15
|
+
*/
|
|
16
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.claudeProjectDir = claudeProjectDir;
|
|
21
|
+
exports.startWatching = startWatching;
|
|
22
|
+
exports.isWatching = isWatching;
|
|
23
|
+
exports.stopWatching = stopWatching;
|
|
24
|
+
exports.startWatchingFile = startWatchingFile;
|
|
25
|
+
const promises_1 = require("fs/promises");
|
|
26
|
+
const path_1 = require("path");
|
|
27
|
+
const os_1 = require("os");
|
|
28
|
+
const timeline_emitter_js_1 = require("./timeline-emitter.js");
|
|
29
|
+
const logger_js_1 = __importDefault(require("../util/logger.js"));
|
|
30
|
+
// ── Path helpers ──────────────────────────────────────────────────────────────
|
|
31
|
+
/** Compute Claude Code project key: replace path separators with '-'. */
|
|
32
|
+
function claudeProjectKey(absPath) {
|
|
33
|
+
return absPath.replace(/\/+$/, '').replace(/[/\\]/g, '-');
|
|
34
|
+
}
|
|
35
|
+
/** Return the ~/.claude/projects/{key} directory for a given work dir. */
|
|
36
|
+
function claudeProjectDir(workDir) {
|
|
37
|
+
const key = claudeProjectKey(workDir);
|
|
38
|
+
return (0, path_1.join)((0, os_1.homedir)(), '.claude', 'projects', key);
|
|
39
|
+
}
|
|
40
|
+
/** Find the most recently modified .jsonl file in a directory. */
|
|
41
|
+
async function findLatestJsonl(dir) {
|
|
42
|
+
let entries;
|
|
43
|
+
try {
|
|
44
|
+
entries = await (0, promises_1.readdir)(dir);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
const jsonls = entries.filter((e) => e.endsWith('.jsonl'));
|
|
50
|
+
if (jsonls.length === 0)
|
|
51
|
+
return null;
|
|
52
|
+
const withStats = await Promise.all(jsonls.map(async (f) => {
|
|
53
|
+
try {
|
|
54
|
+
const s = await (0, promises_1.stat)((0, path_1.join)(dir, f));
|
|
55
|
+
return { f, mtime: s.mtimeMs };
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return { f, mtime: 0 };
|
|
59
|
+
}
|
|
60
|
+
}));
|
|
61
|
+
withStats.sort((a, b) => b.mtime - a.mtime);
|
|
62
|
+
return (0, path_1.join)(dir, withStats[0].f);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Parse one JSONL line and emit timeline events.
|
|
66
|
+
* - assistant: emit assistant.text, assistant.thinking, tool.call
|
|
67
|
+
* - user: emit user.message, tool.result
|
|
68
|
+
*/
|
|
69
|
+
function parseLine(sessionName, line) {
|
|
70
|
+
if (!line.trim())
|
|
71
|
+
return;
|
|
72
|
+
let raw;
|
|
73
|
+
try {
|
|
74
|
+
raw = JSON.parse(line);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// Progress events — transient status for status bar display (no message.content)
|
|
80
|
+
if (raw['type'] === 'progress') {
|
|
81
|
+
const data = raw['data'];
|
|
82
|
+
if (!data)
|
|
83
|
+
return;
|
|
84
|
+
const progressType = String(data['type'] ?? '');
|
|
85
|
+
switch (progressType) {
|
|
86
|
+
case 'bash_progress': {
|
|
87
|
+
const elapsed = data['elapsedTimeSeconds'];
|
|
88
|
+
timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'agent.status', {
|
|
89
|
+
status: 'bash_running',
|
|
90
|
+
label: `Bash running${elapsed ? ` (${Math.round(elapsed)}s)` : ''}...`,
|
|
91
|
+
}, { source: 'daemon', confidence: 'high' });
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
case 'agent_progress': {
|
|
95
|
+
const msg = String(data['message'] ?? 'working');
|
|
96
|
+
timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'agent.status', {
|
|
97
|
+
status: 'agent_working',
|
|
98
|
+
label: `Sub-agent: ${msg}`,
|
|
99
|
+
}, { source: 'daemon', confidence: 'high' });
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
case 'mcp_progress': {
|
|
103
|
+
const toolName = String(data['toolName'] ?? 'tool');
|
|
104
|
+
const server = String(data['serverName'] ?? '');
|
|
105
|
+
const mStatus = String(data['status'] ?? 'started');
|
|
106
|
+
if (mStatus === 'started') {
|
|
107
|
+
timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'agent.status', {
|
|
108
|
+
status: 'mcp_running',
|
|
109
|
+
label: `MCP: ${server ? server + '/' : ''}${toolName}...`,
|
|
110
|
+
}, { source: 'daemon', confidence: 'high' });
|
|
111
|
+
}
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
case 'waiting_for_task': {
|
|
115
|
+
const desc = String(data['taskDescription'] ?? 'task');
|
|
116
|
+
timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'agent.status', {
|
|
117
|
+
status: 'waiting',
|
|
118
|
+
label: `Waiting: ${desc}`,
|
|
119
|
+
}, { source: 'daemon', confidence: 'high' });
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
// Result events — end-of-turn summary with total cost
|
|
126
|
+
if (raw['type'] === 'result') {
|
|
127
|
+
const costUsd = raw['total_cost_usd'];
|
|
128
|
+
if (typeof costUsd === 'number' && costUsd > 0) {
|
|
129
|
+
timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'usage.update', { costUsd }, { source: 'daemon', confidence: 'high' });
|
|
130
|
+
}
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
// System events — compact_boundary etc. (no message.content)
|
|
134
|
+
if (raw['type'] === 'system') {
|
|
135
|
+
const subtype = String(raw['subtype'] ?? '');
|
|
136
|
+
if (subtype === 'compact_boundary') {
|
|
137
|
+
timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'agent.status', {
|
|
138
|
+
status: 'compacting',
|
|
139
|
+
label: 'Compacting conversation...',
|
|
140
|
+
}, { source: 'daemon', confidence: 'high' });
|
|
141
|
+
}
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const msg = raw['message'];
|
|
145
|
+
if (!msg)
|
|
146
|
+
return;
|
|
147
|
+
const content = msg['content'];
|
|
148
|
+
if (!Array.isArray(content))
|
|
149
|
+
return;
|
|
150
|
+
if (raw['type'] === 'assistant') {
|
|
151
|
+
for (const block of content) {
|
|
152
|
+
if (block.type === 'text' && block.text) {
|
|
153
|
+
timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'assistant.text', {
|
|
154
|
+
text: block.text,
|
|
155
|
+
streaming: false,
|
|
156
|
+
}, { source: 'daemon', confidence: 'high' });
|
|
157
|
+
}
|
|
158
|
+
else if (block.type === 'thinking' && block.thinking) {
|
|
159
|
+
timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'assistant.thinking', {
|
|
160
|
+
text: block.thinking,
|
|
161
|
+
}, { source: 'daemon', confidence: 'high' });
|
|
162
|
+
}
|
|
163
|
+
else if (block.type === 'tool_use' && block.name) {
|
|
164
|
+
const input = extractToolInput(block.name, block.input);
|
|
165
|
+
timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'tool.call', {
|
|
166
|
+
tool: block.name,
|
|
167
|
+
...(input ? { input } : {}),
|
|
168
|
+
}, { source: 'daemon', confidence: 'high' });
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Emit token usage + model for context bar
|
|
172
|
+
const usage = msg['usage'];
|
|
173
|
+
const model = msg['model'];
|
|
174
|
+
if (usage && typeof usage.input_tokens === 'number') {
|
|
175
|
+
timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'usage.update', {
|
|
176
|
+
inputTokens: usage.input_tokens + (usage.cache_creation_input_tokens ?? 0),
|
|
177
|
+
cacheTokens: usage.cache_read_input_tokens ?? 0,
|
|
178
|
+
contextWindow: 1_000_000,
|
|
179
|
+
...(model ? { model } : {}),
|
|
180
|
+
}, { source: 'daemon', confidence: 'high' });
|
|
181
|
+
}
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (raw['type'] === 'user') {
|
|
185
|
+
for (const block of content) {
|
|
186
|
+
if (block.type === 'text' && block.text?.trim()) {
|
|
187
|
+
timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'user.message', {
|
|
188
|
+
text: block.text,
|
|
189
|
+
}, { source: 'daemon', confidence: 'high' });
|
|
190
|
+
}
|
|
191
|
+
else if (block.type === 'tool_result') {
|
|
192
|
+
const error = block.is_error ? String(block.content ?? 'error') : undefined;
|
|
193
|
+
timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'tool.result', {
|
|
194
|
+
...(error ? { error } : {}),
|
|
195
|
+
}, { source: 'daemon', confidence: 'high' });
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/** Extract a short summary of tool input for display. */
|
|
201
|
+
function extractToolInput(tool, input) {
|
|
202
|
+
if (!input)
|
|
203
|
+
return '';
|
|
204
|
+
switch (tool) {
|
|
205
|
+
case 'Bash': return String(input['command'] ?? '').split('\n').find((l) => l.trim()) ?? '';
|
|
206
|
+
case 'Read':
|
|
207
|
+
case 'Write':
|
|
208
|
+
case 'Edit': return String(input['file_path'] ?? '');
|
|
209
|
+
case 'Glob': return String(input['pattern'] ?? '');
|
|
210
|
+
case 'Grep': return `${input['pattern'] ?? ''}${input['path'] ? ` in ${input['path']}` : ''}`;
|
|
211
|
+
case 'Agent': return String(input['description'] ?? '');
|
|
212
|
+
default: return '';
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const watchers = new Map();
|
|
216
|
+
/** Which session has claimed each JSONL file path (prevents cross-session stealing). */
|
|
217
|
+
const claimedFiles = new Map(); // filePath → sessionName
|
|
218
|
+
function claimFile(sessionName, filePath) {
|
|
219
|
+
// Release any previous file claimed by this session
|
|
220
|
+
for (const [fp, sn] of claimedFiles) {
|
|
221
|
+
if (sn === sessionName) {
|
|
222
|
+
claimedFiles.delete(fp);
|
|
223
|
+
break;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
claimedFiles.set(filePath, sessionName);
|
|
227
|
+
}
|
|
228
|
+
function releaseFiles(sessionName) {
|
|
229
|
+
for (const [fp, sn] of claimedFiles) {
|
|
230
|
+
if (sn === sessionName)
|
|
231
|
+
claimedFiles.delete(fp);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/** Returns true if filePath is unclaimed or already claimed by sessionName. */
|
|
235
|
+
function canClaim(sessionName, filePath) {
|
|
236
|
+
const owner = claimedFiles.get(filePath);
|
|
237
|
+
return !owner || owner === sessionName;
|
|
238
|
+
}
|
|
239
|
+
// ── Public API ────────────────────────────────────────────────────────────────
|
|
240
|
+
const HISTORY_LINES = 500; // max lines to scan for recent assistant.text history
|
|
241
|
+
/**
|
|
242
|
+
* Read the tail of a JSONL file and emit history events (text, thinking, tool.call, tool.result).
|
|
243
|
+
*/
|
|
244
|
+
async function emitRecentHistory(sessionName, filePath) {
|
|
245
|
+
let fh = null;
|
|
246
|
+
try {
|
|
247
|
+
fh = await (0, promises_1.open)(filePath, 'r');
|
|
248
|
+
const { size } = await fh.stat();
|
|
249
|
+
if (size === 0)
|
|
250
|
+
return;
|
|
251
|
+
// Read up to 256KB from the end of the file to cover recent history
|
|
252
|
+
const readSize = Math.min(size, 256 * 1024);
|
|
253
|
+
const buf = Buffer.allocUnsafe(readSize);
|
|
254
|
+
const { bytesRead } = await fh.read(buf, 0, readSize, size - readSize);
|
|
255
|
+
if (bytesRead === 0)
|
|
256
|
+
return;
|
|
257
|
+
const chunk = buf.subarray(0, bytesRead).toString('utf8');
|
|
258
|
+
// Drop the first (possibly partial) line when reading mid-file
|
|
259
|
+
const lines = chunk.split('\n');
|
|
260
|
+
const startIdx = size > readSize ? 1 : 0; // skip partial first line
|
|
261
|
+
// First pass: find the most recent usage data (scan all lines, not limited to HISTORY_LINES)
|
|
262
|
+
let lastUsagePayload = null;
|
|
263
|
+
for (let i = startIdx; i < lines.length; i++) {
|
|
264
|
+
const line = lines[i];
|
|
265
|
+
if (!line.trim())
|
|
266
|
+
continue;
|
|
267
|
+
let raw;
|
|
268
|
+
try {
|
|
269
|
+
raw = JSON.parse(line);
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
if (raw['type'] === 'assistant') {
|
|
275
|
+
const msg = raw['message'];
|
|
276
|
+
const usage = msg?.['usage'];
|
|
277
|
+
const model = msg?.['model'];
|
|
278
|
+
if (usage && typeof usage.input_tokens === 'number') {
|
|
279
|
+
lastUsagePayload = {
|
|
280
|
+
inputTokens: usage.input_tokens + (usage.cache_creation_input_tokens ?? 0),
|
|
281
|
+
cacheTokens: usage.cache_read_input_tokens ?? 0,
|
|
282
|
+
contextWindow: 1_000_000,
|
|
283
|
+
...(model ? { model } : {}),
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
let count = 0;
|
|
289
|
+
for (let i = startIdx; i < lines.length && count < HISTORY_LINES; i++) {
|
|
290
|
+
const line = lines[i];
|
|
291
|
+
if (!line.trim())
|
|
292
|
+
continue;
|
|
293
|
+
let raw;
|
|
294
|
+
try {
|
|
295
|
+
raw = JSON.parse(line);
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
const msg = raw['message'];
|
|
301
|
+
const content = msg?.['content'];
|
|
302
|
+
if (!Array.isArray(content))
|
|
303
|
+
continue;
|
|
304
|
+
if (raw['type'] === 'assistant') {
|
|
305
|
+
for (const block of content) {
|
|
306
|
+
if (block.type === 'text' && block.text) {
|
|
307
|
+
timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'assistant.text', {
|
|
308
|
+
text: block.text, streaming: false,
|
|
309
|
+
}, { source: 'daemon', confidence: 'high' });
|
|
310
|
+
count++;
|
|
311
|
+
}
|
|
312
|
+
else if (block.type === 'thinking' && block.thinking) {
|
|
313
|
+
timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'assistant.thinking', {
|
|
314
|
+
text: block.thinking,
|
|
315
|
+
}, { source: 'daemon', confidence: 'high' });
|
|
316
|
+
count++;
|
|
317
|
+
}
|
|
318
|
+
else if (block.type === 'tool_use' && block.name) {
|
|
319
|
+
const input = extractToolInput(block.name, block.input);
|
|
320
|
+
timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'tool.call', {
|
|
321
|
+
tool: block.name, ...(input ? { input } : {}),
|
|
322
|
+
}, { source: 'daemon', confidence: 'high' });
|
|
323
|
+
count++;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
else if (raw['type'] === 'user') {
|
|
328
|
+
for (const block of content) {
|
|
329
|
+
if (block.type === 'text' && block.text?.trim()) {
|
|
330
|
+
timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'user.message', {
|
|
331
|
+
text: block.text,
|
|
332
|
+
}, { source: 'daemon', confidence: 'high' });
|
|
333
|
+
count++;
|
|
334
|
+
}
|
|
335
|
+
else if (block.type === 'tool_result') {
|
|
336
|
+
const error = block.is_error ? String(block.content ?? 'error') : undefined;
|
|
337
|
+
timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'tool.result', {
|
|
338
|
+
...(error ? { error } : {}),
|
|
339
|
+
}, { source: 'daemon', confidence: 'high' });
|
|
340
|
+
count++;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// Emit the most recent usage snapshot so the context bar populates on load
|
|
346
|
+
if (lastUsagePayload) {
|
|
347
|
+
timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'usage.update', lastUsagePayload, { source: 'daemon', confidence: 'high' });
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
catch {
|
|
351
|
+
// best-effort
|
|
352
|
+
}
|
|
353
|
+
finally {
|
|
354
|
+
if (fh)
|
|
355
|
+
await fh.close().catch(() => { });
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Start watching Claude Code's JSONL transcript for a session.
|
|
360
|
+
* Only new lines written after this call are emitted — no history replay.
|
|
361
|
+
*
|
|
362
|
+
* @param sessionName tmux session name (e.g. "deck_myapp_brain")
|
|
363
|
+
* @param workDir absolute path to the project working directory
|
|
364
|
+
*/
|
|
365
|
+
async function startWatching(sessionName, workDir) {
|
|
366
|
+
if (watchers.has(sessionName)) {
|
|
367
|
+
stopWatching(sessionName);
|
|
368
|
+
}
|
|
369
|
+
const projectDir = claudeProjectDir(workDir);
|
|
370
|
+
const state = {
|
|
371
|
+
projectDir,
|
|
372
|
+
activeFile: null,
|
|
373
|
+
fileOffset: 0,
|
|
374
|
+
abort: new AbortController(),
|
|
375
|
+
stopped: false,
|
|
376
|
+
};
|
|
377
|
+
watchers.set(sessionName, state);
|
|
378
|
+
// Find the current active JSONL file, emit recent history, then tail from EOF.
|
|
379
|
+
// Only claim an unclaimed file; if the latest is already claimed by another session,
|
|
380
|
+
// start with no active file and wait for a new one to appear.
|
|
381
|
+
const latest = await findLatestJsonl(projectDir);
|
|
382
|
+
if (latest && canClaim(sessionName, latest)) {
|
|
383
|
+
claimFile(sessionName, latest);
|
|
384
|
+
try {
|
|
385
|
+
const s = await (0, promises_1.stat)(latest);
|
|
386
|
+
state.activeFile = latest;
|
|
387
|
+
state.fileOffset = s.size;
|
|
388
|
+
// Emit recent assistant.text events from history so chat view populates immediately
|
|
389
|
+
await emitRecentHistory(sessionName, latest);
|
|
390
|
+
}
|
|
391
|
+
catch {
|
|
392
|
+
state.activeFile = latest;
|
|
393
|
+
state.fileOffset = 0;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
// Poll every 2s as a reliable fallback (fs.watch on macOS misses file appends).
|
|
397
|
+
// Uses pollTick (not drainNewLines) so it can re-acquire a file if the claim was stolen.
|
|
398
|
+
state.pollTimer = setInterval(() => {
|
|
399
|
+
void pollTick(sessionName, state);
|
|
400
|
+
}, 2000);
|
|
401
|
+
// Watch the project directory for new/modified JSONL files (best-effort, faster than poll)
|
|
402
|
+
void watchDir(sessionName, state);
|
|
403
|
+
}
|
|
404
|
+
/** Returns true if a JSONL watcher is active for this session. */
|
|
405
|
+
function isWatching(sessionName) {
|
|
406
|
+
return watchers.has(sessionName);
|
|
407
|
+
}
|
|
408
|
+
/** Stop watching and release all file handles for a session. */
|
|
409
|
+
function stopWatching(sessionName) {
|
|
410
|
+
const state = watchers.get(sessionName);
|
|
411
|
+
if (!state)
|
|
412
|
+
return;
|
|
413
|
+
state.stopped = true;
|
|
414
|
+
state.abort.abort();
|
|
415
|
+
if (state.pollTimer)
|
|
416
|
+
clearInterval(state.pollTimer);
|
|
417
|
+
watchers.delete(sessionName);
|
|
418
|
+
releaseFiles(sessionName);
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Start watching a specific JSONL file for a session.
|
|
422
|
+
* Polls until the file appears (CC creates it on first conversation), then tails it.
|
|
423
|
+
* Used for CC sub-sessions where the file path is known from --session-id.
|
|
424
|
+
*/
|
|
425
|
+
async function startWatchingFile(sessionName, filePath) {
|
|
426
|
+
if (watchers.has(sessionName)) {
|
|
427
|
+
stopWatching(sessionName);
|
|
428
|
+
}
|
|
429
|
+
// Pre-claim the file path immediately — before the file even exists — so that
|
|
430
|
+
// the main session's watchDir cannot steal it when CC creates the file.
|
|
431
|
+
claimFile(sessionName, filePath);
|
|
432
|
+
// Derive projectDir from filePath (parent directory)
|
|
433
|
+
const projectDir = (0, path_1.dirname)(filePath);
|
|
434
|
+
const state = {
|
|
435
|
+
projectDir,
|
|
436
|
+
activeFile: null,
|
|
437
|
+
fileOffset: 0,
|
|
438
|
+
abort: new AbortController(),
|
|
439
|
+
stopped: false,
|
|
440
|
+
};
|
|
441
|
+
watchers.set(sessionName, state);
|
|
442
|
+
// Poll until the specific file appears (up to 120s — CC needs first conversation)
|
|
443
|
+
let appeared = false;
|
|
444
|
+
for (let i = 0; i < 120 && !state.stopped; i++) {
|
|
445
|
+
try {
|
|
446
|
+
const s = await (0, promises_1.stat)(filePath);
|
|
447
|
+
state.activeFile = filePath;
|
|
448
|
+
state.fileOffset = s.size; // start from end (only new content)
|
|
449
|
+
claimFile(sessionName, filePath);
|
|
450
|
+
appeared = true;
|
|
451
|
+
break;
|
|
452
|
+
}
|
|
453
|
+
catch {
|
|
454
|
+
await new Promise((r) => setTimeout(r, 1000));
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
if (!appeared || state.stopped)
|
|
458
|
+
return;
|
|
459
|
+
// Poll every 2s for new content
|
|
460
|
+
state.pollTimer = setInterval(() => {
|
|
461
|
+
void drainNewLines(sessionName, state);
|
|
462
|
+
}, 2000);
|
|
463
|
+
// Also use fs.watch on the specific file for faster updates
|
|
464
|
+
void watchFile(sessionName, state, filePath);
|
|
465
|
+
}
|
|
466
|
+
async function watchFile(sessionName, state, filePath) {
|
|
467
|
+
try {
|
|
468
|
+
const watcher = (0, promises_1.watch)((0, path_1.dirname)(filePath), { persistent: false, signal: state.abort.signal });
|
|
469
|
+
const fileName = (0, path_1.basename)(filePath);
|
|
470
|
+
for await (const event of watcher) {
|
|
471
|
+
if (state.stopped)
|
|
472
|
+
break;
|
|
473
|
+
if (event.filename !== fileName)
|
|
474
|
+
continue;
|
|
475
|
+
await drainNewLines(sessionName, state);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
catch (err) {
|
|
479
|
+
if (!state.stopped) {
|
|
480
|
+
logger_js_1.default.warn({ sessionName, err }, 'jsonl-watcher: file watch error');
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
// ── Internal watcher logic ────────────────────────────────────────────────────
|
|
485
|
+
async function watchDir(sessionName, state) {
|
|
486
|
+
// Ensure the directory exists (Claude Code may not have created it yet)
|
|
487
|
+
try {
|
|
488
|
+
await (0, promises_1.stat)(state.projectDir);
|
|
489
|
+
}
|
|
490
|
+
catch {
|
|
491
|
+
// Dir doesn't exist yet — poll until it appears, up to 60s
|
|
492
|
+
for (let i = 0; i < 60; i++) {
|
|
493
|
+
await new Promise((r) => setTimeout(r, 1000));
|
|
494
|
+
if (state.stopped)
|
|
495
|
+
return;
|
|
496
|
+
try {
|
|
497
|
+
await (0, promises_1.stat)(state.projectDir);
|
|
498
|
+
break;
|
|
499
|
+
}
|
|
500
|
+
catch {
|
|
501
|
+
// keep waiting
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
if (state.stopped)
|
|
505
|
+
return;
|
|
506
|
+
}
|
|
507
|
+
try {
|
|
508
|
+
const watcher = (0, promises_1.watch)(state.projectDir, { persistent: false, signal: state.abort.signal });
|
|
509
|
+
for await (const event of watcher) {
|
|
510
|
+
if (state.stopped)
|
|
511
|
+
break;
|
|
512
|
+
if (typeof event.filename !== 'string' || !event.filename.endsWith('.jsonl'))
|
|
513
|
+
continue;
|
|
514
|
+
const changedFile = (0, path_1.join)(state.projectDir, event.filename);
|
|
515
|
+
// If a new file appeared that is newer than our active file, switch to it.
|
|
516
|
+
// Skip if another session has already claimed it.
|
|
517
|
+
if (changedFile !== state.activeFile) {
|
|
518
|
+
if (!canClaim(sessionName, changedFile))
|
|
519
|
+
continue; // claimed by another session
|
|
520
|
+
const isNewer = await checkNewer(changedFile, state.activeFile);
|
|
521
|
+
if (isNewer) {
|
|
522
|
+
logger_js_1.default.debug({ sessionName, file: event.filename }, 'jsonl-watcher: switching to new JSONL file');
|
|
523
|
+
claimFile(sessionName, changedFile);
|
|
524
|
+
state.activeFile = changedFile;
|
|
525
|
+
state.fileOffset = 0;
|
|
526
|
+
}
|
|
527
|
+
else if (!state.activeFile) {
|
|
528
|
+
claimFile(sessionName, changedFile);
|
|
529
|
+
state.activeFile = changedFile;
|
|
530
|
+
state.fileOffset = 0;
|
|
531
|
+
}
|
|
532
|
+
else {
|
|
533
|
+
continue; // older file, ignore
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
await drainNewLines(sessionName, state);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
catch (err) {
|
|
540
|
+
if (!state.stopped) {
|
|
541
|
+
logger_js_1.default.warn({ sessionName, err }, 'jsonl-watcher: dir watch error');
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
/** Returns true if candidate is newer than current (or current is null). */
|
|
546
|
+
async function checkNewer(candidate, current) {
|
|
547
|
+
if (!current)
|
|
548
|
+
return true;
|
|
549
|
+
try {
|
|
550
|
+
const [cs, curS] = await Promise.all([(0, promises_1.stat)(candidate), (0, promises_1.stat)(current)]);
|
|
551
|
+
return cs.mtimeMs > curS.mtimeMs;
|
|
552
|
+
}
|
|
553
|
+
catch {
|
|
554
|
+
return false;
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
/**
|
|
558
|
+
* Poll tick for startWatching — drains new lines and re-acquires a file if activeFile was released.
|
|
559
|
+
* Separate from drainNewLines so startWatchingFile's poll timer stays simple.
|
|
560
|
+
*/
|
|
561
|
+
async function pollTick(sessionName, state) {
|
|
562
|
+
// If active file was stolen by another session, try to find a claimable replacement
|
|
563
|
+
if (!state.activeFile) {
|
|
564
|
+
try {
|
|
565
|
+
const entries = await (0, promises_1.readdir)(state.projectDir);
|
|
566
|
+
const jsonls = entries.filter((e) => e.endsWith('.jsonl'));
|
|
567
|
+
const withStats = await Promise.all(jsonls.map(async (f) => {
|
|
568
|
+
const fp = (0, path_1.join)(state.projectDir, f);
|
|
569
|
+
if (!canClaim(sessionName, fp))
|
|
570
|
+
return null;
|
|
571
|
+
try {
|
|
572
|
+
return { fp, mtime: (await (0, promises_1.stat)(fp)).mtimeMs };
|
|
573
|
+
}
|
|
574
|
+
catch {
|
|
575
|
+
return null;
|
|
576
|
+
}
|
|
577
|
+
}));
|
|
578
|
+
const best = withStats
|
|
579
|
+
.filter((x) => x !== null)
|
|
580
|
+
.sort((a, b) => b.mtime - a.mtime)[0];
|
|
581
|
+
if (best) {
|
|
582
|
+
claimFile(sessionName, best.fp);
|
|
583
|
+
state.activeFile = best.fp;
|
|
584
|
+
try {
|
|
585
|
+
state.fileOffset = (await (0, promises_1.stat)(best.fp)).size;
|
|
586
|
+
await emitRecentHistory(sessionName, best.fp);
|
|
587
|
+
}
|
|
588
|
+
catch {
|
|
589
|
+
state.fileOffset = 0;
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
catch { /* ignore */ }
|
|
594
|
+
}
|
|
595
|
+
await drainNewLines(sessionName, state);
|
|
596
|
+
}
|
|
597
|
+
/** Read any new lines from the active JSONL file since the last offset. */
|
|
598
|
+
async function drainNewLines(sessionName, state) {
|
|
599
|
+
if (!state.activeFile)
|
|
600
|
+
return;
|
|
601
|
+
// If another session has claimed our active file, release it so we can re-acquire our own
|
|
602
|
+
if (!canClaim(sessionName, state.activeFile)) {
|
|
603
|
+
state.activeFile = null;
|
|
604
|
+
return;
|
|
605
|
+
}
|
|
606
|
+
let fh = null;
|
|
607
|
+
try {
|
|
608
|
+
fh = await (0, promises_1.open)(state.activeFile, 'r');
|
|
609
|
+
const fileStat = await fh.stat();
|
|
610
|
+
if (fileStat.size <= state.fileOffset)
|
|
611
|
+
return;
|
|
612
|
+
const buf = Buffer.allocUnsafe(fileStat.size - state.fileOffset);
|
|
613
|
+
const { bytesRead } = await fh.read(buf, 0, buf.length, state.fileOffset);
|
|
614
|
+
if (bytesRead === 0)
|
|
615
|
+
return;
|
|
616
|
+
state.fileOffset += bytesRead;
|
|
617
|
+
const chunk = buf.subarray(0, bytesRead).toString('utf8');
|
|
618
|
+
const lines = chunk.split('\n');
|
|
619
|
+
for (const line of lines) {
|
|
620
|
+
if (state.stopped)
|
|
621
|
+
break;
|
|
622
|
+
parseLine(sessionName, line);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
catch (err) {
|
|
626
|
+
if (!state.stopped) {
|
|
627
|
+
logger_js_1.default.debug({ sessionName, err }, 'jsonl-watcher: drain error');
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
finally {
|
|
631
|
+
if (fh)
|
|
632
|
+
await fh.close().catch(() => { });
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
//# sourceMappingURL=jsonl-watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonl-watcher.js","sourceRoot":"","sources":["../../src/daemon/jsonl-watcher.ts"],"names":[],"mappings":"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"}
|