aimux-cli 0.1.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 (207) hide show
  1. package/README.md +743 -0
  2. package/bin/aimux +2 -0
  3. package/dist/agent-events.d.ts +20 -0
  4. package/dist/agent-events.js +2 -0
  5. package/dist/agent-events.js.map +1 -0
  6. package/dist/agent-message-parts.d.ts +17 -0
  7. package/dist/agent-message-parts.js +31 -0
  8. package/dist/agent-message-parts.js.map +1 -0
  9. package/dist/agent-output-parser.d.ts +16 -0
  10. package/dist/agent-output-parser.js +229 -0
  11. package/dist/agent-output-parser.js.map +1 -0
  12. package/dist/agent-tracker.d.ts +9 -0
  13. package/dist/agent-tracker.js +144 -0
  14. package/dist/agent-tracker.js.map +1 -0
  15. package/dist/agent-watcher.d.ts +15 -0
  16. package/dist/agent-watcher.js +2 -0
  17. package/dist/agent-watcher.js.map +1 -0
  18. package/dist/attachment-store.d.ts +35 -0
  19. package/dist/attachment-store.js +129 -0
  20. package/dist/attachment-store.js.map +1 -0
  21. package/dist/builtin-metadata-watchers.d.ts +2 -0
  22. package/dist/builtin-metadata-watchers.js +275 -0
  23. package/dist/builtin-metadata-watchers.js.map +1 -0
  24. package/dist/claude-hooks.d.ts +29 -0
  25. package/dist/claude-hooks.js +106 -0
  26. package/dist/claude-hooks.js.map +1 -0
  27. package/dist/config.d.ts +78 -0
  28. package/dist/config.js +172 -0
  29. package/dist/config.js.map +1 -0
  30. package/dist/context/compactor.d.ts +20 -0
  31. package/dist/context/compactor.js +212 -0
  32. package/dist/context/compactor.js.map +1 -0
  33. package/dist/context/context-bridge.d.ts +67 -0
  34. package/dist/context/context-bridge.js +471 -0
  35. package/dist/context/context-bridge.js.map +1 -0
  36. package/dist/context/context-file.d.ts +11 -0
  37. package/dist/context/context-file.js +93 -0
  38. package/dist/context/context-file.js.map +1 -0
  39. package/dist/context/history.d.ts +40 -0
  40. package/dist/context/history.js +108 -0
  41. package/dist/context/history.js.map +1 -0
  42. package/dist/daemon.d.ts +39 -0
  43. package/dist/daemon.js +344 -0
  44. package/dist/daemon.js.map +1 -0
  45. package/dist/dashboard-session-registry.d.ts +47 -0
  46. package/dist/dashboard-session-registry.js +161 -0
  47. package/dist/dashboard-session-registry.js.map +1 -0
  48. package/dist/dashboard-state.d.ts +18 -0
  49. package/dist/dashboard-state.js +26 -0
  50. package/dist/dashboard-state.js.map +1 -0
  51. package/dist/dashboard.d.ts +118 -0
  52. package/dist/dashboard.js +91 -0
  53. package/dist/dashboard.js.map +1 -0
  54. package/dist/debug.d.ts +7 -0
  55. package/dist/debug.js +41 -0
  56. package/dist/debug.js.map +1 -0
  57. package/dist/fast-control.d.ts +45 -0
  58. package/dist/fast-control.js +174 -0
  59. package/dist/fast-control.js.map +1 -0
  60. package/dist/hotkeys.d.ts +44 -0
  61. package/dist/hotkeys.js +118 -0
  62. package/dist/hotkeys.js.map +1 -0
  63. package/dist/http-client.d.ts +10 -0
  64. package/dist/http-client.js +54 -0
  65. package/dist/http-client.js.map +1 -0
  66. package/dist/instance-directory.d.ts +32 -0
  67. package/dist/instance-directory.js +82 -0
  68. package/dist/instance-directory.js.map +1 -0
  69. package/dist/instance-registry.d.ts +38 -0
  70. package/dist/instance-registry.js +208 -0
  71. package/dist/instance-registry.js.map +1 -0
  72. package/dist/key-parser.d.ts +30 -0
  73. package/dist/key-parser.js +272 -0
  74. package/dist/key-parser.js.map +1 -0
  75. package/dist/last-used.d.ts +31 -0
  76. package/dist/last-used.js +93 -0
  77. package/dist/last-used.js.map +1 -0
  78. package/dist/main.d.ts +1 -0
  79. package/dist/main.js +2483 -0
  80. package/dist/main.js.map +1 -0
  81. package/dist/metadata-server.d.ts +268 -0
  82. package/dist/metadata-server.js +1379 -0
  83. package/dist/metadata-server.js.map +1 -0
  84. package/dist/metadata-store.d.ts +80 -0
  85. package/dist/metadata-store.js +87 -0
  86. package/dist/metadata-store.js.map +1 -0
  87. package/dist/multiplexer.d.ts +471 -0
  88. package/dist/multiplexer.js +5714 -0
  89. package/dist/multiplexer.js.map +1 -0
  90. package/dist/notification-context.d.ts +18 -0
  91. package/dist/notification-context.js +68 -0
  92. package/dist/notification-context.js.map +1 -0
  93. package/dist/notifications.d.ts +38 -0
  94. package/dist/notifications.js +111 -0
  95. package/dist/notifications.js.map +1 -0
  96. package/dist/notify.d.ts +10 -0
  97. package/dist/notify.js +62 -0
  98. package/dist/notify.js.map +1 -0
  99. package/dist/orchestration-actions.d.ts +76 -0
  100. package/dist/orchestration-actions.js +310 -0
  101. package/dist/orchestration-actions.js.map +1 -0
  102. package/dist/orchestration-dispatcher.d.ts +22 -0
  103. package/dist/orchestration-dispatcher.js +49 -0
  104. package/dist/orchestration-dispatcher.js.map +1 -0
  105. package/dist/orchestration-routing.d.ts +20 -0
  106. package/dist/orchestration-routing.js +78 -0
  107. package/dist/orchestration-routing.js.map +1 -0
  108. package/dist/orchestration.d.ts +26 -0
  109. package/dist/orchestration.js +110 -0
  110. package/dist/orchestration.js.map +1 -0
  111. package/dist/osc-notifications.d.ts +15 -0
  112. package/dist/osc-notifications.js +180 -0
  113. package/dist/osc-notifications.js.map +1 -0
  114. package/dist/paths.d.ts +55 -0
  115. package/dist/paths.js +259 -0
  116. package/dist/paths.js.map +1 -0
  117. package/dist/plugin-runtime.d.ts +46 -0
  118. package/dist/plugin-runtime.js +180 -0
  119. package/dist/plugin-runtime.js.map +1 -0
  120. package/dist/project-events.d.ts +36 -0
  121. package/dist/project-events.js +63 -0
  122. package/dist/project-events.js.map +1 -0
  123. package/dist/project-scanner.d.ts +38 -0
  124. package/dist/project-scanner.js +243 -0
  125. package/dist/project-scanner.js.map +1 -0
  126. package/dist/project-service-manifest.d.ts +18 -0
  127. package/dist/project-service-manifest.js +56 -0
  128. package/dist/project-service-manifest.js.map +1 -0
  129. package/dist/recency.d.ts +2 -0
  130. package/dist/recency.js +34 -0
  131. package/dist/recency.js.map +1 -0
  132. package/dist/recorder.d.ts +14 -0
  133. package/dist/recorder.js +130 -0
  134. package/dist/recorder.js.map +1 -0
  135. package/dist/session-bootstrap.d.ts +45 -0
  136. package/dist/session-bootstrap.js +436 -0
  137. package/dist/session-bootstrap.js.map +1 -0
  138. package/dist/session-message-history.d.ts +27 -0
  139. package/dist/session-message-history.js +105 -0
  140. package/dist/session-message-history.js.map +1 -0
  141. package/dist/session-runtime.d.ts +44 -0
  142. package/dist/session-runtime.js +56 -0
  143. package/dist/session-runtime.js.map +1 -0
  144. package/dist/session-semantics.d.ts +35 -0
  145. package/dist/session-semantics.js +110 -0
  146. package/dist/session-semantics.js.map +1 -0
  147. package/dist/status-detector.d.ts +17 -0
  148. package/dist/status-detector.js +67 -0
  149. package/dist/status-detector.js.map +1 -0
  150. package/dist/statusline-model.d.ts +103 -0
  151. package/dist/statusline-model.js +177 -0
  152. package/dist/statusline-model.js.map +1 -0
  153. package/dist/task-dispatcher.d.ts +63 -0
  154. package/dist/task-dispatcher.js +210 -0
  155. package/dist/task-dispatcher.js.map +1 -0
  156. package/dist/task-workflow.d.ts +13 -0
  157. package/dist/task-workflow.js +153 -0
  158. package/dist/task-workflow.js.map +1 -0
  159. package/dist/tasks.d.ts +60 -0
  160. package/dist/tasks.js +120 -0
  161. package/dist/tasks.js.map +1 -0
  162. package/dist/team.d.ts +28 -0
  163. package/dist/team.js +91 -0
  164. package/dist/team.js.map +1 -0
  165. package/dist/terminal-host.d.ts +10 -0
  166. package/dist/terminal-host.js +52 -0
  167. package/dist/terminal-host.js.map +1 -0
  168. package/dist/threads.d.ts +61 -0
  169. package/dist/threads.js +200 -0
  170. package/dist/threads.js.map +1 -0
  171. package/dist/tmux-doctor.d.ts +47 -0
  172. package/dist/tmux-doctor.js +112 -0
  173. package/dist/tmux-doctor.js.map +1 -0
  174. package/dist/tmux-runtime-manager.d.ts +164 -0
  175. package/dist/tmux-runtime-manager.js +794 -0
  176. package/dist/tmux-runtime-manager.js.map +1 -0
  177. package/dist/tmux-session-transport.d.ts +31 -0
  178. package/dist/tmux-session-transport.js +115 -0
  179. package/dist/tmux-session-transport.js.map +1 -0
  180. package/dist/tmux-statusline.d.ts +17 -0
  181. package/dist/tmux-statusline.js +166 -0
  182. package/dist/tmux-statusline.js.map +1 -0
  183. package/dist/tool-output-watchers.d.ts +10 -0
  184. package/dist/tool-output-watchers.js +190 -0
  185. package/dist/tool-output-watchers.js.map +1 -0
  186. package/dist/tui/render/box.d.ts +1 -0
  187. package/dist/tui/render/box.js +20 -0
  188. package/dist/tui/render/box.js.map +1 -0
  189. package/dist/tui/render/text.d.ts +8 -0
  190. package/dist/tui/render/text.js +92 -0
  191. package/dist/tui/render/text.js.map +1 -0
  192. package/dist/tui/screens/dashboard-renderers.d.ts +23 -0
  193. package/dist/tui/screens/dashboard-renderers.js +411 -0
  194. package/dist/tui/screens/dashboard-renderers.js.map +1 -0
  195. package/dist/tui/screens/overlay-renderers.d.ts +10 -0
  196. package/dist/tui/screens/overlay-renderers.js +274 -0
  197. package/dist/tui/screens/overlay-renderers.js.map +1 -0
  198. package/dist/tui/screens/subscreen-renderers.d.ts +9 -0
  199. package/dist/tui/screens/subscreen-renderers.js +327 -0
  200. package/dist/tui/screens/subscreen-renderers.js.map +1 -0
  201. package/dist/workflow.d.ts +19 -0
  202. package/dist/workflow.js +111 -0
  203. package/dist/workflow.js.map +1 -0
  204. package/dist/worktree.d.ts +23 -0
  205. package/dist/worktree.js +101 -0
  206. package/dist/worktree.js.map +1 -0
  207. package/package.json +70 -0
package/bin/aimux ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import("../dist/main.js");
@@ -0,0 +1,20 @@
1
+ import type { MetadataTone } from "./metadata-store.js";
2
+ export type AgentActivityState = "idle" | "running" | "done" | "error" | "waiting" | "interrupted";
3
+ export type AgentAttentionState = "normal" | "needs_input" | "blocked" | "error";
4
+ export type AgentEventKind = "prompt" | "response" | "status" | "task_assigned" | "task_done" | "task_failed" | "needs_input" | "blocked" | "interrupted" | "notify";
5
+ export interface AgentEvent {
6
+ kind: AgentEventKind;
7
+ ts?: string;
8
+ message?: string;
9
+ source?: string;
10
+ tone?: MetadataTone;
11
+ threadId?: string;
12
+ threadName?: string;
13
+ }
14
+ export interface SessionDerivedState {
15
+ activity?: AgentActivityState;
16
+ attention?: AgentAttentionState;
17
+ unseenCount?: number;
18
+ lastEvent?: AgentEvent;
19
+ events?: AgentEvent[];
20
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-events.js","sourceRoot":"","sources":["../src/agent-events.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ export type AgentInputPart = {
2
+ type: "text";
3
+ text: string;
4
+ } | {
5
+ type: "image";
6
+ path?: string;
7
+ url?: string;
8
+ attachmentId?: string;
9
+ alt?: string;
10
+ };
11
+ export declare function serializeAgentInput(input: {
12
+ data?: string;
13
+ parts?: AgentInputPart[];
14
+ }, options?: {
15
+ tool?: string;
16
+ resolveAttachmentPath?: (attachmentId: string) => string | null;
17
+ }): string;
@@ -0,0 +1,31 @@
1
+ export function serializeAgentInput(input, options = {}) {
2
+ const parts = Array.isArray(input.parts) ? input.parts : [];
3
+ if (parts.length === 0) {
4
+ return String(input.data ?? "");
5
+ }
6
+ const serializedParts = parts.map((part) => serializePart(part, options)).filter((chunk) => chunk.length > 0);
7
+ if (serializedParts.length === 0) {
8
+ return String(input.data ?? "");
9
+ }
10
+ return serializedParts.join("\n\n");
11
+ }
12
+ function serializePart(part, options) {
13
+ if (part.type === "text") {
14
+ return String(part.text ?? "");
15
+ }
16
+ const tool = (options.tool || "agent").trim() || "agent";
17
+ const resolvedAttachmentPath = part.attachmentId?.trim()
18
+ ? options.resolveAttachmentPath?.(part.attachmentId.trim())
19
+ : null;
20
+ const source = part.path?.trim() || resolvedAttachmentPath || part.url?.trim() || part.attachmentId?.trim() || "";
21
+ if (!source) {
22
+ return "";
23
+ }
24
+ const alt = part.alt?.trim();
25
+ const lines = [`[inline image for ${tool}]`, `source: ${source}`];
26
+ if (alt) {
27
+ lines.push(`alt: ${alt}`);
28
+ }
29
+ return lines.join("\n");
30
+ }
31
+ //# sourceMappingURL=agent-message-parts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-message-parts.js","sourceRoot":"","sources":["../src/agent-message-parts.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,mBAAmB,CACjC,KAGC,EACD,UAA8F,EAAE;IAEhG,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE9G,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,aAAa,CACpB,IAAoB,EACpB,OAA2F;IAE3F,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,OAAO,CAAC;IACzD,MAAM,sBAAsB,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE;QACtD,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC3D,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,sBAAsB,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAClH,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,CAAC,qBAAqB,IAAI,GAAG,EAAE,WAAW,MAAM,EAAE,CAAC,CAAC;IAClE,IAAI,GAAG,EAAE,CAAC;QACR,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,16 @@
1
+ export type AgentOutputBlockType = "prompt" | "response" | "status" | "meta" | "raw";
2
+ export interface AgentOutputBlock {
3
+ type: AgentOutputBlockType;
4
+ text: string;
5
+ }
6
+ export interface ParsedAgentOutput {
7
+ blocks: AgentOutputBlock[];
8
+ parser: {
9
+ tool: string;
10
+ version: number;
11
+ confidence: "heuristic";
12
+ };
13
+ }
14
+ export declare function parseAgentOutput(raw: string, options?: {
15
+ tool?: string;
16
+ }): ParsedAgentOutput;
@@ -0,0 +1,229 @@
1
+ export function parseAgentOutput(raw, options = {}) {
2
+ const tool = (options.tool || "unknown").trim() || "unknown";
3
+ const lines = String(raw || "")
4
+ .replace(/\r/g, "")
5
+ .split("\n");
6
+ const blocks = [];
7
+ let current = null;
8
+ let sawPrompt = false;
9
+ let expectingResponse = false;
10
+ const flush = () => {
11
+ if (!current)
12
+ return;
13
+ const text = current.lines.join("\n").trimEnd();
14
+ if (text)
15
+ blocks.push({ type: current.type, text });
16
+ current = null;
17
+ };
18
+ const pushLine = (type, line) => {
19
+ if (!current || current.type !== type) {
20
+ flush();
21
+ current = { type, lines: [] };
22
+ }
23
+ current.lines.push(line);
24
+ };
25
+ const isDivider = (line) => {
26
+ const trimmed = line.trim();
27
+ return Boolean(trimmed) && /^[\u2500-\u257f\-_=\s]+$/.test(trimmed);
28
+ };
29
+ const isPathLike = (line) => /(^~\/|^\/|^[A-Za-z]:\\)/.test(line.trim());
30
+ const isClaudePreludeLine = (line) => {
31
+ const trimmed = line.trim();
32
+ if (!trimmed)
33
+ return current?.type === "meta";
34
+ return (trimmed.includes("Claude Code") ||
35
+ trimmed.includes("Claude Max") ||
36
+ trimmed.includes("Sonnet") ||
37
+ trimmed.includes("Opus") ||
38
+ (isPathLike(trimmed) && !sawPrompt) ||
39
+ (/context\)/.test(trimmed) && !sawPrompt));
40
+ };
41
+ const isFooterLine = (line) => {
42
+ const trimmed = line.trim();
43
+ if (!trimmed)
44
+ return false;
45
+ return ((/^([A-Za-z0-9._-]+@[^ ]+|~\/|\/)/.test(trimmed) && /(context\)|%\s|[$#]\s)/.test(trimmed)) ||
46
+ /^[A-Za-z0-9._-]+@[^ ]+\s+(~\/|\/)/.test(trimmed) ||
47
+ (/^([›>]|▶)\s/.test(trimmed) && /(permissions|cycle|cwd|context)/i.test(trimmed)) ||
48
+ /^⏵⏵\s/.test(trimmed) ||
49
+ /gpt-|claude|context\)|bypass permissions|shift\+tab|to cycle/i.test(trimmed));
50
+ };
51
+ const isStatusLine = (line) => {
52
+ const trimmed = line.trim();
53
+ if (!trimmed)
54
+ return false;
55
+ return (/^■\s?/.test(trimmed) ||
56
+ /^•\s?Working\b/.test(trimmed) ||
57
+ /^⏵⏵\s/.test(trimmed) ||
58
+ /^\*\s+[A-Z][A-Za-z-]+(?:\.\.\.|…)?$/.test(trimmed) ||
59
+ /^[╰└]\s*Tip:/i.test(trimmed) ||
60
+ /^Tip:\s/i.test(trimmed) ||
61
+ /(Plan Mode|default permission mode)/i.test(trimmed) ||
62
+ /Conversation interrupted/i.test(trimmed) ||
63
+ /\bInterrupted\b.*\bwhat should\b.*\bdo instead\?/i.test(trimmed) ||
64
+ /\bWorking \(\d+s/.test(trimmed));
65
+ };
66
+ const isPromptLine = (line) => {
67
+ const trimmed = line.trimStart();
68
+ return /^›\s?/.test(trimmed) || /^>\s?/.test(trimmed) || /^❯\s?/.test(trimmed);
69
+ };
70
+ const stripPromptMarker = (line) => line.trimStart().replace(/^(›|>|❯)\s?/, "");
71
+ const stripResponseMarker = (line) => line.trimStart().replace(/^(•|⏺)\s?/, "");
72
+ const stripStatusMarker = (line) => line.trimStart().replace(/^(■|\*\s+)\s?/, "");
73
+ for (const line of lines) {
74
+ const trimmed = line.trimEnd();
75
+ if (isDivider(trimmed))
76
+ continue;
77
+ if (isPromptLine(trimmed)) {
78
+ const promptText = stripPromptMarker(trimmed);
79
+ if (!promptText.trim()) {
80
+ flush();
81
+ expectingResponse = false;
82
+ continue;
83
+ }
84
+ pushLine("prompt", promptText);
85
+ sawPrompt = true;
86
+ expectingResponse = true;
87
+ continue;
88
+ }
89
+ if (/^(•|⏺)\s?/.test(trimmed) && !/^•\s?Working\b/.test(trimmed)) {
90
+ pushLine("response", stripResponseMarker(trimmed));
91
+ sawPrompt = true;
92
+ expectingResponse = false;
93
+ continue;
94
+ }
95
+ if (isStatusLine(trimmed)) {
96
+ pushLine("status", stripStatusMarker(trimmed));
97
+ expectingResponse = false;
98
+ continue;
99
+ }
100
+ if (!sawPrompt && isClaudePreludeLine(trimmed)) {
101
+ pushLine("meta", trimmed);
102
+ continue;
103
+ }
104
+ if (isFooterLine(trimmed)) {
105
+ pushLine("status", trimmed);
106
+ expectingResponse = false;
107
+ continue;
108
+ }
109
+ if (!trimmed.trim()) {
110
+ const active = current;
111
+ if (active && active.type !== "raw") {
112
+ active.lines.push("");
113
+ continue;
114
+ }
115
+ flush();
116
+ continue;
117
+ }
118
+ if (expectingResponse || current?.type === "response") {
119
+ pushLine("response", trimmed);
120
+ continue;
121
+ }
122
+ const active = current;
123
+ if (active?.type === "meta" && isClaudePreludeLine(trimmed)) {
124
+ active.lines.push(trimmed);
125
+ continue;
126
+ }
127
+ if (active?.type === "status") {
128
+ active.lines.push(trimmed);
129
+ continue;
130
+ }
131
+ pushLine("raw", trimmed);
132
+ }
133
+ flush();
134
+ return {
135
+ blocks: normalizeTranscriptBlocks(blocks.filter((block) => block.text.trim().length > 0)),
136
+ parser: {
137
+ tool,
138
+ version: 1,
139
+ confidence: "heuristic",
140
+ },
141
+ };
142
+ }
143
+ function normalizeTranscriptBlocks(blocks) {
144
+ const next = blocks.map((block) => ({ ...block }));
145
+ const looksLikeAssistantText = (text) => {
146
+ const trimmed = String(text || "").trim();
147
+ if (!trimmed)
148
+ return false;
149
+ if (/^(sam@|[A-Za-z0-9._-]+@|~\/|\/)/.test(trimmed))
150
+ return false;
151
+ if (/^(bypass permissions|shift\+tab|context\)|gpt-|claude )/i.test(trimmed))
152
+ return false;
153
+ if (/^[\u2500-\u257f\-_=\s]+$/.test(trimmed))
154
+ return false;
155
+ return /[A-Za-z]/.test(trimmed);
156
+ };
157
+ for (let i = 0; i < next.length; i += 1) {
158
+ const current = next[i];
159
+ if (!current || current.type !== "raw")
160
+ continue;
161
+ const prev = next[i - 1] || null;
162
+ const following = next[i + 1] || null;
163
+ const nextConversationIndex = next.findIndex((block, index) => index > i && (block.type === "prompt" || block.type === "response"));
164
+ const betweenConversationTurns = (prev?.type === "response" || prev?.type === "prompt") &&
165
+ (following?.type === "prompt" || following?.type === "response");
166
+ const leadingAssistantCarryover = !prev && (following?.type === "prompt" || following?.type === "response" || following?.type === "status");
167
+ const leadingAssistantPrelude = !prev && nextConversationIndex !== -1;
168
+ const responseContinuation = prev?.type === "response";
169
+ if ((betweenConversationTurns || leadingAssistantCarryover || leadingAssistantPrelude || responseContinuation) &&
170
+ looksLikeAssistantText(current.text)) {
171
+ current.type = "response";
172
+ }
173
+ }
174
+ const hasConversationTurns = next.some((block) => block.type === "prompt" || block.type === "response");
175
+ if (!hasConversationTurns) {
176
+ for (const block of next) {
177
+ if (block.type !== "raw")
178
+ continue;
179
+ if (!looksLikeAssistantText(block.text))
180
+ continue;
181
+ block.type = "response";
182
+ }
183
+ }
184
+ let sawConversationTurn = false;
185
+ for (const block of next) {
186
+ if (block.type === "prompt" || block.type === "response") {
187
+ sawConversationTurn = true;
188
+ continue;
189
+ }
190
+ if (block.type === "raw" && sawConversationTurn && looksLikeAssistantText(block.text)) {
191
+ block.type = "response";
192
+ }
193
+ }
194
+ const merged = [];
195
+ for (const block of next) {
196
+ const previous = merged[merged.length - 1];
197
+ if (previous && previous.type === block.type) {
198
+ previous.text = `${previous.text}\n\n${block.text}`.trim();
199
+ continue;
200
+ }
201
+ merged.push(block);
202
+ }
203
+ return stripTrailingVisiblePrompt(merged);
204
+ }
205
+ function stripTrailingVisiblePrompt(blocks) {
206
+ const promptIndex = findLastIndex(blocks, (block) => block.type === "prompt");
207
+ if (promptIndex === -1) {
208
+ return blocks;
209
+ }
210
+ const hasResponseAfterPrompt = blocks.slice(promptIndex + 1).some((block) => block.type === "response");
211
+ if (hasResponseAfterPrompt) {
212
+ return blocks;
213
+ }
214
+ const trailingBlocks = blocks.slice(promptIndex + 1);
215
+ const hasOnlyNonConversationTail = trailingBlocks.every((block) => block.type === "status" || block.type === "meta" || block.type === "raw");
216
+ if (!hasOnlyNonConversationTail) {
217
+ return blocks;
218
+ }
219
+ return blocks.filter((_, index) => index !== promptIndex);
220
+ }
221
+ function findLastIndex(items, predicate) {
222
+ for (let index = items.length - 1; index >= 0; index -= 1) {
223
+ if (predicate(items[index])) {
224
+ return index;
225
+ }
226
+ }
227
+ return -1;
228
+ }
229
+ //# sourceMappingURL=agent-output-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-output-parser.js","sourceRoot":"","sources":["../src/agent-output-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { AgentActivityState, AgentAttentionState, AgentEvent, SessionDerivedState } from "./agent-events.js";
2
+ import { type SessionMetadata } from "./metadata-store.js";
3
+ export declare class AgentTracker {
4
+ emit(sessionId: string, event: AgentEvent, projectRoot?: string): void;
5
+ markSeen(sessionId: string, projectRoot?: string): void;
6
+ setActivity(sessionId: string, activity: AgentActivityState, projectRoot?: string): void;
7
+ setAttention(sessionId: string, attention: AgentAttentionState, projectRoot?: string): void;
8
+ }
9
+ export declare function getDerivedState(metadata: SessionMetadata | undefined): SessionDerivedState | undefined;
@@ -0,0 +1,144 @@
1
+ import { updateSessionMetadata } from "./metadata-store.js";
2
+ function nowIso() {
3
+ return new Date().toISOString();
4
+ }
5
+ function incrementUnseen(current) {
6
+ return (current?.unseenCount ?? 0) + 1;
7
+ }
8
+ function deriveFromEvent(current, event) {
9
+ const message = event.message?.toLowerCase() ?? "";
10
+ const tone = event.tone;
11
+ let activity = current?.activity;
12
+ let attention = current?.attention ?? "normal";
13
+ let unseenCount = current?.unseenCount ?? 0;
14
+ switch (event.kind) {
15
+ case "prompt":
16
+ case "task_assigned":
17
+ activity = "running";
18
+ if (attention === "normal")
19
+ attention = "normal";
20
+ break;
21
+ case "response":
22
+ activity = "idle";
23
+ unseenCount = incrementUnseen(current);
24
+ break;
25
+ case "task_done":
26
+ activity = "done";
27
+ attention = "normal";
28
+ unseenCount = incrementUnseen(current);
29
+ break;
30
+ case "task_failed":
31
+ activity = "error";
32
+ attention = "error";
33
+ unseenCount = incrementUnseen(current);
34
+ break;
35
+ case "needs_input":
36
+ activity = "waiting";
37
+ attention = "needs_input";
38
+ unseenCount = incrementUnseen(current);
39
+ break;
40
+ case "blocked":
41
+ activity = "waiting";
42
+ attention = "blocked";
43
+ unseenCount = incrementUnseen(current);
44
+ break;
45
+ case "interrupted":
46
+ activity = "interrupted";
47
+ unseenCount = incrementUnseen(current);
48
+ break;
49
+ case "notify":
50
+ unseenCount = incrementUnseen(current);
51
+ if (tone === "error")
52
+ attention = "error";
53
+ break;
54
+ case "status":
55
+ if (tone === "error") {
56
+ activity = "error";
57
+ attention = "error";
58
+ unseenCount = incrementUnseen(current);
59
+ break;
60
+ }
61
+ if (/need(s)? (your )?input|waiting for you|press enter|confirm|approval/.test(message)) {
62
+ activity = "waiting";
63
+ attention = "needs_input";
64
+ unseenCount = incrementUnseen(current);
65
+ break;
66
+ }
67
+ if (/blocked|waiting on|stuck/.test(message)) {
68
+ activity = "waiting";
69
+ attention = "blocked";
70
+ unseenCount = incrementUnseen(current);
71
+ break;
72
+ }
73
+ if (tone === "success" || /done|complete|completed|finished|resolved/.test(message)) {
74
+ activity = "done";
75
+ attention = "normal";
76
+ unseenCount = incrementUnseen(current);
77
+ break;
78
+ }
79
+ if (/working|running|thinking|building|deploying|indexing|searching|editing/.test(message)) {
80
+ activity = "running";
81
+ }
82
+ break;
83
+ }
84
+ return {
85
+ activity,
86
+ attention,
87
+ unseenCount,
88
+ };
89
+ }
90
+ export class AgentTracker {
91
+ emit(sessionId, event, projectRoot) {
92
+ const normalized = {
93
+ ...event,
94
+ ts: event.ts ?? nowIso(),
95
+ };
96
+ updateSessionMetadata(sessionId, (current) => {
97
+ const derivedCurrent = current.derived;
98
+ const nextState = deriveFromEvent(derivedCurrent, normalized);
99
+ const events = [...(derivedCurrent?.events ?? []).slice(-19), normalized];
100
+ return {
101
+ ...current,
102
+ derived: {
103
+ ...derivedCurrent,
104
+ ...nextState,
105
+ threadId: normalized.threadId ?? derivedCurrent?.threadId,
106
+ threadName: normalized.threadName ?? derivedCurrent?.threadName,
107
+ lastEvent: normalized,
108
+ events,
109
+ },
110
+ };
111
+ }, projectRoot);
112
+ }
113
+ markSeen(sessionId, projectRoot) {
114
+ updateSessionMetadata(sessionId, (current) => ({
115
+ ...current,
116
+ derived: {
117
+ ...(current.derived ?? {}),
118
+ unseenCount: 0,
119
+ },
120
+ }), projectRoot);
121
+ }
122
+ setActivity(sessionId, activity, projectRoot) {
123
+ updateSessionMetadata(sessionId, (current) => ({
124
+ ...current,
125
+ derived: {
126
+ ...(current.derived ?? {}),
127
+ activity,
128
+ },
129
+ }), projectRoot);
130
+ }
131
+ setAttention(sessionId, attention, projectRoot) {
132
+ updateSessionMetadata(sessionId, (current) => ({
133
+ ...current,
134
+ derived: {
135
+ ...(current.derived ?? {}),
136
+ attention,
137
+ },
138
+ }), projectRoot);
139
+ }
140
+ }
141
+ export function getDerivedState(metadata) {
142
+ return metadata?.derived;
143
+ }
144
+ //# sourceMappingURL=agent-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-tracker.js","sourceRoot":"","sources":["../src/agent-tracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { AimuxPluginAPI, AimuxPluginInstance } from "./plugin-runtime.js";
2
+ import type { AgentEvent } from "./agent-events.js";
3
+ export interface AgentWatcherContext {
4
+ api: AimuxPluginAPI;
5
+ }
6
+ export interface AgentWatcher extends AimuxPluginInstance {
7
+ readonly name: string;
8
+ }
9
+ export interface AgentObservation {
10
+ sessionId: string;
11
+ tool: string;
12
+ event?: AgentEvent;
13
+ activity?: import("./agent-events.js").AgentActivityState;
14
+ attention?: import("./agent-events.js").AgentAttentionState;
15
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-watcher.js","sourceRoot":"","sources":["../src/agent-watcher.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ export interface AttachmentRecord {
2
+ id: string;
3
+ kind: "image";
4
+ filename: string;
5
+ mimeType: string;
6
+ sizeBytes: number;
7
+ sha256: string;
8
+ createdAt: string;
9
+ source: "path" | "upload";
10
+ contentPath: string;
11
+ }
12
+ export interface PublicAttachmentRecord {
13
+ id: string;
14
+ kind: "image";
15
+ filename: string;
16
+ mimeType: string;
17
+ sizeBytes: number;
18
+ sha256: string;
19
+ createdAt: string;
20
+ source: "path" | "upload";
21
+ contentUrl: string;
22
+ }
23
+ export declare function ingestAttachmentFromPath(path: string): PublicAttachmentRecord;
24
+ export declare function ingestAttachmentFromBase64(input: {
25
+ contentBase64: string;
26
+ filename?: string;
27
+ mimeType?: string;
28
+ }): PublicAttachmentRecord;
29
+ export declare function getAttachment(id: string): PublicAttachmentRecord | null;
30
+ export declare function getAttachmentContent(id: string): {
31
+ attachment: PublicAttachmentRecord;
32
+ contentPath: string;
33
+ buffer: Buffer;
34
+ } | null;
35
+ export declare function resolveAttachmentPath(id: string): string | null;