@gigaflow/gmux 0.15.0 → 0.16.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 (73) hide show
  1. package/CHANGELOG.md +110 -80
  2. package/README.md +81 -57
  3. package/dist/adapters/claude-code.js +5 -2
  4. package/dist/adapters/claude-code.js.map +1 -1
  5. package/dist/adapters/codex.js +5 -2
  6. package/dist/adapters/codex.js.map +1 -1
  7. package/dist/cli/border-client.d.ts +1 -1
  8. package/dist/cli/border-client.js +1 -1
  9. package/dist/cli/commands/cockpit.d.ts +16 -6
  10. package/dist/cli/commands/cockpit.js +288 -20
  11. package/dist/cli/commands/cockpit.js.map +1 -1
  12. package/dist/cli/commands/daemon.d.ts +2 -19
  13. package/dist/cli/commands/daemon.js +39 -88
  14. package/dist/cli/commands/daemon.js.map +1 -1
  15. package/dist/cli/commands/doctor.js +24 -0
  16. package/dist/cli/commands/doctor.js.map +1 -1
  17. package/dist/cli/commands/organize.d.ts +18 -0
  18. package/dist/cli/commands/organize.js +94 -0
  19. package/dist/cli/commands/organize.js.map +1 -0
  20. package/dist/cli/commands/setup.js +13 -1
  21. package/dist/cli/commands/setup.js.map +1 -1
  22. package/dist/cli/commands/tmux.d.ts +56 -0
  23. package/dist/cli/commands/tmux.js +158 -28
  24. package/dist/cli/commands/tmux.js.map +1 -1
  25. package/dist/cli/gmux-render.d.ts +12 -1
  26. package/dist/cli/gmux-render.js +18 -11
  27. package/dist/cli/gmux-render.js.map +1 -1
  28. package/dist/cli/main.js +2 -0
  29. package/dist/cli/main.js.map +1 -1
  30. package/dist/cli/organize-confirm.d.ts +45 -0
  31. package/dist/cli/organize-confirm.js +57 -0
  32. package/dist/cli/organize-confirm.js.map +1 -0
  33. package/dist/cli/overlay-ask.d.ts +3 -1
  34. package/dist/cli/overlay-ask.js +5 -3
  35. package/dist/cli/overlay-ask.js.map +1 -1
  36. package/dist/cli/tmux-label.d.ts +11 -4
  37. package/dist/cli/tmux-label.js +17 -6
  38. package/dist/cli/tmux-label.js.map +1 -1
  39. package/dist/cli/work-report.d.ts +18 -0
  40. package/dist/cli/work-report.js +50 -0
  41. package/dist/cli/work-report.js.map +1 -0
  42. package/dist/core/bytes.d.ts +6 -0
  43. package/dist/core/bytes.js +13 -0
  44. package/dist/core/bytes.js.map +1 -0
  45. package/dist/core/organize-types.d.ts +95 -0
  46. package/dist/core/organize-types.js +33 -0
  47. package/dist/core/organize-types.js.map +1 -0
  48. package/dist/core/paths.d.ts +13 -0
  49. package/dist/core/paths.js +20 -1
  50. package/dist/core/paths.js.map +1 -1
  51. package/dist/services/ask-router.d.ts +44 -0
  52. package/dist/services/ask-router.js +63 -0
  53. package/dist/services/ask-router.js.map +1 -0
  54. package/dist/services/daemon-lock.d.ts +31 -0
  55. package/dist/services/daemon-lock.js +77 -0
  56. package/dist/services/daemon-lock.js.map +1 -0
  57. package/dist/services/daemon.js +35 -6
  58. package/dist/services/daemon.js.map +1 -1
  59. package/dist/services/guardian.js +4 -4
  60. package/dist/services/guardian.js.map +1 -1
  61. package/dist/services/organize.d.ts +91 -0
  62. package/dist/services/organize.js +462 -0
  63. package/dist/services/organize.js.map +1 -0
  64. package/dist/services/tmux-gateway.d.ts +12 -0
  65. package/dist/services/tmux-gateway.js +7 -1
  66. package/dist/services/tmux-gateway.js.map +1 -1
  67. package/dist/services/tmux.d.ts +17 -1
  68. package/dist/services/tmux.js +34 -1
  69. package/dist/services/tmux.js.map +1 -1
  70. package/dist/services/work-view.d.ts +67 -0
  71. package/dist/services/work-view.js +155 -0
  72. package/dist/services/work-view.js.map +1 -0
  73. package/package.json +1 -1
@@ -0,0 +1,462 @@
1
+ /**
2
+ * `gmux organize`: turns the live pane set into an `OrganizePlan` (grouping
3
+ * work by project into windows) and, on request, executes that plan against
4
+ * the tmux gateway.
5
+ *
6
+ * Two planners share the `OrganizePlanner` interface:
7
+ * - `HeuristicOrganizePlanner` — deterministic, no model call, no I/O. The
8
+ * graceful floor: `gmux organize` with no intent and no provider always
9
+ * has something sensible to do.
10
+ * - `LlmOrganizePlanner` — reuses the same provider-CLI plumbing as session
11
+ * summaries (`resolveSummaryCommand` + `runProviderCommand`) to turn a
12
+ * natural-language intent into a plan, and NEVER throws: any missing
13
+ * provider, timeout, or malformed reply falls back to the heuristic.
14
+ *
15
+ * `applyPlan` is the only place in this file that touches the gateway. It
16
+ * validates every step against the live pane/window set (plus handles bound
17
+ * by earlier steps in the same run) and skips — never throws for — a step
18
+ * that no longer makes sense, so one stale reference can't abort the rest of
19
+ * the plan.
20
+ *
21
+ * DESTRUCTION GUARANTEE: `applyPlan` only ever calls
22
+ * `newWindow`/`renameWindow`/`joinPane`/`breakPane`/`swapPane`/`selectLayout`
23
+ * on the gateway. None of those kills a process. A pane moved out of a window
24
+ * that tmux then closes (now empty) has already left *with* its process.
25
+ * There is no code path from a plan to `kill-pane`/`kill-window` — those
26
+ * verbs do not appear anywhere below, and `OrganizeStep` has no op that maps
27
+ * to one.
28
+ */
29
+ import { basename } from "node:path";
30
+ import { isLayoutName, } from "../core/organize-types.js";
31
+ import { readConfig, resolveSummaryCommand } from "./config.js";
32
+ import { runProviderCommand } from "./provider-process.js";
33
+ // ---------------------------------------------------------------------------
34
+ // HeuristicOrganizePlanner
35
+ // ---------------------------------------------------------------------------
36
+ const BARE_SHELL_COMMANDS = new Set(["zsh", "bash", "fish", "sh", "-zsh", "-bash"]);
37
+ /**
38
+ * True for a pane that is nothing but an idle interactive shell: no resolved
39
+ * harness, a bare shell as its foreground command, and (when we know a
40
+ * state at all) that state is "idle". Everything else — a resolved harness, a
41
+ * plain non-shell command, or a shell mid-"working"/"error" — is agent-class,
42
+ * so a live process is never swept into the "shells" bucket by mistake.
43
+ */
44
+ function isIdleShell(pane) {
45
+ if (pane.harness !== null)
46
+ return false;
47
+ if (!BARE_SHELL_COMMANDS.has(pane.command))
48
+ return false;
49
+ return pane.state === null || pane.state === "idle";
50
+ }
51
+ /** `basename(cwd)`, normalized so an empty path or "/" reads as "root". */
52
+ function projectKeyOf(cwd) {
53
+ const base = basename(cwd);
54
+ return base === "" ? "root" : base;
55
+ }
56
+ function paneLabel(pane) {
57
+ return pane.label ?? pane.command;
58
+ }
59
+ function byPaneId(a, b) {
60
+ return a.paneId.localeCompare(b.paneId);
61
+ }
62
+ /** Panes (from the full input set) currently sharing `windowId`. */
63
+ function countInWindow(panes, windowId) {
64
+ return panes.filter((p) => p.windowId === windowId).length;
65
+ }
66
+ /**
67
+ * Deterministic, pure, no-I/O planner. Groups agent panes by project
68
+ * (`basename(cwd)`) into one window each, and idle shells into a shared
69
+ * "shells" window. Ignores `intent` — it has no natural-language input to
70
+ * interpret, which is exactly why it is the safe default and the fallback
71
+ * for `LlmOrganizePlanner`.
72
+ */
73
+ export class HeuristicOrganizePlanner {
74
+ async plan(panes, _intent) {
75
+ const steps = [];
76
+ let movedCount = 0;
77
+ const agentPanes = panes.filter((p) => !isIdleShell(p));
78
+ const shellPanes = panes.filter(isIdleShell).sort(byPaneId);
79
+ const groups = new Map();
80
+ for (const pane of agentPanes) {
81
+ const key = projectKeyOf(pane.cwd);
82
+ const group = groups.get(key);
83
+ if (group)
84
+ group.push(pane);
85
+ else
86
+ groups.set(key, [pane]);
87
+ }
88
+ for (const group of groups.values())
89
+ group.sort(byPaneId);
90
+ const projectKeys = [...groups.keys()].sort((a, b) => a.localeCompare(b));
91
+ for (const key of projectKeys) {
92
+ const group = groups.get(key);
93
+ const anchorPane = group.find((p) => p.windowId !== null) ?? null;
94
+ const anchorWindowId = anchorPane?.windowId ?? null;
95
+ let anchor;
96
+ let freshlyCreated = false;
97
+ if (anchorWindowId !== null) {
98
+ anchor = { kind: "window", windowId: anchorWindowId };
99
+ }
100
+ else {
101
+ const handle = `w:${key}`;
102
+ steps.push({ op: "new-window", handle, name: key, description: `Create window "${key}"` });
103
+ anchor = { kind: "handle", handle };
104
+ freshlyCreated = true;
105
+ }
106
+ if (!freshlyCreated) {
107
+ steps.push({
108
+ op: "rename-window",
109
+ window: anchor,
110
+ name: key,
111
+ description: `Rename window to "${key}"`,
112
+ });
113
+ }
114
+ for (const pane of group) {
115
+ if (pane === anchorPane)
116
+ continue; // Already the anchor; nothing to move.
117
+ if (anchorWindowId !== null && pane.windowId === anchorWindowId)
118
+ continue; // Already grouped.
119
+ steps.push({
120
+ op: "move-pane",
121
+ paneId: pane.paneId,
122
+ to: anchor,
123
+ description: `Move ${pane.paneId} (${paneLabel(pane)}) → "${key}"`,
124
+ });
125
+ movedCount += 1;
126
+ }
127
+ steps.push({ op: "select-layout", window: anchor, layout: "tiled", description: `Tile "${key}"` });
128
+ }
129
+ if (shellPanes.length >= 2 && !shellsAlreadyAloneTogether(panes, shellPanes)) {
130
+ const handle = "w:shells";
131
+ steps.push({ op: "new-window", handle, name: "shells", description: 'Create window "shells"' });
132
+ const anchor = { kind: "handle", handle };
133
+ for (const pane of shellPanes) {
134
+ steps.push({
135
+ op: "move-pane",
136
+ paneId: pane.paneId,
137
+ to: anchor,
138
+ description: `Move ${pane.paneId} (${paneLabel(pane)}) → "shells"`,
139
+ });
140
+ movedCount += 1;
141
+ }
142
+ steps.push({
143
+ op: "select-layout",
144
+ window: anchor,
145
+ layout: "even-vertical",
146
+ description: 'Arrange "shells"',
147
+ });
148
+ }
149
+ const summary = `${projectKeys.length} project window(s), ${movedCount} pane(s) moved`;
150
+ return { summary, steps };
151
+ }
152
+ }
153
+ /** True when every idle shell already shares one window, alone (no other pane in it). */
154
+ function shellsAlreadyAloneTogether(allPanes, shellPanes) {
155
+ const windowIds = new Set(shellPanes.map((p) => p.windowId));
156
+ if (windowIds.size !== 1)
157
+ return false;
158
+ const [windowId] = [...windowIds];
159
+ if (windowId === null || windowId === undefined)
160
+ return false;
161
+ return countInWindow(allPanes, windowId) === shellPanes.length;
162
+ }
163
+ // ---------------------------------------------------------------------------
164
+ // LLM planner: prompt + reply parsing (pure) and the planner itself
165
+ // ---------------------------------------------------------------------------
166
+ const ORGANIZE_TIMEOUT_MS = 120_000;
167
+ const MAX_PLAN_STEPS = 200;
168
+ function formatPaneLine(pane) {
169
+ const parts = [pane.paneId, `win=${pane.windowId ?? "?"}`];
170
+ if (pane.state)
171
+ parts.push(`state=${pane.state}`);
172
+ parts.push(`cwd=${pane.cwd}`);
173
+ parts.push(`cmd=${pane.command}`);
174
+ if (pane.harness)
175
+ parts.push(`harness=${pane.harness}`);
176
+ if (pane.label)
177
+ parts.push(`label=${JSON.stringify(pane.label)}`);
178
+ return parts.join(" ");
179
+ }
180
+ /** Pure. The prompt an LLM planner is asked to reply to. */
181
+ export function buildOrganizePrompt(panes, intent) {
182
+ return [
183
+ "You are planning a tmux workspace reorganization.",
184
+ "Current panes:",
185
+ panes.map(formatPaneLine).join("\n"),
186
+ "",
187
+ `Intent: ${intent}`,
188
+ "",
189
+ "Reply with ONLY a JSON object, no prose and no code fence:",
190
+ '{"summary": "<short summary>", "steps": [ <step>, ... ]}',
191
+ "Each <step> is exactly one of:",
192
+ ' {"op":"new-window","handle":"<local id>","name":"<window name>","description":"<text>"}',
193
+ ' {"op":"rename-window","window":<WindowTarget>,"name":"<window name>","description":"<text>"}',
194
+ ' {"op":"move-pane","paneId":"%N","to":<WindowTarget>,"description":"<text>"}',
195
+ ' {"op":"break-pane","paneId":"%N","handle":"<local id>","name":"<window name>","description":"<text>"}',
196
+ ' {"op":"swap-pane","a":"%N","b":"%N","description":"<text>"}',
197
+ ' {"op":"select-layout","window":<WindowTarget>,"layout":"tiled|even-horizontal|even-vertical|main-horizontal|main-vertical","description":"<text>"}',
198
+ 'A <WindowTarget> is {"kind":"window","windowId":"@N"} for a window already listed above, or ' +
199
+ '{"kind":"handle","handle":"<local id>"} for a window created earlier in THIS plan by a new-window or break-pane step.',
200
+ "Only reference paneId values from the panes listed above.",
201
+ "Never delete or kill anything — there is no such op, and none should be invented.",
202
+ ].join("\n");
203
+ }
204
+ function isNonEmptyString(v) {
205
+ return typeof v === "string" && v.length > 0;
206
+ }
207
+ function readWindowTarget(v, boundHandles) {
208
+ if (!v || typeof v !== "object")
209
+ return null;
210
+ const o = v;
211
+ if (o["kind"] === "window" && isNonEmptyString(o["windowId"])) {
212
+ return { kind: "window", windowId: o["windowId"] };
213
+ }
214
+ if (o["kind"] === "handle" && isNonEmptyString(o["handle"])) {
215
+ if (!boundHandles.has(o["handle"]))
216
+ return null; // Referenced before it was bound (or never bound).
217
+ return { kind: "handle", handle: o["handle"] };
218
+ }
219
+ return null;
220
+ }
221
+ /** Validate + coerce one raw step. Returns null for anything malformed, unknown, or out of range. */
222
+ function readStep(raw, paneIds, boundHandles) {
223
+ if (!raw || typeof raw !== "object")
224
+ return null;
225
+ const o = raw;
226
+ const description = isNonEmptyString(o["description"]) ? o["description"] : String(o["op"] ?? "");
227
+ switch (o["op"]) {
228
+ case "new-window": {
229
+ if (!isNonEmptyString(o["handle"]) || !isNonEmptyString(o["name"]))
230
+ return null;
231
+ return { op: "new-window", handle: o["handle"], name: o["name"], description };
232
+ }
233
+ case "rename-window": {
234
+ const window = readWindowTarget(o["window"], boundHandles);
235
+ if (!window || !isNonEmptyString(o["name"]))
236
+ return null;
237
+ return { op: "rename-window", window, name: o["name"], description };
238
+ }
239
+ case "move-pane": {
240
+ if (!isNonEmptyString(o["paneId"]) || !paneIds.has(o["paneId"]))
241
+ return null;
242
+ const to = readWindowTarget(o["to"], boundHandles);
243
+ if (!to)
244
+ return null;
245
+ return { op: "move-pane", paneId: o["paneId"], to, description };
246
+ }
247
+ case "break-pane": {
248
+ if (!isNonEmptyString(o["paneId"]) || !paneIds.has(o["paneId"]))
249
+ return null;
250
+ if (!isNonEmptyString(o["handle"]))
251
+ return null;
252
+ if (o["name"] !== undefined && !isNonEmptyString(o["name"]))
253
+ return null;
254
+ const name = isNonEmptyString(o["name"]) ? o["name"] : undefined;
255
+ return { op: "break-pane", paneId: o["paneId"], handle: o["handle"], name, description };
256
+ }
257
+ case "swap-pane": {
258
+ if (!isNonEmptyString(o["a"]) || !paneIds.has(o["a"]))
259
+ return null;
260
+ if (!isNonEmptyString(o["b"]) || !paneIds.has(o["b"]))
261
+ return null;
262
+ return { op: "swap-pane", a: o["a"], b: o["b"], description };
263
+ }
264
+ case "select-layout": {
265
+ const window = readWindowTarget(o["window"], boundHandles);
266
+ if (!window)
267
+ return null;
268
+ if (!isNonEmptyString(o["layout"]) || !isLayoutName(o["layout"]))
269
+ return null;
270
+ const layout = o["layout"];
271
+ return { op: "select-layout", window, layout, description };
272
+ }
273
+ default:
274
+ return null;
275
+ }
276
+ }
277
+ /**
278
+ * Pure. Turns a raw model reply into a validated `OrganizePlan`, dropping —
279
+ * never throwing on — any step that is malformed, references an unknown
280
+ * pane, or references a window handle not bound by an earlier step in the
281
+ * same reply. Mirrors `parseSummaryFields`/`parseLabelFields`: take the
282
+ * outermost `{`…`}` rather than trusting the whole reply to parse, because
283
+ * models fence or preface their JSON more often than they should.
284
+ */
285
+ export function parseOrganizePlan(raw, panes) {
286
+ const start = raw.indexOf("{");
287
+ const end = raw.lastIndexOf("}");
288
+ if (start === -1 || end === -1 || end <= start)
289
+ return { summary: "", steps: [] };
290
+ let parsed;
291
+ try {
292
+ parsed = JSON.parse(raw.slice(start, end + 1));
293
+ }
294
+ catch {
295
+ return { summary: "", steps: [] };
296
+ }
297
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
298
+ return { summary: "", steps: [] };
299
+ const obj = parsed;
300
+ const rawSteps = Array.isArray(obj["steps"]) ? obj["steps"].slice(0, MAX_PLAN_STEPS) : [];
301
+ const paneIds = new Set(panes.map((p) => p.paneId));
302
+ const boundHandles = new Set();
303
+ const steps = [];
304
+ for (const rawStep of rawSteps) {
305
+ const step = readStep(rawStep, paneIds, boundHandles);
306
+ if (!step)
307
+ continue;
308
+ if (step.op === "new-window" || step.op === "break-pane")
309
+ boundHandles.add(step.handle);
310
+ steps.push(step);
311
+ }
312
+ const summary = isNonEmptyString(obj["summary"]) ? obj["summary"] : `${steps.length} step(s)`;
313
+ return { summary, steps };
314
+ }
315
+ /**
316
+ * LLM-backed planner. Reuses the exact provider infra the semantic labeler
317
+ * uses (`resolveSummaryCommand` + `runProviderCommand`). Never throws to the
318
+ * caller: no provider configured, no intent given, a timeout, a malformed
319
+ * reply, or a reply that parses to zero usable steps all fall back to
320
+ * `fallback` (a fresh `HeuristicOrganizePlanner` by default).
321
+ *
322
+ * `argv`, when passed to the constructor, is used as-is (mainly for tests, to
323
+ * avoid touching real config/PATH); when omitted, it is resolved fresh from
324
+ * config on every `plan()` call, same as the labeler does.
325
+ */
326
+ export class LlmOrganizePlanner {
327
+ fallback;
328
+ argv;
329
+ constructor(fallback = new HeuristicOrganizePlanner(), argv) {
330
+ this.fallback = fallback;
331
+ this.argv = argv;
332
+ }
333
+ async plan(panes, intent) {
334
+ if (!intent || intent.trim() === "")
335
+ return this.fallback.plan(panes, intent);
336
+ const argv = this.argv !== undefined ? this.argv : resolveSummaryCommand(await readConfig());
337
+ if (!argv)
338
+ return this.fallback.plan(panes, intent);
339
+ try {
340
+ const prompt = buildOrganizePrompt(panes, intent);
341
+ const raw = await runProviderCommand(argv, prompt, { timeoutMs: ORGANIZE_TIMEOUT_MS });
342
+ const parsed = parseOrganizePlan(raw, panes);
343
+ if (parsed.steps.length === 0)
344
+ return this.fallback.plan(panes, intent);
345
+ return parsed;
346
+ }
347
+ catch {
348
+ return this.fallback.plan(panes, intent);
349
+ }
350
+ }
351
+ }
352
+ function describeUnresolved(target) {
353
+ return target.kind === "handle"
354
+ ? `unbound window handle ${target.handle}`
355
+ : `window ${target.windowId} not present`;
356
+ }
357
+ /**
358
+ * Execute a plan against `gateway`, one step at a time, in order.
359
+ *
360
+ * Every step is validated against the live pane/window set (snapshotted once,
361
+ * up front) plus any window handle a prior step in THIS run has bound —
362
+ * never against a fresh `listPanes()` call, so the validation set is stable
363
+ * for the whole run. A step that fails validation, or whose gateway call
364
+ * throws (a tmux race, "can't break the only pane in a window", …), is
365
+ * pushed to `skipped` with a reason and execution continues — one bad step
366
+ * never aborts the rest of the plan.
367
+ *
368
+ * Only `newWindow`/`renameWindow`/`joinPane`/`breakPane`/`swapPane`/
369
+ * `selectLayout` are ever called here. None of those kills a process.
370
+ */
371
+ export async function applyPlan(plan, gateway) {
372
+ const panes = await gateway.listPanes();
373
+ const livePaneIds = new Set(panes.map((p) => p.paneId));
374
+ const liveWindowIds = new Set(panes.map((p) => p.windowId).filter((w) => w !== null));
375
+ const handles = new Map();
376
+ const applied = [];
377
+ const skipped = [];
378
+ const skip = (step, reason) => {
379
+ skipped.push({ step, reason });
380
+ };
381
+ const resolveWindow = (target) => {
382
+ if (target.kind === "window")
383
+ return liveWindowIds.has(target.windowId) ? target.windowId : null;
384
+ return handles.get(target.handle) ?? null;
385
+ };
386
+ for (const step of plan.steps) {
387
+ try {
388
+ switch (step.op) {
389
+ case "new-window": {
390
+ const windowId = await gateway.newWindow(step.name);
391
+ handles.set(step.handle, windowId);
392
+ liveWindowIds.add(windowId);
393
+ applied.push(step);
394
+ break;
395
+ }
396
+ case "rename-window": {
397
+ const windowId = resolveWindow(step.window);
398
+ if (windowId === null) {
399
+ skip(step, describeUnresolved(step.window));
400
+ break;
401
+ }
402
+ await gateway.renameWindow(windowId, step.name);
403
+ applied.push(step);
404
+ break;
405
+ }
406
+ case "move-pane": {
407
+ if (!livePaneIds.has(step.paneId)) {
408
+ skip(step, `pane ${step.paneId} no longer present`);
409
+ break;
410
+ }
411
+ const windowId = resolveWindow(step.to);
412
+ if (windowId === null) {
413
+ skip(step, describeUnresolved(step.to));
414
+ break;
415
+ }
416
+ await gateway.joinPane(step.paneId, windowId);
417
+ applied.push(step);
418
+ break;
419
+ }
420
+ case "break-pane": {
421
+ if (!livePaneIds.has(step.paneId)) {
422
+ skip(step, `pane ${step.paneId} no longer present`);
423
+ break;
424
+ }
425
+ const windowId = await gateway.breakPane(step.paneId, step.name);
426
+ handles.set(step.handle, windowId);
427
+ liveWindowIds.add(windowId);
428
+ applied.push(step);
429
+ break;
430
+ }
431
+ case "swap-pane": {
432
+ if (!livePaneIds.has(step.a)) {
433
+ skip(step, `pane ${step.a} no longer present`);
434
+ break;
435
+ }
436
+ if (!livePaneIds.has(step.b)) {
437
+ skip(step, `pane ${step.b} no longer present`);
438
+ break;
439
+ }
440
+ await gateway.swapPane(step.a, step.b);
441
+ applied.push(step);
442
+ break;
443
+ }
444
+ case "select-layout": {
445
+ const windowId = resolveWindow(step.window);
446
+ if (windowId === null) {
447
+ skip(step, describeUnresolved(step.window));
448
+ break;
449
+ }
450
+ await gateway.selectLayout(windowId, step.layout);
451
+ applied.push(step);
452
+ break;
453
+ }
454
+ }
455
+ }
456
+ catch (err) {
457
+ skip(step, err instanceof Error ? err.message : String(err));
458
+ }
459
+ }
460
+ return { applied, skipped };
461
+ }
462
+ //# sourceMappingURL=organize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organize.js","sourceRoot":"","sources":["../../src/services/organize.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,12 @@ export interface TmuxGateway {
6
6
  stopPipe(paneId: string): Promise<void>;
7
7
  send(paneId: string, keys: string): Promise<void>;
8
8
  setOption(paneId: string, name: string, value: string): Promise<void>;
9
+ newWindow(name: string): Promise<string>;
10
+ renameWindow(windowId: string, name: string): Promise<void>;
11
+ joinPane(srcPane: string, dst: string): Promise<void>;
12
+ breakPane(pane: string, name?: string): Promise<string>;
13
+ swapPane(a: string, b: string): Promise<void>;
14
+ selectLayout(windowId: string, layout: string): Promise<void>;
9
15
  }
10
16
  export declare class RealTmuxGateway implements TmuxGateway {
11
17
  listPanes(): Promise<TmuxPane[]>;
@@ -14,4 +20,10 @@ export declare class RealTmuxGateway implements TmuxGateway {
14
20
  stopPipe(paneId: string): Promise<void>;
15
21
  send(paneId: string, keys: string): Promise<void>;
16
22
  setOption(paneId: string, name: string, value: string): Promise<void>;
23
+ newWindow(name: string): Promise<string>;
24
+ renameWindow(windowId: string, name: string): Promise<void>;
25
+ joinPane(srcPane: string, dst: string): Promise<void>;
26
+ breakPane(pane: string, name?: string): Promise<string>;
27
+ swapPane(a: string, b: string): Promise<void>;
28
+ selectLayout(windowId: string, layout: string): Promise<void>;
17
29
  }
@@ -1,4 +1,4 @@
1
- import { capturePane, listAllPanes, sendKeys, setPaneOption, startPipePane, stopPipePane } from "./tmux.js";
1
+ import { breakPane, capturePane, joinPane, listAllPanes, newWindow, renameWindow, selectLayout, sendKeys, setPaneOption, startPipePane, stopPipePane, swapPane, } from "./tmux.js";
2
2
  export class RealTmuxGateway {
3
3
  listPanes() { return listAllPanes(); }
4
4
  capture(paneId, lines) { return capturePane(paneId, lines); }
@@ -6,5 +6,11 @@ export class RealTmuxGateway {
6
6
  stopPipe(paneId) { return stopPipePane(paneId); }
7
7
  send(paneId, keys) { return sendKeys(paneId, keys); }
8
8
  setOption(paneId, name, value) { return setPaneOption(paneId, name, value); }
9
+ newWindow(name) { return newWindow(name); }
10
+ renameWindow(windowId, name) { return renameWindow(windowId, name); }
11
+ joinPane(srcPane, dst) { return joinPane(srcPane, dst); }
12
+ breakPane(pane, name) { return breakPane(pane, name); }
13
+ swapPane(a, b) { return swapPane(a, b); }
14
+ selectLayout(windowId, layout) { return selectLayout(windowId, layout); }
9
15
  }
10
16
  //# sourceMappingURL=tmux-gateway.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tmux-gateway.js","sourceRoot":"","sources":["../../src/services/tmux-gateway.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAW5G,MAAM,OAAO,eAAe;IAC1B,SAAS,KAA0B,OAAO,YAAY,EAAE,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,MAAc,EAAE,KAAc,IAAqB,OAAO,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/F,SAAS,CAAC,MAAc,EAAE,OAAe,IAAmB,OAAO,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACpG,QAAQ,CAAC,MAAc,IAAmB,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxE,IAAI,CAAC,MAAc,EAAE,IAAY,IAAmB,OAAO,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACpF,SAAS,CAAC,MAAc,EAAE,IAAY,EAAE,KAAa,IAAmB,OAAO,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;CACrH"}
1
+ {"version":3,"file":"tmux-gateway.js","sourceRoot":"","sources":["../../src/services/tmux-gateway.ts"],"names":[],"mappings":"AACA,OAAO,EACL,SAAS,EACT,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,aAAa,EACb,YAAY,EACZ,QAAQ,GACT,MAAM,WAAW,CAAC;AAiBnB,MAAM,OAAO,eAAe;IAC1B,SAAS,KAA0B,OAAO,YAAY,EAAE,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,MAAc,EAAE,KAAc,IAAqB,OAAO,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/F,SAAS,CAAC,MAAc,EAAE,OAAe,IAAmB,OAAO,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACpG,QAAQ,CAAC,MAAc,IAAmB,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxE,IAAI,CAAC,MAAc,EAAE,IAAY,IAAmB,OAAO,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACpF,SAAS,CAAC,MAAc,EAAE,IAAY,EAAE,KAAa,IAAmB,OAAO,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACpH,SAAS,CAAC,IAAY,IAAqB,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpE,YAAY,CAAC,QAAgB,EAAE,IAAY,IAAmB,OAAO,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACpG,QAAQ,CAAC,OAAe,EAAE,GAAW,IAAmB,OAAO,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACxF,SAAS,CAAC,IAAY,EAAE,IAAa,IAAqB,OAAO,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACzF,QAAQ,CAAC,CAAS,EAAE,CAAS,IAAmB,OAAO,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,YAAY,CAAC,QAAgB,EAAE,MAAc,IAAmB,OAAO,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;CACzG"}
@@ -28,5 +28,21 @@ export declare function startPipePane(paneId: string, logPath: string): Promise<
28
28
  export declare function stopPipePane(paneId: string): Promise<void>;
29
29
  /** Type literal keys into a pane. `-l` = literal, no key-name interpretation. */
30
30
  export declare function sendKeys(paneId: string, keys: string): Promise<void>;
31
- /** Set a per-pane option (e.g. `@gm_label`). */
31
+ /** Set a per-pane option (e.g. `@gmux_label`). */
32
32
  export declare function setPaneOption(paneId: string, name: string, value: string): Promise<void>;
33
+ /** Create a detached window (does not steal focus) and return its "@N" id. */
34
+ export declare function newWindow(name: string): Promise<string>;
35
+ /** Rename a window. `window` is a "@N" id. */
36
+ export declare function renameWindow(windowId: string, name: string): Promise<void>;
37
+ /**
38
+ * Move `srcPane` ("%N") into `dst` — a window ("@N") or an existing pane ("%N").
39
+ * The pane and its process move; nothing is killed. If the source window is left
40
+ * empty, tmux closes that (now empty) window — the process already left with the pane.
41
+ */
42
+ export declare function joinPane(srcPane: string, dst: string): Promise<void>;
43
+ /** Break `pane` ("%N") into its own detached window; return the new "@N" id. */
44
+ export declare function breakPane(pane: string, name?: string): Promise<string>;
45
+ /** Swap two panes in place ("%N" each). Processes stay put; only positions swap. */
46
+ export declare function swapPane(a: string, b: string): Promise<void>;
47
+ /** Apply a named layout to a window. `layout` is one of the tmux preset names. */
48
+ export declare function selectLayout(windowId: string, layout: string): Promise<void>;
@@ -100,8 +100,41 @@ export async function stopPipePane(paneId) {
100
100
  export async function sendKeys(paneId, keys) {
101
101
  await run("tmux", ["send-keys", "-t", paneId, "-l", keys], { timeout: TMUX_TIMEOUT_MS });
102
102
  }
103
- /** Set a per-pane option (e.g. `@gm_label`). */
103
+ /** Set a per-pane option (e.g. `@gmux_label`). */
104
104
  export async function setPaneOption(paneId, name, value) {
105
105
  await run("tmux", ["set-option", "-p", "-t", paneId, name, value], { timeout: TMUX_TIMEOUT_MS });
106
106
  }
107
+ /** Create a detached window (does not steal focus) and return its "@N" id. */
108
+ export async function newWindow(name) {
109
+ const { stdout } = await run("tmux", ["new-window", "-d", "-P", "-F", "#{window_id}", "-n", name], { timeout: TMUX_TIMEOUT_MS });
110
+ return stdout.trim();
111
+ }
112
+ /** Rename a window. `window` is a "@N" id. */
113
+ export async function renameWindow(windowId, name) {
114
+ await run("tmux", ["rename-window", "-t", windowId, name], { timeout: TMUX_TIMEOUT_MS });
115
+ }
116
+ /**
117
+ * Move `srcPane` ("%N") into `dst` — a window ("@N") or an existing pane ("%N").
118
+ * The pane and its process move; nothing is killed. If the source window is left
119
+ * empty, tmux closes that (now empty) window — the process already left with the pane.
120
+ */
121
+ export async function joinPane(srcPane, dst) {
122
+ await run("tmux", ["join-pane", "-s", srcPane, "-t", dst], { timeout: TMUX_TIMEOUT_MS });
123
+ }
124
+ /** Break `pane` ("%N") into its own detached window; return the new "@N" id. */
125
+ export async function breakPane(pane, name) {
126
+ const args = ["break-pane", "-d", "-s", pane, "-P", "-F", "#{window_id}"];
127
+ if (name !== undefined)
128
+ args.push("-n", name);
129
+ const { stdout } = await run("tmux", args, { timeout: TMUX_TIMEOUT_MS });
130
+ return stdout.trim();
131
+ }
132
+ /** Swap two panes in place ("%N" each). Processes stay put; only positions swap. */
133
+ export async function swapPane(a, b) {
134
+ await run("tmux", ["swap-pane", "-s", a, "-t", b], { timeout: TMUX_TIMEOUT_MS });
135
+ }
136
+ /** Apply a named layout to a window. `layout` is one of the tmux preset names. */
137
+ export async function selectLayout(windowId, layout) {
138
+ await run("tmux", ["select-layout", "-t", windowId, layout], { timeout: TMUX_TIMEOUT_MS });
139
+ }
107
140
  //# sourceMappingURL=tmux.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tmux.js","sourceRoot":"","sources":["../../src/services/tmux.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tmux.js","sourceRoot":"","sources":["../../src/services/tmux.ts"],"names":[],"mappings":"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"}