@bytespell/amux 0.0.4 → 0.0.7
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/chunk-C73RKCTS.js +36 -0
- package/dist/chunk-C73RKCTS.js.map +1 -0
- package/dist/chunk-HJCRMFTD.js +771 -0
- package/dist/chunk-HJCRMFTD.js.map +1 -0
- package/dist/lib/logger.d.ts +24 -0
- package/dist/{src/lib → lib}/logger.js +1 -2
- package/dist/lib/mentions.d.ts +14 -0
- package/dist/lib/mentions.js +7 -0
- package/dist/streams/backends/index.d.ts +88 -0
- package/dist/streams/backends/index.js +13 -0
- package/dist/streams/manager.d.ts +49 -0
- package/dist/streams/manager.js +237 -0
- package/dist/streams/manager.js.map +1 -0
- package/dist/types-DoG5bt6C.d.ts +153 -0
- package/dist/types.d.ts +2 -0
- package/dist/{chunk-226DBKL3.js → types.js} +7 -8
- package/dist/types.js.map +1 -0
- package/package.json +10 -37
- package/scripts/fix-pty.cjs +21 -0
- package/dist/bin/cli.js +0 -28
- package/dist/bin/cli.js.map +0 -1
- package/dist/chunk-226DBKL3.js.map +0 -1
- package/dist/chunk-2NON2HR2.js +0 -1602
- package/dist/chunk-2NON2HR2.js.map +0 -1
- package/dist/chunk-L4DBPVMA.js +0 -122
- package/dist/chunk-L4DBPVMA.js.map +0 -1
- package/dist/chunk-OQ5K5ON2.js +0 -319
- package/dist/chunk-OQ5K5ON2.js.map +0 -1
- package/dist/chunk-PZ5AY32C.js +0 -10
- package/dist/chunk-SX7NC3ZM.js +0 -65
- package/dist/chunk-SX7NC3ZM.js.map +0 -1
- package/dist/chunk-YYN3GXYP.js +0 -333
- package/dist/chunk-YYN3GXYP.js.map +0 -1
- package/dist/src/agents/eventStore.js +0 -22
- package/dist/src/agents/eventStore.js.map +0 -1
- package/dist/src/agents/manager.js +0 -12
- package/dist/src/agents/manager.js.map +0 -1
- package/dist/src/db/index.js +0 -10
- package/dist/src/server.js +0 -16
- package/dist/src/server.js.map +0 -1
- package/dist/src/trpc/files.js +0 -11
- package/dist/src/trpc/files.js.map +0 -1
- package/dist/src/types.js +0 -12
- package/dist/src/types.js.map +0 -1
- /package/dist/{src/lib → lib}/logger.js.map +0 -0
- /package/dist/{chunk-PZ5AY32C.js.map → lib/mentions.js.map} +0 -0
- /package/dist/{src/db → streams/backends}/index.js.map +0 -0
|
@@ -0,0 +1,153 @@
|
|
|
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 ('acp' for conversational, 'pty' for terminal) */
|
|
29
|
+
readonly streamType: 'acp' | 'pty';
|
|
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
|
+
type AmuxEvent = {
|
|
106
|
+
amuxEvent: 'error';
|
|
107
|
+
message: string;
|
|
108
|
+
} | {
|
|
109
|
+
amuxEvent: 'permission_request';
|
|
110
|
+
permission: PendingPermission;
|
|
111
|
+
} | {
|
|
112
|
+
amuxEvent: 'permission_cleared';
|
|
113
|
+
} | {
|
|
114
|
+
amuxEvent: 'turn_start';
|
|
115
|
+
} | {
|
|
116
|
+
amuxEvent: 'turn_end';
|
|
117
|
+
} | {
|
|
118
|
+
amuxEvent: 'turn_cancelled';
|
|
119
|
+
} | {
|
|
120
|
+
amuxEvent: 'terminal_output';
|
|
121
|
+
data: string;
|
|
122
|
+
} | {
|
|
123
|
+
amuxEvent: 'terminal_exit';
|
|
124
|
+
exitCode: number | null;
|
|
125
|
+
signal: string | null;
|
|
126
|
+
};
|
|
127
|
+
type StreamPayload = SessionUpdate | AmuxEvent;
|
|
128
|
+
type StreamEvent = StreamPayload & {
|
|
129
|
+
streamId: string;
|
|
130
|
+
timestamp: number;
|
|
131
|
+
};
|
|
132
|
+
type Emit = (event: StreamEvent) => void;
|
|
133
|
+
interface StreamHandle {
|
|
134
|
+
streamId: string;
|
|
135
|
+
stream: Stream;
|
|
136
|
+
/** Driver type that handled this stream */
|
|
137
|
+
driverType: string;
|
|
138
|
+
}
|
|
139
|
+
interface StartStreamArgs {
|
|
140
|
+
streamId: string;
|
|
141
|
+
/** Driver type to route to (e.g., 'acp', 'pty', or custom plugin types) */
|
|
142
|
+
driverType: string;
|
|
143
|
+
config: StreamConfig;
|
|
144
|
+
cwd: string;
|
|
145
|
+
restoredState?: unknown;
|
|
146
|
+
emit: Emit;
|
|
147
|
+
/** Directory for driver to store persistent data (e.g. history.json) */
|
|
148
|
+
storageDir: string;
|
|
149
|
+
}
|
|
150
|
+
declare function isSessionUpdate(payload: StreamPayload): payload is SessionUpdate;
|
|
151
|
+
declare function isAmuxEvent(payload: StreamPayload): payload is AmuxEvent;
|
|
152
|
+
|
|
153
|
+
export { type AmuxEvent as A, type Emit as E, type ModelInfo as M, type NormalizedPlanEntry as N, type PendingPermission as P, type StartStreamArgs as S, 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 StreamEvent as h, isSessionUpdate as i, isAmuxEvent as j, normalizePlanEntry as n };
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { A as AmuxEvent, E as Emit, g as ModeInfo, M as ModelInfo, N as NormalizedPlanEntry, P as PendingPermission, S as StartStreamArgs, h as StreamEvent, a as StreamHandle, b as StreamPayload, j as isAmuxEvent, i as isSessionUpdate, n as normalizePlanEntry } from './types-DoG5bt6C.js';
|
|
2
|
+
export { PlanEntry as AcpPlanEntry, AudioContent, AvailableCommand, AvailableCommandsUpdate, ContentBlock, ContentChunk, CurrentModeUpdate, EmbeddedResource, ImageContent, PermissionOption, Plan, PlanEntryPriority, PlanEntryStatus, RequestPermissionRequest, RequestPermissionResponse, ResourceLink, SessionUpdate, TextContent, ToolCall, ToolCallStatus, ToolCallUpdate } from '@agentclientprotocol/sdk';
|
|
@@ -11,16 +11,15 @@ function normalizePlanEntry(entry) {
|
|
|
11
11
|
activeForm: activeForm ?? directActiveForm
|
|
12
12
|
};
|
|
13
13
|
}
|
|
14
|
-
function isSessionUpdate(
|
|
15
|
-
return "sessionUpdate" in
|
|
14
|
+
function isSessionUpdate(payload) {
|
|
15
|
+
return "sessionUpdate" in payload;
|
|
16
16
|
}
|
|
17
|
-
function isAmuxEvent(
|
|
18
|
-
return "amuxEvent" in
|
|
17
|
+
function isAmuxEvent(payload) {
|
|
18
|
+
return "amuxEvent" in payload;
|
|
19
19
|
}
|
|
20
|
-
|
|
21
20
|
export {
|
|
22
|
-
|
|
21
|
+
isAmuxEvent,
|
|
23
22
|
isSessionUpdate,
|
|
24
|
-
|
|
23
|
+
normalizePlanEntry
|
|
25
24
|
};
|
|
26
|
-
//# sourceMappingURL=
|
|
25
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["// Re-export ACP types from SDK\nexport type {\n SessionUpdate,\n ContentBlock,\n ContentChunk,\n TextContent,\n ImageContent,\n AudioContent,\n EmbeddedResource,\n ResourceLink,\n PlanEntry as AcpPlanEntry,\n PlanEntryPriority,\n PlanEntryStatus,\n Plan,\n AvailableCommand,\n AvailableCommandsUpdate,\n CurrentModeUpdate,\n ToolCall,\n ToolCallUpdate,\n ToolCallStatus,\n PermissionOption,\n RequestPermissionRequest,\n RequestPermissionResponse,\n} from '@agentclientprotocol/sdk';\n\nimport type { PlanEntry as AcpPlanEntry, PlanEntryPriority, PlanEntryStatus, SessionUpdate } from '@agentclientprotocol/sdk';\n\n/**\n * Normalized PlanEntry that handles agent-specific quirks.\n *\n * Standard ACP: content, priority, status\n * Claude-style: content, status, activeForm (priority always \"medium\")\n *\n * The `activeForm` field provides a present-tense description (e.g., \"Analyzing tests\")\n * vs the imperative `content` (e.g., \"Analyze tests\"). When `activeForm` is present\n * and the status is \"in_progress\", UI should prefer displaying `activeForm`.\n */\nexport interface NormalizedPlanEntry {\n content: string;\n status: PlanEntryStatus;\n priority: PlanEntryPriority;\n /** Present-tense form for in_progress display (Claude-style). */\n activeForm?: string;\n}\n\n/**\n * Normalize an incoming ACP plan entry.\n * Extracts `activeForm` from Claude's `_meta.claudeCode` extension if present.\n */\nexport function normalizePlanEntry(entry: AcpPlanEntry): NormalizedPlanEntry {\n // Try to extract activeForm from _meta.claudeCode (if claude-acp sends it there)\n const meta = entry._meta as Record<string, unknown> | undefined;\n const claudeCode = meta?.claudeCode as Record<string, unknown> | undefined;\n const activeForm = claudeCode?.activeForm as string | undefined;\n\n // Also check if activeForm is directly on the entry (non-standard but possible)\n const directActiveForm = (entry as Record<string, unknown>).activeForm as string | undefined;\n\n return {\n content: entry.content,\n status: entry.status,\n priority: entry.priority,\n activeForm: activeForm ?? directActiveForm,\n };\n}\n\n// Model and mode info returned from stream session\nexport interface ModelInfo {\n modelId: string;\n name: string;\n}\n\nexport interface ModeInfo {\n id: string;\n name: string;\n description?: string;\n}\n\n// Permission types for WebSocket push\nexport interface PendingPermission {\n requestId: string;\n toolCallId?: string;\n title: string;\n options: Array<{ optionId: string; name: string; kind: string }>;\n}\n\n// amux events pushed via WebSocket subscription.\n// ACP blocking RPCs (requestPermission, prompt) need WebSocket notifications\n// so the UI can track state independently of RPC callbacks (e.g. after page reload).\n// Pattern: RPC start → notification, RPC complete → notification\nexport type AmuxEvent =\n | { amuxEvent: 'error'; message: string }\n | { amuxEvent: 'permission_request'; permission: PendingPermission }\n | { amuxEvent: 'permission_cleared' }\n | { amuxEvent: 'turn_start' }\n | { amuxEvent: 'turn_end' }\n | { amuxEvent: 'turn_cancelled' }\n // Terminal-specific events (ShellBackend)\n | { amuxEvent: 'terminal_output'; data: string }\n | { amuxEvent: 'terminal_exit'; exitCode: number | null; signal: string | null };\n\n// Payload types for stream subscriptions\nexport type StreamPayload = SessionUpdate | AmuxEvent;\n\n// Event emitted by amux - payload with metadata stamped at emission time\nexport type StreamEvent = StreamPayload & {\n streamId: string;\n timestamp: number;\n};\n\n// Emit callback type for library consumers\nexport type Emit = (event: StreamEvent) => void;\n\n// Handle returned from startStream for the caller to use\nexport interface StreamHandle {\n streamId: string;\n stream: import('./streams/backends/types.js').Stream;\n /** Driver type that handled this stream */\n driverType: string;\n}\n\n// Arguments for starting a stream\nexport interface StartStreamArgs {\n streamId: string;\n /** Driver type to route to (e.g., 'acp', 'pty', or custom plugin types) */\n driverType: string;\n config: import('./streams/backends/types.js').StreamConfig;\n cwd: string;\n restoredState?: unknown;\n emit: Emit;\n /** Directory for driver to store persistent data (e.g. history.json) */\n storageDir: string;\n}\n\n// Type guard helpers\nexport function isSessionUpdate(payload: StreamPayload): payload is SessionUpdate {\n return 'sessionUpdate' in payload;\n}\n\nexport function isAmuxEvent(payload: StreamPayload): payload is AmuxEvent {\n return 'amuxEvent' in payload;\n}\n\n"],"mappings":";AAiDO,SAAS,mBAAmB,OAA0C;AAE3E,QAAM,OAAO,MAAM;AACnB,QAAM,aAAa,MAAM;AACzB,QAAM,aAAa,YAAY;AAG/B,QAAM,mBAAoB,MAAkC;AAE5D,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IACf,QAAQ,MAAM;AAAA,IACd,UAAU,MAAM;AAAA,IAChB,YAAY,cAAc;AAAA,EAC5B;AACF;AAuEO,SAAS,gBAAgB,SAAkD;AAChF,SAAO,mBAAmB;AAC5B;AAEO,SAAS,YAAY,SAA8C;AACxE,SAAO,eAAe;AACxB;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,59 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bytespell/amux",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "Agent Multiplexer -
|
|
3
|
+
"version": "0.0.7",
|
|
4
|
+
"description": "Agent Multiplexer - library for managing agent/terminal processes",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "https://github.com/bytespell-oss/shella"
|
|
8
8
|
},
|
|
9
9
|
"type": "module",
|
|
10
|
-
"bin": {
|
|
11
|
-
"amux": "dist/bin/cli.js"
|
|
12
|
-
},
|
|
13
10
|
"files": [
|
|
14
|
-
"dist/"
|
|
11
|
+
"dist/",
|
|
12
|
+
"scripts/"
|
|
15
13
|
],
|
|
16
14
|
"exports": {
|
|
17
|
-
".": "./dist/
|
|
18
|
-
"
|
|
19
|
-
"./types": "./dist/src/types.js",
|
|
20
|
-
"./db": "./dist/src/db/index.js",
|
|
21
|
-
"./agents/manager": "./dist/src/agents/manager.js",
|
|
22
|
-
"./agents/eventStore": "./dist/src/agents/eventStore.js",
|
|
23
|
-
"./trpc/files": "./dist/src/trpc/files.js",
|
|
24
|
-
"./lib/logger": "./dist/src/lib/logger.js"
|
|
15
|
+
".": "./dist/types.js",
|
|
16
|
+
"./*": "./dist/*.js"
|
|
25
17
|
},
|
|
26
18
|
"scripts": {
|
|
19
|
+
"postinstall": "node scripts/fix-pty.cjs 2>/dev/null || true",
|
|
27
20
|
"build": "tsup",
|
|
28
|
-
"dev": "tsup --watch"
|
|
29
|
-
"start": "node dist/index.js",
|
|
30
|
-
"db:generate": "drizzle-kit generate",
|
|
31
|
-
"db:migrate": "drizzle-kit migrate",
|
|
32
|
-
"db:push": "drizzle-kit push",
|
|
33
|
-
"db:studio": "drizzle-kit studio"
|
|
21
|
+
"dev": "tsup --watch"
|
|
34
22
|
},
|
|
35
23
|
"dependencies": {
|
|
36
24
|
"@agentclientprotocol/sdk": "^0.12.0",
|
|
37
|
-
"@trpc/server": "^11.8.1",
|
|
38
|
-
"better-sqlite3": "^11.10.0",
|
|
39
|
-
"chokidar": "^5.0.0",
|
|
40
|
-
"commander": "^12.0.0",
|
|
41
|
-
"cors": "^2.8.5",
|
|
42
|
-
"drizzle-orm": "^0.45.1",
|
|
43
25
|
"execa": "^9.6.1",
|
|
44
|
-
"express": "^5.2.1",
|
|
45
|
-
"glob": "^13.0.0",
|
|
46
26
|
"node-pty": "^1.2.0-beta.2",
|
|
47
|
-
"tree-kill": "^1.2.2"
|
|
48
|
-
"ws": "^8.19.0",
|
|
49
|
-
"zod": "^3.25.76"
|
|
27
|
+
"tree-kill": "^1.2.2"
|
|
50
28
|
},
|
|
51
29
|
"devDependencies": {
|
|
52
|
-
"@types/
|
|
53
|
-
"@types/cors": "^2.8.19",
|
|
54
|
-
"@types/express": "^5.0.6",
|
|
55
|
-
"@types/node": "^24.10.1",
|
|
56
|
-
"@types/ws": "^8.18.1",
|
|
57
|
-
"drizzle-kit": "^0.31.4"
|
|
30
|
+
"@types/node": "^24.10.1"
|
|
58
31
|
}
|
|
59
32
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
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
|
+
}
|
package/dist/bin/cli.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
createAmuxServer
|
|
4
|
-
} from "../chunk-YYN3GXYP.js";
|
|
5
|
-
import "../chunk-2NON2HR2.js";
|
|
6
|
-
import "../chunk-SX7NC3ZM.js";
|
|
7
|
-
import "../chunk-226DBKL3.js";
|
|
8
|
-
import "../chunk-5IPYOXBE.js";
|
|
9
|
-
import "../chunk-L4DBPVMA.js";
|
|
10
|
-
import "../chunk-OQ5K5ON2.js";
|
|
11
|
-
import "../chunk-PZ5AY32C.js";
|
|
12
|
-
|
|
13
|
-
// bin/cli.ts
|
|
14
|
-
import { program } from "commander";
|
|
15
|
-
var VERSION = "0.1.0";
|
|
16
|
-
program.name("amux").description("Agent Multiplexer - headless server for AI coding agents").version(VERSION).option("-p, --port <port>", "Server port", "3078").action(async (options) => {
|
|
17
|
-
const port = parseInt(options.port, 10);
|
|
18
|
-
const amux = createAmuxServer();
|
|
19
|
-
await amux.start(port);
|
|
20
|
-
const shutdown = async () => {
|
|
21
|
-
await amux.stop();
|
|
22
|
-
process.exit(0);
|
|
23
|
-
};
|
|
24
|
-
process.on("SIGTERM", shutdown);
|
|
25
|
-
process.on("SIGINT", shutdown);
|
|
26
|
-
});
|
|
27
|
-
program.parse();
|
|
28
|
-
//# sourceMappingURL=cli.js.map
|
package/dist/bin/cli.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../bin/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Amux CLI - Headless agent multiplexer server\n *\n * Usage:\n * npx @bytespell/amux Start server on default port\n * npx @bytespell/amux --port 3080 Start on custom port\n */\n\nimport { program } from 'commander';\nimport { createAmuxServer } from '../src/server.js';\n\nconst VERSION = '0.1.0';\n\nprogram\n .name('amux')\n .description('Agent Multiplexer - headless server for AI coding agents')\n .version(VERSION)\n .option('-p, --port <port>', 'Server port', '3078')\n .action(async (options) => {\n const port = parseInt(options.port, 10);\n const amux = createAmuxServer();\n\n await amux.start(port);\n\n // Graceful shutdown\n const shutdown = async () => {\n await amux.stop();\n process.exit(0);\n };\n\n process.on('SIGTERM', shutdown);\n process.on('SIGINT', shutdown);\n });\n\nprogram.parse();\n"],"mappings":";;;;;;;;;;;;;AASA,SAAS,eAAe;AAGxB,IAAM,UAAU;AAEhB,QACG,KAAK,MAAM,EACX,YAAY,0DAA0D,EACtE,QAAQ,OAAO,EACf,OAAO,qBAAqB,eAAe,MAAM,EACjD,OAAO,OAAO,YAAY;AACzB,QAAM,OAAO,SAAS,QAAQ,MAAM,EAAE;AACtC,QAAM,OAAO,iBAAiB;AAE9B,QAAM,KAAK,MAAM,IAAI;AAGrB,QAAM,WAAW,YAAY;AAC3B,UAAM,KAAK,KAAK;AAChB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,GAAG,WAAW,QAAQ;AAC9B,UAAQ,GAAG,UAAU,QAAQ;AAC/B,CAAC;AAEH,QAAQ,MAAM;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["// Re-export ACP types from SDK\nexport type {\n SessionUpdate,\n ContentBlock,\n ContentChunk,\n TextContent,\n ImageContent,\n AudioContent,\n EmbeddedResource,\n ResourceLink,\n PlanEntry as AcpPlanEntry,\n PlanEntryPriority,\n PlanEntryStatus,\n Plan,\n AvailableCommand,\n AvailableCommandsUpdate,\n CurrentModeUpdate,\n ToolCall,\n ToolCallUpdate,\n ToolCallStatus,\n PermissionOption,\n RequestPermissionRequest,\n RequestPermissionResponse,\n} from '@agentclientprotocol/sdk';\n\nimport type { PlanEntry as AcpPlanEntry, PlanEntryPriority, PlanEntryStatus, SessionUpdate } from '@agentclientprotocol/sdk';\n\n/**\n * Normalized PlanEntry that handles agent-specific quirks.\n *\n * Standard ACP: content, priority, status\n * Claude-style: content, status, activeForm (priority always \"medium\")\n *\n * The `activeForm` field provides a present-tense description (e.g., \"Analyzing tests\")\n * vs the imperative `content` (e.g., \"Analyze tests\"). When `activeForm` is present\n * and the status is \"in_progress\", UI should prefer displaying `activeForm`.\n */\nexport interface NormalizedPlanEntry {\n content: string;\n status: PlanEntryStatus;\n priority: PlanEntryPriority;\n /** Present-tense form for in_progress display (Claude-style). */\n activeForm?: string;\n}\n\n/**\n * Normalize an incoming ACP plan entry.\n * Extracts `activeForm` from Claude's `_meta.claudeCode` extension if present.\n */\nexport function normalizePlanEntry(entry: AcpPlanEntry): NormalizedPlanEntry {\n // Try to extract activeForm from _meta.claudeCode (if claude-acp sends it there)\n const meta = entry._meta as Record<string, unknown> | undefined;\n const claudeCode = meta?.claudeCode as Record<string, unknown> | undefined;\n const activeForm = claudeCode?.activeForm as string | undefined;\n\n // Also check if activeForm is directly on the entry (non-standard but possible)\n const directActiveForm = (entry as Record<string, unknown>).activeForm as string | undefined;\n\n return {\n content: entry.content,\n status: entry.status,\n priority: entry.priority,\n activeForm: activeForm ?? directActiveForm,\n };\n}\n\n// Model and mode info returned from agent session\nexport interface ModelInfo {\n modelId: string;\n name: string;\n}\n\nexport interface ModeInfo {\n id: string;\n name: string;\n description?: string;\n}\n\n// Permission types for WebSocket push\nexport interface PendingPermission {\n requestId: string;\n toolCallId?: string;\n title: string;\n options: Array<{ optionId: string; name: string; kind: string }>;\n}\n\n// amux events pushed via WebSocket subscription.\n// ACP blocking RPCs (requestPermission, prompt) need WebSocket notifications\n// so the UI can track state independently of RPC callbacks (e.g. after page reload).\n// Pattern: RPC start → notification, RPC complete → notification\nexport type AmuxEvent =\n | { amuxEvent: 'error'; message: string }\n | { amuxEvent: 'permission_request'; permission: PendingPermission }\n | { amuxEvent: 'permission_cleared' }\n | { amuxEvent: 'turn_start' }\n | { amuxEvent: 'turn_end' }\n | { amuxEvent: 'turn_cancelled' }\n // Terminal-specific events (ShellBackend)\n | { amuxEvent: 'terminal_output'; data: string }\n | { amuxEvent: 'terminal_exit'; exitCode: number | null; signal: string | null };\n\n// Combined type for session subscriptions\nexport type WindowUpdate = SessionUpdate | AmuxEvent;\n\n// Event emitted by amux when a session update occurs\nexport interface SessionEvent {\n sessionId: string;\n update: WindowUpdate;\n}\n\n// Type guard helpers\nexport function isSessionUpdate(update: WindowUpdate): update is SessionUpdate {\n return 'sessionUpdate' in update;\n}\n\nexport function isAmuxEvent(update: WindowUpdate): update is AmuxEvent {\n return 'amuxEvent' in update;\n}\n"],"mappings":";AAiDO,SAAS,mBAAmB,OAA0C;AAE3E,QAAM,OAAO,MAAM;AACnB,QAAM,aAAa,MAAM;AACzB,QAAM,aAAa,YAAY;AAG/B,QAAM,mBAAoB,MAAkC;AAE5D,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IACf,QAAQ,MAAM;AAAA,IACd,UAAU,MAAM;AAAA,IAChB,YAAY,cAAc;AAAA,EAC5B;AACF;AA+CO,SAAS,gBAAgB,QAA+C;AAC7E,SAAO,mBAAmB;AAC5B;AAEO,SAAS,YAAY,QAA2C;AACrE,SAAO,eAAe;AACxB;","names":[]}
|