@songsid/agend 0.0.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 (232) hide show
  1. package/README.md +210 -0
  2. package/README.zh-TW.md +134 -0
  3. package/dist/access-path.d.ts +10 -0
  4. package/dist/access-path.js +32 -0
  5. package/dist/access-path.js.map +1 -0
  6. package/dist/adapter-world.d.ts +25 -0
  7. package/dist/adapter-world.js +41 -0
  8. package/dist/adapter-world.js.map +1 -0
  9. package/dist/agent-cli-instructions.md +50 -0
  10. package/dist/agent-cli.d.ts +2 -0
  11. package/dist/agent-cli.js +200 -0
  12. package/dist/agent-cli.js.map +1 -0
  13. package/dist/agent-endpoint.d.ts +25 -0
  14. package/dist/agent-endpoint.js +162 -0
  15. package/dist/agent-endpoint.js.map +1 -0
  16. package/dist/backend/antigravity.d.ts +17 -0
  17. package/dist/backend/antigravity.js +98 -0
  18. package/dist/backend/antigravity.js.map +1 -0
  19. package/dist/backend/claude-code.d.ts +23 -0
  20. package/dist/backend/claude-code.js +171 -0
  21. package/dist/backend/claude-code.js.map +1 -0
  22. package/dist/backend/codex.d.ts +18 -0
  23. package/dist/backend/codex.js +160 -0
  24. package/dist/backend/codex.js.map +1 -0
  25. package/dist/backend/factory.d.ts +2 -0
  26. package/dist/backend/factory.js +28 -0
  27. package/dist/backend/factory.js.map +1 -0
  28. package/dist/backend/gemini-cli.d.ts +17 -0
  29. package/dist/backend/gemini-cli.js +163 -0
  30. package/dist/backend/gemini-cli.js.map +1 -0
  31. package/dist/backend/index.d.ts +7 -0
  32. package/dist/backend/index.js +7 -0
  33. package/dist/backend/index.js.map +1 -0
  34. package/dist/backend/kiro.d.ts +17 -0
  35. package/dist/backend/kiro.js +147 -0
  36. package/dist/backend/kiro.js.map +1 -0
  37. package/dist/backend/marker-utils.d.ts +13 -0
  38. package/dist/backend/marker-utils.js +64 -0
  39. package/dist/backend/marker-utils.js.map +1 -0
  40. package/dist/backend/mock.d.ts +25 -0
  41. package/dist/backend/mock.js +85 -0
  42. package/dist/backend/mock.js.map +1 -0
  43. package/dist/backend/opencode.d.ts +16 -0
  44. package/dist/backend/opencode.js +136 -0
  45. package/dist/backend/opencode.js.map +1 -0
  46. package/dist/backend/types.d.ts +86 -0
  47. package/dist/backend/types.js +33 -0
  48. package/dist/backend/types.js.map +1 -0
  49. package/dist/channel/access-manager.d.ts +18 -0
  50. package/dist/channel/access-manager.js +153 -0
  51. package/dist/channel/access-manager.js.map +1 -0
  52. package/dist/channel/adapters/telegram.d.ts +63 -0
  53. package/dist/channel/adapters/telegram.js +646 -0
  54. package/dist/channel/adapters/telegram.js.map +1 -0
  55. package/dist/channel/attachment-handler.d.ts +15 -0
  56. package/dist/channel/attachment-handler.js +88 -0
  57. package/dist/channel/attachment-handler.js.map +1 -0
  58. package/dist/channel/factory.d.ts +12 -0
  59. package/dist/channel/factory.js +67 -0
  60. package/dist/channel/factory.js.map +1 -0
  61. package/dist/channel/ipc-bridge.d.ts +26 -0
  62. package/dist/channel/ipc-bridge.js +220 -0
  63. package/dist/channel/ipc-bridge.js.map +1 -0
  64. package/dist/channel/mcp-server.d.ts +10 -0
  65. package/dist/channel/mcp-server.js +288 -0
  66. package/dist/channel/mcp-server.js.map +1 -0
  67. package/dist/channel/mcp-tools.d.ts +17 -0
  68. package/dist/channel/mcp-tools.js +110 -0
  69. package/dist/channel/mcp-tools.js.map +1 -0
  70. package/dist/channel/message-bus.d.ts +17 -0
  71. package/dist/channel/message-bus.js +86 -0
  72. package/dist/channel/message-bus.js.map +1 -0
  73. package/dist/channel/message-queue.d.ts +39 -0
  74. package/dist/channel/message-queue.js +253 -0
  75. package/dist/channel/message-queue.js.map +1 -0
  76. package/dist/channel/tool-router.d.ts +6 -0
  77. package/dist/channel/tool-router.js +75 -0
  78. package/dist/channel/tool-router.js.map +1 -0
  79. package/dist/channel/tool-tracker.d.ts +13 -0
  80. package/dist/channel/tool-tracker.js +58 -0
  81. package/dist/channel/tool-tracker.js.map +1 -0
  82. package/dist/channel/types.d.ts +118 -0
  83. package/dist/channel/types.js +2 -0
  84. package/dist/channel/types.js.map +1 -0
  85. package/dist/chat-export.d.ts +4 -0
  86. package/dist/chat-export.js +91 -0
  87. package/dist/chat-export.js.map +1 -0
  88. package/dist/classic-channel-manager.d.ts +59 -0
  89. package/dist/classic-channel-manager.js +193 -0
  90. package/dist/classic-channel-manager.js.map +1 -0
  91. package/dist/cli.d.ts +2 -0
  92. package/dist/cli.js +1833 -0
  93. package/dist/cli.js.map +1 -0
  94. package/dist/config.d.ts +9 -0
  95. package/dist/config.js +118 -0
  96. package/dist/config.js.map +1 -0
  97. package/dist/context-guardian.d.ts +26 -0
  98. package/dist/context-guardian.js +73 -0
  99. package/dist/context-guardian.js.map +1 -0
  100. package/dist/cost-guard.d.ts +36 -0
  101. package/dist/cost-guard.js +147 -0
  102. package/dist/cost-guard.js.map +1 -0
  103. package/dist/daemon-entry.d.ts +1 -0
  104. package/dist/daemon-entry.js +29 -0
  105. package/dist/daemon-entry.js.map +1 -0
  106. package/dist/daemon.d.ts +152 -0
  107. package/dist/daemon.js +1714 -0
  108. package/dist/daemon.js.map +1 -0
  109. package/dist/daily-summary.d.ts +13 -0
  110. package/dist/daily-summary.js +55 -0
  111. package/dist/daily-summary.js.map +1 -0
  112. package/dist/event-log.d.ts +36 -0
  113. package/dist/event-log.js +100 -0
  114. package/dist/event-log.js.map +1 -0
  115. package/dist/export-import.d.ts +2 -0
  116. package/dist/export-import.js +162 -0
  117. package/dist/export-import.js.map +1 -0
  118. package/dist/fleet-context.d.ts +61 -0
  119. package/dist/fleet-context.js +4 -0
  120. package/dist/fleet-context.js.map +1 -0
  121. package/dist/fleet-dashboard-html.d.ts +6 -0
  122. package/dist/fleet-dashboard-html.js +443 -0
  123. package/dist/fleet-dashboard-html.js.map +1 -0
  124. package/dist/fleet-health-server.d.ts +35 -0
  125. package/dist/fleet-health-server.js +290 -0
  126. package/dist/fleet-health-server.js.map +1 -0
  127. package/dist/fleet-instructions.d.ts +5 -0
  128. package/dist/fleet-instructions.js +161 -0
  129. package/dist/fleet-instructions.js.map +1 -0
  130. package/dist/fleet-manager.d.ts +212 -0
  131. package/dist/fleet-manager.js +3655 -0
  132. package/dist/fleet-manager.js.map +1 -0
  133. package/dist/fleet-rpc-handlers.d.ts +42 -0
  134. package/dist/fleet-rpc-handlers.js +356 -0
  135. package/dist/fleet-rpc-handlers.js.map +1 -0
  136. package/dist/fleet-system-prompt.d.ts +11 -0
  137. package/dist/fleet-system-prompt.js +61 -0
  138. package/dist/fleet-system-prompt.js.map +1 -0
  139. package/dist/general-knowledge/skills.md +177 -0
  140. package/dist/hang-detector.d.ts +16 -0
  141. package/dist/hang-detector.js +53 -0
  142. package/dist/hang-detector.js.map +1 -0
  143. package/dist/index.d.ts +8 -0
  144. package/dist/index.js +6 -0
  145. package/dist/index.js.map +1 -0
  146. package/dist/instance-lifecycle.d.ts +90 -0
  147. package/dist/instance-lifecycle.js +592 -0
  148. package/dist/instance-lifecycle.js.map +1 -0
  149. package/dist/instructions.d.ts +15 -0
  150. package/dist/instructions.js +90 -0
  151. package/dist/instructions.js.map +1 -0
  152. package/dist/logger.d.ts +7 -0
  153. package/dist/logger.js +84 -0
  154. package/dist/logger.js.map +1 -0
  155. package/dist/outbound-handlers.d.ts +51 -0
  156. package/dist/outbound-handlers.js +739 -0
  157. package/dist/outbound-handlers.js.map +1 -0
  158. package/dist/outbound-schemas.d.ts +238 -0
  159. package/dist/outbound-schemas.js +248 -0
  160. package/dist/outbound-schemas.js.map +1 -0
  161. package/dist/paths.d.ts +10 -0
  162. package/dist/paths.js +42 -0
  163. package/dist/paths.js.map +1 -0
  164. package/dist/plugin/agend/.claude-plugin/plugin.json +5 -0
  165. package/dist/quickstart.d.ts +1 -0
  166. package/dist/quickstart.js +595 -0
  167. package/dist/quickstart.js.map +1 -0
  168. package/dist/routing-engine.d.ts +22 -0
  169. package/dist/routing-engine.js +44 -0
  170. package/dist/routing-engine.js.map +1 -0
  171. package/dist/safe-async.d.ts +6 -0
  172. package/dist/safe-async.js +20 -0
  173. package/dist/safe-async.js.map +1 -0
  174. package/dist/scheduler/db.d.ts +37 -0
  175. package/dist/scheduler/db.js +360 -0
  176. package/dist/scheduler/db.js.map +1 -0
  177. package/dist/scheduler/db.test.d.ts +1 -0
  178. package/dist/scheduler/db.test.js +92 -0
  179. package/dist/scheduler/db.test.js.map +1 -0
  180. package/dist/scheduler/index.d.ts +4 -0
  181. package/dist/scheduler/index.js +4 -0
  182. package/dist/scheduler/index.js.map +1 -0
  183. package/dist/scheduler/scheduler.d.ts +44 -0
  184. package/dist/scheduler/scheduler.js +197 -0
  185. package/dist/scheduler/scheduler.js.map +1 -0
  186. package/dist/scheduler/scheduler.test.d.ts +1 -0
  187. package/dist/scheduler/scheduler.test.js +119 -0
  188. package/dist/scheduler/scheduler.test.js.map +1 -0
  189. package/dist/scheduler/types.d.ts +107 -0
  190. package/dist/scheduler/types.js +7 -0
  191. package/dist/scheduler/types.js.map +1 -0
  192. package/dist/service-installer.d.ts +17 -0
  193. package/dist/service-installer.js +182 -0
  194. package/dist/service-installer.js.map +1 -0
  195. package/dist/setup-wizard.d.ts +48 -0
  196. package/dist/setup-wizard.js +701 -0
  197. package/dist/setup-wizard.js.map +1 -0
  198. package/dist/statusline-watcher.d.ts +34 -0
  199. package/dist/statusline-watcher.js +73 -0
  200. package/dist/statusline-watcher.js.map +1 -0
  201. package/dist/stt.d.ts +10 -0
  202. package/dist/stt.js +33 -0
  203. package/dist/stt.js.map +1 -0
  204. package/dist/tmux-control.d.ts +52 -0
  205. package/dist/tmux-control.js +207 -0
  206. package/dist/tmux-control.js.map +1 -0
  207. package/dist/tmux-manager.d.ts +44 -0
  208. package/dist/tmux-manager.js +218 -0
  209. package/dist/tmux-manager.js.map +1 -0
  210. package/dist/topic-archiver.d.ts +40 -0
  211. package/dist/topic-archiver.js +103 -0
  212. package/dist/topic-archiver.js.map +1 -0
  213. package/dist/topic-commands.d.ts +28 -0
  214. package/dist/topic-commands.js +359 -0
  215. package/dist/topic-commands.js.map +1 -0
  216. package/dist/transcript-monitor.d.ts +23 -0
  217. package/dist/transcript-monitor.js +164 -0
  218. package/dist/transcript-monitor.js.map +1 -0
  219. package/dist/types.d.ts +211 -0
  220. package/dist/types.js +2 -0
  221. package/dist/types.js.map +1 -0
  222. package/dist/ui/dashboard.html +719 -0
  223. package/dist/web-api.d.ts +101 -0
  224. package/dist/web-api.js +648 -0
  225. package/dist/web-api.js.map +1 -0
  226. package/dist/webhook-emitter.d.ts +15 -0
  227. package/dist/webhook-emitter.js +41 -0
  228. package/dist/webhook-emitter.js.map +1 -0
  229. package/dist/workflow-templates/default.md +35 -0
  230. package/package.json +76 -0
  231. package/templates/launchd.plist.ejs +31 -0
  232. package/templates/systemd.service.ejs +16 -0
@@ -0,0 +1,592 @@
1
+ import { existsSync, readFileSync, mkdirSync, realpathSync } from "node:fs";
2
+ import { join, basename, dirname, resolve, sep as pathSep } from "node:path";
3
+ import { access, unlink } from "node:fs/promises";
4
+ import { getAgendHome } from "./paths.js";
5
+ import { DEFAULT_INSTANCE_CONFIG } from "./config.js";
6
+ import { sanitizeInstanceName } from "./topic-commands.js";
7
+ import { safeHandler } from "./safe-async.js";
8
+ export class InstanceLifecycle {
9
+ ctx;
10
+ /** Active daemon processes: instanceName → Daemon */
11
+ daemons = new Map();
12
+ constructor(ctx) {
13
+ this.ctx = ctx;
14
+ }
15
+ async start(name, config, topicMode) {
16
+ if (this.daemons.has(name)) {
17
+ this.ctx.logger.info({ name }, "Instance already running, skipping");
18
+ return;
19
+ }
20
+ if (!existsSync(config.working_directory)) {
21
+ this.ctx.logger.info({ name, working_directory: config.working_directory }, "Working directory does not exist — creating it");
22
+ mkdirSync(config.working_directory, { recursive: true });
23
+ }
24
+ const instanceDir = this.ctx.getInstanceDir(name);
25
+ mkdirSync(instanceDir, { recursive: true });
26
+ // Defense-in-depth: clear crash state before daemon start
27
+ try {
28
+ await unlink(join(instanceDir, "crash-state.json"));
29
+ }
30
+ catch { }
31
+ const { Daemon } = await import("./daemon.js");
32
+ const { createBackend } = await import("./backend/factory.js");
33
+ const backendName = config.backend ?? this.ctx.fleetConfig?.defaults?.backend ?? "claude-code";
34
+ const backend = createBackend(backendName, instanceDir);
35
+ const daemon = new Daemon(name, config, instanceDir, topicMode, backend, this.ctx.controlClient ?? undefined);
36
+ // Catch errors from daemon internals (e.g. IPC server) to prevent crashing the fleet process
37
+ daemon.on("error", (err) => {
38
+ this.ctx.logger.error({ err, name }, "Daemon emitted error — instance isolated");
39
+ });
40
+ await daemon.start();
41
+ this.daemons.set(name, daemon);
42
+ const hangDetector = daemon.getHangDetector();
43
+ if (hangDetector) {
44
+ hangDetector.on("hang", safeHandler(async () => {
45
+ this.ctx.eventLog?.insert(name, "hang_detected", {});
46
+ this.ctx.logger.warn({ name }, "Instance appears hung");
47
+ // Check if instance has claimed tasks — nudge it to continue
48
+ const claimedTasks = this.ctx.listClaimedTasks(name);
49
+ if (claimedTasks.length > 0) {
50
+ const task = claimedTasks[0];
51
+ this.ctx.eventLog?.insert(name, "idle_task_nudge", { taskId: task.id, taskTitle: task.title });
52
+ // Inject nudge message into the instance's CLI session
53
+ const ipc = this.ctx.instanceIpcClients.get(name);
54
+ if (ipc?.connected) {
55
+ ipc.send({
56
+ type: "fleet_inbound",
57
+ content: `[system] You have a claimed task: "${task.title}" (#${task.id}). Continue working on it, or use task(done) / task(update, status=blocked) to update status.`,
58
+ meta: { chat_id: "", thread_id: "", ts: new Date().toISOString() },
59
+ });
60
+ }
61
+ }
62
+ await this.ctx.sendHangNotification(name);
63
+ this.ctx.webhookEmit("hang", name);
64
+ }, this.ctx.logger, `hangDetector[${name}]`));
65
+ }
66
+ daemon.on("crash_respawn", safeHandler(() => {
67
+ this.ctx.eventLog?.insert(name, "crash_respawn", {});
68
+ this.ctx.logger.warn({ name }, "Instance crashed and respawned");
69
+ this.ctx.notifyInstanceTopic(name, `⚠️ ${name} crashed and respawned.`);
70
+ const generalName = this.findGeneralInstance();
71
+ if (generalName && generalName !== name) {
72
+ this.ctx.notifyInstanceTopic(generalName, `⚠️ ${name} crashed and respawned. Check ~/.agend/daemon.log for details.`);
73
+ }
74
+ }, this.ctx.logger, `daemon.crash_respawn[${name}]`));
75
+ daemon.on("snapshot_failed", safeHandler(() => {
76
+ this.ctx.eventLog?.insert(name, "snapshot_failed", {});
77
+ this.ctx.notifyInstanceTopic(name, `⚠️ ${name}: restarted without context (snapshot injection failed)`);
78
+ }, this.ctx.logger, `daemon.snapshot_failed[${name}]`));
79
+ daemon.on("crash_loop", safeHandler(() => {
80
+ this.ctx.eventLog?.insert(name, "crash_loop", {});
81
+ this.ctx.logger.error({ name }, "Instance in crash loop — respawn paused");
82
+ this.ctx.notifyInstanceTopic(name, `🔴 ${name} keeps crashing shortly after launch — respawn paused. Check rate limits or run \`agend fleet restart\`.`);
83
+ this.ctx.setTopicIcon(name, "red");
84
+ }, this.ctx.logger, `daemon.crash_loop[${name}]`));
85
+ daemon.on("pty_error", safeHandler((data) => {
86
+ this.ctx.eventLog?.insert(name, "pty_error", { type: data.type, action: data.action });
87
+ this.ctx.logger.warn({ name, errorType: data.type, action: data.action }, `PTY error: ${data.message}`);
88
+ const emoji = data.type === "rate_limit" ? "⏳" : data.type === "auth_error" ? "🔑" : "⚠️";
89
+ this.ctx.notifyInstanceTopic(name, `${emoji} ${name}: ${data.message} (action: ${data.action})`);
90
+ this.ctx.webhookEmit("pty_error", name, { type: data.type, action: data.action, message: data.message });
91
+ if (data.action === "failover") {
92
+ this.ctx.checkModelFailover(name, 100); // Force failover trigger
93
+ }
94
+ }, this.ctx.logger, `daemon.pty_error[${name}]`));
95
+ daemon.on("pty_recovered", safeHandler((data) => {
96
+ const mins = Math.floor(data.downtime_s / 60);
97
+ const secs = data.downtime_s % 60;
98
+ const duration = mins > 0 ? `${mins}m ${secs}s` : `${secs}s`;
99
+ this.ctx.eventLog?.insert(name, "pty_recovered", { downtime_s: data.downtime_s });
100
+ this.ctx.logger.info({ name, downtime_s: data.downtime_s }, "PTY error recovered");
101
+ this.ctx.notifyInstanceTopic(name, `✅ ${name}: recovered after ${duration}`);
102
+ this.ctx.webhookEmit("pty_recovered", name, { downtime_s: data.downtime_s });
103
+ }, this.ctx.logger, `daemon.pty_recovered[${name}]`));
104
+ daemon.on("message_queued", (data) => {
105
+ this.ctx.reactMessageStatus(data.chatId, data.messageId, "⏳");
106
+ });
107
+ daemon.on("message_delivered", (data) => {
108
+ this.ctx.reactMessageStatus(data.chatId, data.messageId, "✅");
109
+ });
110
+ this.ctx.setTopicIcon(name, "green");
111
+ this.ctx.touchActivity(name);
112
+ }
113
+ async stop(name) {
114
+ this.ctx.setTopicIcon(name, "remove");
115
+ const daemon = this.daemons.get(name);
116
+ if (daemon) {
117
+ await daemon.stop();
118
+ this.daemons.delete(name);
119
+ }
120
+ else {
121
+ const instanceDir = this.ctx.getInstanceDir(name);
122
+ const pidPath = join(instanceDir, "daemon.pid");
123
+ if (existsSync(pidPath)) {
124
+ const pid = parseInt(readFileSync(pidPath, "utf-8").trim(), 10);
125
+ try {
126
+ process.kill(pid, "SIGTERM");
127
+ }
128
+ catch (e) {
129
+ this.ctx.logger.debug({ err: e, pid }, "SIGTERM failed for stale process");
130
+ }
131
+ }
132
+ // Kill orphaned tmux window (daemon not in memory but window may persist)
133
+ const windowIdPath = join(instanceDir, "window-id");
134
+ if (existsSync(windowIdPath)) {
135
+ const windowId = readFileSync(windowIdPath, "utf-8").trim();
136
+ if (windowId) {
137
+ const { TmuxManager } = await import("./tmux-manager.js");
138
+ const { getTmuxSession } = await import("./config.js");
139
+ const tmux = new TmuxManager(getTmuxSession(), windowId);
140
+ await tmux.killWindow();
141
+ }
142
+ try {
143
+ const { unlinkSync } = await import("node:fs");
144
+ unlinkSync(windowIdPath);
145
+ }
146
+ catch { }
147
+ }
148
+ }
149
+ // Clean up IPC client (prevents stale routing after stop)
150
+ const ipc = this.ctx.instanceIpcClients.get(name);
151
+ if (ipc) {
152
+ try {
153
+ ipc.close();
154
+ }
155
+ catch { /* already closed */ }
156
+ this.ctx.instanceIpcClients.delete(name);
157
+ }
158
+ // Clean up session registry entries pointing to this instance
159
+ for (const [session, instance] of this.ctx.sessionRegistry) {
160
+ if (instance === name)
161
+ this.ctx.sessionRegistry.delete(session);
162
+ }
163
+ }
164
+ async remove(name) {
165
+ const config = this.ctx.fleetConfig?.instances[name];
166
+ if (!config)
167
+ return;
168
+ // Never remove the General instance
169
+ if (config.general_topic) {
170
+ this.ctx.logger.warn({ name }, "Refusing to remove General instance");
171
+ return;
172
+ }
173
+ // Clean up schedules
174
+ // Access scheduler through fleetConfig — scheduler is managed by FleetManager
175
+ // We just clean up instance-related data here
176
+ // Stop daemon and clean up tmux window (handles both in-memory and orphaned cases)
177
+ await this.stop(name);
178
+ // Clean up backend config files (MCP config, instructions, etc.)
179
+ // This is needed even when daemon is not in memory — stop() only calls
180
+ // backend.cleanup() when daemon object exists. Without this, stale MCP
181
+ // entries remain in the working directory and crash new instances.
182
+ if (config.working_directory && config.backend) {
183
+ try {
184
+ const { createBackend } = await import("./backend/factory.js");
185
+ const instanceDir = this.ctx.getInstanceDir(name);
186
+ const backend = createBackend(config.backend, instanceDir);
187
+ if (backend?.cleanup) {
188
+ const backendConfig = {
189
+ workingDirectory: config.working_directory,
190
+ instanceDir,
191
+ instanceName: name,
192
+ mcpServers: {
193
+ agend: { command: "", args: [], env: {} },
194
+ },
195
+ };
196
+ backend.cleanup(backendConfig);
197
+ this.ctx.logger.info({ name }, "Cleaned up backend config files");
198
+ }
199
+ }
200
+ catch (err) {
201
+ this.ctx.logger.debug({ err, name }, "Backend cleanup failed (best effort)");
202
+ }
203
+ }
204
+ // Clean up git worktree if applicable
205
+ if (config.worktree_source && config.working_directory) {
206
+ if (!existsSync(config.working_directory)) {
207
+ this.ctx.logger.info({ worktree: config.working_directory }, "Worktree directory already gone, skipping removal");
208
+ }
209
+ else {
210
+ try {
211
+ const { execFile: execFileCb } = await import("node:child_process");
212
+ const { promisify } = await import("node:util");
213
+ const execFileAsync = promisify(execFileCb);
214
+ await execFileAsync("git", ["worktree", "remove", "--force", config.working_directory], {
215
+ cwd: config.worktree_source,
216
+ });
217
+ this.ctx.logger.info({ worktree: config.working_directory }, "Removed git worktree");
218
+ }
219
+ catch {
220
+ // worktree remove failed — directory exists but isn't a valid worktree.
221
+ // Only rm if directory is in the expected location (sibling of source repo or under ~/.agend/).
222
+ const expectedParent = dirname(config.working_directory);
223
+ const sourceParent = dirname(config.worktree_source);
224
+ if (expectedParent === sourceParent || config.working_directory.startsWith(getAgendHome())) {
225
+ const { rm } = await import("node:fs/promises");
226
+ await rm(config.working_directory, { recursive: true, force: true });
227
+ this.ctx.logger.info({ worktree: config.working_directory }, "Removed orphaned worktree directory");
228
+ }
229
+ else {
230
+ this.ctx.logger.warn({ worktree: config.working_directory }, "Worktree removal failed and directory is outside expected location — skipping rm");
231
+ }
232
+ }
233
+ }
234
+ // Prune stale worktree records (e.g. if directory was manually deleted)
235
+ try {
236
+ const { execFile: execFileCb } = await import("node:child_process");
237
+ const { promisify } = await import("node:util");
238
+ const execFileAsync = promisify(execFileCb);
239
+ await execFileAsync("git", ["worktree", "prune"], { cwd: config.worktree_source });
240
+ }
241
+ catch { /* best effort */ }
242
+ }
243
+ // Clean up IPC
244
+ const ipc = this.ctx.instanceIpcClients.get(name);
245
+ if (ipc) {
246
+ await ipc.close();
247
+ this.ctx.instanceIpcClients.delete(name);
248
+ }
249
+ // Remove from routing table
250
+ if (config.topic_id != null) {
251
+ this.ctx.routing.unregister(config.topic_id);
252
+ }
253
+ // Remove from fleet config and save
254
+ delete this.ctx.fleetConfig.instances[name];
255
+ this.ctx.saveFleetConfig();
256
+ this.ctx.logger.info({ name }, "Instance removed");
257
+ }
258
+ /** Handle create_instance tool call from a daemon. */
259
+ async handleCreate(args, respond, adapterId) {
260
+ const rawDirectory = args.directory;
261
+ const directory = rawDirectory ? rawDirectory.replace(/^~/, process.env.HOME || "~") : undefined;
262
+ const topicName = args.topic_name || (directory ? basename(directory) : undefined);
263
+ const description = args.description;
264
+ const systemPrompt = args.systemPrompt;
265
+ const branch = args.branch;
266
+ const detach = args.detach ?? false;
267
+ if (!directory && !topicName) {
268
+ respond(null, "topic_name is required when directory is not specified");
269
+ return;
270
+ }
271
+ // Validate directory exists (only when explicitly provided)
272
+ if (directory) {
273
+ try {
274
+ await access(directory);
275
+ }
276
+ catch {
277
+ respond(null, `Directory does not exist: ${directory}`);
278
+ return;
279
+ }
280
+ }
281
+ // Enforce project_roots boundary when configured. Use realpathSync so
282
+ // symlinks cannot be used to escape the allowed roots (a directory under
283
+ // an allowed root that symlinks to `/etc` would otherwise pass the string
284
+ // prefix check).
285
+ const roots = this.ctx.fleetConfig?.project_roots;
286
+ if (directory && roots?.length) {
287
+ let resolved;
288
+ try {
289
+ resolved = realpathSync(resolve(directory));
290
+ }
291
+ catch {
292
+ respond(null, `Directory "${directory}" is not accessible`);
293
+ return;
294
+ }
295
+ const allowed = roots.some(r => {
296
+ const raw = resolve(r.replace(/^~/, process.env.HOME || "~"));
297
+ let root;
298
+ try {
299
+ root = realpathSync(raw);
300
+ }
301
+ catch {
302
+ // Root doesn't exist on disk — cannot be a valid boundary.
303
+ return false;
304
+ }
305
+ return resolved === root || resolved.startsWith(root + pathSep);
306
+ });
307
+ if (!allowed) {
308
+ respond(null, `Directory "${directory}" is not under project_roots. Allowed: ${roots.join(", ")}`);
309
+ return;
310
+ }
311
+ }
312
+ // Check for duplicate early (before worktree creation) — only when directory is known and no branch
313
+ if (directory && !branch) {
314
+ const expandHome = (p) => p.replace(/^~/, process.env.HOME || "~");
315
+ const existingInstance = Object.entries(this.ctx.fleetConfig?.instances ?? {})
316
+ .find(([_, config]) => expandHome(config.working_directory) === directory);
317
+ if (existingInstance) {
318
+ const [eName, eConfig] = existingInstance;
319
+ respond({
320
+ success: true,
321
+ status: "already_exists",
322
+ name: eName,
323
+ topic_id: eConfig.topic_id,
324
+ running: this.daemons.has(eName),
325
+ });
326
+ return;
327
+ }
328
+ }
329
+ // If branch specified, create git worktree (requires directory)
330
+ let workDir = directory ?? "";
331
+ let worktreePath;
332
+ if (branch && !directory) {
333
+ respond(null, "directory is required when branch is specified");
334
+ return;
335
+ }
336
+ if (branch) {
337
+ try {
338
+ const { execFile: execFileCb } = await import("node:child_process");
339
+ const { promisify } = await import("node:util");
340
+ const execFileAsync = promisify(execFileCb);
341
+ await execFileAsync("git", ["rev-parse", "--git-dir"], { cwd: directory });
342
+ const customPath = args.worktree_path;
343
+ if (customPath) {
344
+ worktreePath = customPath.replace(/^~/, process.env.HOME || "~");
345
+ }
346
+ else {
347
+ const repoName = basename(directory);
348
+ const safeBranch = branch.replace(/\//g, "-");
349
+ worktreePath = join(dirname(directory), `${repoName}-${safeBranch}`);
350
+ }
351
+ let branchExists = false;
352
+ try {
353
+ await execFileAsync("git", ["rev-parse", "--verify", branch], { cwd: directory });
354
+ branchExists = true;
355
+ }
356
+ catch { /* branch doesn't exist */ }
357
+ if (detach) {
358
+ await execFileAsync("git", ["worktree", "add", "--detach", worktreePath, branch], { cwd: directory });
359
+ }
360
+ else if (branchExists) {
361
+ await execFileAsync("git", ["worktree", "add", worktreePath, branch], { cwd: directory });
362
+ }
363
+ else {
364
+ const startPoint = args.start_point;
365
+ const worktreeArgs = ["worktree", "add", worktreePath, "-b", branch];
366
+ if (startPoint)
367
+ worktreeArgs.push(startPoint);
368
+ await execFileAsync("git", worktreeArgs, { cwd: directory });
369
+ }
370
+ this.ctx.logger.info({ worktreePath, branch, repo: directory }, "Created git worktree for instance");
371
+ workDir = worktreePath;
372
+ }
373
+ catch (err) {
374
+ respond(null, `Failed to create worktree: ${err.message}`);
375
+ return;
376
+ }
377
+ }
378
+ // Check worktree path for duplicates
379
+ if (worktreePath) {
380
+ const expandHome = (p) => p.replace(/^~/, process.env.HOME || "~");
381
+ const existingInstance = Object.entries(this.ctx.fleetConfig?.instances ?? {})
382
+ .find(([_, config]) => expandHome(config.working_directory) === workDir);
383
+ if (existingInstance) {
384
+ const [eName, eConfig] = existingInstance;
385
+ respond({
386
+ success: true,
387
+ status: "already_exists",
388
+ name: eName,
389
+ topic_id: eConfig.topic_id,
390
+ running: this.daemons.has(eName),
391
+ });
392
+ return;
393
+ }
394
+ }
395
+ // Sequential steps with rollback
396
+ let createdTopicId;
397
+ let newInstanceName;
398
+ try {
399
+ createdTopicId = await this.ctx.createForumTopic(topicName, adapterId);
400
+ // Use explicit topic_name as name base when provided; fall back to directory basename
401
+ const explicitTopicName = args.topic_name;
402
+ const nameBase = explicitTopicName ?? (worktreePath ? topicName : (directory ? basename(workDir) : topicName));
403
+ newInstanceName = `${sanitizeInstanceName(nameBase)}-t${createdTopicId}`;
404
+ // If no directory was provided, auto-create default workspace
405
+ if (!directory) {
406
+ workDir = join(getAgendHome(), "workspaces", newInstanceName);
407
+ mkdirSync(workDir, { recursive: true });
408
+ }
409
+ const instanceConfig = {
410
+ ...DEFAULT_INSTANCE_CONFIG,
411
+ ...this.ctx.fleetConfig.defaults,
412
+ working_directory: workDir,
413
+ topic_id: createdTopicId,
414
+ ...(description ? { description } : {}),
415
+ ...(systemPrompt ? { systemPrompt } : {}),
416
+ ...(args.model ? { model: args.model } : {}),
417
+ ...(args.backend ? { backend: args.backend } : {}),
418
+ ...(args.model_failover ? { model_failover: args.model_failover } : {}),
419
+ ...(args.tool_set ? { tool_set: args.tool_set } : {}),
420
+ ...(args.skipPermissions != null ? { skipPermissions: args.skipPermissions } : {}),
421
+ ...(args.lightweight != null ? { lightweight: args.lightweight } : {}),
422
+ ...(args.workflow !== undefined ? { workflow: args.workflow === "false" ? false : args.workflow } : {}),
423
+ ...(args.tags ? { tags: args.tags } : {}),
424
+ ...(worktreePath ? { worktree_source: directory } : {}),
425
+ };
426
+ this.ctx.fleetConfig.instances[newInstanceName] = instanceConfig;
427
+ this.ctx.routing.register(createdTopicId, { kind: "instance", name: newInstanceName });
428
+ this.ctx.saveFleetConfig();
429
+ await this.start(newInstanceName, instanceConfig, true);
430
+ await this.ctx.connectIpcToInstance(newInstanceName);
431
+ respond({
432
+ success: true,
433
+ name: newInstanceName,
434
+ topic_id: createdTopicId,
435
+ ...(worktreePath ? { worktree_path: worktreePath, branch } : {}),
436
+ });
437
+ }
438
+ catch (err) {
439
+ // Rollback in reverse order
440
+ if (newInstanceName && this.daemons.has(newInstanceName)) {
441
+ await this.stop(newInstanceName).catch(e => this.ctx.logger.error({ err: e, name: newInstanceName }, "Failed to stop instance during rollback"));
442
+ }
443
+ if (newInstanceName && this.ctx.fleetConfig?.instances[newInstanceName]) {
444
+ delete this.ctx.fleetConfig.instances[newInstanceName];
445
+ if (createdTopicId)
446
+ this.ctx.routing.unregister(createdTopicId);
447
+ this.ctx.saveFleetConfig();
448
+ }
449
+ if (createdTopicId) {
450
+ await this.ctx.deleteForumTopic(createdTopicId);
451
+ }
452
+ if (worktreePath) {
453
+ try {
454
+ const { execFile: execFileCb } = await import("node:child_process");
455
+ const { promisify } = await import("node:util");
456
+ const execFileAsync = promisify(execFileCb);
457
+ await execFileAsync("git", ["worktree", "remove", "--force", worktreePath], { cwd: directory });
458
+ await execFileAsync("git", ["worktree", "prune"], { cwd: directory });
459
+ }
460
+ catch { /* best-effort worktree cleanup */ }
461
+ }
462
+ else if (!directory && workDir) {
463
+ // Remove auto-created workspace directory
464
+ try {
465
+ const { rm } = await import("node:fs/promises");
466
+ await rm(workDir, { recursive: true, force: true });
467
+ }
468
+ catch { /* best-effort cleanup */ }
469
+ }
470
+ respond(null, `Failed to create instance: ${err.message}`);
471
+ }
472
+ }
473
+ /** Handle delete_instance tool call from a daemon. */
474
+ async handleDelete(args, respond) {
475
+ const instanceName = args.name;
476
+ const deleteTopic = args.delete_topic ?? false;
477
+ const instanceConfig = this.ctx.fleetConfig?.instances[instanceName];
478
+ if (!instanceConfig) {
479
+ respond(null, `Instance not found: ${instanceName}`);
480
+ return;
481
+ }
482
+ if (instanceConfig.general_topic) {
483
+ respond(null, "Cannot delete the General instance");
484
+ return;
485
+ }
486
+ if (deleteTopic && instanceConfig.topic_id) {
487
+ await this.ctx.deleteForumTopic(instanceConfig.topic_id);
488
+ }
489
+ await this.ctx.removeInstance(instanceName);
490
+ respond({ success: true, name: instanceName, topic_deleted: deleteTopic });
491
+ }
492
+ has(name) {
493
+ return this.daemons.has(name);
494
+ }
495
+ /** Handle replace_instance tool call: handover → stop → create new → delete old config.
496
+ * If the old instance has a worktree_source, ownership transfers to the new instance
497
+ * implicitly via savedConfig — the worktree itself is not recreated or removed. */
498
+ async handleReplace(args, respond) {
499
+ const instanceName = args.name;
500
+ const reason = args.reason || "replaced";
501
+ const oldConfig = this.ctx.fleetConfig?.instances[instanceName];
502
+ if (!oldConfig) {
503
+ respond(null, `Instance not found: ${instanceName}`);
504
+ return;
505
+ }
506
+ if (oldConfig.general_topic) {
507
+ respond(null, "Cannot replace the General instance");
508
+ return;
509
+ }
510
+ // 1. Collect handover context from daemon ring buffer (before stopping)
511
+ let handoverContext = "";
512
+ const daemon = this.daemons.get(instanceName);
513
+ if (daemon) {
514
+ handoverContext = daemon.collectHandoverContext();
515
+ }
516
+ // 2. Remember config for recreation
517
+ const savedConfig = { ...oldConfig };
518
+ const topicId = savedConfig.topic_id;
519
+ // 3. Stop old instance (reversible — config still in fleet.yaml)
520
+ await this.stop(instanceName);
521
+ const oldIpc = this.ctx.instanceIpcClients.get(instanceName);
522
+ if (oldIpc) {
523
+ await oldIpc.close();
524
+ this.ctx.instanceIpcClients.delete(instanceName);
525
+ }
526
+ // 4. Remove old config + routing (so new instance can reuse the name/topic)
527
+ if (topicId != null)
528
+ this.ctx.routing.unregister(topicId);
529
+ delete this.ctx.fleetConfig.instances[instanceName];
530
+ this.ctx.saveFleetConfig();
531
+ // 5. Clean instanceDir to avoid stale rotation-state.json / crash-history
532
+ const instanceDir = this.ctx.getInstanceDir(instanceName);
533
+ try {
534
+ const { rm } = await import("node:fs/promises");
535
+ await rm(instanceDir, { recursive: true, force: true });
536
+ }
537
+ catch { /* best effort */ }
538
+ // 6. Create new instance with same config, reusing topic
539
+ const newName = `${instanceName.replace(/-t\d+$/, "")}-t${topicId}`;
540
+ const instanceConfig = { ...savedConfig };
541
+ try {
542
+ this.ctx.fleetConfig.instances[newName] = instanceConfig;
543
+ if (topicId != null)
544
+ this.ctx.routing.register(topicId, { kind: "instance", name: newName });
545
+ this.ctx.saveFleetConfig();
546
+ await this.start(newName, instanceConfig, true);
547
+ await this.ctx.connectIpcToInstance(newName);
548
+ // 7. Send handover context via fleet_inbound (standard message delivery path)
549
+ if (handoverContext) {
550
+ await new Promise(r => setTimeout(r, 3_000));
551
+ const newIpc = this.ctx.instanceIpcClients.get(newName);
552
+ if (newIpc) {
553
+ const handoverMsg = `[system:handover]\nYou are replacing instance "${instanceName}" (reason: ${reason}).\n\n${handoverContext}\n\nResume work based on this context. Do NOT reply to this message — wait for the next user message.`;
554
+ newIpc.send({
555
+ type: "fleet_inbound",
556
+ content: handoverMsg,
557
+ meta: { from_instance: "system", source: "handover", user: "system", ts: new Date().toISOString(), chat_id: "", thread_id: "" },
558
+ });
559
+ }
560
+ }
561
+ respond({
562
+ success: true,
563
+ old_name: instanceName,
564
+ new_name: newName,
565
+ topic_id: topicId,
566
+ reason,
567
+ handover_chars: handoverContext.length,
568
+ });
569
+ }
570
+ catch (err) {
571
+ // Rollback: restore old instance config (new instance failed to start)
572
+ if (this.daemons.has(newName))
573
+ await this.stop(newName).catch(() => { });
574
+ delete this.ctx.fleetConfig.instances[newName];
575
+ // Restore old config so user doesn't lose both instances
576
+ this.ctx.fleetConfig.instances[instanceName] = savedConfig;
577
+ if (topicId != null)
578
+ this.ctx.routing.register(topicId, { kind: "instance", name: instanceName });
579
+ this.ctx.saveFleetConfig();
580
+ respond(null, `Failed to replace instance: ${err.message}. Old instance config restored (stopped).`);
581
+ }
582
+ }
583
+ findGeneralInstance() {
584
+ const instances = this.ctx.fleetConfig?.instances ?? {};
585
+ for (const [n, config] of Object.entries(instances)) {
586
+ if (config.general_topic)
587
+ return n;
588
+ }
589
+ return undefined;
590
+ }
591
+ }
592
+ //# sourceMappingURL=instance-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance-lifecycle.js","sourceRoot":"","sources":["../src/instance-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface FleetInstructionsParams {
2
+ instanceName: string;
3
+ workingDirectory: string;
4
+ displayName?: string;
5
+ description?: string;
6
+ customPrompt?: string;
7
+ workflow?: string | false;
8
+ decisions?: {
9
+ title: string;
10
+ content: string;
11
+ }[];
12
+ /** CLI mode: inject CLI quick reference instead of MCP tool usage section */
13
+ cliInstructions?: string;
14
+ }
15
+ export declare function buildFleetInstructions(params: FleetInstructionsParams): string;