@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.
- package/README.md +210 -0
- package/README.zh-TW.md +134 -0
- package/dist/access-path.d.ts +10 -0
- package/dist/access-path.js +32 -0
- package/dist/access-path.js.map +1 -0
- package/dist/adapter-world.d.ts +25 -0
- package/dist/adapter-world.js +41 -0
- package/dist/adapter-world.js.map +1 -0
- package/dist/agent-cli-instructions.md +50 -0
- package/dist/agent-cli.d.ts +2 -0
- package/dist/agent-cli.js +200 -0
- package/dist/agent-cli.js.map +1 -0
- package/dist/agent-endpoint.d.ts +25 -0
- package/dist/agent-endpoint.js +162 -0
- package/dist/agent-endpoint.js.map +1 -0
- package/dist/backend/antigravity.d.ts +17 -0
- package/dist/backend/antigravity.js +98 -0
- package/dist/backend/antigravity.js.map +1 -0
- package/dist/backend/claude-code.d.ts +23 -0
- package/dist/backend/claude-code.js +171 -0
- package/dist/backend/claude-code.js.map +1 -0
- package/dist/backend/codex.d.ts +18 -0
- package/dist/backend/codex.js +160 -0
- package/dist/backend/codex.js.map +1 -0
- package/dist/backend/factory.d.ts +2 -0
- package/dist/backend/factory.js +28 -0
- package/dist/backend/factory.js.map +1 -0
- package/dist/backend/gemini-cli.d.ts +17 -0
- package/dist/backend/gemini-cli.js +163 -0
- package/dist/backend/gemini-cli.js.map +1 -0
- package/dist/backend/index.d.ts +7 -0
- package/dist/backend/index.js +7 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/kiro.d.ts +17 -0
- package/dist/backend/kiro.js +147 -0
- package/dist/backend/kiro.js.map +1 -0
- package/dist/backend/marker-utils.d.ts +13 -0
- package/dist/backend/marker-utils.js +64 -0
- package/dist/backend/marker-utils.js.map +1 -0
- package/dist/backend/mock.d.ts +25 -0
- package/dist/backend/mock.js +85 -0
- package/dist/backend/mock.js.map +1 -0
- package/dist/backend/opencode.d.ts +16 -0
- package/dist/backend/opencode.js +136 -0
- package/dist/backend/opencode.js.map +1 -0
- package/dist/backend/types.d.ts +86 -0
- package/dist/backend/types.js +33 -0
- package/dist/backend/types.js.map +1 -0
- package/dist/channel/access-manager.d.ts +18 -0
- package/dist/channel/access-manager.js +153 -0
- package/dist/channel/access-manager.js.map +1 -0
- package/dist/channel/adapters/telegram.d.ts +63 -0
- package/dist/channel/adapters/telegram.js +646 -0
- package/dist/channel/adapters/telegram.js.map +1 -0
- package/dist/channel/attachment-handler.d.ts +15 -0
- package/dist/channel/attachment-handler.js +88 -0
- package/dist/channel/attachment-handler.js.map +1 -0
- package/dist/channel/factory.d.ts +12 -0
- package/dist/channel/factory.js +67 -0
- package/dist/channel/factory.js.map +1 -0
- package/dist/channel/ipc-bridge.d.ts +26 -0
- package/dist/channel/ipc-bridge.js +220 -0
- package/dist/channel/ipc-bridge.js.map +1 -0
- package/dist/channel/mcp-server.d.ts +10 -0
- package/dist/channel/mcp-server.js +288 -0
- package/dist/channel/mcp-server.js.map +1 -0
- package/dist/channel/mcp-tools.d.ts +17 -0
- package/dist/channel/mcp-tools.js +110 -0
- package/dist/channel/mcp-tools.js.map +1 -0
- package/dist/channel/message-bus.d.ts +17 -0
- package/dist/channel/message-bus.js +86 -0
- package/dist/channel/message-bus.js.map +1 -0
- package/dist/channel/message-queue.d.ts +39 -0
- package/dist/channel/message-queue.js +253 -0
- package/dist/channel/message-queue.js.map +1 -0
- package/dist/channel/tool-router.d.ts +6 -0
- package/dist/channel/tool-router.js +75 -0
- package/dist/channel/tool-router.js.map +1 -0
- package/dist/channel/tool-tracker.d.ts +13 -0
- package/dist/channel/tool-tracker.js +58 -0
- package/dist/channel/tool-tracker.js.map +1 -0
- package/dist/channel/types.d.ts +118 -0
- package/dist/channel/types.js +2 -0
- package/dist/channel/types.js.map +1 -0
- package/dist/chat-export.d.ts +4 -0
- package/dist/chat-export.js +91 -0
- package/dist/chat-export.js.map +1 -0
- package/dist/classic-channel-manager.d.ts +59 -0
- package/dist/classic-channel-manager.js +193 -0
- package/dist/classic-channel-manager.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +1833 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.js +118 -0
- package/dist/config.js.map +1 -0
- package/dist/context-guardian.d.ts +26 -0
- package/dist/context-guardian.js +73 -0
- package/dist/context-guardian.js.map +1 -0
- package/dist/cost-guard.d.ts +36 -0
- package/dist/cost-guard.js +147 -0
- package/dist/cost-guard.js.map +1 -0
- package/dist/daemon-entry.d.ts +1 -0
- package/dist/daemon-entry.js +29 -0
- package/dist/daemon-entry.js.map +1 -0
- package/dist/daemon.d.ts +152 -0
- package/dist/daemon.js +1714 -0
- package/dist/daemon.js.map +1 -0
- package/dist/daily-summary.d.ts +13 -0
- package/dist/daily-summary.js +55 -0
- package/dist/daily-summary.js.map +1 -0
- package/dist/event-log.d.ts +36 -0
- package/dist/event-log.js +100 -0
- package/dist/event-log.js.map +1 -0
- package/dist/export-import.d.ts +2 -0
- package/dist/export-import.js +162 -0
- package/dist/export-import.js.map +1 -0
- package/dist/fleet-context.d.ts +61 -0
- package/dist/fleet-context.js +4 -0
- package/dist/fleet-context.js.map +1 -0
- package/dist/fleet-dashboard-html.d.ts +6 -0
- package/dist/fleet-dashboard-html.js +443 -0
- package/dist/fleet-dashboard-html.js.map +1 -0
- package/dist/fleet-health-server.d.ts +35 -0
- package/dist/fleet-health-server.js +290 -0
- package/dist/fleet-health-server.js.map +1 -0
- package/dist/fleet-instructions.d.ts +5 -0
- package/dist/fleet-instructions.js +161 -0
- package/dist/fleet-instructions.js.map +1 -0
- package/dist/fleet-manager.d.ts +212 -0
- package/dist/fleet-manager.js +3655 -0
- package/dist/fleet-manager.js.map +1 -0
- package/dist/fleet-rpc-handlers.d.ts +42 -0
- package/dist/fleet-rpc-handlers.js +356 -0
- package/dist/fleet-rpc-handlers.js.map +1 -0
- package/dist/fleet-system-prompt.d.ts +11 -0
- package/dist/fleet-system-prompt.js +61 -0
- package/dist/fleet-system-prompt.js.map +1 -0
- package/dist/general-knowledge/skills.md +177 -0
- package/dist/hang-detector.d.ts +16 -0
- package/dist/hang-detector.js +53 -0
- package/dist/hang-detector.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/instance-lifecycle.d.ts +90 -0
- package/dist/instance-lifecycle.js +592 -0
- package/dist/instance-lifecycle.js.map +1 -0
- package/dist/instructions.d.ts +15 -0
- package/dist/instructions.js +90 -0
- package/dist/instructions.js.map +1 -0
- package/dist/logger.d.ts +7 -0
- package/dist/logger.js +84 -0
- package/dist/logger.js.map +1 -0
- package/dist/outbound-handlers.d.ts +51 -0
- package/dist/outbound-handlers.js +739 -0
- package/dist/outbound-handlers.js.map +1 -0
- package/dist/outbound-schemas.d.ts +238 -0
- package/dist/outbound-schemas.js +248 -0
- package/dist/outbound-schemas.js.map +1 -0
- package/dist/paths.d.ts +10 -0
- package/dist/paths.js +42 -0
- package/dist/paths.js.map +1 -0
- package/dist/plugin/agend/.claude-plugin/plugin.json +5 -0
- package/dist/quickstart.d.ts +1 -0
- package/dist/quickstart.js +595 -0
- package/dist/quickstart.js.map +1 -0
- package/dist/routing-engine.d.ts +22 -0
- package/dist/routing-engine.js +44 -0
- package/dist/routing-engine.js.map +1 -0
- package/dist/safe-async.d.ts +6 -0
- package/dist/safe-async.js +20 -0
- package/dist/safe-async.js.map +1 -0
- package/dist/scheduler/db.d.ts +37 -0
- package/dist/scheduler/db.js +360 -0
- package/dist/scheduler/db.js.map +1 -0
- package/dist/scheduler/db.test.d.ts +1 -0
- package/dist/scheduler/db.test.js +92 -0
- package/dist/scheduler/db.test.js.map +1 -0
- package/dist/scheduler/index.d.ts +4 -0
- package/dist/scheduler/index.js +4 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/scheduler.d.ts +44 -0
- package/dist/scheduler/scheduler.js +197 -0
- package/dist/scheduler/scheduler.js.map +1 -0
- package/dist/scheduler/scheduler.test.d.ts +1 -0
- package/dist/scheduler/scheduler.test.js +119 -0
- package/dist/scheduler/scheduler.test.js.map +1 -0
- package/dist/scheduler/types.d.ts +107 -0
- package/dist/scheduler/types.js +7 -0
- package/dist/scheduler/types.js.map +1 -0
- package/dist/service-installer.d.ts +17 -0
- package/dist/service-installer.js +182 -0
- package/dist/service-installer.js.map +1 -0
- package/dist/setup-wizard.d.ts +48 -0
- package/dist/setup-wizard.js +701 -0
- package/dist/setup-wizard.js.map +1 -0
- package/dist/statusline-watcher.d.ts +34 -0
- package/dist/statusline-watcher.js +73 -0
- package/dist/statusline-watcher.js.map +1 -0
- package/dist/stt.d.ts +10 -0
- package/dist/stt.js +33 -0
- package/dist/stt.js.map +1 -0
- package/dist/tmux-control.d.ts +52 -0
- package/dist/tmux-control.js +207 -0
- package/dist/tmux-control.js.map +1 -0
- package/dist/tmux-manager.d.ts +44 -0
- package/dist/tmux-manager.js +218 -0
- package/dist/tmux-manager.js.map +1 -0
- package/dist/topic-archiver.d.ts +40 -0
- package/dist/topic-archiver.js +103 -0
- package/dist/topic-archiver.js.map +1 -0
- package/dist/topic-commands.d.ts +28 -0
- package/dist/topic-commands.js +359 -0
- package/dist/topic-commands.js.map +1 -0
- package/dist/transcript-monitor.d.ts +23 -0
- package/dist/transcript-monitor.js +164 -0
- package/dist/transcript-monitor.js.map +1 -0
- package/dist/types.d.ts +211 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/dashboard.html +719 -0
- package/dist/web-api.d.ts +101 -0
- package/dist/web-api.js +648 -0
- package/dist/web-api.js.map +1 -0
- package/dist/webhook-emitter.d.ts +15 -0
- package/dist/webhook-emitter.js +41 -0
- package/dist/webhook-emitter.js.map +1 -0
- package/dist/workflow-templates/default.md +35 -0
- package/package.json +76 -0
- package/templates/launchd.plist.ejs +31 -0
- 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
|
+
}
|