agentrix 0.4.0 → 0.5.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.
Files changed (51) hide show
  1. package/dist/api/terminal.d.ts +1 -0
  2. package/dist/api/terminal.d.ts.map +1 -1
  3. package/dist/api/terminal.js +6 -2
  4. package/dist/api/terminal.js.map +1 -1
  5. package/dist/core/session-persistence.d.ts +19 -0
  6. package/dist/core/session-persistence.d.ts.map +1 -0
  7. package/dist/core/session-persistence.js +166 -0
  8. package/dist/core/session-persistence.js.map +1 -0
  9. package/dist/core/terminal-sessions.d.ts +11 -1
  10. package/dist/core/terminal-sessions.d.ts.map +1 -1
  11. package/dist/core/terminal-sessions.js +252 -38
  12. package/dist/core/terminal-sessions.js.map +1 -1
  13. package/dist/core/tmux.js +1 -1
  14. package/dist/core/tmux.js.map +1 -1
  15. package/dist/server/events.d.ts +4 -1
  16. package/dist/server/events.d.ts.map +1 -1
  17. package/dist/server/events.js +9 -18
  18. package/dist/server/events.js.map +1 -1
  19. package/dist/server/index.d.ts.map +1 -1
  20. package/dist/server/index.js +2 -1
  21. package/dist/server/index.js.map +1 -1
  22. package/dist/server/router.d.ts.map +1 -1
  23. package/dist/server/router.js +7 -0
  24. package/dist/server/router.js.map +1 -1
  25. package/dist/services/index.d.ts +1 -1
  26. package/dist/services/index.d.ts.map +1 -1
  27. package/dist/services/session-service.d.ts +6 -1
  28. package/dist/services/session-service.d.ts.map +1 -1
  29. package/dist/services/session-service.js +46 -38
  30. package/dist/services/session-service.js.map +1 -1
  31. package/dist/services/terminal-service.d.ts +12 -2
  32. package/dist/services/terminal-service.d.ts.map +1 -1
  33. package/dist/services/terminal-service.js +44 -3
  34. package/dist/services/terminal-service.js.map +1 -1
  35. package/dist/types/services.d.ts +8 -2
  36. package/dist/types/services.d.ts.map +1 -1
  37. package/dist/types/terminal.d.ts +23 -0
  38. package/dist/types/terminal.d.ts.map +1 -1
  39. package/dist/validation/index.d.ts +2 -2
  40. package/dist/validation/index.d.ts.map +1 -1
  41. package/dist/validation/index.js +1 -1
  42. package/dist/validation/index.js.map +1 -1
  43. package/dist/validation/schemas/terminal-schema.d.ts +19 -0
  44. package/dist/validation/schemas/terminal-schema.d.ts.map +1 -1
  45. package/dist/validation/schemas/terminal-schema.js +42 -1
  46. package/dist/validation/schemas/terminal-schema.js.map +1 -1
  47. package/package.json +1 -1
  48. package/ui/dist/assets/index-C8lauPag.css +41 -0
  49. package/ui/dist/assets/{index-vy3ZwDZl.js → index-DWzSJgcL.js} +113 -103
  50. package/ui/dist/index.html +2 -2
  51. package/ui/dist/assets/index-NgfXP24R.css +0 -41
@@ -6,5 +6,6 @@ export interface TerminalHandlerOptions {
6
6
  export declare function createTerminalHandlers(workdir: string, options?: TerminalHandlerOptions): {
7
7
  open: (context: import("../types/http.js").RequestContext) => Promise<void>;
8
8
  send: (context: import("../types/http.js").RequestContext) => Promise<void>;
9
+ close: (context: import("../types/http.js").RequestContext) => Promise<void>;
9
10
  };
10
11
  //# sourceMappingURL=terminal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/api/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAKnF,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B;;;EAe3F"}
1
+ {"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/api/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAKnF,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B;;;;EAoB3F"}
@@ -1,6 +1,6 @@
1
1
  import { createTerminalService } from '../services/index.js';
2
2
  import { createHandler } from './base-handler.js';
3
- import { validateTerminalOpen, validateTerminalSend } from '../validation/index.js';
3
+ import { validateTerminalOpen, validateTerminalSend, validateTerminalClose } from '../validation/index.js';
4
4
  export function createTerminalHandlers(workdir, options = {}) {
5
5
  const { mode, terminalService: providedTerminalService } = options;
6
6
  const terminalService = providedTerminalService ?? createTerminalService(workdir, mode ? { mode } : {});
@@ -12,6 +12,10 @@ export function createTerminalHandlers(workdir, options = {}) {
12
12
  validator: validateTerminalSend,
13
13
  handler: async (input) => terminalService.sendInput(input),
14
14
  });
15
- return { open, send };
15
+ const close = createHandler({
16
+ validator: validateTerminalClose,
17
+ handler: async (input) => terminalService.closeSession(input),
18
+ });
19
+ return { open, send, close };
16
20
  }
17
21
  //# sourceMappingURL=terminal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/api/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAwB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAQpF,MAAM,UAAU,sBAAsB,CAAC,OAAe,EAAE,UAAkC,EAAE;IAC1F,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,uBAAuB,EAAE,GAAG,OAAO,CAAC;IACnE,MAAM,eAAe,GAAG,uBAAuB,IAAI,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAExG,MAAM,IAAI,GAAG,aAAa,CAAC;QACzB,SAAS,EAAE,oBAAoB;QAC/B,OAAO,EAAE,KAAK,EAAE,KAAwB,EAAE,EAAE,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC;KACjF,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,aAAa,CAAC;QACzB,SAAS,EAAE,oBAAoB;QAC/B,OAAO,EAAE,KAAK,EAAE,KAAwB,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC;KAC9E,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/api/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAwB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAQ3G,MAAM,UAAU,sBAAsB,CAAC,OAAe,EAAE,UAAkC,EAAE;IAC1F,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,uBAAuB,EAAE,GAAG,OAAO,CAAC;IACnE,MAAM,eAAe,GAAG,uBAAuB,IAAI,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAExG,MAAM,IAAI,GAAG,aAAa,CAAC;QACzB,SAAS,EAAE,oBAAoB;QAC/B,OAAO,EAAE,KAAK,EAAE,KAAwB,EAAE,EAAE,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC;KACjF,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,aAAa,CAAC;QACzB,SAAS,EAAE,oBAAoB;QAC/B,OAAO,EAAE,KAAK,EAAE,KAAwB,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC;KAC9E,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,aAAa,CAAC;QAC1B,SAAS,EAAE,qBAAqB;QAChC,OAAO,EAAE,KAAK,EAAE,KAAyB,EAAE,EAAE,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC;KAClF,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
3
+ import type { WorktreeSessionSummary } from '../types/terminal.js';
4
+ interface SessionPersistenceDependencies {
5
+ homedir: () => string;
6
+ mkdir: typeof mkdir;
7
+ writeFile: typeof writeFile;
8
+ readFile: typeof readFile;
9
+ rename: typeof rename;
10
+ rm: typeof rm;
11
+ randomUUID: typeof randomUUID;
12
+ now: () => Date;
13
+ }
14
+ export declare function __setSessionPersistenceTestOverrides(nextOverrides?: Partial<SessionPersistenceDependencies>): void;
15
+ export declare function __resetSessionPersistenceStateForTests(): void;
16
+ export declare function persistSessionsSnapshot(summaries?: WorktreeSessionSummary[]): Promise<void>;
17
+ export declare function loadPersistedSessionsSnapshot(): Promise<WorktreeSessionSummary[]>;
18
+ export {};
19
+ //# sourceMappingURL=session-persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-persistence.d.ts","sourceRoot":"","sources":["../../src/core/session-persistence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG1E,OAAO,KAAK,EAAE,sBAAsB,EAA2B,MAAM,sBAAsB,CAAC;AAK5F,UAAU,8BAA8B;IACtC,OAAO,EAAE,MAAM,MAAM,CAAC;IACtB,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,QAAQ,EAAE,OAAO,QAAQ,CAAC;IAC1B,MAAM,EAAE,OAAO,MAAM,CAAC;IACtB,EAAE,EAAE,OAAO,EAAE,CAAC;IACd,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,GAAG,EAAE,MAAM,IAAI,CAAC;CACjB;AAmBD,wBAAgB,oCAAoC,CAClD,aAAa,CAAC,EAAE,OAAO,CAAC,8BAA8B,CAAC,GACtD,IAAI,CAEN;AAKD,wBAAgB,sCAAsC,IAAI,IAAI,CAG7D;AAiGD,wBAAsB,uBAAuB,CAAC,SAAS,GAAE,sBAAsB,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BrG;AAED,wBAAsB,6BAA6B,IAAI,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAyBvF"}
@@ -0,0 +1,166 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ const CONFIG_DIR_NAME = '.agentrix';
6
+ const SNAPSHOT_FILE_NAME = 'sessions.json';
7
+ const defaultDependencies = {
8
+ homedir: os.homedir,
9
+ mkdir,
10
+ writeFile,
11
+ readFile,
12
+ rename,
13
+ rm,
14
+ randomUUID,
15
+ now: () => new Date(),
16
+ };
17
+ let overrides = null;
18
+ function getDependency(key) {
19
+ return (overrides?.[key] ?? defaultDependencies[key]);
20
+ }
21
+ export function __setSessionPersistenceTestOverrides(nextOverrides) {
22
+ overrides = nextOverrides ?? null;
23
+ }
24
+ let writeQueue = Promise.resolve();
25
+ let lastPersistedPayload = null;
26
+ export function __resetSessionPersistenceStateForTests() {
27
+ writeQueue = Promise.resolve();
28
+ lastPersistedPayload = null;
29
+ }
30
+ function getSnapshotFilePath() {
31
+ const homeDir = getDependency('homedir')();
32
+ if (!homeDir) {
33
+ return null;
34
+ }
35
+ return path.join(homeDir, CONFIG_DIR_NAME, SNAPSHOT_FILE_NAME);
36
+ }
37
+ function sanitiseSession(session) {
38
+ if (!session || typeof session !== 'object') {
39
+ return null;
40
+ }
41
+ const id = typeof session.id === 'string' ? session.id : null;
42
+ if (!id) {
43
+ return null;
44
+ }
45
+ const label = typeof session.label === 'string' && session.label.trim().length > 0 ? session.label : 'Terminal';
46
+ const kind = session.kind === 'automation' ? 'automation' : 'interactive';
47
+ const tool = session.tool === 'agent' ? 'agent' : 'terminal';
48
+ return {
49
+ id,
50
+ label,
51
+ kind,
52
+ tool,
53
+ idle: Boolean(session.idle),
54
+ usingTmux: Boolean(session.usingTmux),
55
+ lastActivityAt: typeof session.lastActivityAt === 'string' ? session.lastActivityAt : null,
56
+ createdAt: typeof session.createdAt === 'string' ? session.createdAt : null,
57
+ tmuxSessionName: typeof session.tmuxSessionName === 'string'
58
+ ? session.tmuxSessionName
59
+ : null,
60
+ };
61
+ }
62
+ function sanitiseSummaries(summaries) {
63
+ if (!Array.isArray(summaries)) {
64
+ return [];
65
+ }
66
+ return summaries
67
+ .filter((entry) => Boolean(entry && entry.org && entry.repo && entry.branch))
68
+ .map((entry) => ({
69
+ org: entry.org,
70
+ repo: entry.repo,
71
+ branch: entry.branch,
72
+ idle: Boolean(entry.idle),
73
+ lastActivityAt: typeof entry.lastActivityAt === 'string' ? entry.lastActivityAt : null,
74
+ sessions: Array.isArray(entry.sessions)
75
+ ? entry.sessions
76
+ .map(sanitiseSession)
77
+ .filter((session) => Boolean(session))
78
+ : [],
79
+ }));
80
+ }
81
+ function buildOrgTree(summaries) {
82
+ const tree = {};
83
+ summaries.forEach((summary) => {
84
+ const orgEntry = (tree[summary.org] ??= {});
85
+ const repoEntry = (orgEntry[summary.repo] ??= { worktrees: {} });
86
+ repoEntry.worktrees[summary.branch] = {
87
+ branch: summary.branch,
88
+ idle: Boolean(summary.idle),
89
+ lastActivityAt: summary.lastActivityAt ?? null,
90
+ sessions: Array.isArray(summary.sessions) ? summary.sessions.slice() : [],
91
+ };
92
+ });
93
+ return tree;
94
+ }
95
+ async function writeAtomicJSON(filePath, payload) {
96
+ const directory = path.dirname(filePath);
97
+ await getDependency('mkdir')(directory, { recursive: true });
98
+ const tmpPath = path.join(directory, `.${getDependency('randomUUID')()}.tmp`);
99
+ try {
100
+ await getDependency('writeFile')(tmpPath, payload, 'utf8');
101
+ await getDependency('rename')(tmpPath, filePath);
102
+ }
103
+ catch (error) {
104
+ await getDependency('rm')(tmpPath, { force: true }).catch(() => { });
105
+ throw error;
106
+ }
107
+ }
108
+ export async function persistSessionsSnapshot(summaries = []) {
109
+ const filePath = getSnapshotFilePath();
110
+ if (!filePath) {
111
+ return;
112
+ }
113
+ const normalised = sanitiseSummaries(summaries);
114
+ const snapshot = {
115
+ version: 1,
116
+ generatedAt: getDependency('now')().toISOString(),
117
+ orgs: buildOrgTree(normalised),
118
+ summaries: normalised,
119
+ };
120
+ const payload = `${JSON.stringify(snapshot, null, 2)}\n`;
121
+ if (payload === lastPersistedPayload) {
122
+ return;
123
+ }
124
+ const task = writeQueue.then(async () => {
125
+ await writeAtomicJSON(filePath, payload);
126
+ });
127
+ const placeholder = task.catch(() => { });
128
+ writeQueue = placeholder;
129
+ try {
130
+ await task;
131
+ lastPersistedPayload = payload;
132
+ }
133
+ finally {
134
+ if (writeQueue === placeholder) {
135
+ writeQueue = Promise.resolve();
136
+ }
137
+ }
138
+ }
139
+ export async function loadPersistedSessionsSnapshot() {
140
+ const filePath = getSnapshotFilePath();
141
+ if (!filePath) {
142
+ return [];
143
+ }
144
+ try {
145
+ const raw = await getDependency('readFile')(filePath, 'utf8');
146
+ if (!raw.trim()) {
147
+ return [];
148
+ }
149
+ const payload = JSON.parse(raw);
150
+ if (payload && Array.isArray(payload.summaries)) {
151
+ return sanitiseSummaries(payload.summaries);
152
+ }
153
+ if (Array.isArray(payload)) {
154
+ return sanitiseSummaries(payload);
155
+ }
156
+ }
157
+ catch (error) {
158
+ const err = error;
159
+ if (err?.code !== 'ENOENT') {
160
+ console.warn(`[agentrix] Failed to read persisted sessions snapshot at ${filePath}:`, err?.message || error);
161
+ }
162
+ return [];
163
+ }
164
+ return [];
165
+ }
166
+ //# sourceMappingURL=session-persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-persistence.js","sourceRoot":"","sources":["../../src/core/session-persistence.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  import pty from 'node-pty';
2
- import type { TerminalSession } from '../types/terminal.js';
2
+ import type { TerminalSession, SessionKind, SessionTool, WorktreeSessionSummary } from '../types/terminal.js';
3
3
  import { getWorktreePath } from './git.js';
4
4
  import { detectTmux, isTmuxAvailable, makeTmuxSessionName, tmuxHasSession } from './tmux.js';
5
5
  import { emitSessionsUpdate } from './event-bus.js';
6
+ import { persistSessionsSnapshot, loadPersistedSessionsSnapshot } from './session-persistence.js';
6
7
  interface TerminalSessionDependencies {
7
8
  spawnPty: typeof pty.spawn;
8
9
  getWorktreePath: typeof getWorktreePath;
@@ -11,6 +12,8 @@ interface TerminalSessionDependencies {
11
12
  makeTmuxSessionName: typeof makeTmuxSessionName;
12
13
  tmuxHasSession: typeof tmuxHasSession;
13
14
  emitSessionsUpdate: typeof emitSessionsUpdate;
15
+ persistSessionsSnapshot: typeof persistSessionsSnapshot;
16
+ loadPersistedSessionsSnapshot: typeof loadPersistedSessionsSnapshot;
14
17
  setInterval: typeof setInterval;
15
18
  clearInterval: typeof clearInterval;
16
19
  setTimeout: typeof setTimeout;
@@ -18,6 +21,7 @@ interface TerminalSessionDependencies {
18
21
  }
19
22
  export declare function __setTerminalSessionsTestOverrides(overrides?: Partial<TerminalSessionDependencies>): void;
20
23
  export declare function queueSessionInput(session: TerminalSession, input: string | Buffer): void;
24
+ export declare function serialiseSessions(sessions: TerminalSession[]): WorktreeSessionSummary[];
21
25
  export declare function makeSessionKey(org: string, repo: string, branch: string): string;
22
26
  export declare function disposeSessionByKey(key: string): Promise<void>;
23
27
  export declare function disposeSessionsForRepository(org: string, repo: string): Promise<void>;
@@ -25,9 +29,15 @@ export declare function disposeSessionById(sessionId: string): Promise<void>;
25
29
  export declare function disposeAllSessions(): Promise<void>;
26
30
  export declare function getSessionById(sessionId: string): TerminalSession | undefined;
27
31
  export declare function listActiveSessions(): TerminalSession[];
32
+ export declare function rehydrateTmuxSessionsFromSnapshot(workdir: string, options?: {
33
+ mode?: string;
34
+ }): Promise<void>;
28
35
  export declare function addSocketWatcher(session: TerminalSession, socket: unknown): void;
29
36
  export declare function getOrCreateTerminalSession(workdir: string, org: string, repo: string, branch: string, options?: {
30
37
  mode?: string;
38
+ forceNew?: boolean;
39
+ tool?: SessionTool;
40
+ kind?: SessionKind;
31
41
  }): Promise<TerminalSession | {
32
42
  session: TerminalSession;
33
43
  created: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"terminal-sessions.d.ts","sourceRoot":"","sources":["../../src/core/terminal-sessions.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EACL,UAAU,EACV,eAAe,EACf,mBAAmB,EACnB,cAAc,EACf,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAKpD,UAAU,2BAA2B;IACnC,QAAQ,EAAE,OAAO,GAAG,CAAC,KAAK,CAAC;IAC3B,eAAe,EAAE,OAAO,eAAe,CAAC;IACxC,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,eAAe,EAAE,OAAO,eAAe,CAAC;IACxC,mBAAmB,EAAE,OAAO,mBAAmB,CAAC;IAChD,cAAc,EAAE,OAAO,cAAc,CAAC;IACtC,kBAAkB,EAAE,OAAO,kBAAkB,CAAC;IAC9C,WAAW,EAAE,OAAO,WAAW,CAAC;IAChC,aAAa,EAAE,OAAO,aAAa,CAAC;IACpC,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,YAAY,EAAE,OAAO,YAAY,CAAC;CACnC;AAkBD,wBAAgB,kCAAkC,CAChD,SAAS,CAAC,EAAE,OAAO,CAAC,2BAA2B,CAAC,GAC/C,IAAI,CAEN;AAyHD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwBxF;AA0ID,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEhF;AAuCD,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQpE;AAED,wBAAsB,4BAA4B,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB3F;AAED,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOzE;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAaxD;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAE7E;AAED,wBAAgB,kBAAkB,IAAI,eAAe,EAAE,CAEtD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAOhF;AAmJD,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO;;;GA+DhC;AAED,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,CAAC,CAK1B"}
1
+ {"version":3,"file":"terminal-sessions.d.ts","sourceRoot":"","sources":["../../src/core/terminal-sessions.ts"],"names":[],"mappings":"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"}