hoomanjs 1.43.1 → 1.45.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/dist/acp/acp-agent.d.ts +2 -1
- package/dist/acp/acp-agent.js +116 -7
- package/dist/acp/acp-agent.js.map +1 -1
- package/dist/chat/app.js +74 -14
- package/dist/chat/app.js.map +1 -1
- package/dist/chat/components/RetryEvent.d.ts +4 -0
- package/dist/chat/components/RetryEvent.js +11 -0
- package/dist/chat/components/RetryEvent.js.map +1 -0
- package/dist/chat/components/Transcript.js +2 -1
- package/dist/chat/components/Transcript.js.map +1 -1
- package/dist/chat/types.d.ts +5 -1
- package/dist/cli.js +5 -6
- package/dist/cli.js.map +1 -1
- package/dist/configure/app.js +469 -105
- package/dist/configure/app.js.map +1 -1
- package/dist/configure/components/MenuScreen.d.ts +3 -2
- package/dist/configure/components/MenuScreen.js +6 -2
- package/dist/configure/components/MenuScreen.js.map +1 -1
- package/dist/configure/index.js +4 -3
- package/dist/configure/index.js.map +1 -1
- package/dist/configure/types.d.ts +15 -0
- package/dist/core/agent/default-retry-strategy.d.ts +7 -0
- package/dist/core/agent/default-retry-strategy.js +197 -0
- package/dist/core/agent/default-retry-strategy.js.map +1 -0
- package/dist/core/agent/index.js +2 -0
- package/dist/core/agent/index.js.map +1 -1
- package/dist/core/agent/retry-progress.d.ts +14 -0
- package/dist/core/agent/retry-progress.js +18 -0
- package/dist/core/agent/retry-progress.js.map +1 -0
- package/dist/core/approvals/intervention.js +10 -4
- package/dist/core/approvals/intervention.js.map +1 -1
- package/dist/core/mcp/config.d.ts +26 -3
- package/dist/core/mcp/config.js +126 -34
- package/dist/core/mcp/config.js.map +1 -1
- package/dist/core/prompts/modes/agent.md +6 -0
- package/dist/core/prompts/modes/plan.md +17 -0
- package/dist/core/prompts/session-mode-appendix.js +2 -1
- package/dist/core/prompts/session-mode-appendix.js.map +1 -1
- package/dist/core/prompts/static/todo.md +2 -0
- package/dist/core/runtime-config.js +4 -0
- package/dist/core/runtime-config.js.map +1 -1
- package/dist/core/sessions/flat-file-storage.d.ts +5 -0
- package/dist/core/sessions/flat-file-storage.js +42 -0
- package/dist/core/sessions/flat-file-storage.js.map +1 -1
- package/dist/core/state/tool-approvals.d.ts +5 -4
- package/dist/core/state/tool-approvals.js +18 -7
- package/dist/core/state/tool-approvals.js.map +1 -1
- package/dist/core/tools/plan.js +10 -2
- package/dist/core/tools/plan.js.map +1 -1
- package/dist/exec/approvals.js +7 -3
- package/dist/exec/approvals.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { DefaultModelRetryStrategy, ExponentialBackoff, ModelThrottledError, } from "@strands-agents/sdk";
|
|
2
|
+
import { emitModelRetryProgress } from "./retry-progress.js";
|
|
3
|
+
import { APIConnectionError as OpenAIConnectionError, APIConnectionTimeoutError as OpenAIConnectionTimeoutError, InternalServerError as OpenAIInternalServerError, RateLimitError as OpenAIRateLimitError, } from "openai";
|
|
4
|
+
import { APIConnectionError as AnthropicConnectionError, APIConnectionTimeoutError as AnthropicConnectionTimeoutError, InternalServerError as AnthropicInternalServerError, RateLimitError as AnthropicRateLimitError, RetryableError as AnthropicRetryableError, } from "@anthropic-ai/sdk";
|
|
5
|
+
import { InternalServerException as BedrockInternalServerException, ModelNotReadyException as BedrockModelNotReadyException, ModelStreamErrorException as BedrockModelStreamErrorException, ModelTimeoutException as BedrockModelTimeoutException, ServiceUnavailableException as BedrockServiceUnavailableException, ThrottlingException as BedrockThrottlingException, } from "@aws-sdk/client-bedrock-runtime";
|
|
6
|
+
const DEFAULT_MAX_ATTEMPTS = 10;
|
|
7
|
+
const DEFAULT_BACKOFF = new ExponentialBackoff({
|
|
8
|
+
baseMs: 30_000,
|
|
9
|
+
maxMs: 300_000,
|
|
10
|
+
jitter: "none",
|
|
11
|
+
});
|
|
12
|
+
const RETRYABLE_HTTP_STATUSES = new Set([408, 409, 425, 429]);
|
|
13
|
+
const RETRYABLE_ERROR_CODES = new Set([
|
|
14
|
+
"ECONNRESET",
|
|
15
|
+
"ECONNREFUSED",
|
|
16
|
+
"ECONNABORTED",
|
|
17
|
+
"EHOSTUNREACH",
|
|
18
|
+
"ENETUNREACH",
|
|
19
|
+
"EPIPE",
|
|
20
|
+
"ETIMEDOUT",
|
|
21
|
+
"UND_ERR_CONNECT_TIMEOUT",
|
|
22
|
+
"UND_ERR_HEADERS_TIMEOUT",
|
|
23
|
+
"UND_ERR_BODY_TIMEOUT",
|
|
24
|
+
"UND_ERR_SOCKET",
|
|
25
|
+
]);
|
|
26
|
+
const RETRYABLE_MESSAGE_FRAGMENTS = [
|
|
27
|
+
"connection error",
|
|
28
|
+
"connection reset",
|
|
29
|
+
"connection refused",
|
|
30
|
+
"fetch failed",
|
|
31
|
+
"gateway timeout",
|
|
32
|
+
"network",
|
|
33
|
+
"overloaded",
|
|
34
|
+
"rate limit",
|
|
35
|
+
"service unavailable",
|
|
36
|
+
"socket hang up",
|
|
37
|
+
"temporarily unavailable",
|
|
38
|
+
"timed out",
|
|
39
|
+
"timeout",
|
|
40
|
+
"too many requests",
|
|
41
|
+
"bad gateway",
|
|
42
|
+
];
|
|
43
|
+
function errorMessage(error) {
|
|
44
|
+
if (error instanceof Error && error.message) {
|
|
45
|
+
return error.message;
|
|
46
|
+
}
|
|
47
|
+
return String(error);
|
|
48
|
+
}
|
|
49
|
+
function errorDetail(error) {
|
|
50
|
+
if (!(error instanceof Error)) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
if (error.stack && error.stack.trim().length > 0) {
|
|
54
|
+
return error.stack;
|
|
55
|
+
}
|
|
56
|
+
return error.message || undefined;
|
|
57
|
+
}
|
|
58
|
+
function numericField(value) {
|
|
59
|
+
return typeof value === "number" && Number.isFinite(value)
|
|
60
|
+
? value
|
|
61
|
+
: undefined;
|
|
62
|
+
}
|
|
63
|
+
function stringField(value) {
|
|
64
|
+
return typeof value === "string" && value.trim().length > 0
|
|
65
|
+
? value
|
|
66
|
+
: undefined;
|
|
67
|
+
}
|
|
68
|
+
function hasAbortName(error) {
|
|
69
|
+
return error instanceof Error && error.name === "AbortError";
|
|
70
|
+
}
|
|
71
|
+
function isKnownProviderRetryableError(error) {
|
|
72
|
+
return (error instanceof ModelThrottledError ||
|
|
73
|
+
error instanceof OpenAIRateLimitError ||
|
|
74
|
+
error instanceof OpenAIInternalServerError ||
|
|
75
|
+
error instanceof OpenAIConnectionError ||
|
|
76
|
+
error instanceof OpenAIConnectionTimeoutError ||
|
|
77
|
+
error instanceof AnthropicRateLimitError ||
|
|
78
|
+
error instanceof AnthropicInternalServerError ||
|
|
79
|
+
error instanceof AnthropicConnectionError ||
|
|
80
|
+
error instanceof AnthropicConnectionTimeoutError ||
|
|
81
|
+
error instanceof AnthropicRetryableError ||
|
|
82
|
+
error instanceof BedrockThrottlingException ||
|
|
83
|
+
error instanceof BedrockInternalServerException ||
|
|
84
|
+
error instanceof BedrockServiceUnavailableException ||
|
|
85
|
+
error instanceof BedrockModelTimeoutException ||
|
|
86
|
+
error instanceof BedrockModelStreamErrorException ||
|
|
87
|
+
error instanceof BedrockModelNotReadyException);
|
|
88
|
+
}
|
|
89
|
+
function isRetryableHttpStatus(status) {
|
|
90
|
+
if (status === undefined) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
if (RETRYABLE_HTTP_STATUSES.has(status)) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
return status >= 500 && status < 600;
|
|
97
|
+
}
|
|
98
|
+
function isRetryableSystemCode(code) {
|
|
99
|
+
return code !== undefined && RETRYABLE_ERROR_CODES.has(code.toUpperCase());
|
|
100
|
+
}
|
|
101
|
+
function isRetryableMessage(error) {
|
|
102
|
+
const haystack = `${error.name} ${error.message} ${String(error.cause ?? "")}`
|
|
103
|
+
.toLowerCase()
|
|
104
|
+
.trim();
|
|
105
|
+
return RETRYABLE_MESSAGE_FRAGMENTS.some((fragment) => haystack.includes(fragment));
|
|
106
|
+
}
|
|
107
|
+
function isTransientModelError(error) {
|
|
108
|
+
if (!(error instanceof Error)) {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
if (hasAbortName(error)) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
if (isKnownProviderRetryableError(error)) {
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
const data = error;
|
|
118
|
+
const status = numericField(data.status) ?? numericField(data.statusCode);
|
|
119
|
+
if (status !== undefined) {
|
|
120
|
+
if (isRetryableHttpStatus(status)) {
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
if (status >= 400 && status < 500) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const code = stringField(data.code);
|
|
128
|
+
if (isRetryableSystemCode(code)) {
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
return isRetryableMessage(data);
|
|
132
|
+
}
|
|
133
|
+
export class HoomanDefaultModelRetryStrategy extends DefaultModelRetryStrategy {
|
|
134
|
+
name = "hooman:default-model-retry-strategy";
|
|
135
|
+
constructor() {
|
|
136
|
+
super({
|
|
137
|
+
maxAttempts: DEFAULT_MAX_ATTEMPTS,
|
|
138
|
+
backoff: DEFAULT_BACKOFF,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
isRetryable(error) {
|
|
142
|
+
return super.isRetryable(error) || isTransientModelError(error);
|
|
143
|
+
}
|
|
144
|
+
async retryModel(event) {
|
|
145
|
+
if (event.attemptCount === 1) {
|
|
146
|
+
this.onFirstModelAttempt();
|
|
147
|
+
}
|
|
148
|
+
if (event.retry || event.error === undefined) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const decision = await this.computeRetryDecision(event);
|
|
152
|
+
if (!decision.retry) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
await sleepWithProgress(event, decision);
|
|
156
|
+
event.retry = true;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
async function sleepWithProgress(event, decision) {
|
|
160
|
+
const waitMs = Math.max(0, Math.round(decision.waitMs));
|
|
161
|
+
const maxAttempts = DEFAULT_MAX_ATTEMPTS;
|
|
162
|
+
const nextAttempt = event.attemptCount + 1;
|
|
163
|
+
const error = errorMessage(event.error);
|
|
164
|
+
const detail = errorDetail(event.error);
|
|
165
|
+
const sessionValue = event.agent.appState.get("sessionId");
|
|
166
|
+
const sessionId = typeof sessionValue === "string" ? sessionValue : undefined;
|
|
167
|
+
let remainingMs = waitMs;
|
|
168
|
+
while (remainingMs > 0) {
|
|
169
|
+
const retryInSeconds = Math.max(1, Math.ceil(remainingMs / 1000));
|
|
170
|
+
emitModelRetryProgress({
|
|
171
|
+
status: "countdown",
|
|
172
|
+
sessionId,
|
|
173
|
+
attempt: event.attemptCount,
|
|
174
|
+
nextAttempt,
|
|
175
|
+
maxAttempts,
|
|
176
|
+
waitMs,
|
|
177
|
+
retryInSeconds,
|
|
178
|
+
error,
|
|
179
|
+
errorDetail: detail,
|
|
180
|
+
});
|
|
181
|
+
const slice = Math.min(remainingMs, 1000);
|
|
182
|
+
await new Promise((resolve) => globalThis.setTimeout(resolve, slice));
|
|
183
|
+
remainingMs -= slice;
|
|
184
|
+
}
|
|
185
|
+
emitModelRetryProgress({
|
|
186
|
+
status: "retrying",
|
|
187
|
+
sessionId,
|
|
188
|
+
attempt: event.attemptCount,
|
|
189
|
+
nextAttempt,
|
|
190
|
+
maxAttempts,
|
|
191
|
+
waitMs,
|
|
192
|
+
retryInSeconds: 0,
|
|
193
|
+
error,
|
|
194
|
+
errorDetail: detail,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=default-retry-strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-retry-strategy.js","sourceRoot":"","sources":["../../../src/core/agent/default-retry-strategy.ts"],"names":[],"mappings":"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"}
|
package/dist/core/agent/index.js
CHANGED
|
@@ -3,6 +3,7 @@ import { ContextOffloader } from "@strands-agents/sdk/vended-plugins/context-off
|
|
|
3
3
|
import { FileMemoryStore } from "../memory/index.js";
|
|
4
4
|
import { ToolBasedModelExtractor } from "../memory/model-extractor.js";
|
|
5
5
|
import { modelProviders } from "../models/index.js";
|
|
6
|
+
import { HoomanDefaultModelRetryStrategy } from "./default-retry-strategy.js";
|
|
6
7
|
import { FlatFileStorage } from "../sessions/flat-file-storage.js";
|
|
7
8
|
import { LazySessionManager } from "../sessions/lazy-session-manager.js";
|
|
8
9
|
import { TolerantFileStorage } from "../sessions/tolerant-file-storage.js";
|
|
@@ -117,6 +118,7 @@ export async function create(config, system, mcp, print = false, meta) {
|
|
|
117
118
|
],
|
|
118
119
|
interventions: meta.interventions ?? [],
|
|
119
120
|
tools,
|
|
121
|
+
retryStrategy: new HoomanDefaultModelRetryStrategy(),
|
|
120
122
|
printer: print,
|
|
121
123
|
...(conversationManager ? { conversationManager } : {}),
|
|
122
124
|
...(sessionManager ? { sessionManager } : {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,qBAAqB,EACrB,SAAS,EACT,eAAe,EACf,cAAc,EACd,8BAA8B,GAI/B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sDAAsD,CAAC;AAGxF,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,cAAc,EAAsB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/agent/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type ModelRetryProgress = {
|
|
2
|
+
status: "countdown" | "retrying";
|
|
3
|
+
sessionId?: string;
|
|
4
|
+
attempt: number;
|
|
5
|
+
nextAttempt: number;
|
|
6
|
+
maxAttempts: number;
|
|
7
|
+
waitMs: number;
|
|
8
|
+
retryInSeconds: number;
|
|
9
|
+
error: string;
|
|
10
|
+
errorDetail?: string;
|
|
11
|
+
};
|
|
12
|
+
export type ModelRetryProgressListener = (progress: ModelRetryProgress) => void;
|
|
13
|
+
export declare function subscribeModelRetryProgress(listener: ModelRetryProgressListener): () => void;
|
|
14
|
+
export declare function emitModelRetryProgress(progress: ModelRetryProgress): void;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const listeners = new Set();
|
|
2
|
+
export function subscribeModelRetryProgress(listener) {
|
|
3
|
+
listeners.add(listener);
|
|
4
|
+
return () => {
|
|
5
|
+
listeners.delete(listener);
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
export function emitModelRetryProgress(progress) {
|
|
9
|
+
for (const listener of [...listeners]) {
|
|
10
|
+
try {
|
|
11
|
+
listener(progress);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// A broken frontend listener must not fail the retry itself.
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=retry-progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-progress.js","sourceRoot":"","sources":["../../../src/core/agent/retry-progress.ts"],"names":[],"mappings":"AAcA,MAAM,SAAS,GAAG,IAAI,GAAG,EAA8B,CAAC;AAExD,MAAM,UAAU,2BAA2B,CACzC,QAAoC;IAEpC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,OAAO,GAAG,EAAE;QACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAA4B;IACjE,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC;YACH,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,6DAA6D;QAC/D,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { InterventionHandler, InterventionActions, } from "@strands-agents/sdk";
|
|
2
2
|
import fs from "node:fs/promises";
|
|
3
3
|
import { getPlanState } from "../state/plan.js";
|
|
4
|
+
import { getModeState } from "../state/session-mode.js";
|
|
4
5
|
import { EXIT_PLAN_MODE_TOOL, INTERNAL_ALWAYS_ALLOWED, isImplicitlyAllowed, planModeWriteEditRejectionMessage, } from "../state/tool-approvals.js";
|
|
5
6
|
import { isYoloEnabled } from "../state/yolo.js";
|
|
6
7
|
import { getAllowlist } from "./allowlist.js";
|
|
@@ -59,14 +60,15 @@ export class HoomanToolApprovalIntervention extends InterventionHandler {
|
|
|
59
60
|
await this.onRejected?.(request, event, planReject);
|
|
60
61
|
return InterventionActions.deny(planReject);
|
|
61
62
|
}
|
|
62
|
-
|
|
63
|
+
const isPlanExit = toolName === EXIT_PLAN_MODE_TOOL;
|
|
64
|
+
if ((!isPlanExit && isYoloEnabled(event.agent)) ||
|
|
63
65
|
INTERNAL_ALWAYS_ALLOWED.has(toolName) ||
|
|
64
|
-
isImplicitlyAllowed(toolName, event.toolUse.input) ||
|
|
65
|
-
getAllowlist().isAllowed(toolName, event.toolUse.input)) {
|
|
66
|
+
isImplicitlyAllowed(toolName, event.toolUse.input, getModeState(event.agent).mode) ||
|
|
67
|
+
(!isPlanExit && getAllowlist().isAllowed(toolName, event.toolUse.input))) {
|
|
66
68
|
await this.onApproved?.(request, event, "auto");
|
|
67
69
|
return InterventionActions.proceed();
|
|
68
70
|
}
|
|
69
|
-
if (
|
|
71
|
+
if (isPlanExit) {
|
|
70
72
|
const preview = await readPlanPreview(event.agent);
|
|
71
73
|
if (preview) {
|
|
72
74
|
request = { ...request, preview };
|
|
@@ -79,6 +81,10 @@ export class HoomanToolApprovalIntervention extends InterventionHandler {
|
|
|
79
81
|
return InterventionActions.proceed();
|
|
80
82
|
}
|
|
81
83
|
if (result === "always") {
|
|
84
|
+
if (isPlanExit) {
|
|
85
|
+
await this.onApproved?.(request, event, "allow");
|
|
86
|
+
return InterventionActions.proceed();
|
|
87
|
+
}
|
|
82
88
|
getAllowlist().allowAlways(toolName, event.toolUse.input);
|
|
83
89
|
await this.onApproved?.(request, event, "always");
|
|
84
90
|
return InterventionActions.proceed();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intervention.js","sourceRoot":"","sources":["../../../src/core/approvals/intervention.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GAEpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,iCAAiC,GAClC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAClC,MAAM,sBAAsB,GAAG,CAAC,GAAG,IAAI,CAAC;AA+CxC,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC;QACtD,OAAO,IAAI,CAAC,MAAM,GAAG,mBAAmB;YACtC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,mBAAmB;YAC1D,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,KAAmC;IAEnC,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5E,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB,EAAE,MAA0B;IAClE,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;QAC3E,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,SAAS,QAAQ,6BAA6B,CAAC;AACxD,CAAC;AAED,MAAM,OAAO,8BAA+B,SAAQ,mBAAmB;IACrD,IAAI,GAAG,sBAAsB,CAAC;IAE7B,GAAG,CAAkB;IACrB,aAAa,CAA0C;IACvD,UAAU,CAAuC;IACjD,UAAU,CAAuC;IAElE,YAAmB,MAA4C;QAC7D,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACtB,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;QAC1C,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACpC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACtC,CAAC;IAEe,KAAK,CAAC,cAAc,CAClC,KAA0B;QAK1B,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QACpC,IAAI,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAEvC,MAAM,UAAU,GAAG,iCAAiC,CAClD,KAAK,CAAC,KAAK,EACX,QAAQ,EACR,KAAK,CAAC,OAAO,CAAC,KAAK,CACpB,CAAC;QACF,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;YACpD,OAAO,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9C,CAAC;QAED,IACE,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"intervention.js","sourceRoot":"","sources":["../../../src/core/approvals/intervention.ts"],"names":[],"mappings":"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"}
|
|
@@ -50,31 +50,54 @@ declare const McpServersFileSchema: z.ZodObject<{
|
|
|
50
50
|
export type McpServersFile = z.infer<typeof McpServersFileSchema>;
|
|
51
51
|
export type ConfigOptions = {
|
|
52
52
|
overlayPaths?: readonly string[];
|
|
53
|
+
projectPath?: string;
|
|
53
54
|
};
|
|
54
55
|
/** One named MCP transport from the config file. */
|
|
55
56
|
export type NamedMcpTransport = {
|
|
56
57
|
name: string;
|
|
57
58
|
transport: McpTransport;
|
|
58
59
|
};
|
|
60
|
+
export type McpConfigScope = "global" | "project";
|
|
61
|
+
export type NamedMcpTransportWithSource = NamedMcpTransport & {
|
|
62
|
+
sourcePath: string;
|
|
63
|
+
scope: McpConfigScope;
|
|
64
|
+
};
|
|
65
|
+
export type McpWriteTarget = {
|
|
66
|
+
path: string;
|
|
67
|
+
scope: McpConfigScope;
|
|
68
|
+
};
|
|
59
69
|
/**
|
|
60
70
|
* Read/write `{"mcpServers": { "<name>": <transport> }}` on disk.
|
|
61
71
|
*/
|
|
62
72
|
export declare class Config {
|
|
63
73
|
private readonly path;
|
|
64
74
|
private readonly overlayPaths;
|
|
65
|
-
private
|
|
75
|
+
private readonly projectPath?;
|
|
76
|
+
private entries;
|
|
66
77
|
constructor(path: string, options?: ConfigOptions);
|
|
67
78
|
private readJson;
|
|
68
79
|
private parse;
|
|
69
|
-
private
|
|
80
|
+
private sourcePaths;
|
|
81
|
+
private scopeForPath;
|
|
82
|
+
private mergedEntries;
|
|
70
83
|
/** Reload servers from disk (overwrites unsaved in-memory changes). */
|
|
71
84
|
reload(): void;
|
|
72
85
|
/** All configured servers, stable sort by name. */
|
|
73
86
|
list(): NamedMcpTransport[];
|
|
87
|
+
/** All configured servers, stable sort by name, including source metadata. */
|
|
88
|
+
listWithSources(): NamedMcpTransportWithSource[];
|
|
74
89
|
get(name: string): McpTransport | undefined;
|
|
75
|
-
|
|
90
|
+
getEntry(name: string): NamedMcpTransportWithSource | undefined;
|
|
91
|
+
primaryPath(): string;
|
|
92
|
+
writableTargets(): McpWriteTarget[];
|
|
93
|
+
private persistFile;
|
|
94
|
+
private requireVisibleEntry;
|
|
76
95
|
add(name: string, transport: McpTransport): void;
|
|
77
96
|
update(name: string, transport: McpTransport): void;
|
|
78
97
|
remove(name: string): void;
|
|
98
|
+
addToPath(targetPath: string, name: string, transport: McpTransport): void;
|
|
99
|
+
updateInPath(targetPath: string, name: string, transport: McpTransport): void;
|
|
100
|
+
renameInPath(targetPath: string, currentName: string, nextName: string, transport: McpTransport): void;
|
|
101
|
+
removeFromPath(targetPath: string, name: string): void;
|
|
79
102
|
}
|
|
80
103
|
export {};
|
package/dist/core/mcp/config.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
-
import { dirname } from "node:path";
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
import { McpTransportSchema } from "./types.js";
|
|
5
5
|
const McpServersFileSchema = z.object({
|
|
@@ -11,11 +11,15 @@ const McpServersFileSchema = z.object({
|
|
|
11
11
|
export class Config {
|
|
12
12
|
path;
|
|
13
13
|
overlayPaths;
|
|
14
|
-
|
|
14
|
+
projectPath;
|
|
15
|
+
entries;
|
|
15
16
|
constructor(path, options) {
|
|
16
|
-
this.path = path;
|
|
17
|
-
this.overlayPaths = [...(options?.overlayPaths ?? [])];
|
|
18
|
-
this.
|
|
17
|
+
this.path = resolve(path);
|
|
18
|
+
this.overlayPaths = [...(options?.overlayPaths ?? [])].map((overlayPath) => resolve(overlayPath));
|
|
19
|
+
this.projectPath = options?.projectPath
|
|
20
|
+
? resolve(options.projectPath)
|
|
21
|
+
: undefined;
|
|
22
|
+
this.entries = {};
|
|
19
23
|
this.reload();
|
|
20
24
|
}
|
|
21
25
|
readJson(path, fallback) {
|
|
@@ -44,58 +48,146 @@ export class Config {
|
|
|
44
48
|
});
|
|
45
49
|
}
|
|
46
50
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
sourcePaths() {
|
|
52
|
+
return [this.path, ...this.overlayPaths];
|
|
53
|
+
}
|
|
54
|
+
scopeForPath(path) {
|
|
55
|
+
return resolve(path) === this.path ? "global" : "project";
|
|
56
|
+
}
|
|
57
|
+
mergedEntries() {
|
|
58
|
+
const entries = {};
|
|
59
|
+
for (const path of this.sourcePaths()) {
|
|
60
|
+
const file = this.parse(path, { mcpServers: {} });
|
|
61
|
+
for (const [name, transport] of Object.entries(file.mcpServers)) {
|
|
62
|
+
entries[name] = {
|
|
63
|
+
name,
|
|
64
|
+
transport,
|
|
65
|
+
sourcePath: path,
|
|
66
|
+
scope: this.scopeForPath(path),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
53
69
|
}
|
|
54
|
-
return
|
|
70
|
+
return entries;
|
|
55
71
|
}
|
|
56
72
|
/** Reload servers from disk (overwrites unsaved in-memory changes). */
|
|
57
73
|
reload() {
|
|
58
74
|
const wasMissing = !existsSync(this.path);
|
|
59
|
-
this.
|
|
75
|
+
this.entries = this.mergedEntries();
|
|
60
76
|
if (wasMissing) {
|
|
61
|
-
this.
|
|
77
|
+
this.persistFile(this.path, { mcpServers: {} });
|
|
62
78
|
}
|
|
63
79
|
}
|
|
64
80
|
/** All configured servers, stable sort by name. */
|
|
65
81
|
list() {
|
|
66
|
-
return
|
|
67
|
-
|
|
68
|
-
|
|
82
|
+
return this.listWithSources().map(({ name, transport }) => ({
|
|
83
|
+
name,
|
|
84
|
+
transport,
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
/** All configured servers, stable sort by name, including source metadata. */
|
|
88
|
+
listWithSources() {
|
|
89
|
+
return Object.values(this.entries).sort((a, b) => a.name.localeCompare(b.name));
|
|
69
90
|
}
|
|
70
91
|
get(name) {
|
|
71
|
-
return this.
|
|
92
|
+
return this.entries[name]?.transport;
|
|
93
|
+
}
|
|
94
|
+
getEntry(name) {
|
|
95
|
+
return this.entries[name];
|
|
72
96
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
97
|
+
primaryPath() {
|
|
98
|
+
return this.path;
|
|
99
|
+
}
|
|
100
|
+
writableTargets() {
|
|
101
|
+
const targets = [{ path: this.path, scope: "global" }];
|
|
102
|
+
if (this.projectPath && this.projectPath !== this.path) {
|
|
103
|
+
targets.push({ path: this.projectPath, scope: "project" });
|
|
104
|
+
}
|
|
105
|
+
return targets;
|
|
106
|
+
}
|
|
107
|
+
persistFile(path, data) {
|
|
108
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
109
|
+
writeFileSync(path, JSON.stringify(data, null, 2), "utf8");
|
|
110
|
+
}
|
|
111
|
+
requireVisibleEntry(name) {
|
|
112
|
+
const entry = this.getEntry(name);
|
|
113
|
+
if (!entry) {
|
|
114
|
+
throw new Error(`MCP server "${name}" does not exist.`);
|
|
115
|
+
}
|
|
116
|
+
return entry;
|
|
77
117
|
}
|
|
78
118
|
add(name, transport) {
|
|
79
|
-
|
|
119
|
+
this.addToPath(this.path, name, transport);
|
|
120
|
+
}
|
|
121
|
+
update(name, transport) {
|
|
122
|
+
this.updateInPath(this.path, name, transport);
|
|
123
|
+
}
|
|
124
|
+
remove(name) {
|
|
125
|
+
this.removeFromPath(this.path, name);
|
|
126
|
+
}
|
|
127
|
+
addToPath(targetPath, name, transport) {
|
|
128
|
+
if (this.get(name)) {
|
|
80
129
|
throw new Error(`MCP server "${name}" already exists.`);
|
|
81
130
|
}
|
|
82
|
-
|
|
83
|
-
this.
|
|
131
|
+
const resolvedTargetPath = resolve(targetPath);
|
|
132
|
+
const file = this.parse(resolvedTargetPath, { mcpServers: {} });
|
|
133
|
+
if (file.mcpServers[name]) {
|
|
134
|
+
throw new Error(`MCP server "${name}" already exists.`);
|
|
135
|
+
}
|
|
136
|
+
file.mcpServers[name] = transport;
|
|
137
|
+
this.persistFile(resolvedTargetPath, file);
|
|
138
|
+
this.reload();
|
|
84
139
|
}
|
|
85
|
-
|
|
86
|
-
|
|
140
|
+
updateInPath(targetPath, name, transport) {
|
|
141
|
+
const resolvedTargetPath = resolve(targetPath);
|
|
142
|
+
const entry = this.requireVisibleEntry(name);
|
|
143
|
+
if (entry.sourcePath !== resolvedTargetPath) {
|
|
144
|
+
throw new Error(`MCP server "${name}" is defined in "${entry.sourcePath}", not "${resolvedTargetPath}".`);
|
|
145
|
+
}
|
|
146
|
+
const file = this.parse(resolvedTargetPath, { mcpServers: {} });
|
|
147
|
+
if (!file.mcpServers[name]) {
|
|
87
148
|
throw new Error(`MCP server "${name}" does not exist.`);
|
|
88
149
|
}
|
|
89
|
-
|
|
90
|
-
this.
|
|
150
|
+
file.mcpServers[name] = transport;
|
|
151
|
+
this.persistFile(resolvedTargetPath, file);
|
|
152
|
+
this.reload();
|
|
91
153
|
}
|
|
92
|
-
|
|
93
|
-
|
|
154
|
+
renameInPath(targetPath, currentName, nextName, transport) {
|
|
155
|
+
const resolvedTargetPath = resolve(targetPath);
|
|
156
|
+
const entry = this.requireVisibleEntry(currentName);
|
|
157
|
+
if (entry.sourcePath !== resolvedTargetPath) {
|
|
158
|
+
throw new Error(`MCP server "${currentName}" is defined in "${entry.sourcePath}", not "${resolvedTargetPath}".`);
|
|
159
|
+
}
|
|
160
|
+
if (currentName === nextName) {
|
|
161
|
+
this.updateInPath(resolvedTargetPath, currentName, transport);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const existing = this.getEntry(nextName);
|
|
165
|
+
if (existing) {
|
|
166
|
+
throw new Error(`MCP server "${nextName}" already exists.`);
|
|
167
|
+
}
|
|
168
|
+
const file = this.parse(resolvedTargetPath, { mcpServers: {} });
|
|
169
|
+
if (!file.mcpServers[currentName]) {
|
|
170
|
+
throw new Error(`MCP server "${currentName}" does not exist.`);
|
|
171
|
+
}
|
|
172
|
+
const { [currentName]: _removed, ...remaining } = file.mcpServers;
|
|
173
|
+
file.mcpServers = { ...remaining, [nextName]: transport };
|
|
174
|
+
this.persistFile(resolvedTargetPath, file);
|
|
175
|
+
this.reload();
|
|
176
|
+
}
|
|
177
|
+
removeFromPath(targetPath, name) {
|
|
178
|
+
const resolvedTargetPath = resolve(targetPath);
|
|
179
|
+
const entry = this.requireVisibleEntry(name);
|
|
180
|
+
if (entry.sourcePath !== resolvedTargetPath) {
|
|
181
|
+
throw new Error(`MCP server "${name}" is defined in "${entry.sourcePath}", not "${resolvedTargetPath}".`);
|
|
182
|
+
}
|
|
183
|
+
const file = this.parse(resolvedTargetPath, { mcpServers: {} });
|
|
184
|
+
if (!file.mcpServers[name]) {
|
|
94
185
|
throw new Error(`MCP server "${name}" does not exist.`);
|
|
95
186
|
}
|
|
96
|
-
const { [name]: _removed, ...remaining } =
|
|
97
|
-
|
|
98
|
-
this.
|
|
187
|
+
const { [name]: _removed, ...remaining } = file.mcpServers;
|
|
188
|
+
file.mcpServers = remaining;
|
|
189
|
+
this.persistFile(resolvedTargetPath, file);
|
|
190
|
+
this.reload();
|
|
99
191
|
}
|
|
100
192
|
}
|
|
101
193
|
//# sourceMappingURL=config.js.map
|