@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
package/dist/hooks.js
CHANGED
|
@@ -18,19 +18,61 @@ function debugLog(message, ...args) {
|
|
|
18
18
|
// ============================================================================
|
|
19
19
|
const HOOKS_DIR = path.join(os.homedir(), '.calliope-cli', 'hooks');
|
|
20
20
|
const HOOKS_FILE = path.join(HOOKS_DIR, 'hooks.json');
|
|
21
|
+
/**
|
|
22
|
+
* Events on which a hook may veto an operation (exit code 42). For these
|
|
23
|
+
* events the hook MUST be awaited so its blocking result is honored, even
|
|
24
|
+
* if the hook is flagged `async`. Otherwise an `async: true` flag could
|
|
25
|
+
* silently neutralize a guardrail.
|
|
26
|
+
*/
|
|
27
|
+
const BLOCKING_EVENTS = new Set([
|
|
28
|
+
'pre-tool',
|
|
29
|
+
'pre-shell',
|
|
30
|
+
'pre-write',
|
|
31
|
+
'pre-read',
|
|
32
|
+
'session-start',
|
|
33
|
+
]);
|
|
21
34
|
function ensureHooksDir() {
|
|
22
35
|
if (!fs.existsSync(HOOKS_DIR)) {
|
|
23
|
-
fs.mkdirSync(HOOKS_DIR, { recursive: true });
|
|
36
|
+
fs.mkdirSync(HOOKS_DIR, { recursive: true, mode: 0o700 });
|
|
24
37
|
}
|
|
25
38
|
}
|
|
26
39
|
/**
|
|
27
|
-
*
|
|
40
|
+
* hooks.json is a trust boundary: its `command` strings run as arbitrary
|
|
41
|
+
* shell on routine events. Refuse to load it if it is writable by group or
|
|
42
|
+
* other, since any process that can write it gains persistent code-exec.
|
|
43
|
+
* Returns true if safe to load.
|
|
44
|
+
*/
|
|
45
|
+
function hooksFileIsSafe() {
|
|
46
|
+
try {
|
|
47
|
+
const mode = fs.statSync(HOOKS_FILE).mode;
|
|
48
|
+
// Reject if group-writable (0o020) or world-writable (0o002).
|
|
49
|
+
if (mode & 0o022) {
|
|
50
|
+
debugLog(`Refusing to load hooks.json: file is group/world-writable (mode ${(mode & 0o777).toString(8)}). ` +
|
|
51
|
+
`Run: chmod 600 ${HOOKS_FILE}`);
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Load hooks configuration.
|
|
62
|
+
*
|
|
63
|
+
* SECURITY: hooks.json is a trusted file — its `command` strings are executed
|
|
64
|
+
* as shell. It must not be writable by group/other, and the directory must
|
|
65
|
+
* never be agent-writable. Hooks are refused (not executed) if the file has
|
|
66
|
+
* loose permissions.
|
|
28
67
|
*/
|
|
29
68
|
export function loadHooks() {
|
|
30
69
|
ensureHooksDir();
|
|
31
70
|
if (!fs.existsSync(HOOKS_FILE)) {
|
|
32
71
|
return [];
|
|
33
72
|
}
|
|
73
|
+
if (!hooksFileIsSafe()) {
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
34
76
|
try {
|
|
35
77
|
return JSON.parse(fs.readFileSync(HOOKS_FILE, 'utf-8'));
|
|
36
78
|
}
|
|
@@ -39,11 +81,19 @@ export function loadHooks() {
|
|
|
39
81
|
}
|
|
40
82
|
}
|
|
41
83
|
/**
|
|
42
|
-
* Save hooks configuration
|
|
84
|
+
* Save hooks configuration. Written with restrictive (0600) permissions so the
|
|
85
|
+
* trusted command list is not exposed to or writable by other users.
|
|
43
86
|
*/
|
|
44
87
|
export function saveHooks(hooks) {
|
|
45
88
|
ensureHooksDir();
|
|
46
|
-
fs.writeFileSync(HOOKS_FILE, JSON.stringify(hooks, null, 2));
|
|
89
|
+
fs.writeFileSync(HOOKS_FILE, JSON.stringify(hooks, null, 2), { mode: 0o600 });
|
|
90
|
+
// writeFileSync `mode` only applies on create; enforce perms on existing files too.
|
|
91
|
+
try {
|
|
92
|
+
fs.chmodSync(HOOKS_FILE, 0o600);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
/* best effort */
|
|
96
|
+
}
|
|
47
97
|
}
|
|
48
98
|
// ============================================================================
|
|
49
99
|
// Hook Management
|
|
@@ -114,28 +164,58 @@ async function runHookCommand(hook, context) {
|
|
|
114
164
|
if (context.toolArgs) {
|
|
115
165
|
env.CALLIOPE_TOOL_ARGS = JSON.stringify(context.toolArgs);
|
|
116
166
|
}
|
|
167
|
+
// `detached` puts the shell and its children in their own process group so
|
|
168
|
+
// the timeout can kill the whole group (a shell child cannot escape it).
|
|
117
169
|
const proc = spawn('sh', ['-c', hook.command], {
|
|
118
170
|
env,
|
|
119
171
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
120
|
-
|
|
172
|
+
detached: true,
|
|
121
173
|
});
|
|
122
174
|
let stdout = '';
|
|
123
175
|
let stderr = '';
|
|
176
|
+
let timedOut = false;
|
|
177
|
+
let killTimer;
|
|
124
178
|
proc.stdout?.on('data', (data) => {
|
|
125
179
|
stdout += data.toString();
|
|
126
180
|
});
|
|
127
181
|
proc.stderr?.on('data', (data) => {
|
|
128
182
|
stderr += data.toString();
|
|
129
183
|
});
|
|
184
|
+
// Signal the whole process group (negative pid) so the shell's children die
|
|
185
|
+
// too. Fall back to signalling the process directly if the group is gone.
|
|
186
|
+
const signalGroup = (signal) => {
|
|
187
|
+
try {
|
|
188
|
+
if (proc.pid !== undefined) {
|
|
189
|
+
process.kill(-proc.pid, signal);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
try {
|
|
194
|
+
proc.kill(signal);
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
/* already dead */
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
// Hard timeout: SIGTERM, then SIGKILL after a short grace period so a
|
|
202
|
+
// command that traps/ignores SIGTERM cannot outlive its timeout.
|
|
130
203
|
const timer = setTimeout(() => {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
error: 'Hook timed out',
|
|
135
|
-
});
|
|
204
|
+
timedOut = true;
|
|
205
|
+
signalGroup('SIGTERM');
|
|
206
|
+
killTimer = setTimeout(() => signalGroup('SIGKILL'), 2000);
|
|
136
207
|
}, timeout);
|
|
137
208
|
proc.on('close', (code) => {
|
|
138
209
|
clearTimeout(timer);
|
|
210
|
+
if (killTimer)
|
|
211
|
+
clearTimeout(killTimer);
|
|
212
|
+
if (timedOut) {
|
|
213
|
+
resolve({
|
|
214
|
+
success: false,
|
|
215
|
+
error: 'Hook timed out',
|
|
216
|
+
});
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
139
219
|
// Exit code 42 means "block the operation"
|
|
140
220
|
const blocked = code === 42;
|
|
141
221
|
resolve({
|
|
@@ -147,6 +227,8 @@ async function runHookCommand(hook, context) {
|
|
|
147
227
|
});
|
|
148
228
|
proc.on('error', (err) => {
|
|
149
229
|
clearTimeout(timer);
|
|
230
|
+
if (killTimer)
|
|
231
|
+
clearTimeout(killTimer);
|
|
150
232
|
resolve({
|
|
151
233
|
success: false,
|
|
152
234
|
error: err.message,
|
|
@@ -187,7 +269,11 @@ export async function executeHooks(event, context) {
|
|
|
187
269
|
if (!matches)
|
|
188
270
|
continue;
|
|
189
271
|
}
|
|
190
|
-
|
|
272
|
+
// For blocking events, the exit-42 veto contract must be enforced, so the
|
|
273
|
+
// hook is always awaited regardless of its `async` flag. Allowing
|
|
274
|
+
// fire-and-forget here would let `async: true` silently neutralize a
|
|
275
|
+
// guardrail (the discarded result could never set `blocked`).
|
|
276
|
+
if (hook.async && !BLOCKING_EVENTS.has(event)) {
|
|
191
277
|
// Fire and forget with debug logging
|
|
192
278
|
runHookCommand(hook, fullContext).catch((err) => {
|
|
193
279
|
debugLog(`Async hook '${hook.id}' failed:`, err instanceof Error ? err.message : err);
|
package/dist/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,uBAAuB;AACvB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,GAAG,CAAC;AACjD,SAAS,QAAQ,CAAC,OAAe,EAAE,GAAG,IAAe;IACnD,IAAI,KAAK;QAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;AAC9D,CAAC;AAmDD,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;AACpE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AAEtD,SAAS,cAAc;IACrB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idle-eviction.d.ts","sourceRoot":"","sources":["../src/idle-eviction.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,OAAO,GAAG,WAAW,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"idle-eviction.d.ts","sourceRoot":"","sources":["../src/idle-eviction.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,OAAO,GAAG,WAAW,KAAK,IAAI,CAAC;AAiBvE,kCAAkC;AAClC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAOrE;AAED,4CAA4C;AAC5C,wBAAgB,UAAU,CAAC,EAAE,EAAE,gBAAgB,GAAG,IAAI,CAErD;AAED,2BAA2B;AAC3B,wBAAgB,cAAc,IAAI,IAAI,CAIrC;AAED,8BAA8B;AAC9B,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,yBAAyB;AACzB,wBAAgB,gBAAgB,IAAI;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAEpG;AAED,6BAA6B;AAC7B,wBAAgB,YAAY,IAAI,IAAI,CAQnC;AAED,4BAA4B;AAC5B,wBAAgB,WAAW,IAAI,IAAI,CAKlC;AAgBD,yBAAyB;AACzB,wBAAgB,iBAAiB,IAAI,cAAc,CAElD"}
|
package/dist/idle-eviction.js
CHANGED
|
@@ -15,6 +15,8 @@ let lastActivityMs = Date.now();
|
|
|
15
15
|
let checkInterval = null;
|
|
16
16
|
let callbacks = [];
|
|
17
17
|
let evictionCount = 0;
|
|
18
|
+
/** Latch so auto-save/evict fires once per idle period, not every check tick. */
|
|
19
|
+
let hasEvicted = false;
|
|
18
20
|
/** Configure eviction behavior */
|
|
19
21
|
export function configureEviction(opts) {
|
|
20
22
|
config = { ...config, ...opts };
|
|
@@ -32,6 +34,8 @@ export function onEviction(cb) {
|
|
|
32
34
|
/** Record user activity */
|
|
33
35
|
export function recordActivity() {
|
|
34
36
|
lastActivityMs = Date.now();
|
|
37
|
+
// Reset the latch so the next idle period can evict again.
|
|
38
|
+
hasEvicted = false;
|
|
35
39
|
}
|
|
36
40
|
/** Get idle duration in ms */
|
|
37
41
|
export function getIdleDuration() {
|
|
@@ -61,7 +65,9 @@ export function stopMonitor() {
|
|
|
61
65
|
}
|
|
62
66
|
function checkIdle() {
|
|
63
67
|
const idle = Date.now() - lastActivityMs;
|
|
64
|
-
|
|
68
|
+
// Latch: fire callbacks once per idle period (when crossing the threshold),
|
|
69
|
+
// not on every check tick while still idle. recordActivity() clears the latch.
|
|
70
|
+
if (idle >= config.idleThresholdMs && !hasEvicted) {
|
|
65
71
|
evictionCount++;
|
|
66
72
|
if (config.autoSaveOnEvict) {
|
|
67
73
|
for (const cb of callbacks)
|
|
@@ -69,6 +75,7 @@ function checkIdle() {
|
|
|
69
75
|
}
|
|
70
76
|
for (const cb of callbacks)
|
|
71
77
|
cb('evict');
|
|
78
|
+
hasEvicted = true;
|
|
72
79
|
}
|
|
73
80
|
}
|
|
74
81
|
/** Get current config */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idle-eviction.js","sourceRoot":"","sources":["../src/idle-eviction.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,cAAc,GAAmB;IACrC,OAAO,EAAE,IAAI;IACb,eAAe,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAK,aAAa;IACjD,eAAe,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAM,YAAY;IAChD,eAAe,EAAE,IAAI;CACtB,CAAC;AAEF,IAAI,MAAM,GAAmB,EAAE,GAAG,cAAc,EAAE,CAAC;AACnD,IAAI,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAChC,IAAI,aAAa,GAA0C,IAAI,CAAC;AAChE,IAAI,SAAS,GAAuB,EAAE,CAAC;AACvC,IAAI,aAAa,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"idle-eviction.js","sourceRoot":"","sources":["../src/idle-eviction.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,cAAc,GAAmB;IACrC,OAAO,EAAE,IAAI;IACb,eAAe,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAK,aAAa;IACjD,eAAe,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAM,YAAY;IAChD,eAAe,EAAE,IAAI;CACtB,CAAC;AAEF,IAAI,MAAM,GAAmB,EAAE,GAAG,cAAc,EAAE,CAAC;AACnD,IAAI,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAChC,IAAI,aAAa,GAA0C,IAAI,CAAC;AAChE,IAAI,SAAS,GAAuB,EAAE,CAAC;AACvC,IAAI,aAAa,GAAG,CAAC,CAAC;AACtB,iFAAiF;AACjF,IAAI,UAAU,GAAG,KAAK,CAAC;AAEvB,kCAAkC;AAClC,MAAM,UAAU,iBAAiB,CAAC,IAA6B;IAC7D,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;IAChC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,YAAY,EAAE,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,WAAW,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,UAAU,CAAC,EAAoB;IAC7C,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACrB,CAAC;AAED,2BAA2B;AAC3B,MAAM,UAAU,cAAc;IAC5B,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC5B,2DAA2D;IAC3D,UAAU,GAAG,KAAK,CAAC;AACrB,CAAC;AAED,8BAA8B;AAC9B,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;AACrC,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,gBAAgB;IAC9B,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;AACrF,CAAC;AAED,6BAA6B;AAC7B,MAAM,UAAU,YAAY;IAC1B,WAAW,EAAE,CAAC;IACd,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO;IAC5B,aAAa,GAAG,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;IAC/D,6BAA6B;IAC7B,IAAI,aAAa,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,OAAO,IAAI,aAAa,EAAE,CAAC;QACnF,aAAa,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,WAAW;IACzB,IAAI,aAAa,EAAE,CAAC;QAClB,aAAa,CAAC,aAAa,CAAC,CAAC;QAC7B,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;AACH,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;IACzC,4EAA4E;IAC5E,+EAA+E;IAC/E,IAAI,IAAI,IAAI,MAAM,CAAC,eAAe,IAAI,CAAC,UAAU,EAAE,CAAC;QAClD,aAAa,EAAE,CAAC;QAChB,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3B,KAAK,MAAM,EAAE,IAAI,SAAS;gBAAE,EAAE,CAAC,WAAW,CAAC,CAAC;QAC9C,CAAC;QACD,KAAK,MAAM,EAAE,IAAI,SAAS;YAAE,EAAE,CAAC,OAAO,CAAC,CAAC;QACxC,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;AACH,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,iBAAiB;IAC/B,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC;AACvB,CAAC"}
|
package/dist/markdown.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgIH;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA2GnD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBlD"}
|
package/dist/markdown.js
CHANGED
|
@@ -80,25 +80,47 @@ function highlightCode(code, language) {
|
|
|
80
80
|
// No highlighting for unknown languages - just dim it slightly
|
|
81
81
|
return `${COLORS.white}${code}${COLORS.reset}`;
|
|
82
82
|
}
|
|
83
|
-
//
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
83
|
+
// Collect every match (start/end/color/priority) against the RAW code, never
|
|
84
|
+
// against intermediate colored output, so regexes can never run over an
|
|
85
|
+
// already-emitted ANSI escape sequence.
|
|
86
|
+
const ranges = [];
|
|
87
|
+
patterns.forEach(({ pattern, color }, priority) => {
|
|
87
88
|
pattern.lastIndex = 0;
|
|
88
89
|
let match;
|
|
89
90
|
while ((match = pattern.exec(code)) !== null) {
|
|
90
91
|
const start = match.index;
|
|
91
92
|
const end = start + match[0].length;
|
|
92
|
-
|
|
93
|
+
if (end > start)
|
|
94
|
+
ranges.push({ start, end, color, priority });
|
|
95
|
+
// Guard against zero-width matches causing an infinite loop.
|
|
96
|
+
if (match[0].length === 0)
|
|
97
|
+
pattern.lastIndex++;
|
|
93
98
|
}
|
|
99
|
+
});
|
|
100
|
+
// Merge into non-overlapping spans: earlier pattern (lower priority index)
|
|
101
|
+
// wins on conflict; ties broken by earlier start, then longer span.
|
|
102
|
+
ranges.sort((a, b) => a.priority - b.priority ||
|
|
103
|
+
a.start - b.start ||
|
|
104
|
+
b.end - a.end);
|
|
105
|
+
const spans = [];
|
|
106
|
+
for (const r of ranges) {
|
|
107
|
+
if (spans.some(s => r.start < s.end && r.end > s.start))
|
|
108
|
+
continue;
|
|
109
|
+
spans.push({ start: r.start, end: r.end, color: r.color });
|
|
94
110
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
111
|
+
spans.sort((a, b) => a.start - b.start);
|
|
112
|
+
// Single left-to-right pass; color + reset only at span boundaries.
|
|
113
|
+
let result = '';
|
|
114
|
+
let cursor = 0;
|
|
115
|
+
for (const { start, end, color } of spans) {
|
|
116
|
+
if (start > cursor)
|
|
117
|
+
result += code.slice(cursor, start);
|
|
99
118
|
const colorCode = COLORS[color] || COLORS.white;
|
|
100
|
-
result
|
|
119
|
+
result += colorCode + code.slice(start, end) + COLORS.reset;
|
|
120
|
+
cursor = end;
|
|
101
121
|
}
|
|
122
|
+
if (cursor < code.length)
|
|
123
|
+
result += code.slice(cursor);
|
|
102
124
|
return result;
|
|
103
125
|
}
|
|
104
126
|
/**
|
package/dist/markdown.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp.d.ts
CHANGED
|
@@ -73,6 +73,15 @@ export declare function loadServers(): MCPServer[];
|
|
|
73
73
|
* Save MCP servers
|
|
74
74
|
*/
|
|
75
75
|
export declare function saveServers(servers: MCPServer[]): void;
|
|
76
|
+
/**
|
|
77
|
+
* Validate an MCP target URL against SSRF rules. Rejects non-http(s) schemes
|
|
78
|
+
* and (unless opted in) loopback / link-local / private / metadata hosts.
|
|
79
|
+
* Resolves DNS and re-checks every resolved address to defeat DNS rebinding.
|
|
80
|
+
*
|
|
81
|
+
* @returns the validated URL host info (no-op if allowed)
|
|
82
|
+
* @throws if the scheme is unsupported or the host is blocked
|
|
83
|
+
*/
|
|
84
|
+
export declare function assertUrlAllowed(rawUrl: string): Promise<void>;
|
|
76
85
|
/**
|
|
77
86
|
* Fetch MCP manifest from a URL
|
|
78
87
|
*/
|
|
@@ -102,9 +111,25 @@ export declare function listServers(): MCPServer[];
|
|
|
102
111
|
*/
|
|
103
112
|
export declare function refreshServer(idOrUrl: string): Promise<MCPServer | null>;
|
|
104
113
|
/**
|
|
105
|
-
*
|
|
114
|
+
* Options controlling how a stdio MCP server is spawned.
|
|
115
|
+
*/
|
|
116
|
+
export interface SpawnStdioOptions {
|
|
117
|
+
/**
|
|
118
|
+
* Explicit user consent to execute the (arbitrary) command. Spawning is
|
|
119
|
+
* refused unless this is true or MCP_ALLOW_STDIO_SPAWN is set. Callers MUST
|
|
120
|
+
* surface the exact command + args to the user before passing true.
|
|
121
|
+
*/
|
|
122
|
+
allowSpawn?: boolean;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Spawn a child process for a STDIO MCP server.
|
|
126
|
+
*
|
|
127
|
+
* Spawning is gated: a stdio command is arbitrary local code execution, so the
|
|
128
|
+
* caller must pass { allowSpawn: true } (after showing the command to the user)
|
|
129
|
+
* or set MCP_ALLOW_STDIO_SPAWN. By default the child does NOT inherit the full
|
|
130
|
+
* parent environment (see MCP_STDIO_INHERIT_ENV).
|
|
106
131
|
*/
|
|
107
|
-
export declare function spawnStdioProcess(server: MCPServer): StdioProcess;
|
|
132
|
+
export declare function spawnStdioProcess(server: MCPServer, options?: SpawnStdioOptions): StdioProcess;
|
|
108
133
|
/**
|
|
109
134
|
* Send a JSON-RPC call over STDIO to a running MCP server process
|
|
110
135
|
*/
|
|
@@ -112,14 +137,19 @@ export declare function stdioCall(serverId: string, method: string, params: Reco
|
|
|
112
137
|
/**
|
|
113
138
|
* Register and start a STDIO MCP server
|
|
114
139
|
*/
|
|
115
|
-
export declare function registerStdioServer(command: string, args?: string[], env?: Record<string, string>, autoConnect?: boolean): Promise<MCPServer>;
|
|
140
|
+
export declare function registerStdioServer(command: string, args?: string[], env?: Record<string, string>, autoConnect?: boolean, options?: SpawnStdioOptions): Promise<MCPServer>;
|
|
116
141
|
/**
|
|
117
142
|
* Stop a running STDIO MCP server process
|
|
118
143
|
*/
|
|
119
144
|
export declare function stopStdioServer(serverId: string): boolean;
|
|
120
145
|
/**
|
|
121
|
-
* Auto-connect all STDIO servers that have autoConnect=true
|
|
146
|
+
* Auto-connect all STDIO servers that have autoConnect=true.
|
|
147
|
+
*
|
|
148
|
+
* Persisted stdio servers are arbitrary local commands, so they are NOT spawned
|
|
149
|
+
* on startup unless the caller explicitly consents via { allowSpawn: true } (or
|
|
150
|
+
* MCP_ALLOW_STDIO_SPAWN is set) after reviewing the registered commands. Without
|
|
151
|
+
* consent this is a no-op and the latent auto-spawn path stays disabled.
|
|
122
152
|
*/
|
|
123
|
-
export declare function connectStdioServers(): Promise<void>;
|
|
153
|
+
export declare function connectStdioServers(options?: SpawnStdioOptions): Promise<void>;
|
|
124
154
|
export {};
|
|
125
155
|
//# sourceMappingURL=mcp.d.ts.map
|
package/dist/mcp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|