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.
@@ -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":";;;AAAA,mCAAoC;AAWpC,MAAa,YAAY;IACf,YAAY,GAA6B,IAAI,GAAG,EAAE,CAAC;IACnD,MAAM,CAAa;IAE3B,YAAY,MAAkB;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,UAAU,CACd,WAAmB,EACnB,OAAe,EACf,aAAsB;QAEtB,sDAAsD;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC,EAAE,CAAC;QACrB,CAAC;QAED,MAAM,OAAO,GAAG,IAAA,mBAAU,GAAE,CAAC;QAE7B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,gBAAgB,CAAC;gBACpD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;oBAChC,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;wBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;qBAC9C;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,OAAO;wBACP,IAAI,EAAE,QAAQ,WAAW,EAAE;wBAC3B,aAAa;wBACb,WAAW,EAAE,OAAO;qBACrB,CAAC;oBACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;iBACnC,CAAC,CAAC;gBAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;oBAChB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA8B,CAAC;oBAC/D,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBAEnC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE;wBACjC,EAAE,EAAE,aAAa;wBACjB,OAAO;wBACP,WAAW;wBACX,SAAS,EAAE,IAAI,IAAI,EAAE;wBACrB,aAAa;qBACd,CAAC,CAAC;oBAEH,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;wBACxB,OAAO,CAAC,GAAG,CACT,8BAA8B,WAAW,OAAO,aAAa,EAAE,CAChE,CAAC;oBACJ,CAAC;oBAED,OAAO,aAAa,CAAC;gBACvB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,KAAK,CACX,wCAAwC,QAAQ,CAAC,MAAM,EAAE,CAC1D,CAAC;gBACJ,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE;YACjC,EAAE,EAAE,OAAO;YACX,OAAO;YACP,WAAW;YACX,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,aAAa;SACd,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,WAAmB,EACnB,SAAiC,WAAW;QAE5C,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAEtC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,sCAAsC,WAAW,OAAO,MAAM,EAAE,CAAC,CAAC;YAChF,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,kBAAkB,KAAK,CAAC,EAAE,EAAE,CAAC;YAChE,MAAM,KAAK,CAAC,GAAG,EAAE;gBACf,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;iBAC9C;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;gBAChC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;aACnC,CAAC,CAAC;YAEH,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CACT,4BAA4B,WAAW,OAAO,MAAM,EAAE,CACvD,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,UAAU,CAAC,WAAmB;QAC5B,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;IAChD,CAAC;IAED,eAAe;QACb,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QACtD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;CACF;AApID,oCAoIC"}
@@ -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"}