@geteigen/cli 0.0.0-stage → 3.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 (172) hide show
  1. package/README.md +154 -2
  2. package/dist/agent.d.ts +32 -0
  3. package/dist/agent.js +246 -0
  4. package/dist/auth.d.ts +5 -0
  5. package/dist/auth.js +33 -0
  6. package/dist/cli/src/agent.d.ts +24 -0
  7. package/dist/cli/src/agent.js +263 -0
  8. package/dist/cli/src/agentTools.d.ts +6 -0
  9. package/dist/cli/src/agentTools.js +104 -0
  10. package/dist/cli/src/auth.d.ts +5 -0
  11. package/dist/cli/src/auth.js +33 -0
  12. package/dist/cli/src/cliEnv.d.ts +6 -0
  13. package/dist/cli/src/cliEnv.js +26 -0
  14. package/dist/cli/src/config.d.ts +11 -0
  15. package/dist/cli/src/config.js +51 -0
  16. package/dist/cli/src/cursorAuth.d.ts +10 -0
  17. package/dist/cli/src/cursorAuth.js +92 -0
  18. package/dist/cli/src/gitAuthEnv.d.ts +5 -0
  19. package/dist/cli/src/gitAuthEnv.js +35 -0
  20. package/dist/cli/src/index.d.ts +2 -0
  21. package/dist/cli/src/index.js +244 -0
  22. package/dist/cli/src/listModels.d.ts +14 -0
  23. package/dist/cli/src/listModels.js +196 -0
  24. package/dist/cli/src/listSessions.d.ts +9 -0
  25. package/dist/cli/src/listSessions.js +37 -0
  26. package/dist/cli/src/machineConfig.d.ts +20 -0
  27. package/dist/cli/src/machineConfig.js +66 -0
  28. package/dist/cli/src/pickFolder.d.ts +5 -0
  29. package/dist/cli/src/pickFolder.js +65 -0
  30. package/dist/cli/src/proc.d.ts +31 -0
  31. package/dist/cli/src/proc.js +97 -0
  32. package/dist/cli/src/service.d.ts +17 -0
  33. package/dist/cli/src/service.js +255 -0
  34. package/dist/cli/src/workRoots.d.ts +30 -0
  35. package/dist/cli/src/workRoots.js +228 -0
  36. package/dist/cli/src/worker.d.ts +8 -0
  37. package/dist/cli/src/worker.js +51 -0
  38. package/dist/cli/src/workerCore.d.ts +47 -0
  39. package/dist/cli/src/workerCore.js +721 -0
  40. package/dist/cli/src/workspace.d.ts +10 -0
  41. package/dist/cli/src/workspace.js +329 -0
  42. package/dist/config.d.ts +11 -0
  43. package/dist/config.js +51 -0
  44. package/dist/cursorAuth.d.ts +10 -0
  45. package/dist/cursorAuth.js +95 -0
  46. package/dist/index.d.ts +2 -0
  47. package/dist/index.js +108 -0
  48. package/dist/listModels.d.ts +6 -0
  49. package/dist/listModels.js +62 -0
  50. package/dist/listSessions.d.ts +9 -0
  51. package/dist/listSessions.js +37 -0
  52. package/dist/pickFolder.d.ts +5 -0
  53. package/dist/pickFolder.js +65 -0
  54. package/dist/shared/actionDrafts.d.ts +83 -0
  55. package/dist/shared/actionDrafts.js +169 -0
  56. package/dist/shared/agentArtifacts.d.ts +49 -0
  57. package/dist/shared/agentArtifacts.js +169 -0
  58. package/dist/shared/agentLabel.d.ts +18 -0
  59. package/dist/shared/agentLabel.js +22 -0
  60. package/dist/shared/agentMentions.d.ts +38 -0
  61. package/dist/shared/agentMentions.js +110 -0
  62. package/dist/shared/agentRepos.d.ts +28 -0
  63. package/dist/shared/agentRepos.js +60 -0
  64. package/dist/shared/agentRunStatus.d.ts +12 -0
  65. package/dist/shared/agentRunStatus.js +17 -0
  66. package/dist/shared/agentUsage.d.ts +24 -0
  67. package/dist/shared/agentUsage.js +139 -0
  68. package/dist/shared/approvals.d.ts +44 -0
  69. package/dist/shared/approvals.js +97 -0
  70. package/dist/shared/askEigen.d.ts +190 -0
  71. package/dist/shared/askEigen.js +76 -0
  72. package/dist/shared/attribution.d.ts +25 -0
  73. package/dist/shared/attribution.js +63 -0
  74. package/dist/shared/automations.d.ts +135 -0
  75. package/dist/shared/automations.js +553 -0
  76. package/dist/shared/backends/claudeCode.d.ts +44 -0
  77. package/dist/shared/backends/claudeCode.js +548 -0
  78. package/dist/shared/backends/codex.d.ts +15 -0
  79. package/dist/shared/backends/codex.js +287 -0
  80. package/dist/shared/backends/cursor.d.ts +111 -0
  81. package/dist/shared/backends/cursor.js +1216 -0
  82. package/dist/shared/backends/index.d.ts +18 -0
  83. package/dist/shared/backends/index.js +58 -0
  84. package/dist/shared/backends/opencode.d.ts +43 -0
  85. package/dist/shared/backends/opencode.js +415 -0
  86. package/dist/shared/backends/types.d.ts +171 -0
  87. package/dist/shared/backends/types.js +19 -0
  88. package/dist/shared/backends/usage.d.ts +8 -0
  89. package/dist/shared/backends/usage.js +71 -0
  90. package/dist/shared/billingPlans.d.ts +60 -0
  91. package/dist/shared/billingPlans.js +262 -0
  92. package/dist/shared/brain.d.ts +353 -0
  93. package/dist/shared/brain.js +487 -0
  94. package/dist/shared/clarifyingQuestions.d.ts +13 -0
  95. package/dist/shared/clarifyingQuestions.js +207 -0
  96. package/dist/shared/claudeModels.d.ts +10 -0
  97. package/dist/shared/claudeModels.js +52 -0
  98. package/dist/shared/cloudBackends.d.ts +21 -0
  99. package/dist/shared/cloudBackends.js +29 -0
  100. package/dist/shared/codexModels.d.ts +10 -0
  101. package/dist/shared/codexModels.js +28 -0
  102. package/dist/shared/contextWindows.d.ts +2 -0
  103. package/dist/shared/contextWindows.js +30 -0
  104. package/dist/shared/cursorMcpConfig.d.ts +14 -0
  105. package/dist/shared/cursorMcpConfig.js +43 -0
  106. package/dist/shared/cursorProjectMcp.d.ts +10 -0
  107. package/dist/shared/cursorProjectMcp.js +42 -0
  108. package/dist/shared/docs.d.ts +59 -0
  109. package/dist/shared/docs.js +87 -0
  110. package/dist/shared/events.d.ts +932 -0
  111. package/dist/shared/events.js +57 -0
  112. package/dist/shared/integrations.d.ts +266 -0
  113. package/dist/shared/integrations.js +449 -0
  114. package/dist/shared/issueTranscript.d.ts +64 -0
  115. package/dist/shared/issueTranscript.js +387 -0
  116. package/dist/shared/issues.d.ts +139 -0
  117. package/dist/shared/issues.js +217 -0
  118. package/dist/shared/machines.d.ts +119 -0
  119. package/dist/shared/machines.js +58 -0
  120. package/dist/shared/markdownMedia.d.ts +13 -0
  121. package/dist/shared/markdownMedia.js +41 -0
  122. package/dist/shared/notificationText.d.ts +6 -0
  123. package/dist/shared/notificationText.js +38 -0
  124. package/dist/shared/opencodeModels.d.ts +19 -0
  125. package/dist/shared/opencodeModels.js +62 -0
  126. package/dist/shared/opencodeSession.d.ts +7 -0
  127. package/dist/shared/opencodeSession.js +30 -0
  128. package/dist/shared/orchestration.d.ts +58 -0
  129. package/dist/shared/orchestration.js +12 -0
  130. package/dist/shared/orgs.d.ts +47 -0
  131. package/dist/shared/orgs.js +49 -0
  132. package/dist/shared/personalOrg.d.ts +5 -0
  133. package/dist/shared/personalOrg.js +12 -0
  134. package/dist/shared/plans.d.ts +3 -0
  135. package/dist/shared/plans.js +19 -0
  136. package/dist/shared/providerModels.d.ts +40 -0
  137. package/dist/shared/providerModels.js +503 -0
  138. package/dist/shared/roomAttention.d.ts +17 -0
  139. package/dist/shared/roomAttention.js +36 -0
  140. package/dist/shared/roomContext.d.ts +120 -0
  141. package/dist/shared/roomContext.js +133 -0
  142. package/dist/shared/roomPermissions.d.ts +56 -0
  143. package/dist/shared/roomPermissions.js +133 -0
  144. package/dist/shared/sessionSeats.d.ts +29 -0
  145. package/dist/shared/sessionSeats.js +57 -0
  146. package/dist/shared/slashCommands.d.ts +39 -0
  147. package/dist/shared/slashCommands.js +166 -0
  148. package/dist/shared/space.d.ts +33 -0
  149. package/dist/shared/space.js +54 -0
  150. package/dist/shared/spaceFeed.d.ts +78 -0
  151. package/dist/shared/spaceFeed.js +194 -0
  152. package/dist/shared/stringifyUnknown.d.ts +1 -0
  153. package/dist/shared/stringifyUnknown.js +1 -0
  154. package/dist/shared/swarm.d.ts +320 -0
  155. package/dist/shared/swarm.js +328 -0
  156. package/dist/shared/swarmVisual.d.ts +79 -0
  157. package/dist/shared/swarmVisual.js +212 -0
  158. package/dist/shared/terminalFilter.d.ts +13 -0
  159. package/dist/shared/terminalFilter.js +46 -0
  160. package/dist/shared/toolIntegration.d.ts +56 -0
  161. package/dist/shared/toolIntegration.js +180 -0
  162. package/dist/shared/typing.d.ts +9 -0
  163. package/dist/shared/typing.js +37 -0
  164. package/dist/shared/uploads.d.ts +31 -0
  165. package/dist/shared/uploads.js +65 -0
  166. package/dist/shared/voiceApprovals.d.ts +36 -0
  167. package/dist/shared/voiceApprovals.js +229 -0
  168. package/dist/shared/workspace.d.ts +49 -0
  169. package/dist/shared/workspace.js +53 -0
  170. package/dist/worker.d.ts +1 -0
  171. package/dist/worker.js +266 -0
  172. package/package.json +51 -4
@@ -0,0 +1,49 @@
1
+ /** Git / file browsing data shared by cloud sandboxes and local machines. */
2
+ export interface WorkspaceGitChange {
3
+ status: string;
4
+ path: string;
5
+ }
6
+ export interface WorkspaceGitCommit {
7
+ sha: string;
8
+ subject: string;
9
+ author: string;
10
+ relativeTime: string;
11
+ }
12
+ export interface WorkspaceGitSnapshot {
13
+ branch: string | null;
14
+ changes: WorkspaceGitChange[];
15
+ /** Uncommitted diff against HEAD (truncated). */
16
+ diff: string;
17
+ diffTruncated: boolean;
18
+ commits: WorkspaceGitCommit[];
19
+ ahead: number | null;
20
+ prUrl?: string | null;
21
+ /** Local and remote-tracking branch names, for the git panel switcher. */
22
+ branches?: string[];
23
+ }
24
+ /** Branch names from `git branch -a --format=%(refname:short)`. */
25
+ export declare function parseGitBranches(raw: string, current: string | null): string[];
26
+ export declare function assertGitBranchName(raw: string): string;
27
+ export declare function assertCommitMessage(raw: string): string;
28
+ /** Repo-relative path from `git status --porcelain` (or an empty string to discard everything). */
29
+ export declare function assertGitChangePath(raw: string): string;
30
+ export interface WorkspaceRepoEntry {
31
+ name: string;
32
+ /** Repo-relative path. */
33
+ path: string;
34
+ type: "dir" | "file";
35
+ sizeBytes?: number;
36
+ }
37
+ export interface WorkspaceRepoFile {
38
+ path: string;
39
+ sizeBytes: number;
40
+ content: string | null;
41
+ binary: boolean;
42
+ truncated: boolean;
43
+ /** Inline preview for raster images (base64 data URL). */
44
+ imageDataUrl?: string;
45
+ }
46
+ export interface WorkspacePathMatch {
47
+ path: string;
48
+ type: "dir" | "file";
49
+ }
@@ -0,0 +1,53 @@
1
+ /** Git / file browsing data shared by cloud sandboxes and local machines. */
2
+ /** Branch names from `git branch -a --format=%(refname:short)`. */
3
+ export function parseGitBranches(raw, current) {
4
+ const names = new Set();
5
+ for (const line of raw.split("\n")) {
6
+ let name = line.trim();
7
+ if (!name || name === "HEAD" || name.includes("->"))
8
+ continue;
9
+ if (name.startsWith("origin/"))
10
+ name = name.slice("origin/".length);
11
+ if (!name || name === "HEAD")
12
+ continue;
13
+ names.add(name);
14
+ }
15
+ if (current && current !== "HEAD")
16
+ names.add(current);
17
+ return [...names].sort((a, b) => a.localeCompare(b)).slice(0, 200);
18
+ }
19
+ export function assertGitBranchName(raw) {
20
+ const branch = raw.trim();
21
+ if (!branch ||
22
+ branch.length > 200 ||
23
+ branch.startsWith("-") ||
24
+ branch.includes("..") ||
25
+ branch.endsWith("/") ||
26
+ branch.endsWith(".lock") ||
27
+ branch.includes("@{") ||
28
+ !/^[A-Za-z0-9][A-Za-z0-9._/-]*$/.test(branch)) {
29
+ throw new Error("Invalid branch name");
30
+ }
31
+ return branch;
32
+ }
33
+ export function assertCommitMessage(raw) {
34
+ const message = raw.replace(/\r\n/g, "\n").trim();
35
+ if (!message)
36
+ throw new Error("Write a commit message");
37
+ if (message.length > 5_000)
38
+ throw new Error("Commit message is too long");
39
+ return message;
40
+ }
41
+ /** Repo-relative path from `git status --porcelain` (or an empty string to discard everything). */
42
+ export function assertGitChangePath(raw) {
43
+ const path = raw.trim().replace(/\\/g, "/").replace(/^"+|"+$/g, "");
44
+ if (!path)
45
+ return "";
46
+ if (path.length > 1_000 ||
47
+ path.startsWith("/") ||
48
+ path.includes("\0") ||
49
+ path.split("/").some((part) => part === "..")) {
50
+ throw new Error("Invalid path");
51
+ }
52
+ return path;
53
+ }
@@ -0,0 +1 @@
1
+ export declare function startWorker(repoPathOverride?: string): void;
package/dist/worker.js ADDED
@@ -0,0 +1,266 @@
1
+ import { io } from "socket.io-client";
2
+ import { hostname } from "os";
3
+ import { createHash } from "crypto";
4
+ import chalk from "chalk";
5
+ import { loadConfig } from "./config.js";
6
+ import { pickFolder } from "./pickFolder.js";
7
+ import { listLocalModels } from "./listModels.js";
8
+ import { runAgent, abortAgent, isEditTool, getFileDiff, } from "./agent.js";
9
+ import { listChatSessions } from "./listSessions.js";
10
+ function generateWorkerId(email) {
11
+ const raw = `${hostname()}-${email}`;
12
+ return createHash("sha256").update(raw).digest("hex").slice(0, 16);
13
+ }
14
+ export function startWorker(repoPathOverride) {
15
+ const config = loadConfig();
16
+ if (!config) {
17
+ console.error(chalk.red("Not logged in. Run `steer login` first."));
18
+ process.exit(1);
19
+ }
20
+ const workerId = generateWorkerId(config.email);
21
+ const serverUrl = config.serverUrl;
22
+ console.log(chalk.blue("Connecting to"), serverUrl);
23
+ console.log(chalk.gray(`Worker ID: ${workerId}`));
24
+ let activeRoomId = null;
25
+ let runSeq = 0;
26
+ /** Events produced while offline — flushed on reconnect (agent keeps running). */
27
+ const offlineQueue = [];
28
+ const MAX_QUEUE = 500;
29
+ const socket = io(`${serverUrl}/worker`, {
30
+ auth: { token: config.token },
31
+ reconnection: true,
32
+ reconnectionAttempts: Infinity,
33
+ reconnectionDelay: 2000,
34
+ reconnectionDelayMax: 30000,
35
+ transports: ["websocket", "polling"],
36
+ });
37
+ const emitOrQueue = (event, payload) => {
38
+ if (socket.connected) {
39
+ socket.emit(event, payload);
40
+ return;
41
+ }
42
+ if (offlineQueue.length >= MAX_QUEUE)
43
+ offlineQueue.shift();
44
+ offlineQueue.push({ event, payload });
45
+ };
46
+ const flushQueue = () => {
47
+ if (!offlineQueue.length)
48
+ return;
49
+ console.log(chalk.gray(` Flushing ${offlineQueue.length} buffered event(s)…`));
50
+ const batch = offlineQueue.splice(0, offlineQueue.length);
51
+ for (const item of batch) {
52
+ socket.emit(item.event, item.payload);
53
+ }
54
+ };
55
+ const announceReady = () => {
56
+ socket.emit("worker:ready", {
57
+ workerId,
58
+ machineName: hostname(),
59
+ activeRoomId,
60
+ busy: Boolean(activeRoomId),
61
+ });
62
+ };
63
+ socket.on("connect", () => {
64
+ console.log(chalk.green("✓ Connected to server"));
65
+ if (activeRoomId) {
66
+ console.log(chalk.cyan(` Agent still running for room ${activeRoomId} — resuming stream`));
67
+ }
68
+ announceReady();
69
+ flushQueue();
70
+ });
71
+ socket.on("disconnect", (reason) => {
72
+ console.log(chalk.yellow(`Disconnected: ${reason}`));
73
+ if (activeRoomId) {
74
+ console.log(chalk.yellow(` Agent keeps running locally for room ${activeRoomId} (will sync on reconnect)`));
75
+ }
76
+ // Do NOT abortAgent() — Cursor should finish even if the socket drops.
77
+ });
78
+ socket.on("connect_error", (err) => {
79
+ console.error(chalk.red(`Connection error: ${err.message}`));
80
+ });
81
+ socket.on("worker:run-prompt", (payload) => {
82
+ const { roomId, prompt, repoPath: payloadRepoPath, modelId, sessionId, } = payload;
83
+ const repoPath = repoPathOverride || payloadRepoPath;
84
+ if (activeRoomId) {
85
+ console.log(chalk.yellow(` Rejecting new prompt — already running for room ${activeRoomId}`));
86
+ emitOrQueue("worker:agent-event", {
87
+ roomId,
88
+ event: {
89
+ kind: "error",
90
+ message: "Worker is already running another prompt",
91
+ },
92
+ });
93
+ emitOrQueue("worker:agent-event", {
94
+ roomId,
95
+ event: { kind: "done", result: "" },
96
+ });
97
+ return;
98
+ }
99
+ const thisRun = ++runSeq;
100
+ activeRoomId = roomId;
101
+ console.log(chalk.cyan(`\n━━━ Running prompt in room ${roomId} ━━━`));
102
+ console.log(chalk.gray(`Repo: ${repoPath}`));
103
+ console.log(chalk.gray(`Model: ${modelId}`));
104
+ console.log(chalk.gray(`Prompt: ${prompt.slice(0, 100)}${prompt.length > 100 ? "…" : ""}`));
105
+ const editedPaths = new Set();
106
+ let lastMsgId = "";
107
+ let emittedTerminal = false;
108
+ const onEvent = (event) => {
109
+ if (thisRun !== runSeq)
110
+ return;
111
+ if (event.kind === "done" || event.kind === "error") {
112
+ emittedTerminal = true;
113
+ }
114
+ emitOrQueue("worker:agent-event", { roomId, event });
115
+ if (event.kind === "tool_start") {
116
+ console.log(chalk.yellow(` ▸ ${event.name} ${event.detail}`));
117
+ }
118
+ else if (event.kind === "tool_done") {
119
+ console.log(chalk.green(` ✓ ${event.name} ${event.detail}`));
120
+ if (isEditTool(event.name) && event.path) {
121
+ editedPaths.add(event.path);
122
+ lastMsgId = event.callId;
123
+ }
124
+ }
125
+ else if (event.kind === "assistant_final") {
126
+ console.log(chalk.white(` Assistant: ${event.text.slice(0, 120)}…`));
127
+ }
128
+ else if (event.kind === "error") {
129
+ console.error(chalk.red(` ✗ Error: ${event.message}`));
130
+ }
131
+ else if (event.kind === "done") {
132
+ console.log(chalk.green(" ✓ Agent finished"));
133
+ }
134
+ };
135
+ const finishRun = (terminal) => {
136
+ if (thisRun !== runSeq)
137
+ return;
138
+ if (terminal && !emittedTerminal) {
139
+ emitOrQueue("worker:agent-event", { roomId, event: terminal });
140
+ emittedTerminal = true;
141
+ }
142
+ else if (!emittedTerminal) {
143
+ emitOrQueue("worker:agent-event", {
144
+ roomId,
145
+ event: { kind: "done", result: "" },
146
+ });
147
+ emittedTerminal = true;
148
+ }
149
+ if (activeRoomId === roomId)
150
+ activeRoomId = null;
151
+ };
152
+ runAgent(repoPath, prompt, modelId, onEvent, sessionId)
153
+ .then(async () => {
154
+ if (thisRun !== runSeq)
155
+ return;
156
+ for (const filePath of editedPaths) {
157
+ try {
158
+ const patch = await getFileDiff(repoPath, filePath);
159
+ if (patch) {
160
+ emitOrQueue("worker:file-diff", {
161
+ roomId,
162
+ msgId: lastMsgId,
163
+ toolName: "edit",
164
+ path: filePath,
165
+ patch,
166
+ });
167
+ }
168
+ }
169
+ catch {
170
+ // diff failures are non-fatal
171
+ }
172
+ }
173
+ finishRun({ kind: "done", result: "" });
174
+ })
175
+ .catch((err) => {
176
+ if (thisRun !== runSeq)
177
+ return;
178
+ const message = err.message || "Agent error";
179
+ console.error(chalk.red(`Agent error: ${message}`));
180
+ finishRun({ kind: "error", message });
181
+ emitOrQueue("worker:agent-event", {
182
+ roomId,
183
+ event: { kind: "done", result: "" },
184
+ });
185
+ });
186
+ });
187
+ socket.on("worker:abort", (_payload) => {
188
+ console.log(chalk.yellow(" ⚠ Abort requested"));
189
+ abortAgent();
190
+ });
191
+ socket.on("worker:pick-folder", async (payload) => {
192
+ console.log(chalk.cyan(" 📂 Opening folder picker…"));
193
+ try {
194
+ const path = await pickFolder();
195
+ if (path) {
196
+ console.log(chalk.green(` ✓ Selected: ${path}`));
197
+ }
198
+ else {
199
+ console.log(chalk.yellow(" Folder pick cancelled"));
200
+ }
201
+ emitOrQueue("worker:folder-picked", {
202
+ requestId: payload.requestId,
203
+ path,
204
+ });
205
+ }
206
+ catch (err) {
207
+ const message = err.message;
208
+ console.error(chalk.red(` ✗ Folder picker error: ${message}`));
209
+ emitOrQueue("worker:folder-picked", {
210
+ requestId: payload.requestId,
211
+ path: null,
212
+ error: message,
213
+ });
214
+ }
215
+ });
216
+ socket.on("worker:list-models", async (payload) => {
217
+ console.log(chalk.cyan(" Listing Cursor models…"));
218
+ try {
219
+ const models = await listLocalModels();
220
+ console.log(chalk.green(` ✓ ${models.length} models`));
221
+ emitOrQueue("worker:models-listed", {
222
+ requestId: payload.requestId,
223
+ models,
224
+ });
225
+ }
226
+ catch (err) {
227
+ const message = err.message;
228
+ console.error(chalk.red(` ✗ List models error: ${message}`));
229
+ emitOrQueue("worker:models-listed", {
230
+ requestId: payload.requestId,
231
+ error: message,
232
+ });
233
+ }
234
+ });
235
+ socket.on("worker:list-sessions", (payload) => {
236
+ console.log(chalk.cyan(` Listing Cursor chats for ${payload.repoPath}…`));
237
+ try {
238
+ const sessions = listChatSessions(payload.repoPath);
239
+ console.log(chalk.green(` ✓ ${sessions.length} chat(s)`));
240
+ emitOrQueue("worker:sessions-listed", {
241
+ requestId: payload.requestId,
242
+ sessions,
243
+ });
244
+ }
245
+ catch (err) {
246
+ const message = err.message;
247
+ console.error(chalk.red(` ✗ List sessions error: ${message}`));
248
+ emitOrQueue("worker:sessions-listed", {
249
+ requestId: payload.requestId,
250
+ sessions: [],
251
+ error: message,
252
+ });
253
+ }
254
+ });
255
+ process.on("SIGINT", () => {
256
+ console.log(chalk.gray("\nShutting down worker…"));
257
+ abortAgent();
258
+ socket.disconnect();
259
+ process.exit(0);
260
+ });
261
+ process.on("SIGTERM", () => {
262
+ abortAgent();
263
+ socket.disconnect();
264
+ process.exit(0);
265
+ });
266
+ }
package/package.json CHANGED
@@ -1,6 +1,53 @@
1
1
  {
2
2
  "name": "@geteigen/cli",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "3.1.0",
4
+ "description": "CLI worker for Eigen — run local Cursor/ Claude Code/Codex AI agents for multiplayer sessions",
5
+ "type": "module",
6
+ "bin": {
7
+ "eigen": "./dist/cli/src/index.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "README.md"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "dev": "tsx src/index.ts",
16
+ "prepublishOnly": "pnpm build"
17
+ },
18
+ "keywords": [
19
+ "cursor",
20
+ "claude",
21
+ "claude-code",
22
+ "agent",
23
+ "cli",
24
+ "steer",
25
+ "multiplayer",
26
+ "codex"
27
+ ],
28
+ "license": "MIT",
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "engines": {
33
+ "node": ">=18"
34
+ },
35
+ "dependencies": {
36
+ "chalk": "^5.4.0",
37
+ "commander": "^13.0.0",
38
+ "cross-spawn": "^7",
39
+ "ora": "^8.0.0",
40
+ "socket.io-client": "^4.8.0"
41
+ },
42
+ "devDependencies": {
43
+ "@types/cross-spawn": "^6",
44
+ "@types/node": "^22.0.0",
45
+ "tsx": "^4.19.0",
46
+ "typescript": "^5.7.0"
47
+ },
48
+ "pnpm": {
49
+ "onlyBuiltDependencies": [
50
+ "esbuild"
51
+ ]
52
+ }
53
+ }