@aexol/spectral 0.9.147 → 0.9.148
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 +6 -28
- package/dist/agent/agents.d.ts.map +1 -1
- package/dist/agent/agents.js +75 -95
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +9 -3
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +2 -0
- package/dist/relay/dispatcher.d.ts +2 -1
- package/dist/relay/dispatcher.d.ts.map +1 -1
- package/dist/relay/dispatcher.js +16 -1
- package/dist/server/agent-bridge.d.ts.map +1 -1
- package/dist/server/agent-bridge.js +5 -3
- package/dist/server/handlers/agent-settings.d.ts +1 -1
- package/dist/server/handlers/agent-settings.d.ts.map +1 -1
- package/dist/server/handlers/agent-settings.js +2 -2
- package/package.json +1 -1
package/dist/agent/agents.d.ts
CHANGED
|
@@ -1,21 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent discovery and configuration for the subagent delegation extension.
|
|
3
|
-
*
|
|
4
|
-
* Agent definitions are markdown files with YAML frontmatter:
|
|
5
|
-
*
|
|
6
|
-
* ---
|
|
7
|
-
* name: my-agent
|
|
8
|
-
* description: What this agent does
|
|
9
|
-
* mode: subagent # or "primary" to inject into the main system prompt
|
|
10
|
-
* tools: read, grep, find, ls
|
|
11
|
-
* model: claude-haiku-4-5
|
|
12
|
-
* ---
|
|
13
|
-
* System prompt for the agent goes here.
|
|
14
|
-
*
|
|
15
|
-
* Locations:
|
|
16
|
-
* ~/.spectral/agent/agents/*.md — User-level (always loaded)
|
|
17
|
-
* .spectral/agents/*.md — Project-level (opt-in via agentScope)
|
|
18
|
-
*/
|
|
19
1
|
export type AgentScope = "user" | "project" | "both";
|
|
20
2
|
export type AgentMode = "primary" | "subagent";
|
|
21
3
|
export interface AgentConfig {
|
|
@@ -32,28 +14,24 @@ export interface AgentDiscoveryResult {
|
|
|
32
14
|
agents: AgentConfig[];
|
|
33
15
|
projectAgentsDir: string | null;
|
|
34
16
|
}
|
|
35
|
-
export declare function setCloudAgents(agents: AgentConfig[]): void;
|
|
17
|
+
export declare function setCloudAgents(agents: AgentConfig[], teamId?: string): void;
|
|
36
18
|
export declare function refreshCloudAgents(opts: {
|
|
37
19
|
backendUrl: string;
|
|
38
20
|
machineJwt: string;
|
|
39
21
|
teamId?: string;
|
|
40
22
|
}): Promise<void>;
|
|
41
|
-
export declare function discoverAgents(cwd: string, scope: AgentScope, agentDir?: string): AgentDiscoveryResult;
|
|
42
|
-
export declare function discoverPrimaryAgent(cwd: string, scope?: AgentScope, agentDir?: string): AgentConfig | null;
|
|
23
|
+
export declare function discoverAgents(cwd: string, scope: AgentScope, agentDir?: string, teamId?: string): AgentDiscoveryResult;
|
|
24
|
+
export declare function discoverPrimaryAgent(cwd: string, scope?: AgentScope, agentDir?: string, teamId?: string): AgentConfig | null;
|
|
43
25
|
/**
|
|
44
26
|
* Prepend the primary agent's system prompt above the base system prompt.
|
|
45
27
|
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
28
|
+
* The block is separated from the base by a `\n\n---\n\n` delimiter so that
|
|
29
|
+
* `stripInjectedPrimaryAgentPrompt` can reliably locate and remove it when
|
|
30
|
+
* building subagent system prompts.
|
|
49
31
|
*
|
|
50
32
|
* - Returns the base unchanged when no primary agent is provided.
|
|
51
33
|
* - Idempotent: if the base already starts with the primary agent header,
|
|
52
34
|
* the base is returned unchanged (guards against double-injection).
|
|
53
35
|
*/
|
|
54
36
|
export declare function injectPrimaryAgentPrompt(base: string | undefined, primaryAgent: Pick<AgentConfig, "name" | "description" | "systemPrompt"> | null): string | undefined;
|
|
55
|
-
export declare function formatAgentList(agents: AgentConfig[], maxItems: number): {
|
|
56
|
-
text: string;
|
|
57
|
-
remaining: number;
|
|
58
|
-
};
|
|
59
37
|
//# sourceMappingURL=agents.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/agent/agents.ts"],"names":[],"mappings":"
|
|
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,EAAE,CAAC;IACjB,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;AA2CD,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAI3E;AACD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCzH;AAYD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,oBAAoB,CAWvH;AACD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,UAAmB,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAWpI;AACD;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,cAAc,CAAC,GAAG,IAAI,GAC9E,MAAM,GAAG,SAAS,CAOpB"}
|
package/dist/agent/agents.js
CHANGED
|
@@ -1,30 +1,11 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent discovery and configuration for the subagent delegation extension.
|
|
3
|
-
*
|
|
4
|
-
* Agent definitions are markdown files with YAML frontmatter:
|
|
5
|
-
*
|
|
6
|
-
* ---
|
|
7
|
-
* name: my-agent
|
|
8
|
-
* description: What this agent does
|
|
9
|
-
* mode: subagent # or "primary" to inject into the main system prompt
|
|
10
|
-
* tools: read, grep, find, ls
|
|
11
|
-
* model: claude-haiku-4-5
|
|
12
|
-
* ---
|
|
13
|
-
* System prompt for the agent goes here.
|
|
14
|
-
*
|
|
15
|
-
* Locations:
|
|
16
|
-
* ~/.spectral/agent/agents/*.md — User-level (always loaded)
|
|
17
|
-
* .spectral/agents/*.md — Project-level (opt-in via agentScope)
|
|
18
|
-
*/
|
|
19
1
|
import * as fs from "node:fs";
|
|
20
2
|
import * as path from "node:path";
|
|
21
3
|
import chalk from "chalk";
|
|
22
4
|
import { getAgentDir, parseFrontmatter } from "../sdk/coding-agent/index.js";
|
|
23
5
|
function loadAgentsFromDir(dir, source) {
|
|
24
6
|
const agents = [];
|
|
25
|
-
if (!fs.existsSync(dir))
|
|
7
|
+
if (!fs.existsSync(dir))
|
|
26
8
|
return agents;
|
|
27
|
-
}
|
|
28
9
|
let entries;
|
|
29
10
|
try {
|
|
30
11
|
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
@@ -33,9 +14,7 @@ function loadAgentsFromDir(dir, source) {
|
|
|
33
14
|
return agents;
|
|
34
15
|
}
|
|
35
16
|
for (const entry of entries) {
|
|
36
|
-
if (!entry.name.endsWith(".md"))
|
|
37
|
-
continue;
|
|
38
|
-
if (!entry.isFile() && !entry.isSymbolicLink())
|
|
17
|
+
if (!entry.name.endsWith(".md") || (!entry.isFile() && !entry.isSymbolicLink()))
|
|
39
18
|
continue;
|
|
40
19
|
const filePath = path.join(dir, entry.name);
|
|
41
20
|
let content;
|
|
@@ -46,18 +25,13 @@ function loadAgentsFromDir(dir, source) {
|
|
|
46
25
|
continue;
|
|
47
26
|
}
|
|
48
27
|
const { frontmatter, body } = parseFrontmatter(content);
|
|
49
|
-
if (!frontmatter.name || !frontmatter.description)
|
|
28
|
+
if (!frontmatter.name || !frontmatter.description)
|
|
50
29
|
continue;
|
|
51
|
-
|
|
52
|
-
const tools = frontmatter.tools
|
|
53
|
-
?.split(",")
|
|
54
|
-
.map((t) => t.trim())
|
|
55
|
-
.filter(Boolean);
|
|
56
|
-
const mode = frontmatter.mode === "primary" ? "primary" : "subagent";
|
|
30
|
+
const tools = frontmatter.tools?.split(",").map((t) => t.trim()).filter(Boolean);
|
|
57
31
|
agents.push({
|
|
58
32
|
name: frontmatter.name,
|
|
59
33
|
description: frontmatter.description,
|
|
60
|
-
mode,
|
|
34
|
+
mode: frontmatter.mode === "primary" ? "primary" : "subagent",
|
|
61
35
|
tools: tools && tools.length > 0 ? tools : undefined,
|
|
62
36
|
model: frontmatter.model,
|
|
63
37
|
systemPrompt: body,
|
|
@@ -67,43 +41,69 @@ function loadAgentsFromDir(dir, source) {
|
|
|
67
41
|
}
|
|
68
42
|
return agents;
|
|
69
43
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
44
|
+
const LEGACY_CLOUD_TEAM = "__legacy__";
|
|
45
|
+
const cloudAgentsByTeam = new Map();
|
|
46
|
+
function getCloudAgentCache(teamId) {
|
|
47
|
+
let cache = cloudAgentsByTeam.get(teamId);
|
|
48
|
+
if (!cache) {
|
|
49
|
+
cache = { agents: [], generation: 0, requestSequence: 0 };
|
|
50
|
+
cloudAgentsByTeam.set(teamId, cache);
|
|
51
|
+
}
|
|
52
|
+
return cache;
|
|
53
|
+
}
|
|
54
|
+
export function setCloudAgents(agents, teamId) {
|
|
55
|
+
const cache = getCloudAgentCache(teamId ?? LEGACY_CLOUD_TEAM);
|
|
56
|
+
cache.generation += 1;
|
|
57
|
+
cache.agents = agents.map((agent) => ({ ...agent, source: "cloud" }));
|
|
73
58
|
}
|
|
74
59
|
export async function refreshCloudAgents(opts) {
|
|
75
60
|
if (!opts.teamId)
|
|
76
61
|
return;
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
62
|
+
const teamId = opts.teamId;
|
|
63
|
+
const cache = getCloudAgentCache(teamId);
|
|
64
|
+
if (cache.inFlight)
|
|
65
|
+
return cache.inFlight;
|
|
66
|
+
const requestSequence = ++cache.requestSequence;
|
|
67
|
+
const generation = cache.generation;
|
|
68
|
+
let refresh;
|
|
69
|
+
refresh = (async () => {
|
|
70
|
+
try {
|
|
71
|
+
const response = await fetch(`${opts.backendUrl.replace(/\/$/, "")}/graphql`, {
|
|
72
|
+
method: "POST",
|
|
73
|
+
headers: { "content-type": "application/json", authorization: `Bearer ${opts.machineJwt}`, "x-team-id": teamId },
|
|
74
|
+
body: JSON.stringify({ query: `query CloudAgents($teamId: ID!) { agents(teamId: $teamId) { name description systemPrompt tools model mode scope } }`, variables: { teamId } }),
|
|
75
|
+
});
|
|
76
|
+
if (!response.ok)
|
|
77
|
+
return;
|
|
78
|
+
const payload = await response.json();
|
|
79
|
+
const fetched = payload.data?.agents ?? [];
|
|
80
|
+
const agents = fetched.filter((a) => typeof a.name === "string" && typeof a.description === "string" && typeof a.systemPrompt === "string").map((a) => ({
|
|
81
|
+
name: a.name, description: a.description,
|
|
82
|
+
mode: a.mode === "PRIMARY" ? "primary" : "subagent",
|
|
83
|
+
tools: Array.isArray(a.tools) ? a.tools.filter((t) => typeof t === "string") : undefined,
|
|
84
|
+
model: typeof a.model === "string" ? a.model : undefined,
|
|
85
|
+
systemPrompt: a.systemPrompt, source: "cloud", filePath: `cloud:${a.name}`,
|
|
86
|
+
}));
|
|
87
|
+
if (cache.generation === generation && cache.requestSequence === requestSequence) {
|
|
88
|
+
cache.generation += 1;
|
|
89
|
+
cache.agents = agents;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
cache.inFlight = undefined;
|
|
96
|
+
}
|
|
97
|
+
})();
|
|
98
|
+
cache.inFlight = refresh;
|
|
99
|
+
return refresh;
|
|
98
100
|
}
|
|
99
|
-
function isDirectory(p) {
|
|
100
|
-
|
|
101
|
-
return fs.statSync(p).isDirectory();
|
|
102
|
-
}
|
|
103
|
-
catch {
|
|
104
|
-
return false;
|
|
105
|
-
}
|
|
101
|
+
function isDirectory(p) { try {
|
|
102
|
+
return fs.statSync(p).isDirectory();
|
|
106
103
|
}
|
|
104
|
+
catch {
|
|
105
|
+
return false;
|
|
106
|
+
} }
|
|
107
107
|
function findNearestProjectAgentsDir(cwd) {
|
|
108
108
|
let currentDir = cwd;
|
|
109
109
|
while (true) {
|
|
@@ -116,37 +116,27 @@ function findNearestProjectAgentsDir(cwd) {
|
|
|
116
116
|
currentDir = parentDir;
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
|
-
export function discoverAgents(cwd, scope, agentDir) {
|
|
119
|
+
export function discoverAgents(cwd, scope, agentDir, teamId) {
|
|
120
120
|
const userDir = path.join(agentDir ?? getAgentDir(), "agents");
|
|
121
121
|
const projectAgentsDir = findNearestProjectAgentsDir(cwd);
|
|
122
122
|
const userAgents = scope === "project" ? [] : loadAgentsFromDir(userDir, "user");
|
|
123
123
|
const projectAgents = scope === "user" || !projectAgentsDir ? [] : loadAgentsFromDir(projectAgentsDir, "project");
|
|
124
|
+
const cloudAgents = scope === "both" ? getCloudAgentCache(teamId ?? LEGACY_CLOUD_TEAM).agents : [];
|
|
124
125
|
const agentMap = new Map();
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
agentMap.set(agent.name, agent);
|
|
132
|
-
}
|
|
133
|
-
else if (scope === "user") {
|
|
134
|
-
for (const agent of userAgents)
|
|
135
|
-
agentMap.set(agent.name, agent);
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
for (const agent of projectAgents)
|
|
139
|
-
agentMap.set(agent.name, agent);
|
|
140
|
-
}
|
|
126
|
+
for (const agent of cloudAgents)
|
|
127
|
+
agentMap.set(agent.name, agent);
|
|
128
|
+
for (const agent of projectAgents)
|
|
129
|
+
agentMap.set(agent.name, agent);
|
|
130
|
+
for (const agent of userAgents)
|
|
131
|
+
agentMap.set(agent.name, agent);
|
|
141
132
|
return { agents: Array.from(agentMap.values()), projectAgentsDir };
|
|
142
133
|
}
|
|
143
|
-
export function discoverPrimaryAgent(cwd, scope = "both", agentDir) {
|
|
144
|
-
const { agents } = discoverAgents(cwd, scope, agentDir);
|
|
134
|
+
export function discoverPrimaryAgent(cwd, scope = "both", agentDir, teamId) {
|
|
135
|
+
const { agents } = discoverAgents(cwd, scope, agentDir, teamId);
|
|
145
136
|
const primaries = agents.filter((a) => a.mode === "primary");
|
|
146
137
|
if (primaries.length === 0)
|
|
147
138
|
return null;
|
|
148
139
|
if (primaries.length > 1) {
|
|
149
|
-
// User-level primary wins over project-level primary; otherwise first wins.
|
|
150
140
|
const userPrimary = primaries.find((a) => a.source === "user");
|
|
151
141
|
const chosen = userPrimary ?? primaries[0];
|
|
152
142
|
console.warn(chalk.yellow(`Multiple primary agents found (${primaries.map((a) => a.name).join(", ")}). Using "${chosen.name}".`));
|
|
@@ -157,9 +147,9 @@ export function discoverPrimaryAgent(cwd, scope = "both", agentDir) {
|
|
|
157
147
|
/**
|
|
158
148
|
* Prepend the primary agent's system prompt above the base system prompt.
|
|
159
149
|
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
*
|
|
150
|
+
* The block is separated from the base by a `\n\n---\n\n` delimiter so that
|
|
151
|
+
* `stripInjectedPrimaryAgentPrompt` can reliably locate and remove it when
|
|
152
|
+
* building subagent system prompts.
|
|
163
153
|
*
|
|
164
154
|
* - Returns the base unchanged when no primary agent is provided.
|
|
165
155
|
* - Idempotent: if the base already starts with the primary agent header,
|
|
@@ -176,13 +166,3 @@ export function injectPrimaryAgentPrompt(base, primaryAgent) {
|
|
|
176
166
|
return base;
|
|
177
167
|
return `${block}\n\n---\n\n${base}`;
|
|
178
168
|
}
|
|
179
|
-
export function formatAgentList(agents, maxItems) {
|
|
180
|
-
if (agents.length === 0)
|
|
181
|
-
return { text: "none", remaining: 0 };
|
|
182
|
-
const listed = agents.slice(0, maxItems);
|
|
183
|
-
const remaining = agents.length - listed.length;
|
|
184
|
-
return {
|
|
185
|
-
text: listed.map((a) => `${a.name} (${a.source}): ${a.description}`).join("; "),
|
|
186
|
-
remaining,
|
|
187
|
-
};
|
|
188
|
-
}
|
|
@@ -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,EAAE,KAAK,WAAW,EAAmC,MAAM,aAAa,CAAC;AAEhF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAOrD,OAAO,KAAK,EAAE,gBAAgB,IAAI,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AA4F7G,wBAAgB,+BAA+B,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,
|
|
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,EAAE,KAAK,WAAW,EAAmC,MAAM,aAAa,CAAC;AAEhF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAOrD,OAAO,KAAK,EAAE,gBAAgB,IAAI,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AA4F7G,wBAAgB,+BAA+B,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAapG;AAED,wBAAgB,yBAAyB,CACxC,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,CAAC,GAC/C,MAAM,CAKR;AAiHD;;;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,CAqCb;AA4aD,MAAM,CAAC,OAAO,UAAU,iBAAiB,CACxC,GAAG,EAAE,YAAY,EACjB,IAAI,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAA;CAAE,GACpF,IAAI,CAgZN"}
|
package/dist/agent/index.js
CHANGED
|
@@ -120,13 +120,19 @@ function compactProgressMessage(value) {
|
|
|
120
120
|
export function stripInjectedPrimaryAgentPrompt(systemPrompt) {
|
|
121
121
|
if (!systemPrompt)
|
|
122
122
|
return systemPrompt;
|
|
123
|
-
|
|
123
|
+
const headerIndex = systemPrompt.indexOf(PRIMARY_AGENT_PROMPT_HEADER);
|
|
124
|
+
if (headerIndex === -1)
|
|
124
125
|
return systemPrompt;
|
|
125
|
-
const delimiterIndex = systemPrompt.indexOf(PRIMARY_AGENT_PROMPT_DELIMITER);
|
|
126
|
+
const delimiterIndex = systemPrompt.indexOf(PRIMARY_AGENT_PROMPT_DELIMITER, headerIndex);
|
|
126
127
|
if (delimiterIndex === -1)
|
|
127
128
|
return undefined;
|
|
129
|
+
// Keep anything before the injected primary block (e.g. a provider host
|
|
130
|
+
// preamble) and everything after the delimiter that separates the primary
|
|
131
|
+
// block from the shared base prompt.
|
|
132
|
+
const prefix = systemPrompt.slice(0, headerIndex);
|
|
128
133
|
const basePrompt = systemPrompt.slice(delimiterIndex + PRIMARY_AGENT_PROMPT_DELIMITER.length);
|
|
129
|
-
|
|
134
|
+
const combined = `${prefix}${basePrompt}`.trim();
|
|
135
|
+
return combined.length > 0 ? combined : undefined;
|
|
130
136
|
}
|
|
131
137
|
export function buildSubagentSystemPrompt(baseSystemPrompt, agent) {
|
|
132
138
|
const sharedSystemPrompt = stripInjectedPrimaryAgentPrompt(baseSystemPrompt);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AA0BH,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;AAsBrE;;;;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,CAkelF;AA+DD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAa5E"}
|
package/dist/commands/serve.js
CHANGED
|
@@ -36,6 +36,7 @@ import { readStudioBinding } from "../studio-binding.js";
|
|
|
36
36
|
import { NATIVE_EXTENSIONS, buildNativeExtensionsInfo } from "../sdk/coding-agent/core/extensions/native-extensions.js";
|
|
37
37
|
import { SettingsManager } from "../sdk/coding-agent/core/settings-manager.js";
|
|
38
38
|
import { getAgentDir } from "../sdk/coding-agent/config.js";
|
|
39
|
+
import { refreshCloudAgents as refreshCloudAgentsImpl } from "../agent/agents.js";
|
|
39
40
|
import { requireLogin } from "../preflight.js";
|
|
40
41
|
import { RelayClient } from "../relay/client.js";
|
|
41
42
|
import { detachAllSubscribers, handleAutoOptimizeFrame, handleAutoResearchFrame, handleCancelTurn, handleClientMessage, handleRestRequest, handleSubscribe, } from "../relay/dispatcher.js";
|
|
@@ -247,6 +248,7 @@ export async function runServe(opts = {}) {
|
|
|
247
248
|
publishMetaEvent: deferredPublishMetaEvent,
|
|
248
249
|
mcpState: getLiveMcpState() ?? undefined,
|
|
249
250
|
refreshNativeExtensions: () => refreshNativeExtensionsInfo(cwd, r, registration.record.machineId),
|
|
251
|
+
refreshCloudAgents: (teamId) => refreshCloudAgentsImpl({ backendUrl, machineJwt: registration.record.machineJwt, teamId }),
|
|
250
252
|
}).then((response) => {
|
|
251
253
|
r.send(response);
|
|
252
254
|
});
|
|
@@ -48,7 +48,7 @@ import type { RelayClient } from "./client.js";
|
|
|
48
48
|
* `id` is populated when the route had an `:id` placeholder.
|
|
49
49
|
*/
|
|
50
50
|
interface RouteMatch {
|
|
51
|
-
route: "list_projects" | "create_project" | "update_project" | "delete_project" | "bind_studio" | "unbind_studio" | "get_project_observations" | "list_project_sessions" | "cleanup_project_sessions" | "create_session" | "get_session" | "get_session_active_agent" | "update_session_active_agent" | "get_session_messages" | "update_session" | "delete_session" | "get_session_memory" | "get_session_memory_details" | "compact_session" | "remember_and_delete_session" | "fork_session" | "list_path_autocomplete" | "pick_directory" | "list_directory" | "get_home_directory" | "search_project_files" | "enqueue_prompt" | "get_prompt_queue" | "remove_prompt" | "clear_prompt_queue" | "list_mcp_status" | "reload_mcp_config" | "refresh_native_extensions" | "get_settings" | "put_settings" | "get_agent_settings" | "put_agent_settings" | "get_prompt_mutation_settings" | "put_prompt_mutation_settings" | "wizard_login" | "list_agents";
|
|
51
|
+
route: "list_projects" | "create_project" | "update_project" | "delete_project" | "bind_studio" | "unbind_studio" | "get_project_observations" | "list_project_sessions" | "cleanup_project_sessions" | "create_session" | "get_session" | "get_session_active_agent" | "update_session_active_agent" | "get_session_messages" | "update_session" | "delete_session" | "get_session_memory" | "get_session_memory_details" | "compact_session" | "remember_and_delete_session" | "fork_session" | "list_path_autocomplete" | "pick_directory" | "list_directory" | "get_home_directory" | "search_project_files" | "enqueue_prompt" | "get_prompt_queue" | "remove_prompt" | "clear_prompt_queue" | "list_mcp_status" | "reload_mcp_config" | "refresh_native_extensions" | "refresh_cloud_agents" | "get_settings" | "put_settings" | "get_agent_settings" | "put_agent_settings" | "get_prompt_mutation_settings" | "put_prompt_mutation_settings" | "wizard_login" | "list_agents";
|
|
52
52
|
id?: string;
|
|
53
53
|
/** Parsed query params, if the path carried a `?...` suffix. */
|
|
54
54
|
query?: URLSearchParams;
|
|
@@ -103,6 +103,7 @@ export interface RestRequestDeps {
|
|
|
103
103
|
*/
|
|
104
104
|
publishMetaEvent?: PublishMetaEvent;
|
|
105
105
|
refreshNativeExtensions?: () => Promise<void>;
|
|
106
|
+
refreshCloudAgents?: (teamId: string) => Promise<void>;
|
|
106
107
|
startWizardLogin?: () => Promise<WizardLoginResult>;
|
|
107
108
|
}
|
|
108
109
|
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,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,
|
|
1
|
+
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/relay/dispatcher.ts"],"names":[],"mappings":"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"}
|
package/dist/relay/dispatcher.js
CHANGED
|
@@ -90,6 +90,11 @@ export function matchRoute(method, path) {
|
|
|
90
90
|
return { route: "refresh_native_extensions" };
|
|
91
91
|
return null;
|
|
92
92
|
}
|
|
93
|
+
if (cleanPath === "/api/cloud-agents/refresh") {
|
|
94
|
+
if (method === "POST")
|
|
95
|
+
return { route: "refresh_cloud_agents" };
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
93
98
|
if (cleanPath === "/api/wizard/login") {
|
|
94
99
|
if (method === "POST")
|
|
95
100
|
return { route: "wizard_login" };
|
|
@@ -1007,6 +1012,15 @@ async function dispatchRoute(match, body, deps) {
|
|
|
1007
1012
|
await deps.refreshNativeExtensions();
|
|
1008
1013
|
return { ok: true };
|
|
1009
1014
|
}
|
|
1015
|
+
case "refresh_cloud_agents": {
|
|
1016
|
+
const teamId = asObject(body).teamId;
|
|
1017
|
+
if (typeof teamId !== "string" || teamId.length === 0) {
|
|
1018
|
+
throw new BadRequestError("teamId is required");
|
|
1019
|
+
}
|
|
1020
|
+
if (deps.refreshCloudAgents)
|
|
1021
|
+
await deps.refreshCloudAgents(teamId);
|
|
1022
|
+
return { ok: true };
|
|
1023
|
+
}
|
|
1010
1024
|
case "wizard_login": {
|
|
1011
1025
|
return await (deps.startWizardLogin ?? (() => startWizardLogin(deps.cwd ?? homedir())))();
|
|
1012
1026
|
}
|
|
@@ -1024,7 +1038,8 @@ async function dispatchRoute(match, body, deps) {
|
|
|
1024
1038
|
return handlePutPromptMutationSettings(deps.cwd ?? homedir(), asObject(body), deps.agentDir);
|
|
1025
1039
|
case "list_agents": {
|
|
1026
1040
|
const agentCwd = match.query?.get("cwd") || deps.cwd || homedir();
|
|
1027
|
-
|
|
1041
|
+
const teamId = match.query?.get("teamId") || undefined;
|
|
1042
|
+
return handleListAgents(agentCwd, deps.agentDir, teamId);
|
|
1028
1043
|
}
|
|
1029
1044
|
}
|
|
1030
1045
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-bridge.d.ts","sourceRoot":"","sources":["../../src/server/agent-bridge.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"agent-bridge.d.ts","sourceRoot":"","sources":["../../src/server/agent-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -632,14 +632,14 @@ export class AgentBridge {
|
|
|
632
632
|
const settings = loadAgentSettings(this.opts.cwd, this.opts.agentDir);
|
|
633
633
|
if (!settings.primaryAgentEnabled)
|
|
634
634
|
return;
|
|
635
|
-
const agents = discoverAgents(this.opts.cwd, "both", this.opts.agentDir).agents;
|
|
635
|
+
const agents = discoverAgents(this.opts.cwd, "both", this.opts.agentDir, this.opts.teamId).agents;
|
|
636
636
|
const selectedName = this.opts.activePrimaryAgent === undefined
|
|
637
637
|
? settings.activePrimaryAgent
|
|
638
638
|
: this.opts.activePrimaryAgent;
|
|
639
639
|
const selected = selectedName && selectedName !== "__auto__"
|
|
640
640
|
? agents.find((agent) => agent.mode === "primary" && agent.name === selectedName)
|
|
641
641
|
: undefined;
|
|
642
|
-
const primaryAgent = selectedName === "__auto__" ? discoverPrimaryAgent(this.opts.cwd, "both", this.opts.agentDir) : selected ?? discoverPrimaryAgent(this.opts.cwd, "both", this.opts.agentDir);
|
|
642
|
+
const primaryAgent = selectedName === "__auto__" ? discoverPrimaryAgent(this.opts.cwd, "both", this.opts.agentDir, this.opts.teamId) : selected ?? discoverPrimaryAgent(this.opts.cwd, "both", this.opts.agentDir, this.opts.teamId);
|
|
643
643
|
const injected = injectPrimaryAgentPrompt(event.systemPrompt, primaryAgent);
|
|
644
644
|
if (injected === event.systemPrompt)
|
|
645
645
|
return;
|
|
@@ -660,7 +660,9 @@ export class AgentBridge {
|
|
|
660
660
|
];
|
|
661
661
|
// Always register subagent tool — execute() checks settings from disk
|
|
662
662
|
// on every invocation, so toggling takes effect immediately (no restart).
|
|
663
|
-
|
|
663
|
+
// Register subagent's prompt snapshot handler before the primary-agent
|
|
664
|
+
// injector so it observes the unmodified shared system prompt.
|
|
665
|
+
extensionFactories.splice(0, 0, async (ext) => {
|
|
664
666
|
subagentExt(ext, {
|
|
665
667
|
disabledAgents: [],
|
|
666
668
|
emitSubagentEvent: (event) => this.emitAndBuffer(event),
|
|
@@ -46,7 +46,7 @@ export interface AgentInfo {
|
|
|
46
46
|
mode: string;
|
|
47
47
|
source: string;
|
|
48
48
|
}
|
|
49
|
-
export declare function handleListAgents(cwd: string, agentDir?: string): {
|
|
49
|
+
export declare function handleListAgents(cwd: string, agentDir?: string, teamId?: string): {
|
|
50
50
|
agents: AgentInfo[];
|
|
51
51
|
};
|
|
52
52
|
//# sourceMappingURL=agent-settings.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-settings.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/agent-settings.ts"],"names":[],"mappings":"AAOA;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,wEAAwE;IACxE,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,eAAO,MAAM,uBAAuB,EAAE,aAKrC,CAAC;AAKF,MAAM,WAAW,qBAAqB;IACpC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,sBAAuB,SAAQ,aAAa;IAC3D,EAAE,EAAE,IAAI,CAAC;CACV;AAkCD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,MAAM,GAChB,aAAa,CAQf;AAED,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,MAAM,GAChB,aAAa,CAEf;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,qBAAqB,EAC3B,QAAQ,CAAC,EAAE,MAAM,GAChB,sBAAsB,CAqDxB;AAMD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"agent-settings.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/agent-settings.ts"],"names":[],"mappings":"AAOA;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,wEAAwE;IACxE,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,eAAO,MAAM,uBAAuB,EAAE,aAKrC,CAAC;AAKF,MAAM,WAAW,qBAAqB;IACpC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,sBAAuB,SAAQ,aAAa;IAC3D,EAAE,EAAE,IAAI,CAAC;CACV;AAkCD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,MAAM,GAChB,aAAa,CAQf;AAED,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,MAAM,GAChB,aAAa,CAEf;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,qBAAqB,EAC3B,QAAQ,CAAC,EAAE,MAAM,GAChB,sBAAsB,CAqDxB;AAMD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd;IAAE,MAAM,EAAE,SAAS,EAAE,CAAA;CAAE,CAUzB"}
|
|
@@ -114,8 +114,8 @@ export function handlePutAgentSettings(cwd, body, agentDir) {
|
|
|
114
114
|
// caller sees the effective state, not just what we wrote.
|
|
115
115
|
return { ok: true, ...loadAgentSettings(cwd, agentDir) };
|
|
116
116
|
}
|
|
117
|
-
export function handleListAgents(cwd, agentDir) {
|
|
118
|
-
const { agents } = discoverAgents(cwd, "both", agentDir);
|
|
117
|
+
export function handleListAgents(cwd, agentDir, teamId) {
|
|
118
|
+
const { agents } = discoverAgents(cwd, "both", agentDir, teamId);
|
|
119
119
|
return {
|
|
120
120
|
agents: agents.map((a) => ({
|
|
121
121
|
name: a.name,
|