@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.
- package/README.md +17 -0
- package/dist/agents/agent-config-loader.js +1 -1
- package/dist/agents/agent-config-presets.js +13 -13
- package/dist/agents/agent-config-presets.js.map +1 -1
- package/dist/agents/agent-config-types.d.ts +1 -1
- package/dist/agents/agent-config-types.d.ts.map +1 -1
- package/dist/agents/dynamic-tools.d.ts.map +1 -1
- package/dist/agents/dynamic-tools.js +39 -10
- package/dist/agents/dynamic-tools.js.map +1 -1
- package/dist/agents/sdk-backend.js +1 -1
- package/dist/agents/sdk-backend.js.map +1 -1
- package/dist/api-server.d.ts +9 -0
- package/dist/api-server.d.ts.map +1 -1
- package/dist/api-server.js +74 -3
- package/dist/api-server.js.map +1 -1
- package/dist/auto-checkpoint.d.ts.map +1 -1
- package/dist/auto-checkpoint.js +50 -17
- package/dist/auto-checkpoint.js.map +1 -1
- package/dist/auto-compressor.d.ts.map +1 -1
- package/dist/auto-compressor.js +9 -5
- package/dist/auto-compressor.js.map +1 -1
- package/dist/bin.d.ts +8 -0
- package/dist/bin.d.ts.map +1 -1
- package/dist/bin.js +59 -4
- package/dist/bin.js.map +1 -1
- package/dist/branching.d.ts.map +1 -1
- package/dist/branching.js +14 -1
- package/dist/branching.js.map +1 -1
- package/dist/checkpoint.d.ts.map +1 -1
- package/dist/checkpoint.js +13 -1
- package/dist/checkpoint.js.map +1 -1
- package/dist/cli/agent.d.ts.map +1 -1
- package/dist/cli/agent.js +19 -3
- package/dist/cli/agent.js.map +1 -1
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +99 -0
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +32 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/types.js +1 -1
- package/dist/cli/types.js.map +1 -1
- package/dist/config.js +2 -2
- package/dist/config.js.map +1 -1
- package/dist/diff.d.ts.map +1 -1
- package/dist/diff.js +42 -4
- package/dist/diff.js.map +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +30 -3
- package/dist/errors.js.map +1 -1
- package/dist/headless.d.ts.map +1 -1
- package/dist/headless.js +56 -2
- package/dist/headless.js.map +1 -1
- package/dist/hooks.d.ts +8 -2
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +97 -11
- package/dist/hooks.js.map +1 -1
- package/dist/idle-eviction.d.ts.map +1 -1
- package/dist/idle-eviction.js +8 -1
- package/dist/idle-eviction.js.map +1 -1
- package/dist/markdown.d.ts.map +1 -1
- package/dist/markdown.js +32 -10
- package/dist/markdown.js.map +1 -1
- package/dist/mcp.d.ts +35 -5
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +186 -12
- package/dist/mcp.js.map +1 -1
- package/dist/model-detection.d.ts +14 -1
- package/dist/model-detection.d.ts.map +1 -1
- package/dist/model-detection.js +307 -114
- package/dist/model-detection.js.map +1 -1
- package/dist/model-router.js +7 -7
- package/dist/model-router.js.map +1 -1
- package/dist/parallel-tools.d.ts +9 -1
- package/dist/parallel-tools.d.ts.map +1 -1
- package/dist/parallel-tools.js +6 -5
- package/dist/parallel-tools.js.map +1 -1
- package/dist/plugins.d.ts +37 -0
- package/dist/plugins.d.ts.map +1 -1
- package/dist/plugins.js +87 -0
- package/dist/plugins.js.map +1 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +36 -2
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/bedrock.d.ts.map +1 -1
- package/dist/providers/bedrock.js +81 -17
- package/dist/providers/bedrock.js.map +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +2 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js +19 -10
- package/dist/providers/types.js.map +1 -1
- package/dist/risk.d.ts.map +1 -1
- package/dist/risk.js +15 -5
- package/dist/risk.js.map +1 -1
- package/dist/sandbox-native.d.ts +1 -0
- package/dist/sandbox-native.d.ts.map +1 -1
- package/dist/sandbox-native.js +37 -5
- package/dist/sandbox-native.js.map +1 -1
- package/dist/scope.d.ts +10 -0
- package/dist/scope.d.ts.map +1 -1
- package/dist/scope.js +75 -15
- package/dist/scope.js.map +1 -1
- package/dist/scuttlebot/client.d.ts +83 -0
- package/dist/scuttlebot/client.d.ts.map +1 -0
- package/dist/scuttlebot/client.js +350 -0
- package/dist/scuttlebot/client.js.map +1 -0
- package/dist/scuttlebot/config.d.ts +28 -0
- package/dist/scuttlebot/config.d.ts.map +1 -0
- package/dist/scuttlebot/config.js +91 -0
- package/dist/scuttlebot/config.js.map +1 -0
- package/dist/scuttlebot/http-client.d.ts +63 -0
- package/dist/scuttlebot/http-client.d.ts.map +1 -0
- package/dist/scuttlebot/http-client.js +124 -0
- package/dist/scuttlebot/http-client.js.map +1 -0
- package/dist/scuttlebot/index.d.ts +13 -0
- package/dist/scuttlebot/index.d.ts.map +1 -0
- package/dist/scuttlebot/index.js +10 -0
- package/dist/scuttlebot/index.js.map +1 -0
- package/dist/scuttlebot/irc-client.d.ts +124 -0
- package/dist/scuttlebot/irc-client.d.ts.map +1 -0
- package/dist/scuttlebot/irc-client.js +599 -0
- package/dist/scuttlebot/irc-client.js.map +1 -0
- package/dist/skills.d.ts +19 -0
- package/dist/skills.d.ts.map +1 -1
- package/dist/skills.js +98 -10
- package/dist/skills.js.map +1 -1
- package/dist/smart-router.js +4 -4
- package/dist/smart-router.js.map +1 -1
- package/dist/storage.d.ts +0 -4
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +81 -5
- package/dist/storage.js.map +1 -1
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +232 -38
- package/dist/tools.js.map +1 -1
- package/dist/trust.d.ts +16 -3
- package/dist/trust.d.ts.map +1 -1
- package/dist/trust.js +23 -4
- package/dist/trust.js.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +13 -4
- package/dist/types.js.map +1 -1
- package/dist/ui/agent.d.ts +1 -1
- package/dist/ui/agent.d.ts.map +1 -1
- package/dist/ui/agent.js +35 -44
- package/dist/ui/agent.js.map +1 -1
- package/dist/ui/chat-input.d.ts +3 -1
- package/dist/ui/chat-input.d.ts.map +1 -1
- package/dist/ui/chat-input.js +82 -17
- package/dist/ui/chat-input.js.map +1 -1
- package/dist/ui/commands.d.ts +2 -0
- package/dist/ui/commands.d.ts.map +1 -1
- package/dist/ui/commands.js +318 -10
- package/dist/ui/commands.js.map +1 -1
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +236 -46
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/input-utils.d.ts +20 -0
- package/dist/ui/input-utils.d.ts.map +1 -0
- package/dist/ui/input-utils.js +35 -0
- package/dist/ui/input-utils.js.map +1 -0
- package/dist/ui/messages.d.ts +6 -2
- package/dist/ui/messages.d.ts.map +1 -1
- package/dist/ui/messages.js +42 -11
- package/dist/ui/messages.js.map +1 -1
- package/dist/ui/modals.d.ts +21 -1
- package/dist/ui/modals.d.ts.map +1 -1
- package/dist/ui/modals.js +67 -5
- package/dist/ui/modals.js.map +1 -1
- package/dist/ui/status-bar.d.ts +4 -1
- package/dist/ui/status-bar.d.ts.map +1 -1
- package/dist/ui/status-bar.js +12 -1
- package/dist/ui/status-bar.js.map +1 -1
- package/dist/ui/types.d.ts +3 -0
- package/dist/ui/types.d.ts.map +1 -1
- package/package.json +4 -7
- package/dist/completion.d.ts +0 -75
- package/dist/completion.d.ts.map +0 -1
- package/dist/completion.js +0 -234
- package/dist/completion.js.map +0 -1
- package/dist/keyboard.d.ts +0 -57
- package/dist/keyboard.d.ts.map +0 -1
- package/dist/keyboard.js +0 -265
- package/dist/keyboard.js.map +0 -1
|
@@ -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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"}
|