@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.
- 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/council-types.d.ts +2 -0
- package/dist/agents/council-types.d.ts.map +1 -1
- package/dist/agents/council-types.js.map +1 -1
- package/dist/agents/council.d.ts +5 -0
- package/dist/agents/council.d.ts.map +1 -1
- package/dist/agents/council.js +150 -14
- package/dist/agents/council.js.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/orchestrator.d.ts +7 -0
- package/dist/agents/orchestrator.d.ts.map +1 -1
- package/dist/agents/orchestrator.js +48 -7
- package/dist/agents/orchestrator.js.map +1 -1
- package/dist/agents/sdk-backend.js +1 -1
- package/dist/agents/sdk-backend.js.map +1 -1
- package/dist/agents/swarm-types.d.ts +1 -0
- package/dist/agents/swarm-types.d.ts.map +1 -1
- package/dist/agents/swarm.d.ts +5 -0
- package/dist/agents/swarm.d.ts.map +1 -1
- package/dist/agents/swarm.js +85 -17
- package/dist/agents/swarm.js.map +1 -1
- package/dist/agents/types.d.ts +1 -0
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/agents/types.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 +75 -4
- 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 +14 -0
- package/dist/auto-compressor.d.ts.map +1 -1
- package/dist/auto-compressor.js +67 -10
- package/dist/auto-compressor.js.map +1 -1
- package/dist/background-jobs.d.ts.map +1 -1
- package/dist/background-jobs.js +8 -3
- package/dist/background-jobs.js.map +1 -1
- package/dist/bin.d.ts +8 -0
- package/dist/bin.d.ts.map +1 -1
- package/dist/bin.js +63 -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 +130 -62
- package/dist/cli/agent.js.map +1 -1
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +218 -11
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +55 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/types.d.ts +3 -0
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/types.js +2 -1
- package/dist/cli/types.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +15 -3
- 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/env-expansion.d.ts +15 -0
- package/dist/env-expansion.d.ts.map +1 -0
- package/dist/env-expansion.js +43 -0
- package/dist/env-expansion.js.map +1 -0
- 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 +59 -4
- 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/iteration-ledger.d.ts +111 -2
- package/dist/iteration-ledger.d.ts.map +1 -1
- package/dist/iteration-ledger.js +327 -19
- package/dist/iteration-ledger.js.map +1 -1
- package/dist/iteration-limit.d.ts +5 -0
- package/dist/iteration-limit.d.ts.map +1 -0
- package/dist/iteration-limit.js +17 -0
- package/dist/iteration-limit.js.map +1 -0
- 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 +191 -12
- package/dist/mcp.js.map +1 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +4 -9
- package/dist/memory.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/prevent-sleep.d.ts +10 -0
- package/dist/prevent-sleep.d.ts.map +1 -0
- package/dist/prevent-sleep.js +85 -0
- package/dist/prevent-sleep.js.map +1 -0
- 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/compat.d.ts.map +1 -1
- package/dist/providers/compat.js +21 -6
- package/dist/providers/compat.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/openai-compat-shims.d.ts +31 -0
- package/dist/providers/openai-compat-shims.d.ts.map +1 -0
- package/dist/providers/openai-compat-shims.js +179 -0
- package/dist/providers/openai-compat-shims.js.map +1 -0
- package/dist/providers/openai.d.ts.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 +18 -3
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +182 -14
- package/dist/storage.js.map +1 -1
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +233 -39
- 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 +18 -12
- 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 +175 -121
- 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 +4 -0
- package/dist/ui/commands.d.ts.map +1 -1
- package/dist/ui/commands.js +562 -39
- package/dist/ui/commands.js.map +1 -1
- package/dist/ui/completions.d.ts.map +1 -1
- package/dist/ui/completions.js +2 -0
- package/dist/ui/completions.js.map +1 -1
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +288 -60
- 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
package/dist/scope.js
CHANGED
|
@@ -43,7 +43,7 @@ class ScopeManager {
|
|
|
43
43
|
this.config = {
|
|
44
44
|
allowedDirs: [process.cwd()],
|
|
45
45
|
allowHome: false,
|
|
46
|
-
allowTmp:
|
|
46
|
+
allowTmp: false,
|
|
47
47
|
deniedDirs: [],
|
|
48
48
|
deniedPatterns: [...DEFAULT_DENIED_PATTERNS],
|
|
49
49
|
};
|
|
@@ -58,7 +58,43 @@ class ScopeManager {
|
|
|
58
58
|
this.config.deniedDirs = [];
|
|
59
59
|
this.config.deniedPatterns = [...DEFAULT_DENIED_PATTERNS];
|
|
60
60
|
this.config.allowHome = false;
|
|
61
|
-
this.config.allowTmp =
|
|
61
|
+
this.config.allowTmp = false;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Resolve a path to its canonical (symlink-free) form before scope checks (#139).
|
|
65
|
+
*
|
|
66
|
+
* - If the path exists, returns fs.realpathSync(path). On a realpath error for
|
|
67
|
+
* an existing path we fail closed by returning null.
|
|
68
|
+
* - If the path does not yet exist (e.g. a write target), we canonicalize the
|
|
69
|
+
* nearest existing ancestor directory and re-append the remaining segments,
|
|
70
|
+
* so a write whose parent dir is a symlink out of scope is screened too.
|
|
71
|
+
*/
|
|
72
|
+
canonicalize(absPath) {
|
|
73
|
+
try {
|
|
74
|
+
return fs.realpathSync(absPath);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Path (or an ancestor) does not exist, or realpath failed. Walk up to the
|
|
78
|
+
// nearest existing ancestor, canonicalize it, then re-append the tail.
|
|
79
|
+
}
|
|
80
|
+
let current = absPath;
|
|
81
|
+
const tail = [];
|
|
82
|
+
while (true) {
|
|
83
|
+
const parent = path.dirname(current);
|
|
84
|
+
if (parent === current) {
|
|
85
|
+
// Reached filesystem root without finding an existing ancestor.
|
|
86
|
+
return absPath;
|
|
87
|
+
}
|
|
88
|
+
tail.unshift(path.basename(current));
|
|
89
|
+
current = parent;
|
|
90
|
+
try {
|
|
91
|
+
const realParent = fs.realpathSync(current);
|
|
92
|
+
return path.join(realParent, ...tail);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Keep walking up.
|
|
96
|
+
}
|
|
97
|
+
}
|
|
62
98
|
}
|
|
63
99
|
/**
|
|
64
100
|
* Add a directory to the allowed scope
|
|
@@ -102,32 +138,56 @@ class ScopeManager {
|
|
|
102
138
|
*/
|
|
103
139
|
isInScope(filePath, baseCwd) {
|
|
104
140
|
const cwd = baseCwd || process.cwd();
|
|
105
|
-
const
|
|
141
|
+
const lexicalPath = path.isAbsolute(filePath)
|
|
106
142
|
? path.resolve(filePath)
|
|
107
143
|
: path.resolve(cwd, filePath);
|
|
108
|
-
|
|
109
|
-
//
|
|
144
|
+
// Resolve symlinks before any scope/denylist check so an in-scope symlink
|
|
145
|
+
// cannot point at an out-of-scope target (#139). Fail closed on null.
|
|
146
|
+
const canonical = this.canonicalize(lexicalPath);
|
|
147
|
+
if (canonical === null) {
|
|
148
|
+
return {
|
|
149
|
+
allowed: false,
|
|
150
|
+
reason: `Path could not be resolved (possible symlink/realpath failure)`,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
const absPath = canonical;
|
|
154
|
+
// Check denied patterns against BOTH the lexical name and the canonical
|
|
155
|
+
// (symlink-resolved) target name, so a benignly-named symlink pointing at a
|
|
156
|
+
// secret (e.g. notes.txt -> ~/.ssh/id_rsa) is still blocked (#139).
|
|
157
|
+
const namesToScreen = new Set([
|
|
158
|
+
path.basename(lexicalPath),
|
|
159
|
+
path.basename(absPath),
|
|
160
|
+
]);
|
|
110
161
|
for (const pattern of this.config.deniedPatterns) {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
162
|
+
for (const name of namesToScreen) {
|
|
163
|
+
if (this.matchesPattern(name, pattern)) {
|
|
164
|
+
return {
|
|
165
|
+
allowed: false,
|
|
166
|
+
reason: `File matches denied pattern: ${pattern}`,
|
|
167
|
+
suggestedAction: 'This file type is blocked for security reasons.',
|
|
168
|
+
};
|
|
169
|
+
}
|
|
117
170
|
}
|
|
118
171
|
}
|
|
119
|
-
// Check denied directories
|
|
172
|
+
// Check denied directories. Compare against the canonical form too, since
|
|
173
|
+
// absPath was symlink-resolved above and the stored dir may be lexical (#139).
|
|
120
174
|
for (const denied of this.config.deniedDirs) {
|
|
121
|
-
|
|
175
|
+
const canonicalDenied = this.canonicalize(denied) ?? denied;
|
|
176
|
+
if (absPath.startsWith(denied + path.sep) || absPath === denied ||
|
|
177
|
+
absPath.startsWith(canonicalDenied + path.sep) || absPath === canonicalDenied) {
|
|
122
178
|
return {
|
|
123
179
|
allowed: false,
|
|
124
180
|
reason: `Path is in denied directory: ${denied}`,
|
|
125
181
|
};
|
|
126
182
|
}
|
|
127
183
|
}
|
|
128
|
-
// Check allowed directories
|
|
184
|
+
// Check allowed directories. Compare against the canonical form of each
|
|
185
|
+
// allowed dir as well, so symlinked roots (e.g. macOS /var/folders tmp
|
|
186
|
+
// dirs) still match after the target was symlink-resolved above (#139).
|
|
129
187
|
for (const allowed of this.config.allowedDirs) {
|
|
130
|
-
|
|
188
|
+
const canonicalAllowed = this.canonicalize(allowed) ?? allowed;
|
|
189
|
+
if (absPath.startsWith(allowed + path.sep) || absPath === allowed ||
|
|
190
|
+
absPath.startsWith(canonicalAllowed + path.sep) || absPath === canonicalAllowed) {
|
|
131
191
|
return { allowed: true };
|
|
132
192
|
}
|
|
133
193
|
}
|
package/dist/scope.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAyBzB,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E,MAAM,uBAAuB,GAAG;IAC9B,MAAM;IACN,YAAY;IACZ,kBAAkB;IAClB,iBAAiB;IACjB,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,OAAO;IACP,OAAO;IACP,UAAU;IACV,WAAW;IACX,QAAQ;IACR,YAAY;IACZ,UAAU;IACV,QAAQ;IACR,aAAa;IACb,eAAe;IACf,QAAQ;IACR,SAAS;CACV,CAAC;AAEF,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E,MAAM,YAAY;IACR,MAAM,CAAc;IACpB,OAAO,CAAS;IAChB,MAAM,CAAS;IAEvB;QACE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,MAAM,CAAC;QACrE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG;YACZ,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YAC5B,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
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 { type ScuttlebotConfig } from './http-client.js';
|
|
8
|
+
export interface ScuttlebotIntegration {
|
|
9
|
+
enabled: boolean;
|
|
10
|
+
config?: ScuttlebotConfig;
|
|
11
|
+
nick?: string;
|
|
12
|
+
connected: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare class ScuttlebotClient {
|
|
15
|
+
private httpClient;
|
|
16
|
+
private ircClient;
|
|
17
|
+
private config;
|
|
18
|
+
private nick;
|
|
19
|
+
private enabled;
|
|
20
|
+
private registeredByClient;
|
|
21
|
+
private instructionHandler;
|
|
22
|
+
private presenceTimer;
|
|
23
|
+
private static readonly PRESENCE_INTERVAL_MS;
|
|
24
|
+
/**
|
|
25
|
+
* Initialize from environment variables.
|
|
26
|
+
*
|
|
27
|
+
* Flow: resolve config -> register via HTTP -> connect IRC -> send agent.hello.
|
|
28
|
+
*/
|
|
29
|
+
initialize(sessionId: string, cwd: string): Promise<boolean>;
|
|
30
|
+
/**
|
|
31
|
+
* Post a plain text message to the primary channel.
|
|
32
|
+
*/
|
|
33
|
+
postMessage(text: string): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Post online presence (agent.hello envelope).
|
|
36
|
+
*/
|
|
37
|
+
postOnline(): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Post offline presence (agent.bye envelope).
|
|
40
|
+
*/
|
|
41
|
+
postOffline(): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Mirror a tool call as a plain text status message.
|
|
44
|
+
*/
|
|
45
|
+
mirrorToolCall(toolName: string, args?: unknown): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Mirror assistant message as plain text.
|
|
48
|
+
*/
|
|
49
|
+
mirrorAssistant(message: string): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Register an instruction handler for incoming tasks/commands.
|
|
52
|
+
*/
|
|
53
|
+
startPolling(handler: (instruction: string) => void): void;
|
|
54
|
+
/**
|
|
55
|
+
* Stop listening for instructions.
|
|
56
|
+
*/
|
|
57
|
+
stopPolling(): void;
|
|
58
|
+
/**
|
|
59
|
+
* Disconnect and cleanup.
|
|
60
|
+
*/
|
|
61
|
+
disconnect(): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Get integration status.
|
|
64
|
+
*/
|
|
65
|
+
getStatus(): ScuttlebotIntegration;
|
|
66
|
+
/**
|
|
67
|
+
* Check if enabled.
|
|
68
|
+
*/
|
|
69
|
+
isEnabled(): boolean;
|
|
70
|
+
private sendHello;
|
|
71
|
+
private sendBye;
|
|
72
|
+
/**
|
|
73
|
+
* Touch presence via HTTP API so the registry marks this agent as online.
|
|
74
|
+
* Best-effort — skipped silently if no URL/token configured.
|
|
75
|
+
*/
|
|
76
|
+
private touchPresence;
|
|
77
|
+
/**
|
|
78
|
+
* Sanitize secrets from text before posting.
|
|
79
|
+
*/
|
|
80
|
+
private sanitizeSecrets;
|
|
81
|
+
}
|
|
82
|
+
export declare const scuttlebotClient: ScuttlebotClient;
|
|
83
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/scuttlebot/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAwB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AA8C/E,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;CACpB;AAsCD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,kBAAkB,CAAgD;IAC1E,OAAO,CAAC,aAAa,CAA+C;IAEpE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAU;IAEtD;;;;OAIG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAwHlE;;OAEG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAIlC;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAcrE;;OAEG;IACG,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrD;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAI1D;;OAEG;IACH,WAAW,IAAI,IAAI;IAInB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBjC;;OAEG;IACH,SAAS,IAAI,qBAAqB;IASlC;;OAEG;IACH,SAAS,IAAI,OAAO;IAMpB,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,OAAO;IASf;;;OAGG;YACW,aAAa;IAK3B;;OAEG;IACH,OAAO,CAAC,eAAe;CAoBxB;AAGD,eAAO,MAAM,gBAAgB,kBAAyB,CAAC"}
|
|
@@ -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"}
|