fluq-watch 0.1.0
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 +61 -0
- package/dist/bin/fluq.d.ts +3 -0
- package/dist/bin/fluq.d.ts.map +1 -0
- package/dist/bin/fluq.js +81 -0
- package/dist/bin/fluq.js.map +1 -0
- package/dist/src/agent-registry.d.ts +22 -0
- package/dist/src/agent-registry.d.ts.map +1 -0
- package/dist/src/agent-registry.js +129 -0
- package/dist/src/agent-registry.js.map +1 -0
- package/dist/src/config.d.ts +13 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +63 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/detector.d.ts +21 -0
- package/dist/src/detector.d.ts.map +1 -0
- package/dist/src/detector.js +104 -0
- package/dist/src/detector.js.map +1 -0
- package/dist/src/index.d.ts +7 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +18 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/patterns.json +127 -0
- package/dist/src/reporter.d.ts +33 -0
- package/dist/src/reporter.d.ts.map +1 -0
- package/dist/src/reporter.js +110 -0
- package/dist/src/reporter.js.map +1 -0
- package/dist/src/trace-manager.d.ts +20 -0
- package/dist/src/trace-manager.d.ts.map +1 -0
- package/dist/src/trace-manager.js +112 -0
- package/dist/src/trace-manager.js.map +1 -0
- package/dist/src/watcher.d.ts +23 -0
- package/dist/src/watcher.d.ts.map +1 -0
- package/dist/src/watcher.js +292 -0
- package/dist/src/watcher.js.map +1 -0
- package/package.json +32 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
{
|
|
2
|
+
"agents": {
|
|
3
|
+
"claude_code": {
|
|
4
|
+
"patterns": ["╭─", "Claude:", "⏺", "claude --", "Claude Code"],
|
|
5
|
+
"type": "builder"
|
|
6
|
+
},
|
|
7
|
+
"codex": {
|
|
8
|
+
"patterns": ["codex>", "Codex:", "codex --"],
|
|
9
|
+
"type": "builder"
|
|
10
|
+
},
|
|
11
|
+
"openai_cli": {
|
|
12
|
+
"patterns": ["openai>", "OpenAI:"],
|
|
13
|
+
"type": "builder"
|
|
14
|
+
},
|
|
15
|
+
"openclaw": {
|
|
16
|
+
"patterns": ["openclaw", "sessions_spawn", "OpenClaw"],
|
|
17
|
+
"type": "ops"
|
|
18
|
+
},
|
|
19
|
+
"generic": {
|
|
20
|
+
"patterns": ["[Agent]", "[AI]", "gpt-4", "claude", "gemini", "o3", "o4-mini"],
|
|
21
|
+
"type": "builder"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"events": {
|
|
25
|
+
"file_read": {
|
|
26
|
+
"patterns": [
|
|
27
|
+
"Reading file:",
|
|
28
|
+
"Read\\(",
|
|
29
|
+
"\\bcat\\s+",
|
|
30
|
+
"\\bhead\\s+",
|
|
31
|
+
"\\btail\\s+",
|
|
32
|
+
"read_file"
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
"file_write": {
|
|
36
|
+
"patterns": [
|
|
37
|
+
"Writing to:",
|
|
38
|
+
"Created:",
|
|
39
|
+
"Edit\\(",
|
|
40
|
+
"Write\\(",
|
|
41
|
+
"write_file",
|
|
42
|
+
"Wrote \\d+"
|
|
43
|
+
]
|
|
44
|
+
},
|
|
45
|
+
"api_call": {
|
|
46
|
+
"patterns": [
|
|
47
|
+
"\\bcurl\\s+",
|
|
48
|
+
"\\bfetch\\(",
|
|
49
|
+
"\\bhttp[s]?://",
|
|
50
|
+
"web_fetch",
|
|
51
|
+
"web_search"
|
|
52
|
+
]
|
|
53
|
+
},
|
|
54
|
+
"tool_use": {
|
|
55
|
+
"patterns": [
|
|
56
|
+
"\\bnpm run\\b",
|
|
57
|
+
"\\bpython[3]?\\s+",
|
|
58
|
+
"\\bnode\\s+",
|
|
59
|
+
"\\bnpx\\s+",
|
|
60
|
+
"\\bbash\\s+",
|
|
61
|
+
"exec\\(",
|
|
62
|
+
"\\$ "
|
|
63
|
+
]
|
|
64
|
+
},
|
|
65
|
+
"error": {
|
|
66
|
+
"patterns": [
|
|
67
|
+
"\\bError:",
|
|
68
|
+
"\\bFAIL\\b",
|
|
69
|
+
"\\b✗\\b",
|
|
70
|
+
"\\bERROR\\b",
|
|
71
|
+
"Traceback \\(",
|
|
72
|
+
"stack trace",
|
|
73
|
+
"panic:",
|
|
74
|
+
"ENOENT",
|
|
75
|
+
"EACCES",
|
|
76
|
+
"TypeError:",
|
|
77
|
+
"SyntaxError:"
|
|
78
|
+
]
|
|
79
|
+
},
|
|
80
|
+
"status_change": {
|
|
81
|
+
"patterns": [
|
|
82
|
+
"\\b✓\\b",
|
|
83
|
+
"\\bDone\\b",
|
|
84
|
+
"\\bCompleted\\b",
|
|
85
|
+
"\\bSuccess\\b",
|
|
86
|
+
"\\bFinished\\b",
|
|
87
|
+
"Task completed"
|
|
88
|
+
]
|
|
89
|
+
},
|
|
90
|
+
"spawn": {
|
|
91
|
+
"patterns": [
|
|
92
|
+
"sessions_spawn",
|
|
93
|
+
"tmux new-session",
|
|
94
|
+
"tmux new -",
|
|
95
|
+
"Spawning",
|
|
96
|
+
"spawn\\("
|
|
97
|
+
]
|
|
98
|
+
},
|
|
99
|
+
"cost": {
|
|
100
|
+
"patterns": [
|
|
101
|
+
"tokens:",
|
|
102
|
+
"usage:",
|
|
103
|
+
"input_tokens:",
|
|
104
|
+
"output_tokens:",
|
|
105
|
+
"total_tokens:",
|
|
106
|
+
"Token usage:",
|
|
107
|
+
"Cost:"
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
"tokens": {
|
|
112
|
+
"input_tokens": [
|
|
113
|
+
"input_tokens:\\s*(\\d+)",
|
|
114
|
+
"prompt_tokens:\\s*(\\d+)",
|
|
115
|
+
"Input tokens:\\s*(\\d+)"
|
|
116
|
+
],
|
|
117
|
+
"output_tokens": [
|
|
118
|
+
"output_tokens:\\s*(\\d+)",
|
|
119
|
+
"completion_tokens:\\s*(\\d+)",
|
|
120
|
+
"Output tokens:\\s*(\\d+)"
|
|
121
|
+
],
|
|
122
|
+
"total_tokens": [
|
|
123
|
+
"total_tokens:\\s*(\\d+)",
|
|
124
|
+
"Total tokens:\\s*(\\d+)"
|
|
125
|
+
]
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { FluqConfig } from "./config";
|
|
2
|
+
export interface EventPayload {
|
|
3
|
+
agentId: string;
|
|
4
|
+
traceId?: string;
|
|
5
|
+
eventType: string;
|
|
6
|
+
payload?: Record<string, unknown>;
|
|
7
|
+
resource?: string;
|
|
8
|
+
tokensIn?: number;
|
|
9
|
+
tokensOut?: number;
|
|
10
|
+
estimatedCostUsd?: number;
|
|
11
|
+
errorMessage?: string;
|
|
12
|
+
metadata?: Record<string, unknown>;
|
|
13
|
+
}
|
|
14
|
+
export declare class Reporter {
|
|
15
|
+
private queue;
|
|
16
|
+
private failedBatches;
|
|
17
|
+
private flushTimer;
|
|
18
|
+
private config;
|
|
19
|
+
private totalSent;
|
|
20
|
+
private totalFailed;
|
|
21
|
+
constructor(config: FluqConfig);
|
|
22
|
+
start(): void;
|
|
23
|
+
stop(): void;
|
|
24
|
+
enqueue(event: EventPayload): void;
|
|
25
|
+
private flush;
|
|
26
|
+
private sendBatch;
|
|
27
|
+
getStats(): {
|
|
28
|
+
totalSent: number;
|
|
29
|
+
totalFailed: number;
|
|
30
|
+
queued: number;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=reporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../src/reporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAG3C,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAWD,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,WAAW,CAAK;gBAEZ,MAAM,EAAE,UAAU;IAI9B,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI;IASZ,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;YAQpB,KAAK;YAeL,SAAS;IAgEvB,QAAQ,IAAI;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAOvE"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Reporter = void 0;
|
|
4
|
+
const MAX_RETRIES = 3;
|
|
5
|
+
const BATCH_SIZE = 50;
|
|
6
|
+
const FLUSH_INTERVAL_MS = 5000;
|
|
7
|
+
class Reporter {
|
|
8
|
+
queue = [];
|
|
9
|
+
failedBatches = [];
|
|
10
|
+
flushTimer = null;
|
|
11
|
+
config;
|
|
12
|
+
totalSent = 0;
|
|
13
|
+
totalFailed = 0;
|
|
14
|
+
constructor(config) {
|
|
15
|
+
this.config = config;
|
|
16
|
+
}
|
|
17
|
+
start() {
|
|
18
|
+
this.flushTimer = setInterval(() => this.flush(), FLUSH_INTERVAL_MS);
|
|
19
|
+
}
|
|
20
|
+
stop() {
|
|
21
|
+
if (this.flushTimer) {
|
|
22
|
+
clearInterval(this.flushTimer);
|
|
23
|
+
this.flushTimer = null;
|
|
24
|
+
}
|
|
25
|
+
// Final flush
|
|
26
|
+
this.flush();
|
|
27
|
+
}
|
|
28
|
+
enqueue(event) {
|
|
29
|
+
this.queue.push(event);
|
|
30
|
+
if (this.queue.length >= BATCH_SIZE) {
|
|
31
|
+
this.flush();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async flush() {
|
|
35
|
+
// Retry failed batches first
|
|
36
|
+
const retrying = [...this.failedBatches];
|
|
37
|
+
this.failedBatches = [];
|
|
38
|
+
for (const batch of retrying) {
|
|
39
|
+
await this.sendBatch(batch.events, batch.retries);
|
|
40
|
+
}
|
|
41
|
+
// Send current queue
|
|
42
|
+
if (this.queue.length === 0)
|
|
43
|
+
return;
|
|
44
|
+
const batch = this.queue.splice(0, BATCH_SIZE);
|
|
45
|
+
await this.sendBatch(batch, 0);
|
|
46
|
+
}
|
|
47
|
+
async sendBatch(events, retries) {
|
|
48
|
+
if (this.config.dryRun) {
|
|
49
|
+
for (const e of events) {
|
|
50
|
+
console.log(`[dry-run] ${e.eventType} agent=${e.agentId} resource=${e.resource || "–"}`);
|
|
51
|
+
}
|
|
52
|
+
this.totalSent += events.length;
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const url = `${this.config.endpoint}/api/v1/events/ingest`;
|
|
57
|
+
const response = await fetch(url, {
|
|
58
|
+
method: "POST",
|
|
59
|
+
headers: {
|
|
60
|
+
"Content-Type": "application/json",
|
|
61
|
+
Authorization: `Bearer ${this.config.apiKey}`,
|
|
62
|
+
},
|
|
63
|
+
body: JSON.stringify(events),
|
|
64
|
+
signal: AbortSignal.timeout(10000),
|
|
65
|
+
});
|
|
66
|
+
if (response.ok || response.status === 207) {
|
|
67
|
+
const data = await response.json();
|
|
68
|
+
this.totalSent += data.data?.count || events.length;
|
|
69
|
+
if (this.config.verbose) {
|
|
70
|
+
console.log(`[reporter] Sent ${events.length} events (total: ${this.totalSent})`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else if (response.status === 429) {
|
|
74
|
+
// Rate limited — retry with backoff
|
|
75
|
+
const retryAfter = response.headers.get("Retry-After");
|
|
76
|
+
const delayMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 5000;
|
|
77
|
+
if (this.config.verbose) {
|
|
78
|
+
console.warn(`[reporter] Rate limited, retrying in ${delayMs}ms`);
|
|
79
|
+
}
|
|
80
|
+
setTimeout(() => {
|
|
81
|
+
this.failedBatches.push({ events, retries: retries + 1 });
|
|
82
|
+
}, delayMs);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
if (retries < MAX_RETRIES) {
|
|
90
|
+
this.failedBatches.push({ events, retries: retries + 1 });
|
|
91
|
+
if (this.config.verbose) {
|
|
92
|
+
console.warn(`[reporter] Send failed (retry ${retries + 1}/${MAX_RETRIES}): ${err}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
this.totalFailed += events.length;
|
|
97
|
+
console.error(`[reporter] Dropped ${events.length} events after ${MAX_RETRIES} retries`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
getStats() {
|
|
102
|
+
return {
|
|
103
|
+
totalSent: this.totalSent,
|
|
104
|
+
totalFailed: this.totalFailed,
|
|
105
|
+
queued: this.queue.length + this.failedBatches.reduce((s, b) => s + b.events.length, 0),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
exports.Reporter = Reporter;
|
|
110
|
+
//# sourceMappingURL=reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/reporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { FluqConfig } from "./config";
|
|
2
|
+
interface ActiveTrace {
|
|
3
|
+
id: string;
|
|
4
|
+
agentId: string;
|
|
5
|
+
sessionName: string;
|
|
6
|
+
startedAt: Date;
|
|
7
|
+
parentTraceId?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class TraceManager {
|
|
10
|
+
private activeTraces;
|
|
11
|
+
private config;
|
|
12
|
+
constructor(config: FluqConfig);
|
|
13
|
+
startTrace(sessionName: string, agentId: string, parentTraceId?: string): Promise<string>;
|
|
14
|
+
endTrace(sessionName: string, status?: "completed" | "failed"): Promise<void>;
|
|
15
|
+
getTraceId(sessionName: string): string | undefined;
|
|
16
|
+
getActiveTraces(): Map<string, ActiveTrace>;
|
|
17
|
+
closeAllTraces(): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=trace-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-manager.d.ts","sourceRoot":"","sources":["../../src/trace-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,EAAE,UAAU;IAIxB,UAAU,CACd,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC;IAoEZ,QAAQ,CACZ,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,WAAW,GAAG,QAAsB,GAC3C,OAAO,CAAC,IAAI,CAAC;IAmChB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAInD,eAAe,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC;IAIrC,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;CAMtC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TraceManager = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
class TraceManager {
|
|
6
|
+
activeTraces = new Map();
|
|
7
|
+
config;
|
|
8
|
+
constructor(config) {
|
|
9
|
+
this.config = config;
|
|
10
|
+
}
|
|
11
|
+
async startTrace(sessionName, agentId, parentTraceId) {
|
|
12
|
+
// If trace already active for this session, return it
|
|
13
|
+
const existing = this.activeTraces.get(sessionName);
|
|
14
|
+
if (existing) {
|
|
15
|
+
return existing.id;
|
|
16
|
+
}
|
|
17
|
+
const traceId = (0, crypto_1.randomUUID)();
|
|
18
|
+
if (!this.config.dryRun) {
|
|
19
|
+
try {
|
|
20
|
+
const url = `${this.config.endpoint}/api/v1/traces`;
|
|
21
|
+
const response = await fetch(url, {
|
|
22
|
+
method: "POST",
|
|
23
|
+
headers: {
|
|
24
|
+
"Content-Type": "application/json",
|
|
25
|
+
Authorization: `Bearer ${this.config.apiKey}`,
|
|
26
|
+
},
|
|
27
|
+
body: JSON.stringify({
|
|
28
|
+
agentId,
|
|
29
|
+
name: `tmux-${sessionName}`,
|
|
30
|
+
parentTraceId,
|
|
31
|
+
environment: "local",
|
|
32
|
+
}),
|
|
33
|
+
signal: AbortSignal.timeout(10000),
|
|
34
|
+
});
|
|
35
|
+
if (response.ok) {
|
|
36
|
+
const data = await response.json();
|
|
37
|
+
const serverTraceId = data.data.id;
|
|
38
|
+
this.activeTraces.set(sessionName, {
|
|
39
|
+
id: serverTraceId,
|
|
40
|
+
agentId,
|
|
41
|
+
sessionName,
|
|
42
|
+
startedAt: new Date(),
|
|
43
|
+
parentTraceId,
|
|
44
|
+
});
|
|
45
|
+
if (this.config.verbose) {
|
|
46
|
+
console.log(`[trace] Started trace for "${sessionName}" → ${serverTraceId}`);
|
|
47
|
+
}
|
|
48
|
+
return serverTraceId;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
console.error(`[trace] Failed to create trace: HTTP ${response.status}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
console.error(`[trace] Failed to create trace:`, err);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Fallback: use local UUID
|
|
59
|
+
this.activeTraces.set(sessionName, {
|
|
60
|
+
id: traceId,
|
|
61
|
+
agentId,
|
|
62
|
+
sessionName,
|
|
63
|
+
startedAt: new Date(),
|
|
64
|
+
parentTraceId,
|
|
65
|
+
});
|
|
66
|
+
return traceId;
|
|
67
|
+
}
|
|
68
|
+
async endTrace(sessionName, status = "completed") {
|
|
69
|
+
const trace = this.activeTraces.get(sessionName);
|
|
70
|
+
if (!trace)
|
|
71
|
+
return;
|
|
72
|
+
this.activeTraces.delete(sessionName);
|
|
73
|
+
if (this.config.dryRun) {
|
|
74
|
+
if (this.config.verbose) {
|
|
75
|
+
console.log(`[trace] [dry-run] Ended trace for "${sessionName}" → ${status}`);
|
|
76
|
+
}
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
const url = `${this.config.endpoint}/api/v1/traces/${trace.id}`;
|
|
81
|
+
await fetch(url, {
|
|
82
|
+
method: "PATCH",
|
|
83
|
+
headers: {
|
|
84
|
+
"Content-Type": "application/json",
|
|
85
|
+
Authorization: `Bearer ${this.config.apiKey}`,
|
|
86
|
+
},
|
|
87
|
+
body: JSON.stringify({ status }),
|
|
88
|
+
signal: AbortSignal.timeout(10000),
|
|
89
|
+
});
|
|
90
|
+
if (this.config.verbose) {
|
|
91
|
+
console.log(`[trace] Ended trace for "${sessionName}" → ${status}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
console.error(`[trace] Failed to end trace:`, err);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
getTraceId(sessionName) {
|
|
99
|
+
return this.activeTraces.get(sessionName)?.id;
|
|
100
|
+
}
|
|
101
|
+
getActiveTraces() {
|
|
102
|
+
return new Map(this.activeTraces);
|
|
103
|
+
}
|
|
104
|
+
async closeAllTraces() {
|
|
105
|
+
const sessions = Array.from(this.activeTraces.keys());
|
|
106
|
+
for (const session of sessions) {
|
|
107
|
+
await this.endTrace(session, "completed");
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.TraceManager = TraceManager;
|
|
112
|
+
//# sourceMappingURL=trace-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-manager.js","sourceRoot":"","sources":["../../src/trace-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { FluqConfig } from "./config";
|
|
2
|
+
export declare class Watcher {
|
|
3
|
+
private config;
|
|
4
|
+
private registry;
|
|
5
|
+
private reporter;
|
|
6
|
+
private traceManager;
|
|
7
|
+
private paneStates;
|
|
8
|
+
private pollTimer;
|
|
9
|
+
private knownSessions;
|
|
10
|
+
constructor(config: FluqConfig);
|
|
11
|
+
start(): void;
|
|
12
|
+
stop(): Promise<void>;
|
|
13
|
+
private poll;
|
|
14
|
+
private discoverSessions;
|
|
15
|
+
private discoverPanes;
|
|
16
|
+
private capturePaneOutput;
|
|
17
|
+
private processPaneOutput;
|
|
18
|
+
private diffOutput;
|
|
19
|
+
private deduplicateEvents;
|
|
20
|
+
private handleSessionEnd;
|
|
21
|
+
private handleSpawnDetection;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/watcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AA0B3C,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,aAAa,CAA0B;gBAEnC,MAAM,EAAE,UAAU;IAO9B,KAAK,IAAI,IAAI;IA0BP,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B,OAAO,CAAC,IAAI;IA4BZ,OAAO,CAAC,gBAAgB;IAsCxB,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,iBAAiB;YAWX,iBAAiB;IA6G/B,OAAO,CAAC,UAAU;IAyBlB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,gBAAgB;YAYV,oBAAoB;CAqCnC"}
|