@k1e1n04/mav 0.1.6 → 0.1.18

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@k1e1n04/mav",
3
- "version": "0.1.6",
3
+ "version": "0.1.18",
4
4
  "description": "Multi-agent view — manage multiple AI CLI sessions in one terminal",
5
5
  "type": "module",
6
6
  "bin": {
@@ -20,10 +20,14 @@ export function loadConfig(configPath) {
20
20
  const cmd = typeof a.cmd === 'string' && a.cmd.trim().length > 0
21
21
  ? a.cmd
22
22
  : defaults.cmd;
23
+ const cwd = typeof a.cwd === 'string' && a.cwd.trim().length > 0
24
+ ? a.cwd.replace(/^~/, process.env.HOME ?? '~')
25
+ : undefined;
23
26
  return {
24
27
  type: a.type,
25
28
  cmd,
26
29
  args: Array.isArray(a.args) ? a.args : defaults.args,
30
+ cwd,
27
31
  resumeArgs: Array.isArray(a.resumeArgs) ? a.resumeArgs : defaults.resumeArgs,
28
32
  };
29
33
  });
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAcpD,MAAM,cAAc,GAAc;IAChC,MAAM,EAAE,EAAE;CACX,CAAA;AAED,MAAM,UAAU,UAAU,CAAC,UAAkB;IAC3C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAwE,CAAA;IAEnG,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,MAAM,MAAM,GAAkB,MAAM,CAAC,MAAM;SACxC,MAAM,CAAC,CAAC,CAAC,EAA+E,EAAE,CACzF,OAAO,CAAC,EAAE,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CACjD;SACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,QAAQ,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACzC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAC9D,CAAC,CAAC,CAAC,CAAC,GAAG;YACP,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAA;QAChB,OAAO;YACL,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,GAAG;YACH,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI;YACpD,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU;SAC7E,CAAA;IACH,CAAC,CAAC,CAAA;IAEJ,OAAO,EAAE,MAAM,EAAE,CAAA;AACnB,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAcpD,MAAM,cAAc,GAAc;IAChC,MAAM,EAAE,EAAE;CACX,CAAA;AAED,MAAM,UAAU,UAAU,CAAC,UAAkB;IAC3C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAwE,CAAA;IAEnG,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,MAAM,MAAM,GAAkB,MAAM,CAAC,MAAM;SACxC,MAAM,CAAC,CAAC,CAAC,EAA6F,EAAE,CACvG,OAAO,CAAC,EAAE,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CACjD;SACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,QAAQ,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACzC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAC9D,CAAC,CAAC,CAAC,CAAC,GAAG;YACP,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAA;QAChB,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAC9D,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC;YAC9C,CAAC,CAAC,SAAS,CAAA;QACb,OAAO;YACL,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,GAAG;YACH,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI;YACpD,GAAG;YACH,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU;SAC7E,CAAA;IACH,CAAC,CAAC,CAAA;IAEJ,OAAO,EAAE,MAAM,EAAE,CAAA;AACnB,CAAC"}
@@ -11,8 +11,12 @@ export declare class OverviewUI {
11
11
  constructor(screen: Widgets.Screen, manager: SessionManager, onSessionCreated?: (session: SessionManager['selectedSession']) => void);
12
12
  private bindKeys;
13
13
  private showAddPrompt;
14
+ private showCwdPrompt;
15
+ private spawnAgent;
14
16
  private showError;
15
17
  private syncList;
18
+ private groupByCwd;
19
+ private shortenPath;
16
20
  private getOrderedSessions;
17
21
  private moveSelection;
18
22
  private getStatusLabel;
@@ -1,5 +1,6 @@
1
1
  import blessed from 'neo-blessed';
2
2
  import { getAgentDefaults, resolveSessionArgs } from '../agent-launch.js';
3
+ import { completePath } from './path-completion.js';
3
4
  export class OverviewUI {
4
5
  static STATUS_GROUPS = [
5
6
  { status: 'running', label: 'Working' },
@@ -35,7 +36,9 @@ export class OverviewUI {
35
36
  selected: { bg: 'blue', fg: 'white' },
36
37
  border: { fg: 'cyan' },
37
38
  },
38
- keys: true,
39
+ // keys: true を設定すると blessed 組み込みの up()/down() もカスタムハンドラーと
40
+ // 同時に実行され、selected がヘッダー行(cwd名やステータスグループ名)に一時的に
41
+ // 移動してしまう競合が起きる。矢印キーはカスタムハンドラーのみで処理する。
39
42
  mouse: true,
40
43
  });
41
44
  this.bindKeys();
@@ -59,21 +62,28 @@ export class OverviewUI {
59
62
  this.syncList();
60
63
  screen.render();
61
64
  });
65
+ // removeSession() は emitSelection() を呼ぶが、OverviewUI は 'selection' を
66
+ // listen していないため、index.ts の exit ハンドラ経由で自動削除された場合に
67
+ // UI が再描画されない。'selection' を listen して確実に同期する。
68
+ manager.on('selection', () => {
69
+ this.syncList();
70
+ screen.render();
71
+ });
62
72
  }
63
73
  bindKeys() {
64
74
  this.listBox.key(['up', 'k'], () => {
65
75
  if (this.manager.sessions.length === 0)
66
76
  return;
67
77
  this.moveSelection(-1);
68
- this.syncList();
69
- this.screen.render();
78
+ // syncList() と screen.render() は moveSelection() → selectSession() →
79
+ // emitSelection() → 'selection' イベント経由で自動的に呼ばれる
70
80
  });
71
81
  this.listBox.key(['down', 'j'], () => {
72
82
  if (this.manager.sessions.length === 0)
73
83
  return;
74
84
  this.moveSelection(1);
75
- this.syncList();
76
- this.screen.render();
85
+ // syncList() と screen.render() は moveSelection() → selectSession() →
86
+ // emitSelection() → 'selection' イベント経由で自動的に呼ばれる
77
87
  });
78
88
  this.listBox.key('n', () => {
79
89
  this.showAddPrompt();
@@ -116,33 +126,115 @@ export class OverviewUI {
116
126
  prompt.key('enter', () => {
117
127
  const selectedIdx = prompt.selected ?? 0;
118
128
  const selected = agentTypes[selectedIdx];
119
- close();
120
- const defaults = getAgentDefaults(selected);
121
- const { args, newSessionId } = resolveSessionArgs(selected, defaults.args, undefined, false);
122
- const session = this.manager.addSession({
123
- type: selected,
124
- cmd: defaults.cmd,
125
- args,
126
- cwd: process.cwd(),
127
- });
128
- session.baseArgs = defaults.args;
129
- if (newSessionId != null) {
130
- session.sessionId = newSessionId;
131
- }
132
- if (session.status === 'error') {
133
- this.manager.removeSession(session.id);
134
- this.showError(`'${defaults.cmd}' command not found.\nIs ${selected} installed?`);
135
- this.syncList();
136
- return;
137
- }
138
- this.manager.selectSession(this.manager.sessions.length - 1);
139
- this.syncList();
140
- this.onSessionCreated?.(session);
129
+ prompt.destroy();
130
+ this.screen.render();
131
+ this.showCwdPrompt(selected);
141
132
  });
142
133
  prompt.key('escape', close);
143
134
  prompt.focus();
144
135
  this.screen.render();
145
136
  }
137
+ showCwdPrompt(agentType) {
138
+ let value = process.cwd();
139
+ let candidateList = null;
140
+ const box = blessed.box({
141
+ parent: this.screen,
142
+ top: 'center',
143
+ left: 'center',
144
+ width: 60,
145
+ height: 3,
146
+ border: { type: 'line' },
147
+ label: ' cwd Tab:補完 Enter:確定 Esc:キャンセル ',
148
+ style: { border: { fg: 'green' } },
149
+ });
150
+ const renderInput = () => {
151
+ box.setContent(value);
152
+ this.screen.render();
153
+ };
154
+ const closeCandidates = () => {
155
+ if (candidateList) {
156
+ candidateList.destroy();
157
+ candidateList = null;
158
+ }
159
+ };
160
+ const cleanup = () => {
161
+ this.screen.removeListener('keypress', onKeypress);
162
+ closeCandidates();
163
+ this.promptOpen = false;
164
+ box.destroy();
165
+ this.listBox.focus();
166
+ this.screen.render();
167
+ };
168
+ const onKeypress = (_ch, key) => {
169
+ if (!key)
170
+ return;
171
+ closeCandidates();
172
+ if (key.name === 'enter' || key.name === 'return') {
173
+ const expanded = value.trim().replace(/^~/, process.env.HOME ?? '~') || process.cwd();
174
+ cleanup();
175
+ this.spawnAgent(agentType, expanded);
176
+ }
177
+ else if (key.name === 'escape') {
178
+ cleanup();
179
+ }
180
+ else if (key.name === 'tab') {
181
+ const { completed, candidates } = completePath(value);
182
+ value = completed;
183
+ if (candidates.length > 1) {
184
+ const maxVisible = Math.min(candidates.length, 8);
185
+ candidateList = blessed.list({
186
+ parent: this.screen,
187
+ top: '50%',
188
+ left: 'center',
189
+ width: 60,
190
+ height: maxVisible + 2,
191
+ border: { type: 'line' },
192
+ items: candidates,
193
+ keys: false,
194
+ style: { border: { fg: 'cyan' } },
195
+ });
196
+ }
197
+ renderInput();
198
+ }
199
+ else if (key.name === 'backspace') {
200
+ value = value.slice(0, -1);
201
+ renderInput();
202
+ }
203
+ else if (!key.ctrl && !key.meta && key.sequence?.length === 1) {
204
+ value += key.sequence;
205
+ renderInput();
206
+ }
207
+ };
208
+ // 現在のキーイベント(enter)がこのリスナーに届かないよう1tick遅らせる
209
+ setImmediate(() => {
210
+ this.screen.on('keypress', onKeypress);
211
+ });
212
+ box.focus();
213
+ renderInput();
214
+ }
215
+ spawnAgent(agentType, cwd) {
216
+ const defaults = getAgentDefaults(agentType);
217
+ const { args, newSessionId } = resolveSessionArgs(agentType, defaults.args, undefined, false);
218
+ const session = this.manager.addSession({
219
+ type: agentType,
220
+ cmd: defaults.cmd,
221
+ args,
222
+ cwd,
223
+ });
224
+ session.baseArgs = defaults.args;
225
+ if (newSessionId != null) {
226
+ session.sessionId = newSessionId;
227
+ }
228
+ if (session.status === 'error') {
229
+ this.manager.removeSession(session.id);
230
+ this.showError(`'${defaults.cmd}' command not found.\nIs ${agentType} installed?`);
231
+ this.syncList();
232
+ return;
233
+ }
234
+ this.manager.selectSession(this.manager.sessions.length - 1);
235
+ this.syncList();
236
+ this.onSessionCreated?.(session);
237
+ }
146
238
  showError(message) {
147
239
  const overlay = blessed.box({
148
240
  parent: this.screen,
@@ -170,23 +262,27 @@ export class OverviewUI {
170
262
  const items = [];
171
263
  const selectedId = this.manager.selectedSession?.id;
172
264
  let selectedDisplayIndex = -1;
173
- for (const group of OverviewUI.STATUS_GROUPS) {
174
- const sessions = orderedSessions.filter((session) => session.status === group.status);
175
- if (sessions.length === 0)
176
- continue;
177
- items.push(` ${group.label}`);
178
- for (const session of sessions) {
179
- const statusIcon = session.status === 'running' ? '⣾'
180
- : session.status === 'idle' ? '○'
181
- : session.status === 'done' ? '✓'
182
- : '';
183
- const sessionTitle = session.displayName ?? session.id;
184
- const sessionLabel = session.type ? `${sessionTitle} (${session.type})` : sessionTitle;
185
- const content = `${statusIcon} ${sessionLabel} ${this.getStatusLabel(session.status)}`;
186
- const color = OverviewUI.STATUS_COLORS[session.status];
187
- items.push(` {${color}-fg}${content}{/${color}-fg}`);
188
- if (session.id === selectedId) {
189
- selectedDisplayIndex = items.length - 1;
265
+ const cwdGroups = this.groupByCwd(orderedSessions);
266
+ for (const [cwd, sessions] of cwdGroups) {
267
+ items.push(` {bold}${this.shortenPath(cwd)}{/bold}`);
268
+ for (const group of OverviewUI.STATUS_GROUPS) {
269
+ const groupSessions = sessions.filter((s) => s.status === group.status);
270
+ if (groupSessions.length === 0)
271
+ continue;
272
+ items.push(` ${group.label}`);
273
+ for (const session of groupSessions) {
274
+ const statusIcon = session.status === 'running' ? '⣾'
275
+ : session.status === 'idle' ? '○'
276
+ : session.status === 'done' ? '✓'
277
+ : '✗';
278
+ const sessionTitle = session.displayName ?? session.id;
279
+ const sessionLabel = session.type ? `${sessionTitle} (${session.type})` : sessionTitle;
280
+ const content = `${statusIcon} ${sessionLabel} ${this.getStatusLabel(session.status)}`;
281
+ const color = OverviewUI.STATUS_COLORS[session.status];
282
+ items.push(` {${color}-fg}${content}{/${color}-fg}`);
283
+ if (session.id === selectedId) {
284
+ selectedDisplayIndex = items.length - 1;
285
+ }
190
286
  }
191
287
  }
192
288
  }
@@ -195,8 +291,30 @@ export class OverviewUI {
195
291
  this.listBox.select(selectedDisplayIndex);
196
292
  }
197
293
  }
294
+ groupByCwd(sessions) {
295
+ const map = new Map();
296
+ for (const session of sessions) {
297
+ const key = session.cwd ?? process.cwd();
298
+ if (!map.has(key))
299
+ map.set(key, []);
300
+ map.get(key).push(session);
301
+ }
302
+ return map;
303
+ }
304
+ shortenPath(p) {
305
+ const home = process.env.HOME;
306
+ if (home && p.startsWith(home)) {
307
+ return '~' + p.slice(home.length);
308
+ }
309
+ return p;
310
+ }
198
311
  getOrderedSessions() {
199
312
  return [...this.manager.sessions].sort((a, b) => {
313
+ const cwdA = a.cwd ?? process.cwd();
314
+ const cwdB = b.cwd ?? process.cwd();
315
+ const cwdDiff = cwdA.localeCompare(cwdB);
316
+ if (cwdDiff !== 0)
317
+ return cwdDiff;
200
318
  const rankDiff = this.getStatusRank(a.status) - this.getStatusRank(b.status);
201
319
  if (rankDiff !== 0)
202
320
  return rankDiff;
@@ -1 +1 @@
1
- {"version":3,"file":"overview.js","sourceRoot":"","sources":["../../../src/ui/overview.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"overview.js","sourceRoot":"","sources":["../../../src/ui/overview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface CompletionResult {
2
+ completed: string;
3
+ candidates: string[];
4
+ }
5
+ export declare function completePath(input: string): CompletionResult;
@@ -0,0 +1,51 @@
1
+ import { readdirSync } from 'node:fs';
2
+ import { join, dirname, basename } from 'node:path';
3
+ export function completePath(input) {
4
+ const expanded = input.replace(/^~/, process.env.HOME ?? '~');
5
+ const isAbsolute = expanded.startsWith('/');
6
+ const dir = isAbsolute || expanded.includes('/')
7
+ ? dirname(expanded)
8
+ : process.cwd();
9
+ const prefix = basename(expanded);
10
+ let entries;
11
+ try {
12
+ entries = readdirSync(dir, { withFileTypes: true })
13
+ .filter((e) => e.isDirectory() && e.name.startsWith(prefix))
14
+ .map((e) => join(dir, e.name) + '/');
15
+ }
16
+ catch {
17
+ return { completed: input, candidates: [] };
18
+ }
19
+ if (entries.length === 0) {
20
+ return { completed: input, candidates: [] };
21
+ }
22
+ if (entries.length === 1) {
23
+ return { completed: restoreHome(entries[0], input), candidates: [] };
24
+ }
25
+ const lcp = longestCommonPrefix(entries);
26
+ return {
27
+ completed: restoreHome(lcp, input),
28
+ candidates: entries.map((e) => restoreHome(e, input)),
29
+ };
30
+ }
31
+ function longestCommonPrefix(strs) {
32
+ if (strs.length === 0)
33
+ return '';
34
+ let prefix = strs[0];
35
+ for (let i = 1; i < strs.length; i++) {
36
+ while (!strs[i].startsWith(prefix)) {
37
+ prefix = prefix.slice(0, -1);
38
+ if (prefix === '')
39
+ return '';
40
+ }
41
+ }
42
+ return prefix;
43
+ }
44
+ function restoreHome(path, original) {
45
+ const home = process.env.HOME;
46
+ if (home && original.startsWith('~') && path.startsWith(home)) {
47
+ return '~' + path.slice(home.length);
48
+ }
49
+ return path;
50
+ }
51
+ //# sourceMappingURL=path-completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-completion.js","sourceRoot":"","sources":["../../../src/ui/path-completion.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@k1e1n04/mav",
3
- "version": "0.1.6",
3
+ "version": "0.1.18",
4
4
  "description": "Multi-agent view — manage multiple AI CLI sessions in one terminal",
5
5
  "type": "module",
6
6
  "bin": {
package/src/config.ts CHANGED
@@ -31,7 +31,7 @@ export function loadConfig(configPath: string): MavConfig {
31
31
  }
32
32
 
33
33
  const agents: AgentConfig[] = parsed.agents
34
- .filter((a): a is { type: string; cmd?: string; args?: string[]; resumeArgs?: string[] } =>
34
+ .filter((a): a is { type: string; cmd?: string; args?: string[]; cwd?: string; resumeArgs?: string[] } =>
35
35
  typeof a?.type === 'string' && a.type.length > 0
36
36
  )
37
37
  .map((a) => {
@@ -39,10 +39,14 @@ export function loadConfig(configPath: string): MavConfig {
39
39
  const cmd = typeof a.cmd === 'string' && a.cmd.trim().length > 0
40
40
  ? a.cmd
41
41
  : defaults.cmd
42
+ const cwd = typeof a.cwd === 'string' && a.cwd.trim().length > 0
43
+ ? a.cwd.replace(/^~/, process.env.HOME ?? '~')
44
+ : undefined
42
45
  return {
43
46
  type: a.type,
44
47
  cmd,
45
48
  args: Array.isArray(a.args) ? a.args : defaults.args,
49
+ cwd,
46
50
  resumeArgs: Array.isArray(a.resumeArgs) ? a.resumeArgs : defaults.resumeArgs,
47
51
  }
48
52
  })
@@ -3,6 +3,7 @@ import type { Widgets } from 'neo-blessed'
3
3
  import type { SessionManager } from '../session-manager.js'
4
4
  import type { AgentSession } from '../agent.js'
5
5
  import { getAgentDefaults, resolveSessionArgs } from '../agent-launch.js'
6
+ import { completePath } from './path-completion.js'
6
7
 
7
8
  export class OverviewUI {
8
9
  private static readonly STATUS_GROUPS = [
@@ -46,7 +47,9 @@ export class OverviewUI {
46
47
  selected: { bg: 'blue', fg: 'white' },
47
48
  border: { fg: 'cyan' },
48
49
  },
49
- keys: true,
50
+ // keys: true を設定すると blessed 組み込みの up()/down() もカスタムハンドラーと
51
+ // 同時に実行され、selected がヘッダー行(cwd名やステータスグループ名)に一時的に
52
+ // 移動してしまう競合が起きる。矢印キーはカスタムハンドラーのみで処理する。
50
53
  mouse: true,
51
54
  })
52
55
 
@@ -75,21 +78,29 @@ export class OverviewUI {
75
78
  this.syncList()
76
79
  screen.render()
77
80
  })
81
+
82
+ // removeSession() は emitSelection() を呼ぶが、OverviewUI は 'selection' を
83
+ // listen していないため、index.ts の exit ハンドラ経由で自動削除された場合に
84
+ // UI が再描画されない。'selection' を listen して確実に同期する。
85
+ manager.on('selection', () => {
86
+ this.syncList()
87
+ screen.render()
88
+ })
78
89
  }
79
90
 
80
91
  private bindKeys(): void {
81
92
  this.listBox.key(['up', 'k'], () => {
82
93
  if (this.manager.sessions.length === 0) return
83
94
  this.moveSelection(-1)
84
- this.syncList()
85
- this.screen.render()
95
+ // syncList() と screen.render() は moveSelection() → selectSession() →
96
+ // emitSelection() → 'selection' イベント経由で自動的に呼ばれる
86
97
  })
87
98
 
88
99
  this.listBox.key(['down', 'j'], () => {
89
100
  if (this.manager.sessions.length === 0) return
90
101
  this.moveSelection(1)
91
- this.syncList()
92
- this.screen.render()
102
+ // syncList() と screen.render() は moveSelection() → selectSession() →
103
+ // emitSelection() → 'selection' イベント経由で自動的に呼ばれる
93
104
  })
94
105
 
95
106
  this.listBox.key('n', () => {
@@ -138,37 +149,122 @@ export class OverviewUI {
138
149
  prompt.key('enter', () => {
139
150
  const selectedIdx = (prompt as unknown as { selected: number }).selected ?? 0
140
151
  const selected = agentTypes[selectedIdx]!
141
- close()
142
-
143
- const defaults = getAgentDefaults(selected)
144
- const { args, newSessionId } = resolveSessionArgs(selected, defaults.args, undefined, false)
145
- const session = this.manager.addSession({
146
- type: selected,
147
- cmd: defaults.cmd,
148
- args,
149
- cwd: process.cwd(),
150
- }) as AgentSession & { sessionId?: string }
151
- session.baseArgs = defaults.args
152
- if (newSessionId != null) {
153
- session.sessionId = newSessionId
152
+ prompt.destroy()
153
+ this.screen.render()
154
+ this.showCwdPrompt(selected)
155
+ })
156
+
157
+ prompt.key('escape', close)
158
+
159
+ prompt.focus()
160
+ this.screen.render()
161
+ }
162
+
163
+ private showCwdPrompt(agentType: string): void {
164
+ let value = process.cwd()
165
+ let candidateList: Widgets.ListElement | null = null
166
+
167
+ const box = blessed.box({
168
+ parent: this.screen,
169
+ top: 'center',
170
+ left: 'center',
171
+ width: 60,
172
+ height: 3,
173
+ border: { type: 'line' },
174
+ label: ' cwd Tab:補完 Enter:確定 Esc:キャンセル ',
175
+ style: { border: { fg: 'green' } },
176
+ })
177
+
178
+ const renderInput = () => {
179
+ box.setContent(value)
180
+ this.screen.render()
181
+ }
182
+
183
+ const closeCandidates = () => {
184
+ if (candidateList) {
185
+ candidateList.destroy()
186
+ candidateList = null
154
187
  }
188
+ }
155
189
 
156
- if (session.status === 'error') {
157
- this.manager.removeSession(session.id)
158
- this.showError(`'${defaults.cmd}' command not found.\nIs ${selected} installed?`)
159
- this.syncList()
160
- return
190
+ const cleanup = () => {
191
+ this.screen.removeListener('keypress', onKeypress)
192
+ closeCandidates()
193
+ this.promptOpen = false
194
+ box.destroy()
195
+ this.listBox.focus()
196
+ this.screen.render()
197
+ }
198
+
199
+ const onKeypress = (_ch: string, key: { name: string; ctrl?: boolean; meta?: boolean; sequence?: string }) => {
200
+ if (!key) return
201
+ closeCandidates()
202
+
203
+ if (key.name === 'enter' || key.name === 'return') {
204
+ const expanded = value.trim().replace(/^~/, process.env.HOME ?? '~') || process.cwd()
205
+ cleanup()
206
+ this.spawnAgent(agentType, expanded)
207
+ } else if (key.name === 'escape') {
208
+ cleanup()
209
+ } else if (key.name === 'tab') {
210
+ const { completed, candidates } = completePath(value)
211
+ value = completed
212
+ if (candidates.length > 1) {
213
+ const maxVisible = Math.min(candidates.length, 8)
214
+ candidateList = blessed.list({
215
+ parent: this.screen,
216
+ top: '50%',
217
+ left: 'center',
218
+ width: 60,
219
+ height: maxVisible + 2,
220
+ border: { type: 'line' },
221
+ items: candidates,
222
+ keys: false,
223
+ style: { border: { fg: 'cyan' } },
224
+ }) as Widgets.ListElement
225
+ }
226
+ renderInput()
227
+ } else if (key.name === 'backspace') {
228
+ value = value.slice(0, -1)
229
+ renderInput()
230
+ } else if (!key.ctrl && !key.meta && key.sequence?.length === 1) {
231
+ value += key.sequence
232
+ renderInput()
161
233
  }
234
+ }
162
235
 
163
- this.manager.selectSession(this.manager.sessions.length - 1)
164
- this.syncList()
165
- this.onSessionCreated?.(session)
236
+ // 現在のキーイベント(enter)がこのリスナーに届かないよう1tick遅らせる
237
+ setImmediate(() => {
238
+ this.screen.on('keypress', onKeypress)
166
239
  })
240
+ box.focus()
241
+ renderInput()
242
+ }
167
243
 
168
- prompt.key('escape', close)
244
+ private spawnAgent(agentType: string, cwd: string): void {
245
+ const defaults = getAgentDefaults(agentType)
246
+ const { args, newSessionId } = resolveSessionArgs(agentType, defaults.args, undefined, false)
247
+ const session = this.manager.addSession({
248
+ type: agentType,
249
+ cmd: defaults.cmd,
250
+ args,
251
+ cwd,
252
+ }) as AgentSession & { sessionId?: string }
253
+ session.baseArgs = defaults.args
254
+ if (newSessionId != null) {
255
+ session.sessionId = newSessionId
256
+ }
169
257
 
170
- prompt.focus()
171
- this.screen.render()
258
+ if (session.status === 'error') {
259
+ this.manager.removeSession(session.id)
260
+ this.showError(`'${defaults.cmd}' command not found.\nIs ${agentType} installed?`)
261
+ this.syncList()
262
+ return
263
+ }
264
+
265
+ this.manager.selectSession(this.manager.sessions.length - 1)
266
+ this.syncList()
267
+ this.onSessionCreated?.(session)
172
268
  }
173
269
 
174
270
  private showError(message: string): void {
@@ -201,24 +297,29 @@ export class OverviewUI {
201
297
  const selectedId = this.manager.selectedSession?.id
202
298
  let selectedDisplayIndex = -1
203
299
 
204
- for (const group of OverviewUI.STATUS_GROUPS) {
205
- const sessions = orderedSessions.filter((session) => session.status === group.status)
206
- if (sessions.length === 0) continue
207
-
208
- items.push(` ${group.label}`)
209
- for (const session of sessions) {
210
- const statusIcon =
211
- session.status === 'running' ? '⣾'
212
- : session.status === 'idle' ? '○'
213
- : session.status === 'done' ? '✓'
214
- : '✗'
215
- const sessionTitle = session.displayName ?? session.id
216
- const sessionLabel = session.type ? `${sessionTitle} (${session.type})` : sessionTitle
217
- const content = `${statusIcon} ${sessionLabel} ${this.getStatusLabel(session.status)}`
218
- const color = OverviewUI.STATUS_COLORS[session.status]
219
- items.push(` {${color}-fg}${content}{/${color}-fg}`)
220
- if (session.id === selectedId) {
221
- selectedDisplayIndex = items.length - 1
300
+ const cwdGroups = this.groupByCwd(orderedSessions)
301
+ for (const [cwd, sessions] of cwdGroups) {
302
+ items.push(` {bold}${this.shortenPath(cwd)}{/bold}`)
303
+
304
+ for (const group of OverviewUI.STATUS_GROUPS) {
305
+ const groupSessions = sessions.filter((s) => s.status === group.status)
306
+ if (groupSessions.length === 0) continue
307
+
308
+ items.push(` ${group.label}`)
309
+ for (const session of groupSessions) {
310
+ const statusIcon =
311
+ session.status === 'running' ? '⣾'
312
+ : session.status === 'idle' ? '○'
313
+ : session.status === 'done' ? '✓'
314
+ : '✗'
315
+ const sessionTitle = session.displayName ?? session.id
316
+ const sessionLabel = session.type ? `${sessionTitle} (${session.type})` : sessionTitle
317
+ const content = `${statusIcon} ${sessionLabel} ${this.getStatusLabel(session.status)}`
318
+ const color = OverviewUI.STATUS_COLORS[session.status]
319
+ items.push(` {${color}-fg}${content}{/${color}-fg}`)
320
+ if (session.id === selectedId) {
321
+ selectedDisplayIndex = items.length - 1
322
+ }
222
323
  }
223
324
  }
224
325
  }
@@ -229,8 +330,30 @@ export class OverviewUI {
229
330
  }
230
331
  }
231
332
 
333
+ private groupByCwd(sessions: SessionManager['sessions']): Map<string, SessionManager['sessions']> {
334
+ const map = new Map<string, SessionManager['sessions']>()
335
+ for (const session of sessions) {
336
+ const key = session.cwd ?? process.cwd()
337
+ if (!map.has(key)) map.set(key, [])
338
+ map.get(key)!.push(session)
339
+ }
340
+ return map
341
+ }
342
+
343
+ private shortenPath(p: string): string {
344
+ const home = process.env.HOME
345
+ if (home && p.startsWith(home)) {
346
+ return '~' + p.slice(home.length)
347
+ }
348
+ return p
349
+ }
350
+
232
351
  private getOrderedSessions(): SessionManager['sessions'] {
233
352
  return [...this.manager.sessions].sort((a, b) => {
353
+ const cwdA = a.cwd ?? process.cwd()
354
+ const cwdB = b.cwd ?? process.cwd()
355
+ const cwdDiff = cwdA.localeCompare(cwdB)
356
+ if (cwdDiff !== 0) return cwdDiff
234
357
  const rankDiff = this.getStatusRank(a.status) - this.getStatusRank(b.status)
235
358
  if (rankDiff !== 0) return rankDiff
236
359
  return a.id.localeCompare(b.id)
@@ -0,0 +1,59 @@
1
+ import { readdirSync } from 'node:fs'
2
+ import { join, dirname, basename } from 'node:path'
3
+
4
+ export interface CompletionResult {
5
+ completed: string
6
+ candidates: string[]
7
+ }
8
+
9
+ export function completePath(input: string): CompletionResult {
10
+ const expanded = input.replace(/^~/, process.env.HOME ?? '~')
11
+ const isAbsolute = expanded.startsWith('/')
12
+ const dir = isAbsolute || expanded.includes('/')
13
+ ? dirname(expanded)
14
+ : process.cwd()
15
+ const prefix = basename(expanded)
16
+
17
+ let entries: string[]
18
+ try {
19
+ entries = readdirSync(dir, { withFileTypes: true })
20
+ .filter((e) => e.isDirectory() && e.name.startsWith(prefix))
21
+ .map((e) => join(dir, e.name) + '/')
22
+ } catch {
23
+ return { completed: input, candidates: [] }
24
+ }
25
+
26
+ if (entries.length === 0) {
27
+ return { completed: input, candidates: [] }
28
+ }
29
+
30
+ if (entries.length === 1) {
31
+ return { completed: restoreHome(entries[0]!, input), candidates: [] }
32
+ }
33
+
34
+ const lcp = longestCommonPrefix(entries)
35
+ return {
36
+ completed: restoreHome(lcp, input),
37
+ candidates: entries.map((e) => restoreHome(e, input)),
38
+ }
39
+ }
40
+
41
+ function longestCommonPrefix(strs: string[]): string {
42
+ if (strs.length === 0) return ''
43
+ let prefix = strs[0]!
44
+ for (let i = 1; i < strs.length; i++) {
45
+ while (!strs[i]!.startsWith(prefix)) {
46
+ prefix = prefix.slice(0, -1)
47
+ if (prefix === '') return ''
48
+ }
49
+ }
50
+ return prefix
51
+ }
52
+
53
+ function restoreHome(path: string, original: string): string {
54
+ const home = process.env.HOME
55
+ if (home && original.startsWith('~') && path.startsWith(home)) {
56
+ return '~' + path.slice(home.length)
57
+ }
58
+ return path
59
+ }