@aexol/spectral 0.9.146 → 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 +12 -28
- package/dist/agent/agents.d.ts.map +1 -1
- package/dist/agent/agents.js +79 -68
- 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/memory/tools/compact-context.d.ts.map +1 -1
- package/dist/memory/tools/compact-context.js +70 -19
- package/dist/relay/dispatcher.d.ts +2 -1
- package/dist/relay/dispatcher.d.ts.map +1 -1
- package/dist/relay/dispatcher.js +30 -2
- package/dist/server/agent-bridge.d.ts +3 -0
- package/dist/server/agent-bridge.d.ts.map +1 -1
- package/dist/server/agent-bridge.js +13 -3
- package/dist/server/handlers/agent-settings.d.ts +4 -1
- package/dist/server/handlers/agent-settings.d.ts.map +1 -1
- package/dist/server/handlers/agent-settings.js +22 -4
- package/dist/server/handlers/sessions.d.ts +9 -0
- package/dist/server/handlers/sessions.d.ts.map +1 -1
- package/dist/server/handlers/sessions.js +14 -0
- package/dist/server/handlers/settings-lock.d.ts +1 -0
- package/dist/server/handlers/settings-lock.d.ts.map +1 -1
- package/dist/server/handlers/settings-lock.js +1 -1
- package/dist/server/session-stream.d.ts.map +1 -1
- package/dist/server/session-stream.js +4 -0
- package/dist/server/storage.d.ts +4 -0
- package/dist/server/storage.d.ts.map +1 -1
- package/dist/server/storage.js +14 -0
- 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 {
|
|
@@ -25,29 +7,31 @@ export interface AgentConfig {
|
|
|
25
7
|
tools?: string[];
|
|
26
8
|
model?: string;
|
|
27
9
|
systemPrompt: string;
|
|
28
|
-
source: "user" | "project";
|
|
10
|
+
source: "user" | "project" | "cloud";
|
|
29
11
|
filePath: string;
|
|
30
12
|
}
|
|
31
13
|
export interface AgentDiscoveryResult {
|
|
32
14
|
agents: AgentConfig[];
|
|
33
15
|
projectAgentsDir: string | null;
|
|
34
16
|
}
|
|
35
|
-
export declare function
|
|
36
|
-
export declare function
|
|
17
|
+
export declare function setCloudAgents(agents: AgentConfig[], teamId?: string): void;
|
|
18
|
+
export declare function refreshCloudAgents(opts: {
|
|
19
|
+
backendUrl: string;
|
|
20
|
+
machineJwt: string;
|
|
21
|
+
teamId?: string;
|
|
22
|
+
}): Promise<void>;
|
|
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;
|
|
37
25
|
/**
|
|
38
26
|
* Prepend the primary agent's system prompt above the base system prompt.
|
|
39
27
|
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
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.
|
|
43
31
|
*
|
|
44
32
|
* - Returns the base unchanged when no primary agent is provided.
|
|
45
33
|
* - Idempotent: if the base already starts with the primary agent header,
|
|
46
34
|
* the base is returned unchanged (guards against double-injection).
|
|
47
35
|
*/
|
|
48
36
|
export declare function injectPrimaryAgentPrompt(base: string | undefined, primaryAgent: Pick<AgentConfig, "name" | "description" | "systemPrompt"> | null): string | undefined;
|
|
49
|
-
export declare function formatAgentList(agents: AgentConfig[], maxItems: number): {
|
|
50
|
-
text: string;
|
|
51
|
-
remaining: number;
|
|
52
|
-
};
|
|
53
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,14 +41,69 @@ function loadAgentsFromDir(dir, source) {
|
|
|
67
41
|
}
|
|
68
42
|
return agents;
|
|
69
43
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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);
|
|
76
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" }));
|
|
77
58
|
}
|
|
59
|
+
export async function refreshCloudAgents(opts) {
|
|
60
|
+
if (!opts.teamId)
|
|
61
|
+
return;
|
|
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;
|
|
100
|
+
}
|
|
101
|
+
function isDirectory(p) { try {
|
|
102
|
+
return fs.statSync(p).isDirectory();
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return false;
|
|
106
|
+
} }
|
|
78
107
|
function findNearestProjectAgentsDir(cwd) {
|
|
79
108
|
let currentDir = cwd;
|
|
80
109
|
while (true) {
|
|
@@ -87,35 +116,27 @@ function findNearestProjectAgentsDir(cwd) {
|
|
|
87
116
|
currentDir = parentDir;
|
|
88
117
|
}
|
|
89
118
|
}
|
|
90
|
-
export function discoverAgents(cwd, scope, agentDir) {
|
|
119
|
+
export function discoverAgents(cwd, scope, agentDir, teamId) {
|
|
91
120
|
const userDir = path.join(agentDir ?? getAgentDir(), "agents");
|
|
92
121
|
const projectAgentsDir = findNearestProjectAgentsDir(cwd);
|
|
93
122
|
const userAgents = scope === "project" ? [] : loadAgentsFromDir(userDir, "user");
|
|
94
123
|
const projectAgents = scope === "user" || !projectAgentsDir ? [] : loadAgentsFromDir(projectAgentsDir, "project");
|
|
124
|
+
const cloudAgents = scope === "both" ? getCloudAgentCache(teamId ?? LEGACY_CLOUD_TEAM).agents : [];
|
|
95
125
|
const agentMap = new Map();
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
else if (scope === "user") {
|
|
103
|
-
for (const agent of userAgents)
|
|
104
|
-
agentMap.set(agent.name, agent);
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
for (const agent of projectAgents)
|
|
108
|
-
agentMap.set(agent.name, agent);
|
|
109
|
-
}
|
|
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);
|
|
110
132
|
return { agents: Array.from(agentMap.values()), projectAgentsDir };
|
|
111
133
|
}
|
|
112
|
-
export function discoverPrimaryAgent(cwd, scope = "both", agentDir) {
|
|
113
|
-
const { agents } = discoverAgents(cwd, scope, agentDir);
|
|
134
|
+
export function discoverPrimaryAgent(cwd, scope = "both", agentDir, teamId) {
|
|
135
|
+
const { agents } = discoverAgents(cwd, scope, agentDir, teamId);
|
|
114
136
|
const primaries = agents.filter((a) => a.mode === "primary");
|
|
115
137
|
if (primaries.length === 0)
|
|
116
138
|
return null;
|
|
117
139
|
if (primaries.length > 1) {
|
|
118
|
-
// User-level primary wins over project-level primary; otherwise first wins.
|
|
119
140
|
const userPrimary = primaries.find((a) => a.source === "user");
|
|
120
141
|
const chosen = userPrimary ?? primaries[0];
|
|
121
142
|
console.warn(chalk.yellow(`Multiple primary agents found (${primaries.map((a) => a.name).join(", ")}). Using "${chosen.name}".`));
|
|
@@ -126,9 +147,9 @@ export function discoverPrimaryAgent(cwd, scope = "both", agentDir) {
|
|
|
126
147
|
/**
|
|
127
148
|
* Prepend the primary agent's system prompt above the base system prompt.
|
|
128
149
|
*
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
*
|
|
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.
|
|
132
153
|
*
|
|
133
154
|
* - Returns the base unchanged when no primary agent is provided.
|
|
134
155
|
* - Idempotent: if the base already starts with the primary agent header,
|
|
@@ -145,13 +166,3 @@ export function injectPrimaryAgentPrompt(base, primaryAgent) {
|
|
|
145
166
|
return base;
|
|
146
167
|
return `${block}\n\n---\n\n${base}`;
|
|
147
168
|
}
|
|
148
|
-
export function formatAgentList(agents, maxItems) {
|
|
149
|
-
if (agents.length === 0)
|
|
150
|
-
return { text: "none", remaining: 0 };
|
|
151
|
-
const listed = agents.slice(0, maxItems);
|
|
152
|
-
const remaining = agents.length - listed.length;
|
|
153
|
-
return {
|
|
154
|
-
text: listed.map((a) => `${a.name} (${a.source}): ${a.description}`).join("; "),
|
|
155
|
-
remaining,
|
|
156
|
-
};
|
|
157
|
-
}
|
|
@@ -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
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compact-context.d.ts","sourceRoot":"","sources":["../../../src/memory/tools/compact-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,
|
|
1
|
+
{"version":3,"file":"compact-context.d.ts","sourceRoot":"","sources":["../../../src/memory/tools/compact-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAUN,KAAK,gBAAgB,EACrB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAAc,KAAK,YAAY,EAAyB,MAAM,iCAAiC,CAAC;AAKvG,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAY,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAErD,eAAO,MAAM,yBAAyB,oBAAoB,CAAC;AA4O3D;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,OAAO,GAAE;IAC1D,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,iCAAiC,GAAG,wBAAwB,CAAC,CAAC;IACpF,MAAM,CAAC,EAAE,gBAAgB,CAAC;CACrB,GAAG,WAAW,CAAC,OAAO,uBAAuB,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAiBrF;AAqPD,wFAAwF;AACxF,wBAAgB,sCAAsC,CACrD,eAAe,EAAE,YAAY,EAAE,EAC/B,MAAM,GAAE,gBAA4C,EACpD,gBAAgB,CAAC,EAAE,MAAM,GACvB,YAAY,EAAE,CAchB;AAmRD,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CA6UpF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Type } from "../../sdk/ai/index.js";
|
|
2
|
-
import { compactDcpLite, DEFAULT_COMPACTION_POLICY,
|
|
2
|
+
import { compactDcpLite, DEFAULT_COMPACTION_POLICY, estimateTokens, getManualCompactionSettings, normalizeAgentDrivenOlderHistoryKeepRecentTokens, prepareCompaction, decideCompaction, } from "../../sdk/coding-agent/core/compaction/index.js";
|
|
3
3
|
import { defineTool } from "../../sdk/coding-agent/index.js";
|
|
4
4
|
import { buildSessionContext } from "../../sdk/coding-agent/core/session-manager.js";
|
|
5
5
|
import { rawTokensSinceLastCompaction } from "../branch.js";
|
|
@@ -195,6 +195,16 @@ function injectDcpNudgeIntoProviderPayload(payload, nudge) {
|
|
|
195
195
|
return undefined;
|
|
196
196
|
return injectDcpNudgeIntoAnthropicPayload(payload, nudge) ?? injectDcpNudgeIntoOpenAiPayload(payload, nudge);
|
|
197
197
|
}
|
|
198
|
+
function describeProviderPayload(payload) {
|
|
199
|
+
if (!isRecord(payload))
|
|
200
|
+
return typeof payload;
|
|
201
|
+
const keys = Object.keys(payload).sort();
|
|
202
|
+
if (Array.isArray(payload.messages))
|
|
203
|
+
return `messages:${keys.join(",")}`;
|
|
204
|
+
if (Array.isArray(payload.system))
|
|
205
|
+
return `anthropic:${keys.join(",")}`;
|
|
206
|
+
return `object:${keys.join(",")}`;
|
|
207
|
+
}
|
|
198
208
|
/**
|
|
199
209
|
* Creates an invocation-local provider payload hook for isolated agent loops.
|
|
200
210
|
* The values are snapshotted at invocation start; no Runtime, SessionManager, or
|
|
@@ -234,7 +244,9 @@ function safeRawTokensForContext(ctx) {
|
|
|
234
244
|
}
|
|
235
245
|
function rawTokensForCurrentMessages(messages) {
|
|
236
246
|
try {
|
|
237
|
-
|
|
247
|
+
// Assistant usage includes the complete provider input (system prompt and
|
|
248
|
+
// transport overhead), not only the conversation that this hook can prune.
|
|
249
|
+
return messages.reduce((total, message) => total + estimateTokens(message), 0);
|
|
238
250
|
}
|
|
239
251
|
catch {
|
|
240
252
|
return 0;
|
|
@@ -375,7 +387,7 @@ function createVirtualCompactionEntry(pathEntries, result) {
|
|
|
375
387
|
fromHook: false,
|
|
376
388
|
};
|
|
377
389
|
}
|
|
378
|
-
function buildRequestTimePrunedMessages(ctx, request, policy, currentMessages) {
|
|
390
|
+
function buildRequestTimePrunedMessages(ctx, request, policy, currentMessages, onFailure) {
|
|
379
391
|
// During an active provider request the event payload is the source of truth.
|
|
380
392
|
// The session branch can lag behind it (notably while a tool result or the
|
|
381
393
|
// current assistant turn is still being appended), which used to make the
|
|
@@ -390,10 +402,10 @@ function buildRequestTimePrunedMessages(ctx, request, policy, currentMessages) {
|
|
|
390
402
|
timestamp: new Date(index).toISOString(),
|
|
391
403
|
message,
|
|
392
404
|
}));
|
|
393
|
-
const fromCurrentMessages = buildRequestTimePrunedMessagesFromEntries(currentEntries, request, policy, currentMessages);
|
|
405
|
+
const fromCurrentMessages = buildRequestTimePrunedMessagesFromEntries(currentEntries, request, policy, currentMessages, onFailure);
|
|
394
406
|
if (fromCurrentMessages)
|
|
395
407
|
return fromCurrentMessages;
|
|
396
|
-
return buildRequestTimePrunedMessagesFromEntries(getBranchEntries(ctx), request, policy, currentMessages);
|
|
408
|
+
return buildRequestTimePrunedMessagesFromEntries(getBranchEntries(ctx), request, policy, currentMessages, onFailure);
|
|
397
409
|
}
|
|
398
410
|
/** Request-time DCP adapter for isolated loops: it borrows only pure policy helpers. */
|
|
399
411
|
export function buildIsolatedRequestTimePrunedMessages(currentMessages, policy = DEFAULT_COMPACTION_POLICY, keepRecentTokens) {
|
|
@@ -406,23 +418,32 @@ export function buildIsolatedRequestTimePrunedMessages(currentMessages, policy =
|
|
|
406
418
|
}));
|
|
407
419
|
return buildRequestTimePrunedMessagesFromEntries(syntheticEntries, { source: "auto", mode: "request_time", scope: "older_history", keepRecentTokens, phaseBoundary: false, minRawTokens: 0 }, policy, currentMessages)?.messages ?? currentMessages;
|
|
408
420
|
}
|
|
409
|
-
function buildRequestTimePrunedMessagesFromEntries(pathEntries, request, policy, currentMessages) {
|
|
421
|
+
function buildRequestTimePrunedMessagesFromEntries(pathEntries, request, policy, currentMessages, onFailure) {
|
|
410
422
|
const settings = getRequestTimeCompactionSettings(request, policy);
|
|
411
423
|
const preparation = prepareCompaction(pathEntries, settings, { phaseBoundary: request.phaseBoundary });
|
|
412
|
-
if (!preparation)
|
|
424
|
+
if (!preparation) {
|
|
425
|
+
onFailure?.("prepare_compaction_returned_undefined");
|
|
413
426
|
return undefined;
|
|
427
|
+
}
|
|
414
428
|
const result = compactDcpLite(preparation);
|
|
415
|
-
const tokensRemoved = result.tokensRemoved ?? 0;
|
|
416
|
-
if (tokensRemoved <= 0)
|
|
417
|
-
return undefined;
|
|
429
|
+
const tokensRemoved = Math.max(0, result.tokensRemoved ?? 0);
|
|
418
430
|
const virtualCompaction = createVirtualCompactionEntry(pathEntries, result);
|
|
419
431
|
const virtualContext = buildSessionContext([...pathEntries, virtualCompaction]);
|
|
420
|
-
if (virtualContext.messages.length === 0)
|
|
432
|
+
if (virtualContext.messages.length === 0) {
|
|
433
|
+
onFailure?.("virtual_context_has_no_messages");
|
|
421
434
|
return undefined;
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
435
|
+
}
|
|
436
|
+
// Compare actual message payloads, not assistant usage. Usage remains on
|
|
437
|
+
// retained assistant messages and otherwise makes the virtual context look
|
|
438
|
+
// exactly as large as the original provider request.
|
|
439
|
+
const originalTokens = currentMessages.reduce((total, message) => total + estimateTokens(message), 0);
|
|
440
|
+
const prunedTokens = virtualContext.messages.reduce((total, message) => total + estimateTokens(message), 0);
|
|
441
|
+
if (prunedTokens >= originalTokens) {
|
|
442
|
+
onFailure?.(tokensRemoved <= 0
|
|
443
|
+
? `summary_removed_zero_tokens:${originalTokens}->${prunedTokens}`
|
|
444
|
+
: `pruned_context_not_smaller:${originalTokens}->${prunedTokens}`);
|
|
425
445
|
return undefined;
|
|
446
|
+
}
|
|
426
447
|
return { messages: virtualContext.messages, tokensRemoved, originalTokens, prunedTokens };
|
|
427
448
|
}
|
|
428
449
|
function notifyDcp(ctx, message, level, telemetry) {
|
|
@@ -663,9 +684,16 @@ export function registerCompactContextTool(ext, runtime) {
|
|
|
663
684
|
notifyRequestTimeSkip(ctx, "not enough raw material since the last compaction", "insufficient_raw_material", request);
|
|
664
685
|
return;
|
|
665
686
|
}
|
|
666
|
-
|
|
687
|
+
let pruneFailure;
|
|
688
|
+
const pruned = buildRequestTimePrunedMessages(ctx, request, policy, _event.messages, (reason) => {
|
|
689
|
+
pruneFailure = reason;
|
|
690
|
+
});
|
|
667
691
|
if (!pruned) {
|
|
668
692
|
notifyRequestTimeSkip(ctx, "virtual summary would not shrink the next request", "non_shrinking_summary", request);
|
|
693
|
+
debugLog("compact_context.request_time.explicit_skip_detail", {
|
|
694
|
+
reason: pruneFailure ?? "unknown",
|
|
695
|
+
currentMessageCount: _event.messages.length,
|
|
696
|
+
});
|
|
669
697
|
return;
|
|
670
698
|
}
|
|
671
699
|
debugLog("compact_context.request_time.explicit", {
|
|
@@ -696,13 +724,18 @@ export function registerCompactContextTool(ext, runtime) {
|
|
|
696
724
|
if (autoDecision.mode !== "request_time")
|
|
697
725
|
return;
|
|
698
726
|
const autoRequest = { source: "auto", mode: autoDecision.mode, ...autoSettings };
|
|
699
|
-
|
|
727
|
+
let autoPruneFailure;
|
|
728
|
+
const autoPruned = buildRequestTimePrunedMessages(ctx, autoRequest, policy, _event.messages, (reason) => {
|
|
729
|
+
autoPruneFailure = reason;
|
|
730
|
+
});
|
|
700
731
|
if (!autoPruned) {
|
|
701
732
|
debugLog("compact_context.request_time.auto_skip", {
|
|
702
733
|
rawTokens: autoRawTokens,
|
|
703
734
|
contextTokens: autoContextTokens ?? null,
|
|
704
735
|
percent: autoPercent ?? null,
|
|
705
736
|
reason: "virtual summary would not shrink the next request",
|
|
737
|
+
failureDetail: autoPruneFailure ?? "unknown",
|
|
738
|
+
currentMessageCount: _event.messages.length,
|
|
706
739
|
});
|
|
707
740
|
return;
|
|
708
741
|
}
|
|
@@ -740,6 +773,9 @@ export function registerCompactContextTool(ext, runtime) {
|
|
|
740
773
|
const iterationSignal = state.providerRequestCount >= iterationThreshold;
|
|
741
774
|
const frequencyReady = state.lastInRunNudgeRequest === 0 ||
|
|
742
775
|
state.providerRequestCount - state.lastInRunNudgeRequest >= frequency;
|
|
776
|
+
const signalEligible = rawSignal || absoluteContextSignal || percentSignal || iterationSignal;
|
|
777
|
+
const payloadShape = describeProviderPayload(_event.payload);
|
|
778
|
+
const alreadyContainsNudge = payloadContainsDcpNudge(_event.payload);
|
|
743
779
|
debugLog("compact_context.before_provider_request", {
|
|
744
780
|
providerRequestCount: state.providerRequestCount,
|
|
745
781
|
rawTokens,
|
|
@@ -750,6 +786,9 @@ export function registerCompactContextTool(ext, runtime) {
|
|
|
750
786
|
percentSignal,
|
|
751
787
|
iterationSignal,
|
|
752
788
|
frequencyReady,
|
|
789
|
+
signalEligible,
|
|
790
|
+
payloadShape,
|
|
791
|
+
alreadyContainsNudge,
|
|
753
792
|
});
|
|
754
793
|
// NOTE: maybeScheduleAutoOlderHistoryCompaction is intentionally NOT called
|
|
755
794
|
// here. This event fires AFTER the context event within the same provider
|
|
@@ -757,17 +796,29 @@ export function registerCompactContextTool(ext, runtime) {
|
|
|
757
796
|
// the context event on the NEXT request — a one-request lag that lets the
|
|
758
797
|
// oversized request through unpruned. Auto request_time pruning is now
|
|
759
798
|
// decided inline in the context event handler (no lag).
|
|
760
|
-
if (
|
|
799
|
+
if (!signalEligible || !frequencyReady) {
|
|
800
|
+
debugLog("compact_context.nudge_skipped", {
|
|
801
|
+
reason: !signalEligible ? "no_signal" : "frequency_cooldown",
|
|
802
|
+
payloadShape,
|
|
803
|
+
});
|
|
761
804
|
return;
|
|
762
|
-
|
|
805
|
+
}
|
|
806
|
+
if (alreadyContainsNudge) {
|
|
763
807
|
state.lastInRunNudgeRequest = state.providerRequestCount;
|
|
808
|
+
debugLog("compact_context.nudge_skipped", { reason: "already_present", payloadShape });
|
|
764
809
|
return;
|
|
765
810
|
}
|
|
766
811
|
const nudge = buildDcpNudge(rawTokens, contextTokens, percent, policy, state.providerRequestCount);
|
|
767
812
|
const payload = injectDcpNudgeIntoProviderPayload(_event.payload, nudge);
|
|
768
|
-
if (payload === undefined)
|
|
813
|
+
if (payload === undefined) {
|
|
814
|
+
debugLog("compact_context.nudge_skipped", { reason: "unsupported_payload_shape", payloadShape });
|
|
769
815
|
return;
|
|
816
|
+
}
|
|
770
817
|
state.lastInRunNudgeRequest = state.providerRequestCount;
|
|
818
|
+
debugLog("compact_context.nudge_injected", {
|
|
819
|
+
providerRequestCount: state.providerRequestCount,
|
|
820
|
+
payloadShape,
|
|
821
|
+
});
|
|
771
822
|
return payload;
|
|
772
823
|
}));
|
|
773
824
|
ext.on("agent_end", withDebug((_event, ctx) => {
|
|
@@ -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_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;
|
|
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
|
@@ -52,7 +52,7 @@ import { handleListDirectory } from "../server/handlers/paths-list.js";
|
|
|
52
52
|
import { handlePickDirectory } from "../server/handlers/paths-pick-directory.js";
|
|
53
53
|
import { handleSearchProjectFiles } from "../server/handlers/files-search.js";
|
|
54
54
|
import { handleBindStudioProject, handleUnbindStudioProject, handleCleanupProjectSessions, handleCreateProject, handleDeleteProject, handleGetProjectObservations, handleListProjects, handleListSessionsByProject, handleUpdateProject, } from "../server/handlers/projects.js";
|
|
55
|
-
import { handleCompactSession, handleCreateSession, handleDeleteSession, handleForkSession, handleRememberAndDeleteSession, handleGetSessionDetail, handleGetSessionMessages, handleGetSessionMemoryDetails, handleGetSessionMemoryStatus, handleUpdateSession, } from "../server/handlers/sessions.js";
|
|
55
|
+
import { handleCompactSession, handleCreateSession, handleDeleteSession, handleForkSession, handleRememberAndDeleteSession, handleGetSessionDetail, handleGetSessionMessages, handleGetSessionMemoryDetails, handleGetSessionMemoryStatus, handleUpdateSession, handleGetSessionActiveAgent, handleUpdateSessionActiveAgent, } from "../server/handlers/sessions.js";
|
|
56
56
|
import { handleClearPromptQueue, handleEnqueuePrompt, handleGetPromptQueue, handleRemovePrompt, } from "../server/handlers/queue.js";
|
|
57
57
|
import { handleGetAgentSettings, handleListAgents, handlePutAgentSettings, } from "../server/handlers/agent-settings.js";
|
|
58
58
|
import { handleGetSettings, handlePutSettings, } from "../server/handlers/settings.js";
|
|
@@ -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" };
|
|
@@ -236,6 +241,15 @@ export function matchRoute(method, path) {
|
|
|
236
241
|
return { route: "delete_session", id };
|
|
237
242
|
return null;
|
|
238
243
|
}
|
|
244
|
+
const sessionAgentMatch = /^\/api\/sessions\/([^/]+)\/active-agent$/.exec(cleanPath);
|
|
245
|
+
if (sessionAgentMatch) {
|
|
246
|
+
const id = decodeURIComponent(sessionAgentMatch[1]);
|
|
247
|
+
if (method === "GET")
|
|
248
|
+
return { route: "get_session_active_agent", id };
|
|
249
|
+
if (method === "PUT")
|
|
250
|
+
return { route: "update_session_active_agent", id };
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
239
253
|
// /api/sessions/:id/memory/details and /api/sessions/:id/memory and /api/sessions/:id/compact
|
|
240
254
|
const sessionActionMatch = /^\/api\/sessions\/([^/]+)\/(memory(?:\/details)?|compact)$/.exec(cleanPath);
|
|
241
255
|
if (sessionActionMatch) {
|
|
@@ -888,6 +902,10 @@ async function dispatchRoute(match, body, deps) {
|
|
|
888
902
|
}
|
|
889
903
|
case "get_session":
|
|
890
904
|
return handleGetSessionDetail(store, id);
|
|
905
|
+
case "get_session_active_agent":
|
|
906
|
+
return handleGetSessionActiveAgent(store, id);
|
|
907
|
+
case "update_session_active_agent":
|
|
908
|
+
return handleUpdateSessionActiveAgent(store, id, asObject(body));
|
|
891
909
|
case "get_session_messages":
|
|
892
910
|
return handleGetSessionMessages(store, id, {
|
|
893
911
|
beforeCreatedAt: match.query?.get("beforeCreatedAt") ?? undefined,
|
|
@@ -994,6 +1012,15 @@ async function dispatchRoute(match, body, deps) {
|
|
|
994
1012
|
await deps.refreshNativeExtensions();
|
|
995
1013
|
return { ok: true };
|
|
996
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
|
+
}
|
|
997
1024
|
case "wizard_login": {
|
|
998
1025
|
return await (deps.startWizardLogin ?? (() => startWizardLogin(deps.cwd ?? homedir())))();
|
|
999
1026
|
}
|
|
@@ -1011,7 +1038,8 @@ async function dispatchRoute(match, body, deps) {
|
|
|
1011
1038
|
return handlePutPromptMutationSettings(deps.cwd ?? homedir(), asObject(body), deps.agentDir);
|
|
1012
1039
|
case "list_agents": {
|
|
1013
1040
|
const agentCwd = match.query?.get("cwd") || deps.cwd || homedir();
|
|
1014
|
-
|
|
1041
|
+
const teamId = match.query?.get("teamId") || undefined;
|
|
1042
|
+
return handleListAgents(agentCwd, deps.agentDir, teamId);
|
|
1015
1043
|
}
|
|
1016
1044
|
}
|
|
1017
1045
|
}
|
|
@@ -64,6 +64,8 @@ export type FetchAllowedModelsFn = typeof defaultFetchAllowedModels;
|
|
|
64
64
|
export interface AgentBridgeOptions {
|
|
65
65
|
/** Stable local session identity forwarded to Responses/cache-aware providers. */
|
|
66
66
|
sessionId?: string;
|
|
67
|
+
/** Session-level primary agent override; undefined means inherit settings. */
|
|
68
|
+
activePrimaryAgent?: string | null;
|
|
67
69
|
/** Genuine upstream Responses response id restored from durable session metadata. */
|
|
68
70
|
nativeResponseId?: string;
|
|
69
71
|
/** Working directory spectral will operate in (used by built-in tools). */
|
|
@@ -83,6 +85,7 @@ export interface AgentBridgeOptions {
|
|
|
83
85
|
* `ensureMachineRegistered` and persisted in `machine.json`.
|
|
84
86
|
*/
|
|
85
87
|
machineJwt: string;
|
|
88
|
+
teamId?: string;
|
|
86
89
|
/** Sink for outbound wire events. Synchronous; the bridge does not buffer. */
|
|
87
90
|
emit: (event: ServerEvent) => void;
|
|
88
91
|
/**
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"agent-bridge.d.ts","sourceRoot":"","sources":["../../src/server/agent-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,7 +54,7 @@ import { existsSync, statSync, watch } from "node:fs";
|
|
|
54
54
|
import { dirname, join, resolve } from "node:path";
|
|
55
55
|
import aexolMcpExtension from "../extensions/aexol-mcp.js";
|
|
56
56
|
import mcpAdapterFactory from "../mcp/index.js";
|
|
57
|
-
import { discoverPrimaryAgent, injectPrimaryAgentPrompt, } from "../agent/agents.js";
|
|
57
|
+
import { discoverAgents, discoverPrimaryAgent, injectPrimaryAgentPrompt, refreshCloudAgents, } from "../agent/agents.js";
|
|
58
58
|
import { loadAgentSettings, } from "./handlers/agent-settings.js";
|
|
59
59
|
import kanbanBridgeExtension from "../extensions/kanban-bridge.js";
|
|
60
60
|
import spectralVisionExtension from "../extensions/spectral-vision-fallback.js";
|
|
@@ -623,6 +623,7 @@ export class AgentBridge {
|
|
|
623
623
|
async start() {
|
|
624
624
|
if (this.disposed)
|
|
625
625
|
throw new Error("AgentBridge already disposed");
|
|
626
|
+
await refreshCloudAgents({ backendUrl: this.opts.backendUrl, machineJwt: this.opts.machineJwt, teamId: this.opts.teamId });
|
|
626
627
|
const extensionFactories = [
|
|
627
628
|
// Primary-agent prompt is injected per-turn via before_agent_start so the
|
|
628
629
|
// primaryAgentEnabled toggle takes effect mid-session (next user message).
|
|
@@ -631,7 +632,14 @@ export class AgentBridge {
|
|
|
631
632
|
const settings = loadAgentSettings(this.opts.cwd, this.opts.agentDir);
|
|
632
633
|
if (!settings.primaryAgentEnabled)
|
|
633
634
|
return;
|
|
634
|
-
const
|
|
635
|
+
const agents = discoverAgents(this.opts.cwd, "both", this.opts.agentDir, this.opts.teamId).agents;
|
|
636
|
+
const selectedName = this.opts.activePrimaryAgent === undefined
|
|
637
|
+
? settings.activePrimaryAgent
|
|
638
|
+
: this.opts.activePrimaryAgent;
|
|
639
|
+
const selected = selectedName && selectedName !== "__auto__"
|
|
640
|
+
? agents.find((agent) => agent.mode === "primary" && agent.name === selectedName)
|
|
641
|
+
: undefined;
|
|
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);
|
|
635
643
|
const injected = injectPrimaryAgentPrompt(event.systemPrompt, primaryAgent);
|
|
636
644
|
if (injected === event.systemPrompt)
|
|
637
645
|
return;
|
|
@@ -652,7 +660,9 @@ export class AgentBridge {
|
|
|
652
660
|
];
|
|
653
661
|
// Always register subagent tool — execute() checks settings from disk
|
|
654
662
|
// on every invocation, so toggling takes effect immediately (no restart).
|
|
655
|
-
|
|
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) => {
|
|
656
666
|
subagentExt(ext, {
|
|
657
667
|
disabledAgents: [],
|
|
658
668
|
emitSubagentEvent: (event) => this.emitAndBuffer(event),
|
|
@@ -11,12 +11,15 @@ export interface AgentSettings {
|
|
|
11
11
|
subagentsEnabled: boolean;
|
|
12
12
|
/** Names of individual subagents that have been explicitly disabled. */
|
|
13
13
|
disabledSubagents: string[];
|
|
14
|
+
activePrimaryAgent: string | null;
|
|
14
15
|
}
|
|
15
16
|
export declare const AGENT_SETTINGS_DEFAULTS: AgentSettings;
|
|
16
17
|
export interface PutAgentSettingsInput {
|
|
17
18
|
primaryAgentEnabled?: unknown;
|
|
18
19
|
subagentsEnabled?: unknown;
|
|
19
20
|
disabledSubagents?: unknown;
|
|
21
|
+
activePrimaryAgent?: unknown;
|
|
22
|
+
scope?: unknown;
|
|
20
23
|
}
|
|
21
24
|
export interface PutAgentSettingsOutput extends AgentSettings {
|
|
22
25
|
ok: true;
|
|
@@ -43,7 +46,7 @@ export interface AgentInfo {
|
|
|
43
46
|
mode: string;
|
|
44
47
|
source: string;
|
|
45
48
|
}
|
|
46
|
-
export declare function handleListAgents(cwd: string, agentDir?: string): {
|
|
49
|
+
export declare function handleListAgents(cwd: string, agentDir?: string, teamId?: string): {
|
|
47
50
|
agents: AgentInfo[];
|
|
48
51
|
};
|
|
49
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;
|
|
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"}
|
|
@@ -8,9 +8,10 @@ export const AGENT_SETTINGS_DEFAULTS = {
|
|
|
8
8
|
primaryAgentEnabled: true,
|
|
9
9
|
subagentsEnabled: true,
|
|
10
10
|
disabledSubagents: [],
|
|
11
|
+
activePrimaryAgent: null,
|
|
11
12
|
};
|
|
12
13
|
const AGENT_NAMESPACE = "agent";
|
|
13
|
-
const ALLOWED_KEYS = new Set(["primaryAgentEnabled", "subagentsEnabled", "disabledSubagents"]);
|
|
14
|
+
const ALLOWED_KEYS = new Set(["primaryAgentEnabled", "subagentsEnabled", "disabledSubagents", "activePrimaryAgent"]);
|
|
14
15
|
/**
|
|
15
16
|
* Read the `agent` namespace from a single `settings.json` file.
|
|
16
17
|
* Returns `{}` when the file or namespace is absent or unparseable.
|
|
@@ -34,6 +35,9 @@ function readAgentNamespace(path) {
|
|
|
34
35
|
if (Array.isArray(obj.disabledSubagents)) {
|
|
35
36
|
result.disabledSubagents = obj.disabledSubagents.filter((s) => typeof s === "string");
|
|
36
37
|
}
|
|
38
|
+
if (obj.activePrimaryAgent === null || typeof obj.activePrimaryAgent === "string") {
|
|
39
|
+
result.activePrimaryAgent = obj.activePrimaryAgent;
|
|
40
|
+
}
|
|
37
41
|
return result;
|
|
38
42
|
}
|
|
39
43
|
catch {
|
|
@@ -83,21 +87,35 @@ export function handlePutAgentSettings(cwd, body, agentDir) {
|
|
|
83
87
|
}
|
|
84
88
|
patch.disabledSubagents = body.disabledSubagents;
|
|
85
89
|
}
|
|
90
|
+
if (body.activePrimaryAgent !== undefined) {
|
|
91
|
+
if (body.activePrimaryAgent !== null && typeof body.activePrimaryAgent !== "string") {
|
|
92
|
+
throw new BadRequestError(`agent setting "activePrimaryAgent" must be a string or null`);
|
|
93
|
+
}
|
|
94
|
+
patch.activePrimaryAgent = body.activePrimaryAgent;
|
|
95
|
+
}
|
|
96
|
+
const scope = body.scope === undefined ? "global" : body.scope;
|
|
97
|
+
if (scope !== "global" && scope !== "project") {
|
|
98
|
+
throw new BadRequestError(`agent settings scope must be "global" or "project"`);
|
|
99
|
+
}
|
|
86
100
|
if (Object.keys(patch).length === 0) {
|
|
87
101
|
throw new BadRequestError(`agent settings body must include at least one of: ${[...ALLOWED_KEYS].join(", ")}`);
|
|
88
102
|
}
|
|
89
103
|
// Persist to the global file only. The lock is shared with the
|
|
90
104
|
// observational-memory handler so concurrent writes cannot corrupt
|
|
91
105
|
// each other's namespace.
|
|
92
|
-
withSettingsLock({
|
|
106
|
+
withSettingsLock({
|
|
107
|
+
agentDir,
|
|
108
|
+
settingsPath: scope === "project" ? join(cwd, ".spectral", "settings.json") : undefined,
|
|
109
|
+
namespace: AGENT_NAMESPACE,
|
|
110
|
+
}, (current) => {
|
|
93
111
|
return { ...current, ...patch };
|
|
94
112
|
});
|
|
95
113
|
// Return the fully resolved settings (global + project merge) so the
|
|
96
114
|
// caller sees the effective state, not just what we wrote.
|
|
97
115
|
return { ok: true, ...loadAgentSettings(cwd, agentDir) };
|
|
98
116
|
}
|
|
99
|
-
export function handleListAgents(cwd, agentDir) {
|
|
100
|
-
const { agents } = discoverAgents(cwd, "both", agentDir);
|
|
117
|
+
export function handleListAgents(cwd, agentDir, teamId) {
|
|
118
|
+
const { agents } = discoverAgents(cwd, "both", agentDir, teamId);
|
|
101
119
|
return {
|
|
102
120
|
agents: agents.map((a) => ({
|
|
103
121
|
name: a.name,
|
|
@@ -20,6 +20,9 @@ export interface CreateSessionInputRaw {
|
|
|
20
20
|
export interface UpdateSessionInputRaw {
|
|
21
21
|
title?: unknown;
|
|
22
22
|
}
|
|
23
|
+
export interface UpdateSessionAgentInputRaw {
|
|
24
|
+
activeAgent?: unknown;
|
|
25
|
+
}
|
|
23
26
|
export interface GetSessionMessagesInputRaw {
|
|
24
27
|
beforeCreatedAt?: unknown;
|
|
25
28
|
beforeId?: unknown;
|
|
@@ -38,6 +41,12 @@ export declare function handleCreateSession(store: SessionStore, body: CreateSes
|
|
|
38
41
|
export declare function handleGetSessionDetail(store: SessionStore, id: string): WireSessionDetail;
|
|
39
42
|
export declare function handleGetSessionMessages(store: SessionStore, id: string, query: GetSessionMessagesInputRaw): WireSessionDetail;
|
|
40
43
|
export declare function handleUpdateSession(store: SessionStore, id: string, body: UpdateSessionInputRaw): WireSessionSummary;
|
|
44
|
+
export declare function handleGetSessionActiveAgent(store: SessionStore, id: string): {
|
|
45
|
+
activeAgent: string | null;
|
|
46
|
+
};
|
|
47
|
+
export declare function handleUpdateSessionActiveAgent(store: SessionStore, id: string, body: UpdateSessionAgentInputRaw): {
|
|
48
|
+
activeAgent: string | null;
|
|
49
|
+
};
|
|
41
50
|
export declare function handleDeleteSession(store: SessionStore, id: string): void;
|
|
42
51
|
export declare function handleGetSessionMemoryStatus(store: SessionStore, manager: SessionStreamManager, id: string): WireSessionMemoryStatus;
|
|
43
52
|
export declare function handleGetSessionMemoryDetails(store: SessionStore, manager: SessionStreamManager, id: string): WireSessionMemoryDetails;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/sessions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAG3H,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAE5C,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AACD,MAAM,WAAW,0BAA0B;IACzC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,kBAAkB,CASzE;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,qBAAqB,GAC1B,kBAAkB,CAQpB;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,YAAY,EACnB,EAAE,EAAE,MAAM,GACT,iBAAiB,CAInB;AACD,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,YAAY,EACnB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,0BAA0B,GAChC,iBAAiB,CA+BnB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,YAAY,EACnB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,qBAAqB,GAC1B,kBAAkB,CAOpB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAGzE;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,oBAAoB,EAC7B,EAAE,EAAE,MAAM,GACT,uBAAuB,CAIzB;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,oBAAoB,EAC7B,EAAE,EAAE,MAAM,GACT,wBAAwB,CAI1B;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,oBAAoB,EAC7B,EAAE,EAAE,MAAM,EACV,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,CAAC,CAevB;AAED;;;;;;;GAOG;AACH,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,oBAAoB,EAC7B,EAAE,EAAE,MAAM,GACT,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,CAAC,CAavB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,YAAY,EACnB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GACxB,kBAAkB,CAKpB"}
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -80,6 +80,20 @@ export function handleUpdateSession(store, id, body) {
|
|
|
80
80
|
throw new NotFoundError("Session not found");
|
|
81
81
|
return updated;
|
|
82
82
|
}
|
|
83
|
+
export function handleGetSessionActiveAgent(store, id) {
|
|
84
|
+
if (!store.getSession(id))
|
|
85
|
+
throw new NotFoundError("Session not found");
|
|
86
|
+
return { activeAgent: store.getSessionActiveAgent(id) };
|
|
87
|
+
}
|
|
88
|
+
export function handleUpdateSessionActiveAgent(store, id, body) {
|
|
89
|
+
if (!store.getSession(id))
|
|
90
|
+
throw new NotFoundError("Session not found");
|
|
91
|
+
if (body.activeAgent !== null && body.activeAgent !== undefined && typeof body.activeAgent !== "string") {
|
|
92
|
+
throw new BadRequestError("activeAgent must be a string, null, or omitted");
|
|
93
|
+
}
|
|
94
|
+
store.setSessionActiveAgent(id, body.activeAgent === undefined ? null : body.activeAgent);
|
|
95
|
+
return { activeAgent: store.getSessionActiveAgent(id) };
|
|
96
|
+
}
|
|
83
97
|
export function handleDeleteSession(store, id) {
|
|
84
98
|
const deleted = store.deleteSession(id);
|
|
85
99
|
if (!deleted)
|
|
@@ -29,6 +29,7 @@ export declare function settingsFilePath(agentDir?: string): string;
|
|
|
29
29
|
*/
|
|
30
30
|
export declare function withSettingsLock(opts: {
|
|
31
31
|
agentDir?: string;
|
|
32
|
+
settingsPath?: string;
|
|
32
33
|
namespace: string;
|
|
33
34
|
}, fn: (current: Record<string, unknown>) => Record<string, unknown> | undefined): void;
|
|
34
35
|
/** Re-exported for handler convenience. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-lock.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/settings-lock.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,IAAI,CAsBjE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"settings-lock.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/settings-lock.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,IAAI,CAsBjE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EACrE,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC5E,IAAI,CA4BN;AAED,2CAA2C;AAC3C,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -56,7 +56,7 @@ export function settingsFilePath(agentDir) {
|
|
|
56
56
|
* the file already exists) so we never observe a half-written file.
|
|
57
57
|
*/
|
|
58
58
|
export function withSettingsLock(opts, fn) {
|
|
59
|
-
const path = settingsFilePath(opts.agentDir);
|
|
59
|
+
const path = opts.settingsPath ?? settingsFilePath(opts.agentDir);
|
|
60
60
|
const dir = dirname(path);
|
|
61
61
|
let release;
|
|
62
62
|
try {
|
|
@@ -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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"}
|
|
@@ -864,6 +864,8 @@ export class SessionStreamManager {
|
|
|
864
864
|
const bridgeOpts = {
|
|
865
865
|
cwd: stream.cwd,
|
|
866
866
|
sessionId,
|
|
867
|
+
activePrimaryAgent: this.store.getSessionActiveAgent(sessionId) ?? undefined,
|
|
868
|
+
teamId: this.store.getProject(this.store.getSession(sessionId)?.projectId ?? "")?.studioTeamId ?? undefined,
|
|
867
869
|
nativeResponseId: this.store.getSessionNativeResponseId(sessionId) ?? undefined,
|
|
868
870
|
agentDir: this.agentDir,
|
|
869
871
|
backendUrl: this.backendUrl,
|
|
@@ -1519,6 +1521,8 @@ export class SessionStreamManager {
|
|
|
1519
1521
|
const bridgeOpts = {
|
|
1520
1522
|
cwd,
|
|
1521
1523
|
sessionId,
|
|
1524
|
+
activePrimaryAgent: this.store.getSessionActiveAgent(sessionId) ?? undefined,
|
|
1525
|
+
teamId: this.store.getProject(this.store.getSession(sessionId)?.projectId ?? "")?.studioTeamId ?? undefined,
|
|
1522
1526
|
nativeResponseId: this.store.getSessionNativeResponseId(sessionId) ?? undefined,
|
|
1523
1527
|
agentDir: this.agentDir,
|
|
1524
1528
|
backendUrl: this.backendUrl,
|
package/dist/server/storage.d.ts
CHANGED
|
@@ -116,6 +116,8 @@ export declare class SessionStore {
|
|
|
116
116
|
private stmtDeleteSessionMemorySnapshot;
|
|
117
117
|
private stmtGetSessionModel;
|
|
118
118
|
private stmtSetSessionModel;
|
|
119
|
+
private stmtGetSessionActiveAgent;
|
|
120
|
+
private stmtSetSessionActiveAgent;
|
|
119
121
|
private stmtGetSessionReasoningEffort;
|
|
120
122
|
private stmtSetSessionReasoningEffort;
|
|
121
123
|
private stmtGetSessionNativeResponseId;
|
|
@@ -242,6 +244,8 @@ export declare class SessionStore {
|
|
|
242
244
|
* sessionId via attach/getSession in the normal flow).
|
|
243
245
|
*/
|
|
244
246
|
setSessionModel(sessionId: string, modelId: string | null): void;
|
|
247
|
+
getSessionActiveAgent(sessionId: string): string | null;
|
|
248
|
+
setSessionActiveAgent(sessionId: string, agentName: string | null): void;
|
|
245
249
|
/**
|
|
246
250
|
* Get the persisted reasoningEffort for a session, or null if none
|
|
247
251
|
* was ever set. Returns null for unknown sessions (consistent with
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/server/storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAUH,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,sEAAsE;AACtE,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC;AAExC,uCAAuC;AACvC,MAAM,WAAW,kBAAkB;IACjC,wDAAwD;IACxD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sFAAsF;IACtF,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B,0GAA0G;IAC1G,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,wDAAwD;IACxD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,sBAAsB,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/server/storage.ts"],"names":[],"mappings":"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"}
|
package/dist/server/storage.js
CHANGED
|
@@ -59,6 +59,7 @@ CREATE TABLE IF NOT EXISTS sessions (
|
|
|
59
59
|
created_at INTEGER NOT NULL,
|
|
60
60
|
updated_at INTEGER NOT NULL,
|
|
61
61
|
model_id TEXT,
|
|
62
|
+
active_agent TEXT,
|
|
62
63
|
reasoning_effort TEXT,
|
|
63
64
|
native_response_id TEXT
|
|
64
65
|
);
|
|
@@ -222,6 +223,8 @@ export class SessionStore {
|
|
|
222
223
|
// Phase 3: per-session sticky model.
|
|
223
224
|
stmtGetSessionModel;
|
|
224
225
|
stmtSetSessionModel;
|
|
226
|
+
stmtGetSessionActiveAgent;
|
|
227
|
+
stmtSetSessionActiveAgent;
|
|
225
228
|
stmtGetSessionReasoningEffort;
|
|
226
229
|
stmtSetSessionReasoningEffort;
|
|
227
230
|
stmtGetSessionNativeResponseId;
|
|
@@ -294,6 +297,9 @@ export class SessionStore {
|
|
|
294
297
|
if (!sessionCols.some((c) => c.name === "model_id")) {
|
|
295
298
|
this.db.exec(`ALTER TABLE sessions ADD COLUMN model_id TEXT`);
|
|
296
299
|
}
|
|
300
|
+
if (!sessionCols.some((c) => c.name === "active_agent")) {
|
|
301
|
+
this.db.exec(`ALTER TABLE sessions ADD COLUMN active_agent TEXT`);
|
|
302
|
+
}
|
|
297
303
|
if (!sessionCols.some((c) => c.name === "reasoning_effort")) {
|
|
298
304
|
this.db.exec(`ALTER TABLE sessions ADD COLUMN reasoning_effort TEXT`);
|
|
299
305
|
}
|
|
@@ -438,6 +444,8 @@ export class SessionStore {
|
|
|
438
444
|
this.stmtDeleteSessionMemorySnapshot = this.db.prepare(`DELETE FROM session_memory_snapshots WHERE session_id = ?`);
|
|
439
445
|
this.stmtGetSessionModel = this.db.prepare(`SELECT model_id FROM sessions WHERE id = ?`);
|
|
440
446
|
this.stmtSetSessionModel = this.db.prepare(`UPDATE sessions SET model_id = ? WHERE id = ?`);
|
|
447
|
+
this.stmtGetSessionActiveAgent = this.db.prepare(`SELECT active_agent FROM sessions WHERE id = ?`);
|
|
448
|
+
this.stmtSetSessionActiveAgent = this.db.prepare(`UPDATE sessions SET active_agent = ? WHERE id = ?`);
|
|
441
449
|
this.stmtGetSessionReasoningEffort = this.db.prepare(`SELECT reasoning_effort FROM sessions WHERE id = ?`);
|
|
442
450
|
this.stmtSetSessionReasoningEffort = this.db.prepare(`UPDATE sessions SET reasoning_effort = ? WHERE id = ?`);
|
|
443
451
|
this.stmtGetSessionNativeResponseId = this.db.prepare(`SELECT native_response_id FROM sessions WHERE id = ?`);
|
|
@@ -877,6 +885,12 @@ export class SessionStore {
|
|
|
877
885
|
setSessionModel(sessionId, modelId) {
|
|
878
886
|
this.stmtSetSessionModel.run(modelId, sessionId);
|
|
879
887
|
}
|
|
888
|
+
getSessionActiveAgent(sessionId) {
|
|
889
|
+
return this.stmtGetSessionActiveAgent.get(sessionId)?.active_agent ?? null;
|
|
890
|
+
}
|
|
891
|
+
setSessionActiveAgent(sessionId, agentName) {
|
|
892
|
+
this.stmtSetSessionActiveAgent.run(agentName, sessionId);
|
|
893
|
+
}
|
|
880
894
|
/**
|
|
881
895
|
* Get the persisted reasoningEffort for a session, or null if none
|
|
882
896
|
* was ever set. Returns null for unknown sessions (consistent with
|