@bytespell/amux 0.0.11 → 0.0.13

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 (89) hide show
  1. package/.claude/settings.local.json +11 -0
  2. package/CLAUDE.md +104 -0
  3. package/LICENSE +21 -0
  4. package/README.md +215 -0
  5. package/dist/cli.d.ts +14 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +118 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/client.d.ts +68 -0
  10. package/dist/client.d.ts.map +1 -0
  11. package/dist/client.js +135 -0
  12. package/dist/client.js.map +1 -0
  13. package/dist/index.d.ts +41 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +44 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/{lib/mentions.d.ts → message-parser.d.ts} +3 -5
  18. package/dist/message-parser.d.ts.map +1 -0
  19. package/dist/message-parser.js +45 -0
  20. package/dist/message-parser.js.map +1 -0
  21. package/dist/message-parser.test.d.ts +2 -0
  22. package/dist/message-parser.test.d.ts.map +1 -0
  23. package/dist/message-parser.test.js +188 -0
  24. package/dist/message-parser.test.js.map +1 -0
  25. package/dist/server.d.ts +24 -0
  26. package/dist/server.d.ts.map +1 -0
  27. package/dist/server.js +356 -0
  28. package/dist/server.js.map +1 -0
  29. package/dist/session-updates.d.ts +26 -0
  30. package/dist/session-updates.d.ts.map +1 -0
  31. package/dist/session-updates.js +68 -0
  32. package/dist/session-updates.js.map +1 -0
  33. package/dist/session-updates.test.d.ts +2 -0
  34. package/dist/session-updates.test.d.ts.map +1 -0
  35. package/dist/session-updates.test.js +223 -0
  36. package/dist/session-updates.test.js.map +1 -0
  37. package/dist/session.d.ts +208 -0
  38. package/dist/session.d.ts.map +1 -0
  39. package/dist/session.js +580 -0
  40. package/dist/session.js.map +1 -0
  41. package/dist/state.d.ts +74 -0
  42. package/dist/state.d.ts.map +1 -0
  43. package/dist/state.js +250 -0
  44. package/dist/state.js.map +1 -0
  45. package/dist/terminal.d.ts +47 -0
  46. package/dist/terminal.d.ts.map +1 -0
  47. package/dist/terminal.js +137 -0
  48. package/dist/terminal.js.map +1 -0
  49. package/dist/types.d.ts +64 -2
  50. package/dist/types.d.ts.map +1 -0
  51. package/dist/types.js +16 -31
  52. package/dist/types.js.map +1 -1
  53. package/dist/ws-adapter.d.ts +39 -0
  54. package/dist/ws-adapter.d.ts.map +1 -0
  55. package/dist/ws-adapter.js +198 -0
  56. package/dist/ws-adapter.js.map +1 -0
  57. package/package.json +47 -24
  58. package/src/client.ts +162 -0
  59. package/src/index.ts +66 -0
  60. package/src/message-parser.test.ts +207 -0
  61. package/src/message-parser.ts +54 -0
  62. package/src/session-updates.test.ts +265 -0
  63. package/src/session-updates.ts +87 -0
  64. package/src/session.ts +737 -0
  65. package/src/state.ts +287 -0
  66. package/src/terminal.ts +164 -0
  67. package/src/types.ts +88 -0
  68. package/src/ws-adapter.ts +245 -0
  69. package/tsconfig.json +22 -0
  70. package/vitest.config.ts +7 -0
  71. package/dist/chunk-5IPYOXBE.js +0 -32
  72. package/dist/chunk-5IPYOXBE.js.map +0 -1
  73. package/dist/chunk-C73RKCTS.js +0 -36
  74. package/dist/chunk-C73RKCTS.js.map +0 -1
  75. package/dist/chunk-VVXT4HQM.js +0 -779
  76. package/dist/chunk-VVXT4HQM.js.map +0 -1
  77. package/dist/lib/logger.d.ts +0 -24
  78. package/dist/lib/logger.js +0 -17
  79. package/dist/lib/logger.js.map +0 -1
  80. package/dist/lib/mentions.js +0 -7
  81. package/dist/lib/mentions.js.map +0 -1
  82. package/dist/streams/backends/index.d.ts +0 -88
  83. package/dist/streams/backends/index.js +0 -13
  84. package/dist/streams/backends/index.js.map +0 -1
  85. package/dist/streams/manager.d.ts +0 -55
  86. package/dist/streams/manager.js +0 -248
  87. package/dist/streams/manager.js.map +0 -1
  88. package/dist/types-DCRtrjjj.d.ts +0 -192
  89. package/scripts/fix-pty.cjs +0 -21
@@ -1,192 +0,0 @@
1
- import { PlanEntryStatus, PlanEntryPriority, PlanEntry, SessionUpdate } from '@agentclientprotocol/sdk';
2
-
3
- interface StreamConfig {
4
- id: string;
5
- name: string;
6
- command: string;
7
- args: string[];
8
- env: Record<string, string>;
9
- }
10
- /** The running stream instance produced by a driver */
11
- interface Stream {
12
- acpSessionId?: string;
13
- models?: Array<{
14
- modelId: string;
15
- name: string;
16
- }>;
17
- modes?: Array<{
18
- id: string;
19
- name: string;
20
- description?: string;
21
- }>;
22
- }
23
- type EmitFn = (payload: StreamPayload) => void;
24
- /** Driver interface - implementations spawn and manage streams */
25
- interface StreamDriver {
26
- /** Unique identifier for this driver type (used for routing) */
27
- readonly type: string;
28
- /** Stream type this driver provides (e.g., 'acp' for conversational, 'pty' for terminal) */
29
- readonly streamType: string;
30
- /** Start stream for a given streamId, optionally restoring from previous state */
31
- start(streamId: string, config: StreamConfig, cwd: string, backendState: unknown | null, emit: EmitFn, storageDir: string): Promise<Stream>;
32
- /** Get replay data for reconnecting clients (events for ACP, scrollback for PTY) */
33
- getReplayData?(streamId: string): StreamPayload[] | string | undefined;
34
- /** Handle user input as raw string (driver handles parsing @mentions etc) */
35
- input(streamId: string, raw: string, cwd: string, emit: EmitFn): Promise<void>;
36
- /** Stop stream and cleanup */
37
- stop(streamId: string): Promise<void>;
38
- /** Stop all streams managed by this driver */
39
- stopAll(): Promise<void>;
40
- /** Check if a stream is running */
41
- isRunning(streamId: string): boolean;
42
- /** Get driver-specific state for persistence (e.g., ACP session ID for resumption) */
43
- getState?(streamId: string): unknown;
44
- /** Respond to permission request */
45
- respondToPermission?(streamId: string, requestId: string, optionId: string): void;
46
- /** Get pending permission for a stream */
47
- getPendingPermission?(streamId: string): PendingPermission | null;
48
- /** Cancel in-progress prompt */
49
- cancel?(streamId: string): Promise<void>;
50
- /** Set agent mode */
51
- setMode?(streamId: string, modeId: string): Promise<void>;
52
- /** Set agent model */
53
- setModel?(streamId: string, modelId: string): Promise<void>;
54
- /** Write raw input to terminal */
55
- terminalWrite?(streamId: string, data: string): void;
56
- /** Resize terminal */
57
- terminalResize?(streamId: string, cols: number, rows: number): void;
58
- /** Get accumulated scrollback buffer for replay on reconnect */
59
- getScrollback?(streamId: string): string | undefined;
60
- /** Whether this driver is interactive (terminal) vs conversational (AI) */
61
- isInteractive?: boolean;
62
- }
63
-
64
- /**
65
- * Normalized PlanEntry that handles agent-specific quirks.
66
- *
67
- * Standard ACP: content, priority, status
68
- * Claude-style: content, status, activeForm (priority always "medium")
69
- *
70
- * The `activeForm` field provides a present-tense description (e.g., "Analyzing tests")
71
- * vs the imperative `content` (e.g., "Analyze tests"). When `activeForm` is present
72
- * and the status is "in_progress", UI should prefer displaying `activeForm`.
73
- */
74
- interface NormalizedPlanEntry {
75
- content: string;
76
- status: PlanEntryStatus;
77
- priority: PlanEntryPriority;
78
- /** Present-tense form for in_progress display (Claude-style). */
79
- activeForm?: string;
80
- }
81
- /**
82
- * Normalize an incoming ACP plan entry.
83
- * Extracts `activeForm` from Claude's `_meta.claudeCode` extension if present.
84
- */
85
- declare function normalizePlanEntry(entry: PlanEntry): NormalizedPlanEntry;
86
- interface ModelInfo {
87
- modelId: string;
88
- name: string;
89
- }
90
- interface ModeInfo {
91
- id: string;
92
- name: string;
93
- description?: string;
94
- }
95
- interface PendingPermission {
96
- requestId: string;
97
- toolCallId?: string;
98
- title: string;
99
- options: Array<{
100
- optionId: string;
101
- name: string;
102
- kind: string;
103
- }>;
104
- }
105
- /**
106
- * Universal lifecycle events that ALL drivers should emit.
107
- */
108
- type LifecycleEvent = {
109
- eventType: 'ready';
110
- } | {
111
- eventType: 'error';
112
- message: string;
113
- } | {
114
- eventType: 'stopped';
115
- };
116
- /**
117
- * ACP session update events (from ACP driver).
118
- * Wraps the ACP SessionUpdate with eventType discriminant.
119
- */
120
- type AcpEvent = {
121
- eventType: 'acp';
122
- } & SessionUpdate;
123
- /**
124
- * ACP-specific lifecycle events (turns, permissions).
125
- * Only the ACP driver emits these.
126
- */
127
- type AcpLifecycleEvent = {
128
- eventType: 'acp:turn_start';
129
- } | {
130
- eventType: 'acp:turn_end';
131
- } | {
132
- eventType: 'acp:turn_cancelled';
133
- } | {
134
- eventType: 'acp:permission_request';
135
- permission: PendingPermission;
136
- } | {
137
- eventType: 'acp:permission_cleared';
138
- };
139
- /**
140
- * Terminal events (from PTY/shell driver).
141
- */
142
- type TerminalEvent = {
143
- eventType: 'terminal:output';
144
- data: string;
145
- } | {
146
- eventType: 'terminal:exit';
147
- exitCode: number | null;
148
- signal: string | null;
149
- };
150
- /**
151
- * All known event types, plus a generic escape hatch for plugins.
152
- * Plugins can emit { eventType: 'my-plugin:custom', ...data } and renderers
153
- * can handle them with type narrowing.
154
- */
155
- type StreamPayload = LifecycleEvent | AcpEvent | AcpLifecycleEvent | TerminalEvent | {
156
- eventType: string;
157
- [key: string]: unknown;
158
- };
159
- /**
160
- * StreamEvent = payload with metadata stamped at emission time.
161
- */
162
- type StreamEvent = StreamPayload & {
163
- streamId: string;
164
- timestamp: number;
165
- };
166
- /**
167
- * Emit callback type for library consumers.
168
- */
169
- type Emit = (event: StreamEvent) => void;
170
- declare function isLifecycleEvent(payload: StreamPayload): payload is LifecycleEvent;
171
- declare function isAcpEvent(payload: StreamPayload): payload is AcpEvent;
172
- declare function isAcpLifecycleEvent(payload: StreamPayload): payload is AcpLifecycleEvent;
173
- declare function isTerminalEvent(payload: StreamPayload): payload is TerminalEvent;
174
- interface StreamHandle {
175
- streamId: string;
176
- stream: Stream;
177
- /** Driver type that handled this stream */
178
- driverType: string;
179
- }
180
- interface StartStreamArgs {
181
- streamId: string;
182
- /** Driver type to route to (e.g., 'acp', 'pty', or custom plugin types) */
183
- driverType: string;
184
- config: StreamConfig;
185
- cwd: string;
186
- restoredState?: unknown;
187
- emit: Emit;
188
- /** Directory for driver to store persistent data (e.g. history.json) */
189
- storageDir: string;
190
- }
191
-
192
- export { type AcpEvent as A, type Emit as E, type LifecycleEvent as L, type ModelInfo as M, type NormalizedPlanEntry as N, type PendingPermission as P, type StartStreamArgs as S, type TerminalEvent as T, type StreamHandle as a, type StreamPayload as b, type StreamDriver as c, type Stream as d, type StreamConfig as e, type EmitFn as f, type ModeInfo as g, type AcpLifecycleEvent as h, type StreamEvent as i, isLifecycleEvent as j, isAcpEvent as k, isAcpLifecycleEvent as l, isTerminalEvent as m, normalizePlanEntry as n };
@@ -1,21 +0,0 @@
1
- // Fix node-pty spawn-helper permissions on macOS
2
- // https://github.com/microsoft/node-pty/issues/858
3
- const fs = require('fs');
4
- const path = require('path');
5
-
6
- const candidates = [
7
- path.join(__dirname, '..', 'node_modules', 'node-pty', 'prebuilds'),
8
- path.join(__dirname, '..', '..', '..', 'node_modules', 'node-pty', 'prebuilds'),
9
- path.join(__dirname, '..', '..', 'node-pty', 'prebuilds'),
10
- ];
11
-
12
- for (const dir of candidates) {
13
- if (!fs.existsSync(dir)) continue;
14
- for (const folder of fs.readdirSync(dir)) {
15
- if (!folder.startsWith('darwin')) continue;
16
- const helper = path.join(dir, folder, 'spawn-helper');
17
- if (fs.existsSync(helper)) {
18
- fs.chmodSync(helper, 0o755);
19
- }
20
- }
21
- }