@aexol/spectral 0.9.114 → 0.9.116
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.
|
@@ -178,6 +178,8 @@ export declare class AgentBridge {
|
|
|
178
178
|
* backend can attribute agent-session credits to the bound project.
|
|
179
179
|
*/
|
|
180
180
|
private boundProjectId;
|
|
181
|
+
private bindingWatcher?;
|
|
182
|
+
private bindingWatcherTimer?;
|
|
181
183
|
constructor(opts: AgentBridgeOptions);
|
|
182
184
|
/**
|
|
183
185
|
* Create the spectral session, wire up subscription, and return.
|
|
@@ -197,6 +199,14 @@ export declare class AgentBridge {
|
|
|
197
199
|
* Re-reads the binding file and updates provider headers in place.
|
|
198
200
|
*/
|
|
199
201
|
reloadProjectBinding(): Promise<void>;
|
|
202
|
+
/**
|
|
203
|
+
* Watch the `.aexol/aexol.jsonc` binding file for external changes so the
|
|
204
|
+
* X-Project-Id header on synthetic providers stays in sync without a manual
|
|
205
|
+
* reload. Debounced because `fs.watch` can fire multiple times for a single
|
|
206
|
+
* save. Errors are swallowed — a broken watcher must never break the agent.
|
|
207
|
+
*/
|
|
208
|
+
private setupBindingWatcher;
|
|
209
|
+
private teardownBindingWatcher;
|
|
200
210
|
private refreshAllowedModels;
|
|
201
211
|
/**
|
|
202
212
|
* Register one synthetic provider per upstream API shape. Anthropic models
|
|
@@ -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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"}
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
*/
|
|
51
51
|
import { AuthStorage, createAgentSession, DefaultResourceLoader, ModelRegistry, SessionManager, SettingsManager, } from "../sdk/coding-agent/index.js";
|
|
52
52
|
import { randomUUID } from "node:crypto";
|
|
53
|
-
import { existsSync, statSync } from "node:fs";
|
|
53
|
+
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";
|
|
@@ -64,7 +64,7 @@ import designerExtension from "../designer/index.js";
|
|
|
64
64
|
import observationalMemory from "../memory/index.js";
|
|
65
65
|
import { OBSERVATIONAL_MEMORY_CONTEXT_CUSTOM_TYPE, OBSERVATIONAL_MEMORY_SNAPSHOT_CUSTOM_TYPE, } from "../memory/types.js";
|
|
66
66
|
import { fetchAllowedModels as defaultFetchAllowedModels, } from "../relay/models-fetch.js";
|
|
67
|
-
import { readStudioBinding } from "../studio-binding.js";
|
|
67
|
+
import { readStudioBinding, getBindingFilePath } from "../studio-binding.js";
|
|
68
68
|
/**
|
|
69
69
|
* Synthetic provider names registered with spectral's `ModelRegistry`. They route
|
|
70
70
|
* 100% of inference traffic through the backend (`${backendUrl}/v1`), which
|
|
@@ -586,6 +586,8 @@ export class AgentBridge {
|
|
|
586
586
|
* backend can attribute agent-session credits to the bound project.
|
|
587
587
|
*/
|
|
588
588
|
boundProjectId = null;
|
|
589
|
+
bindingWatcher;
|
|
590
|
+
bindingWatcherTimer;
|
|
589
591
|
constructor(opts) {
|
|
590
592
|
this.opts = opts;
|
|
591
593
|
}
|
|
@@ -804,6 +806,7 @@ export class AgentBridge {
|
|
|
804
806
|
// Resolve the studio project binding before registering synthetic
|
|
805
807
|
// providers so the `X-Project-Id` header is present from the first call.
|
|
806
808
|
await this.refreshProjectBinding();
|
|
809
|
+
this.setupBindingWatcher();
|
|
807
810
|
let allowedModels;
|
|
808
811
|
try {
|
|
809
812
|
allowedModels = await this.refreshAllowedModels();
|
|
@@ -909,6 +912,64 @@ export class AgentBridge {
|
|
|
909
912
|
async reloadProjectBinding() {
|
|
910
913
|
await this.refreshProjectBinding();
|
|
911
914
|
}
|
|
915
|
+
/**
|
|
916
|
+
* Watch the `.aexol/aexol.jsonc` binding file for external changes so the
|
|
917
|
+
* X-Project-Id header on synthetic providers stays in sync without a manual
|
|
918
|
+
* reload. Debounced because `fs.watch` can fire multiple times for a single
|
|
919
|
+
* save. Errors are swallowed — a broken watcher must never break the agent.
|
|
920
|
+
*/
|
|
921
|
+
setupBindingWatcher() {
|
|
922
|
+
if (this.bindingWatcher)
|
|
923
|
+
return;
|
|
924
|
+
let bindingPath;
|
|
925
|
+
try {
|
|
926
|
+
bindingPath = getBindingFilePath(this.opts.cwd);
|
|
927
|
+
}
|
|
928
|
+
catch {
|
|
929
|
+
return;
|
|
930
|
+
}
|
|
931
|
+
try {
|
|
932
|
+
this.bindingWatcher = watch(bindingPath, (eventType) => {
|
|
933
|
+
// Debounce — editors often trigger several events per save.
|
|
934
|
+
if (this.bindingWatcherTimer)
|
|
935
|
+
clearTimeout(this.bindingWatcherTimer);
|
|
936
|
+
this.bindingWatcherTimer = setTimeout(() => {
|
|
937
|
+
this.bindingWatcherTimer = undefined;
|
|
938
|
+
// Both 'change' and 'rename' can signal content updates or
|
|
939
|
+
// deletion. refreshProjectBinding reads the file and handles
|
|
940
|
+
// ENOENT (deleted) by falling back to null — so a single code
|
|
941
|
+
// path covers update and delete.
|
|
942
|
+
this.refreshProjectBinding().catch(() => {
|
|
943
|
+
/* ignore — best effort */
|
|
944
|
+
});
|
|
945
|
+
}, 300);
|
|
946
|
+
});
|
|
947
|
+
// macOS/Windows fs.watch uses recursive watchers on directories but
|
|
948
|
+
// a non-existent file throws on some platforms. If the watcher emits
|
|
949
|
+
// an 'error' event, tear it down quietly.
|
|
950
|
+
this.bindingWatcher.on("error", () => {
|
|
951
|
+
this.teardownBindingWatcher();
|
|
952
|
+
});
|
|
953
|
+
}
|
|
954
|
+
catch {
|
|
955
|
+
// File may not exist yet (no binding). That's fine — when it is
|
|
956
|
+
// created later a manual reloadProjectBinding() will pick it up.
|
|
957
|
+
this.bindingWatcher = undefined;
|
|
958
|
+
}
|
|
959
|
+
}
|
|
960
|
+
teardownBindingWatcher() {
|
|
961
|
+
if (this.bindingWatcherTimer) {
|
|
962
|
+
clearTimeout(this.bindingWatcherTimer);
|
|
963
|
+
this.bindingWatcherTimer = undefined;
|
|
964
|
+
}
|
|
965
|
+
try {
|
|
966
|
+
this.bindingWatcher?.close();
|
|
967
|
+
}
|
|
968
|
+
catch {
|
|
969
|
+
/* ignore */
|
|
970
|
+
}
|
|
971
|
+
this.bindingWatcher = undefined;
|
|
972
|
+
}
|
|
912
973
|
async refreshAllowedModels(opts) {
|
|
913
974
|
if (!this.modelRegistry) {
|
|
914
975
|
throw new Error("AgentBridge model registry unavailable");
|
|
@@ -1377,6 +1438,7 @@ export class AgentBridge {
|
|
|
1377
1438
|
if (this.disposed)
|
|
1378
1439
|
return;
|
|
1379
1440
|
this.disposed = true;
|
|
1441
|
+
this.teardownBindingWatcher();
|
|
1380
1442
|
// Persist the current in-flight message (if any) before tearing down.
|
|
1381
1443
|
// Without this, cancelling mid-turn loses the message along with its
|
|
1382
1444
|
// token_usage event, which breaks context-window tracking on reconnect.
|
package/dist/studio-binding.d.ts
CHANGED
|
@@ -10,6 +10,8 @@ export interface StudioBinding {
|
|
|
10
10
|
name?: string;
|
|
11
11
|
$schema?: string;
|
|
12
12
|
}
|
|
13
|
+
/** Absolute path to the studio binding file for a given cwd. */
|
|
14
|
+
export declare function getBindingFilePath(cwd?: string): string;
|
|
13
15
|
/**
|
|
14
16
|
* Strip JSONC comments (line // and block comments) from raw source text.
|
|
15
17
|
* Kept simple — the binding file shape is well-known.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"studio-binding.d.ts","sourceRoot":"","sources":["../src/studio-binding.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"studio-binding.d.ts","sourceRoot":"","sources":["../src/studio-binding.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAYD,gEAAgE;AAChE,wBAAgB,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAItD;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAU/B;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAY/B;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,aAAa,EACtB,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAcf;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,CAcf;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASxE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASjF"}
|
package/dist/studio-binding.js
CHANGED
|
@@ -15,6 +15,10 @@ function bindingDir(cwd) {
|
|
|
15
15
|
function bindingPath(cwd) {
|
|
16
16
|
return join(bindingDir(cwd), BINDING_FILE);
|
|
17
17
|
}
|
|
18
|
+
/** Absolute path to the studio binding file for a given cwd. */
|
|
19
|
+
export function getBindingFilePath(cwd) {
|
|
20
|
+
return bindingPath(cwd);
|
|
21
|
+
}
|
|
18
22
|
/**
|
|
19
23
|
* Strip JSONC comments (line // and block comments) from raw source text.
|
|
20
24
|
* Kept simple — the binding file shape is well-known.
|