@a5c-ai/agent-mux-tui 0.3.0 → 0.4.1

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 (152) hide show
  1. package/README.md +24 -0
  2. package/dist/app.d.ts.map +1 -1
  3. package/dist/app.js +378 -12
  4. package/dist/app.js.map +1 -1
  5. package/dist/bin/amux-tui.js +2 -1
  6. package/dist/bin/amux-tui.js.map +1 -1
  7. package/dist/command-palette.d.ts +15 -0
  8. package/dist/command-palette.d.ts.map +1 -0
  9. package/dist/command-palette.js +65 -0
  10. package/dist/command-palette.js.map +1 -0
  11. package/dist/event-stream.d.ts +3 -0
  12. package/dist/event-stream.d.ts.map +1 -1
  13. package/dist/event-stream.js +18 -0
  14. package/dist/event-stream.js.map +1 -1
  15. package/dist/external-plugins.d.ts +11 -0
  16. package/dist/external-plugins.d.ts.map +1 -0
  17. package/dist/external-plugins.js +79 -0
  18. package/dist/external-plugins.js.map +1 -0
  19. package/dist/index.d.ts +1 -0
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +53 -0
  22. package/dist/index.js.map +1 -1
  23. package/dist/model-picker.d.ts +11 -0
  24. package/dist/model-picker.d.ts.map +1 -0
  25. package/dist/model-picker.js +45 -0
  26. package/dist/model-picker.js.map +1 -0
  27. package/dist/plugin.d.ts +22 -0
  28. package/dist/plugin.d.ts.map +1 -1
  29. package/dist/plugin.js.map +1 -1
  30. package/dist/plugins/adapters-view.d.ts +3 -0
  31. package/dist/plugins/adapters-view.d.ts.map +1 -0
  32. package/dist/plugins/adapters-view.js +38 -0
  33. package/dist/plugins/adapters-view.js.map +1 -0
  34. package/dist/plugins/agents-view.d.ts +3 -0
  35. package/dist/plugins/agents-view.d.ts.map +1 -0
  36. package/dist/plugins/agents-view.js +190 -0
  37. package/dist/plugins/agents-view.js.map +1 -0
  38. package/dist/plugins/approval.d.ts +16 -0
  39. package/dist/plugins/approval.d.ts.map +1 -0
  40. package/dist/plugins/approval.js +50 -0
  41. package/dist/plugins/approval.js.map +1 -0
  42. package/dist/plugins/auth-view.d.ts +3 -0
  43. package/dist/plugins/auth-view.d.ts.map +1 -0
  44. package/dist/plugins/auth-view.js +66 -0
  45. package/dist/plugins/auth-view.js.map +1 -0
  46. package/dist/plugins/chat-view.d.ts +1 -1
  47. package/dist/plugins/chat-view.d.ts.map +1 -1
  48. package/dist/plugins/chat-view.js +41 -5
  49. package/dist/plugins/chat-view.js.map +1 -1
  50. package/dist/plugins/config-view.d.ts +3 -0
  51. package/dist/plugins/config-view.d.ts.map +1 -0
  52. package/dist/plugins/config-view.js +63 -0
  53. package/dist/plugins/config-view.js.map +1 -0
  54. package/dist/plugins/control.d.ts +7 -0
  55. package/dist/plugins/control.d.ts.map +1 -0
  56. package/dist/plugins/control.js +70 -0
  57. package/dist/plugins/control.js.map +1 -0
  58. package/dist/plugins/cost-alerts.d.ts +4 -0
  59. package/dist/plugins/cost-alerts.d.ts.map +1 -0
  60. package/dist/plugins/cost-alerts.js +38 -0
  61. package/dist/plugins/cost-alerts.js.map +1 -0
  62. package/dist/plugins/cost-view.d.ts +3 -0
  63. package/dist/plugins/cost-view.d.ts.map +1 -0
  64. package/dist/plugins/cost-view.js +63 -0
  65. package/dist/plugins/cost-view.js.map +1 -0
  66. package/dist/plugins/doctor-view.d.ts +3 -0
  67. package/dist/plugins/doctor-view.d.ts.map +1 -0
  68. package/dist/plugins/doctor-view.js +58 -0
  69. package/dist/plugins/doctor-view.js.map +1 -0
  70. package/dist/plugins/file-ops.d.ts +16 -0
  71. package/dist/plugins/file-ops.d.ts.map +1 -0
  72. package/dist/plugins/file-ops.js +49 -0
  73. package/dist/plugins/file-ops.js.map +1 -0
  74. package/dist/plugins/help-view.d.ts +3 -0
  75. package/dist/plugins/help-view.d.ts.map +1 -0
  76. package/dist/plugins/help-view.js +44 -0
  77. package/dist/plugins/help-view.js.map +1 -0
  78. package/dist/plugins/hooks-view.d.ts +3 -0
  79. package/dist/plugins/hooks-view.d.ts.map +1 -0
  80. package/dist/plugins/hooks-view.js +186 -0
  81. package/dist/plugins/hooks-view.js.map +1 -0
  82. package/dist/plugins/image.d.ts +10 -0
  83. package/dist/plugins/image.d.ts.map +1 -0
  84. package/dist/plugins/image.js +30 -0
  85. package/dist/plugins/image.js.map +1 -0
  86. package/dist/plugins/lifecycle.d.ts +7 -0
  87. package/dist/plugins/lifecycle.d.ts.map +1 -0
  88. package/dist/plugins/lifecycle.js +46 -0
  89. package/dist/plugins/lifecycle.js.map +1 -0
  90. package/dist/plugins/mcp-view.d.ts +3 -0
  91. package/dist/plugins/mcp-view.d.ts.map +1 -0
  92. package/dist/plugins/mcp-view.js +63 -0
  93. package/dist/plugins/mcp-view.js.map +1 -0
  94. package/dist/plugins/mcp.d.ts +13 -0
  95. package/dist/plugins/mcp.d.ts.map +1 -0
  96. package/dist/plugins/mcp.js +39 -0
  97. package/dist/plugins/mcp.js.map +1 -0
  98. package/dist/plugins/models-view.d.ts +3 -0
  99. package/dist/plugins/models-view.d.ts.map +1 -0
  100. package/dist/plugins/models-view.js +39 -0
  101. package/dist/plugins/models-view.js.map +1 -0
  102. package/dist/plugins/observability-view.d.ts +3 -0
  103. package/dist/plugins/observability-view.d.ts.map +1 -0
  104. package/dist/plugins/observability-view.js +89 -0
  105. package/dist/plugins/observability-view.js.map +1 -0
  106. package/dist/plugins/plugin-skill.d.ts +22 -0
  107. package/dist/plugins/plugin-skill.d.ts.map +1 -0
  108. package/dist/plugins/plugin-skill.js +45 -0
  109. package/dist/plugins/plugin-skill.js.map +1 -0
  110. package/dist/plugins/plugins-view.d.ts +3 -0
  111. package/dist/plugins/plugins-view.d.ts.map +1 -0
  112. package/dist/plugins/plugins-view.js +68 -0
  113. package/dist/plugins/plugins-view.js.map +1 -0
  114. package/dist/plugins/profiles-view.d.ts +3 -0
  115. package/dist/plugins/profiles-view.d.ts.map +1 -0
  116. package/dist/plugins/profiles-view.js +44 -0
  117. package/dist/plugins/profiles-view.js.map +1 -0
  118. package/dist/plugins/session-detail-view.d.ts +5 -0
  119. package/dist/plugins/session-detail-view.d.ts.map +1 -0
  120. package/dist/plugins/session-detail-view.js +101 -0
  121. package/dist/plugins/session-detail-view.js.map +1 -0
  122. package/dist/plugins/session-lifecycle.d.ts +7 -0
  123. package/dist/plugins/session-lifecycle.d.ts.map +1 -0
  124. package/dist/plugins/session-lifecycle.js +37 -0
  125. package/dist/plugins/session-lifecycle.js.map +1 -0
  126. package/dist/plugins/sessions-view.d.ts.map +1 -1
  127. package/dist/plugins/sessions-view.js +62 -14
  128. package/dist/plugins/sessions-view.js.map +1 -1
  129. package/dist/plugins/shell.d.ts +16 -0
  130. package/dist/plugins/shell.d.ts.map +1 -0
  131. package/dist/plugins/shell.js +50 -0
  132. package/dist/plugins/shell.js.map +1 -0
  133. package/dist/plugins/skills-view.d.ts +3 -0
  134. package/dist/plugins/skills-view.d.ts.map +1 -0
  135. package/dist/plugins/skills-view.js +189 -0
  136. package/dist/plugins/skills-view.js.map +1 -0
  137. package/dist/plugins/subagent.d.ts +13 -0
  138. package/dist/plugins/subagent.d.ts.map +1 -0
  139. package/dist/plugins/subagent.js +40 -0
  140. package/dist/plugins/subagent.js.map +1 -0
  141. package/dist/plugins/tool-call.d.ts.map +1 -1
  142. package/dist/plugins/tool-call.js +29 -2
  143. package/dist/plugins/tool-call.js.map +1 -1
  144. package/dist/prompt-history-store.d.ts +4 -0
  145. package/dist/prompt-history-store.d.ts.map +1 -0
  146. package/dist/prompt-history-store.js +42 -0
  147. package/dist/prompt-history-store.js.map +1 -0
  148. package/dist/prompt-input.d.ts +6 -1
  149. package/dist/prompt-input.d.ts.map +1 -1
  150. package/dist/prompt-input.js +43 -2
  151. package/dist/prompt-input.js.map +1 -1
  152. package/package.json +3 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-palette.js","sourceRoot":"","sources":["../src/command-palette.tsx"],"names":[],"mappings":"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"}
@@ -3,8 +3,11 @@ export type EventSubscriber = (event: AgentEvent) => void;
3
3
  export type Unsubscribe = () => void;
4
4
  export declare class EventStream {
5
5
  private subscribers;
6
+ private resetSubs;
6
7
  private buffer;
7
8
  private maxBuffer;
9
+ onReset(fn: () => void): Unsubscribe;
10
+ reset(): void;
8
11
  constructor(maxBuffer?: number);
9
12
  subscribe(fn: EventSubscriber): Unsubscribe;
10
13
  push(event: AgentEvent): void;
@@ -1 +1 @@
1
- {"version":3,"file":"event-stream.d.ts","sourceRoot":"","sources":["../src/event-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;AAC1D,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;AAErC,qBAAa,WAAW;IACtB,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,SAAO;IAI5B,SAAS,CAAC,EAAE,EAAE,eAAe,GAAG,WAAW;IAO3C,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAY7B,QAAQ,IAAI,SAAS,UAAU,EAAE;IAIjC,KAAK,IAAI,IAAI;CAGd"}
1
+ {"version":3,"file":"event-stream.d.ts","sourceRoot":"","sources":["../src/event-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;AAC1D,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;AAErC,qBAAa,WAAW;IACtB,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,WAAW;IAOpC,KAAK,IAAI,IAAI;gBAWD,SAAS,SAAO;IAI5B,SAAS,CAAC,EAAE,EAAE,eAAe,GAAG,WAAW;IAO3C,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAY7B,QAAQ,IAAI,SAAS,UAAU,EAAE;IAIjC,KAAK,IAAI,IAAI;CAGd"}
@@ -1,7 +1,25 @@
1
1
  export class EventStream {
2
2
  subscribers = new Set();
3
+ resetSubs = new Set();
3
4
  buffer = [];
4
5
  maxBuffer;
6
+ onReset(fn) {
7
+ this.resetSubs.add(fn);
8
+ return () => {
9
+ this.resetSubs.delete(fn);
10
+ };
11
+ }
12
+ reset() {
13
+ this.buffer = [];
14
+ for (const fn of this.resetSubs) {
15
+ try {
16
+ fn();
17
+ }
18
+ catch {
19
+ // subscriber errors must not break the reset
20
+ }
21
+ }
22
+ }
5
23
  constructor(maxBuffer = 1000) {
6
24
  this.maxBuffer = maxBuffer;
7
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"event-stream.js","sourceRoot":"","sources":["../src/event-stream.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,WAAW;IACd,WAAW,GAAyB,IAAI,GAAG,EAAE,CAAC;IAC9C,MAAM,GAAiB,EAAE,CAAC;IAC1B,SAAS,CAAS;IAE1B,YAAY,SAAS,GAAG,IAAI;QAC1B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,SAAS,CAAC,EAAmB;QAC3B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzB,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9B,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,KAAiB;QACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC7D,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,EAAE,CAAC,KAAK,CAAC,CAAC;YACZ,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;YAChD,CAAC;QACH,CAAC;IACH,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB,CAAC;CACF"}
1
+ {"version":3,"file":"event-stream.js","sourceRoot":"","sources":["../src/event-stream.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,WAAW;IACd,WAAW,GAAyB,IAAI,GAAG,EAAE,CAAC;IAC9C,SAAS,GAAoB,IAAI,GAAG,EAAE,CAAC;IACvC,MAAM,GAAiB,EAAE,CAAC;IAC1B,SAAS,CAAS;IAE1B,OAAO,CAAC,EAAc;QACpB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvB,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC,CAAC;IACJ,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,EAAE,EAAE,CAAC;YACP,CAAC;YAAC,MAAM,CAAC;gBACP,6CAA6C;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IAED,YAAY,SAAS,GAAG,IAAI;QAC1B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,SAAS,CAAC,EAAmB;QAC3B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzB,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9B,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,KAAiB;QACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC7D,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,EAAE,CAAC,KAAK,CAAC,CAAC;YACZ,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;YAChD,CAAC;QACH,CAAC;IACH,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import type { TuiPlugin } from './plugin.js';
2
+ export declare function defaultExternalPluginsDir(): string;
3
+ export interface LoadResult {
4
+ plugins: TuiPlugin[];
5
+ errors: {
6
+ source: string;
7
+ error: string;
8
+ }[];
9
+ }
10
+ export declare function loadExternalPlugins(dir?: string): Promise<LoadResult>;
11
+ //# sourceMappingURL=external-plugins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-plugins.d.ts","sourceRoot":"","sources":["../src/external-plugins.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,wBAAgB,yBAAyB,IAAI,MAAM,CAIlD;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC7C;AAgDD,wBAAsB,mBAAmB,CACvC,GAAG,GAAE,MAAoC,GACxC,OAAO,CAAC,UAAU,CAAC,CAgBrB"}
@@ -0,0 +1,79 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import * as os from 'node:os';
4
+ import { pathToFileURL } from 'node:url';
5
+ export function defaultExternalPluginsDir() {
6
+ if (process.env.AMUX_TUI_PLUGINS_DIR)
7
+ return process.env.AMUX_TUI_PLUGINS_DIR;
8
+ const home = os.homedir() || '.';
9
+ return path.join(home, '.amux', 'tui-plugins');
10
+ }
11
+ function isPlugin(value) {
12
+ if (!value || typeof value !== 'object')
13
+ return false;
14
+ const v = value;
15
+ return typeof v.name === 'string' && typeof v.register === 'function';
16
+ }
17
+ async function importEntry(entry) {
18
+ const url = pathToFileURL(entry).href;
19
+ const mod = (await import(url));
20
+ const collected = [];
21
+ if (isPlugin(mod.default))
22
+ collected.push(mod.default);
23
+ for (const key of Object.keys(mod)) {
24
+ if (key === 'default')
25
+ continue;
26
+ const v = mod[key];
27
+ if (isPlugin(v))
28
+ collected.push(v);
29
+ }
30
+ return collected;
31
+ }
32
+ function findEntryFiles(dir) {
33
+ if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory())
34
+ return [];
35
+ const entries = [];
36
+ for (const name of fs.readdirSync(dir)) {
37
+ const full = path.join(dir, name);
38
+ let stat;
39
+ try {
40
+ stat = fs.statSync(full);
41
+ }
42
+ catch {
43
+ continue;
44
+ }
45
+ if (stat.isFile() && /\.(mjs|cjs|js)$/.test(name)) {
46
+ entries.push(full);
47
+ }
48
+ else if (stat.isDirectory()) {
49
+ const candidates = ['index.mjs', 'index.cjs', 'index.js'];
50
+ for (const c of candidates) {
51
+ const candidate = path.join(full, c);
52
+ if (fs.existsSync(candidate)) {
53
+ entries.push(candidate);
54
+ break;
55
+ }
56
+ }
57
+ }
58
+ }
59
+ return entries;
60
+ }
61
+ export async function loadExternalPlugins(dir = defaultExternalPluginsDir()) {
62
+ const result = { plugins: [], errors: [] };
63
+ const entries = findEntryFiles(dir);
64
+ for (const entry of entries) {
65
+ try {
66
+ const found = await importEntry(entry);
67
+ if (found.length === 0) {
68
+ result.errors.push({ source: entry, error: 'no TuiPlugin export found' });
69
+ continue;
70
+ }
71
+ result.plugins.push(...found);
72
+ }
73
+ catch (e) {
74
+ result.errors.push({ source: entry, error: e.message ?? String(e) });
75
+ }
76
+ }
77
+ return result;
78
+ }
79
+ //# sourceMappingURL=external-plugins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-plugins.js","sourceRoot":"","sources":["../src/external-plugins.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -4,6 +4,7 @@ export type { Registry } from './registry.js';
4
4
  export { EventStream } from './event-stream.js';
5
5
  export type { EventSubscriber, Unsubscribe } from './event-stream.js';
6
6
  export { PromptInput } from './prompt-input.js';
7
+ export { loadExternalPlugins, defaultExternalPluginsDir, type LoadResult as ExternalPluginsLoadResult, } from './external-plugins.js';
7
8
  export * from './plugin.js';
8
9
  import type { TuiPlugin } from './plugin.js';
9
10
  export declare const builtinPlugins: TuiPlugin[];
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC3E,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,cAAc,aAAa,CAAC;AAS5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,eAAO,MAAM,cAAc,EAAE,SAAS,EAQrC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC3E,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,KAAK,UAAU,IAAI,yBAAyB,GAC7C,MAAM,uBAAuB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAmC5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,eAAO,MAAM,cAAc,EAAE,SAAS,EAkCrC,CAAC"}
package/dist/index.js CHANGED
@@ -2,23 +2,76 @@ export { App } from './app.js';
2
2
  export { createRegistry, createContext, loadPlugins } from './registry.js';
3
3
  export { EventStream } from './event-stream.js';
4
4
  export { PromptInput } from './prompt-input.js';
5
+ export { loadExternalPlugins, defaultExternalPluginsDir, } from './external-plugins.js';
5
6
  export * from './plugin.js';
6
7
  import textDelta from './plugins/text-delta.js';
7
8
  import toolCall from './plugins/tool-call.js';
8
9
  import cost from './plugins/cost.js';
10
+ import costAlerts from './plugins/cost-alerts.js';
9
11
  import chatView from './plugins/chat-view.js';
10
12
  import sessionsView from './plugins/sessions-view.js';
13
+ import sessionDetailView from './plugins/session-detail-view.js';
14
+ import costView from './plugins/cost-view.js';
11
15
  import fallback from './plugins/fallback.js';
12
16
  import diff from './plugins/diff.js';
17
+ import shell from './plugins/shell.js';
18
+ import mcp from './plugins/mcp.js';
19
+ import subagent from './plugins/subagent.js';
20
+ import fileOps from './plugins/file-ops.js';
21
+ import sessionLifecycle from './plugins/session-lifecycle.js';
22
+ import approval from './plugins/approval.js';
23
+ import pluginSkill from './plugins/plugin-skill.js';
24
+ import image from './plugins/image.js';
25
+ import control from './plugins/control.js';
26
+ import lifecycle from './plugins/lifecycle.js';
27
+ import adaptersView from './plugins/adapters-view.js';
28
+ import modelsView from './plugins/models-view.js';
29
+ import profilesView from './plugins/profiles-view.js';
30
+ import pluginsView from './plugins/plugins-view.js';
31
+ import helpView from './plugins/help-view.js';
32
+ import mcpView from './plugins/mcp-view.js';
33
+ import doctorView from './plugins/doctor-view.js';
34
+ import authView from './plugins/auth-view.js';
35
+ import configView from './plugins/config-view.js';
36
+ import skillsView from './plugins/skills-view.js';
37
+ import agentsView from './plugins/agents-view.js';
38
+ import hooksView from './plugins/hooks-view.js';
39
+ import observabilityView from './plugins/observability-view.js';
13
40
  // Order matters: specific renderers first, fallback LAST so it only matches
14
41
  // when nothing else did (chat-view's pickRenderers enforces this).
15
42
  export const builtinPlugins = [
16
43
  textDelta,
17
44
  toolCall,
18
45
  diff,
46
+ shell,
47
+ mcp,
48
+ subagent,
49
+ fileOps,
50
+ sessionLifecycle,
51
+ approval,
52
+ pluginSkill,
53
+ image,
54
+ control,
55
+ lifecycle,
19
56
  cost,
57
+ costAlerts,
20
58
  chatView,
21
59
  sessionsView,
60
+ sessionDetailView,
61
+ costView,
62
+ adaptersView,
63
+ modelsView,
64
+ profilesView,
65
+ pluginsView,
66
+ helpView,
67
+ mcpView,
68
+ doctorView,
69
+ authView,
70
+ configView,
71
+ skillsView,
72
+ agentsView,
73
+ hooksView,
74
+ observabilityView,
22
75
  fallback,
23
76
  ];
24
77
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE3E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,cAAc,aAAa,CAAC;AAE5B,OAAO,SAAS,MAAM,yBAAyB,CAAC;AAChD,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,IAAI,MAAM,mBAAmB,CAAC;AACrC,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,YAAY,MAAM,4BAA4B,CAAC;AACtD,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAC7C,OAAO,IAAI,MAAM,mBAAmB,CAAC;AAGrC,4EAA4E;AAC5E,mEAAmE;AACnE,MAAM,CAAC,MAAM,cAAc,GAAgB;IACzC,SAAS;IACT,QAAQ;IACR,IAAI;IACJ,IAAI;IACJ,QAAQ;IACR,YAAY;IACZ,QAAQ;CACT,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE3E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,mBAAmB,EACnB,yBAAyB,GAE1B,MAAM,uBAAuB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAE5B,OAAO,SAAS,MAAM,yBAAyB,CAAC;AAChD,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,IAAI,MAAM,mBAAmB,CAAC;AACrC,OAAO,UAAU,MAAM,0BAA0B,CAAC;AAClD,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,YAAY,MAAM,4BAA4B,CAAC;AACtD,OAAO,iBAAiB,MAAM,kCAAkC,CAAC;AACjE,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAC7C,OAAO,IAAI,MAAM,mBAAmB,CAAC;AACrC,OAAO,KAAK,MAAM,oBAAoB,CAAC;AACvC,OAAO,GAAG,MAAM,kBAAkB,CAAC;AACnC,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAC7C,OAAO,OAAO,MAAM,uBAAuB,CAAC;AAC5C,OAAO,gBAAgB,MAAM,gCAAgC,CAAC;AAC9D,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAC7C,OAAO,WAAW,MAAM,2BAA2B,CAAC;AACpD,OAAO,KAAK,MAAM,oBAAoB,CAAC;AACvC,OAAO,OAAO,MAAM,sBAAsB,CAAC;AAC3C,OAAO,SAAS,MAAM,wBAAwB,CAAC;AAC/C,OAAO,YAAY,MAAM,4BAA4B,CAAC;AACtD,OAAO,UAAU,MAAM,0BAA0B,CAAC;AAClD,OAAO,YAAY,MAAM,4BAA4B,CAAC;AACtD,OAAO,WAAW,MAAM,2BAA2B,CAAC;AACpD,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,OAAO,MAAM,uBAAuB,CAAC;AAC5C,OAAO,UAAU,MAAM,0BAA0B,CAAC;AAClD,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,UAAU,MAAM,0BAA0B,CAAC;AAClD,OAAO,UAAU,MAAM,0BAA0B,CAAC;AAClD,OAAO,UAAU,MAAM,0BAA0B,CAAC;AAClD,OAAO,SAAS,MAAM,yBAAyB,CAAC;AAChD,OAAO,iBAAiB,MAAM,iCAAiC,CAAC;AAGhE,4EAA4E;AAC5E,mEAAmE;AACnE,MAAM,CAAC,MAAM,cAAc,GAAgB;IACzC,SAAS;IACT,QAAQ;IACR,IAAI;IACJ,KAAK;IACL,GAAG;IACH,QAAQ;IACR,OAAO;IACP,gBAAgB;IAChB,QAAQ;IACR,WAAW;IACX,KAAK;IACL,OAAO;IACP,SAAS;IACT,IAAI;IACJ,UAAU;IACV,QAAQ;IACR,YAAY;IACZ,iBAAiB;IACjB,QAAQ;IACR,YAAY;IACZ,UAAU;IACV,YAAY;IACZ,WAAW;IACX,QAAQ;IACR,OAAO;IACP,UAAU;IACV,QAAQ;IACR,UAAU;IACV,UAAU;IACV,UAAU;IACV,SAAS;IACT,iBAAiB;IACjB,QAAQ;CACT,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface ModelOption {
2
+ agent: string;
3
+ modelId: string;
4
+ }
5
+ export interface ModelPickerProps {
6
+ models: ModelOption[];
7
+ onPick(option: ModelOption): void;
8
+ onCancel(): void;
9
+ }
10
+ export declare function ModelPicker({ models, onPick, onCancel }: ModelPickerProps): import("react/jsx-runtime").JSX.Element;
11
+ //# sourceMappingURL=model-picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-picker.d.ts","sourceRoot":"","sources":["../src/model-picker.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAClC,QAAQ,IAAI,IAAI,CAAC;CAClB;AAED,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,gBAAgB,2CA8DzE"}
@@ -0,0 +1,45 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { Box, Text, useInput } from 'ink';
4
+ export function ModelPicker({ models, onPick, onCancel }) {
5
+ const [query, setQuery] = useState('');
6
+ const [cursor, setCursor] = useState(0);
7
+ const filtered = query
8
+ ? models.filter((m) => m.modelId.toLowerCase().includes(query.toLowerCase()) ||
9
+ m.agent.toLowerCase().includes(query.toLowerCase()))
10
+ : models;
11
+ useInput((input, key) => {
12
+ if (key.escape) {
13
+ onCancel();
14
+ return;
15
+ }
16
+ if (key.return) {
17
+ const pick = filtered[cursor];
18
+ if (pick)
19
+ onPick(pick);
20
+ return;
21
+ }
22
+ if (key.downArrow) {
23
+ setCursor((c) => Math.min(c + 1, Math.max(filtered.length - 1, 0)));
24
+ return;
25
+ }
26
+ if (key.upArrow) {
27
+ setCursor((c) => Math.max(c - 1, 0));
28
+ return;
29
+ }
30
+ if (key.backspace || key.delete) {
31
+ setQuery((q) => q.slice(0, -1));
32
+ setCursor(0);
33
+ return;
34
+ }
35
+ if (input && !key.ctrl && !key.meta) {
36
+ setQuery((q) => q + input);
37
+ setCursor(0);
38
+ }
39
+ });
40
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", paddingX: 1, children: [_jsxs(Box, { children: [_jsx(Text, { color: "cyan", children: "model: " }), _jsx(Text, { children: query }), _jsx(Text, { color: "cyan", children: "\u258C" })] }), filtered.length === 0 ? (_jsx(Text, { dimColor: true, children: "(no matches)" })) : (filtered.slice(0, 8).map((m, i) => {
41
+ const sel = i === cursor;
42
+ return (_jsxs(Text, { color: sel ? 'green' : undefined, children: [sel ? '> ' : ' ', _jsx(Text, { color: "cyan", children: m.agent }), " ", m.modelId] }, m.agent + ':' + m.modelId));
43
+ }))] }));
44
+ }
45
+ //# sourceMappingURL=model-picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-picker.js","sourceRoot":"","sources":["../src/model-picker.tsx"],"names":[],"mappings":"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"}
package/dist/plugin.d.ts CHANGED
@@ -21,6 +21,16 @@ export interface TuiViewProps {
21
21
  client: AgentMuxClient;
22
22
  active: boolean;
23
23
  eventStream: EventStream;
24
+ emit: (event: TuiInternalEvent) => void;
25
+ /** Optional global filter string (e.g. set via top-level `/` in chat). */
26
+ filter?: string;
27
+ /** Optional session selection routed by emit(session:detail). */
28
+ selection?: {
29
+ agent: string;
30
+ sessionId: string;
31
+ };
32
+ /** Sessions currently backed by an amux-managed run (keyed `${agent}:${sessionId}`). */
33
+ activeSessions?: ReadonlySet<string>;
24
34
  }
25
35
  export interface EventRenderer {
26
36
  id: string;
@@ -47,6 +57,18 @@ export type TuiInternalEvent = {
47
57
  } | {
48
58
  type: 'event';
49
59
  event: AgentEvent;
60
+ } | {
61
+ type: 'session:select';
62
+ agent: string;
63
+ sessionId: string;
64
+ } | {
65
+ type: 'session:detail';
66
+ agent: string;
67
+ sessionId: string;
68
+ } | {
69
+ type: 'session:diff';
70
+ agent: string;
71
+ sessionId: string;
50
72
  };
51
73
  export interface TuiPlugin {
52
74
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAErE,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,cAAc,CAAC;IACvB,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,qBAAqB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IACrD,eAAe,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CAAC;IACvC,qBAAqB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IACpD,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC;IAC/B,SAAS,EAAE,aAAa,CAAC;QAAE,KAAK,EAAE,UAAU,CAAA;KAAE,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,CAAC;AAEzC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAEzD"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAsDA,MAAM,UAAU,YAAY,CAAC,MAAiB;IAC5C,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAgEA,MAAM,UAAU,YAAY,CAAC,MAAiB;IAC5C,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("../plugin.js").TuiPlugin;
2
+ export default _default;
3
+ //# sourceMappingURL=adapters-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters-view.d.ts","sourceRoot":"","sources":["../../src/plugins/adapters-view.tsx"],"names":[],"mappings":";AA6CA,wBAUG"}
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { Box, Text } from 'ink';
4
+ import { definePlugin } from '../plugin.js';
5
+ function AdaptersView({ client, active }) {
6
+ const [rows, setRows] = useState([]);
7
+ useEffect(() => {
8
+ if (!active)
9
+ return;
10
+ try {
11
+ const list = client.adapters.list();
12
+ setRows(list.map((a) => ({
13
+ agent: a.agent,
14
+ displayName: a.displayName,
15
+ cliCommand: a.cliCommand,
16
+ source: a.source,
17
+ })));
18
+ }
19
+ catch {
20
+ // ignore
21
+ }
22
+ }, [active, client]);
23
+ if (rows.length === 0)
24
+ return _jsx(Text, { dimColor: true, children: "No adapters registered." });
25
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Registered adapters" }), rows.map((r) => (_jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: r.agent.padEnd(14) }), ' ', r.displayName.padEnd(20), ' ', _jsx(Text, { dimColor: true, children: r.cliCommand }), ' ', _jsxs(Text, { color: r.source === 'built-in' ? 'green' : 'magenta', children: ["[", r.source, "]"] })] }, r.agent)))] }));
26
+ }
27
+ export default definePlugin({
28
+ name: 'builtin:adapters-view',
29
+ register(ctx) {
30
+ ctx.registerView({
31
+ id: 'adapters',
32
+ title: 'Adapters',
33
+ hotkey: '4',
34
+ component: AdaptersView,
35
+ });
36
+ },
37
+ });
38
+ //# sourceMappingURL=adapters-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters-view.js","sourceRoot":"","sources":["../../src/plugins/adapters-view.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,YAAY,EAAqB,MAAM,cAAc,CAAC;AAS/D,SAAS,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAgB;IACpD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAQ,EAAE,CAAC,CAAC;IAC5C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,OAAO,CACL,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACf,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,MAAM,EAAE,CAAC,CAAC,MAAM;aACjB,CAAC,CAAC,CACJ,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACrB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAC,IAAI,IAAC,QAAQ,8CAA+B,CAAC;IAC5E,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,IAAI,0CAA2B,EACpC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACf,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,GAAQ,EAAC,GAAG,EACjD,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,GAAG,EAC9B,KAAC,IAAI,IAAC,QAAQ,kBAAE,CAAC,CAAC,UAAU,GAAQ,EAAC,GAAG,EACxC,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,kBAAI,CAAC,CAAC,MAAM,SAAS,KAJtE,CAAC,CAAC,KAAK,CAKX,CACR,CAAC,IACE,CACP,CAAC;AACJ,CAAC;AAED,eAAe,YAAY,CAAC;IAC1B,IAAI,EAAE,uBAAuB;IAC7B,QAAQ,CAAC,GAAG;QACV,GAAG,CAAC,YAAY,CAAC;YACf,EAAE,EAAE,UAAU;YACd,KAAK,EAAE,UAAU;YACjB,MAAM,EAAE,GAAG;YACX,SAAS,EAAE,YAAY;SACxB,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("../plugin.js").TuiPlugin;
2
+ export default _default;
3
+ //# sourceMappingURL=agents-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-view.d.ts","sourceRoot":"","sources":["../../src/plugins/agents-view.tsx"],"names":[],"mappings":";AAsMA,wBAUG"}
@@ -0,0 +1,190 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useState } from 'react';
3
+ import * as fs from 'node:fs';
4
+ import * as path from 'node:path';
5
+ import * as os from 'node:os';
6
+ import { Box, Text, useInput } from 'ink';
7
+ import { definePlugin } from '../plugin.js';
8
+ function buildRegistry() {
9
+ const HOME = os.homedir() || '.';
10
+ return {
11
+ claude: { global: path.join(HOME, '.claude', 'agents'), project: path.join('.claude', 'agents') },
12
+ codex: { global: path.join(HOME, '.codex', 'agents'), project: path.join('.codex', 'agents') },
13
+ cursor: { global: path.join(HOME, '.cursor', 'agents'), project: path.join('.cursor', 'agents') },
14
+ opencode: { global: path.join(HOME, '.opencode', 'agents'), project: path.join('.opencode', 'agents') },
15
+ };
16
+ }
17
+ function readDir(dir) {
18
+ try {
19
+ if (!fs.existsSync(dir))
20
+ return [];
21
+ return fs.readdirSync(dir);
22
+ }
23
+ catch {
24
+ return [];
25
+ }
26
+ }
27
+ function scan() {
28
+ const all = [];
29
+ for (const [agent, paths] of Object.entries(buildRegistry())) {
30
+ for (const name of readDir(paths.global)) {
31
+ all.push({ agent, scope: 'global', name, dir: paths.global, fullPath: path.join(paths.global, name) });
32
+ }
33
+ const proj = path.isAbsolute(paths.project) ? paths.project : path.join(process.cwd(), paths.project);
34
+ for (const name of readDir(proj)) {
35
+ all.push({ agent, scope: 'project', name, dir: proj, fullPath: path.join(proj, name) });
36
+ }
37
+ }
38
+ return all;
39
+ }
40
+ function copyPath(src, dst) {
41
+ const st = fs.statSync(src);
42
+ if (st.isDirectory()) {
43
+ fs.mkdirSync(dst, { recursive: true });
44
+ for (const name of fs.readdirSync(src))
45
+ copyPath(path.join(src, name), path.join(dst, name));
46
+ }
47
+ else if (st.isFile()) {
48
+ fs.mkdirSync(path.dirname(dst), { recursive: true });
49
+ fs.copyFileSync(src, dst);
50
+ }
51
+ }
52
+ const AGENT_NAMES = ['claude', 'codex', 'cursor', 'opencode'];
53
+ function AgentsView({ active }) {
54
+ const [rows, setRows] = useState([]);
55
+ const [cursor, setCursor] = useState(0);
56
+ const [confirmDelete, setConfirmDelete] = useState(false);
57
+ const [status, setStatus] = useState(null);
58
+ const [addMode, setAddMode] = useState(null);
59
+ const [addAgentIdx, setAddAgentIdx] = useState(0);
60
+ const [addSource, setAddSource] = useState('');
61
+ const refresh = useCallback(() => {
62
+ const r = scan();
63
+ setRows(r);
64
+ setCursor((c) => Math.min(c, Math.max(r.length - 1, 0)));
65
+ }, []);
66
+ useEffect(() => {
67
+ if (!active)
68
+ return;
69
+ refresh();
70
+ }, [active, refresh]);
71
+ const performAdd = useCallback((agent, source) => {
72
+ try {
73
+ const abs = path.resolve(source);
74
+ if (!fs.existsSync(abs)) {
75
+ setStatus(`Source not found: ${abs}`);
76
+ return;
77
+ }
78
+ const dirs = buildRegistry()[agent];
79
+ if (!dirs) {
80
+ setStatus(`Unknown agent: ${agent}`);
81
+ return;
82
+ }
83
+ const proj = path.isAbsolute(dirs.project) ? dirs.project : path.join(process.cwd(), dirs.project);
84
+ const dst = path.join(proj, path.basename(abs));
85
+ if (fs.existsSync(dst)) {
86
+ setStatus(`Already exists: ${dst} (use CLI with --force)`);
87
+ return;
88
+ }
89
+ fs.mkdirSync(proj, { recursive: true });
90
+ copyPath(abs, dst);
91
+ setStatus(`Added ${path.basename(abs)} → ${dst}`);
92
+ refresh();
93
+ }
94
+ catch (e) {
95
+ setStatus(`Add failed: ${String(e)}`);
96
+ }
97
+ }, [refresh]);
98
+ useInput((input, key) => {
99
+ if (!active)
100
+ return;
101
+ if (addMode === 'agent') {
102
+ if (key.escape) {
103
+ setAddMode(null);
104
+ setStatus('Cancelled');
105
+ return;
106
+ }
107
+ if (key.leftArrow || input === 'h')
108
+ setAddAgentIdx((i) => Math.max(i - 1, 0));
109
+ else if (key.rightArrow || input === 'l')
110
+ setAddAgentIdx((i) => Math.min(i + 1, AGENT_NAMES.length - 1));
111
+ else if (key.return) {
112
+ setAddMode('source');
113
+ setAddSource('');
114
+ }
115
+ return;
116
+ }
117
+ if (addMode === 'source') {
118
+ if (key.escape) {
119
+ setAddMode(null);
120
+ setStatus('Cancelled');
121
+ return;
122
+ }
123
+ if (key.return) {
124
+ const agent = AGENT_NAMES[addAgentIdx];
125
+ setAddMode(null);
126
+ performAdd(agent, addSource);
127
+ return;
128
+ }
129
+ if (key.backspace || key.delete) {
130
+ setAddSource((s) => s.slice(0, -1));
131
+ return;
132
+ }
133
+ if (input && !key.ctrl && !key.meta)
134
+ setAddSource((s) => s + input);
135
+ return;
136
+ }
137
+ if (confirmDelete) {
138
+ if (input === 'y' || input === 'Y') {
139
+ const row = rows[cursor];
140
+ if (row) {
141
+ try {
142
+ fs.rmSync(row.fullPath, { recursive: true, force: true });
143
+ setStatus(`Deleted ${row.name}`);
144
+ refresh();
145
+ }
146
+ catch (e) {
147
+ setStatus(`Delete failed: ${String(e)}`);
148
+ }
149
+ }
150
+ setConfirmDelete(false);
151
+ }
152
+ else if (input === 'n' || input === 'N' || key.escape) {
153
+ setConfirmDelete(false);
154
+ setStatus('Cancelled');
155
+ }
156
+ return;
157
+ }
158
+ if (key.downArrow || input === 'j')
159
+ setCursor((c) => Math.min(c + 1, Math.max(rows.length - 1, 0)));
160
+ else if (key.upArrow || input === 'k')
161
+ setCursor((c) => Math.max(c - 1, 0));
162
+ else if (input === 'r')
163
+ refresh();
164
+ else if (input === 'd' && rows[cursor])
165
+ setConfirmDelete(true);
166
+ else if (input === 'a') {
167
+ setAddMode('agent');
168
+ setAddAgentIdx(0);
169
+ }
170
+ }, { isActive: active });
171
+ if (rows.length === 0) {
172
+ return _jsx(Text, { dimColor: true, children: "No sub-agents installed. Use `amux agent add` to install." });
173
+ }
174
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Sub-agents" }), _jsx(Text, { dimColor: true, children: "j/k or arrows: move \u00B7 d: delete \u00B7 r: refresh \u00B7 (amux agent <list|add|remove|where>)" }), rows.slice(0, 40).map((r, i) => {
175
+ const sel = i === cursor;
176
+ return (_jsxs(Text, { color: sel ? 'green' : undefined, children: [sel ? '> ' : ' ', _jsx(Text, { color: "cyan", children: r.agent.padEnd(10) }), ' ', _jsx(Text, { color: "gray", children: r.scope.padEnd(7) }), ' ', _jsx(Text, { children: r.name })] }, r.agent + ':' + r.scope + ':' + r.name + ':' + i));
177
+ }), rows.length > 40 ? _jsxs(Text, { dimColor: true, children: ["\u2026 ", rows.length - 40, " more"] }) : null, addMode === 'agent' ? (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: "yellow", children: "Select agent (\u2190/\u2192, Enter to confirm, Esc to cancel):" }), _jsx(Text, { children: AGENT_NAMES.map((n, i) => (_jsxs(Text, { color: i === addAgentIdx ? 'green' : undefined, children: [i === addAgentIdx ? '[' : ' ', n, i === addAgentIdx ? ']' : ' ', ' '] }, n))) })] })) : null, addMode === 'source' ? (_jsxs(Text, { color: "yellow", children: ["Source path for ", AGENT_NAMES[addAgentIdx], ": ", addSource, _jsx(Text, { color: "gray", children: "_" })] })) : null, !addMode && !confirmDelete ? _jsx(Text, { dimColor: true, children: "a: add \u00B7 d: delete" }) : null, confirmDelete && rows[cursor] ? (_jsxs(Text, { color: "yellow", children: ["Delete ", rows[cursor].fullPath, "? (y/n)"] })) : null, status ? _jsx(Text, { dimColor: true, children: status }) : null] }));
178
+ }
179
+ export default definePlugin({
180
+ name: 'builtin:agents-view',
181
+ register(ctx) {
182
+ ctx.registerView({
183
+ id: 'agents',
184
+ title: 'Agents',
185
+ hotkey: 'G',
186
+ component: AgentsView,
187
+ });
188
+ },
189
+ });
190
+ //# sourceMappingURL=agents-view.js.map