@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,356 @@
1
+ /** Resolve display name for an instance, fallback to instance name. */
2
+ export function resolveDisplayName(ctx, instanceName) {
3
+ return ctx.fleetConfig?.instances[instanceName]?.display_name ?? instanceName;
4
+ }
5
+ /** One-line description of a fleet tool call for activity logs. */
6
+ export function summarizeToolCall(tool, args) {
7
+ switch (tool) {
8
+ case "send_to_instance": return `send_to_instance(${args.instance_name})`;
9
+ case "broadcast": return `broadcast(${args.targets?.join(", ") ?? "all"})`;
10
+ case "request_information": return `request_information(${args.target_instance}, "${(args.question ?? "").slice(0, 60)}")`;
11
+ case "delegate_task": return `delegate_task(${args.target_instance}, "${(args.task ?? "").slice(0, 60)}")`;
12
+ case "report_result": return `report_result(${args.target_instance})`;
13
+ case "task": return `task(${args.action}${args.title ? `, "${args.title.slice(0, 40)}"` : args.id ? `, ${args.id.slice(0, 8)}` : ""})`;
14
+ case "post_decision": return `post_decision("${(args.title ?? "").slice(0, 40)}")`;
15
+ case "list_decisions": return "list_decisions()";
16
+ case "list_instances": return "list_instances()";
17
+ case "describe_instance": return `describe_instance(${args.name})`;
18
+ case "start_instance": return `start_instance(${args.name})`;
19
+ case "create_instance": return `create_instance(${args.directory})`;
20
+ case "delete_instance": return `delete_instance(${args.name})`;
21
+ case "replace_instance": return `replace_instance(${args.name})`;
22
+ default: return `${tool}()`;
23
+ }
24
+ }
25
+ export const rpcHandlers = {
26
+ handleScheduleCrud(ctx, instanceName, msg) {
27
+ const fleetRequestId = msg.fleetRequestId;
28
+ const payload = (msg.payload ?? {});
29
+ const meta = (msg.meta ?? {});
30
+ const ipc = ctx.instanceIpcClients.get(instanceName);
31
+ if (!ipc)
32
+ return;
33
+ try {
34
+ let result;
35
+ switch (msg.type) {
36
+ case "fleet_schedule_create": {
37
+ const params = {
38
+ cron: payload.cron,
39
+ message: payload.message,
40
+ source: instanceName,
41
+ target: payload.target || instanceName,
42
+ reply_chat_id: meta.chat_id,
43
+ reply_thread_id: meta.thread_id || null,
44
+ label: payload.label,
45
+ timezone: payload.timezone,
46
+ };
47
+ result = ctx.scheduler.create(params);
48
+ break;
49
+ }
50
+ case "fleet_schedule_list":
51
+ result = ctx.scheduler.list(payload.target);
52
+ break;
53
+ case "fleet_schedule_update":
54
+ result = ctx.scheduler.update(payload.id, payload);
55
+ break;
56
+ case "fleet_schedule_delete":
57
+ ctx.scheduler.delete(payload.id);
58
+ result = "ok";
59
+ break;
60
+ }
61
+ ipc.send({ type: "fleet_schedule_response", fleetRequestId, result });
62
+ }
63
+ catch (err) {
64
+ ipc.send({ type: "fleet_schedule_response", fleetRequestId, error: err.message });
65
+ }
66
+ },
67
+ handleDecisionCrud(ctx, instanceName, msg) {
68
+ const fleetRequestId = msg.fleetRequestId;
69
+ const payload = (msg.payload ?? {});
70
+ const meta = (msg.meta ?? {});
71
+ const ipc = ctx.instanceIpcClients.get(instanceName);
72
+ if (!ipc || !ctx.scheduler)
73
+ return;
74
+ const db = ctx.scheduler.db;
75
+ const projectRoot = meta.working_directory || ctx.fleetConfig?.instances[instanceName]?.working_directory || "";
76
+ try {
77
+ let result;
78
+ switch (msg.type) {
79
+ case "fleet_decision_create": {
80
+ // Prune expired decisions on create
81
+ db.pruneExpiredDecisions();
82
+ result = db.createDecision({
83
+ project_root: projectRoot,
84
+ scope: payload.scope,
85
+ title: payload.title,
86
+ content: payload.content,
87
+ tags: payload.tags,
88
+ ttl_days: payload.ttl_days,
89
+ created_by: instanceName,
90
+ supersedes: payload.supersedes,
91
+ });
92
+ break;
93
+ }
94
+ case "fleet_decision_list":
95
+ db.pruneExpiredDecisions();
96
+ result = db.listDecisions(projectRoot, {
97
+ includeArchived: payload.include_archived,
98
+ tags: payload.tags,
99
+ });
100
+ break;
101
+ case "fleet_decision_update": {
102
+ const id = payload.id;
103
+ if (payload.archive) {
104
+ db.archiveDecision(id);
105
+ result = { archived: true, id };
106
+ }
107
+ else {
108
+ result = db.updateDecision(id, {
109
+ content: payload.content,
110
+ tags: payload.tags,
111
+ ttl_days: payload.ttl_days,
112
+ });
113
+ }
114
+ break;
115
+ }
116
+ }
117
+ ipc.send({ type: "fleet_decision_response", fleetRequestId, result });
118
+ }
119
+ catch (err) {
120
+ ipc.send({ type: "fleet_decision_response", fleetRequestId, error: err.message });
121
+ }
122
+ },
123
+ handleSetDisplayName(ctx, instanceName, msg) {
124
+ const fleetRequestId = msg.fleetRequestId;
125
+ const payload = (msg.payload ?? {});
126
+ const ipc = ctx.instanceIpcClients.get(instanceName);
127
+ if (!ipc || !ctx.fleetConfig)
128
+ return;
129
+ const displayName = payload.name;
130
+ if (!displayName || displayName.length > 30) {
131
+ ipc.send({ type: "fleet_display_name_response", fleetRequestId, error: "Name must be 1-30 characters" });
132
+ return;
133
+ }
134
+ ctx.fleetConfig.instances[instanceName].display_name = displayName;
135
+ ctx.saveFleetConfig();
136
+ ctx.logger.info({ instanceName, displayName }, "Display name set");
137
+ ipc.send({ type: "fleet_display_name_response", fleetRequestId, result: { display_name: displayName } });
138
+ },
139
+ handleSetDescription(ctx, instanceName, msg) {
140
+ const fleetRequestId = msg.fleetRequestId;
141
+ const payload = (msg.payload ?? {});
142
+ const ipc = ctx.instanceIpcClients.get(instanceName);
143
+ if (!ipc || !ctx.fleetConfig)
144
+ return;
145
+ const description = payload.description;
146
+ if (!description) {
147
+ ipc.send({ type: "fleet_description_response", fleetRequestId, error: "Description cannot be empty" });
148
+ return;
149
+ }
150
+ ctx.fleetConfig.instances[instanceName].description = description;
151
+ ctx.saveFleetConfig();
152
+ ctx.logger.info({ instanceName, description: description.slice(0, 80) }, "Description set");
153
+ ipc.send({ type: "fleet_description_response", fleetRequestId, result: { description } });
154
+ },
155
+ // ── Agent CLI HTTP handlers ─────────────────────────────────────────
156
+ async handleScheduleCrudHttp(ctx, instance, op, args) {
157
+ if (!ctx.scheduler)
158
+ return { error: "Scheduler not available" };
159
+ switch (op) {
160
+ case "create":
161
+ return ctx.scheduler.create({
162
+ cron: args.cron, message: args.message,
163
+ source: instance, target: args.target || instance,
164
+ reply_chat_id: "", reply_thread_id: null,
165
+ label: args.label,
166
+ timezone: args.timezone,
167
+ });
168
+ case "list": return ctx.scheduler.list(args.target);
169
+ case "update": return ctx.scheduler.update(args.id, args);
170
+ case "delete":
171
+ ctx.scheduler.delete(args.id);
172
+ return "ok";
173
+ default: return { error: `Unknown schedule op: ${op}` };
174
+ }
175
+ },
176
+ async handleDecisionCrudHttp(ctx, instance, op, args) {
177
+ if (!ctx.scheduler)
178
+ return { error: "Scheduler not available" };
179
+ const db = ctx.scheduler.db;
180
+ const projectRoot = ctx.fleetConfig?.instances[instance]?.working_directory ?? "";
181
+ const asStr = (v) => typeof v === "string" ? v : undefined;
182
+ const asNum = (v) => typeof v === "number" ? v : undefined;
183
+ const asStrArr = (v) => Array.isArray(v) && v.every(x => typeof x === "string") ? v : undefined;
184
+ switch (op) {
185
+ case "post": {
186
+ const title = asStr(args.title);
187
+ const content = asStr(args.content);
188
+ if (!title || !content)
189
+ return { error: "title and content are required" };
190
+ const scope = args.scope === "fleet" ? "fleet" : "project";
191
+ return db.createDecision({
192
+ project_root: projectRoot,
193
+ scope,
194
+ title,
195
+ content,
196
+ tags: asStrArr(args.tags),
197
+ ttl_days: asNum(args.ttl_days),
198
+ supersedes: asStr(args.supersedes),
199
+ created_by: instance,
200
+ });
201
+ }
202
+ case "list": return db.listDecisions(projectRoot, {
203
+ includeArchived: args.includeArchived === true,
204
+ tags: asStrArr(args.tags),
205
+ });
206
+ case "update": {
207
+ const id = asStr(args.id);
208
+ if (!id)
209
+ return { error: "id is required" };
210
+ return db.updateDecision(id, {
211
+ content: asStr(args.content),
212
+ tags: asStrArr(args.tags),
213
+ ttl_days: asNum(args.ttl_days),
214
+ });
215
+ }
216
+ default: return { error: `Unknown decision op: ${op}` };
217
+ }
218
+ },
219
+ async handleTaskCrudHttp(ctx, instance, args) {
220
+ if (!ctx.scheduler)
221
+ return { error: "Scheduler not available" };
222
+ const db = ctx.scheduler.db;
223
+ const action = args.action;
224
+ const asStr = (v) => typeof v === "string" ? v : undefined;
225
+ const asStrArr = (v) => Array.isArray(v) && v.every(x => typeof x === "string") ? v : undefined;
226
+ const asPriority = (v) => {
227
+ return (v === "low" || v === "normal" || v === "high" || v === "urgent") ? v : undefined;
228
+ };
229
+ const asStatus = (v) => {
230
+ return (v === "open" || v === "claimed" || v === "done" || v === "blocked" || v === "cancelled") ? v : undefined;
231
+ };
232
+ switch (action) {
233
+ case "create": {
234
+ const title = asStr(args.title);
235
+ if (!title)
236
+ return { error: "title is required" };
237
+ return db.createTask({
238
+ title,
239
+ description: asStr(args.description),
240
+ priority: asPriority(args.priority),
241
+ assignee: asStr(args.assignee),
242
+ depends_on: asStrArr(args.depends_on),
243
+ created_by: instance,
244
+ });
245
+ }
246
+ case "list": return db.listTasks({ assignee: asStr(args.filter_assignee), status: asStr(args.filter_status) });
247
+ case "claim": {
248
+ const id = asStr(args.id);
249
+ if (!id)
250
+ return { error: "id is required" };
251
+ return db.claimTask(id, instance);
252
+ }
253
+ case "done": {
254
+ const id = asStr(args.id);
255
+ if (!id)
256
+ return { error: "id is required" };
257
+ return db.completeTask(id, asStr(args.result));
258
+ }
259
+ case "update": {
260
+ const id = asStr(args.id);
261
+ if (!id)
262
+ return { error: "id is required" };
263
+ return db.updateTask(id, {
264
+ status: asStatus(args.status),
265
+ assignee: asStr(args.assignee),
266
+ result: asStr(args.result),
267
+ priority: asPriority(args.priority),
268
+ });
269
+ }
270
+ default: return { error: `Unknown task action: ${action}` };
271
+ }
272
+ },
273
+ async handleSetDisplayNameHttp(ctx, instance, name) {
274
+ if (!ctx.fleetConfig)
275
+ return { error: "Fleet config not available" };
276
+ if (!name || name.length > 30)
277
+ return { error: "Name must be 1-30 characters" };
278
+ ctx.fleetConfig.instances[instance].display_name = name;
279
+ ctx.saveFleetConfig();
280
+ return { display_name: name };
281
+ },
282
+ async handleSetDescriptionHttp(ctx, instance, description) {
283
+ if (!ctx.fleetConfig)
284
+ return { error: "Fleet config not available" };
285
+ if (!description)
286
+ return { error: "Description cannot be empty" };
287
+ ctx.fleetConfig.instances[instance].description = description;
288
+ ctx.saveFleetConfig();
289
+ return { description };
290
+ },
291
+ handleTaskCrud(ctx, instanceName, msg) {
292
+ const fleetRequestId = msg.fleetRequestId;
293
+ const payload = (msg.payload ?? {});
294
+ const meta = (msg.meta ?? {});
295
+ const ipc = ctx.instanceIpcClients.get(instanceName);
296
+ if (!ipc || !ctx.scheduler)
297
+ return;
298
+ const db = ctx.scheduler.db;
299
+ const action = payload.action;
300
+ try {
301
+ let result;
302
+ switch (action) {
303
+ case "create":
304
+ result = db.createTask({
305
+ title: payload.title,
306
+ description: payload.description,
307
+ priority: payload.priority,
308
+ assignee: payload.assignee,
309
+ depends_on: payload.depends_on,
310
+ created_by: meta.instance_name || instanceName,
311
+ });
312
+ break;
313
+ case "list":
314
+ result = db.listTasks({
315
+ assignee: payload.filter_assignee,
316
+ status: payload.filter_status,
317
+ });
318
+ break;
319
+ case "claim":
320
+ result = db.claimTask(payload.id, meta.instance_name || instanceName);
321
+ break;
322
+ case "done":
323
+ result = db.completeTask(payload.id, payload.result);
324
+ break;
325
+ case "update":
326
+ result = db.updateTask(payload.id, {
327
+ status: payload.status,
328
+ assignee: payload.assignee,
329
+ result: payload.result,
330
+ priority: payload.priority,
331
+ });
332
+ break;
333
+ default:
334
+ throw new Error(`Unknown task action: ${action}`);
335
+ }
336
+ ipc.send({ type: "fleet_task_response", fleetRequestId, result });
337
+ // Activity log for task lifecycle events
338
+ if (action === "create") {
339
+ const t = result;
340
+ ctx.eventLog?.logActivity("task_update", instanceName, `created task: ${t.title}`, t.assignee ?? undefined);
341
+ }
342
+ else if (action === "claim") {
343
+ const t = result;
344
+ ctx.eventLog?.logActivity("task_update", instanceName, `claimed: ${t.title}`);
345
+ }
346
+ else if (action === "done") {
347
+ const t = result;
348
+ ctx.eventLog?.logActivity("task_update", instanceName, `completed: ${t.title}`, undefined, t.result ?? undefined);
349
+ }
350
+ }
351
+ catch (err) {
352
+ ipc.send({ type: "fleet_task_response", fleetRequestId, error: err.message });
353
+ }
354
+ },
355
+ };
356
+ //# sourceMappingURL=fleet-rpc-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-rpc-handlers.js","sourceRoot":"","sources":["../src/fleet-rpc-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Generates fleet context system prompt for AgEnD instances.
3
+ *
4
+ * This prompt is injected into every instance so the agent understands
5
+ * its role in the fleet and knows how to communicate via MCP tools.
6
+ */
7
+ export interface FleetPromptParams {
8
+ instanceName: string;
9
+ workingDirectory: string;
10
+ }
11
+ export declare function generateFleetSystemPrompt(params: FleetPromptParams): string;
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Generates fleet context system prompt for AgEnD instances.
3
+ *
4
+ * This prompt is injected into every instance so the agent understands
5
+ * its role in the fleet and knows how to communicate via MCP tools.
6
+ */
7
+ export function generateFleetSystemPrompt(params) {
8
+ const { instanceName, workingDirectory } = params;
9
+ return `# AgEnD Fleet Context
10
+
11
+ You are **${instanceName}**, an instance in a AgEnD (Agent Engineering Daemon) fleet.
12
+ Your working directory is \`${workingDirectory}\`.
13
+
14
+ ## Message Format
15
+
16
+ User messages arrive as text in your prompt with a prefix:
17
+ - \`[user:name]\` — message from a Telegram/Discord user. Reply using the \`reply\` tool.
18
+ - \`[from:instance-name]\` — message from another fleet instance. Reply using \`send_to_instance\`.
19
+
20
+ **Always use the \`reply\` tool for ALL responses to users.** Do not respond directly in the terminal.
21
+
22
+ ## Available Fleet Tools
23
+
24
+ ### Communication
25
+ | Tool | Purpose |
26
+ |------|---------|
27
+ | \`reply\` | Send a response back to the user (Telegram/Discord) |
28
+ | \`send_to_instance\` | Send a message to another instance |
29
+ | \`request_information\` | Ask another instance a question |
30
+ | \`delegate_task\` | Assign work to another instance |
31
+ | \`report_result\` | Return results to a requester |
32
+
33
+ ### Fleet Management
34
+ | Tool | Purpose |
35
+ |------|---------|
36
+ | \`list_instances\` | Discover instances with status, description, tags |
37
+ | \`describe_instance\` | Get detailed info about a specific instance |
38
+ | \`start_instance\` | Start a stopped instance |
39
+ | \`create_instance\` | Create a new instance in the fleet |
40
+ | \`delete_instance\` | Remove an instance from the fleet |
41
+ | \`replace_instance\` | Replace an instance with a fresh one (handover + delete + create) |
42
+
43
+ ### Scheduling
44
+ | Tool | Purpose |
45
+ |------|---------|
46
+ | \`create_schedule\` | Create a cron-based scheduled task |
47
+ | \`list_schedules\` | List all schedules |
48
+ | \`update_schedule\` | Update a schedule |
49
+ | \`delete_schedule\` | Delete a schedule |
50
+
51
+ ## Collaboration Rules
52
+
53
+ 1. **Use fleet tools for cross-instance communication.** Never assume you can directly access another instance's files.
54
+
55
+ 2. **Cross-instance messages appear as \`[from:instance-name]\`.** Reply using \`send_to_instance\` or \`report_result\`, NOT the \`reply\` tool.
56
+
57
+ 3. **Discovery before assumption.** Use \`list_instances\` to find available instances before sending messages.
58
+
59
+ 4. **Scope awareness.** You only have direct access to files under your own working directory.`;
60
+ }
61
+ //# sourceMappingURL=fleet-system-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-system-prompt.js","sourceRoot":"","sources":["../src/fleet-system-prompt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,UAAU,yBAAyB,CAAC,MAAyB;IACjE,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC;IAElD,OAAO;;YAEG,YAAY;8BACM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+FA+CiD,CAAC;AAChG,CAAC"}
@@ -0,0 +1,177 @@
1
+ # Advanced Skills
2
+
3
+ > **Note: These skills apply to kiro-cli backend instances only.**
4
+
5
+ ## 1. Instance Health Check via tmux
6
+
7
+ When user asks to check an instance's status or what it's doing:
8
+ - Use `execute_bash` to run: `tmux capture-pane -t agend:<instance-name> -p | tail -20`
9
+ - This shows the actual CLI screen (what the agent sees right now)
10
+ - More useful than just "running/stopped" status
11
+ - If the instance appears stuck, suggest `/raw /compact` or restart
12
+
13
+ ## 2. Reviewer Session Management
14
+
15
+ For reviewer instances using kiro-cli:
16
+ - Recommend setting `pre_task_command: "/chat load reviewer-base.json"` in fleet.yaml
17
+ - This loads a base session with review guidelines on every restart
18
+ - Help user create the base session:
19
+ 1. Attach to reviewer: `agend attach <reviewer-instance>`
20
+ 2. Set up review context and guidelines
21
+ 3. Save: `/chat save reviewer-base.json -f`
22
+ 4. Add to fleet.yaml under the reviewer instance config:
23
+ ```yaml
24
+ instances:
25
+ reviewer-xxx:
26
+ pre_task_command: "/chat load reviewer-base.json"
27
+ ```
28
+
29
+ ## 3. Fork Instance (Session Cloning)
30
+
31
+ When user wants to fork/clone an instance's session to a new instance:
32
+
33
+ Steps:
34
+ 1. Wait for source instance to be idle (check with tmux capture-pane, look for "X% !>" prompt)
35
+
36
+ 2. Save current session on source instance via tmux:
37
+ - `execute_bash`: `tmux send-keys -t agend:<source-instance> '/chat save YYYYMMDD.json -f' Enter`
38
+ - Wait a few seconds for save to complete
39
+
40
+ 3. Create new instance:
41
+ - `create_instance` with same backend and working_directory (or new one)
42
+
43
+ 4. Copy session file to new instance workspace:
44
+ - `execute_bash`: `cp ~/.agend/workspaces/<source>/YYYYMMDD.json ~/.agend/workspaces/<target>/`
45
+
46
+ 5. Wait for new instance to be idle, then load session via tmux:
47
+ - `execute_bash`: `tmux send-keys -t agend:<new-instance-name> '/chat load YYYYMMDD.json' Enter`
48
+ - Or configure `pre_task_command: "/chat load YYYYMMDD.json"` for auto-load on restart
49
+
50
+ ## 4. Batch Session Backup
51
+
52
+ Save all instances' sessions to a dated backup directory:
53
+
54
+ ```bash
55
+ DATE=$(date +%Y%m%d)
56
+ BACKUP_DIR="$HOME/.agend/session-backups/$DATE"
57
+ mkdir -p "$BACKUP_DIR"
58
+ MY_NAME="<your-own-instance-name>" # skip yourself to avoid paste collision
59
+ for win in $(tmux list-windows -t agend -F '#{window_name}' | grep -v bash); do
60
+ if [ "$win" = "$MY_NAME" ]; then continue; fi
61
+ tmux send-keys -t "agend:$win" "/chat save $BACKUP_DIR/${win}.json -f" Enter
62
+ sleep 3
63
+ done
64
+ ```
65
+
66
+ Important:
67
+ - Skip your own instance (the one executing this) to avoid paste collision
68
+ - Use `sleep 3` between saves
69
+ - Run fleet health check first — only backup idle instances
70
+ - Do NOT backup while instances are busy
71
+
72
+ Restore a single instance:
73
+ - `tmux send-keys -t agend:<instance> '/chat load /path/to/backup.json' Enter`
74
+
75
+ ## 5. Fleet Health Check
76
+
77
+ Check all instances for stuck/error state:
78
+
79
+ ```bash
80
+ for win in $(tmux list-windows -t agend -F '#{window_name}' | grep -v bash); do
81
+ last=$(tmux capture-pane -t "agend:$win" -p | tail -3 | tr '\n' ' ')
82
+ if echo "$last" | grep -q "!>"; then
83
+ echo "✅ $win — idle"
84
+ elif echo "$last" | grep -q "error:"; then
85
+ echo "❌ $win — ERROR"
86
+ else
87
+ echo "⏳ $win — busy"
88
+ fi
89
+ done
90
+ ```
91
+
92
+ States:
93
+ - ✅ idle — prompt visible (X% !>), ready for input
94
+ - ⏳ busy — processing a task, wait for it to finish
95
+ - ❌ error — check tmux pane for details, may need restart
96
+
97
+ If an instance is stuck (busy for >10 minutes with no output), restart it:
98
+ - `restart_instance("<instance-name>")`
99
+
100
+ ## 6. Instance Creation Safety
101
+
102
+ When creating a new instance with `create_instance`:
103
+
104
+ **Pre-checks (mandatory):**
105
+ 1. **Check for duplicate working directory** — Run `list_instances` and verify no existing instance uses the same `working_directory`. Two instances sharing a directory causes file conflicts and race conditions.
106
+ 2. **Verify the directory exists** — If specifying a directory, confirm it exists on disk before calling create.
107
+ 3. **Use unique names** — The instance name is derived from `topic_name` or `basename(directory)`. Avoid generic names like "dev" or "test" that may collide.
108
+
109
+ **Post-checks (mandatory):**
110
+ 4. **Confirm topic/channel creation** — After `create_instance` returns, verify the response includes a valid `topic_id`. This confirms the Discord channel or Telegram topic was actually created.
111
+ 5. **Verify instance is running** — Use `describe_instance` to confirm the new instance reached "running" status. If it shows "stopped" or errors, check the output log.
112
+
113
+ **Common mistakes to avoid:**
114
+ - Do NOT create an instance pointing to another instance's worktree path
115
+ - Do NOT reuse a `topic_name` that already exists (Discord will create a duplicate channel)
116
+ - Do NOT omit `topic_name` when `directory` is not provided — it will error
117
+
118
+ ## 7. Fleet Restart & Recovery
119
+
120
+ **Restart types:**
121
+ - `agend fleet restart` — full stop + start (picks up new code after build & link)
122
+ - `agend reload` — SIGHUP hot-reload, reconciles instances without restarting the fleet process
123
+ - `restart_instance("<name>")` — single instance restart, reloads fleet.yaml first
124
+
125
+ **After tmux crash:**
126
+ - Fleet auto-detects tmux server death and triggers circuit breaker (30s pause)
127
+ - Some instances may fail to restart due to rate limits from simultaneous startup
128
+ - Fix: manually restart failed instances, or do another `agend fleet restart`
129
+ - Check failed instances: `agend ls` shows "stopped" status
130
+
131
+ **Rate limit recovery:**
132
+ - If you see "PTY error: Rate limit reached" or "crash loop — respawn paused", wait 1-2 minutes
133
+ - Then `restart_instance` the affected instance
134
+ - Do NOT restart all instances simultaneously — this worsens rate limits
135
+
136
+ ## 8. Configuration Quick Reference
137
+
138
+ **fleet.yaml structure:**
139
+ ```yaml
140
+ channel: # Telegram/Discord connection
141
+ defaults: # Shared defaults for all instances
142
+ backend: kiro-cli
143
+ startup:
144
+ concurrency: 6 # Max simultaneous instance startups
145
+ stagger_delay_ms: 2000 # Delay between startup batches
146
+ instances: # Per-instance config (topic_id, working_directory, etc.)
147
+ templates: # Reusable fleet deployment templates
148
+ ```
149
+
150
+ **classicBot.yaml** — manages classic bot channels (separate from fleet.yaml):
151
+ - `defaults.allowed_guilds` — Discord server whitelist
152
+ - `defaults.allowed_groups` — Telegram group whitelist
153
+ - `channels` — per-channel backend override
154
+ - Hot-reloads every 30 seconds (no restart needed)
155
+
156
+ **Key config locations:**
157
+ - Fleet config: `~/.agend/fleet.yaml`
158
+ - Classic bot: `~/.agend/classicBot.yaml`
159
+ - Environment: `~/.agend/.env` (bot tokens, API keys)
160
+ - Instance logs: `~/.agend/instances/<name>/output.log`
161
+ - Fleet log: `~/.agend/fleet.log`
162
+
163
+ ## 9. Instance Lifecycle Management
164
+
165
+ **Replace vs Restart:**
166
+ - `restart_instance` — keeps session, reloads config. Use when config changed.
167
+ - `replace_instance` — kills old, creates fresh with handover context. Use when context is polluted or instance is stuck in a loop.
168
+
169
+ **When to replace (not restart):**
170
+ - Instance keeps hallucinating or referencing stale information
171
+ - Instance is stuck in a tool-call loop
172
+ - Context is >80% full and responses are degrading
173
+
174
+ **Monitoring instance state:**
175
+ - `describe_instance("<name>")` — shows status, last activity, description
176
+ - `tmux capture-pane -t agend:<name> -p | tail -20` — see actual CLI screen
177
+ - Look for `X% !>` prompt = idle, `Thinking...` = busy, `error` = needs attention
@@ -0,0 +1,16 @@
1
+ import { EventEmitter } from "node:events";
2
+ export declare class HangDetector extends EventEmitter {
3
+ private lastActivityTs;
4
+ private lastStatuslineTs;
5
+ private lastInboundTs;
6
+ private hungEmitted;
7
+ private checkTimer;
8
+ private timeoutMs;
9
+ constructor(timeoutMinutes: number);
10
+ recordActivity(): void;
11
+ recordInbound(): void;
12
+ recordStatuslineUpdate(): void;
13
+ isHung(): boolean;
14
+ start(intervalMs?: number): void;
15
+ stop(): void;
16
+ }