weztermcp 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,20 +10,30 @@ It allows you to control WezTerm from Claude Desktop and other MCP clients.
10
10
  | Tool | Required Args | Optional Args | Description |
11
11
  |---|---|---|---|
12
12
  | `wezterm_pane_write` | `command: string`, `pane_id: number` | — | Writes text or runs a command in the specified pane |
13
- | `wezterm_pane_read` | | `lines: number` (default 50), `pane_id: number` | Reads output from a pane's scrollback buffer |
13
+ | `wezterm_pane_read` | `pane_id: number` | `lines: number` (default 50) | Reads output from a pane's scrollback buffer |
14
14
  | `wezterm_pane_send_key` | `character: string`, `pane_id: number` | — | Sends a control character to the specified pane (e.g. `"c"` for Ctrl+C) |
15
15
  | `wezterm_pane_list` | — | `window_id: number`, `tab_id: number` | Lists panes, scoped to the active window/tab by default |
16
16
  | `wezterm_pane_switch` | `pane_id: number` | — | Switches focus to the specified pane |
17
17
  | `wezterm_pane_close` | `pane_id: number` | — | Closes the specified pane |
18
18
  | `wezterm_pane_split` | `direction: "Right"\|"Left"\|"Top"\|"Bottom"` | `pane_id: number`, `window_id: number`, `tab_id: number` | Splits a pane and returns the new pane ID |
19
+ | `wezterm_pane_split_and_write` | `command: string`, `direction: "Right"\|"Left"\|"Top"\|"Bottom"` | `pane_id: number`, `window_id: number`, `tab_id: number` | Splits a pane and writes a command to the new pane in one call |
20
+ | `wezterm_window_spawn` | — | `cwd: string` | Opens a new top-level WezTerm window and returns its initial pane ID |
19
21
 
20
22
  ## Multi-window and multi-tab support
21
23
 
22
24
  `pane_id` is globally unique across all of WezTerm's windows and tabs, so most tools (`wezterm_pane_write`, `wezterm_pane_read`, `wezterm_pane_send_key`, `wezterm_pane_switch`, `wezterm_pane_close`) don't need window/tab scoping — they just target the pane directly.
23
25
 
24
- `wezterm_pane_list` and `wezterm_pane_split` are the exceptions, since they need to know *which* window/tab to operate on when a specific pane isn't given:
26
+ `wezterm_pane_list`, `wezterm_pane_split`, and `wezterm_pane_split_and_write` are the exceptions, since they need to know *which* window/tab to operate on when a specific pane isn't given:
25
27
  - `wezterm_pane_list` defaults to listing only the panes in the currently focused window and tab. Pass `window_id` and/or `tab_id` to list panes elsewhere.
26
- - `wezterm_pane_split` defaults to splitting the currently focused pane. If `pane_id` is omitted, pass `window_id`/`tab_id` to split the focused pane within that window/tab instead.
28
+ - `wezterm_pane_split` and `wezterm_pane_split_and_write` default to splitting the currently focused pane. If `pane_id` is omitted, pass `window_id`/`tab_id` to split the focused pane within that window/tab instead.
29
+
30
+ ## Common workflow: split and run
31
+
32
+ The most common real-world pattern — open a side pane and run something in it while keeping the original pane visible — is `wezterm_pane_split_and_write`, a single call combining split + write:
33
+
34
+ > Split the focused pane Right and run `npm test`.
35
+
36
+ This is equivalent to calling `wezterm_pane_split` followed by `wezterm_pane_write` on the returned pane ID, but atomic and requires only one tool call. Since it doesn't return command output, follow up with `wezterm_pane_read` on the new pane ID to see results.
27
37
 
28
38
  ## Security
29
39
 
@@ -1,4 +1,4 @@
1
- import { exec } from "child_process";
1
+ import { execFile } from "child_process";
2
2
  import { promisify } from "util";
3
- export const execAsync = promisify(exec);
3
+ export const execFileAsync = promisify(execFile);
4
4
  //# sourceMappingURL=exec_async.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"exec_async.js","sourceRoot":"","sources":["../src/exec_async.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,CAAC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"exec_async.js","sourceRoot":"","sources":["../src/exec_async.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC"}
package/build/index.js CHANGED
@@ -7,12 +7,16 @@ import WeztermOutputReader from "./wezterm_output_reader.js";
7
7
  import SendControlCharacter from "./send_control_character.js";
8
8
  const server = new Server({
9
9
  name: "weztermcp",
10
- version: "0.1.0",
10
+ title: "WezTerm MCP Server",
11
+ version: "0.2.0",
12
+ description: "Control WezTerm panes, tabs, and windows from an MCP client via the WezTerm CLI.",
13
+ websiteUrl: "https://github.com/ajmarkow/weztermcp",
11
14
  }, {
12
15
  capabilities: {
13
16
  tools: {},
14
17
  },
15
18
  instructions: "wezterm_pane_write does not return command output — follow it with wezterm_pane_read to see results. " +
19
+ "For a long-running command, wezterm_pane_read is a snapshot, not a wait — call it again after some time to check progress rather than assuming one read captures the final output. " +
16
20
  "Call wezterm_pane_list first to discover valid pane_id values before targeting a pane with any other tool. " +
17
21
  "wezterm_pane_close is destructive and irreversible; confirm with the user before closing a pane.",
18
22
  });
@@ -55,9 +59,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
55
59
  },
56
60
  pane_id: {
57
61
  type: "number",
58
- description: "Integer ID of the pane to read from. Default: the currently active pane. Obtain valid IDs from wezterm_pane_list.",
62
+ description: "Integer ID of the pane to read from. Obtain valid IDs from wezterm_pane_list.",
59
63
  },
60
64
  },
65
+ required: ["pane_id"],
61
66
  },
62
67
  },
63
68
  {
@@ -155,6 +160,52 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
155
160
  required: ["direction"],
156
161
  },
157
162
  },
163
+ {
164
+ name: "wezterm_pane_split_and_write",
165
+ title: "Split WezTerm Pane and Write",
166
+ description: "EXECUTION TOOL. Splits a pane and immediately sends a command to the new pane in one call. WHEN: 'run this in a new pane', 'split and run tests', 'open a scratch terminal and run X' — the common workflow of opening a side pane to run something while keeping the original pane visible. Equivalent to wezterm_pane_split followed by wezterm_pane_write, but atomic. Returns the new pane's ID — store it to target subsequent commands. Returns confirmation text only — does NOT return command output; follow with wezterm_pane_read on the new pane ID to capture results. SECURITY: same as wezterm_pane_write — this runs arbitrary shell commands with the user's full permissions. Confirm with the user before sending destructive or irreversible commands. Example: split the focused pane Right and run 'npm test' in the new pane.",
167
+ inputSchema: {
168
+ type: "object",
169
+ properties: {
170
+ command: {
171
+ type: "string",
172
+ description: "Text to send to the newly created pane. A newline (\\n) is automatically appended, causing the shell to execute the input as a command.",
173
+ },
174
+ direction: {
175
+ type: "string",
176
+ enum: ["Right", "Left", "Top", "Bottom"],
177
+ description: "Direction in which to create the new pane relative to the existing one. 'Right' and 'Left' split vertically (side by side); 'Top' and 'Bottom' split horizontally (stacked). Must be exactly one of: Right, Left, Top, Bottom (case-sensitive).",
178
+ },
179
+ pane_id: {
180
+ type: "number",
181
+ description: "Integer ID of the pane to split. Obtain valid IDs from wezterm_pane_list. Default: the currently focused pane, optionally narrowed by window_id/tab_id.",
182
+ },
183
+ window_id: {
184
+ type: "number",
185
+ description: "Only used when pane_id is omitted. Scopes which window's focused pane is split. Default: the window containing the currently focused pane.",
186
+ },
187
+ tab_id: {
188
+ type: "number",
189
+ description: "Only used when pane_id is omitted. Scopes which tab's focused pane is split. Default: the tab containing the currently focused pane.",
190
+ },
191
+ },
192
+ required: ["command", "direction"],
193
+ },
194
+ },
195
+ {
196
+ name: "wezterm_window_spawn",
197
+ title: "Spawn WezTerm Window",
198
+ description: "EXECUTION TOOL. Opens a brand new WezTerm window with a fresh shell, using `wezterm cli spawn --new-window`. WHEN: 'open a new window', 'spawn a window', 'create a separate WezTerm window'. Panes are the primary entity for most work — prefer wezterm_pane_split for a new pane within the current window/tab. Use this only when a genuinely separate top-level window is needed. Returns the new pane's ID (the initial pane of the new window) — store it to target subsequent commands. Example: spawn a new window, then wezterm_pane_write to the returned pane ID.",
199
+ inputSchema: {
200
+ type: "object",
201
+ properties: {
202
+ cwd: {
203
+ type: "string",
204
+ description: "Absolute path to start the new window's shell in. Default: WezTerm's default working directory (typically the user's home directory or the directory of the currently focused pane, depending on configuration).",
205
+ },
206
+ },
207
+ },
208
+ },
158
209
  ],
159
210
  };
160
211
  });
@@ -166,7 +217,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
166
217
  case "wezterm_pane_read":
167
218
  const lines = request.params.arguments.lines || 50;
168
219
  const paneId = request.params.arguments.pane_id;
169
- return await outputReader.readOutput(lines, paneId);
220
+ return await outputReader.readOutput(paneId, lines);
170
221
  case "wezterm_pane_send_key":
171
222
  return await controlCharSender.send(request.params.arguments.character, request.params.arguments.pane_id);
172
223
  case "wezterm_pane_list":
@@ -177,6 +228,10 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
177
228
  return await executor.closePane(request.params.arguments.pane_id);
178
229
  case "wezterm_pane_split":
179
230
  return await executor.splitPane(request.params.arguments.pane_id, request.params.arguments.direction, request.params.arguments.window_id, request.params.arguments.tab_id);
231
+ case "wezterm_pane_split_and_write":
232
+ return await executor.splitAndWrite(request.params.arguments.command, request.params.arguments.direction, request.params.arguments.pane_id, request.params.arguments.window_id, request.params.arguments.tab_id);
233
+ case "wezterm_window_spawn":
234
+ return await executor.spawnWindow(request.params.arguments?.cwd);
180
235
  default:
181
236
  throw new Error(`Unknown tool: ${request.params.name}`);
182
237
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,32 +1,32 @@
1
- import { execAsync } from "./exec_async.js";
1
+ import { execFileAsync } from "./exec_async.js";
2
2
  import { assertWeztermInstalled, notInstalledResult } from "./wezterm_check.js";
3
3
  export default class SendControlCharacter {
4
- weztermCli;
5
- constructor() {
6
- this.weztermCli = "wezterm cli";
7
- }
8
4
  async send(character, paneId) {
9
5
  const err = await assertWeztermInstalled();
10
6
  if (err)
11
7
  return notInstalledResult();
12
8
  try {
13
9
  const controlMap = {
14
- c: "\\x03", // Ctrl+C
15
- d: "\\x04", // Ctrl+D
16
- z: "\\x1a", // Ctrl+Z
17
- l: "\\x0c", // Ctrl+L
18
- a: "\\x01", // Ctrl+A
19
- e: "\\x05", // Ctrl+E
20
- k: "\\x0b", // Ctrl+K
21
- u: "\\x15", // Ctrl+U
22
- w: "\\x17", // Ctrl+W
10
+ c: "\x03", // Ctrl+C
11
+ d: "\x04", // Ctrl+D
12
+ z: "\x1a", // Ctrl+Z
13
+ l: "\x0c", // Ctrl+L
14
+ a: "\x01", // Ctrl+A
15
+ e: "\x05", // Ctrl+E
16
+ k: "\x0b", // Ctrl+K
17
+ u: "\x15", // Ctrl+U
18
+ w: "\x17", // Ctrl+W
23
19
  };
24
20
  const controlSeq = controlMap[character.toLowerCase()];
25
21
  if (!controlSeq) {
26
22
  throw new Error(`Unknown control character: ${character}`);
27
23
  }
28
- const paneFlag = paneId !== undefined ? ` --pane-id ${paneId}` : "";
29
- await execAsync(`${this.weztermCli} send-text${paneFlag} $'${controlSeq}'`);
24
+ const args = ["cli", "send-text"];
25
+ if (paneId !== undefined) {
26
+ args.push("--pane-id", String(paneId));
27
+ }
28
+ args.push(controlSeq);
29
+ await execFileAsync("wezterm", args);
30
30
  return {
31
31
  content: [
32
32
  {
@@ -1 +1 @@
1
- {"version":3,"file":"send_control_character.js","sourceRoot":"","sources":["../src/send_control_character.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAEhF,MAAM,CAAC,OAAO,OAAO,oBAAoB;IAC/B,UAAU,CAAS;IAE3B;QACE,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAiB,EAAE,MAAe;QAC3C,MAAM,GAAG,GAAG,MAAM,sBAAsB,EAAE,CAAC;QAC3C,IAAI,GAAG;YAAE,OAAO,kBAAkB,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,UAAU,GAA8B;gBAC5C,CAAC,EAAE,OAAO,EAAE,SAAS;gBACrB,CAAC,EAAE,OAAO,EAAE,SAAS;gBACrB,CAAC,EAAE,OAAO,EAAE,SAAS;gBACrB,CAAC,EAAE,OAAO,EAAE,SAAS;gBACrB,CAAC,EAAE,OAAO,EAAE,SAAS;gBACrB,CAAC,EAAE,OAAO,EAAE,SAAS;gBACrB,CAAC,EAAE,OAAO,EAAE,SAAS;gBACrB,CAAC,EAAE,OAAO,EAAE,SAAS;gBACrB,CAAC,EAAE,OAAO,EAAE,SAAS;aACtB,CAAC;YAEF,MAAM,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;YACvD,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,EAAE,CAAC,CAAC;YAC7D,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpE,MAAM,SAAS,CAAC,GAAG,IAAI,CAAC,UAAU,aAAa,QAAQ,MAAM,UAAU,GAAG,CAAC,CAAC;YAE5E,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,gCAAgC,SAAS,CAAC,WAAW,EAAE,EAAE;qBAChE;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,qCAAqC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"send_control_character.js","sourceRoot":"","sources":["../src/send_control_character.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAEhF,MAAM,CAAC,OAAO,OAAO,oBAAoB;IACvC,KAAK,CAAC,IAAI,CAAC,SAAiB,EAAE,MAAe;QAC3C,MAAM,GAAG,GAAG,MAAM,sBAAsB,EAAE,CAAC;QAC3C,IAAI,GAAG;YAAE,OAAO,kBAAkB,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,UAAU,GAA8B;gBAC5C,CAAC,EAAE,MAAM,EAAE,SAAS;gBACpB,CAAC,EAAE,MAAM,EAAE,SAAS;gBACpB,CAAC,EAAE,MAAM,EAAE,SAAS;gBACpB,CAAC,EAAE,MAAM,EAAE,SAAS;gBACpB,CAAC,EAAE,MAAM,EAAE,SAAS;gBACpB,CAAC,EAAE,MAAM,EAAE,SAAS;gBACpB,CAAC,EAAE,MAAM,EAAE,SAAS;gBACpB,CAAC,EAAE,MAAM,EAAE,SAAS;gBACpB,CAAC,EAAE,MAAM,EAAE,SAAS;aACrB,CAAC;YAEF,MAAM,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;YACvD,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,EAAE,CAAC,CAAC;YAC7D,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YAClC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YACzC,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAEtB,MAAM,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAErC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,gCAAgC,SAAS,CAAC,WAAW,EAAE,EAAE;qBAChE;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,qCAAqC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;CACF"}
@@ -1,8 +1,8 @@
1
- import { execAsync } from "./exec_async.js";
1
+ import { execFileAsync } from "./exec_async.js";
2
2
  export const NOT_INSTALLED_MSG = "WezTerm is not installed or not on PATH. Install it from https://wezfurlong.org/wezterm/ and ensure 'wezterm' is accessible.";
3
3
  export async function assertWeztermInstalled() {
4
4
  try {
5
- const { stdout } = await execAsync("wezterm --version");
5
+ const { stdout } = await execFileAsync("wezterm", ["--version"]);
6
6
  if (!stdout.trim()) {
7
7
  return NOT_INSTALLED_MSG;
8
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"wezterm_check.js","sourceRoot":"","sources":["../src/wezterm_check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,CAAC,MAAM,iBAAiB,GAC5B,8HAA8H,CAAC;AAEjI,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,OAAO,iBAAiB,CAAC;QAC3B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,iBAAiB,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;AAClE,CAAC"}
1
+ {"version":3,"file":"wezterm_check.js","sourceRoot":"","sources":["../src/wezterm_check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,CAAC,MAAM,iBAAiB,GAC5B,8HAA8H,CAAC;AAEjI,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,OAAO,iBAAiB,CAAC;QAC3B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,iBAAiB,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;AAClE,CAAC"}
@@ -1,40 +1,65 @@
1
- import { execAsync } from "./exec_async.js";
1
+ import { execFileAsync } from "./exec_async.js";
2
2
  import { assertWeztermInstalled, notInstalledResult } from "./wezterm_check.js";
3
3
  export default class WeztermExecutor {
4
- weztermCli;
5
- constructor() {
6
- this.weztermCli = "wezterm cli";
7
- }
8
4
  async listAllPanes() {
9
- const { stdout } = await execAsync(`${this.weztermCli} list --format json`);
5
+ const { stdout } = await execFileAsync("wezterm", ["cli", "list", "--format", "json"]);
10
6
  return JSON.parse(stdout);
11
7
  }
12
8
  async getFocusedPaneId() {
13
- const { stdout } = await execAsync(`${this.weztermCli} list-clients --format json`);
9
+ const { stdout } = await execFileAsync("wezterm", [
10
+ "cli",
11
+ "list-clients",
12
+ "--format",
13
+ "json",
14
+ ]);
14
15
  const clients = JSON.parse(stdout);
15
16
  return clients[0]?.focused_pane_id;
16
17
  }
17
- async resolveTargetPaneId(windowId, tabId) {
18
+ async getFocusedPane(panes) {
18
19
  const focusedPaneId = await this.getFocusedPaneId();
20
+ return panes.find((p) => p.pane_id === focusedPaneId);
21
+ }
22
+ async resolveTargetPaneId(windowId, tabId) {
19
23
  if (windowId === undefined && tabId === undefined) {
20
- return focusedPaneId;
24
+ return this.getFocusedPaneId();
21
25
  }
22
26
  const panes = await this.listAllPanes();
23
- const focusedPane = panes.find((p) => p.pane_id === focusedPaneId);
27
+ const focusedPane = await this.getFocusedPane(panes);
24
28
  const inScope = (p) => (windowId === undefined || p.window_id === windowId) &&
25
29
  (tabId === undefined || p.tab_id === tabId);
26
30
  if (focusedPane && inScope(focusedPane)) {
27
- return focusedPaneId;
31
+ return focusedPane.pane_id;
28
32
  }
29
33
  return panes.find(inScope)?.pane_id;
30
34
  }
35
+ async performSplit(paneId, direction, windowId, tabId) {
36
+ const targetPaneId = paneId !== undefined ? paneId : await this.resolveTargetPaneId(windowId, tabId);
37
+ if (targetPaneId === undefined) {
38
+ throw new Error("could not resolve a target pane. Specify pane_id explicitly, or ensure a WezTerm window/tab is focused.");
39
+ }
40
+ const dirFlag = `--${direction.toLowerCase()}`;
41
+ const { stdout } = await execFileAsync("wezterm", [
42
+ "cli",
43
+ "split-pane",
44
+ "--pane-id",
45
+ String(targetPaneId),
46
+ dirFlag,
47
+ ]);
48
+ return { targetPaneId, newPaneId: Number(stdout.trim()) };
49
+ }
31
50
  async writeToTerminal(command, paneId) {
32
51
  const err = await assertWeztermInstalled();
33
52
  if (err)
34
53
  return notInstalledResult();
35
54
  try {
36
- const escapedCommand = command.replace(/'/g, "'\"'\"'");
37
- await execAsync(`${this.weztermCli} send-text --pane-id ${paneId} --no-paste '${escapedCommand}\n'`);
55
+ await execFileAsync("wezterm", [
56
+ "cli",
57
+ "send-text",
58
+ "--pane-id",
59
+ String(paneId),
60
+ "--no-paste",
61
+ `${command}\n`,
62
+ ]);
38
63
  return {
39
64
  content: [
40
65
  {
@@ -64,8 +89,7 @@ export default class WeztermExecutor {
64
89
  let scopedWindowId = windowId;
65
90
  let scopedTabId = tabId;
66
91
  if (scopedWindowId === undefined && scopedTabId === undefined) {
67
- const focusedPaneId = await this.getFocusedPaneId();
68
- const focusedPane = panes.find((p) => p.pane_id === focusedPaneId);
92
+ const focusedPane = await this.getFocusedPane(panes);
69
93
  if (focusedPane) {
70
94
  scopedWindowId = focusedPane.window_id;
71
95
  scopedTabId = focusedPane.tab_id;
@@ -96,7 +120,7 @@ export default class WeztermExecutor {
96
120
  if (err)
97
121
  return notInstalledResult();
98
122
  try {
99
- await execAsync(`${this.weztermCli} activate-pane --pane-id ${paneId}`);
123
+ await execFileAsync("wezterm", ["cli", "activate-pane", "--pane-id", String(paneId)]);
100
124
  return {
101
125
  content: [
102
126
  {
@@ -122,7 +146,7 @@ export default class WeztermExecutor {
122
146
  if (err)
123
147
  return notInstalledResult();
124
148
  try {
125
- await execAsync(`${this.weztermCli} kill-pane --pane-id ${paneId}`);
149
+ await execFileAsync("wezterm", ["cli", "kill-pane", "--pane-id", String(paneId)]);
126
150
  return {
127
151
  content: [{ type: "text", text: `Closed pane ${paneId}` }],
128
152
  };
@@ -137,25 +161,13 @@ export default class WeztermExecutor {
137
161
  const err = await assertWeztermInstalled();
138
162
  if (err)
139
163
  return notInstalledResult();
140
- const dirFlag = `--${direction.toLowerCase()}`;
141
164
  try {
142
- const targetPaneId = paneId !== undefined ? paneId : await this.resolveTargetPaneId(windowId, tabId);
143
- if (targetPaneId === undefined) {
144
- return {
145
- content: [
146
- {
147
- type: "text",
148
- text: "Failed to split pane: could not resolve a target pane. Specify pane_id explicitly, or ensure a WezTerm window/tab is focused.",
149
- },
150
- ],
151
- };
152
- }
153
- const { stdout } = await execAsync(`${this.weztermCli} split-pane --pane-id ${targetPaneId} ${dirFlag}`);
165
+ const { targetPaneId, newPaneId } = await this.performSplit(paneId, direction, windowId, tabId);
154
166
  return {
155
167
  content: [
156
168
  {
157
169
  type: "text",
158
- text: `Split pane ${targetPaneId} ${direction}. New pane id: ${stdout.trim()}`,
170
+ text: `Split pane ${targetPaneId} ${direction}. New pane id: ${newPaneId}`,
159
171
  },
160
172
  ],
161
173
  };
@@ -171,5 +183,62 @@ export default class WeztermExecutor {
171
183
  };
172
184
  }
173
185
  }
186
+ async splitAndWrite(command, direction, paneId, windowId, tabId) {
187
+ const err = await assertWeztermInstalled();
188
+ if (err)
189
+ return notInstalledResult();
190
+ try {
191
+ const { targetPaneId, newPaneId } = await this.performSplit(paneId, direction, windowId, tabId);
192
+ const writeResult = await this.writeToTerminal(command, newPaneId);
193
+ return {
194
+ content: [
195
+ {
196
+ type: "text",
197
+ text: `Split pane ${targetPaneId} ${direction}, creating pane ${newPaneId}.`,
198
+ },
199
+ ...writeResult.content,
200
+ ],
201
+ };
202
+ }
203
+ catch (error) {
204
+ return {
205
+ content: [
206
+ {
207
+ type: "text",
208
+ text: `Failed to split and write: ${error.message}`,
209
+ },
210
+ ],
211
+ };
212
+ }
213
+ }
214
+ async spawnWindow(cwd) {
215
+ const err = await assertWeztermInstalled();
216
+ if (err)
217
+ return notInstalledResult();
218
+ try {
219
+ const args = ["cli", "spawn", "--new-window"];
220
+ if (cwd)
221
+ args.push("--cwd", cwd);
222
+ const { stdout } = await execFileAsync("wezterm", args);
223
+ return {
224
+ content: [
225
+ {
226
+ type: "text",
227
+ text: `Spawned new window. New pane id: ${stdout.trim()}`,
228
+ },
229
+ ],
230
+ };
231
+ }
232
+ catch (error) {
233
+ return {
234
+ content: [
235
+ {
236
+ type: "text",
237
+ text: `Failed to spawn window: ${error.message}`,
238
+ },
239
+ ],
240
+ };
241
+ }
242
+ }
174
243
  }
175
244
  //# sourceMappingURL=wezterm_executor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"wezterm_executor.js","sourceRoot":"","sources":["../src/wezterm_executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAShF,MAAM,CAAC,OAAO,OAAO,eAAe;IAC1B,UAAU,CAAS;IAE3B;QACE,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC;IAClC,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,GAAG,IAAI,CAAC,UAAU,qBAAqB,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,GAAG,IAAI,CAAC,UAAU,6BAA6B,CAAC,CAAC;QACpF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnC,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC;IACrC,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAC/B,QAAiB,EACjB,KAAc;QAEd,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACpD,IAAI,QAAQ,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAClD,OAAO,aAAa,CAAC;QACvB,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QACxC,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,aAAa,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,CAAC,CAAc,EAAE,EAAE,CACjC,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC;YACpD,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC;QAE9C,IAAI,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YACxC,OAAO,aAAa,CAAC;QACvB,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,OAAe,EACf,MAAc;QAEd,MAAM,GAAG,GAAG,MAAM,sBAAsB,EAAE,CAAC;QAC3C,IAAI,GAAG;YAAE,OAAO,kBAAkB,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACxD,MAAM,SAAS,CACb,GAAG,IAAI,CAAC,UAAU,wBAAwB,MAAM,gBAAgB,cAAc,KAAK,CACpF,CAAC;YACF,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,wBAAwB,MAAM,KAAK,OAAO,EAAE;qBACnD;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,gCAAgC,KAAK,CAAC,OAAO,+DAA+D;qBACnH;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAiB,EAAE,KAAc;QAC/C,MAAM,GAAG,GAAG,MAAM,sBAAsB,EAAE,CAAC;QAC3C,IAAI,GAAG;YAAE,OAAO,kBAAkB,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YAExC,IAAI,cAAc,GAAG,QAAQ,CAAC;YAC9B,IAAI,WAAW,GAAG,KAAK,CAAC;YACxB,IAAI,cAAc,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC9D,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACpD,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,aAAa,CAAC,CAAC;gBACnE,IAAI,WAAW,EAAE,CAAC;oBAChB,cAAc,GAAG,WAAW,CAAC,SAAS,CAAC;oBACvC,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC;gBACnC,CAAC;YACH,CAAC;YAED,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAC3B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,cAAc,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,KAAK,cAAc,CAAC;gBAChE,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAC1D,CAAC;YAEF,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM;gBAC1B,CAAC,CAAC,QAAQ;qBACL,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,WAAW,CAAC,CAAC,OAAO,cAAc,CAAC,CAAC,SAAS,WAAW,CAAC,CAAC,MAAM,WAAW,CAAC,CAAC,KAAK,GAAG,CACxF;qBACA,IAAI,CAAC,IAAI,CAAC;gBACf,CAAC,CAAC,kBAAkB,CAAC;YAEvB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,yBAAyB,KAAK,CAAC,OAAO,+DAA+D;qBAC5G;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,MAAM,GAAG,GAAG,MAAM,sBAAsB,EAAE,CAAC;QAC3C,IAAI,GAAG;YAAE,OAAO,kBAAkB,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,GAAG,IAAI,CAAC,UAAU,4BAA4B,MAAM,EAAE,CAAC,CAAC;YACxE,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,oBAAoB,MAAM,EAAE;qBACnC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,0BAA0B,KAAK,CAAC,OAAO,2BAA2B,MAAM,UAAU;qBACzF;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAc;QAC5B,MAAM,GAAG,GAAG,MAAM,sBAAsB,EAAE,CAAC;QAC3C,IAAI,GAAG;YAAE,OAAO,kBAAkB,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,GAAG,IAAI,CAAC,UAAU,wBAAwB,MAAM,EAAE,CAAC,CAAC;YACpE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,MAAM,EAAE,EAAE,CAAC;aAC3D,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,MAAM,KAAK,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;aACtF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CACb,MAA0B,EAC1B,SAA8C,EAC9C,QAAiB,EACjB,KAAc;QAEd,MAAM,GAAG,GAAG,MAAM,sBAAsB,EAAE,CAAC;QAC3C,IAAI,GAAG;YAAE,OAAO,kBAAkB,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,KAAK,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,YAAY,GAChB,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAElF,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gBAC/B,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,+HAA+H;yBACtI;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAChC,GAAG,IAAI,CAAC,UAAU,yBAAyB,YAAY,IAAI,OAAO,EAAE,CACrE,CAAC;YACF,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,cAAc,YAAY,IAAI,SAAS,kBAAkB,MAAM,CAAC,IAAI,EAAE,EAAE;qBAC/E;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,yBAAyB,KAAK,CAAC,OAAO,EAAE;qBAC/C;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"wezterm_executor.js","sourceRoot":"","sources":["../src/wezterm_executor.ts"],"names":[],"mappings":"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"}
@@ -1,25 +1,16 @@
1
- import { execAsync } from "./exec_async.js";
1
+ import { execFileAsync } from "./exec_async.js";
2
2
  import { assertWeztermInstalled, notInstalledResult } from "./wezterm_check.js";
3
3
  export default class WeztermOutputReader {
4
- weztermCli;
5
- constructor() {
6
- this.weztermCli = "wezterm cli";
7
- }
8
- async readOutput(lines = 50, paneId) {
4
+ async readOutput(paneId, lines = 50) {
9
5
  const err = await assertWeztermInstalled();
10
6
  if (err)
11
7
  return notInstalledResult();
12
8
  try {
13
- let command;
14
- const paneOption = paneId !== undefined ? ` --pane-id ${paneId}` : '';
15
- if (lines <= 0) {
16
- command = `${this.weztermCli} get-text --escapes${paneOption}`;
17
- }
18
- else {
19
- const startLine = -lines;
20
- command = `${this.weztermCli} get-text --escapes --start-line ${startLine}${paneOption}`;
9
+ const args = ["cli", "get-text", "--escapes", "--pane-id", String(paneId)];
10
+ if (lines > 0) {
11
+ args.push("--start-line", String(-lines));
21
12
  }
22
- const { stdout } = await execAsync(command);
13
+ const { stdout } = await execFileAsync("wezterm", args);
23
14
  return {
24
15
  content: [
25
16
  {
@@ -40,32 +31,5 @@ export default class WeztermOutputReader {
40
31
  };
41
32
  }
42
33
  }
43
- async readCurrentScreen(paneId) {
44
- const err = await assertWeztermInstalled();
45
- if (err)
46
- return notInstalledResult();
47
- try {
48
- const paneOption = paneId !== undefined ? ` --pane-id ${paneId}` : '';
49
- const { stdout } = await execAsync(`${this.weztermCli} get-text --escapes${paneOption}`);
50
- return {
51
- content: [
52
- {
53
- type: "text",
54
- text: stdout || "(empty output)",
55
- },
56
- ],
57
- };
58
- }
59
- catch (error) {
60
- return {
61
- content: [
62
- {
63
- type: "text",
64
- text: `Failed to read current screen: ${error.message}`,
65
- },
66
- ],
67
- };
68
- }
69
- }
70
34
  }
71
35
  //# sourceMappingURL=wezterm_output_reader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"wezterm_output_reader.js","sourceRoot":"","sources":["../src/wezterm_output_reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAEhF,MAAM,CAAC,OAAO,OAAO,mBAAmB;IAC9B,UAAU,CAAS;IAE3B;QACE,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,EAAE,MAAe;QAClD,MAAM,GAAG,GAAG,MAAM,sBAAsB,EAAE,CAAC;QAC3C,IAAI,GAAG;YAAE,OAAO,kBAAkB,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,IAAI,OAAe,CAAC;YACpB,MAAM,UAAU,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAEtE,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBACf,OAAO,GAAG,GAAG,IAAI,CAAC,UAAU,sBAAsB,UAAU,EAAE,CAAC;YACjE,CAAC;iBAAM,CAAC;gBACN,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC;gBACzB,OAAO,GAAG,GAAG,IAAI,CAAC,UAAU,oCAAoC,SAAS,GAAG,UAAU,EAAE,CAAC;YAC3F,CAAC;YAED,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;YAE5C,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,MAAM,IAAI,gBAAgB;qBACjC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,mCAAmC,KAAK,CAAC,OAAO,8FAA8F;qBACrJ;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAAe;QACrC,MAAM,GAAG,GAAG,MAAM,sBAAsB,EAAE,CAAC;QAC3C,IAAI,GAAG;YAAE,OAAO,kBAAkB,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAChC,GAAG,IAAI,CAAC,UAAU,sBAAsB,UAAU,EAAE,CACrD,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,MAAM,IAAI,gBAAgB;qBACjC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,kCAAkC,KAAK,CAAC,OAAO,EAAE;qBACxD;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"wezterm_output_reader.js","sourceRoot":"","sources":["../src/wezterm_output_reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAEhF,MAAM,CAAC,OAAO,OAAO,mBAAmB;IACtC,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,QAAgB,EAAE;QACjD,MAAM,GAAG,GAAG,MAAM,sBAAsB,EAAE,CAAC;QAC3C,IAAI,GAAG;YAAE,OAAO,kBAAkB,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAC3E,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5C,CAAC;YAED,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAExD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,MAAM,IAAI,gBAAgB;qBACjC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,mCAAmC,KAAK,CAAC,OAAO,8FAA8F;qBACrJ;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "weztermcp",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "mcp server for wezterm ",
5
5
  "homepage": "https://github.com/ajmarkow/weztermcp#readme",
6
6
  "repository": {