dmux 2.2.1 → 3.0.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/dist/DmuxApp.d.ts.map +1 -1
- package/dist/DmuxApp.js +412 -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 +2 -1
- package/dist/hooks/usePaneCreation.d.ts.map +1 -1
- package/dist/hooks/usePaneCreation.js +46 -100
- package/dist/hooks/usePaneCreation.js.map +1 -1
- package/dist/hooks/usePanes.d.ts.map +1 -1
- package/dist/hooks/usePanes.js +5 -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.map +1 -1
- package/dist/hooks/useWorktreeActions.js +4 -0
- package/dist/hooks/useWorktreeActions.js.map +1 -1
- package/dist/index.js +43 -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 +5012 -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 +298 -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/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,120 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
/**
|
|
3
|
+
* Central message router for worker communication
|
|
4
|
+
* Handles message distribution and subscription management
|
|
5
|
+
*/
|
|
6
|
+
export class WorkerMessageBus extends EventEmitter {
|
|
7
|
+
subscribers = new Map();
|
|
8
|
+
responseHandlers = new Map();
|
|
9
|
+
requestTimeouts = new Map();
|
|
10
|
+
/**
|
|
11
|
+
* Handle incoming message from a worker
|
|
12
|
+
*/
|
|
13
|
+
handleWorkerMessage(paneId, message) {
|
|
14
|
+
// Check if this is a response to a request
|
|
15
|
+
if (message.id && this.responseHandlers.has(message.id)) {
|
|
16
|
+
const handler = this.responseHandlers.get(message.id);
|
|
17
|
+
const timeout = this.requestTimeouts.get(message.id);
|
|
18
|
+
if (timeout) {
|
|
19
|
+
clearTimeout(timeout);
|
|
20
|
+
this.requestTimeouts.delete(message.id);
|
|
21
|
+
}
|
|
22
|
+
this.responseHandlers.delete(message.id);
|
|
23
|
+
handler(message);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
// Emit typed events for different message types
|
|
27
|
+
this.emit(`worker:${message.type}`, { ...message, paneId });
|
|
28
|
+
// Notify type-specific subscribers
|
|
29
|
+
const handlers = this.subscribers.get(message.type) || new Set();
|
|
30
|
+
handlers.forEach(handler => {
|
|
31
|
+
try {
|
|
32
|
+
handler(paneId, message);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
console.error(`Error in message handler for ${message.type}:`, error);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
// Emit generic event for logging/debugging
|
|
39
|
+
this.emit('worker:message', { paneId, message });
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Subscribe to specific message types
|
|
43
|
+
*/
|
|
44
|
+
subscribe(messageType, handler) {
|
|
45
|
+
if (!this.subscribers.has(messageType)) {
|
|
46
|
+
this.subscribers.set(messageType, new Set());
|
|
47
|
+
}
|
|
48
|
+
this.subscribers.get(messageType).add(handler);
|
|
49
|
+
// Return unsubscribe function
|
|
50
|
+
return {
|
|
51
|
+
unsubscribe: () => {
|
|
52
|
+
this.subscribers.get(messageType)?.delete(handler);
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Subscribe to multiple message types at once
|
|
58
|
+
*/
|
|
59
|
+
subscribeMultiple(messageTypes, handler) {
|
|
60
|
+
const subscriptions = messageTypes.map(type => this.subscribe(type, handler));
|
|
61
|
+
return {
|
|
62
|
+
unsubscribe: () => {
|
|
63
|
+
subscriptions.forEach(sub => sub.unsubscribe());
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Wait for a response to a specific request
|
|
69
|
+
*/
|
|
70
|
+
waitForResponse(requestId, timeoutMs = 5000) {
|
|
71
|
+
return new Promise((resolve, reject) => {
|
|
72
|
+
// Set up timeout
|
|
73
|
+
const timeout = setTimeout(() => {
|
|
74
|
+
this.responseHandlers.delete(requestId);
|
|
75
|
+
this.requestTimeouts.delete(requestId);
|
|
76
|
+
reject(new Error(`Request ${requestId} timed out after ${timeoutMs}ms`));
|
|
77
|
+
}, timeoutMs);
|
|
78
|
+
this.requestTimeouts.set(requestId, timeout);
|
|
79
|
+
// Set up response handler
|
|
80
|
+
this.responseHandlers.set(requestId, (response) => {
|
|
81
|
+
resolve(response);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Clear all subscriptions for a specific message type
|
|
87
|
+
*/
|
|
88
|
+
clearSubscriptions(messageType) {
|
|
89
|
+
if (messageType) {
|
|
90
|
+
this.subscribers.delete(messageType);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
this.subscribers.clear();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get statistics about message bus activity
|
|
98
|
+
*/
|
|
99
|
+
getStats() {
|
|
100
|
+
return {
|
|
101
|
+
subscriptionCount: Array.from(this.subscribers.values()).reduce((sum, set) => sum + set.size, 0),
|
|
102
|
+
pendingResponses: this.responseHandlers.size,
|
|
103
|
+
messageTypes: Array.from(this.subscribers.keys())
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Cleanup resources
|
|
108
|
+
*/
|
|
109
|
+
destroy() {
|
|
110
|
+
// Clear all timeouts
|
|
111
|
+
this.requestTimeouts.forEach(timeout => clearTimeout(timeout));
|
|
112
|
+
this.requestTimeouts.clear();
|
|
113
|
+
// Clear all handlers
|
|
114
|
+
this.responseHandlers.clear();
|
|
115
|
+
this.subscribers.clear();
|
|
116
|
+
// Remove all event listeners
|
|
117
|
+
this.removeAllListeners();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=WorkerMessageBus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkerMessageBus.js","sourceRoot":"","sources":["../../src/services/WorkerMessageBus.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import type { DmuxPane, ProjectSettings } from '../types.js';
|
|
3
|
+
export interface DmuxState {
|
|
4
|
+
panes: DmuxPane[];
|
|
5
|
+
projectName: string;
|
|
6
|
+
sessionName: string;
|
|
7
|
+
projectRoot: string;
|
|
8
|
+
settings: ProjectSettings;
|
|
9
|
+
serverPort?: number;
|
|
10
|
+
serverUrl?: string;
|
|
11
|
+
panesFile?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare class StateManager extends EventEmitter {
|
|
14
|
+
private static instance;
|
|
15
|
+
private state;
|
|
16
|
+
private updateCallbacks;
|
|
17
|
+
private configWatcher;
|
|
18
|
+
private constructor();
|
|
19
|
+
static getInstance(): StateManager;
|
|
20
|
+
getState(): DmuxState;
|
|
21
|
+
updatePanes(panes: DmuxPane[]): void;
|
|
22
|
+
updateProjectInfo(projectName: string, sessionName: string, projectRoot: string, panesFile?: string): void;
|
|
23
|
+
private startWatchingConfig;
|
|
24
|
+
updateSettings(settings: ProjectSettings): void;
|
|
25
|
+
updateServerInfo(port: number, url: string): void;
|
|
26
|
+
getPaneById(id: string): DmuxPane | undefined;
|
|
27
|
+
getPanes(): DmuxPane[];
|
|
28
|
+
subscribe(callback: (state: DmuxState) => void): () => void;
|
|
29
|
+
private notifyListeners;
|
|
30
|
+
reset(): void;
|
|
31
|
+
}
|
|
32
|
+
declare const _default: StateManager;
|
|
33
|
+
export default _default;
|
|
34
|
+
//# sourceMappingURL=StateManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StateManager.d.ts","sourceRoot":"","sources":["../../src/shared/StateManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG7D,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,eAAe,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAe;IACtC,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,eAAe,CAA8C;IACrE,OAAO,CAAC,aAAa,CAA8B;IAEnD,OAAO;IAWP,MAAM,CAAC,WAAW,IAAI,YAAY;IAOlC,QAAQ,IAAI,SAAS;IAIrB,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI;IAKpC,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAW1G,OAAO,CAAC,mBAAmB;IAmB3B,cAAc,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAK/C,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAMjD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAI7C,QAAQ,IAAI,QAAQ,EAAE;IAItB,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI;IAO3D,OAAO,CAAC,eAAe;IAYvB,KAAK,IAAI,IAAI;CAiBd;;AAED,wBAA0C"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import { ConfigWatcher } from '../services/ConfigWatcher.js';
|
|
3
|
+
export class StateManager extends EventEmitter {
|
|
4
|
+
static instance;
|
|
5
|
+
state;
|
|
6
|
+
updateCallbacks = new Set();
|
|
7
|
+
configWatcher = null;
|
|
8
|
+
constructor() {
|
|
9
|
+
super();
|
|
10
|
+
this.state = {
|
|
11
|
+
panes: [],
|
|
12
|
+
projectName: '',
|
|
13
|
+
sessionName: '',
|
|
14
|
+
projectRoot: '',
|
|
15
|
+
settings: {}
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
static getInstance() {
|
|
19
|
+
if (!StateManager.instance) {
|
|
20
|
+
StateManager.instance = new StateManager();
|
|
21
|
+
}
|
|
22
|
+
return StateManager.instance;
|
|
23
|
+
}
|
|
24
|
+
getState() {
|
|
25
|
+
return { ...this.state };
|
|
26
|
+
}
|
|
27
|
+
updatePanes(panes) {
|
|
28
|
+
this.state.panes = [...panes];
|
|
29
|
+
this.notifyListeners();
|
|
30
|
+
}
|
|
31
|
+
updateProjectInfo(projectName, sessionName, projectRoot, panesFile) {
|
|
32
|
+
this.state.projectName = projectName;
|
|
33
|
+
this.state.sessionName = sessionName;
|
|
34
|
+
this.state.projectRoot = projectRoot;
|
|
35
|
+
if (panesFile) {
|
|
36
|
+
this.state.panesFile = panesFile;
|
|
37
|
+
this.startWatchingConfig(panesFile);
|
|
38
|
+
}
|
|
39
|
+
this.notifyListeners();
|
|
40
|
+
}
|
|
41
|
+
startWatchingConfig(panesFile) {
|
|
42
|
+
// Stop existing watcher if any
|
|
43
|
+
if (this.configWatcher) {
|
|
44
|
+
this.configWatcher.stop();
|
|
45
|
+
}
|
|
46
|
+
// Start new watcher
|
|
47
|
+
this.configWatcher = new ConfigWatcher(panesFile);
|
|
48
|
+
this.configWatcher.on('change', (config) => {
|
|
49
|
+
// Update state with new panes from file
|
|
50
|
+
this.state.panes = [...config.panes];
|
|
51
|
+
this.notifyListeners();
|
|
52
|
+
});
|
|
53
|
+
this.configWatcher.start().catch(err => {
|
|
54
|
+
console.error('Failed to start config watcher:', err);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
updateSettings(settings) {
|
|
58
|
+
this.state.settings = { ...settings };
|
|
59
|
+
this.notifyListeners();
|
|
60
|
+
}
|
|
61
|
+
updateServerInfo(port, url) {
|
|
62
|
+
this.state.serverPort = port;
|
|
63
|
+
this.state.serverUrl = url;
|
|
64
|
+
this.notifyListeners();
|
|
65
|
+
}
|
|
66
|
+
getPaneById(id) {
|
|
67
|
+
return this.state.panes.find(pane => pane.id === id);
|
|
68
|
+
}
|
|
69
|
+
getPanes() {
|
|
70
|
+
return [...this.state.panes];
|
|
71
|
+
}
|
|
72
|
+
subscribe(callback) {
|
|
73
|
+
this.updateCallbacks.add(callback);
|
|
74
|
+
return () => {
|
|
75
|
+
this.updateCallbacks.delete(callback);
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
notifyListeners() {
|
|
79
|
+
const stateCopy = this.getState();
|
|
80
|
+
this.updateCallbacks.forEach(callback => {
|
|
81
|
+
try {
|
|
82
|
+
callback(stateCopy);
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
console.error('Error in state listener:', err);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
this.emit('stateChange', stateCopy);
|
|
89
|
+
}
|
|
90
|
+
reset() {
|
|
91
|
+
// Stop file watcher
|
|
92
|
+
if (this.configWatcher) {
|
|
93
|
+
this.configWatcher.stop();
|
|
94
|
+
this.configWatcher = null;
|
|
95
|
+
}
|
|
96
|
+
this.state = {
|
|
97
|
+
panes: [],
|
|
98
|
+
projectName: '',
|
|
99
|
+
sessionName: '',
|
|
100
|
+
projectRoot: '',
|
|
101
|
+
settings: {}
|
|
102
|
+
};
|
|
103
|
+
this.updateCallbacks.clear();
|
|
104
|
+
this.removeAllListeners();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export default StateManager.getInstance();
|
|
108
|
+
//# sourceMappingURL=StateManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StateManager.js","sourceRoot":"","sources":["../../src/shared/StateManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal streaming protocol message definitions
|
|
3
|
+
* Used for communication between server and client over HTTP streams
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Initial message sent when a client connects
|
|
7
|
+
* Contains full terminal state and dimensions
|
|
8
|
+
*/
|
|
9
|
+
export interface InitMessage {
|
|
10
|
+
type: 'init';
|
|
11
|
+
width: number;
|
|
12
|
+
height: number;
|
|
13
|
+
content: string;
|
|
14
|
+
cursorRow?: number;
|
|
15
|
+
cursorCol?: number;
|
|
16
|
+
timestamp: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Incremental update message
|
|
20
|
+
* Contains only the changes since last update
|
|
21
|
+
*/
|
|
22
|
+
export interface PatchMessage {
|
|
23
|
+
type: 'patch';
|
|
24
|
+
changes: Array<{
|
|
25
|
+
row: number;
|
|
26
|
+
col: number;
|
|
27
|
+
text: string;
|
|
28
|
+
length?: number;
|
|
29
|
+
}>;
|
|
30
|
+
cursorRow?: number;
|
|
31
|
+
cursorCol?: number;
|
|
32
|
+
timestamp: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Terminal resize message
|
|
36
|
+
* Sent when terminal dimensions change
|
|
37
|
+
*/
|
|
38
|
+
export interface ResizeMessage {
|
|
39
|
+
type: 'resize';
|
|
40
|
+
width: number;
|
|
41
|
+
height: number;
|
|
42
|
+
content: string;
|
|
43
|
+
timestamp: number;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Heartbeat message to keep connection alive
|
|
47
|
+
*/
|
|
48
|
+
export interface HeartbeatMessage {
|
|
49
|
+
type: 'heartbeat';
|
|
50
|
+
timestamp: number;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Error message for stream errors
|
|
54
|
+
*/
|
|
55
|
+
export interface ErrorMessage {
|
|
56
|
+
type: 'error';
|
|
57
|
+
error: string;
|
|
58
|
+
recoverable: boolean;
|
|
59
|
+
timestamp: number;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Union type for all stream messages
|
|
63
|
+
*/
|
|
64
|
+
export type StreamMessage = InitMessage | PatchMessage | ResizeMessage | HeartbeatMessage | ErrorMessage;
|
|
65
|
+
/**
|
|
66
|
+
* Parse a delimited stream message
|
|
67
|
+
* Format: "TYPE:JSON\n"
|
|
68
|
+
*/
|
|
69
|
+
export declare function parseStreamMessage(line: string): StreamMessage | null;
|
|
70
|
+
/**
|
|
71
|
+
* Format a message for streaming
|
|
72
|
+
* Returns "TYPE:JSON\n" format
|
|
73
|
+
*/
|
|
74
|
+
export declare function formatStreamMessage(message: StreamMessage): string;
|
|
75
|
+
//# sourceMappingURL=StreamProtocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StreamProtocol.d.ts","sourceRoot":"","sources":["../../src/shared/StreamProtocol.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,KAAK,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB,WAAW,GACX,YAAY,GACZ,aAAa,GACb,gBAAgB,GAChB,YAAY,CAAC;AAEjB;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAqBrE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAGlE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal streaming protocol message definitions
|
|
3
|
+
* Used for communication between server and client over HTTP streams
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Parse a delimited stream message
|
|
7
|
+
* Format: "TYPE:JSON\n"
|
|
8
|
+
*/
|
|
9
|
+
export function parseStreamMessage(line) {
|
|
10
|
+
try {
|
|
11
|
+
const colonIndex = line.indexOf(':');
|
|
12
|
+
if (colonIndex === -1)
|
|
13
|
+
return null;
|
|
14
|
+
const type = line.substring(0, colonIndex);
|
|
15
|
+
const json = line.substring(colonIndex + 1).trim();
|
|
16
|
+
if (!json)
|
|
17
|
+
return null;
|
|
18
|
+
const message = JSON.parse(json);
|
|
19
|
+
// Validate message type
|
|
20
|
+
if (!['INIT', 'PATCH', 'RESIZE', 'HEARTBEAT', 'ERROR'].includes(type)) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
return message;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Format a message for streaming
|
|
31
|
+
* Returns "TYPE:JSON\n" format
|
|
32
|
+
*/
|
|
33
|
+
export function formatStreamMessage(message) {
|
|
34
|
+
const type = message.type.toUpperCase();
|
|
35
|
+
return `${type}:${JSON.stringify(message)}\n`;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=StreamProtocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StreamProtocol.js","sourceRoot":"","sources":["../../src/shared/StreamProtocol.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyEH;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,UAAU,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAEnC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEnD,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAEvB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEjC,wBAAwB;QACxB,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACtE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,OAAwB,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAsB;IACxD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IACxC,OAAO,GAAG,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
|
|
6
|
+
<title>Terminal Viewer - dmux</title>
|
|
7
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
8
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
9
|
+
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
|
|
10
|
+
<script type="module" crossorigin src="/terminal.js"></script>
|
|
11
|
+
<link rel="modulepreload" crossorigin href="/chunks/_plugin-vue_export-helper-Cvoq67hi.js">
|
|
12
|
+
<link rel="stylesheet" crossorigin href="/_plugin-vue_export-helper.css">
|
|
13
|
+
</head>
|
|
14
|
+
<body>
|
|
15
|
+
<div id="app"></div>
|
|
16
|
+
</body>
|
|
17
|
+
</html>
|
package/dist/terminal.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{d as ue,r as g,p as de,o as ce,n as he,_ as ge,c as x,k as R,b as c,e as N,i as ve,t as j,f as $,l as O,v as be,F as me,h as ye,m as pe}from"./chunks/_plugin-vue_export-helper-Cvoq67hi.js";const ke=ue({__name:"Terminal",setup(ee,{expose:u}){u();const k=window.location.pathname.split("/").pop()||"",n=g([]),s=g({width:80,height:24}),w=g(!1),i=g(0),o=g(0),V=g("Loading..."),P=g(!1),b=g(!1),m=g(!1),C=g(!1),M=g(""),D=g(null),A=g("");let r={};const K=["#000000","#800000","#008000","#808000","#000080","#800080","#008080","#c0c0c0","#808080","#ff0000","#00ff00","#ffff00","#0000ff","#ff00ff","#00ffff","#ffffff","#000000","#00005f","#000087","#0000af","#0000d7","#0000ff","#005f00","#005f5f","#005f87","#005faf","#005fd7","#005fff","#008700","#00875f","#008787","#0087af","#0087d7","#0087ff","#00af00","#00af5f","#00af87","#00afaf","#00afd7","#00afff","#00d700","#00d75f","#00d787","#00d7af","#00d7d7","#00d7ff","#00ff00","#00ff5f","#00ff87","#00ffaf","#00ffd7","#00ffff","#5f0000","#5f005f","#5f0087","#5f00af","#5f00d7","#5f00ff","#5f5f00","#5f5f5f","#5f5f87","#5f5faf","#5f5fd7","#5f5fff","#5f8700","#5f875f","#5f8787","#5f87af","#5f87d7","#5f87ff","#5faf00","#5faf5f","#5faf87","#5fafaf","#5fafd7","#5fafff","#5fd700","#5fd75f","#5fd787","#5fd7af","#5fd7d7","#5fd7ff","#5fff00","#5fff5f","#5fff87","#5fffaf","#5fffd7","#5fffff","#870000","#87005f","#870087","#8700af","#8700d7","#8700ff","#875f00","#875f5f","#875f87","#875faf","#875fd7","#875fff","#878700","#87875f","#878787","#8787af","#8787d7","#8787ff","#87af00","#87af5f","#87af87","#87afaf","#87afd7","#87afff","#87d700","#87d75f","#87d787","#87d7af","#87d7d7","#87d7ff","#87ff00","#87ff5f","#87ff87","#87ffaf","#87ffd7","#87ffff","#af0000","#af005f","#af0087","#af00af","#af00d7","#af00ff","#af5f00","#af5f5f","#af5f87","#af5faf","#af5fd7","#af5fff","#af8700","#af875f","#af8787","#af87af","#af87d7","#af87ff","#afaf00","#afaf5f","#afaf87","#afafaf","#afafd7","#afafff","#afd700","#afd75f","#afd787","#afd7af","#afd7d7","#afd7ff","#afff00","#afff5f","#afff87","#afffaf","#afffd7","#afffff","#d70000","#d7005f","#d70087","#d700af","#d700d7","#d700ff","#d75f00","#d75f5f","#d75f87","#d75faf","#d75fd7","#d75fff","#d78700","#d7875f","#d78787","#d787af","#d787d7","#d787ff","#d7af00","#d7af5f","#d7af87","#d7afaf","#d7afd7","#d7afff","#d7d700","#d7d75f","#d7d787","#d7d7af","#d7d7d7","#d7d7ff","#d7ff00","#d7ff5f","#d7ff87","#d7ffaf","#d7ffd7","#d7ffff","#ff0000","#ff005f","#ff0087","#ff00af","#ff00d7","#ff00ff","#ff5f00","#ff5f5f","#ff5f87","#ff5faf","#ff5fd7","#ff5fff","#ff8700","#ff875f","#ff8787","#ff87af","#ff87d7","#ff87ff","#ffaf00","#ffaf5f","#ffaf87","#ffafaf","#ffafd7","#ffafff","#ffd700","#ffd75f","#ffd787","#ffd7af","#ffd7d7","#ffd7ff","#ffff00","#ffff5f","#ffff87","#ffffaf","#ffffd7","#ffffff","#080808","#121212","#1c1c1c","#262626","#303030","#3a3a3a","#444444","#4e4e4e","#585858","#626262","#6c6c6c","#767676","#808080","#8a8a8a","#949494","#9e9e9e","#a8a8a8","#b2b2b2","#bcbcbc","#c6c6c6","#d0d0d0","#dadada","#e4e4e4","#eeeeee"];function T(){n.value=Array(s.value.height).fill(null).map(()=>Array(s.value.width).fill(null).map(()=>({char:" ",fg:null,bg:null,bold:!1,dim:!1,italic:!1,underline:!1,strikethrough:!1})))}function E(e,f=!1,a=!0){let t=0;for(;t<e.length;){const l=e.charCodeAt(t);if(l===27){const d=H(e,t);if(d>t){const p=e.substring(t,d);L(p),t=d;continue}}if(l===8){o.value>0&&o.value--,t++;continue}z(e[t],a),t++}}function H(e,f){if(f+1>=e.length)return f+1;const a=e[f+1];if(a==="[")for(let t=f+2;t<e.length;t++){const l=e[t];if(l>="@"&&l<="~")return t+1}if(a==="]")for(let t=f+2;t<e.length;t++){const l=e.charCodeAt(t);if(l===7)return t+1;if(l===27&&t+1<e.length&&e[t+1]==="\\")return t+2}return f+2}function L(e){if(!(e.length<2)&&e[1]==="["){const f=e.substring(2,e.length-1),a=e[e.length-1];W(f,a)}}function W(e,f){const a=e.split(";").map(t=>parseInt(t)||0);switch(f){case"H":case"f":i.value=Math.min(Math.max((a[0]||1)-1,0),s.value.height-1),o.value=Math.min(Math.max((a[1]||1)-1,0),s.value.width-1);break;case"A":i.value=Math.max(i.value-(a[0]||1),0);break;case"B":i.value=Math.min(i.value+(a[0]||1),s.value.height-1);break;case"C":o.value=Math.min(o.value+(a[0]||1),s.value.width-1);break;case"D":o.value=Math.max(o.value-(a[0]||1),0);break;case"G":o.value=Math.min(Math.max((a[0]||1)-1,0),s.value.width-1);break;case"J":J(a[0]||0);break;case"K":F(a[0]||0);break;case"m":U(a);break}}function U(e){if(e.length===0||e[0]===0){r={};return}let f=0;for(;f<e.length;){const a=e[f];a===0?r={}:a===1?r.bold=!0:a===2?r.dim=!0:a===3?r.italic=!0:a===4?r.underline=!0:a===9?r.strikethrough=!0:a===22?(r.bold=!1,r.dim=!1):a===23?r.italic=!1:a===24?r.underline=!1:a===29?r.strikethrough=!1:a>=30&&a<=37?r.fg=["black","red","green","yellow","blue","magenta","cyan","white"][a-30]:a===38?f+1<e.length&&(e[f+1]===5&&f+2<e.length?(r.fg="c"+e[f+2],f+=2):e[f+1]===2&&f+4<e.length&&(r.fg=`rgb(${e[f+2]},${e[f+3]},${e[f+4]})`,f+=4)):a===39?r.fg=null:a>=40&&a<=47?r.bg=["black","red","green","yellow","blue","magenta","cyan","white"][a-40]:a===48?f+1<e.length&&(e[f+1]===5&&f+2<e.length?(r.bg="c"+e[f+2],f+=2):e[f+1]===2&&f+4<e.length&&(r.bg=`rgb(${e[f+2]},${e[f+3]},${e[f+4]})`,f+=4)):a===49?r.bg=null:a>=90&&a<=97?r.fg="bright-"+["black","red","green","yellow","blue","magenta","cyan","white"][a-90]:a>=100&&a<=107&&(r.bg="bright-"+["black","red","green","yellow","blue","magenta","cyan","white"][a-100]),f++}}function z(e,f=!0){if(e===`
|
|
2
|
+
`){i.value++,o.value=0,i.value>=s.value.height&&(f&&(n.value.shift(),n.value.push(Array(s.value.width).fill(null).map(()=>({char:" ",fg:null,bg:null,bold:!1,dim:!1,italic:!1,underline:!1,strikethrough:!1})))),i.value=s.value.height-1);return}if(e==="\r"){o.value=0;return}if(e===" "){o.value=Math.min(Math.floor((o.value+8)/8)*8,s.value.width-1);return}o.value>=s.value.width&&(o.value=0,i.value++,i.value>=s.value.height&&(f&&(n.value.shift(),n.value.push(Array(s.value.width).fill(null).map(()=>({char:" ",fg:null,bg:null,bold:!1,dim:!1,italic:!1,underline:!1,strikethrough:!1})))),i.value=s.value.height-1)),i.value<s.value.height&&o.value<s.value.width&&(n.value[i.value][o.value]={char:e,...r},o.value++)}function J(e){e===2&&T()}function F(e){if(e===0)for(let f=o.value;f<s.value.width;f++)n.value[i.value][f]={char:" ",fg:null,bg:null,bold:!1,dim:!1,italic:!1,underline:!1,strikethrough:!1};else if(e===2)for(let f=0;f<s.value.width;f++)n.value[i.value][f]={char:" ",fg:null,bg:null,bold:!1,dim:!1,italic:!1,underline:!1,strikethrough:!1}}function _(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function G(e,f){return e.fg===f.fg&&e.bg===f.bg&&e.bold===f.bold&&e.dim===f.dim&&e.italic===f.italic&&e.underline===f.underline&&e.strikethrough===f.strikethrough}function X(e){const f=[],a=[];if(e.fg)if(e.fg.startsWith("rgb("))a.push(`color: ${e.fg}`);else if(e.fg.startsWith("c")){const t=parseInt(e.fg.substring(1));t>=0&&t<K.length&&a.push(`color: ${K[t]}`)}else f.push("term-fg-"+e.fg);if(e.bg)if(e.bg.startsWith("rgb("))a.push(`background-color: ${e.bg}`);else if(e.bg.startsWith("c")){const t=parseInt(e.bg.substring(1));t>=0&&t<K.length&&a.push(`background-color: ${K[t]}`)}else f.push("term-bg-"+e.bg);return e.bold&&f.push("term-bold"),e.dim&&f.push("term-dim"),e.italic&&f.push("term-italic"),e.underline&&f.push("term-underline"),e.strikethrough&&f.push("term-strikethrough"),{classes:f,styles:a}}function B(){const f=`/api/stream/${A.value||k}`;fetch(f).then(a=>{if(!a.ok)throw new Error("Failed to connect");if(!a.body)throw new Error("No response body");const t=a.body.getReader(),l=new TextDecoder;let d="";w.value=!0,(async()=>{try{for(;;){const{done:v,value:h}=await t.read();if(v)break;d+=l.decode(h,{stream:!0});let y;for(;(y=d.indexOf(`
|
|
3
|
+
`))!==-1;){const I=d.substring(0,y);d=d.substring(y+1),I&&Z(I)}}}catch{w.value=!1}})()}).catch(a=>{w.value=!1})}function Z(e){const f=e.indexOf(":");if(f===-1)return;const a=e.substring(0,f),t=e.substring(f+1);try{const l=JSON.parse(t);switch(a){case"INIT":s.value={width:l.width,height:l.height},T(),i.value=0,o.value=0,E(l.content||"",!1,!1),l.cursorRow!==void 0&&l.cursorCol!==void 0&&(i.value=l.cursorRow,o.value=l.cursorCol);break;case"PATCH":const d=l.cursorRow,p=l.cursorCol;l.changes.forEach(v=>{E(v.text,!1,!1)}),d!==void 0&&p!==void 0&&(i.value=d,o.value=p);break;case"RESIZE":s.value={width:l.width,height:l.height},T(),E(l.content||"");break;case"HEARTBEAT":break}}catch{}}const fe=de(()=>({width:`${s.value.width}ch`,maxWidth:"100vw",fontSize:`clamp(11px, calc(100vw / ${s.value.width} / 0.6), 20px)`}));function ae(e,f){let a="",t=0;for(;t<e.length;){const l=e[t],d=f===i.value&&t===o.value;if(l.fg||l.bg||l.bold||l.dim||l.italic||l.underline||l.strikethrough||d){const{classes:v,styles:h}=X(l);d&&v.push("term-cursor");let y=l.char;for(t++;t<e.length;){const Y=e[t];if(f===i.value&&t===o.value||!G(l,Y))break;y+=Y.char,t++}const I=v.length?' class="'+v.join(" ")+'"':"",re=h.length?' style="'+h.join("; ")+'"':"";a+="<span"+I+re+">"+_(y)+"</span>"}else{let v="";for(;t<e.length;){const h=e[t],y=f===i.value&&t===o.value;if(h.fg||h.bg||h.bold||h.dim||h.italic||h.underline||h.strikethrough||y)break;v+=h.char,t++}a+=_(v)}}return a}function te(){b.value=!b.value,b.value&&m.value&&(m.value=!1)}function le(){m.value=!m.value,m.value&&b.value&&(b.value=!1)}function ne(){C.value=!C.value}async function S(e){const f={key:e,ctrlKey:b.value,altKey:m.value,shiftKey:C.value,metaKey:!1};b.value=!1,m.value=!1,C.value=!1;try{await fetch(`/api/keys/${A.value}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(f)})}catch{}}function ie(){P.value&&D.value&&D.value.focus()}function oe(e){const a=e.target.value,t=M.value;if(a.length>t.length){const l=a.substring(t.length);for(const d of l)S(d)}else if(a.length<t.length){const l=t.length-a.length;for(let d=0;d<l;d++)S("Backspace")}he(()=>{M.value=""})}function se(e){e.key==="Enter"?(e.preventDefault(),S("Enter")):e.key==="Backspace"&&M.value===""&&(e.preventDefault(),S("Backspace"))}function q(e){const f=document.activeElement;if(f&&(f.tagName==="INPUT"||f.tagName==="TEXTAREA")||["Shift","Control","Alt","Meta"].includes(e.key))return;(!e.metaKey&&!e.ctrlKey||e.key==="c"||e.key==="d")&&e.preventDefault();const t={key:e.key,ctrlKey:e.ctrlKey,altKey:e.altKey,shiftKey:e.shiftKey,metaKey:e.metaKey};fetch(`/api/keys/${A.value}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).catch(l=>{})}ce(()=>{P.value="ontouchstart"in window||navigator.maxTouchPoints>0||window.innerWidth<768,fetch("/api/panes").then(e=>e.json()).then(e=>{let f=e.panes.find(a=>a.id===k);f||(f=e.panes.find(a=>a.slug===k)),f&&(V.value=f.slug,A.value=f.id),B()}).catch(e=>{B()}),document.addEventListener("keydown",q)});const Q={paneId:k,terminalBuffer:n,dimensions:s,connected:w,cursorRow:i,cursorCol:o,paneTitle:V,isMobile:P,ctrlActive:b,altActive:m,shiftActive:C,mobileInputValue:M,mobileInputRef:D,actualPaneId:A,get currentAttrs(){return r},set currentAttrs(e){r=e},colorPalette:K,initTerminal:T,parseAnsiAndUpdate:E,findEscapeSequenceEnd:H,handleEscapeSequence:L,handleCSI:W,handleSGR:U,handleCharacter:z,handleEraseDisplay:J,handleEraseLine:F,escapeHtml:_,hasSameStyle:G,buildStyleAttrs:X,connectToStream:B,processMessage:Z,terminalContainerStyle:fe,renderRow:ae,toggleCtrl:te,toggleAlt:le,toggleShift:ne,sendKey:S,focusMobileInput:ie,handleMobileInput:oe,handleMobileKeydown:se,handleGlobalKeydown:q};return Object.defineProperty(Q,"__isScriptSetup",{enumerable:!1,value:!0}),Q}}),we={class:"terminal-page"},Ce={class:"session-info"},Ae={class:"mobile-toolbar"},Ke=["data-row","innerHTML"];function Se(ee,u,k,n,s,w){return R(),x("div",we,[c("header",null,[u[8]||(u[8]=c("a",{href:"/",class:"back-button"},"← dmux",-1)),c("h1",null,j(n.paneTitle),1),c("div",Ce,[c("span",null,j(n.dimensions.width)+"×"+j(n.dimensions.height),1),c("span",{class:"status-indicator",style:$({color:n.connected?"#4ade80":"#f87171"})},"●",4)])]),N(" Keyboard toolbar (always visible for easier terminal control) "),c("div",Ae,[c("button",{onClick:n.toggleCtrl,class:O([{active:n.ctrlActive},"toolbar-key"])},"Ctrl",2),c("button",{onClick:n.toggleAlt,class:O([{active:n.altActive},"toolbar-key"])},"Alt",2),c("button",{onClick:n.toggleShift,class:O([{active:n.shiftActive},"toolbar-key"])},"Shift",2),c("button",{onClick:u[0]||(u[0]=i=>n.sendKey("Escape")),class:"toolbar-key"},"Esc"),c("button",{onClick:u[1]||(u[1]=i=>n.sendKey("Tab")),class:"toolbar-key"},"Tab"),c("button",{onClick:u[2]||(u[2]=i=>n.sendKey("Enter")),class:"toolbar-key"},"Enter"),c("button",{onClick:u[3]||(u[3]=i=>n.sendKey("ArrowUp")),class:"toolbar-key"},"↑"),c("button",{onClick:u[4]||(u[4]=i=>n.sendKey("ArrowDown")),class:"toolbar-key"},"↓"),c("button",{onClick:u[5]||(u[5]=i=>n.sendKey("ArrowLeft")),class:"toolbar-key"},"←"),c("button",{onClick:u[6]||(u[6]=i=>n.sendKey("ArrowRight")),class:"toolbar-key"},"→")]),N(" Hidden input for mobile keyboard "),n.isMobile?ve((R(),x("input",{key:0,ref:"mobileInputRef",type:"text",class:"mobile-input","onUpdate:modelValue":u[7]||(u[7]=i=>n.mobileInputValue=i),onInput:n.handleMobileInput,onKeydown:n.handleMobileKeydown,autocomplete:"off",autocapitalize:"off",autocorrect:"off"},null,544)),[[be,n.mobileInputValue]]):N("v-if",!0),c("div",{class:"terminal-content",onClick:n.focusMobileInput},[c("div",{class:"terminal-output",style:$(n.terminalContainerStyle)},[(R(!0),x(me,null,ye(n.terminalBuffer,(i,o)=>(R(),x("div",{key:o,class:"terminal-row","data-row":o,innerHTML:n.renderRow(i,o)},null,8,Ke))),128))],4)])])}const Me=ge(ke,[["render",Se],["__file","/Users/justinschroeder/Projects/dmux/frontend/src/components/Terminal.vue"]]),Te=pe(Me);Te.mount("#app");
|
package/dist/types.d.ts
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
export type AgentStatus = 'idle' | 'analyzing' | 'waiting' | 'working';
|
|
2
|
+
export interface OptionChoice {
|
|
3
|
+
action: string;
|
|
4
|
+
keys: string[];
|
|
5
|
+
description?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface PotentialHarm {
|
|
8
|
+
hasRisk: boolean;
|
|
9
|
+
description?: string;
|
|
10
|
+
}
|
|
1
11
|
export interface DmuxPane {
|
|
2
12
|
id: string;
|
|
3
13
|
slug: string;
|
|
@@ -11,8 +21,16 @@ export interface DmuxPane {
|
|
|
11
21
|
devStatus?: 'running' | 'stopped';
|
|
12
22
|
devUrl?: string;
|
|
13
23
|
agent?: 'claude' | 'opencode';
|
|
14
|
-
agentStatus?:
|
|
24
|
+
agentStatus?: AgentStatus;
|
|
15
25
|
lastAgentCheck?: number;
|
|
26
|
+
lastDeterministicStatus?: 'ambiguous' | 'working';
|
|
27
|
+
llmRequestId?: string;
|
|
28
|
+
optionsQuestion?: string;
|
|
29
|
+
options?: OptionChoice[];
|
|
30
|
+
potentialHarm?: PotentialHarm;
|
|
31
|
+
agentSummary?: string;
|
|
32
|
+
autopilot?: boolean;
|
|
33
|
+
analyzerError?: string;
|
|
16
34
|
}
|
|
17
35
|
export interface PanePosition {
|
|
18
36
|
paneId: string;
|
|
@@ -34,5 +52,7 @@ export interface DmuxAppProps {
|
|
|
34
52
|
projectRoot?: string;
|
|
35
53
|
settingsFile: string;
|
|
36
54
|
autoUpdater?: any;
|
|
55
|
+
serverPort?: number;
|
|
56
|
+
server?: any;
|
|
37
57
|
}
|
|
38
58
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAEvE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC9B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uBAAuB,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,aAAa,CAAC,EAAE,aAAa,CAAC;IAE9B,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,GAAG,CAAC;CACd"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Detection Utilities
|
|
3
|
+
*
|
|
4
|
+
* Utilities to detect available AI agents (claude, opencode)
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Find Claude Code CLI command
|
|
8
|
+
*/
|
|
9
|
+
export declare function findClaudeCommand(): Promise<string | null>;
|
|
10
|
+
/**
|
|
11
|
+
* Find OpenCode CLI command
|
|
12
|
+
*/
|
|
13
|
+
export declare function findOpencodeCommand(): Promise<string | null>;
|
|
14
|
+
/**
|
|
15
|
+
* Get all available agents
|
|
16
|
+
*/
|
|
17
|
+
export declare function getAvailableAgents(): Promise<Array<'claude' | 'opencode'>>;
|
|
18
|
+
//# sourceMappingURL=agentDetection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentDetection.d.ts","sourceRoot":"","sources":["../../src/utils/agentDetection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2BhE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyBlE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC,CAAC,CAOhF"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Detection Utilities
|
|
3
|
+
*
|
|
4
|
+
* Utilities to detect available AI agents (claude, opencode)
|
|
5
|
+
*/
|
|
6
|
+
import { execSync } from 'child_process';
|
|
7
|
+
import fs from 'fs/promises';
|
|
8
|
+
/**
|
|
9
|
+
* Find Claude Code CLI command
|
|
10
|
+
*/
|
|
11
|
+
export async function findClaudeCommand() {
|
|
12
|
+
try {
|
|
13
|
+
const userShell = process.env.SHELL || '/bin/bash';
|
|
14
|
+
const result = execSync(`${userShell} -i -c "command -v claude 2>/dev/null || which claude 2>/dev/null"`, { encoding: 'utf-8', stdio: 'pipe' }).trim();
|
|
15
|
+
if (result)
|
|
16
|
+
return result.split('\n')[0];
|
|
17
|
+
}
|
|
18
|
+
catch { }
|
|
19
|
+
const commonPaths = [
|
|
20
|
+
`${process.env.HOME}/.claude/local/claude`,
|
|
21
|
+
`${process.env.HOME}/.local/bin/claude`,
|
|
22
|
+
'/usr/local/bin/claude',
|
|
23
|
+
'/opt/homebrew/bin/claude',
|
|
24
|
+
'/usr/bin/claude',
|
|
25
|
+
`${process.env.HOME}/bin/claude`,
|
|
26
|
+
];
|
|
27
|
+
for (const p of commonPaths) {
|
|
28
|
+
try {
|
|
29
|
+
await fs.access(p);
|
|
30
|
+
return p;
|
|
31
|
+
}
|
|
32
|
+
catch { }
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Find OpenCode CLI command
|
|
38
|
+
*/
|
|
39
|
+
export async function findOpencodeCommand() {
|
|
40
|
+
try {
|
|
41
|
+
const userShell = process.env.SHELL || '/bin/bash';
|
|
42
|
+
const result = execSync(`${userShell} -i -c "command -v opencode 2>/dev/null || which opencode 2>/dev/null"`, { encoding: 'utf-8', stdio: 'pipe' }).trim();
|
|
43
|
+
if (result)
|
|
44
|
+
return result.split('\n')[0];
|
|
45
|
+
}
|
|
46
|
+
catch { }
|
|
47
|
+
const commonPaths = [
|
|
48
|
+
'/opt/homebrew/bin/opencode',
|
|
49
|
+
'/usr/local/bin/opencode',
|
|
50
|
+
`${process.env.HOME}/.local/bin/opencode`,
|
|
51
|
+
`${process.env.HOME}/bin/opencode`,
|
|
52
|
+
];
|
|
53
|
+
for (const p of commonPaths) {
|
|
54
|
+
try {
|
|
55
|
+
await fs.access(p);
|
|
56
|
+
return p;
|
|
57
|
+
}
|
|
58
|
+
catch { }
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get all available agents
|
|
64
|
+
*/
|
|
65
|
+
export async function getAvailableAgents() {
|
|
66
|
+
const agents = [];
|
|
67
|
+
if (await findClaudeCommand())
|
|
68
|
+
agents.push('claude');
|
|
69
|
+
if (await findOpencodeCommand())
|
|
70
|
+
agents.push('opencode');
|
|
71
|
+
return agents;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=agentDetection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentDetection.js","sourceRoot":"","sources":["../../src/utils/agentDetection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,aAAa,CAAC;AAE7B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,WAAW,CAAC;QACnD,MAAM,MAAM,GAAG,QAAQ,CACrB,GAAG,SAAS,oEAAoE,EAChF,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CACrC,CAAC,IAAI,EAAE,CAAC;QACT,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,MAAM,WAAW,GAAG;QAClB,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,uBAAuB;QAC1C,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,oBAAoB;QACvC,uBAAuB;QACvB,0BAA0B;QAC1B,iBAAiB;QACjB,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,aAAa;KACjC,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACnB,OAAO,CAAC,CAAC;QACX,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,WAAW,CAAC;QACnD,MAAM,MAAM,GAAG,QAAQ,CACrB,GAAG,SAAS,wEAAwE,EACpF,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CACrC,CAAC,IAAI,EAAE,CAAC;QACT,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,MAAM,WAAW,GAAG;QAClB,4BAA4B;QAC5B,yBAAyB;QACzB,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,sBAAsB;QACzC,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,eAAe;KACnC,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACnB,OAAO,CAAC,CAAC;QACX,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,MAAM,GAAiC,EAAE,CAAC;IAEhD,IAAI,MAAM,iBAAiB,EAAE;QAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrD,IAAI,MAAM,mBAAmB,EAAE;QAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEzD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI-Assisted Merge Utilities
|
|
3
|
+
*
|
|
4
|
+
* Uses AI to help resolve merge conflicts intelligently
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Get comprehensive git diff with context for commit message generation
|
|
8
|
+
*/
|
|
9
|
+
export declare function getComprehensiveDiff(repoPath: string): {
|
|
10
|
+
diff: string;
|
|
11
|
+
summary: string;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Get AI-generated commit message from git diff
|
|
15
|
+
* Returns null if generation fails, so caller can handle fallback
|
|
16
|
+
*/
|
|
17
|
+
export declare function generateCommitMessage(repoPath: string): Promise<string | null>;
|
|
18
|
+
/**
|
|
19
|
+
* Use AI to resolve a merge conflict
|
|
20
|
+
*/
|
|
21
|
+
export declare function aiResolveConflict(filePath: string, repoPath: string): Promise<{
|
|
22
|
+
success: boolean;
|
|
23
|
+
resolvedContent?: string;
|
|
24
|
+
error?: string;
|
|
25
|
+
}>;
|
|
26
|
+
/**
|
|
27
|
+
* Resolve all conflicts in a repository using AI
|
|
28
|
+
*/
|
|
29
|
+
export declare function aiResolveAllConflicts(repoPath: string, conflictFiles: string[]): Promise<{
|
|
30
|
+
success: boolean;
|
|
31
|
+
resolvedFiles: string[];
|
|
32
|
+
failedFiles: string[];
|
|
33
|
+
error?: string;
|
|
34
|
+
}>;
|
|
35
|
+
//# sourceMappingURL=aiMerge.d.ts.map
|