@calliopelabs/cli 2.3.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 (186) 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/dynamic-tools.d.ts.map +1 -1
  8. package/dist/agents/dynamic-tools.js +39 -10
  9. package/dist/agents/dynamic-tools.js.map +1 -1
  10. package/dist/agents/sdk-backend.js +1 -1
  11. package/dist/agents/sdk-backend.js.map +1 -1
  12. package/dist/api-server.d.ts +9 -0
  13. package/dist/api-server.d.ts.map +1 -1
  14. package/dist/api-server.js +74 -3
  15. package/dist/api-server.js.map +1 -1
  16. package/dist/auto-checkpoint.d.ts.map +1 -1
  17. package/dist/auto-checkpoint.js +50 -17
  18. package/dist/auto-checkpoint.js.map +1 -1
  19. package/dist/auto-compressor.d.ts.map +1 -1
  20. package/dist/auto-compressor.js +9 -5
  21. package/dist/auto-compressor.js.map +1 -1
  22. package/dist/bin.d.ts +8 -0
  23. package/dist/bin.d.ts.map +1 -1
  24. package/dist/bin.js +59 -4
  25. package/dist/bin.js.map +1 -1
  26. package/dist/branching.d.ts.map +1 -1
  27. package/dist/branching.js +14 -1
  28. package/dist/branching.js.map +1 -1
  29. package/dist/checkpoint.d.ts.map +1 -1
  30. package/dist/checkpoint.js +13 -1
  31. package/dist/checkpoint.js.map +1 -1
  32. package/dist/cli/agent.d.ts.map +1 -1
  33. package/dist/cli/agent.js +19 -3
  34. package/dist/cli/agent.js.map +1 -1
  35. package/dist/cli/commands.d.ts.map +1 -1
  36. package/dist/cli/commands.js +99 -0
  37. package/dist/cli/commands.js.map +1 -1
  38. package/dist/cli/index.d.ts.map +1 -1
  39. package/dist/cli/index.js +32 -1
  40. package/dist/cli/index.js.map +1 -1
  41. package/dist/cli/types.js +1 -1
  42. package/dist/cli/types.js.map +1 -1
  43. package/dist/config.js +2 -2
  44. package/dist/config.js.map +1 -1
  45. package/dist/diff.d.ts.map +1 -1
  46. package/dist/diff.js +42 -4
  47. package/dist/diff.js.map +1 -1
  48. package/dist/errors.d.ts.map +1 -1
  49. package/dist/errors.js +30 -3
  50. package/dist/errors.js.map +1 -1
  51. package/dist/headless.d.ts.map +1 -1
  52. package/dist/headless.js +56 -2
  53. package/dist/headless.js.map +1 -1
  54. package/dist/hooks.d.ts +8 -2
  55. package/dist/hooks.d.ts.map +1 -1
  56. package/dist/hooks.js +97 -11
  57. package/dist/hooks.js.map +1 -1
  58. package/dist/idle-eviction.d.ts.map +1 -1
  59. package/dist/idle-eviction.js +8 -1
  60. package/dist/idle-eviction.js.map +1 -1
  61. package/dist/markdown.d.ts.map +1 -1
  62. package/dist/markdown.js +32 -10
  63. package/dist/markdown.js.map +1 -1
  64. package/dist/mcp.d.ts +35 -5
  65. package/dist/mcp.d.ts.map +1 -1
  66. package/dist/mcp.js +186 -12
  67. package/dist/mcp.js.map +1 -1
  68. package/dist/model-detection.d.ts +14 -1
  69. package/dist/model-detection.d.ts.map +1 -1
  70. package/dist/model-detection.js +307 -114
  71. package/dist/model-detection.js.map +1 -1
  72. package/dist/model-router.js +7 -7
  73. package/dist/model-router.js.map +1 -1
  74. package/dist/parallel-tools.d.ts +9 -1
  75. package/dist/parallel-tools.d.ts.map +1 -1
  76. package/dist/parallel-tools.js +6 -5
  77. package/dist/parallel-tools.js.map +1 -1
  78. package/dist/plugins.d.ts +37 -0
  79. package/dist/plugins.d.ts.map +1 -1
  80. package/dist/plugins.js +87 -0
  81. package/dist/plugins.js.map +1 -1
  82. package/dist/providers/anthropic.d.ts.map +1 -1
  83. package/dist/providers/anthropic.js +36 -2
  84. package/dist/providers/anthropic.js.map +1 -1
  85. package/dist/providers/bedrock.d.ts.map +1 -1
  86. package/dist/providers/bedrock.js +81 -17
  87. package/dist/providers/bedrock.js.map +1 -1
  88. package/dist/providers/index.d.ts.map +1 -1
  89. package/dist/providers/index.js +2 -0
  90. package/dist/providers/index.js.map +1 -1
  91. package/dist/providers/types.d.ts.map +1 -1
  92. package/dist/providers/types.js +19 -10
  93. package/dist/providers/types.js.map +1 -1
  94. package/dist/risk.d.ts.map +1 -1
  95. package/dist/risk.js +15 -5
  96. package/dist/risk.js.map +1 -1
  97. package/dist/sandbox-native.d.ts +1 -0
  98. package/dist/sandbox-native.d.ts.map +1 -1
  99. package/dist/sandbox-native.js +37 -5
  100. package/dist/sandbox-native.js.map +1 -1
  101. package/dist/scope.d.ts +10 -0
  102. package/dist/scope.d.ts.map +1 -1
  103. package/dist/scope.js +75 -15
  104. package/dist/scope.js.map +1 -1
  105. package/dist/scuttlebot/client.d.ts +83 -0
  106. package/dist/scuttlebot/client.d.ts.map +1 -0
  107. package/dist/scuttlebot/client.js +350 -0
  108. package/dist/scuttlebot/client.js.map +1 -0
  109. package/dist/scuttlebot/config.d.ts +28 -0
  110. package/dist/scuttlebot/config.d.ts.map +1 -0
  111. package/dist/scuttlebot/config.js +91 -0
  112. package/dist/scuttlebot/config.js.map +1 -0
  113. package/dist/scuttlebot/http-client.d.ts +63 -0
  114. package/dist/scuttlebot/http-client.d.ts.map +1 -0
  115. package/dist/scuttlebot/http-client.js +124 -0
  116. package/dist/scuttlebot/http-client.js.map +1 -0
  117. package/dist/scuttlebot/index.d.ts +13 -0
  118. package/dist/scuttlebot/index.d.ts.map +1 -0
  119. package/dist/scuttlebot/index.js +10 -0
  120. package/dist/scuttlebot/index.js.map +1 -0
  121. package/dist/scuttlebot/irc-client.d.ts +124 -0
  122. package/dist/scuttlebot/irc-client.d.ts.map +1 -0
  123. package/dist/scuttlebot/irc-client.js +599 -0
  124. package/dist/scuttlebot/irc-client.js.map +1 -0
  125. package/dist/skills.d.ts +19 -0
  126. package/dist/skills.d.ts.map +1 -1
  127. package/dist/skills.js +98 -10
  128. package/dist/skills.js.map +1 -1
  129. package/dist/smart-router.js +4 -4
  130. package/dist/smart-router.js.map +1 -1
  131. package/dist/storage.d.ts +0 -4
  132. package/dist/storage.d.ts.map +1 -1
  133. package/dist/storage.js +81 -5
  134. package/dist/storage.js.map +1 -1
  135. package/dist/tools.d.ts.map +1 -1
  136. package/dist/tools.js +232 -38
  137. package/dist/tools.js.map +1 -1
  138. package/dist/trust.d.ts +16 -3
  139. package/dist/trust.d.ts.map +1 -1
  140. package/dist/trust.js +23 -4
  141. package/dist/trust.js.map +1 -1
  142. package/dist/types.d.ts.map +1 -1
  143. package/dist/types.js +13 -4
  144. package/dist/types.js.map +1 -1
  145. package/dist/ui/agent.d.ts +1 -1
  146. package/dist/ui/agent.d.ts.map +1 -1
  147. package/dist/ui/agent.js +35 -44
  148. package/dist/ui/agent.js.map +1 -1
  149. package/dist/ui/chat-input.d.ts +3 -1
  150. package/dist/ui/chat-input.d.ts.map +1 -1
  151. package/dist/ui/chat-input.js +82 -17
  152. package/dist/ui/chat-input.js.map +1 -1
  153. package/dist/ui/commands.d.ts +2 -0
  154. package/dist/ui/commands.d.ts.map +1 -1
  155. package/dist/ui/commands.js +318 -10
  156. package/dist/ui/commands.js.map +1 -1
  157. package/dist/ui/index.d.ts.map +1 -1
  158. package/dist/ui/index.js +236 -46
  159. package/dist/ui/index.js.map +1 -1
  160. package/dist/ui/input-utils.d.ts +20 -0
  161. package/dist/ui/input-utils.d.ts.map +1 -0
  162. package/dist/ui/input-utils.js +35 -0
  163. package/dist/ui/input-utils.js.map +1 -0
  164. package/dist/ui/messages.d.ts +6 -2
  165. package/dist/ui/messages.d.ts.map +1 -1
  166. package/dist/ui/messages.js +42 -11
  167. package/dist/ui/messages.js.map +1 -1
  168. package/dist/ui/modals.d.ts +21 -1
  169. package/dist/ui/modals.d.ts.map +1 -1
  170. package/dist/ui/modals.js +67 -5
  171. package/dist/ui/modals.js.map +1 -1
  172. package/dist/ui/status-bar.d.ts +4 -1
  173. package/dist/ui/status-bar.d.ts.map +1 -1
  174. package/dist/ui/status-bar.js +12 -1
  175. package/dist/ui/status-bar.js.map +1 -1
  176. package/dist/ui/types.d.ts +3 -0
  177. package/dist/ui/types.d.ts.map +1 -1
  178. package/package.json +4 -7
  179. package/dist/completion.d.ts +0 -75
  180. package/dist/completion.d.ts.map +0 -1
  181. package/dist/completion.js +0 -234
  182. package/dist/completion.js.map +0 -1
  183. package/dist/keyboard.d.ts +0 -57
  184. package/dist/keyboard.d.ts.map +0 -1
  185. package/dist/keyboard.js +0 -265
  186. package/dist/keyboard.js.map +0 -1
@@ -0,0 +1,350 @@
1
+ /**
2
+ * Scuttlebot Integration Client
3
+ *
4
+ * Main integration point for scuttlebot. Registers via HTTP API, then connects
5
+ * directly to IRC for all runtime messaging. No HTTP polling.
6
+ */
7
+ import * as crypto from 'node:crypto';
8
+ import * as fs from 'node:fs';
9
+ import * as os from 'node:os';
10
+ import * as path from 'node:path';
11
+ import { ScuttlebotHTTPClient } from './http-client.js';
12
+ import { ScuttlebotIRCClient, MessageTypes } from './irc-client.js';
13
+ import { resolveChannelConfig } from './config.js';
14
+ /**
15
+ * Load ~/.config/scuttlebot-relay.env as a fallback env source.
16
+ * Returns a map of KEY → value for SCUTTLEBOT_* variables not already set in process.env.
17
+ */
18
+ function loadRelayEnv() {
19
+ const envFile = path.join(os.homedir(), '.config', 'scuttlebot-relay.env');
20
+ try {
21
+ const raw = fs.readFileSync(envFile, 'utf8');
22
+ const result = {};
23
+ for (const line of raw.split('\n')) {
24
+ const trimmed = line.trim();
25
+ if (!trimmed || trimmed.startsWith('#'))
26
+ continue;
27
+ const eq = trimmed.indexOf('=');
28
+ if (eq === -1)
29
+ continue;
30
+ const key = trimmed.slice(0, eq).trim();
31
+ const val = trimmed.slice(eq + 1).trim();
32
+ if (key && val && !(key in process.env)) {
33
+ result[key] = val;
34
+ }
35
+ }
36
+ return result;
37
+ }
38
+ catch {
39
+ return {};
40
+ }
41
+ }
42
+ /**
43
+ * Keys that should be picked up from the relay env file.
44
+ * Project-specific keys (CHANNEL, NICK, PASSPHRASE) are intentionally excluded
45
+ * so they don't bleed across projects.
46
+ */
47
+ const RELAY_ENV_KEYS = new Set([
48
+ 'SCUTTLEBOT_URL',
49
+ 'SCUTTLEBOT_TOKEN',
50
+ 'SCUTTLEBOT_IRC_ADDR',
51
+ ]);
52
+ /** Get a config value: process.env first, then relay env file fallback (server-level keys only). */
53
+ function getEnv(key, relayEnv) {
54
+ return process.env[key] ?? (RELAY_ENV_KEYS.has(key) ? relayEnv[key] : undefined);
55
+ }
56
+ /**
57
+ * Generate an 8-char hex session ID from cwd+pid+time — mirrors the relay's
58
+ * defaultSessionID(target) which uses CRC32(path|pid|ppid|nanotime).
59
+ */
60
+ function defaultSessionID(cwd) {
61
+ const input = `${cwd}|${process.pid}|${Date.now()}`;
62
+ return crypto.createHash('sha256').update(input).digest('hex').slice(0, 8);
63
+ }
64
+ /**
65
+ * Strip the addressed nick from the start of a message.
66
+ * "calliope-calliope-cli-13f9af15: hi there" → "hi there"
67
+ * Mirrors ircagent.TrimAddressedText from the relay.
68
+ */
69
+ function trimAddressedText(text, nick) {
70
+ const trimmed = text.trim();
71
+ // Match "nick: ", "nick, ", "nick " at start (case-insensitive)
72
+ const prefix = new RegExp(`^${nick.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')}[:\\s,]+`, 'i');
73
+ return trimmed.replace(prefix, '').trim() || trimmed;
74
+ }
75
+ /** Sanitize a string for use as an IRC nick (matches relay's sanitize()). */
76
+ function sanitizeNick(value) {
77
+ let result = '';
78
+ for (const ch of value) {
79
+ if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ||
80
+ (ch >= '0' && ch <= '9') || ch === '-' || ch === '_') {
81
+ result += ch;
82
+ }
83
+ else {
84
+ result += '-';
85
+ }
86
+ }
87
+ result = result.replace(/^-+|-+$/g, '');
88
+ return result || 'session';
89
+ }
90
+ export class ScuttlebotClient {
91
+ httpClient = null;
92
+ ircClient = null;
93
+ config = null;
94
+ nick = '';
95
+ enabled = false;
96
+ registeredByClient = false; // track if we registered (for delete-on-close)
97
+ instructionHandler = null;
98
+ presenceTimer = null;
99
+ static PRESENCE_INTERVAL_MS = 60_000; // touch every 60s
100
+ /**
101
+ * Initialize from environment variables.
102
+ *
103
+ * Flow: resolve config -> register via HTTP -> connect IRC -> send agent.hello.
104
+ */
105
+ async initialize(sessionId, cwd) {
106
+ // Load ~/.config/scuttlebot-relay.env as fallback (same source the relay agents use)
107
+ const relayEnv = loadRelayEnv();
108
+ // SCUTTLEBOT_PASSPHRASE = pre-registered mode (stable nick, skip HTTP registration)
109
+ // SCUTTLEBOT_TOKEN = dynamic registration mode (session nicks via HTTP API)
110
+ const passphrase = getEnv('SCUTTLEBOT_PASSPHRASE', relayEnv);
111
+ const token = getEnv('SCUTTLEBOT_TOKEN', relayEnv);
112
+ if (!passphrase && !token) {
113
+ this.enabled = false;
114
+ return false;
115
+ }
116
+ const resolved = resolveChannelConfig(cwd, getEnv('SCUTTLEBOT_CHANNEL', relayEnv), getEnv('SCUTTLEBOT_CHANNELS', relayEnv));
117
+ const { channel, channels } = resolved;
118
+ // IRC addr: env var > yaml > relay env > local default
119
+ const ircAddr = getEnv('SCUTTLEBOT_IRC_ADDR', relayEnv) || resolved.ircAddr || '127.0.0.1:6667';
120
+ const useTLS = resolved.tls ?? ircAddr.endsWith(':6697');
121
+ // URL: env var > yaml > relay env
122
+ const url = getEnv('SCUTTLEBOT_URL', relayEnv) || resolved.url || '';
123
+ this.config = {
124
+ url,
125
+ token: token || '',
126
+ ircAddr,
127
+ channel,
128
+ channels,
129
+ nick: this.nick,
130
+ };
131
+ try {
132
+ let ircNick;
133
+ let ircPassphrase;
134
+ if (passphrase) {
135
+ // Pre-registered mode: use provided nick + passphrase, no HTTP call needed
136
+ ircNick = getEnv('SCUTTLEBOT_NICK', relayEnv) || resolved.nick || 'calliope';
137
+ ircPassphrase = passphrase;
138
+ this.nick = ircNick;
139
+ // Create HTTP client for presence/touch if URL+token available
140
+ if (url && token) {
141
+ this.httpClient = new ScuttlebotHTTPClient(this.config);
142
+ }
143
+ }
144
+ else {
145
+ // Dynamic registration mode: get session credentials via HTTP API
146
+ if (!url || !token) {
147
+ this.enabled = false;
148
+ return false;
149
+ }
150
+ // Generate session nick: calliope-{basename}-{8hex} — matches relay pattern
151
+ const basename = sanitizeNick(path.basename(cwd));
152
+ const sessionSuffix = defaultSessionID(cwd);
153
+ this.nick = sanitizeNick(getEnv('SCUTTLEBOT_NICK', relayEnv) || `calliope-${basename}-${sessionSuffix}`);
154
+ this.httpClient = new ScuttlebotHTTPClient(this.config);
155
+ const credentials = await this.httpClient.register(this.nick, 'worker', channels);
156
+ ircNick = credentials.nick;
157
+ ircPassphrase = credentials.passphrase;
158
+ this.nick = ircNick;
159
+ this.registeredByClient = true;
160
+ }
161
+ // Connect to IRC
162
+ this.ircClient = new ScuttlebotIRCClient({
163
+ serverAddr: ircAddr,
164
+ nick: ircNick,
165
+ passphrase: ircPassphrase,
166
+ channels: channels.map(c => c.startsWith('#') ? c : `#${c}`),
167
+ agentType: 'worker',
168
+ tls: useTLS,
169
+ });
170
+ // Wire up envelope handler — deliver task.create to instruction handler
171
+ this.ircClient.onEnvelope((env, _channel) => {
172
+ if (env.type === MessageTypes.TaskCreate && this.instructionHandler) {
173
+ // Extract instruction text from payload
174
+ const payload = env.payload;
175
+ const instruction = payload?.instruction ?? payload?.prompt ?? payload?.text ?? JSON.stringify(payload);
176
+ this.instructionHandler(String(instruction));
177
+ }
178
+ });
179
+ // Wire up human instruction handler — strip the addressing prefix before delivery
180
+ // e.g. "calliope-calliope-cli-13f9af15: hi" → "hi"
181
+ this.ircClient.onInstruction((text, _from, _channel) => {
182
+ if (this.instructionHandler) {
183
+ this.instructionHandler(trimAddressedText(text, this.nick));
184
+ }
185
+ });
186
+ await this.ircClient.connect();
187
+ // 3. Announce presence — IRC envelope + registry touch
188
+ this.sendHello();
189
+ await this.touchPresence();
190
+ // 4. Heartbeat — keep registry showing agent as online
191
+ this.presenceTimer = setInterval(() => {
192
+ void this.touchPresence();
193
+ }, ScuttlebotClient.PRESENCE_INTERVAL_MS);
194
+ this.enabled = true;
195
+ return true;
196
+ }
197
+ catch (error) {
198
+ // eslint-disable-next-line no-console
199
+ console.error('Failed to initialize scuttlebot:', error instanceof Error ? error.message : String(error));
200
+ this.enabled = false;
201
+ return false;
202
+ }
203
+ }
204
+ /**
205
+ * Post a plain text message to the primary channel.
206
+ */
207
+ async postMessage(text) {
208
+ if (!this.enabled || !this.config || !this.ircClient)
209
+ return;
210
+ this.ircClient.sendRaw(this.config.channel, this.sanitizeSecrets(text));
211
+ }
212
+ /**
213
+ * Post online presence (agent.hello envelope).
214
+ */
215
+ async postOnline() {
216
+ this.sendHello();
217
+ }
218
+ /**
219
+ * Post offline presence (agent.bye envelope).
220
+ */
221
+ async postOffline() {
222
+ this.sendBye();
223
+ }
224
+ /**
225
+ * Mirror a tool call as a plain text status message.
226
+ */
227
+ async mirrorToolCall(toolName, args) {
228
+ if (!this.enabled || !this.config || !this.ircClient)
229
+ return;
230
+ let text = toolName;
231
+ if (args && typeof args === 'object') {
232
+ const argsObj = args;
233
+ if ('path' in argsObj)
234
+ text += ` ${argsObj.path}`;
235
+ if ('command' in argsObj)
236
+ text += ` ${argsObj.command}`;
237
+ if ('pattern' in argsObj)
238
+ text += ` ${argsObj.pattern}`;
239
+ }
240
+ this.ircClient.sendRaw(this.config.channel, this.sanitizeSecrets(text));
241
+ }
242
+ /**
243
+ * Mirror assistant message as plain text.
244
+ */
245
+ async mirrorAssistant(message) {
246
+ if (!this.enabled || !this.config || !this.ircClient)
247
+ return;
248
+ const truncated = message.length > 200
249
+ ? message.slice(0, 197) + '...'
250
+ : message;
251
+ this.ircClient.sendRaw(this.config.channel, this.sanitizeSecrets(truncated));
252
+ }
253
+ /**
254
+ * Register an instruction handler for incoming tasks/commands.
255
+ */
256
+ startPolling(handler) {
257
+ this.instructionHandler = handler;
258
+ }
259
+ /**
260
+ * Stop listening for instructions.
261
+ */
262
+ stopPolling() {
263
+ this.instructionHandler = null;
264
+ }
265
+ /**
266
+ * Disconnect and cleanup.
267
+ */
268
+ async disconnect() {
269
+ this.stopPolling();
270
+ if (this.presenceTimer) {
271
+ clearInterval(this.presenceTimer);
272
+ this.presenceTimer = null;
273
+ }
274
+ if (this.ircClient) {
275
+ this.sendBye();
276
+ await this.ircClient.disconnect();
277
+ this.ircClient = null;
278
+ }
279
+ // Delete session registration so it doesn't linger in the registry
280
+ if (this.registeredByClient && this.httpClient && this.nick) {
281
+ await this.httpClient.deleteAgent(this.nick);
282
+ }
283
+ this.httpClient = null;
284
+ this.registeredByClient = false;
285
+ this.enabled = false;
286
+ }
287
+ /**
288
+ * Get integration status.
289
+ */
290
+ getStatus() {
291
+ return {
292
+ enabled: this.enabled,
293
+ config: this.config || undefined,
294
+ nick: this.nick || undefined,
295
+ connected: this.ircClient?.isConnected() || false,
296
+ };
297
+ }
298
+ /**
299
+ * Check if enabled.
300
+ */
301
+ isEnabled() {
302
+ return this.enabled;
303
+ }
304
+ // ── Private helpers ──────────────────────────────────────────────
305
+ sendHello() {
306
+ if (!this.ircClient || !this.config)
307
+ return;
308
+ this.ircClient.sendEnvelope(this.config.channel, {
309
+ v: 1,
310
+ type: MessageTypes.AgentHello,
311
+ from: this.nick,
312
+ });
313
+ }
314
+ sendBye() {
315
+ if (!this.ircClient || !this.config)
316
+ return;
317
+ this.ircClient.sendEnvelope(this.config.channel, {
318
+ v: 1,
319
+ type: MessageTypes.AgentBye,
320
+ from: this.nick,
321
+ });
322
+ }
323
+ /**
324
+ * Touch presence via HTTP API so the registry marks this agent as online.
325
+ * Best-effort — skipped silently if no URL/token configured.
326
+ */
327
+ async touchPresence() {
328
+ if (!this.httpClient || !this.config?.channel || !this.nick)
329
+ return;
330
+ await this.httpClient.touchPresence(this.config.channel, this.nick);
331
+ }
332
+ /**
333
+ * Sanitize secrets from text before posting.
334
+ */
335
+ sanitizeSecrets(text) {
336
+ let sanitized = text;
337
+ // Hex secrets (32+ chars)
338
+ sanitized = sanitized.replace(/\b[a-f0-9]{32,}\b/gi, '[REDACTED]');
339
+ // API keys (sk-...)
340
+ sanitized = sanitized.replace(/\bsk-[A-Za-z0-9_-]+\b/g, '[REDACTED]');
341
+ // Bearer tokens
342
+ sanitized = sanitized.replace(/bearer\s+[A-Za-z0-9._:-]+/gi, 'bearer [REDACTED]');
343
+ // Environment variable assignments
344
+ sanitized = sanitized.replace(/\b([A-Z0-9_]*(TOKEN|KEY|SECRET|PASSPHRASE)[A-Z0-9_]*)=([^ \t"'`]+)/gi, '$1=[REDACTED]');
345
+ return sanitized;
346
+ }
347
+ }
348
+ // Singleton instance
349
+ export const scuttlebotClient = new ScuttlebotClient();
350
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/scuttlebot/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export interface RepoScuttlebotConfig {
2
+ channel?: string;
3
+ channels?: string[];
4
+ /** HTTP API base URL (e.g. "https://scuttlebot.net"). Not a secret — safe in yaml. */
5
+ url?: string;
6
+ /** IRC server address "host:port" (e.g. "irc.scuttlebot.net:6667"). */
7
+ irc_addr?: string;
8
+ /** Use TLS for IRC. Inferred from port 6697 if not specified. */
9
+ tls?: boolean;
10
+ /** Stable pre-registered IRC nick. Overridden by SCUTTLEBOT_NICK env var. */
11
+ nick?: string;
12
+ }
13
+ export interface ResolvedChannelConfig {
14
+ channel: string;
15
+ channels: string[];
16
+ /** From .scuttlebot.yaml url field (overridden by SCUTTLEBOT_URL env var). */
17
+ url?: string;
18
+ /** From .scuttlebot.yaml irc_addr field (overridden by SCUTTLEBOT_IRC_ADDR env var). */
19
+ ircAddr?: string;
20
+ /** From .scuttlebot.yaml tls field. */
21
+ tls?: boolean;
22
+ /** From .scuttlebot.yaml nick field (overridden by SCUTTLEBOT_NICK env var). */
23
+ nick?: string;
24
+ }
25
+ export declare function mergeChannels(existing: string[], extra: string[]): string[];
26
+ export declare function loadRepoConfig(dir: string): RepoScuttlebotConfig | null;
27
+ export declare function resolveChannelConfig(cwd: string, channel?: string, channelsEnv?: string): ResolvedChannelConfig;
28
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/scuttlebot/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,sFAAsF;IACtF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wFAAwF;IACxF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,gFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA0BD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAc3E;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAoCvE;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,qBAAqB,CAwB/G"}
@@ -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"}