@aexol/spectral 0.9.46 → 0.9.48
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/index.d.ts.map +1 -1
- package/dist/agent/index.js +15 -1
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +77 -4
- package/dist/extensions/browser/browser-service.d.ts.map +1 -1
- package/dist/extensions/browser/browser-service.js +13 -3
- package/dist/relay/auto-optimizer.d.ts +41 -0
- package/dist/relay/auto-optimizer.d.ts.map +1 -0
- package/dist/relay/auto-optimizer.js +488 -0
- package/dist/relay/client.d.ts.map +1 -1
- package/dist/relay/client.js +10 -0
- package/dist/relay/dispatcher.d.ts +20 -2
- package/dist/relay/dispatcher.d.ts.map +1 -1
- package/dist/relay/dispatcher.js +27 -0
- package/dist/sdk/coding-agent/core/agent-session.d.ts +6 -0
- package/dist/sdk/coding-agent/core/agent-session.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/agent-session.js +37 -0
- package/dist/sdk/coding-agent/core/settings-manager.d.ts +12 -0
- package/dist/sdk/coding-agent/core/settings-manager.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/settings-manager.js +33 -0
- package/dist/sdk/coding-agent/core/system-prompt-mutator.d.ts +17 -0
- package/dist/sdk/coding-agent/core/system-prompt-mutator.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/system-prompt-mutator.js +138 -0
- package/dist/server/agent-bridge.d.ts +1 -0
- package/dist/server/agent-bridge.d.ts.map +1 -1
- package/dist/server/agent-bridge.js +32 -10
- package/dist/server/handlers/prompt-mutation-settings.d.ts +34 -0
- package/dist/server/handlers/prompt-mutation-settings.d.ts.map +1 -0
- package/dist/server/handlers/prompt-mutation-settings.js +58 -0
- package/dist/server/shutdown.d.ts +2 -0
- package/dist/server/shutdown.d.ts.map +1 -1
- package/dist/server/shutdown.js +13 -0
- package/dist/server/wire.d.ts +41 -1
- package/dist/server/wire.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAWH,OAAO,EACN,KAAK,YAAY,EAEjB,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAWH,OAAO,EACN,KAAK,YAAY,EAEjB,MAAM,8BAA8B,CAAC;AAsftC,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CA+UvG"}
|
package/dist/agent/index.js
CHANGED
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
*/
|
|
27
27
|
import { agentLoop } from "../sdk/agent-core/index.js";
|
|
28
28
|
import { StringEnum } from "../sdk/ai/index.js";
|
|
29
|
+
import { mutateSystemPrompt } from "../sdk/coding-agent/core/system-prompt-mutator.js";
|
|
29
30
|
import { Type } from "typebox";
|
|
30
31
|
import { discoverAgents } from "./agents.js";
|
|
31
32
|
import { loadAgentSettings } from "../server/handlers/agent-settings.js";
|
|
@@ -196,6 +197,19 @@ async function runSingleAgent(defaultCwd, agents, agentName, task, cwd, step, si
|
|
|
196
197
|
const combinedPrompt = mainSystemPrompt
|
|
197
198
|
? `${mainSystemPrompt}\n\n---\n\nSubagent: ${agent.name}\n${agent.systemPrompt}`
|
|
198
199
|
: agent.systemPrompt;
|
|
200
|
+
// Apply system prompt mutation if enabled in settings (opt-in)
|
|
201
|
+
let effectivePrompt = combinedPrompt;
|
|
202
|
+
if (ctx.settingsManager) {
|
|
203
|
+
const mutationResult = await mutateSystemPrompt({
|
|
204
|
+
systemPrompt: combinedPrompt,
|
|
205
|
+
modelRegistry: ctx.modelRegistry,
|
|
206
|
+
settingsManager: ctx.settingsManager,
|
|
207
|
+
cacheSuffix: `subagent:${agent.name}`,
|
|
208
|
+
});
|
|
209
|
+
if (mutationResult.mutated) {
|
|
210
|
+
effectivePrompt = mutationResult.prompt;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
199
213
|
// Resolve model — session model preferred, agent-configured as fallback
|
|
200
214
|
const sessionModel = ctx.model && ctx.modelRegistry.hasConfiguredAuth(ctx.model) ? ctx.model : undefined;
|
|
201
215
|
const model = sessionModel ?? resolveModelString(agent.model, ctx.modelRegistry);
|
|
@@ -262,7 +276,7 @@ async function runSingleAgent(defaultCwd, agents, agentName, task, cwd, step, si
|
|
|
262
276
|
toolExecution: "parallel",
|
|
263
277
|
};
|
|
264
278
|
const stream = agentLoop([{ role: "user", content: [{ type: "text", text: task }], timestamp: Date.now() }], {
|
|
265
|
-
systemPrompt:
|
|
279
|
+
systemPrompt: effectivePrompt,
|
|
266
280
|
messages: [],
|
|
267
281
|
tools,
|
|
268
282
|
}, config, signal);
|
|
@@ -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;AAyBH,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,CAqdlF;AAwDD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAa5E"}
|
package/dist/commands/serve.js
CHANGED
|
@@ -38,8 +38,9 @@ import { SettingsManager } from "../sdk/coding-agent/core/settings-manager.js";
|
|
|
38
38
|
import { getAgentDir } from "../sdk/coding-agent/config.js";
|
|
39
39
|
import { requireLogin } from "../preflight.js";
|
|
40
40
|
import { RelayClient } from "../relay/client.js";
|
|
41
|
-
import { detachAllSubscribers, handleAutoResearchFrame, handleCancelTurn, handleClientMessage, handleRestRequest, handleSubscribe, } from "../relay/dispatcher.js";
|
|
41
|
+
import { detachAllSubscribers, handleAutoOptimizeFrame, handleAutoResearchFrame, handleCancelTurn, handleClientMessage, handleRestRequest, handleSubscribe, } from "../relay/dispatcher.js";
|
|
42
42
|
import { ensureMachineRegistered } from "../relay/registration.js";
|
|
43
|
+
import { saveMachine } from "../relay/machine-store.js";
|
|
43
44
|
import { SessionStreamManager } from "../server/session-stream.js";
|
|
44
45
|
import { gracefulShutdown } from "../server/shutdown.js";
|
|
45
46
|
import { getLiveMcpState } from "../mcp/state-getter.js";
|
|
@@ -275,6 +276,16 @@ export async function runServe(opts = {}) {
|
|
|
275
276
|
});
|
|
276
277
|
return;
|
|
277
278
|
}
|
|
279
|
+
if (frame.kind === "auto_optimize") {
|
|
280
|
+
handleAutoOptimizeFrame(frame, {
|
|
281
|
+
store,
|
|
282
|
+
manager,
|
|
283
|
+
relay: r,
|
|
284
|
+
subscribers,
|
|
285
|
+
cwd,
|
|
286
|
+
});
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
278
289
|
if (frame.kind === "config_patch") {
|
|
279
290
|
handleConfigPatch(frame, {
|
|
280
291
|
cwd,
|
|
@@ -284,6 +295,51 @@ export async function runServe(opts = {}) {
|
|
|
284
295
|
});
|
|
285
296
|
return;
|
|
286
297
|
}
|
|
298
|
+
if (frame.kind === "machine_team_changed") {
|
|
299
|
+
const mtc = frame;
|
|
300
|
+
const existing = registration.record;
|
|
301
|
+
saveMachine({
|
|
302
|
+
machineId: existing.machineId,
|
|
303
|
+
machineName: existing.machineName,
|
|
304
|
+
machineJwt: mtc.machineJwt,
|
|
305
|
+
teamId: mtc.teamId,
|
|
306
|
+
ownerId: existing.ownerId,
|
|
307
|
+
visibility: existing.visibility,
|
|
308
|
+
registeredAt: Date.now(),
|
|
309
|
+
hostname: existing.hostname,
|
|
310
|
+
version: existing.version,
|
|
311
|
+
}).catch((err) => {
|
|
312
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
313
|
+
process.stderr.write(`[serve] Failed to save team change: ${msg}\n`);
|
|
314
|
+
});
|
|
315
|
+
// Update registration record so future re-registrations pick up the new team
|
|
316
|
+
registration = {
|
|
317
|
+
reused: false,
|
|
318
|
+
record: {
|
|
319
|
+
...existing,
|
|
320
|
+
machineJwt: mtc.machineJwt,
|
|
321
|
+
teamId: mtc.teamId,
|
|
322
|
+
},
|
|
323
|
+
};
|
|
324
|
+
// Re-create relay with new JWT
|
|
325
|
+
r.dispose();
|
|
326
|
+
relay = new RelayClient({
|
|
327
|
+
relayUrl,
|
|
328
|
+
machineJwt: mtc.machineJwt,
|
|
329
|
+
backendUrl,
|
|
330
|
+
webSocketImpl: opts.webSocketImpl,
|
|
331
|
+
fetchImpl: opts.fetchImpl,
|
|
332
|
+
logger: silent
|
|
333
|
+
? { log: () => { }, warn: () => { }, error: () => { } }
|
|
334
|
+
: console,
|
|
335
|
+
});
|
|
336
|
+
wireRelay(relay);
|
|
337
|
+
relay.connect();
|
|
338
|
+
if (!silent) {
|
|
339
|
+
process.stdout.write(`✓ Machine moved to team ${mtc.teamId}. Reconnecting with new credentials…\n`);
|
|
340
|
+
}
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
287
343
|
// Other frames (error, machine_disconnected addressed to us, etc.)
|
|
288
344
|
// are ignored at this layer. Future batches may surface them in
|
|
289
345
|
// structured logs.
|
|
@@ -303,6 +359,8 @@ export async function runServe(opts = {}) {
|
|
|
303
359
|
});
|
|
304
360
|
if (!silent) {
|
|
305
361
|
r.on("close", ({ code, reason }) => {
|
|
362
|
+
if (reason === "team-changed")
|
|
363
|
+
return; // handled in frame handler
|
|
306
364
|
process.stdout.write(`Relay closed (${code}${reason ? `: ${reason}` : ""}); will reconnect…\n`);
|
|
307
365
|
});
|
|
308
366
|
r.on("reconnect-scheduled", ({ delayMs, attempt }) => {
|
|
@@ -418,6 +476,15 @@ export async function runServe(opts = {}) {
|
|
|
418
476
|
catch {
|
|
419
477
|
// ignore — best-effort
|
|
420
478
|
}
|
|
479
|
+
// Close browser instances (Playwright) so Chrome for Testing
|
|
480
|
+
// processes don't stay alive after the relay shuts down.
|
|
481
|
+
try {
|
|
482
|
+
const { BrowserService } = await import("../extensions/browser/browser-service.js");
|
|
483
|
+
await BrowserService.getInstance().close();
|
|
484
|
+
}
|
|
485
|
+
catch {
|
|
486
|
+
// browser extension may not be loaded or already closed
|
|
487
|
+
}
|
|
421
488
|
if (!silent)
|
|
422
489
|
process.stdout.write("Spectral relay stopped\n");
|
|
423
490
|
};
|
|
@@ -459,9 +526,6 @@ export async function runServe(opts = {}) {
|
|
|
459
526
|
void gracefulShutdown({
|
|
460
527
|
inFlightCount: () => manager.activeTurnCount(),
|
|
461
528
|
closeRelay: () => {
|
|
462
|
-
// Mirror our own `close()`: dispose the relay (sends close 1000).
|
|
463
|
-
// We don't await here because RelayClient.dispose is sync and
|
|
464
|
-
// the shutdown helper expects a void|Promise return.
|
|
465
529
|
relay.dispose();
|
|
466
530
|
},
|
|
467
531
|
disposeManager: () => {
|
|
@@ -470,6 +534,15 @@ export async function runServe(opts = {}) {
|
|
|
470
534
|
closeStore: () => {
|
|
471
535
|
store.close();
|
|
472
536
|
},
|
|
537
|
+
closeBrowser: async () => {
|
|
538
|
+
try {
|
|
539
|
+
const { BrowserService } = await import("../extensions/browser/browser-service.js");
|
|
540
|
+
await BrowserService.getInstance().close();
|
|
541
|
+
}
|
|
542
|
+
catch {
|
|
543
|
+
// browser extension may not be loaded
|
|
544
|
+
}
|
|
545
|
+
},
|
|
473
546
|
logger: silent
|
|
474
547
|
? { log: () => { }, warn: () => { }, error: () => { } }
|
|
475
548
|
: console,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-service.d.ts","sourceRoot":"","sources":["../../../src/extensions/browser/browser-service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"browser-service.d.ts","sourceRoot":"","sources":["../../../src/extensions/browser/browser-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -275,6 +275,7 @@ export class BrowserService {
|
|
|
275
275
|
this.nextNetworkIndex = 0;
|
|
276
276
|
}
|
|
277
277
|
async close() {
|
|
278
|
+
// Close each page (ignore errors if already closed).
|
|
278
279
|
for (const page of this.pages) {
|
|
279
280
|
try {
|
|
280
281
|
await page.close();
|
|
@@ -283,18 +284,27 @@ export class BrowserService {
|
|
|
283
284
|
}
|
|
284
285
|
this.pages = [];
|
|
285
286
|
this.activePageIndex = 0;
|
|
287
|
+
// Close the browser context.
|
|
286
288
|
if (this.context) {
|
|
287
289
|
try {
|
|
288
|
-
await
|
|
290
|
+
await Promise.race([
|
|
291
|
+
this.context.close(),
|
|
292
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error("context.close timed out")), 5_000)),
|
|
293
|
+
]);
|
|
289
294
|
}
|
|
290
295
|
catch { /* ignore */ }
|
|
291
296
|
this.context = null;
|
|
292
297
|
}
|
|
298
|
+
// Close the browser process (Playwright-managed Chromium).
|
|
299
|
+
// Use a timeout so a hung close doesn't block server shutdown.
|
|
293
300
|
if (this.browser) {
|
|
294
301
|
try {
|
|
295
|
-
await
|
|
302
|
+
await Promise.race([
|
|
303
|
+
this.browser.close(),
|
|
304
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error("browser.close timed out")), 5_000)),
|
|
305
|
+
]);
|
|
296
306
|
}
|
|
297
|
-
catch { /* ignore */ }
|
|
307
|
+
catch { /* ignore — process.exit will clean up orphans */ }
|
|
298
308
|
this.browser = null;
|
|
299
309
|
}
|
|
300
310
|
this._recording = null;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-Optimizer (CLI side)
|
|
3
|
+
*
|
|
4
|
+
* Two-phase pipeline for project file optimization, modeled after auto-research.
|
|
5
|
+
*
|
|
6
|
+
* Phase 1 — Analyze (action: "analyze"):
|
|
7
|
+
* 1. Scan project filesystem for optimization candidates (size, duplication, complexity).
|
|
8
|
+
* 2. Build an analysis prompt for the agent.
|
|
9
|
+
* 3. Send prompt to the agent session via manager.prompt() with skipPersistence.
|
|
10
|
+
* 4. Parse the agent's response into structured AutoOptimizeRecommendation[].
|
|
11
|
+
* 5. Emit auto_optimize_analysis_complete via relay with recommendations.
|
|
12
|
+
*
|
|
13
|
+
* Phase 2 — Execute (action: "execute"):
|
|
14
|
+
* 1. Receive approvedItemIds from the frame.
|
|
15
|
+
* 2. Apply each approved recommendation via the agent session.
|
|
16
|
+
* 3. Run quality gates (type-check, lint, tests) on modified files.
|
|
17
|
+
* 4. Emit auto_optimize_execution_complete with per-item results and gate status.
|
|
18
|
+
*
|
|
19
|
+
* All errors are surfaced as auto_optimize_error events on the wire.
|
|
20
|
+
*/
|
|
21
|
+
import type { SessionStore } from "../server/storage.js";
|
|
22
|
+
import type { SessionStreamManager, Subscriber } from "../server/session-stream.js";
|
|
23
|
+
import type { RelayClient } from "./client.js";
|
|
24
|
+
export interface AutoOptimizeInput {
|
|
25
|
+
projectId: string;
|
|
26
|
+
sessionId: string;
|
|
27
|
+
action: "analyze" | "execute";
|
|
28
|
+
approvedItemIds?: string[];
|
|
29
|
+
}
|
|
30
|
+
export interface AutoOptimizeDeps {
|
|
31
|
+
store: SessionStore;
|
|
32
|
+
manager: SessionStreamManager;
|
|
33
|
+
relay: Pick<RelayClient, "send">;
|
|
34
|
+
subscribers: Map<string, Subscriber>;
|
|
35
|
+
cwd: string;
|
|
36
|
+
logger?: {
|
|
37
|
+
error: (...args: unknown[]) => void;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export declare function handleAutoOptimize(input: AutoOptimizeInput, deps: AutoOptimizeDeps): void;
|
|
41
|
+
//# sourceMappingURL=auto-optimizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-optimizer.d.ts","sourceRoot":"","sources":["../../src/relay/auto-optimizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EACV,oBAAoB,EACpB,UAAU,EACX,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;KAAE,CAAC;CAClD;AA+UD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,iBAAiB,EACxB,IAAI,EAAE,gBAAgB,GACrB,IAAI,CAoON"}
|