@calliopelabs/cli 2.2.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/README.md +17 -0
  2. package/dist/agents/agent-config-loader.js +1 -1
  3. package/dist/agents/agent-config-presets.js +13 -13
  4. package/dist/agents/agent-config-presets.js.map +1 -1
  5. package/dist/agents/agent-config-types.d.ts +1 -1
  6. package/dist/agents/agent-config-types.d.ts.map +1 -1
  7. package/dist/agents/council-types.d.ts +2 -0
  8. package/dist/agents/council-types.d.ts.map +1 -1
  9. package/dist/agents/council-types.js.map +1 -1
  10. package/dist/agents/council.d.ts +5 -0
  11. package/dist/agents/council.d.ts.map +1 -1
  12. package/dist/agents/council.js +150 -14
  13. package/dist/agents/council.js.map +1 -1
  14. package/dist/agents/dynamic-tools.d.ts.map +1 -1
  15. package/dist/agents/dynamic-tools.js +39 -10
  16. package/dist/agents/dynamic-tools.js.map +1 -1
  17. package/dist/agents/orchestrator.d.ts +7 -0
  18. package/dist/agents/orchestrator.d.ts.map +1 -1
  19. package/dist/agents/orchestrator.js +48 -7
  20. package/dist/agents/orchestrator.js.map +1 -1
  21. package/dist/agents/sdk-backend.js +1 -1
  22. package/dist/agents/sdk-backend.js.map +1 -1
  23. package/dist/agents/swarm-types.d.ts +1 -0
  24. package/dist/agents/swarm-types.d.ts.map +1 -1
  25. package/dist/agents/swarm.d.ts +5 -0
  26. package/dist/agents/swarm.d.ts.map +1 -1
  27. package/dist/agents/swarm.js +85 -17
  28. package/dist/agents/swarm.js.map +1 -1
  29. package/dist/agents/types.d.ts +1 -0
  30. package/dist/agents/types.d.ts.map +1 -1
  31. package/dist/agents/types.js.map +1 -1
  32. package/dist/api-server.d.ts +9 -0
  33. package/dist/api-server.d.ts.map +1 -1
  34. package/dist/api-server.js +75 -4
  35. package/dist/api-server.js.map +1 -1
  36. package/dist/auto-checkpoint.d.ts.map +1 -1
  37. package/dist/auto-checkpoint.js +50 -17
  38. package/dist/auto-checkpoint.js.map +1 -1
  39. package/dist/auto-compressor.d.ts +14 -0
  40. package/dist/auto-compressor.d.ts.map +1 -1
  41. package/dist/auto-compressor.js +67 -10
  42. package/dist/auto-compressor.js.map +1 -1
  43. package/dist/background-jobs.d.ts.map +1 -1
  44. package/dist/background-jobs.js +8 -3
  45. package/dist/background-jobs.js.map +1 -1
  46. package/dist/bin.d.ts +8 -0
  47. package/dist/bin.d.ts.map +1 -1
  48. package/dist/bin.js +63 -4
  49. package/dist/bin.js.map +1 -1
  50. package/dist/branching.d.ts.map +1 -1
  51. package/dist/branching.js +14 -1
  52. package/dist/branching.js.map +1 -1
  53. package/dist/checkpoint.d.ts.map +1 -1
  54. package/dist/checkpoint.js +13 -1
  55. package/dist/checkpoint.js.map +1 -1
  56. package/dist/cli/agent.d.ts.map +1 -1
  57. package/dist/cli/agent.js +130 -62
  58. package/dist/cli/agent.js.map +1 -1
  59. package/dist/cli/commands.d.ts.map +1 -1
  60. package/dist/cli/commands.js +218 -11
  61. package/dist/cli/commands.js.map +1 -1
  62. package/dist/cli/index.d.ts.map +1 -1
  63. package/dist/cli/index.js +55 -6
  64. package/dist/cli/index.js.map +1 -1
  65. package/dist/cli/types.d.ts +3 -0
  66. package/dist/cli/types.d.ts.map +1 -1
  67. package/dist/cli/types.js +2 -1
  68. package/dist/cli/types.js.map +1 -1
  69. package/dist/config.d.ts +1 -0
  70. package/dist/config.d.ts.map +1 -1
  71. package/dist/config.js +15 -3
  72. package/dist/config.js.map +1 -1
  73. package/dist/diff.d.ts.map +1 -1
  74. package/dist/diff.js +42 -4
  75. package/dist/diff.js.map +1 -1
  76. package/dist/env-expansion.d.ts +15 -0
  77. package/dist/env-expansion.d.ts.map +1 -0
  78. package/dist/env-expansion.js +43 -0
  79. package/dist/env-expansion.js.map +1 -0
  80. package/dist/errors.d.ts.map +1 -1
  81. package/dist/errors.js +30 -3
  82. package/dist/errors.js.map +1 -1
  83. package/dist/headless.d.ts.map +1 -1
  84. package/dist/headless.js +59 -4
  85. package/dist/headless.js.map +1 -1
  86. package/dist/hooks.d.ts +8 -2
  87. package/dist/hooks.d.ts.map +1 -1
  88. package/dist/hooks.js +97 -11
  89. package/dist/hooks.js.map +1 -1
  90. package/dist/idle-eviction.d.ts.map +1 -1
  91. package/dist/idle-eviction.js +8 -1
  92. package/dist/idle-eviction.js.map +1 -1
  93. package/dist/iteration-ledger.d.ts +111 -2
  94. package/dist/iteration-ledger.d.ts.map +1 -1
  95. package/dist/iteration-ledger.js +327 -19
  96. package/dist/iteration-ledger.js.map +1 -1
  97. package/dist/iteration-limit.d.ts +5 -0
  98. package/dist/iteration-limit.d.ts.map +1 -0
  99. package/dist/iteration-limit.js +17 -0
  100. package/dist/iteration-limit.js.map +1 -0
  101. package/dist/markdown.d.ts.map +1 -1
  102. package/dist/markdown.js +32 -10
  103. package/dist/markdown.js.map +1 -1
  104. package/dist/mcp.d.ts +35 -5
  105. package/dist/mcp.d.ts.map +1 -1
  106. package/dist/mcp.js +191 -12
  107. package/dist/mcp.js.map +1 -1
  108. package/dist/memory.d.ts.map +1 -1
  109. package/dist/memory.js +4 -9
  110. package/dist/memory.js.map +1 -1
  111. package/dist/model-detection.d.ts +14 -1
  112. package/dist/model-detection.d.ts.map +1 -1
  113. package/dist/model-detection.js +307 -114
  114. package/dist/model-detection.js.map +1 -1
  115. package/dist/model-router.js +7 -7
  116. package/dist/model-router.js.map +1 -1
  117. package/dist/parallel-tools.d.ts +9 -1
  118. package/dist/parallel-tools.d.ts.map +1 -1
  119. package/dist/parallel-tools.js +6 -5
  120. package/dist/parallel-tools.js.map +1 -1
  121. package/dist/plugins.d.ts +37 -0
  122. package/dist/plugins.d.ts.map +1 -1
  123. package/dist/plugins.js +87 -0
  124. package/dist/plugins.js.map +1 -1
  125. package/dist/prevent-sleep.d.ts +10 -0
  126. package/dist/prevent-sleep.d.ts.map +1 -0
  127. package/dist/prevent-sleep.js +85 -0
  128. package/dist/prevent-sleep.js.map +1 -0
  129. package/dist/providers/anthropic.d.ts.map +1 -1
  130. package/dist/providers/anthropic.js +36 -2
  131. package/dist/providers/anthropic.js.map +1 -1
  132. package/dist/providers/bedrock.d.ts.map +1 -1
  133. package/dist/providers/bedrock.js +81 -17
  134. package/dist/providers/bedrock.js.map +1 -1
  135. package/dist/providers/compat.d.ts.map +1 -1
  136. package/dist/providers/compat.js +21 -6
  137. package/dist/providers/compat.js.map +1 -1
  138. package/dist/providers/index.d.ts.map +1 -1
  139. package/dist/providers/index.js +2 -0
  140. package/dist/providers/index.js.map +1 -1
  141. package/dist/providers/openai-compat-shims.d.ts +31 -0
  142. package/dist/providers/openai-compat-shims.d.ts.map +1 -0
  143. package/dist/providers/openai-compat-shims.js +179 -0
  144. package/dist/providers/openai-compat-shims.js.map +1 -0
  145. package/dist/providers/openai.d.ts.map +1 -1
  146. package/dist/providers/types.d.ts.map +1 -1
  147. package/dist/providers/types.js +19 -10
  148. package/dist/providers/types.js.map +1 -1
  149. package/dist/risk.d.ts.map +1 -1
  150. package/dist/risk.js +15 -5
  151. package/dist/risk.js.map +1 -1
  152. package/dist/sandbox-native.d.ts +1 -0
  153. package/dist/sandbox-native.d.ts.map +1 -1
  154. package/dist/sandbox-native.js +37 -5
  155. package/dist/sandbox-native.js.map +1 -1
  156. package/dist/scope.d.ts +10 -0
  157. package/dist/scope.d.ts.map +1 -1
  158. package/dist/scope.js +75 -15
  159. package/dist/scope.js.map +1 -1
  160. package/dist/scuttlebot/client.d.ts +83 -0
  161. package/dist/scuttlebot/client.d.ts.map +1 -0
  162. package/dist/scuttlebot/client.js +350 -0
  163. package/dist/scuttlebot/client.js.map +1 -0
  164. package/dist/scuttlebot/config.d.ts +28 -0
  165. package/dist/scuttlebot/config.d.ts.map +1 -0
  166. package/dist/scuttlebot/config.js +91 -0
  167. package/dist/scuttlebot/config.js.map +1 -0
  168. package/dist/scuttlebot/http-client.d.ts +63 -0
  169. package/dist/scuttlebot/http-client.d.ts.map +1 -0
  170. package/dist/scuttlebot/http-client.js +124 -0
  171. package/dist/scuttlebot/http-client.js.map +1 -0
  172. package/dist/scuttlebot/index.d.ts +13 -0
  173. package/dist/scuttlebot/index.d.ts.map +1 -0
  174. package/dist/scuttlebot/index.js +10 -0
  175. package/dist/scuttlebot/index.js.map +1 -0
  176. package/dist/scuttlebot/irc-client.d.ts +124 -0
  177. package/dist/scuttlebot/irc-client.d.ts.map +1 -0
  178. package/dist/scuttlebot/irc-client.js +599 -0
  179. package/dist/scuttlebot/irc-client.js.map +1 -0
  180. package/dist/skills.d.ts +19 -0
  181. package/dist/skills.d.ts.map +1 -1
  182. package/dist/skills.js +98 -10
  183. package/dist/skills.js.map +1 -1
  184. package/dist/smart-router.js +4 -4
  185. package/dist/smart-router.js.map +1 -1
  186. package/dist/storage.d.ts +18 -3
  187. package/dist/storage.d.ts.map +1 -1
  188. package/dist/storage.js +182 -14
  189. package/dist/storage.js.map +1 -1
  190. package/dist/tools.d.ts.map +1 -1
  191. package/dist/tools.js +233 -39
  192. package/dist/tools.js.map +1 -1
  193. package/dist/trust.d.ts +16 -3
  194. package/dist/trust.d.ts.map +1 -1
  195. package/dist/trust.js +23 -4
  196. package/dist/trust.js.map +1 -1
  197. package/dist/types.d.ts.map +1 -1
  198. package/dist/types.js +18 -12
  199. package/dist/types.js.map +1 -1
  200. package/dist/ui/agent.d.ts +1 -1
  201. package/dist/ui/agent.d.ts.map +1 -1
  202. package/dist/ui/agent.js +175 -121
  203. package/dist/ui/agent.js.map +1 -1
  204. package/dist/ui/chat-input.d.ts +3 -1
  205. package/dist/ui/chat-input.d.ts.map +1 -1
  206. package/dist/ui/chat-input.js +82 -17
  207. package/dist/ui/chat-input.js.map +1 -1
  208. package/dist/ui/commands.d.ts +4 -0
  209. package/dist/ui/commands.d.ts.map +1 -1
  210. package/dist/ui/commands.js +562 -39
  211. package/dist/ui/commands.js.map +1 -1
  212. package/dist/ui/completions.d.ts.map +1 -1
  213. package/dist/ui/completions.js +2 -0
  214. package/dist/ui/completions.js.map +1 -1
  215. package/dist/ui/index.d.ts.map +1 -1
  216. package/dist/ui/index.js +288 -60
  217. package/dist/ui/index.js.map +1 -1
  218. package/dist/ui/input-utils.d.ts +20 -0
  219. package/dist/ui/input-utils.d.ts.map +1 -0
  220. package/dist/ui/input-utils.js +35 -0
  221. package/dist/ui/input-utils.js.map +1 -0
  222. package/dist/ui/messages.d.ts +6 -2
  223. package/dist/ui/messages.d.ts.map +1 -1
  224. package/dist/ui/messages.js +42 -11
  225. package/dist/ui/messages.js.map +1 -1
  226. package/dist/ui/modals.d.ts +21 -1
  227. package/dist/ui/modals.d.ts.map +1 -1
  228. package/dist/ui/modals.js +67 -5
  229. package/dist/ui/modals.js.map +1 -1
  230. package/dist/ui/status-bar.d.ts +4 -1
  231. package/dist/ui/status-bar.d.ts.map +1 -1
  232. package/dist/ui/status-bar.js +12 -1
  233. package/dist/ui/status-bar.js.map +1 -1
  234. package/dist/ui/types.d.ts +3 -0
  235. package/dist/ui/types.d.ts.map +1 -1
  236. package/package.json +4 -7
  237. package/dist/completion.d.ts +0 -75
  238. package/dist/completion.d.ts.map +0 -1
  239. package/dist/completion.js +0 -234
  240. package/dist/completion.js.map +0 -1
  241. package/dist/keyboard.d.ts +0 -57
  242. package/dist/keyboard.d.ts.map +0 -1
  243. package/dist/keyboard.js +0 -265
  244. package/dist/keyboard.js.map +0 -1
@@ -0,0 +1,91 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { parse as parseYaml } from 'yaml';
4
+ function normalizeChannelName(channel) {
5
+ return channel.trim().replace(/^#/, '');
6
+ }
7
+ function parseChannels(raw) {
8
+ if (!raw) {
9
+ return [];
10
+ }
11
+ return raw
12
+ .split(',')
13
+ .map(normalizeChannelName)
14
+ .filter(Boolean);
15
+ }
16
+ function allChannels(config) {
17
+ const combined = [
18
+ ...(config.channel ? [config.channel] : []),
19
+ ...(config.channels ?? []),
20
+ ];
21
+ return combined.map(normalizeChannelName).filter(Boolean);
22
+ }
23
+ export function mergeChannels(existing, extra) {
24
+ const seen = new Set();
25
+ const merged = [];
26
+ for (const channel of [...existing, ...extra]) {
27
+ const normalized = normalizeChannelName(channel);
28
+ if (!normalized || seen.has(normalized)) {
29
+ continue;
30
+ }
31
+ seen.add(normalized);
32
+ merged.push(normalized);
33
+ }
34
+ return merged;
35
+ }
36
+ export function loadRepoConfig(dir) {
37
+ let current = path.resolve(dir);
38
+ for (;;) {
39
+ const candidate = path.join(current, '.scuttlebot.yaml');
40
+ if (fs.existsSync(candidate)) {
41
+ const raw = fs.readFileSync(candidate, 'utf-8');
42
+ const parsed = parseYaml(raw);
43
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
44
+ return {};
45
+ }
46
+ const config = parsed;
47
+ return {
48
+ channel: typeof config.channel === 'string' ? config.channel : undefined,
49
+ channels: Array.isArray(config.channels)
50
+ ? config.channels.filter((value) => typeof value === 'string')
51
+ : undefined,
52
+ url: typeof config.url === 'string' ? config.url : undefined,
53
+ irc_addr: typeof config.irc_addr === 'string' ? config.irc_addr : undefined,
54
+ tls: typeof config.tls === 'boolean' ? config.tls : undefined,
55
+ nick: typeof config.nick === 'string' ? config.nick : undefined,
56
+ };
57
+ }
58
+ // Stop once we reach the repo root.
59
+ if (fs.existsSync(path.join(current, '.git'))) {
60
+ return null;
61
+ }
62
+ const parent = path.dirname(current);
63
+ if (parent === current) {
64
+ return null;
65
+ }
66
+ current = parent;
67
+ }
68
+ }
69
+ export function resolveChannelConfig(cwd, channel, channelsEnv) {
70
+ const explicitChannel = channel ? normalizeChannelName(channel) : '';
71
+ let channels = parseChannels(channelsEnv);
72
+ if (channels.length === 0 && explicitChannel) {
73
+ channels = [explicitChannel];
74
+ }
75
+ const repoConfig = loadRepoConfig(cwd);
76
+ if (repoConfig) {
77
+ channels = mergeChannels(channels, allChannels(repoConfig));
78
+ }
79
+ if (channels.length === 0) {
80
+ channels = ['general'];
81
+ }
82
+ return {
83
+ channel: channels[0],
84
+ channels,
85
+ url: repoConfig?.url,
86
+ ircAddr: repoConfig?.irc_addr,
87
+ tls: repoConfig?.tls,
88
+ nick: repoConfig?.nick,
89
+ };
90
+ }
91
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/scuttlebot/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Scuttlebot HTTP API Client
3
+ *
4
+ * Provides agent registration and health check via the scuttlebot HTTP API.
5
+ * All runtime messaging goes through IRC (see irc-client.ts).
6
+ */
7
+ export interface ScuttlebotConfig {
8
+ /** HTTP API base URL for registration (e.g. "http://localhost:3000"). */
9
+ url: string;
10
+ /** API bearer token. */
11
+ token: string;
12
+ /** IRC server address, host:port (e.g. "127.0.0.1:6667"). */
13
+ ircAddr: string;
14
+ /** Primary channel (no # prefix). */
15
+ channel: string;
16
+ /** All channels (no # prefix). */
17
+ channels: string[];
18
+ /** Agent nick. */
19
+ nick?: string;
20
+ }
21
+ export interface AgentCredentials {
22
+ nick: string;
23
+ passphrase: string;
24
+ }
25
+ export declare class ScuttlebotHTTPClient {
26
+ private config;
27
+ constructor(config: ScuttlebotConfig);
28
+ /**
29
+ * Register an agent (or rotate if already registered) and return IRC credentials.
30
+ *
31
+ * Mirrors the relay's registerOrRotate logic:
32
+ * POST /v1/agents/register → 201 Created: use passphrase
33
+ * → 409 Conflict: rotate instead
34
+ * POST /v1/agents/{nick}/rotate → use new passphrase
35
+ */
36
+ register(nick: string, agentType?: string, channels?: string[]): Promise<AgentCredentials>;
37
+ /**
38
+ * Rotate credentials for an existing agent nick.
39
+ *
40
+ * POST /v1/agents/{nick}/rotate
41
+ */
42
+ rotate(nick: string): Promise<AgentCredentials>;
43
+ /**
44
+ * Delete agent registration on close (session cleanup).
45
+ *
46
+ * DELETE /v1/agents/{nick}
47
+ */
48
+ deleteAgent(nick: string): Promise<void>;
49
+ /**
50
+ * Touch presence for a nick in a channel — marks the agent as online
51
+ * in the registry. Required for the admin UI to show the agent as live.
52
+ *
53
+ * POST /v1/channels/{channel}/presence
54
+ */
55
+ touchPresence(channel: string, nick: string): Promise<void>;
56
+ /**
57
+ * Check server health.
58
+ *
59
+ * GET /v1/status
60
+ */
61
+ healthCheck(): Promise<boolean>;
62
+ }
63
+ //# sourceMappingURL=http-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/scuttlebot/http-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,yEAAyE;IACzE,GAAG,EAAE,MAAM,CAAC;IACZ,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,kBAAkB;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAmB;gBAErB,MAAM,EAAE,gBAAgB;IAIpC;;;;;;;OAOG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAgChG;;;;OAIG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAerD;;;;OAIG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9C;;;;;OAKG;IACG,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBjE;;;;OAIG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CActC"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Scuttlebot HTTP API Client
3
+ *
4
+ * Provides agent registration and health check via the scuttlebot HTTP API.
5
+ * All runtime messaging goes through IRC (see irc-client.ts).
6
+ */
7
+ export class ScuttlebotHTTPClient {
8
+ config;
9
+ constructor(config) {
10
+ this.config = config;
11
+ }
12
+ /**
13
+ * Register an agent (or rotate if already registered) and return IRC credentials.
14
+ *
15
+ * Mirrors the relay's registerOrRotate logic:
16
+ * POST /v1/agents/register → 201 Created: use passphrase
17
+ * → 409 Conflict: rotate instead
18
+ * POST /v1/agents/{nick}/rotate → use new passphrase
19
+ */
20
+ async register(nick, agentType, channels) {
21
+ const raw = channels || this.config.channels;
22
+ const channelList = raw.map(c => c.startsWith('#') ? c : `#${c}`);
23
+ const registerResp = await fetch(`${this.config.url}/v1/agents/register`, {
24
+ method: 'POST',
25
+ headers: {
26
+ 'Authorization': `Bearer ${this.config.token}`,
27
+ 'Content-Type': 'application/json',
28
+ },
29
+ body: JSON.stringify({
30
+ nick,
31
+ type: agentType || 'worker',
32
+ channels: channelList,
33
+ }),
34
+ });
35
+ if (registerResp.status === 201) {
36
+ const data = await registerResp.json();
37
+ return { nick: data.credentials.nick, passphrase: data.credentials.passphrase };
38
+ }
39
+ if (registerResp.status === 409) {
40
+ // Nick already registered — rotate to get fresh credentials
41
+ return this.rotate(nick);
42
+ }
43
+ const body = await registerResp.text().catch(() => '');
44
+ throw new Error(`Registration failed: ${registerResp.status} ${registerResp.statusText}${body ? ` — ${body}` : ''}`);
45
+ }
46
+ /**
47
+ * Rotate credentials for an existing agent nick.
48
+ *
49
+ * POST /v1/agents/{nick}/rotate
50
+ */
51
+ async rotate(nick) {
52
+ const response = await fetch(`${this.config.url}/v1/agents/${nick}/rotate`, {
53
+ method: 'POST',
54
+ headers: { 'Authorization': `Bearer ${this.config.token}` },
55
+ });
56
+ if (!response.ok) {
57
+ const body = await response.text().catch(() => '');
58
+ throw new Error(`Rotate failed: ${response.status} ${response.statusText}${body ? ` — ${body}` : ''}`);
59
+ }
60
+ const data = await response.json();
61
+ return { nick, passphrase: data.passphrase };
62
+ }
63
+ /**
64
+ * Delete agent registration on close (session cleanup).
65
+ *
66
+ * DELETE /v1/agents/{nick}
67
+ */
68
+ async deleteAgent(nick) {
69
+ try {
70
+ await fetch(`${this.config.url}/v1/agents/${nick}`, {
71
+ method: 'DELETE',
72
+ headers: { 'Authorization': `Bearer ${this.config.token}` },
73
+ });
74
+ }
75
+ catch {
76
+ // Best-effort
77
+ }
78
+ }
79
+ /**
80
+ * Touch presence for a nick in a channel — marks the agent as online
81
+ * in the registry. Required for the admin UI to show the agent as live.
82
+ *
83
+ * POST /v1/channels/{channel}/presence
84
+ */
85
+ async touchPresence(channel, nick) {
86
+ if (!this.config.url || !this.config.token)
87
+ return;
88
+ const channelName = channel.startsWith('#') ? channel.slice(1) : channel;
89
+ try {
90
+ await fetch(`${this.config.url}/v1/channels/${channelName}/presence`, {
91
+ method: 'POST',
92
+ headers: {
93
+ 'Authorization': `Bearer ${this.config.token}`,
94
+ 'Content-Type': 'application/json',
95
+ },
96
+ body: JSON.stringify({ nick }),
97
+ });
98
+ }
99
+ catch {
100
+ // Silently fail — presence is best-effort
101
+ }
102
+ }
103
+ /**
104
+ * Check server health.
105
+ *
106
+ * GET /v1/status
107
+ */
108
+ async healthCheck() {
109
+ try {
110
+ const url = `${this.config.url}/v1/status`;
111
+ const response = await fetch(url, {
112
+ method: 'GET',
113
+ headers: {
114
+ 'Authorization': `Bearer ${this.config.token}`,
115
+ },
116
+ });
117
+ return response.ok;
118
+ }
119
+ catch {
120
+ return false;
121
+ }
122
+ }
123
+ }
124
+ //# sourceMappingURL=http-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/scuttlebot/http-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Scuttlebot Integration
3
+ *
4
+ * Native scuttlebot support for Calliope CLI.
5
+ * Registers via HTTP API, then connects directly to IRC for
6
+ * real-time mirroring and operator intervention.
7
+ */
8
+ export { scuttlebotClient } from './client.js';
9
+ export type { ScuttlebotIntegration } from './client.js';
10
+ export type { ScuttlebotConfig, AgentCredentials } from './http-client.js';
11
+ export type { Envelope, IRCClientOptions } from './irc-client.js';
12
+ export { ScuttlebotIRCClient, matchesRecipient, newEnvelope, MessageTypes } from './irc-client.js';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scuttlebot/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Scuttlebot Integration
3
+ *
4
+ * Native scuttlebot support for Calliope CLI.
5
+ * Registers via HTTP API, then connects directly to IRC for
6
+ * real-time mirroring and operator intervention.
7
+ */
8
+ export { scuttlebotClient } from './client.js';
9
+ export { ScuttlebotIRCClient, matchesRecipient, newEnvelope, MessageTypes } from './irc-client.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scuttlebot/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAI/C,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Scuttlebot IRC Client
3
+ *
4
+ * Zero-dependency IRC client using Node.js net.Socket.
5
+ * Connects directly to Ergo IRC server with SASL PLAIN auth.
6
+ * Handles the scuttlebot envelope protocol (JSON over PRIVMSG).
7
+ */
8
+ /** Wire envelope — matches the Go protocol.Envelope. */
9
+ export interface Envelope {
10
+ v: 1;
11
+ type: string;
12
+ id: string;
13
+ from: string;
14
+ to?: string[];
15
+ ts: number;
16
+ payload?: unknown;
17
+ }
18
+ /** Well-known message types. */
19
+ export declare const MessageTypes: {
20
+ readonly AgentHello: "agent.hello";
21
+ readonly AgentBye: "agent.bye";
22
+ readonly TaskCreate: "task.create";
23
+ readonly TaskUpdate: "task.update";
24
+ readonly TaskComplete: "task.complete";
25
+ };
26
+ /**
27
+ * Check whether an envelope is addressed to `nick` with `agentType`.
28
+ *
29
+ * Ported from Go's protocol.MatchesRecipient:
30
+ * - empty/nil to -> true (broadcast)
31
+ * - @all -> true
32
+ * - @workers etc. -> agentType match
33
+ * - @prefix-* -> nick starts with prefix-
34
+ * - bare string -> exact nick match
35
+ */
36
+ export declare function matchesRecipient(env: Envelope, nick: string, agentType: string): boolean;
37
+ /** Create a new envelope with a generated ID and current timestamp. */
38
+ export declare function newEnvelope(type: string, from: string, opts?: {
39
+ to?: string[];
40
+ payload?: unknown;
41
+ }): Envelope;
42
+ export interface IRCClientOptions {
43
+ /** IRC server address, "host:port". */
44
+ serverAddr: string;
45
+ /** Nick (also used as SASL username). */
46
+ nick: string;
47
+ /** SASL PLAIN passphrase from registration. */
48
+ passphrase: string;
49
+ /** Channels to join (with or without # prefix). */
50
+ channels: string[];
51
+ /** Agent type for recipient matching. Defaults to 'worker'. */
52
+ agentType?: string;
53
+ /** Use TLS. Inferred from port 6697 if not specified. */
54
+ tls?: boolean;
55
+ }
56
+ type EnvelopeHandler = (env: Envelope, channel: string) => void;
57
+ type InstructionHandler = (text: string, from: string, channel: string) => void;
58
+ export declare class ScuttlebotIRCClient {
59
+ private readonly opts;
60
+ private readonly agentType;
61
+ private socket;
62
+ private connected;
63
+ private destroyed;
64
+ private envelopeHandlers;
65
+ private instructionHandlers;
66
+ private reconnectTimer;
67
+ private reconnectDelay;
68
+ private shouldReconnect;
69
+ private buffer;
70
+ private saslState;
71
+ private connectResolve;
72
+ private connectReject;
73
+ private connectTimeout;
74
+ private static readonly PING_INTERVAL_MS;
75
+ private static readonly PING_TIMEOUT_MS;
76
+ private pingTimer;
77
+ private pongTimer;
78
+ private pendingPing;
79
+ private exitHandler;
80
+ constructor(opts: IRCClientOptions);
81
+ /** Register a handler for incoming JSON envelopes. */
82
+ onEnvelope(handler: EnvelopeHandler): void;
83
+ /** Register a handler for human instructions (non-JSON PRIVMSG that mention our nick). */
84
+ onInstruction(handler: InstructionHandler): void;
85
+ /**
86
+ * Connect to the IRC server. Resolves once fully registered (numeric 001 received).
87
+ * Rejects on timeout (30s) or fatal connection error during initial connect.
88
+ */
89
+ connect(): Promise<void>;
90
+ /** Disconnect gracefully. Sends QUIT and closes the socket. */
91
+ disconnect(): Promise<void>;
92
+ /** Send a JSON envelope as PRIVMSG to a channel. */
93
+ sendEnvelope(channel: string, env: Omit<Envelope, 'id' | 'ts'>): void;
94
+ /** Send a plain text PRIVMSG to a channel. */
95
+ sendRaw(channel: string, text: string): void;
96
+ /** Whether we are currently connected and registered on IRC. */
97
+ isConnected(): boolean;
98
+ private createConnection;
99
+ private processBuffer;
100
+ private handleLine;
101
+ /**
102
+ * Handle non-JSON PRIVMSG as potential human instructions.
103
+ * Delivers to instruction handlers if:
104
+ * - Message mentions our nick
105
+ * - Sender is not a service bot
106
+ * - Sender is not an agent (claude-/codex-/gemini-/calliope- prefix)
107
+ */
108
+ private handleHumanChat;
109
+ private sendRawLine;
110
+ private sendPrivmsg;
111
+ private startPingKeepalive;
112
+ private stopPingKeepalive;
113
+ /**
114
+ * Register SIGINT/SIGTERM handlers so we send QUIT before the process exits.
115
+ * Uses a synchronous write — the OS TCP stack will flush it even if the
116
+ * event loop drains immediately afterward.
117
+ */
118
+ private registerExitHandler;
119
+ private unregisterExitHandler;
120
+ private scheduleReconnect;
121
+ private cleanupSocket;
122
+ }
123
+ export {};
124
+ //# sourceMappingURL=irc-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"irc-client.d.ts","sourceRoot":"","sources":["../../src/scuttlebot/irc-client.ts"],"names":[],"mappings":"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"}