@aexol/spectral 0.9.161 → 0.9.166
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/agent/agents.d.ts +23 -9
- package/dist/agent/agents.d.ts.map +1 -1
- package/dist/agent/agents.js +41 -21
- package/dist/agent/index.d.ts +1 -1
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +12 -6
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +53 -0
- package/dist/relay/dispatcher.d.ts +6 -1
- package/dist/relay/dispatcher.d.ts.map +1 -1
- package/dist/relay/registration.d.ts +16 -0
- package/dist/relay/registration.d.ts.map +1 -1
- package/dist/relay/registration.js +6 -2
- package/dist/sdk/coding-agent/core/tools/apply-patch.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/tools/apply-patch.js +106 -1
- package/dist/server/agent-bridge.d.ts +13 -0
- package/dist/server/agent-bridge.d.ts.map +1 -1
- package/dist/server/agent-bridge.js +9 -2
- package/dist/server/session-stream.d.ts +21 -2
- package/dist/server/session-stream.d.ts.map +1 -1
- package/dist/server/session-stream.js +22 -0
- package/package.json +1 -1
package/dist/agent/agents.d.ts
CHANGED
|
@@ -4,7 +4,6 @@ export interface AgentConfig {
|
|
|
4
4
|
name: string;
|
|
5
5
|
description: string;
|
|
6
6
|
mode: AgentMode;
|
|
7
|
-
tools?: string[];
|
|
8
7
|
model?: string;
|
|
9
8
|
systemPrompt: string;
|
|
10
9
|
source: "user" | "project" | "cloud";
|
|
@@ -15,11 +14,26 @@ export interface AgentDiscoveryResult {
|
|
|
15
14
|
projectAgentsDir: string | null;
|
|
16
15
|
}
|
|
17
16
|
export declare function setCloudAgents(agents: AgentConfig[], teamId?: string): void;
|
|
17
|
+
/**
|
|
18
|
+
* Outcome of a cloud-agent refresh. Lets callers react to auth rejection
|
|
19
|
+
* (e.g. trigger a forced machine re-registration) instead of silently
|
|
20
|
+
* treating an auth failure as "no agents".
|
|
21
|
+
*/
|
|
22
|
+
export type CloudAgentRefreshResult = {
|
|
23
|
+
/** Auth rejected by the backend (HTTP 401/403 or GraphQL auth error). */
|
|
24
|
+
authRejected: true;
|
|
25
|
+
/** Human-readable reason for diagnostics. */
|
|
26
|
+
reason: string;
|
|
27
|
+
} | {
|
|
28
|
+
authRejected: false;
|
|
29
|
+
/** Number of cloud agents loaded into the cache (may be 0 legitimately). */
|
|
30
|
+
count: number;
|
|
31
|
+
};
|
|
18
32
|
export declare function refreshCloudAgents(opts: {
|
|
19
33
|
backendUrl: string;
|
|
20
34
|
machineJwt: string;
|
|
21
35
|
teamId?: string;
|
|
22
|
-
}): Promise<
|
|
36
|
+
}): Promise<CloudAgentRefreshResult>;
|
|
23
37
|
export declare function discoverAgents(cwd: string, scope: AgentScope, agentDir?: string, teamId?: string): AgentDiscoveryResult;
|
|
24
38
|
export declare function discoverPrimaryAgent(cwd: string, scope?: AgentScope, agentDir?: string, teamId?: string): AgentConfig | null;
|
|
25
39
|
/**
|
|
@@ -39,13 +53,13 @@ export declare function resolveSelectedPrimaryAgent(selectedName: string | null
|
|
|
39
53
|
* - Idempotent: if the base already starts with the primary agent header,
|
|
40
54
|
* the base is returned unchanged (guards against double-injection).
|
|
41
55
|
*/
|
|
42
|
-
export declare function injectPrimaryAgentPrompt(base: string | undefined, primaryAgent: Pick<AgentConfig, "name" | "description" | "systemPrompt" | "
|
|
56
|
+
export declare function injectPrimaryAgentPrompt(base: string | undefined, primaryAgent: Pick<AgentConfig, "name" | "description" | "systemPrompt" | "model" | "source"> | null): string | undefined;
|
|
43
57
|
/**
|
|
44
|
-
* Render a small, soft metadata block about an agent (
|
|
45
|
-
* that is appended below the agent
|
|
46
|
-
* informational
|
|
47
|
-
*
|
|
48
|
-
*
|
|
58
|
+
* Render a small, soft metadata block about an agent (model, source)
|
|
59
|
+
* that is appended below the agent.s own system prompt. This is purely
|
|
60
|
+
* informational . it tells the model what the agent declares and where it
|
|
61
|
+
* lives (e.g. the cloud backend), so it does not go hunting for agent
|
|
62
|
+
* files in local folders.
|
|
49
63
|
*/
|
|
50
|
-
export declare function agentMetadataBlock(agent: Pick<AgentConfig, "name" | "description" | "systemPrompt" | "
|
|
64
|
+
export declare function agentMetadataBlock(agent: Pick<AgentConfig, "name" | "description" | "systemPrompt" | "model" | "source"> | null): string;
|
|
51
65
|
//# sourceMappingURL=agents.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/agent/agents.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AACrD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAC/C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/agent/agents.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AACrD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAC/C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;CAClB;AACD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAyDD,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAO3E;AACD;;;;GAIG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,yEAAyE;IACzE,YAAY,EAAE,IAAI,CAAC;IACnB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG;IACF,YAAY,EAAE,KAAK,CAAC;IACpB,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CA8FnC;AAkBD,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,UAAU,EACjB,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,oBAAoB,CAkBtB;AACD,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,KAAK,GAAE,UAAmB,EAC1B,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,WAAW,GAAG,IAAI,CAepB;AACD;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CACzC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACvC,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,WAAW,GAAG,IAAI,CAgBpB;AACD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,YAAY,EAAE,IAAI,CAChB,WAAW,EACX,MAAM,GAAG,aAAa,GAAG,cAAc,GAAG,OAAO,GAAG,QAAQ,CAC7D,GAAG,IAAI,GACP,MAAM,GAAG,SAAS,CAQpB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,IAAI,CACT,WAAW,EACX,MAAM,GAAG,aAAa,GAAG,cAAc,GAAG,OAAO,GAAG,QAAQ,CAC7D,GAAG,IAAI,GACP,MAAM,CAcR"}
|
package/dist/agent/agents.js
CHANGED
|
@@ -28,15 +28,10 @@ function loadAgentsFromDir(dir, source) {
|
|
|
28
28
|
const { frontmatter, body } = parseFrontmatter(content);
|
|
29
29
|
if (!frontmatter.name || !frontmatter.description)
|
|
30
30
|
continue;
|
|
31
|
-
const tools = frontmatter.tools
|
|
32
|
-
?.split(",")
|
|
33
|
-
.map((t) => t.trim())
|
|
34
|
-
.filter(Boolean);
|
|
35
31
|
agents.push({
|
|
36
32
|
name: frontmatter.name,
|
|
37
33
|
description: frontmatter.description,
|
|
38
34
|
mode: frontmatter.mode === "primary" ? "primary" : "subagent",
|
|
39
|
-
tools: tools && tools.length > 0 ? tools : undefined,
|
|
40
35
|
model: frontmatter.model,
|
|
41
36
|
systemPrompt: body,
|
|
42
37
|
source,
|
|
@@ -65,7 +60,7 @@ export function setCloudAgents(agents, teamId) {
|
|
|
65
60
|
}
|
|
66
61
|
export async function refreshCloudAgents(opts) {
|
|
67
62
|
if (!opts.teamId)
|
|
68
|
-
return;
|
|
63
|
+
return { authRejected: false, count: 0 };
|
|
69
64
|
const teamId = opts.teamId;
|
|
70
65
|
const cache = getCloudAgentCache(teamId);
|
|
71
66
|
if (cache.inFlight)
|
|
@@ -83,13 +78,39 @@ export async function refreshCloudAgents(opts) {
|
|
|
83
78
|
"x-team-id": teamId,
|
|
84
79
|
},
|
|
85
80
|
body: JSON.stringify({
|
|
86
|
-
query: `query CloudAgents($teamId: ID!) { agents(teamId: $teamId) { name description systemPrompt
|
|
81
|
+
query: `query CloudAgents($teamId: ID!) { agents(teamId: $teamId) { name description systemPrompt model mode scope } }`,
|
|
87
82
|
variables: { teamId },
|
|
88
83
|
}),
|
|
89
84
|
});
|
|
90
|
-
|
|
91
|
-
|
|
85
|
+
// HTTP 401/403: the machine JWT was rejected outright (expired,
|
|
86
|
+
// revoked, or signed with a stale secret). Surface as auth-rejected so
|
|
87
|
+
// the caller can trigger a forced re-registration instead of looping
|
|
88
|
+
// on the same dead token.
|
|
89
|
+
if (response.status === 401 || response.status === 403) {
|
|
90
|
+
const reason = `Cloud agents: backend rejected machine JWT (HTTP ${response.status})`;
|
|
91
|
+
console.warn(reason);
|
|
92
|
+
return { authRejected: true, reason };
|
|
93
|
+
}
|
|
94
|
+
if (!response.ok) {
|
|
95
|
+
console.warn(`Cloud agents: backend returned HTTP ${response.status}`);
|
|
96
|
+
return { authRejected: false, count: 0 };
|
|
97
|
+
}
|
|
92
98
|
const payload = (await response.json());
|
|
99
|
+
// GraphQL commonly returns 200 with an `errors` array when auth fails
|
|
100
|
+
// (e.g. "Authentication required", "Not authorized for this team").
|
|
101
|
+
// Treat any auth-flavored error as auth-rejected so the caller can
|
|
102
|
+
// recover; other GraphQL errors are non-fatal (no agents loaded).
|
|
103
|
+
if (payload.errors && payload.errors.length > 0) {
|
|
104
|
+
const msg = payload.errors.map((e) => e.message ?? "").join("; ");
|
|
105
|
+
const looksLikeAuth = /authentication required|not authorized|unauthor/i.test(msg);
|
|
106
|
+
const reason = `Cloud agents: backend rejected machine JWT (${msg})`;
|
|
107
|
+
if (looksLikeAuth) {
|
|
108
|
+
console.warn(reason);
|
|
109
|
+
return { authRejected: true, reason };
|
|
110
|
+
}
|
|
111
|
+
console.warn(reason);
|
|
112
|
+
return { authRejected: false, count: 0 };
|
|
113
|
+
}
|
|
93
114
|
const fetched = payload.data?.agents ?? [];
|
|
94
115
|
const agents = fetched
|
|
95
116
|
.filter((a) => typeof a.name === "string" &&
|
|
@@ -99,9 +120,6 @@ export async function refreshCloudAgents(opts) {
|
|
|
99
120
|
name: a.name,
|
|
100
121
|
description: a.description,
|
|
101
122
|
mode: a.mode === "PRIMARY" ? "primary" : "subagent",
|
|
102
|
-
tools: Array.isArray(a.tools)
|
|
103
|
-
? a.tools.filter((t) => typeof t === "string")
|
|
104
|
-
: undefined,
|
|
105
123
|
model: typeof a.model === "string" ? a.model : undefined,
|
|
106
124
|
systemPrompt: a.systemPrompt,
|
|
107
125
|
source: "cloud",
|
|
@@ -112,8 +130,13 @@ export async function refreshCloudAgents(opts) {
|
|
|
112
130
|
cache.generation += 1;
|
|
113
131
|
cache.agents = agents;
|
|
114
132
|
}
|
|
133
|
+
return { authRejected: false, count: agents.length };
|
|
115
134
|
}
|
|
116
|
-
catch {
|
|
135
|
+
catch (err) {
|
|
136
|
+
// Network errors are non-fatal — local agents remain available offline.
|
|
137
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
138
|
+
console.warn(`Cloud agents: refresh failed (${msg})`);
|
|
139
|
+
return { authRejected: false, count: 0 };
|
|
117
140
|
}
|
|
118
141
|
finally {
|
|
119
142
|
cache.inFlight = undefined;
|
|
@@ -214,19 +237,16 @@ export function injectPrimaryAgentPrompt(base, primaryAgent) {
|
|
|
214
237
|
return `${base}\n\n---\n\n${block}`;
|
|
215
238
|
}
|
|
216
239
|
/**
|
|
217
|
-
* Render a small, soft metadata block about an agent (
|
|
218
|
-
* that is appended below the agent
|
|
219
|
-
* informational
|
|
220
|
-
*
|
|
221
|
-
*
|
|
240
|
+
* Render a small, soft metadata block about an agent (model, source)
|
|
241
|
+
* that is appended below the agent.s own system prompt. This is purely
|
|
242
|
+
* informational . it tells the model what the agent declares and where it
|
|
243
|
+
* lives (e.g. the cloud backend), so it does not go hunting for agent
|
|
244
|
+
* files in local folders.
|
|
222
245
|
*/
|
|
223
246
|
export function agentMetadataBlock(agent) {
|
|
224
247
|
if (!agent)
|
|
225
248
|
return "";
|
|
226
249
|
const lines = [];
|
|
227
|
-
if (agent.tools && agent.tools.length > 0) {
|
|
228
|
-
lines.push(`Declared tools: ${agent.tools.join(", ")}`);
|
|
229
|
-
}
|
|
230
250
|
if (agent.model) {
|
|
231
251
|
lines.push(`Declared model: ${agent.model}`);
|
|
232
252
|
}
|
package/dist/agent/index.d.ts
CHANGED
|
@@ -39,7 +39,7 @@ import type { ExtensionContext as RichExtensionContext } from "../sdk/coding-age
|
|
|
39
39
|
* below the base). Any content before or after the primary block (provider
|
|
40
40
|
* preamble, shared base prompt) is preserved.
|
|
41
41
|
*/
|
|
42
|
-
export declare function buildSubagentSystemPrompt(baseSystemPrompt: string | undefined, agent: Pick<AgentConfig, "name" | "description" | "systemPrompt" | "
|
|
42
|
+
export declare function buildSubagentSystemPrompt(baseSystemPrompt: string | undefined, agent: Pick<AgentConfig, "name" | "description" | "systemPrompt" | "model" | "source">): string;
|
|
43
43
|
/**
|
|
44
44
|
* Give subagents a point-in-time branch view without exposing the live parent
|
|
45
45
|
* SessionManager. Each getBranch call returns fresh clones of the snapshot.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAIX,SAAS,EAET,MAAM,4BAA4B,CAAC;AAUpC,OAAO,EACN,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACN,KAAK,WAAW,EAKhB,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAOrD,OAAO,KAAK,EAAE,gBAAgB,IAAI,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AAsG7G;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACxC,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,cAAc,GAAG,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAIX,SAAS,EAET,MAAM,4BAA4B,CAAC;AAUpC,OAAO,EACN,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACN,KAAK,WAAW,EAKhB,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAOrD,OAAO,KAAK,EAAE,gBAAgB,IAAI,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AAsG7G;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACxC,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,cAAc,GAAG,OAAO,GAAG,QAAQ,CAAC,GACpF,MAAM,CAYR;AAgID;;;GAGG;AACH,wBAAgB,oCAAoC,CACnD,cAAc,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,GAChD,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,EAAE,WAAW,CAAC,CAK3D;AAED,wBAAgB,oBAAoB,CACnC,SAAS,EAAE,MAAM,EAAE,GAAG,SAAS,EAC/B,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,YAAY,EACjB,GAAG,EAAE,gBAAgB,GACnB,SAAS,EAAE,CAwCb;AAkbD,MAAM,CAAC,OAAO,UAAU,iBAAiB,CACxC,GAAG,EAAE,YAAY,EACjB,IAAI,CAAC,EAAE;IACN,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,GACC,IAAI,CAgaN"}
|
package/dist/agent/index.js
CHANGED
|
@@ -224,13 +224,15 @@ export function createSubagentSessionManagerSnapshot(sessionManager) {
|
|
|
224
224
|
};
|
|
225
225
|
}
|
|
226
226
|
export function resolveSubagentTools(toolNames, cwd, ext, ctx) {
|
|
227
|
-
|
|
228
|
-
//
|
|
229
|
-
//
|
|
227
|
+
// Subagents always get the full default toolset -- no per-agent tool
|
|
228
|
+
// filtering. The `toolNames` parameter is accepted for backward
|
|
229
|
+
// compatibility but ignored: every subagent receives all built-in tools
|
|
230
|
+
// (read, bash, apply_patch) plus observational-memory tools (recall,
|
|
231
|
+
// read-project-observations) so it can actually do work.
|
|
232
|
+
void toolNames;
|
|
233
|
+
const requestedNames = new Set(allToolNames);
|
|
230
234
|
requestedNames.add(READ_PROJECT_OBSERVATIONS_TOOL_NAME);
|
|
231
235
|
requestedNames.add(RECALL_OBSERVATION_TOOL_NAME);
|
|
232
|
-
if (requestedNames.size === 0)
|
|
233
|
-
return [];
|
|
234
236
|
const tools = [];
|
|
235
237
|
for (const name of requestedNames) {
|
|
236
238
|
// Built-in tools
|
|
@@ -395,7 +397,11 @@ async function runSingleAgent(defaultCwd, agents, agentName, task, cwd, step, si
|
|
|
395
397
|
}
|
|
396
398
|
// Resolve tools
|
|
397
399
|
const effectiveCwd = cwd ?? defaultCwd;
|
|
398
|
-
|
|
400
|
+
// Resolve tools -- subagents always get the full default toolset (no
|
|
401
|
+
// per-agent tool filtering). Built-ins (read, bash, apply_patch) plus
|
|
402
|
+
// observational-memory tools (recall, read-project-observations) are
|
|
403
|
+
// always available so subagents can actually do work.
|
|
404
|
+
const tools = resolveSubagentTools(undefined, effectiveCwd, ext, ctx);
|
|
399
405
|
const currentResult = {
|
|
400
406
|
agent: agentName,
|
|
401
407
|
agentSource: agent.source,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAwBH,OAAO,EAAE,WAAW,EAAmB,MAAM,oBAAoB,CAAC;AAWlE,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAGnE,OAAO,EAAmB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAWrE;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAazD;AAED,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,CA6B9D;AAED,MAAM,WAAW,eAAe;IAC9B,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,uCAAuC;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4CAA4C;IAC5C,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,qBAAqB,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,KAAK,EAAE,YAAY,CAAC;IACpB,wDAAwD;IACxD,OAAO,EAAE,oBAAoB,CAAC;IAC9B,4CAA4C;IAC5C,KAAK,EAAE,WAAW,CAAC;IACnB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,QAAQ,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAwBH,OAAO,EAAE,WAAW,EAAmB,MAAM,oBAAoB,CAAC;AAWlE,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAGnE,OAAO,EAAmB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAWrE;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAazD;AAED,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,CA6B9D;AAED,MAAM,WAAW,eAAe;IAC9B,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,uCAAuC;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4CAA4C;IAC5C,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,qBAAqB,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,KAAK,EAAE,YAAY,CAAC;IACpB,wDAAwD;IACxD,OAAO,EAAE,oBAAoB,CAAC;IAC9B,4CAA4C;IAC5C,KAAK,EAAE,WAAW,CAAC;IACnB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,QAAQ,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CA4hBlF;AA+DD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAa5E"}
|
package/dist/commands/serve.js
CHANGED
|
@@ -178,6 +178,52 @@ export async function runServe(opts = {}) {
|
|
|
178
178
|
const { BrowserService } = await import("../extensions/browser/browser-service.js");
|
|
179
179
|
await BrowserService.closeAll();
|
|
180
180
|
};
|
|
181
|
+
// Keep the callback independent of the manager variable's initialization.
|
|
182
|
+
// AgentBridge.start() normally invokes it after the manager is assigned, but
|
|
183
|
+
// an explicit holder also makes that ordering safe if startup becomes eager.
|
|
184
|
+
const managerRef = {};
|
|
185
|
+
// Force a machine re-registration when cloud-agent discovery reports
|
|
186
|
+
// the cached machine JWT was rejected (HTTP 401/403 or a GraphQL auth
|
|
187
|
+
// error). This happens when the backend secret was rotated but machine.json
|
|
188
|
+
// still holds a JWT signed with the old secret — the `exp` claim is fine, so
|
|
189
|
+
// `ensureMachineRegistered` would otherwise reuse the dead token forever.
|
|
190
|
+
const forceReRegister = async (label) => {
|
|
191
|
+
if (!silent)
|
|
192
|
+
process.stderr.write(`${label} — re-registering machine…\n`);
|
|
193
|
+
try {
|
|
194
|
+
const newReg = await ensureMachineRegistered({
|
|
195
|
+
backendUrl,
|
|
196
|
+
apiKey: cfg.teamApiKey,
|
|
197
|
+
userJwt: cfg.userJwt,
|
|
198
|
+
machineNameOverride: opts.machineName,
|
|
199
|
+
version,
|
|
200
|
+
fetchImpl: opts.fetchImpl,
|
|
201
|
+
forceRefresh: true,
|
|
202
|
+
});
|
|
203
|
+
registration = newReg;
|
|
204
|
+
// Update the manager so future AgentBridge instances use the fresh JWT.
|
|
205
|
+
const manager = managerRef.current;
|
|
206
|
+
if (!manager) {
|
|
207
|
+
throw new Error("Session stream manager is not initialized");
|
|
208
|
+
}
|
|
209
|
+
manager.updateMachineJwt(newReg.record.machineJwt, newReg.record.teamId);
|
|
210
|
+
// Pre-populate the cloud-agent cache with the fresh JWT so the next
|
|
211
|
+
// turn sees agents immediately without waiting for discovery.
|
|
212
|
+
await refreshCloudAgentsImpl({
|
|
213
|
+
backendUrl,
|
|
214
|
+
machineJwt: newReg.record.machineJwt,
|
|
215
|
+
teamId: newReg.record.teamId,
|
|
216
|
+
});
|
|
217
|
+
if (!silent) {
|
|
218
|
+
process.stdout.write(`Re-registered machine "${newReg.record.machineName}" (${newReg.record.machineId}).\n`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
223
|
+
process.stderr.write(`✗ Re-registration failed: ${msg}\n`);
|
|
224
|
+
process.stderr.write(" Run `spectral login` if your team API key has been rotated.\n");
|
|
225
|
+
}
|
|
226
|
+
};
|
|
181
227
|
const manager = new SessionStreamManager({
|
|
182
228
|
store,
|
|
183
229
|
cwd,
|
|
@@ -187,7 +233,9 @@ export async function runServe(opts = {}) {
|
|
|
187
233
|
bridgeFactory: opts.bridgeFactory,
|
|
188
234
|
onTurnEnd: closeBrowser,
|
|
189
235
|
onDispose: closeBrowser,
|
|
236
|
+
onCloudAgentsAuthRejected: (reason) => forceReRegister(reason),
|
|
190
237
|
});
|
|
238
|
+
managerRef.current = manager;
|
|
191
239
|
if (!silent) {
|
|
192
240
|
const action = registration.reused ? "Reusing" : "Registered";
|
|
193
241
|
process.stdout.write(`${action} machine "${registration.record.machineName}" (${registration.record.machineId})\n`);
|
|
@@ -387,6 +435,11 @@ export async function runServe(opts = {}) {
|
|
|
387
435
|
machineNameOverride: opts.machineName,
|
|
388
436
|
version,
|
|
389
437
|
fetchImpl: opts.fetchImpl,
|
|
438
|
+
// The relay rejected the cached machine JWT, so we MUST skip the
|
|
439
|
+
// on-disk cache (which only checks the JWT `exp` claim, not the
|
|
440
|
+
// signature). Without this, ensureMachineRegistered would reuse
|
|
441
|
+
// the same stale token and loop forever.
|
|
442
|
+
forceRefresh: true,
|
|
390
443
|
});
|
|
391
444
|
registration = newReg;
|
|
392
445
|
// Dispose the old relay and create a fresh one with the new JWT.
|
|
@@ -103,7 +103,12 @@ export interface RestRequestDeps {
|
|
|
103
103
|
*/
|
|
104
104
|
publishMetaEvent?: PublishMetaEvent;
|
|
105
105
|
refreshNativeExtensions?: () => Promise<void>;
|
|
106
|
-
|
|
106
|
+
/**
|
|
107
|
+
* Refresh the cloud-agent cache. Returns a result describing whether the
|
|
108
|
+
* backend rejected auth; callers that just need a cache warm may ignore it
|
|
109
|
+
* (the bridge handles auth-rejection separately via onCloudAgentsAuthRejected).
|
|
110
|
+
*/
|
|
111
|
+
refreshCloudAgents?: (teamId: string) => Promise<unknown>;
|
|
107
112
|
startWizardLogin?: () => Promise<WizardLoginResult>;
|
|
108
113
|
}
|
|
109
114
|
export interface WizardLoginResult {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/relay/dispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAQH,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACf,MAAM,uBAAuB,CAAC;AAK/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAkDzD,OAAO,KAAK,EAEV,oBAAoB,EACpB,UAAU,EACX,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAS/C;;;GAGG;AACH,UAAU,UAAU;IAClB,KAAK,EACD,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAChB,gBAAgB,GAChB,aAAa,GACb,eAAe,GACf,0BAA0B,GAC1B,uBAAuB,GACvB,0BAA0B,GAC1B,gBAAgB,GAChB,aAAa,GACb,0BAA0B,GAC1B,6BAA6B,GAC7B,sBAAsB,GACtB,gBAAgB,GAChB,gBAAgB,GAChB,oBAAoB,GACpB,4BAA4B,GAC5B,iBAAiB,GACjB,6BAA6B,GAC7B,cAAc,GACd,wBAAwB,GACxB,gBAAgB,GAChB,gBAAgB,GAChB,oBAAoB,GACpB,sBAAsB,GACtB,gBAAgB,GAChB,kBAAkB,GAClB,eAAe,GACf,oBAAoB,GACpB,iBAAiB,GACjB,mBAAmB,GACnB,2BAA2B,GAC3B,sBAAsB,GACtB,cAAc,GACd,cAAc,GACd,oBAAoB,GACpB,oBAAoB,GACpB,8BAA8B,GAC9B,8BAA8B,GAC9B,cAAc,GACd,aAAa,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,UAAU,GAAG,IAAI,CAgNnB;AAMD;;;;;;;;;GASG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,6FAA6F;IAC7F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uGAAuG;IACvG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;KAAE,CAAC;IACjD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,uBAAuB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/relay/dispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAQH,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACf,MAAM,uBAAuB,CAAC;AAK/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAkDzD,OAAO,KAAK,EAEV,oBAAoB,EACpB,UAAU,EACX,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAS/C;;;GAGG;AACH,UAAU,UAAU;IAClB,KAAK,EACD,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAChB,gBAAgB,GAChB,aAAa,GACb,eAAe,GACf,0BAA0B,GAC1B,uBAAuB,GACvB,0BAA0B,GAC1B,gBAAgB,GAChB,aAAa,GACb,0BAA0B,GAC1B,6BAA6B,GAC7B,sBAAsB,GACtB,gBAAgB,GAChB,gBAAgB,GAChB,oBAAoB,GACpB,4BAA4B,GAC5B,iBAAiB,GACjB,6BAA6B,GAC7B,cAAc,GACd,wBAAwB,GACxB,gBAAgB,GAChB,gBAAgB,GAChB,oBAAoB,GACpB,sBAAsB,GACtB,gBAAgB,GAChB,kBAAkB,GAClB,eAAe,GACf,oBAAoB,GACpB,iBAAiB,GACjB,mBAAmB,GACnB,2BAA2B,GAC3B,sBAAsB,GACtB,cAAc,GACd,cAAc,GACd,oBAAoB,GACpB,oBAAoB,GACpB,8BAA8B,GAC9B,8BAA8B,GAC9B,cAAc,GACd,aAAa,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,UAAU,GAAG,IAAI,CAgNnB;AAMD;;;;;;;;;GASG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,6FAA6F;IAC7F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uGAAuG;IACvG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;KAAE,CAAC;IACjD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,uBAAuB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EACF,YAAY,GACZ,oBAAoB,GACpB,SAAS,GACT,WAAW,GACX,iBAAiB,GACjB,qBAAqB,GACrB,cAAc,GACd,QAAQ,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAuUD,wBAAsB,gBAAgB,CAAC,SAAS,SAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAuBxF;AA8GD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,gBAAgB,EACvB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAiD5B;AA6bD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,2DAA2D;IAC3D,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACjC;;;;;;;;;OASG;IACH,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrC,yEAAyE;IACzE,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;KAAE,CAAC;CAClD;AA6GD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,kBAAkB,EACzB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,IAAI,CAAC,CAuKf;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,IAAI,CAAC,CAkDf;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE;IAAE,OAAO,EAAE,oBAAoB,CAAC;IAAC,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;KAAE,CAAA;CAAE,GACxF,IAAI,CAEN;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,oBAAoB,EAC7B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,GACnC,IAAI,CASN;AAMD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACjC,sDAAsD;IACtD,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrC,iCAAiC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,kDAAkD;IAClD,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;KAAE,CAAC;CAClD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,iBAAiB,EACxB,IAAI,EAAE,gBAAgB,GACrB,IAAI,CAQN;AAED,oEAAoE;AACpE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;KAAE,CAAC;CAClD;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,iBAAiB,EACxB,IAAI,EAAE,gBAAgB,GACrB,IAAI,CAUN"}
|
|
@@ -46,10 +46,26 @@ export interface RegistrationDeps {
|
|
|
46
46
|
expirySkewSec?: number;
|
|
47
47
|
/** Override fetch (tests). */
|
|
48
48
|
fetchImpl?: typeof fetch;
|
|
49
|
+
/**
|
|
50
|
+
* Force a fresh registration even when the cached `machine.json` JWT has not
|
|
51
|
+
* expired. Used after the relay reports an auth-failed event or after
|
|
52
|
+
* cloud-agent discovery returns an auth-rejection — both indicate the cached
|
|
53
|
+
* JWT is rejected by the backend (e.g. secret rotation) even though its
|
|
54
|
+
* `exp` claim is still in the future. Without this, `ensureMachineRegistered`
|
|
55
|
+
* would silently reuse the stale token forever and never recover.
|
|
56
|
+
*/
|
|
57
|
+
forceRefresh?: boolean;
|
|
49
58
|
}
|
|
50
59
|
export interface RegisterResponse {
|
|
51
60
|
/** True when the existing on-disk record was reused (no network call). */
|
|
52
61
|
reused: boolean;
|
|
62
|
+
/**
|
|
63
|
+
* True when the cache was skipped because the caller forced a refresh
|
|
64
|
+
* (e.g. after the relay reported an auth-failed event, or because
|
|
65
|
+
* cloud-agent discovery reported the cached JWT was rejected). Always
|
|
66
|
+
* implies `reused === false`.
|
|
67
|
+
*/
|
|
68
|
+
forced?: boolean;
|
|
53
69
|
record: MachineRecord;
|
|
54
70
|
}
|
|
55
71
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../../src/relay/registration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,EAA4B,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAElF,MAAM,WAAW,gBAAgB;IAC/B,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,+FAA+F;IAC/F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../../src/relay/registration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,EAA4B,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAElF,MAAM,WAAW,gBAAgB;IAC/B,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,+FAA+F;IAC/F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,MAAM,EAAE,OAAO,CAAC;IAChB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWvD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUvD;AAED,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,SAAK,GAAG,OAAO,CAI/D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,gBAAgB,CAAC,CA+G3B"}
|
|
@@ -91,7 +91,8 @@ export function isJwtExpired(jwt, skewSec = 60) {
|
|
|
91
91
|
export async function ensureMachineRegistered(deps) {
|
|
92
92
|
const skew = deps.expirySkewSec ?? 60;
|
|
93
93
|
const existing = await loadMachine();
|
|
94
|
-
|
|
94
|
+
const forceRefresh = deps.forceRefresh === true;
|
|
95
|
+
if (!forceRefresh && existing && !isJwtExpired(existing.machineJwt, skew)) {
|
|
95
96
|
// The cached machine JWT is still valid. If the caller authenticated with a
|
|
96
97
|
// user JWT (OAuth login) and the cached machine was previously owned by a
|
|
97
98
|
// different user, we must NOT short-circuit — we need to hit the register
|
|
@@ -109,6 +110,9 @@ export async function ensureMachineRegistered(deps) {
|
|
|
109
110
|
return { reused: true, record: existing };
|
|
110
111
|
}
|
|
111
112
|
}
|
|
113
|
+
else if (forceRefresh) {
|
|
114
|
+
console.warn("Re-registering machine: cached JWT was rejected by the backend (forceRefresh).");
|
|
115
|
+
}
|
|
112
116
|
const fetchImpl = deps.fetchImpl ?? fetch;
|
|
113
117
|
const url = `${deps.backendUrl.replace(/\/$/, "")}/api/machines/register`;
|
|
114
118
|
const body = {
|
|
@@ -171,5 +175,5 @@ export async function ensureMachineRegistered(deps) {
|
|
|
171
175
|
version: deps.version,
|
|
172
176
|
};
|
|
173
177
|
await saveMachine(record);
|
|
174
|
-
return { reused: false, record };
|
|
178
|
+
return { reused: false, forced: forceRefresh, record };
|
|
175
179
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply-patch.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/coding-agent/core/tools/apply-patch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAW9D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAc5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,QAAA,MAAM,gBAAgB;;EAKrB,CAAC;AACF,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAClE,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAC;CACxB;AACD,MAAM,WAAW,oBAAoB;IACpC,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,SAAS,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,UAAU,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,KAAK,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACnE;AACD,QAAA,MAAM,2BAA2B,EAAE,oBAOlC,CAAC;AACF,OAAO,EAAE,2BAA2B,EAAE,CAAC;AACvC,MAAM,WAAW,qBAAqB;IACrC,UAAU,CAAC,EAAE,oBAAoB,CAAC;CAClC;
|
|
1
|
+
{"version":3,"file":"apply-patch.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/coding-agent/core/tools/apply-patch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAW9D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAc5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,QAAA,MAAM,gBAAgB;;EAKrB,CAAC;AACF,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAClE,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAC;CACxB;AACD,MAAM,WAAW,oBAAoB;IACpC,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,SAAS,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,UAAU,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,KAAK,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACnE;AACD,QAAA,MAAM,2BAA2B,EAAE,oBAOlC,CAAC;AACF,OAAO,EAAE,2BAA2B,EAAE,CAAC;AACvC,MAAM,WAAW,qBAAqB;IACrC,UAAU,CAAC,EAAE,oBAAoB,CAAC;CAClC;AA6gBD,wBAAgB,8BAA8B,CAC7C,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,qBAAqB,GAC7B,cAAc,CAAC,OAAO,gBAAgB,EAAE,qBAAqB,CAAC,CA2JhE;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC,OAAO,gBAAgB,CAAC,CAErH"}
|
|
@@ -66,6 +66,8 @@ function parseUpdateChunks(lines, startIndex) {
|
|
|
66
66
|
index++;
|
|
67
67
|
const oldLines = [];
|
|
68
68
|
const newLines = [];
|
|
69
|
+
const removedLines = [];
|
|
70
|
+
const addedLines = [];
|
|
69
71
|
let isEndOfFile = false;
|
|
70
72
|
while (index < lines.length && !lines[index].startsWith("@@") && !lines[index].startsWith("***")) {
|
|
71
73
|
const line = lines[index];
|
|
@@ -80,15 +82,19 @@ function parseUpdateChunks(lines, startIndex) {
|
|
|
80
82
|
}
|
|
81
83
|
else if (line.startsWith("-")) {
|
|
82
84
|
oldLines.push(line.slice(1));
|
|
85
|
+
removedLines.push(line.slice(1));
|
|
83
86
|
}
|
|
84
87
|
else if (line.startsWith("+")) {
|
|
85
88
|
newLines.push(line.slice(1));
|
|
89
|
+
addedLines.push(line.slice(1));
|
|
86
90
|
}
|
|
87
91
|
index++;
|
|
88
92
|
}
|
|
89
93
|
chunks.push({
|
|
90
94
|
oldLines,
|
|
91
95
|
newLines,
|
|
96
|
+
removedLines,
|
|
97
|
+
addedLines,
|
|
92
98
|
changeContext: header.changeContext,
|
|
93
99
|
oldStartLine: header.oldStartLine,
|
|
94
100
|
isEndOfFile: isEndOfFile || undefined,
|
|
@@ -219,6 +225,51 @@ function seekSequenceNearHint(lines, pattern, startIndex, hintLine, eof = false)
|
|
|
219
225
|
}
|
|
220
226
|
return seekSequence(lines, pattern, startIndex, eof);
|
|
221
227
|
}
|
|
228
|
+
function leadingWhitespace(line) {
|
|
229
|
+
return line.match(/^[\t ]*/)?.[0] ?? "";
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Adapts the indentation of added (new) lines to match the indentation found
|
|
233
|
+
* in the file when the match was located at a different indentation than the
|
|
234
|
+
* patch's oldLines specified. This is the most common cause of agent confusion:
|
|
235
|
+
* the patch is built with 2-space indentation but the file uses tabs, or the
|
|
236
|
+
* context block is nested differently than expected.
|
|
237
|
+
*
|
|
238
|
+
* Only added lines (`+` prefix in the patch) are adapted; removed/context lines
|
|
239
|
+
* are not touched because they were already matched against the file.
|
|
240
|
+
*/
|
|
241
|
+
function adaptAddedLineIndentation(originalFileLines, matchStartIndex, chunk) {
|
|
242
|
+
// Determine the base indentation of the patch's old lines (first non-blank)
|
|
243
|
+
const patchBaseLine = chunk.oldLines.find((line) => line.trim().length > 0);
|
|
244
|
+
// Determine the base indentation of the matched region in the file
|
|
245
|
+
const fileBaseLine = originalFileLines
|
|
246
|
+
.slice(matchStartIndex, matchStartIndex + chunk.oldLines.length)
|
|
247
|
+
.find((line) => line.trim().length > 0);
|
|
248
|
+
if (!patchBaseLine || !fileBaseLine)
|
|
249
|
+
return chunk.newLines;
|
|
250
|
+
const patchBaseIndent = leadingWhitespace(patchBaseLine);
|
|
251
|
+
const fileBaseIndent = leadingWhitespace(fileBaseLine);
|
|
252
|
+
if (patchBaseIndent === fileBaseIndent)
|
|
253
|
+
return chunk.newLines;
|
|
254
|
+
// Adapt each new line's indentation: replace the patch's base indent with the file's base indent
|
|
255
|
+
const indentDelta = fileBaseIndent.length - patchBaseIndent.length;
|
|
256
|
+
if (indentDelta === 0)
|
|
257
|
+
return chunk.newLines;
|
|
258
|
+
return chunk.newLines.map((line) => {
|
|
259
|
+
if (line.trim().length === 0)
|
|
260
|
+
return line;
|
|
261
|
+
const currentIndent = leadingWhitespace(line);
|
|
262
|
+
if (indentDelta > 0) {
|
|
263
|
+
// File is more indented: prepend the delta
|
|
264
|
+
return fileBaseIndent.slice(0, indentDelta) + line;
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
// File is less indented: remove up to |delta| chars of leading whitespace
|
|
268
|
+
const removeCount = Math.min(Math.abs(indentDelta), currentIndent.length);
|
|
269
|
+
return line.slice(removeCount);
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
}
|
|
222
273
|
function formatCurrentFileExcerpt(lines, startIndex, hintLine) {
|
|
223
274
|
if (lines.length === 0)
|
|
224
275
|
return "(file is empty)";
|
|
@@ -267,14 +318,68 @@ function computeReplacements(originalLines, filePath, chunks) {
|
|
|
267
318
|
newLines = newLines.at(-1) === "" ? newLines.slice(0, -1) : newLines;
|
|
268
319
|
found = seekSequenceNearHint(originalLines, oldLines, lineIndex, chunk.oldStartLine, chunk.isEndOfFile);
|
|
269
320
|
}
|
|
321
|
+
// Fallback: if full-context match fails, try matching just the removed (actually-changed) lines.
|
|
322
|
+
// This recovers from stale surrounding context — the most common agent failure mode.
|
|
323
|
+
let adaptedNewLines = newLines;
|
|
270
324
|
if (found === -1) {
|
|
325
|
+
const removedLines = chunk.removedLines ?? extractRemovedLinesHeuristic(chunk);
|
|
326
|
+
const addedLines = chunk.addedLines ?? extractAddedLinesHeuristic(chunk);
|
|
327
|
+
if (removedLines.length > 0) {
|
|
328
|
+
const removedFound = seekSequenceBidirectional(originalLines, removedLines, lineIndex);
|
|
329
|
+
if (removedFound !== -1) {
|
|
330
|
+
// Build a pseudo-chunk with only the added lines for indentation adaptation
|
|
331
|
+
const addedChunk = { ...chunk, oldLines: removedLines, newLines: addedLines };
|
|
332
|
+
adaptedNewLines = adaptAddedLineIndentation(originalLines, removedFound, addedChunk);
|
|
333
|
+
// Replace only the removed lines; keep the surrounding context intact
|
|
334
|
+
replacements.push([removedFound, removedLines.length, adaptedNewLines]);
|
|
335
|
+
lineIndex = removedFound + removedLines.length;
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
271
339
|
throw new Error(formatMissingLinesError(filePath, chunk, originalLines, lineIndex));
|
|
272
340
|
}
|
|
273
|
-
|
|
341
|
+
// Adapt indentation even on full-context matches when fuzzy comparators were used
|
|
342
|
+
adaptedNewLines = adaptAddedLineIndentation(originalLines, found, chunk);
|
|
343
|
+
replacements.push([found, oldLines.length, adaptedNewLines]);
|
|
274
344
|
lineIndex = found + oldLines.length;
|
|
275
345
|
}
|
|
276
346
|
return replacements.sort((a, b) => a[0] - b[0]);
|
|
277
347
|
}
|
|
348
|
+
/**
|
|
349
|
+
* Heuristic fallback for extracting removed lines when the parser did not
|
|
350
|
+
* populate `removedLines` (e.g. chunks created outside parseUpdateChunks).
|
|
351
|
+
* Derives removed lines as those in oldLines that are NOT in newLines
|
|
352
|
+
* (comparing trimmed content to be whitespace-tolerant).
|
|
353
|
+
*/
|
|
354
|
+
function extractRemovedLinesHeuristic(chunk) {
|
|
355
|
+
const newTrimmedSet = new Set(chunk.newLines.map((l) => l.trim()));
|
|
356
|
+
const removed = [];
|
|
357
|
+
let sawChange = false;
|
|
358
|
+
for (const line of chunk.oldLines) {
|
|
359
|
+
if (!newTrimmedSet.has(line.trim())) {
|
|
360
|
+
removed.push(line);
|
|
361
|
+
sawChange = true;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
if (!sawChange)
|
|
365
|
+
return [];
|
|
366
|
+
return removed;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Heuristic fallback for extracting added lines when the parser did not
|
|
370
|
+
* populate `addedLines`. Derives added lines as those in newLines that are
|
|
371
|
+
* NOT in oldLines (comparing trimmed content to be whitespace-tolerant).
|
|
372
|
+
*/
|
|
373
|
+
function extractAddedLinesHeuristic(chunk) {
|
|
374
|
+
const oldTrimmedSet = new Set(chunk.oldLines.map((l) => l.trim()));
|
|
375
|
+
const added = [];
|
|
376
|
+
for (const line of chunk.newLines) {
|
|
377
|
+
if (!oldTrimmedSet.has(line.trim())) {
|
|
378
|
+
added.push(line);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
return added;
|
|
382
|
+
}
|
|
278
383
|
function applyReplacements(lines, replacements) {
|
|
279
384
|
const result = [...lines];
|
|
280
385
|
for (let index = replacements.length - 1; index >= 0; index--) {
|
|
@@ -139,6 +139,19 @@ export interface AgentBridgeOptions {
|
|
|
139
139
|
* session is not hot-reloaded.
|
|
140
140
|
*/
|
|
141
141
|
agentSettings?: AgentSettings;
|
|
142
|
+
/**
|
|
143
|
+
* Called when cloud-agent discovery reports the cached machine JWT was
|
|
144
|
+
* rejected by the backend (HTTP 401/403 or a GraphQL auth error). The
|
|
145
|
+
* caller (SessionStreamManager / serve.ts) should force a machine
|
|
146
|
+
* re-registration (`ensureMachineRegistered({ forceRefresh: true })`) so
|
|
147
|
+
* the next turn sees fresh cloud agents instead of looping on the same
|
|
148
|
+
* dead token. Invoked at most once per `start()` call.
|
|
149
|
+
*
|
|
150
|
+
* If the callback returns a Promise, `start()` awaits it so cloud agents
|
|
151
|
+
* are populated before the session accepts prompts — preventing a race
|
|
152
|
+
* where the first subagent tool call sees an empty agent list.
|
|
153
|
+
*/
|
|
154
|
+
onCloudAgentsAuthRejected?: (reason: string) => void | Promise<void>;
|
|
142
155
|
}
|
|
143
156
|
export declare class AgentBridge {
|
|
144
157
|
private session?;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-bridge.d.ts","sourceRoot":"","sources":["../../src/server/agent-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAaH,OAAO,EAQL,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EAEtB,MAAM,8BAA8B,CAAC;AAatC,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,8BAA8B,CAAC;AAatC,OAAO,EACL,kBAAkB,IAAI,yBAAyB,EAEhD,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAI3E,UAAU,4BAA4B;IACpC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;CACpC;AAkBD,sEAAsE;AACtE,MAAM,MAAM,oBAAoB,GAAG,OAAO,yBAAyB,CAAC;AAmCpE,MAAM,WAAW,kBAAkB;IACjC,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2EAA2E;IAC3E,GAAG,EAAE,MAAM,CAAC;IACZ,qFAAqF;IACrF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,IAAI,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACnC;;;;;OAKG;IACH,0BAA0B,EAAE,CAAC,GAAG,EAAE;QAChC,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,6EAA6E;QAC7E,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,KAAK,IAAI,CAAC;IACX;;;OAGG;IACH,yBAAyB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAC/B;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACxB;;;;OAIG;IACH,cAAc,CAAC,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAC9C;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,oBAAoB,CAAC;IAC1C;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-bridge.d.ts","sourceRoot":"","sources":["../../src/server/agent-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -622,11 +622,19 @@ export class AgentBridge {
|
|
|
622
622
|
async start() {
|
|
623
623
|
if (this.disposed)
|
|
624
624
|
throw new Error("AgentBridge already disposed");
|
|
625
|
-
await refreshCloudAgents({
|
|
625
|
+
const cloudResult = await refreshCloudAgents({
|
|
626
626
|
backendUrl: this.opts.backendUrl,
|
|
627
627
|
machineJwt: this.opts.machineJwt,
|
|
628
628
|
teamId: this.opts.teamId,
|
|
629
629
|
});
|
|
630
|
+
if (cloudResult.authRejected) {
|
|
631
|
+
// Surface to the caller so it can force a machine re-registration;
|
|
632
|
+
// cloud agents will remain empty this turn but recover on the next one.
|
|
633
|
+
// Await the callback so re-registration completes before the session
|
|
634
|
+
// accepts prompts — otherwise the first subagent call races with the
|
|
635
|
+
// cache refresh and sees an empty agent list.
|
|
636
|
+
await this.opts.onCloudAgentsAuthRejected?.(cloudResult.reason);
|
|
637
|
+
}
|
|
630
638
|
const extensionFactories = [
|
|
631
639
|
// Primary-agent prompt is injected per-turn via before_agent_start so the
|
|
632
640
|
// primaryAgentEnabled toggle takes effect mid-session (next user message).
|
|
@@ -899,7 +907,6 @@ export class AgentBridge {
|
|
|
899
907
|
modelRegistry: this.modelRegistry,
|
|
900
908
|
settingsManager,
|
|
901
909
|
sessionId: this.opts.sessionId,
|
|
902
|
-
tools: ["read", "bash", "apply_patch"],
|
|
903
910
|
});
|
|
904
911
|
this.session = result.session;
|
|
905
912
|
// Headless UI context: forwards extension notify() calls as wire events
|
|
@@ -245,22 +245,41 @@ export interface SessionStreamManagerOptions {
|
|
|
245
245
|
agentDir?: string;
|
|
246
246
|
onTurnEnd?: () => void | Promise<void>;
|
|
247
247
|
onDispose?: () => void | Promise<void>;
|
|
248
|
+
/**
|
|
249
|
+
* Called when an AgentBridge reports cloud-agent discovery failed due to
|
|
250
|
+
* auth rejection (stale/invalid machine JWT). The caller (serve.ts) uses
|
|
251
|
+
* this to force a machine re-registration so the next turn recovers.
|
|
252
|
+
* When the callback returns a Promise, AgentBridge.start() awaits it so
|
|
253
|
+
* cloud agents are populated before the session accepts prompts.
|
|
254
|
+
*/
|
|
255
|
+
onCloudAgentsAuthRejected?: (reason: string) => void | Promise<void>;
|
|
248
256
|
}
|
|
249
257
|
export declare class SessionStreamManager {
|
|
250
258
|
private readonly store;
|
|
251
259
|
private readonly cwd;
|
|
252
260
|
private readonly backendUrl;
|
|
253
|
-
|
|
254
|
-
private
|
|
261
|
+
/** Mutable so serve.ts can update it after a forced machine re-registration. */
|
|
262
|
+
private machineJwt;
|
|
263
|
+
private machineTeamId;
|
|
255
264
|
private readonly bridgeFactory;
|
|
256
265
|
private readonly agentDir;
|
|
257
266
|
private readonly onTurnEnd;
|
|
258
267
|
private readonly onDispose;
|
|
268
|
+
private readonly onCloudAgentsAuthRejected;
|
|
259
269
|
private readonly broker;
|
|
260
270
|
private readonly streams;
|
|
261
271
|
private readonly managerCompactions;
|
|
262
272
|
private disposed;
|
|
263
273
|
constructor(opts: SessionStreamManagerOptions);
|
|
274
|
+
/**
|
|
275
|
+
* Update the machine JWT used by all future AgentBridge instances.
|
|
276
|
+
* Called by serve.ts after a forced machine re-registration so new
|
|
277
|
+
* sessions don't reuse a stale/expired JWT.
|
|
278
|
+
*
|
|
279
|
+
* Does NOT affect already-running sessions — those bridges were created
|
|
280
|
+
* with the old JWT and will pick up the new one on their next reconnect.
|
|
281
|
+
*/
|
|
282
|
+
updateMachineJwt(jwt: string, teamId?: string): void;
|
|
264
283
|
/**
|
|
265
284
|
* Attach a subscriber to a session. Lazily creates the underlying spectral
|
|
266
285
|
* session on first attach. The caller is responsible for sending the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-stream.d.ts","sourceRoot":"","sources":["../../src/server/session-stream.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"session-stream.d.ts","sourceRoot":"","sources":["../../src/server/session-stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -495,12 +495,14 @@ export class SessionStreamManager {
|
|
|
495
495
|
store;
|
|
496
496
|
cwd;
|
|
497
497
|
backendUrl;
|
|
498
|
+
/** Mutable so serve.ts can update it after a forced machine re-registration. */
|
|
498
499
|
machineJwt;
|
|
499
500
|
machineTeamId;
|
|
500
501
|
bridgeFactory;
|
|
501
502
|
agentDir;
|
|
502
503
|
onTurnEnd;
|
|
503
504
|
onDispose;
|
|
505
|
+
onCloudAgentsAuthRejected;
|
|
504
506
|
broker;
|
|
505
507
|
streams = new Map();
|
|
506
508
|
managerCompactions = new Map();
|
|
@@ -515,6 +517,7 @@ export class SessionStreamManager {
|
|
|
515
517
|
this.agentDir = opts.agentDir;
|
|
516
518
|
this.onTurnEnd = opts.onTurnEnd;
|
|
517
519
|
this.onDispose = opts.onDispose;
|
|
520
|
+
this.onCloudAgentsAuthRejected = opts.onCloudAgentsAuthRejected;
|
|
518
521
|
// Broker for project-scoped inter-session communication.
|
|
519
522
|
this.broker = new InterAgentBroker({ store: this.store });
|
|
520
523
|
// Wire the project observations store singleton so the memory extension's
|
|
@@ -529,6 +532,19 @@ export class SessionStreamManager {
|
|
|
529
532
|
// and receive live observation messages between active sessions.
|
|
530
533
|
setInterAgentBroker(this.broker);
|
|
531
534
|
}
|
|
535
|
+
/**
|
|
536
|
+
* Update the machine JWT used by all future AgentBridge instances.
|
|
537
|
+
* Called by serve.ts after a forced machine re-registration so new
|
|
538
|
+
* sessions don't reuse a stale/expired JWT.
|
|
539
|
+
*
|
|
540
|
+
* Does NOT affect already-running sessions — those bridges were created
|
|
541
|
+
* with the old JWT and will pick up the new one on their next reconnect.
|
|
542
|
+
*/
|
|
543
|
+
updateMachineJwt(jwt, teamId) {
|
|
544
|
+
this.machineJwt = jwt;
|
|
545
|
+
if (teamId !== undefined)
|
|
546
|
+
this.machineTeamId = teamId;
|
|
547
|
+
}
|
|
532
548
|
/**
|
|
533
549
|
* Attach a subscriber to a session. Lazily creates the underlying spectral
|
|
534
550
|
* session on first attach. The caller is responsible for sending the
|
|
@@ -929,6 +945,9 @@ export class SessionStreamManager {
|
|
|
929
945
|
machineJwt: this.machineJwt,
|
|
930
946
|
history: bridgeHistory,
|
|
931
947
|
memorySnapshot,
|
|
948
|
+
onCloudAgentsAuthRejected: this.onCloudAgentsAuthRejected
|
|
949
|
+
? (reason) => this.onCloudAgentsAuthRejected(reason)
|
|
950
|
+
: undefined,
|
|
932
951
|
emit: (event) => this.handleBridgeEvent(stream, event),
|
|
933
952
|
onAssistantMessageComplete: ({ messageId, content, eventsJsonl, nativeResponseId, }) => {
|
|
934
953
|
try {
|
|
@@ -1590,6 +1609,9 @@ export class SessionStreamManager {
|
|
|
1590
1609
|
machineJwt: this.machineJwt,
|
|
1591
1610
|
history: bridgeHistory,
|
|
1592
1611
|
memorySnapshot,
|
|
1612
|
+
onCloudAgentsAuthRejected: this.onCloudAgentsAuthRejected
|
|
1613
|
+
? (reason) => this.onCloudAgentsAuthRejected(reason)
|
|
1614
|
+
: undefined,
|
|
1593
1615
|
emit: (event) => this.handleBridgeEvent(stream, event),
|
|
1594
1616
|
onAssistantMessageComplete: ({ messageId, content, eventsJsonl, nativeResponseId, }) => {
|
|
1595
1617
|
try {
|