dmux 2.2.1 → 3.0.1
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/dist/DmuxApp.d.ts.map +1 -1
- package/dist/DmuxApp.js +433 -179
- package/dist/DmuxApp.js.map +1 -1
- package/dist/MergePane.d.ts.map +1 -1
- package/dist/MergePane.js +4 -6
- package/dist/MergePane.js.map +1 -1
- package/dist/PaneAnalyzer.d.ts +45 -0
- package/dist/PaneAnalyzer.d.ts.map +1 -0
- package/dist/PaneAnalyzer.js +278 -0
- package/dist/PaneAnalyzer.js.map +1 -0
- package/dist/_plugin-vue_export-helper.css +1 -0
- package/dist/actions/index.d.ts +19 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +54 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/actions/paneActions.d.ts +45 -0
- package/dist/actions/paneActions.d.ts.map +1 -0
- package/dist/actions/paneActions.js +932 -0
- package/dist/actions/paneActions.js.map +1 -0
- package/dist/actions/types.d.ts +101 -0
- package/dist/actions/types.d.ts.map +1 -0
- package/dist/actions/types.js +129 -0
- package/dist/actions/types.js.map +1 -0
- package/dist/adapters/apiActionHandler.d.ts +64 -0
- package/dist/adapters/apiActionHandler.d.ts.map +1 -0
- package/dist/adapters/apiActionHandler.js +170 -0
- package/dist/adapters/apiActionHandler.js.map +1 -0
- package/dist/adapters/tuiActionHandler.d.ts +57 -0
- package/dist/adapters/tuiActionHandler.d.ts.map +1 -0
- package/dist/adapters/tuiActionHandler.js +152 -0
- package/dist/adapters/tuiActionHandler.js.map +1 -0
- package/dist/chunks/_plugin-vue_export-helper-Cvoq67hi.js +28 -0
- package/dist/components/ActionChoiceDialog.d.ts +16 -0
- package/dist/components/ActionChoiceDialog.d.ts.map +1 -0
- package/dist/components/ActionChoiceDialog.js +29 -0
- package/dist/components/ActionChoiceDialog.js.map +1 -0
- package/dist/components/ActionConfirmDialog.d.ts +16 -0
- package/dist/components/ActionConfirmDialog.d.ts.map +1 -0
- package/dist/components/ActionConfirmDialog.js +31 -0
- package/dist/components/ActionConfirmDialog.js.map +1 -0
- package/dist/components/ActionInputDialog.d.ts +16 -0
- package/dist/components/ActionInputDialog.d.ts.map +1 -0
- package/dist/components/ActionInputDialog.js +49 -0
- package/dist/components/ActionInputDialog.js.map +1 -0
- package/dist/components/ActionProgressDialog.d.ts +13 -0
- package/dist/components/ActionProgressDialog.d.ts.map +1 -0
- package/dist/components/ActionProgressDialog.js +20 -0
- package/dist/components/ActionProgressDialog.js.map +1 -0
- package/dist/components/FooterHelp.d.ts +2 -0
- package/dist/components/FooterHelp.d.ts.map +1 -1
- package/dist/components/FooterHelp.js +9 -2
- package/dist/components/FooterHelp.js.map +1 -1
- package/dist/components/KebabMenu.d.ts +10 -0
- package/dist/components/KebabMenu.d.ts.map +1 -0
- package/dist/components/KebabMenu.js +18 -0
- package/dist/components/KebabMenu.js.map +1 -0
- package/dist/components/LoadingIndicator.d.ts.map +1 -1
- package/dist/components/LoadingIndicator.js +5 -5
- package/dist/components/LoadingIndicator.js.map +1 -1
- package/dist/components/PaneCard.d.ts +1 -0
- package/dist/components/PaneCard.d.ts.map +1 -1
- package/dist/components/PaneCard.js +21 -20
- package/dist/components/PaneCard.js.map +1 -1
- package/dist/components/PanesGrid.d.ts +1 -0
- package/dist/components/PanesGrid.d.ts.map +1 -1
- package/dist/components/PanesGrid.js +5 -4
- package/dist/components/PanesGrid.js.map +1 -1
- package/dist/components/QRCode.d.ts +7 -0
- package/dist/components/QRCode.d.ts.map +1 -0
- package/dist/components/QRCode.js +19 -0
- package/dist/components/QRCode.js.map +1 -0
- package/dist/components/Spinner.d.ts +10 -0
- package/dist/components/Spinner.d.ts.map +1 -0
- package/dist/components/Spinner.js +15 -0
- package/dist/components/Spinner.js.map +1 -0
- package/dist/dashboard.html +14 -0
- package/dist/dashboard.js +2 -0
- package/dist/hooks/useActionSystem.d.ts +31 -0
- package/dist/hooks/useActionSystem.d.ts.map +1 -0
- package/dist/hooks/useActionSystem.js +95 -0
- package/dist/hooks/useActionSystem.js.map +1 -0
- package/dist/hooks/useAgentStatus.d.ts +4 -3
- package/dist/hooks/useAgentStatus.d.ts.map +1 -1
- package/dist/hooks/useAgentStatus.js +45 -194
- package/dist/hooks/useAgentStatus.js.map +1 -1
- package/dist/hooks/usePaneCreation.d.ts +3 -1
- package/dist/hooks/usePaneCreation.d.ts.map +1 -1
- package/dist/hooks/usePaneCreation.js +49 -99
- package/dist/hooks/usePaneCreation.js.map +1 -1
- package/dist/hooks/usePanes.d.ts.map +1 -1
- package/dist/hooks/usePanes.js +6 -3
- package/dist/hooks/usePanes.js.map +1 -1
- package/dist/hooks/useTerminalWidth.d.ts.map +1 -1
- package/dist/hooks/useTerminalWidth.js +18 -1
- package/dist/hooks/useTerminalWidth.js.map +1 -1
- package/dist/hooks/useWorktreeActions.d.ts +2 -1
- package/dist/hooks/useWorktreeActions.d.ts.map +1 -1
- package/dist/hooks/useWorktreeActions.js +9 -1
- package/dist/hooks/useWorktreeActions.js.map +1 -1
- package/dist/index.js +48 -3
- package/dist/index.js.map +1 -1
- package/dist/server/actionsApi.d.ts +37 -0
- package/dist/server/actionsApi.d.ts.map +1 -0
- package/dist/server/actionsApi.js +256 -0
- package/dist/server/actionsApi.js.map +1 -0
- package/dist/server/embedded-assets.d.ts +13 -0
- package/dist/server/embedded-assets.d.ts.map +1 -0
- package/dist/server/embedded-assets.js +5038 -0
- package/dist/server/embedded-assets.js.map +1 -0
- package/dist/server/index.d.ts +21 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +99 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/routes.d.ts +3 -0
- package/dist/server/routes.d.ts.map +1 -0
- package/dist/server/routes.js +672 -0
- package/dist/server/routes.js.map +1 -0
- package/dist/server/static.d.ts +6 -0
- package/dist/server/static.d.ts.map +1 -0
- package/dist/server/static.js +3040 -0
- package/dist/server/static.js.map +1 -0
- package/dist/services/ConfigWatcher.d.ts +20 -0
- package/dist/services/ConfigWatcher.d.ts.map +1 -0
- package/dist/services/ConfigWatcher.js +75 -0
- package/dist/services/ConfigWatcher.js.map +1 -0
- package/dist/services/PaneWorkerManager.d.ts +69 -0
- package/dist/services/PaneWorkerManager.d.ts.map +1 -0
- package/dist/services/PaneWorkerManager.js +272 -0
- package/dist/services/PaneWorkerManager.js.map +1 -0
- package/dist/services/StatusDetector.d.ts +87 -0
- package/dist/services/StatusDetector.d.ts.map +1 -0
- package/dist/services/StatusDetector.js +387 -0
- package/dist/services/StatusDetector.js.map +1 -0
- package/dist/services/TerminalDiffer.d.ts +85 -0
- package/dist/services/TerminalDiffer.d.ts.map +1 -0
- package/dist/services/TerminalDiffer.js +499 -0
- package/dist/services/TerminalDiffer.js.map +1 -0
- package/dist/services/TerminalStreamer.d.ts +80 -0
- package/dist/services/TerminalStreamer.d.ts.map +1 -0
- package/dist/services/TerminalStreamer.js +490 -0
- package/dist/services/TerminalStreamer.js.map +1 -0
- package/dist/services/TunnelService.d.ts +9 -0
- package/dist/services/TunnelService.d.ts.map +1 -0
- package/dist/services/TunnelService.js +34 -0
- package/dist/services/TunnelService.js.map +1 -0
- package/dist/services/WorkerMessageBus.d.ts +48 -0
- package/dist/services/WorkerMessageBus.d.ts.map +1 -0
- package/dist/services/WorkerMessageBus.js +120 -0
- package/dist/services/WorkerMessageBus.js.map +1 -0
- package/dist/shared/StateManager.d.ts +34 -0
- package/dist/shared/StateManager.d.ts.map +1 -0
- package/dist/shared/StateManager.js +108 -0
- package/dist/shared/StateManager.js.map +1 -0
- package/dist/shared/StreamProtocol.d.ts +75 -0
- package/dist/shared/StreamProtocol.d.ts.map +1 -0
- package/dist/shared/StreamProtocol.js +37 -0
- package/dist/shared/StreamProtocol.js.map +1 -0
- package/dist/terminal.html +17 -0
- package/dist/terminal.js +3 -0
- package/dist/types.d.ts +21 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/agentDetection.d.ts +18 -0
- package/dist/utils/agentDetection.d.ts.map +1 -0
- package/dist/utils/agentDetection.js +73 -0
- package/dist/utils/agentDetection.js.map +1 -0
- package/dist/utils/aiMerge.d.ts +35 -0
- package/dist/utils/aiMerge.d.ts.map +1 -0
- package/dist/utils/aiMerge.js +302 -0
- package/dist/utils/aiMerge.js.map +1 -0
- package/dist/utils/conflictResolutionPane.d.ts +19 -0
- package/dist/utils/conflictResolutionPane.d.ts.map +1 -0
- package/dist/utils/conflictResolutionPane.js +214 -0
- package/dist/utils/conflictResolutionPane.js.map +1 -0
- package/dist/utils/mergeExecution.d.ts +52 -0
- package/dist/utils/mergeExecution.d.ts.map +1 -0
- package/dist/utils/mergeExecution.js +192 -0
- package/dist/utils/mergeExecution.js.map +1 -0
- package/dist/utils/mergeValidation.d.ts +67 -0
- package/dist/utils/mergeValidation.d.ts.map +1 -0
- package/dist/utils/mergeValidation.js +213 -0
- package/dist/utils/mergeValidation.js.map +1 -0
- package/dist/utils/paneCreation.d.ts +17 -0
- package/dist/utils/paneCreation.d.ts.map +1 -0
- package/dist/utils/paneCreation.js +274 -0
- package/dist/utils/paneCreation.js.map +1 -0
- package/dist/utils/port.d.ts +5 -0
- package/dist/utils/port.d.ts.map +1 -0
- package/dist/utils/port.js +54 -0
- package/dist/utils/port.js.map +1 -0
- package/dist/utils/slug.d.ts.map +1 -1
- package/dist/utils/slug.js +32 -25
- package/dist/utils/slug.js.map +1 -1
- package/dist/workers/PaneWorker.d.ts +2 -0
- package/dist/workers/PaneWorker.d.ts.map +1 -0
- package/dist/workers/PaneWorker.js +362 -0
- package/dist/workers/PaneWorker.js.map +1 -0
- package/dist/workers/WorkerMessages.d.ts +36 -0
- package/dist/workers/WorkerMessages.d.ts.map +1 -0
- package/dist/workers/WorkerMessages.js +9 -0
- package/dist/workers/WorkerMessages.js.map +1 -0
- package/package.json +19 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static.js","sourceRoot":"","sources":["../../src/server/static.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAu6BP,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import type { DmuxPane } from '../types.js';
|
|
3
|
+
export interface ConfigData {
|
|
4
|
+
panes: DmuxPane[];
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Watches the dmux.config.json file for changes and emits events
|
|
8
|
+
* when the file is modified. Only emits when actual changes occur.
|
|
9
|
+
*/
|
|
10
|
+
export declare class ConfigWatcher extends EventEmitter {
|
|
11
|
+
private watcher;
|
|
12
|
+
private configPath;
|
|
13
|
+
private lastContent;
|
|
14
|
+
constructor(configPath: string);
|
|
15
|
+
start(): Promise<void>;
|
|
16
|
+
private handleFileChange;
|
|
17
|
+
stop(): void;
|
|
18
|
+
getConfigPath(): string;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=ConfigWatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigWatcher.d.ts","sourceRoot":"","sources":["../../src/services/ConfigWatcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAc;gBAErB,UAAU,EAAE,MAAM;IAKxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAiCd,gBAAgB;IAoB9B,IAAI,IAAI,IAAI;IAQZ,aAAa,IAAI,MAAM;CAGxB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { watch } from 'chokidar';
|
|
2
|
+
import { EventEmitter } from 'events';
|
|
3
|
+
import { readFile } from 'fs/promises';
|
|
4
|
+
/**
|
|
5
|
+
* Watches the dmux.config.json file for changes and emits events
|
|
6
|
+
* when the file is modified. Only emits when actual changes occur.
|
|
7
|
+
*/
|
|
8
|
+
export class ConfigWatcher extends EventEmitter {
|
|
9
|
+
watcher = null;
|
|
10
|
+
configPath;
|
|
11
|
+
lastContent = '';
|
|
12
|
+
constructor(configPath) {
|
|
13
|
+
super();
|
|
14
|
+
this.configPath = configPath;
|
|
15
|
+
}
|
|
16
|
+
async start() {
|
|
17
|
+
// Read initial content
|
|
18
|
+
try {
|
|
19
|
+
this.lastContent = await readFile(this.configPath, 'utf-8');
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
// File might not exist yet
|
|
23
|
+
this.lastContent = '';
|
|
24
|
+
}
|
|
25
|
+
// Watch for changes
|
|
26
|
+
this.watcher = watch(this.configPath, {
|
|
27
|
+
persistent: true,
|
|
28
|
+
ignoreInitial: true, // Don't emit on initial add
|
|
29
|
+
awaitWriteFinish: {
|
|
30
|
+
stabilityThreshold: 100, // Wait 100ms after last write
|
|
31
|
+
pollInterval: 50
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
this.watcher.on('change', async (path) => {
|
|
35
|
+
await this.handleFileChange(path);
|
|
36
|
+
});
|
|
37
|
+
this.watcher.on('add', async (path) => {
|
|
38
|
+
// File was created
|
|
39
|
+
await this.handleFileChange(path);
|
|
40
|
+
});
|
|
41
|
+
this.watcher.on('error', (error) => {
|
|
42
|
+
console.error('Config watcher error:', error);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
async handleFileChange(path) {
|
|
46
|
+
try {
|
|
47
|
+
const newContent = await readFile(path, 'utf-8');
|
|
48
|
+
// Only emit if content actually changed
|
|
49
|
+
if (newContent !== this.lastContent) {
|
|
50
|
+
this.lastContent = newContent;
|
|
51
|
+
try {
|
|
52
|
+
const config = JSON.parse(newContent);
|
|
53
|
+
this.emit('change', config);
|
|
54
|
+
}
|
|
55
|
+
catch (parseErr) {
|
|
56
|
+
console.error('Failed to parse config file:', parseErr);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
console.error('Failed to read config file:', err);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
stop() {
|
|
65
|
+
if (this.watcher) {
|
|
66
|
+
this.watcher.close();
|
|
67
|
+
this.watcher = null;
|
|
68
|
+
}
|
|
69
|
+
this.removeAllListeners();
|
|
70
|
+
}
|
|
71
|
+
getConfigPath() {
|
|
72
|
+
return this.configPath;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=ConfigWatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigWatcher.js","sourceRoot":"","sources":["../../src/services/ConfigWatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAkB,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAOvC;;;GAGG;AACH,MAAM,OAAO,aAAc,SAAQ,YAAY;IACrC,OAAO,GAAqB,IAAI,CAAC;IACjC,UAAU,CAAS;IACnB,WAAW,GAAW,EAAE,CAAC;IAEjC,YAAY,UAAkB;QAC5B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,uBAAuB;QACvB,IAAI,CAAC;YACH,IAAI,CAAC,WAAW,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,2BAA2B;YAC3B,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACxB,CAAC;QAED,oBAAoB;QACpB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE;YACpC,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,IAAI,EAAE,4BAA4B;YACjD,gBAAgB,EAAE;gBAChB,kBAAkB,EAAE,GAAG,EAAE,8BAA8B;gBACvD,YAAY,EAAE,EAAE;aACjB;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACvC,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACpC,mBAAmB;YACnB,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,IAAY;QACzC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAEjD,wCAAwC;YACxC,IAAI,UAAU,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;gBACpC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;gBAE9B,IAAI,CAAC;oBACH,MAAM,MAAM,GAAe,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;oBAClD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC9B,CAAC;gBAAC,OAAO,QAAQ,EAAE,CAAC;oBAClB,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,QAAQ,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { DmuxPane } from '../types.js';
|
|
2
|
+
import type { WorkerMessageBus } from './WorkerMessageBus.js';
|
|
3
|
+
import type { InboundMessage, OutboundMessage } from '../workers/WorkerMessages.js';
|
|
4
|
+
/**
|
|
5
|
+
* Manages lifecycle of pane worker threads
|
|
6
|
+
*/
|
|
7
|
+
export declare class PaneWorkerManager {
|
|
8
|
+
private workers;
|
|
9
|
+
private messageBus;
|
|
10
|
+
private isShuttingDown;
|
|
11
|
+
private workerPath;
|
|
12
|
+
constructor(messageBus: WorkerMessageBus);
|
|
13
|
+
/**
|
|
14
|
+
* Create a new worker for a pane
|
|
15
|
+
*/
|
|
16
|
+
createWorker(pane: DmuxPane): void;
|
|
17
|
+
/**
|
|
18
|
+
* Send message to a specific worker
|
|
19
|
+
*/
|
|
20
|
+
sendToWorker(paneId: string, message: Omit<InboundMessage, 'id'>): Promise<OutboundMessage>;
|
|
21
|
+
/**
|
|
22
|
+
* Send notification to a worker without waiting for response
|
|
23
|
+
*/
|
|
24
|
+
notifyWorker(paneId: string, message: Omit<InboundMessage, 'id'>): void;
|
|
25
|
+
/**
|
|
26
|
+
* Broadcast message to all workers
|
|
27
|
+
*/
|
|
28
|
+
broadcastToWorkers(message: Omit<InboundMessage, 'id'>): void;
|
|
29
|
+
/**
|
|
30
|
+
* Destroy a specific worker
|
|
31
|
+
*/
|
|
32
|
+
destroyWorker(paneId: string): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Update workers based on current panes
|
|
35
|
+
*/
|
|
36
|
+
updateWorkers(panes: DmuxPane[]): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Handle message from worker
|
|
39
|
+
*/
|
|
40
|
+
private handleWorkerMessage;
|
|
41
|
+
/**
|
|
42
|
+
* Handle worker error
|
|
43
|
+
*/
|
|
44
|
+
private handleWorkerError;
|
|
45
|
+
/**
|
|
46
|
+
* Handle worker exit
|
|
47
|
+
*/
|
|
48
|
+
private handleWorkerExit;
|
|
49
|
+
/**
|
|
50
|
+
* Restart a worker
|
|
51
|
+
*/
|
|
52
|
+
private restartWorker;
|
|
53
|
+
/**
|
|
54
|
+
* Get worker statistics
|
|
55
|
+
*/
|
|
56
|
+
getStats(): {
|
|
57
|
+
workerCount: number;
|
|
58
|
+
workers: Array<{
|
|
59
|
+
paneId: string;
|
|
60
|
+
uptime: number;
|
|
61
|
+
restartCount: number;
|
|
62
|
+
}>;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Shutdown all workers
|
|
66
|
+
*/
|
|
67
|
+
shutdown(): Promise<void>;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=PaneWorkerManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PaneWorkerManager.d.ts","sourceRoot":"","sources":["../../src/services/PaneWorkerManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EAEhB,MAAM,8BAA8B,CAAC;AAYtC;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,EAAE,gBAAgB;IAMxC;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAmDlC;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,GAClC,OAAO,CAAC,eAAe,CAAC;IAsB3B;;OAEG;IACH,YAAY,CACV,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,GAClC,IAAI;IAoBP;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,IAAI;IAe7D;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBlD;;OAEG;IACG,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BrD;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAazB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;YACW,aAAa;IAgC3B;;OAEG;IACH,QAAQ,IAAI;QACV,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,KAAK,CAAC;YACb,MAAM,EAAE,MAAM,CAAC;YACf,MAAM,EAAE,MAAM,CAAC;YACf,YAAY,EAAE,MAAM,CAAC;SACtB,CAAC,CAAC;KACJ;IAaD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAWhC"}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { Worker } from 'worker_threads';
|
|
2
|
+
import { randomUUID } from 'crypto';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
/**
|
|
7
|
+
* Manages lifecycle of pane worker threads
|
|
8
|
+
*/
|
|
9
|
+
export class PaneWorkerManager {
|
|
10
|
+
workers = new Map();
|
|
11
|
+
messageBus;
|
|
12
|
+
isShuttingDown = false;
|
|
13
|
+
workerPath;
|
|
14
|
+
constructor(messageBus) {
|
|
15
|
+
this.messageBus = messageBus;
|
|
16
|
+
// Path to compiled worker file
|
|
17
|
+
this.workerPath = path.join(__dirname, '..', 'workers', 'PaneWorker.js');
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create a new worker for a pane
|
|
21
|
+
*/
|
|
22
|
+
createWorker(pane) {
|
|
23
|
+
// Don't create if already exists or shutting down
|
|
24
|
+
if (this.workers.has(pane.id) || this.isShuttingDown) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
const config = {
|
|
29
|
+
paneId: pane.id,
|
|
30
|
+
tmuxPaneId: pane.paneId,
|
|
31
|
+
agent: pane.agent,
|
|
32
|
+
pollInterval: 1000 // 1 second polling
|
|
33
|
+
};
|
|
34
|
+
const worker = new Worker(this.workerPath, {
|
|
35
|
+
workerData: config
|
|
36
|
+
});
|
|
37
|
+
const workerInfo = {
|
|
38
|
+
worker,
|
|
39
|
+
paneId: pane.id,
|
|
40
|
+
tmuxPaneId: pane.paneId,
|
|
41
|
+
startTime: Date.now(),
|
|
42
|
+
restartCount: 0
|
|
43
|
+
};
|
|
44
|
+
// Handle messages from worker
|
|
45
|
+
worker.on('message', (message) => {
|
|
46
|
+
this.handleWorkerMessage(pane.id, message);
|
|
47
|
+
});
|
|
48
|
+
// Handle worker errors
|
|
49
|
+
worker.on('error', (error) => {
|
|
50
|
+
console.error(`Worker ${pane.id} error:`, error);
|
|
51
|
+
this.handleWorkerError(pane.id, error);
|
|
52
|
+
});
|
|
53
|
+
// Handle worker exit
|
|
54
|
+
worker.on('exit', (code) => {
|
|
55
|
+
if (code !== 0 && !this.isShuttingDown) {
|
|
56
|
+
console.error(`Worker ${pane.id} exited with code ${code}`);
|
|
57
|
+
this.handleWorkerExit(pane.id);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
this.workers.set(pane.id, workerInfo);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
console.error(`Failed to create worker for pane ${pane.id}:`, error);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Send message to a specific worker
|
|
68
|
+
*/
|
|
69
|
+
async sendToWorker(paneId, message) {
|
|
70
|
+
const workerInfo = this.workers.get(paneId);
|
|
71
|
+
if (!workerInfo) {
|
|
72
|
+
throw new Error(`No worker found for pane ${paneId}`);
|
|
73
|
+
}
|
|
74
|
+
const messageId = randomUUID();
|
|
75
|
+
const fullMessage = {
|
|
76
|
+
...message,
|
|
77
|
+
id: messageId,
|
|
78
|
+
timestamp: Date.now()
|
|
79
|
+
};
|
|
80
|
+
// Set up response promise before sending
|
|
81
|
+
const responsePromise = this.messageBus.waitForResponse(messageId);
|
|
82
|
+
// Send message to worker
|
|
83
|
+
workerInfo.worker.postMessage(fullMessage);
|
|
84
|
+
return responsePromise;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Send notification to a worker without waiting for response
|
|
88
|
+
*/
|
|
89
|
+
notifyWorker(paneId, message) {
|
|
90
|
+
const workerInfo = this.workers.get(paneId);
|
|
91
|
+
if (!workerInfo) {
|
|
92
|
+
console.error(`No worker found for pane ${paneId}`);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const fullMessage = {
|
|
96
|
+
...message,
|
|
97
|
+
id: randomUUID(),
|
|
98
|
+
timestamp: Date.now()
|
|
99
|
+
};
|
|
100
|
+
try {
|
|
101
|
+
workerInfo.worker.postMessage(fullMessage);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
console.error(`Failed to notify worker ${paneId}:`, error);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Broadcast message to all workers
|
|
109
|
+
*/
|
|
110
|
+
broadcastToWorkers(message) {
|
|
111
|
+
this.workers.forEach((workerInfo, paneId) => {
|
|
112
|
+
try {
|
|
113
|
+
const fullMessage = {
|
|
114
|
+
...message,
|
|
115
|
+
id: randomUUID(),
|
|
116
|
+
timestamp: Date.now()
|
|
117
|
+
};
|
|
118
|
+
workerInfo.worker.postMessage(fullMessage);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
console.error(`Failed to broadcast to worker ${paneId}:`, error);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Destroy a specific worker
|
|
127
|
+
*/
|
|
128
|
+
async destroyWorker(paneId) {
|
|
129
|
+
const workerInfo = this.workers.get(paneId);
|
|
130
|
+
if (!workerInfo)
|
|
131
|
+
return;
|
|
132
|
+
try {
|
|
133
|
+
// Send shutdown message
|
|
134
|
+
await this.sendToWorker(paneId, {
|
|
135
|
+
type: 'shutdown',
|
|
136
|
+
timestamp: Date.now()
|
|
137
|
+
}).catch(() => { });
|
|
138
|
+
// Wait a bit for graceful shutdown
|
|
139
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
140
|
+
// Force terminate if still running
|
|
141
|
+
await workerInfo.worker.terminate();
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
console.error(`Error destroying worker ${paneId}:`, error);
|
|
145
|
+
}
|
|
146
|
+
finally {
|
|
147
|
+
this.workers.delete(paneId);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Update workers based on current panes
|
|
152
|
+
*/
|
|
153
|
+
async updateWorkers(panes) {
|
|
154
|
+
const currentPaneIds = new Set(panes.map(p => p.id));
|
|
155
|
+
// Create workers for new panes
|
|
156
|
+
for (const pane of panes) {
|
|
157
|
+
if (!this.workers.has(pane.id)) {
|
|
158
|
+
this.createWorker(pane);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
// Check if tmux pane ID changed
|
|
162
|
+
const workerInfo = this.workers.get(pane.id);
|
|
163
|
+
if (workerInfo.tmuxPaneId !== pane.paneId) {
|
|
164
|
+
// Pane ID changed, recreate worker
|
|
165
|
+
await this.destroyWorker(pane.id);
|
|
166
|
+
this.createWorker(pane);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Destroy workers for removed panes
|
|
171
|
+
const workersToRemove = [];
|
|
172
|
+
for (const [paneId] of this.workers) {
|
|
173
|
+
if (!currentPaneIds.has(paneId)) {
|
|
174
|
+
workersToRemove.push(paneId);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
await Promise.all(workersToRemove.map(id => this.destroyWorker(id)));
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Handle message from worker
|
|
181
|
+
*/
|
|
182
|
+
handleWorkerMessage(paneId, message) {
|
|
183
|
+
// Forward to message bus
|
|
184
|
+
this.messageBus.handleWorkerMessage(paneId, message);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Handle worker error
|
|
188
|
+
*/
|
|
189
|
+
handleWorkerError(paneId, error) {
|
|
190
|
+
const workerInfo = this.workers.get(paneId);
|
|
191
|
+
if (!workerInfo)
|
|
192
|
+
return;
|
|
193
|
+
// Attempt restart if not too many attempts
|
|
194
|
+
if (workerInfo.restartCount < 3) {
|
|
195
|
+
this.restartWorker(paneId);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
console.error(`Worker ${paneId} failed too many times, not restarting`);
|
|
199
|
+
this.workers.delete(paneId);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Handle worker exit
|
|
204
|
+
*/
|
|
205
|
+
handleWorkerExit(paneId) {
|
|
206
|
+
if (!this.isShuttingDown) {
|
|
207
|
+
const workerInfo = this.workers.get(paneId);
|
|
208
|
+
if (workerInfo && workerInfo.restartCount < 3) {
|
|
209
|
+
this.restartWorker(paneId);
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
this.workers.delete(paneId);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Restart a worker
|
|
218
|
+
*/
|
|
219
|
+
async restartWorker(paneId) {
|
|
220
|
+
const workerInfo = this.workers.get(paneId);
|
|
221
|
+
if (!workerInfo)
|
|
222
|
+
return;
|
|
223
|
+
const tmuxPaneId = workerInfo.tmuxPaneId;
|
|
224
|
+
const restartCount = workerInfo.restartCount + 1;
|
|
225
|
+
// Destroy old worker
|
|
226
|
+
this.workers.delete(paneId);
|
|
227
|
+
try {
|
|
228
|
+
await workerInfo.worker.terminate();
|
|
229
|
+
}
|
|
230
|
+
catch { }
|
|
231
|
+
// Wait before restart
|
|
232
|
+
await new Promise(resolve => setTimeout(resolve, 1000 * restartCount));
|
|
233
|
+
// Create new worker with updated restart count
|
|
234
|
+
if (!this.isShuttingDown) {
|
|
235
|
+
this.createWorker({
|
|
236
|
+
id: paneId,
|
|
237
|
+
paneId: tmuxPaneId,
|
|
238
|
+
slug: '',
|
|
239
|
+
prompt: ''
|
|
240
|
+
});
|
|
241
|
+
const newWorkerInfo = this.workers.get(paneId);
|
|
242
|
+
if (newWorkerInfo) {
|
|
243
|
+
newWorkerInfo.restartCount = restartCount;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Get worker statistics
|
|
249
|
+
*/
|
|
250
|
+
getStats() {
|
|
251
|
+
const workers = Array.from(this.workers.entries()).map(([paneId, info]) => ({
|
|
252
|
+
paneId,
|
|
253
|
+
uptime: Date.now() - info.startTime,
|
|
254
|
+
restartCount: info.restartCount
|
|
255
|
+
}));
|
|
256
|
+
return {
|
|
257
|
+
workerCount: this.workers.size,
|
|
258
|
+
workers
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Shutdown all workers
|
|
263
|
+
*/
|
|
264
|
+
async shutdown() {
|
|
265
|
+
this.isShuttingDown = true;
|
|
266
|
+
// Send shutdown to all workers
|
|
267
|
+
const shutdownPromises = Array.from(this.workers.keys()).map(paneId => this.destroyWorker(paneId));
|
|
268
|
+
await Promise.all(shutdownPromises);
|
|
269
|
+
this.workers.clear();
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=PaneWorkerManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PaneWorkerManager.js","sourceRoot":"","sources":["../../src/services/PaneWorkerManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import type { DmuxPane, AgentStatus, OptionChoice, PotentialHarm } from '../types.js';
|
|
3
|
+
import { WorkerMessageBus } from './WorkerMessageBus.js';
|
|
4
|
+
import { PaneWorkerManager } from './PaneWorkerManager.js';
|
|
5
|
+
export interface StatusUpdateEvent {
|
|
6
|
+
paneId: string;
|
|
7
|
+
status: AgentStatus;
|
|
8
|
+
previousStatus?: AgentStatus;
|
|
9
|
+
optionsQuestion?: string;
|
|
10
|
+
options?: OptionChoice[];
|
|
11
|
+
potentialHarm?: PotentialHarm;
|
|
12
|
+
summary?: string;
|
|
13
|
+
analyzerError?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* High-level service coordinating status detection via workers and LLM
|
|
17
|
+
*/
|
|
18
|
+
export declare class StatusDetector extends EventEmitter {
|
|
19
|
+
private workerManager;
|
|
20
|
+
private messageBus;
|
|
21
|
+
private paneAnalyzer;
|
|
22
|
+
private paneStatuses;
|
|
23
|
+
private llmRequests;
|
|
24
|
+
private paneIdMap;
|
|
25
|
+
private isShuttingDown;
|
|
26
|
+
constructor();
|
|
27
|
+
/**
|
|
28
|
+
* Set up handlers for worker messages
|
|
29
|
+
*/
|
|
30
|
+
private setupMessageHandlers;
|
|
31
|
+
/**
|
|
32
|
+
* Start monitoring a set of panes
|
|
33
|
+
*/
|
|
34
|
+
monitorPanes(panes: DmuxPane[]): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Handle status change from worker
|
|
37
|
+
*/
|
|
38
|
+
private handleStatusChange;
|
|
39
|
+
/**
|
|
40
|
+
* Handle analysis request from worker
|
|
41
|
+
*/
|
|
42
|
+
private handleAnalysisRequest;
|
|
43
|
+
/**
|
|
44
|
+
* Cancel LLM request for a pane
|
|
45
|
+
*/
|
|
46
|
+
private cancelLLMRequest;
|
|
47
|
+
/**
|
|
48
|
+
* Handle autopilot: automatically accept options when enabled and no risk
|
|
49
|
+
*/
|
|
50
|
+
private handleAutopilot;
|
|
51
|
+
/**
|
|
52
|
+
* Get tmux pane ID for a dmux pane
|
|
53
|
+
*/
|
|
54
|
+
private getTmuxPaneId;
|
|
55
|
+
/**
|
|
56
|
+
* Get current status for a pane
|
|
57
|
+
*/
|
|
58
|
+
getStatus(paneId: string): AgentStatus | undefined;
|
|
59
|
+
/**
|
|
60
|
+
* Get all statuses
|
|
61
|
+
*/
|
|
62
|
+
getAllStatuses(): Map<string, AgentStatus>;
|
|
63
|
+
/**
|
|
64
|
+
* Send keys to a pane (future feature)
|
|
65
|
+
*/
|
|
66
|
+
sendKeysToPane(paneId: string, keys: string): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Resize a pane (future feature)
|
|
69
|
+
*/
|
|
70
|
+
resizePane(paneId: string, width?: number, height?: number): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Get statistics
|
|
73
|
+
*/
|
|
74
|
+
getStats(): {
|
|
75
|
+
workerStats: ReturnType<PaneWorkerManager['getStats']>;
|
|
76
|
+
messageBusStats: ReturnType<WorkerMessageBus['getStats']>;
|
|
77
|
+
statusCounts: Record<AgentStatus, number>;
|
|
78
|
+
llmRequestsInFlight: number;
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Shutdown the service
|
|
82
|
+
*/
|
|
83
|
+
shutdown(): Promise<void>;
|
|
84
|
+
}
|
|
85
|
+
export declare function getStatusDetector(): StatusDetector;
|
|
86
|
+
export declare function resetStatusDetector(): void;
|
|
87
|
+
//# sourceMappingURL=StatusDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusDetector.d.ts","sourceRoot":"","sources":["../../src/services/StatusDetector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAM3D,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,CAAC;IACpB,cAAc,CAAC,EAAE,WAAW,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,cAAc,CAAS;;IAW/B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA4B5B;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAcpD;;OAEG;YACW,kBAAkB;IAkChC;;OAEG;YACW,qBAAqB;IAsKnC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;OAEG;YACW,eAAe;IA6C7B;;OAEG;YACW,aAAa;IAI3B;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIlD;;OAEG;IACH,cAAc,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC;IAI1C;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjE;;OAEG;IACG,UAAU,CACd,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAQhB;;OAEG;IACH,QAAQ,IAAI;QACV,WAAW,EAAE,UAAU,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;QACvD,eAAe,EAAE,UAAU,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC;QAC1D,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC1C,mBAAmB,EAAE,MAAM,CAAC;KAC7B;IAoBD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAoBhC;AAKD,wBAAgB,iBAAiB,IAAI,cAAc,CAKlD;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAK1C"}
|