@stigmer/runner 3.1.6 → 3.1.8
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 +1 -1
- package/dist/.build-fingerprint +1 -1
- package/dist/activities/discover-mcp-server.js +24 -0
- package/dist/activities/discover-mcp-server.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.d.ts +5 -2
- package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.js.map +1 -1
- package/dist/activities/execute-cursor/approval-state.d.ts +58 -10
- package/dist/activities/execute-cursor/approval-state.js +37 -8
- package/dist/activities/execute-cursor/approval-state.js.map +1 -1
- package/dist/activities/execute-cursor/env-resolver.js +7 -1
- package/dist/activities/execute-cursor/env-resolver.js.map +1 -1
- package/dist/activities/execute-cursor/hook-script.d.ts +16 -3
- package/dist/activities/execute-cursor/hook-script.js +66 -21
- package/dist/activities/execute-cursor/hook-script.js.map +1 -1
- package/dist/activities/execute-cursor/index.js +59 -0
- package/dist/activities/execute-cursor/index.js.map +1 -1
- package/dist/activities/execute-cursor/message-translator.d.ts +52 -0
- package/dist/activities/execute-cursor/message-translator.js +107 -1
- package/dist/activities/execute-cursor/message-translator.js.map +1 -1
- package/dist/activities/execute-cursor/turn-boundary.d.ts +25 -3
- package/dist/activities/execute-cursor/turn-boundary.js +46 -8
- package/dist/activities/execute-cursor/turn-boundary.js.map +1 -1
- package/dist/activities/execute-cursor/turn-stream.js +6 -2
- package/dist/activities/execute-cursor/turn-stream.js.map +1 -1
- package/dist/activities/execute-cursor/workspace-setup.d.ts +16 -2
- package/dist/activities/execute-cursor/workspace-setup.js +22 -12
- package/dist/activities/execute-cursor/workspace-setup.js.map +1 -1
- package/dist/activities/execute-deep-agent/environment.js +7 -1
- package/dist/activities/execute-deep-agent/environment.js.map +1 -1
- package/dist/activities/execute-deep-agent/hitl.d.ts +23 -14
- package/dist/activities/execute-deep-agent/hitl.js +42 -37
- package/dist/activities/execute-deep-agent/hitl.js.map +1 -1
- package/dist/activities/execute-deep-agent/index.js +35 -26
- package/dist/activities/execute-deep-agent/index.js.map +1 -1
- package/dist/activities/execute-deep-agent/setup.d.ts +7 -0
- package/dist/activities/execute-deep-agent/setup.js +9 -2
- package/dist/activities/execute-deep-agent/setup.js.map +1 -1
- package/dist/activities/hydrate-workflow-execution.js +8 -1
- package/dist/activities/hydrate-workflow-execution.js.map +1 -1
- package/dist/client/stigmer-client.d.ts +69 -1
- package/dist/client/stigmer-client.js +108 -4
- package/dist/client/stigmer-client.js.map +1 -1
- package/dist/client/token-claims.d.ts +22 -0
- package/dist/client/token-claims.js +40 -0
- package/dist/client/token-claims.js.map +1 -0
- package/dist/config.d.ts +11 -1
- package/dist/config.js +5 -1
- package/dist/config.js.map +1 -1
- package/dist/middleware/approval-gate.js +9 -2
- package/dist/middleware/approval-gate.js.map +1 -1
- package/dist/runner-manager.d.ts +4 -2
- package/dist/runner-manager.js +20 -7
- package/dist/runner-manager.js.map +1 -1
- package/dist/runner.d.ts +2 -2
- package/dist/runner.js +1 -1
- package/dist/shared/checkpointer/factory.d.ts +11 -7
- package/dist/shared/checkpointer/factory.js +21 -8
- package/dist/shared/checkpointer/factory.js.map +1 -1
- package/dist/shared/checkpointer/sqlite-saver.d.ts +54 -0
- package/dist/shared/checkpointer/sqlite-saver.js +272 -0
- package/dist/shared/checkpointer/sqlite-saver.js.map +1 -0
- package/dist/shared/checkpointer/types.d.ts +8 -4
- package/dist/shared/mcp-oauth-detect.d.ts +53 -0
- package/dist/shared/mcp-oauth-detect.js +99 -0
- package/dist/shared/mcp-oauth-detect.js.map +1 -0
- package/dist/shared/tool-row.js +14 -1
- package/dist/shared/tool-row.js.map +1 -1
- package/dist/shared/workspace/platform-dir.d.ts +18 -0
- package/dist/shared/workspace/platform-dir.js +23 -0
- package/dist/shared/workspace/platform-dir.js.map +1 -1
- package/package.json +3 -3
- package/src/__test-utils__/mock-client.ts +3 -0
- package/src/activities/__tests__/hydrate-workflow-execution.test.ts +2 -0
- package/src/activities/discover-mcp-server.ts +26 -0
- package/src/activities/execute-cursor/__test-utils__/cursor-hook-harness.ts +5 -3
- package/src/activities/execute-cursor/__tests__/hitl-ledger.test.ts +272 -14
- package/src/activities/execute-cursor/__tests__/hook-script.test.ts +72 -16
- package/src/activities/execute-cursor/__tests__/message-translator.test.ts +65 -0
- package/src/activities/execute-cursor/__tests__/turn-boundary.test.ts +128 -1
- package/src/activities/execute-cursor/__tests__/workspace-setup.test.ts +95 -0
- package/src/activities/execute-cursor/approval-state.ts +75 -11
- package/src/activities/execute-cursor/env-resolver.ts +8 -1
- package/src/activities/execute-cursor/hook-script.ts +66 -21
- package/src/activities/execute-cursor/index.ts +61 -0
- package/src/activities/execute-cursor/message-translator.ts +124 -1
- package/src/activities/execute-cursor/turn-boundary.ts +79 -6
- package/src/activities/execute-cursor/turn-stream.ts +6 -2
- package/src/activities/execute-cursor/workspace-setup.ts +42 -14
- package/src/activities/execute-deep-agent/__tests__/environment.test.ts +5 -0
- package/src/activities/execute-deep-agent/__tests__/hitl-reject.test.ts +314 -0
- package/src/activities/execute-deep-agent/__tests__/hitl.test.ts +64 -46
- package/src/activities/execute-deep-agent/environment.ts +8 -1
- package/src/activities/execute-deep-agent/hitl.ts +43 -45
- package/src/activities/execute-deep-agent/index.ts +36 -27
- package/src/activities/execute-deep-agent/setup.ts +15 -2
- package/src/activities/hydrate-workflow-execution.ts +9 -1
- package/src/client/__tests__/stigmer-client.test.ts +239 -2
- package/src/client/__tests__/token-claims.test.ts +45 -0
- package/src/client/stigmer-client.ts +152 -3
- package/src/client/token-claims.ts +42 -0
- package/src/config.ts +16 -3
- package/src/middleware/__tests__/approval-gate.test.ts +8 -1
- package/src/middleware/approval-gate.ts +9 -2
- package/src/runner-manager.ts +22 -8
- package/src/runner.ts +3 -3
- package/src/shared/__tests__/mcp-oauth-detect.test.ts +147 -0
- package/src/shared/__tests__/tool-row.test.ts +35 -0
- package/src/shared/checkpointer/__tests__/factory.test.ts +27 -1
- package/src/shared/checkpointer/__tests__/sqlite-saver.test.ts +212 -0
- package/src/shared/checkpointer/factory.ts +25 -8
- package/src/shared/checkpointer/sqlite-saver.ts +384 -0
- package/src/shared/checkpointer/types.ts +8 -4
- package/src/shared/mcp-oauth-detect.ts +112 -0
- package/src/shared/tool-row.ts +14 -1
- package/src/shared/workspace/platform-dir.ts +25 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth-challenge classification for HTTP MCP endpoints.
|
|
3
|
+
*
|
|
4
|
+
* When an HTTP MCP endpoint requires OAuth (per the MCP Authorization spec /
|
|
5
|
+
* RFC 9728), an unauthenticated or statically-tokened request is answered with
|
|
6
|
+
* `401` and a `WWW-Authenticate: Bearer ...` header pointing at OAuth protected
|
|
7
|
+
* resource metadata. The MCP client SDK surfaces this only as an opaque
|
|
8
|
+
* aggregate error ("unhandled errors in a TaskGroup"), which tells the user
|
|
9
|
+
* nothing.
|
|
10
|
+
*
|
|
11
|
+
* This module turns that opaque failure into a precise, actionable signal: it
|
|
12
|
+
* re-probes the endpoint once (only on the failure path, so the happy path pays
|
|
13
|
+
* nothing) and, if it sees an OAuth challenge, returns an {@link
|
|
14
|
+
* OAuthRequiredError} whose message tells the user to connect via OAuth instead
|
|
15
|
+
* of a manual token.
|
|
16
|
+
*
|
|
17
|
+
* Kept transport-library-agnostic (uses global `fetch`) so it is reusable by
|
|
18
|
+
* connect-time discovery, execution-time error enrichment, and any other caller
|
|
19
|
+
* that holds an MCP endpoint URL + headers.
|
|
20
|
+
*/
|
|
21
|
+
const OAUTH_PROBE_TIMEOUT_MS = 10_000;
|
|
22
|
+
/**
|
|
23
|
+
* Raised when an HTTP MCP endpoint answers with an OAuth authentication
|
|
24
|
+
* challenge. The message is self-contained and user-facing: it survives the
|
|
25
|
+
* Temporal boundary and is shown by the connect error wrappers verbatim.
|
|
26
|
+
*
|
|
27
|
+
* The literal phrase "requires OAuth" is a stable marker the Go/Java connect
|
|
28
|
+
* wrappers match to avoid appending a generic "check your credentials" suffix.
|
|
29
|
+
*/
|
|
30
|
+
export class OAuthRequiredError extends Error {
|
|
31
|
+
serverSlug;
|
|
32
|
+
resourceMetadataUrl;
|
|
33
|
+
constructor(serverSlug, resourceMetadataUrl) {
|
|
34
|
+
super(`MCP server '${serverSlug}' requires OAuth: its endpoint returned an ` +
|
|
35
|
+
`authentication challenge (HTTP 401). A manually-entered API token will ` +
|
|
36
|
+
`not work here — connect it with the OAuth "Sign in" flow instead.`);
|
|
37
|
+
this.serverSlug = serverSlug;
|
|
38
|
+
this.resourceMetadataUrl = resourceMetadataUrl;
|
|
39
|
+
this.name = "OAuthRequiredError";
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Whether a `WWW-Authenticate` header value is an OAuth challenge.
|
|
44
|
+
*
|
|
45
|
+
* The MCP auth spec emits `Bearer realm="OAuth", resource_metadata="..."`. We
|
|
46
|
+
* require the `Bearer` scheme plus either an OAuth realm or a resource-metadata
|
|
47
|
+
* pointer, so a plain `Bearer` 401 from a static-token API (an invalid key, not
|
|
48
|
+
* an OAuth requirement) is not misclassified.
|
|
49
|
+
*/
|
|
50
|
+
export function isOAuthChallenge(wwwAuthenticate) {
|
|
51
|
+
const value = wwwAuthenticate.toLowerCase();
|
|
52
|
+
if (!value.includes("bearer"))
|
|
53
|
+
return false;
|
|
54
|
+
return value.includes("oauth") || value.includes("resource_metadata");
|
|
55
|
+
}
|
|
56
|
+
/** Extract the `resource_metadata` URL from a `WWW-Authenticate` value, if present. */
|
|
57
|
+
export function parseResourceMetadataUrl(wwwAuthenticate) {
|
|
58
|
+
const match = /resource_metadata="([^"]+)"/i.exec(wwwAuthenticate);
|
|
59
|
+
return match?.[1];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Probe an HTTP MCP endpoint once to decide whether its failure is an OAuth
|
|
63
|
+
* challenge. Returns an {@link OAuthRequiredError} to throw, or `null` when the
|
|
64
|
+
* endpoint is not asking for OAuth (so the caller rethrows the original error).
|
|
65
|
+
*
|
|
66
|
+
* Never throws: any probe/network failure returns `null` so this classification
|
|
67
|
+
* step can never mask or replace the original discovery error.
|
|
68
|
+
*/
|
|
69
|
+
export async function detectOAuthChallenge(url, headers, slug) {
|
|
70
|
+
try {
|
|
71
|
+
const response = await fetch(url, {
|
|
72
|
+
method: "POST",
|
|
73
|
+
headers: {
|
|
74
|
+
"Content-Type": "application/json",
|
|
75
|
+
Accept: "application/json, text/event-stream",
|
|
76
|
+
...(headers ?? {}),
|
|
77
|
+
},
|
|
78
|
+
// A minimal MCP initialize request — enough to trigger the endpoint's
|
|
79
|
+
// auth check without establishing a session.
|
|
80
|
+
body: JSON.stringify({
|
|
81
|
+
jsonrpc: "2.0",
|
|
82
|
+
id: 1,
|
|
83
|
+
method: "initialize",
|
|
84
|
+
params: {},
|
|
85
|
+
}),
|
|
86
|
+
signal: AbortSignal.timeout(OAUTH_PROBE_TIMEOUT_MS),
|
|
87
|
+
});
|
|
88
|
+
if (response.status !== 401)
|
|
89
|
+
return null;
|
|
90
|
+
const wwwAuthenticate = response.headers.get("www-authenticate") ?? "";
|
|
91
|
+
if (!isOAuthChallenge(wwwAuthenticate))
|
|
92
|
+
return null;
|
|
93
|
+
return new OAuthRequiredError(slug, parseResourceMetadataUrl(wwwAuthenticate));
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=mcp-oauth-detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-oauth-detect.js","sourceRoot":"","sources":["../../src/shared/mcp-oauth-detect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAEtC;;;;;;;GAOG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAEzB;IACA;IAFlB,YACkB,UAAkB,EAClB,mBAA4B;QAE5C,KAAK,CACH,eAAe,UAAU,6CAA6C;YACpE,yEAAyE;YACzE,mEAAmE,CACtE,CAAC;QAPc,eAAU,GAAV,UAAU,CAAQ;QAClB,wBAAmB,GAAnB,mBAAmB,CAAS;QAO5C,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,eAAuB;IACtD,MAAM,KAAK,GAAG,eAAe,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;AACxE,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,wBAAwB,CACtC,eAAuB;IAEvB,MAAM,KAAK,GAAG,8BAA8B,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACnE,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,GAAW,EACX,OAA2C,EAC3C,IAAY;IAEZ,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,qCAAqC;gBAC7C,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;aACnB;YACD,sEAAsE;YACtE,6CAA6C;YAC7C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,CAAC;gBACL,MAAM,EAAE,YAAY;gBACpB,MAAM,EAAE,EAAE;aACX,CAAC;YACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,sBAAsB,CAAC;SACpD,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAEzC,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;QACvE,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC;YAAE,OAAO,IAAI,CAAC;QAEpD,OAAO,IAAI,kBAAkB,CAC3B,IAAI,EACJ,wBAAwB,CAAC,eAAe,CAAC,CAC1C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/shared/tool-row.js
CHANGED
|
@@ -173,11 +173,24 @@ export function collectSubAgentToolCallIds(subAgents) {
|
|
|
173
173
|
}
|
|
174
174
|
return ids;
|
|
175
175
|
}
|
|
176
|
-
/**
|
|
176
|
+
/**
|
|
177
|
+
* Terminal tool-call statuses — a row that has finished (however it finished).
|
|
178
|
+
*
|
|
179
|
+
* Includes TOOL_CALL_INTERRUPTED (server-authored when an execution
|
|
180
|
+
* terminalized with the call in flight): for the provenance scoping below, a
|
|
181
|
+
* settled row from a prior (failed, then recovered) invocation is PRIOR-turn
|
|
182
|
+
* history and must not be attributed to the resuming turn. This is the
|
|
183
|
+
* opposite call from the Cursor translator's isTerminalToolStatus, which
|
|
184
|
+
* EXCLUDES interrupted so a recovery-replayed event can advance the row in
|
|
185
|
+
* place (the enum's recovery supersede rule) — that guard asks "may this row
|
|
186
|
+
* still move?", this set asks "had this row finished before the turn?", and an
|
|
187
|
+
* interrupted row answers yes to both.
|
|
188
|
+
*/
|
|
177
189
|
const TERMINAL_TOOL_CALL_STATUSES = new Set([
|
|
178
190
|
ToolCallStatus.TOOL_CALL_COMPLETED,
|
|
179
191
|
ToolCallStatus.TOOL_CALL_FAILED,
|
|
180
192
|
ToolCallStatus.TOOL_CALL_SKIPPED,
|
|
193
|
+
ToolCallStatus.TOOL_CALL_INTERRUPTED,
|
|
181
194
|
]);
|
|
182
195
|
/**
|
|
183
196
|
* Collect the ids of tool-call rows that have already SETTLED (reached a terminal
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-row.js","sourceRoot":"","sources":["../../src/shared/tool-row.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tool-row.js","sourceRoot":"","sources":["../../src/shared/tool-row.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,6 +45,24 @@ export declare function ensureHitlGateDir(workspaceRoot: string): Promise<string
|
|
|
45
45
|
* Pure function — does not create the directory or perform I/O.
|
|
46
46
|
*/
|
|
47
47
|
export declare function getPlatformDir(sessionId: string): string;
|
|
48
|
+
/**
|
|
49
|
+
* Compute the durable-checkpoint database path for a session — the SQLite file
|
|
50
|
+
* backing the local LangGraph checkpointer (see shared/checkpointer/sqlite-saver.ts).
|
|
51
|
+
*
|
|
52
|
+
* Session-scoped by design: a session has exactly one LangGraph thread
|
|
53
|
+
* (`thread-{sessionId}`), so one DB per session keeps checkpoint lifetime bound
|
|
54
|
+
* to session lifetime (retention becomes "remove the session dir") and mirrors
|
|
55
|
+
* the sibling `platform/` and `hitl/` trees. Pure function — performs no I/O.
|
|
56
|
+
*/
|
|
57
|
+
export declare function getCheckpointDbPath(sessionId: string): string;
|
|
58
|
+
/**
|
|
59
|
+
* Ensure the session directory exists and return the checkpoint DB path.
|
|
60
|
+
*
|
|
61
|
+
* Creates the session directory tree if needed (the SQLite driver requires the
|
|
62
|
+
* parent directory to exist before opening the file). Idempotent — safe across
|
|
63
|
+
* executions, HITL reinvocations, and activity retries.
|
|
64
|
+
*/
|
|
65
|
+
export declare function ensureCheckpointDbPath(sessionId: string): Promise<string>;
|
|
48
66
|
/**
|
|
49
67
|
* Ensure the platform directory exists and return its path.
|
|
50
68
|
*
|
|
@@ -66,6 +66,29 @@ export async function ensureHitlGateDir(workspaceRoot) {
|
|
|
66
66
|
export function getPlatformDir(sessionId) {
|
|
67
67
|
return join(getSessionDir(sessionId), "platform");
|
|
68
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Compute the durable-checkpoint database path for a session — the SQLite file
|
|
71
|
+
* backing the local LangGraph checkpointer (see shared/checkpointer/sqlite-saver.ts).
|
|
72
|
+
*
|
|
73
|
+
* Session-scoped by design: a session has exactly one LangGraph thread
|
|
74
|
+
* (`thread-{sessionId}`), so one DB per session keeps checkpoint lifetime bound
|
|
75
|
+
* to session lifetime (retention becomes "remove the session dir") and mirrors
|
|
76
|
+
* the sibling `platform/` and `hitl/` trees. Pure function — performs no I/O.
|
|
77
|
+
*/
|
|
78
|
+
export function getCheckpointDbPath(sessionId) {
|
|
79
|
+
return join(getSessionDir(sessionId), "checkpoints.db");
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Ensure the session directory exists and return the checkpoint DB path.
|
|
83
|
+
*
|
|
84
|
+
* Creates the session directory tree if needed (the SQLite driver requires the
|
|
85
|
+
* parent directory to exist before opening the file). Idempotent — safe across
|
|
86
|
+
* executions, HITL reinvocations, and activity retries.
|
|
87
|
+
*/
|
|
88
|
+
export async function ensureCheckpointDbPath(sessionId) {
|
|
89
|
+
await mkdir(getSessionDir(sessionId), { recursive: true });
|
|
90
|
+
return getCheckpointDbPath(sessionId);
|
|
91
|
+
}
|
|
69
92
|
/**
|
|
70
93
|
* Ensure the platform directory exists and return its path.
|
|
71
94
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-dir.js","sourceRoot":"","sources":["../../../src/shared/workspace/platform-dir.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,qFAAqF;AACrF,SAAS,cAAc;IACrB,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,EAAE,CAAC;AAClE,CAAC;AAED,+EAA+E;AAC/E,SAAS,aAAa,CAAC,SAAiB;IACtC,OAAO,IAAI,CAAC,cAAc,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,cAAc,CAAC,aAAqB;IAClD,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClF,OAAO,IAAI,CAAC,cAAc,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,aAAqB;IAC3D,MAAM,GAAG,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAC1C,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,CAAC;AACpD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,SAAiB;IACvD,MAAM,GAAG,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,SAAiB;IAC1C,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAAiB;IACnD,MAAM,GAAG,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
1
|
+
{"version":3,"file":"platform-dir.js","sourceRoot":"","sources":["../../../src/shared/workspace/platform-dir.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,qFAAqF;AACrF,SAAS,cAAc;IACrB,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,EAAE,CAAC;AAClE,CAAC;AAED,+EAA+E;AAC/E,SAAS,aAAa,CAAC,SAAiB;IACtC,OAAO,IAAI,CAAC,cAAc,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,cAAc,CAAC,aAAqB;IAClD,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClF,OAAO,IAAI,CAAC,cAAc,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,aAAqB;IAC3D,MAAM,GAAG,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAC1C,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,CAAC;AACpD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACnD,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,SAAiB;IAC5D,MAAM,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,OAAO,mBAAmB,CAAC,SAAS,CAAC,CAAC;AACxC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,SAAiB;IACvD,MAAM,GAAG,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,SAAiB;IAC1C,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAAiB;IACnD,MAAM,GAAG,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stigmer/runner",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.8",
|
|
4
4
|
"description": "Embeddable Temporal worker for the Stigmer AI agent platform — handles agent execution, workflow orchestration, and MCP server management",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"engines": {
|
|
8
|
-
"node": ">=
|
|
8
|
+
"node": ">=22.13"
|
|
9
9
|
},
|
|
10
10
|
"bin": {
|
|
11
11
|
"stigmer-runner": "./dist/main.js"
|
|
@@ -85,7 +85,7 @@
|
|
|
85
85
|
"@opentelemetry/sdk-metrics": "^2.0.0",
|
|
86
86
|
"@opentelemetry/sdk-trace-base": "^2.0.0",
|
|
87
87
|
"@opentelemetry/sdk-trace-node": "^2.0.0",
|
|
88
|
-
"@stigmer/protos": "3.1.
|
|
88
|
+
"@stigmer/protos": "3.1.8",
|
|
89
89
|
"@temporalio/activity": "^1.11.0",
|
|
90
90
|
"@temporalio/client": "^1.11.0",
|
|
91
91
|
"@temporalio/common": "^1.11.0",
|
|
@@ -21,6 +21,9 @@ export function mockStigmerClient(overrides: MockMethods = {}): StigmerClient {
|
|
|
21
21
|
}),
|
|
22
22
|
getExecution: vi.fn().mockResolvedValue({}),
|
|
23
23
|
getExecutionContextByExecutionId: vi.fn().mockResolvedValue({}),
|
|
24
|
+
// No scoped token by default — the OSS/local shape (no runner credential).
|
|
25
|
+
acquireScopedRunnerToken: vi.fn().mockResolvedValue(undefined),
|
|
26
|
+
getRunnerScopedToken: vi.fn().mockResolvedValue(undefined),
|
|
24
27
|
getSession: vi.fn().mockResolvedValue({}),
|
|
25
28
|
updateSession: vi.fn().mockResolvedValue({}),
|
|
26
29
|
getAgent: vi.fn().mockResolvedValue({}),
|
|
@@ -57,6 +57,8 @@ function makeMockClient(opts: {
|
|
|
57
57
|
: vi.fn().mockResolvedValue(opts.workflowInstance ?? {
|
|
58
58
|
spec: { workflowId: "wfl_resolved-from-instance" },
|
|
59
59
|
}),
|
|
60
|
+
// No scoped token — the OSS/local shape (no runner credential to exchange).
|
|
61
|
+
acquireScopedRunnerToken: vi.fn().mockResolvedValue(undefined),
|
|
60
62
|
getExecutionContextByExecutionId: opts.executionContextError
|
|
61
63
|
? vi.fn().mockRejectedValue(opts.executionContextError)
|
|
62
64
|
: vi.fn().mockResolvedValue(opts.executionContext ?? {
|
|
@@ -24,6 +24,7 @@ import { activityStarted, activityFinished } from "../idle-watchdog.js";
|
|
|
24
24
|
import { StigmerClient } from "../client/stigmer-client.js";
|
|
25
25
|
import { mcpServerToResolved } from "../shared/mcp-resolver.js";
|
|
26
26
|
import { toMcpClientConfig } from "../shared/mcp-manager.js";
|
|
27
|
+
import { detectOAuthChallenge } from "../shared/mcp-oauth-detect.js";
|
|
27
28
|
import type { McpServer } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/api_pb";
|
|
28
29
|
import type { Config } from "../config.js";
|
|
29
30
|
|
|
@@ -374,6 +375,14 @@ async function connectAndDiscover(
|
|
|
374
375
|
);
|
|
375
376
|
}
|
|
376
377
|
});
|
|
378
|
+
} catch (err) {
|
|
379
|
+
// The MCP client surfaces a 401 OAuth challenge as an opaque aggregate
|
|
380
|
+
// ("unhandled errors in a TaskGroup"). For HTTP servers, re-probe once to
|
|
381
|
+
// see if the endpoint is actually asking for OAuth and, if so, replace the
|
|
382
|
+
// useless error with an actionable one. Non-OAuth failures rethrow as-is.
|
|
383
|
+
const oauthError = await classifyHttpOAuthFailure(slug, connectionConfig);
|
|
384
|
+
if (oauthError) throw oauthError;
|
|
385
|
+
throw err;
|
|
377
386
|
} finally {
|
|
378
387
|
await client.close().catch((err: unknown) => {
|
|
379
388
|
console.warn(
|
|
@@ -386,6 +395,22 @@ async function connectAndDiscover(
|
|
|
386
395
|
return { tools, resourceTemplates };
|
|
387
396
|
}
|
|
388
397
|
|
|
398
|
+
/**
|
|
399
|
+
* If the server uses HTTP transport, probe its endpoint to classify a discovery
|
|
400
|
+
* failure as an OAuth challenge. Returns the actionable error to throw, or
|
|
401
|
+
* `null` for stdio servers and non-OAuth failures (caller rethrows original).
|
|
402
|
+
*/
|
|
403
|
+
async function classifyHttpOAuthFailure(
|
|
404
|
+
slug: string,
|
|
405
|
+
connectionConfig: ReturnType<typeof toMcpClientConfig>,
|
|
406
|
+
): Promise<Error | null> {
|
|
407
|
+
const connection = connectionConfig[slug];
|
|
408
|
+
if (!connection || connection.transport !== "http" || !connection.url) {
|
|
409
|
+
return null;
|
|
410
|
+
}
|
|
411
|
+
return detectOAuthChallenge(connection.url, connection.headers, slug);
|
|
412
|
+
}
|
|
413
|
+
|
|
389
414
|
async function withTimeout<T>(
|
|
390
415
|
ms: number,
|
|
391
416
|
serverSlug: string,
|
|
@@ -422,6 +447,7 @@ export function createDiscoverMcpServerActivities(config: Config) {
|
|
|
422
447
|
endpoint: config.stigmerBackendEndpoint,
|
|
423
448
|
token: config.stigmerToken,
|
|
424
449
|
tokenRef: config.stigmerTokenRef,
|
|
450
|
+
runnerTokenRef: config.stigmerRunnerTokenRef,
|
|
425
451
|
});
|
|
426
452
|
|
|
427
453
|
return {
|
|
@@ -45,10 +45,12 @@ export interface CursorHookHarness {
|
|
|
45
45
|
/** Run the hook against a single hook-input payload and report its decision. */
|
|
46
46
|
decide(input: object): { permission: string; raw: string };
|
|
47
47
|
/**
|
|
48
|
-
* The denial ledger entries the hook has appended this turn. `
|
|
49
|
-
*
|
|
48
|
+
* The denial ledger entries the hook has appended this turn. `kind` is the
|
|
49
|
+
* attribution taxonomy (approval/secret/capture-error/fail-closed); `input`
|
|
50
|
+
* is the base64(JSON(tool_input)) the hook captures on APPROVAL-kind entries
|
|
51
|
+
* only (decode + JSON.parse to inspect).
|
|
50
52
|
*/
|
|
51
|
-
ledger(): Array<{ toolName: string; token: string; input?: string }>;
|
|
53
|
+
ledger(): Array<{ toolName: string; token: string; kind?: string; input?: string }>;
|
|
52
54
|
/** Truncate the denial ledger (a fresh turn). */
|
|
53
55
|
resetLedger(): void;
|
|
54
56
|
/**
|