@aexol/spectral 0.9.173 → 0.9.175

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.
Files changed (48) hide show
  1. package/dist/commands/serve.d.ts.map +1 -1
  2. package/dist/commands/serve.js +1 -0
  3. package/dist/extensions/desktop-screenshot/index.d.ts.map +1 -1
  4. package/dist/extensions/desktop-screenshot/index.js +6 -5
  5. package/dist/generated/zeus/const.d.ts.map +1 -1
  6. package/dist/generated/zeus/const.js +6 -2
  7. package/dist/generated/zeus/index.d.ts +24 -0
  8. package/dist/generated/zeus/index.d.ts.map +1 -1
  9. package/dist/memory/config.d.ts +2 -0
  10. package/dist/memory/config.d.ts.map +1 -1
  11. package/dist/memory/config.js +25 -0
  12. package/dist/relay/auto-optimizer.d.ts +1 -1
  13. package/dist/relay/auto-optimizer.d.ts.map +1 -1
  14. package/dist/relay/auto-optimizer.js +3 -3
  15. package/dist/relay/auto-research.d.ts +1 -1
  16. package/dist/relay/auto-research.d.ts.map +1 -1
  17. package/dist/relay/auto-research.js +3 -3
  18. package/dist/relay/dispatcher.d.ts +7 -2
  19. package/dist/relay/dispatcher.d.ts.map +1 -1
  20. package/dist/relay/dispatcher.js +27 -20
  21. package/dist/server/handlers/agent-settings.d.ts +6 -0
  22. package/dist/server/handlers/agent-settings.d.ts.map +1 -1
  23. package/dist/server/handlers/agent-settings.js +88 -1
  24. package/dist/server/handlers/paths-autocomplete.d.ts +4 -4
  25. package/dist/server/handlers/paths-autocomplete.d.ts.map +1 -1
  26. package/dist/server/handlers/paths-autocomplete.js +10 -10
  27. package/dist/server/handlers/projects.d.ts +6 -0
  28. package/dist/server/handlers/projects.d.ts.map +1 -1
  29. package/dist/server/handlers/projects.js +18 -0
  30. package/dist/server/handlers/sessions.d.ts +12 -0
  31. package/dist/server/handlers/sessions.d.ts.map +1 -1
  32. package/dist/server/handlers/sessions.js +68 -0
  33. package/dist/server/handlers/settings-lock.d.ts +19 -0
  34. package/dist/server/handlers/settings-lock.d.ts.map +1 -1
  35. package/dist/server/handlers/settings-lock.js +65 -1
  36. package/dist/server/handlers/settings.d.ts +4 -0
  37. package/dist/server/handlers/settings.d.ts.map +1 -1
  38. package/dist/server/handlers/settings.js +38 -2
  39. package/dist/server/session-stream.d.ts +6 -1
  40. package/dist/server/session-stream.d.ts.map +1 -1
  41. package/dist/server/session-stream.js +32 -12
  42. package/dist/server/sqlite-adapter.d.ts +31 -0
  43. package/dist/server/sqlite-adapter.d.ts.map +1 -1
  44. package/dist/server/sqlite-adapter.js +53 -0
  45. package/dist/server/storage.d.ts +52 -0
  46. package/dist/server/storage.d.ts.map +1 -1
  47. package/dist/server/storage.js +178 -8
  48. package/package.json +1 -1
@@ -31,6 +31,10 @@ export function handleGetProjectObservations(store, id, limit = 30) {
31
31
  export function handleListProjects(store) {
32
32
  return store.listProjects();
33
33
  }
34
+ /** Async relay-path twin of {@link handleListProjects}. */
35
+ export async function handleListProjectsAsync(store) {
36
+ return store.listProjectsAsync();
37
+ }
34
38
  export function handleCreateProject(store, body) {
35
39
  if (typeof body.name !== "string" || !body.name.trim()) {
36
40
  throw new BadRequestError("name (non-empty string) is required");
@@ -50,6 +54,13 @@ export function handleGetProject(store, id) {
50
54
  throw new NotFoundError("Project not found");
51
55
  return project;
52
56
  }
57
+ /** Async relay-path twin of {@link handleGetProject}. */
58
+ export async function handleGetProjectAsync(store, id) {
59
+ const project = await store.getProjectAsync(id);
60
+ if (!project)
61
+ throw new NotFoundError("Project not found");
62
+ return project;
63
+ }
53
64
  export function handleUpdateProject(store, id, body) {
54
65
  const update = {};
55
66
  if (body.name !== undefined) {
@@ -157,6 +168,13 @@ export function handleListSessionsByProject(store, id) {
157
168
  throw new NotFoundError("Project not found");
158
169
  return store.listSessionsByProject(id);
159
170
  }
171
+ /** Async relay-path twin of {@link handleListSessionsByProject}. */
172
+ export async function handleListSessionsByProjectAsync(store, id) {
173
+ const project = await store.getProjectAsync(id);
174
+ if (!project)
175
+ throw new NotFoundError("Project not found");
176
+ return store.listSessionsByProjectAsync(id);
177
+ }
160
178
  export function handleCleanupProjectSessions(store, id, body) {
161
179
  const project = store.getProject(id);
162
180
  if (!project)
@@ -39,14 +39,26 @@ export interface CompactSessionInputRaw {
39
39
  export declare function parseCompactSessionMode(body: unknown): CompactSessionMode;
40
40
  export declare function handleCreateSession(store: SessionStore, body: CreateSessionInputRaw): WireSessionSummary;
41
41
  export declare function handleGetSessionDetail(store: SessionStore, id: string): WireSessionDetail;
42
+ /** Async relay-path twin of {@link handleGetSessionDetail}. */
43
+ export declare function handleGetSessionDetailAsync(store: SessionStore, id: string): Promise<WireSessionDetail>;
42
44
  export declare function handleGetSessionMessages(store: SessionStore, id: string, query: GetSessionMessagesInputRaw): WireSessionDetail;
45
+ /** Async relay-path twin of {@link handleGetSessionMessages}. */
46
+ export declare function handleGetSessionMessagesAsync(store: SessionStore, id: string, query: GetSessionMessagesInputRaw): Promise<WireSessionDetail>;
43
47
  export declare function handleUpdateSession(store: SessionStore, id: string, body: UpdateSessionInputRaw): WireSessionSummary;
44
48
  export declare function handleGetSessionActiveAgent(store: SessionStore, id: string): {
45
49
  activeAgent: string | null;
46
50
  };
51
+ /** Async relay-path twin of {@link handleGetSessionActiveAgent}. */
52
+ export declare function handleGetSessionActiveAgentAsync(store: SessionStore, id: string): Promise<{
53
+ activeAgent: string | null;
54
+ }>;
47
55
  export declare function handleUpdateSessionActiveAgent(store: SessionStore, id: string, body: UpdateSessionAgentInputRaw, manager?: SessionStreamManager): {
48
56
  activeAgent: string | null;
49
57
  };
58
+ /** Async relay-path twin of {@link handleUpdateSessionActiveAgent}. */
59
+ export declare function handleUpdateSessionActiveAgentAsync(store: SessionStore, id: string, body: UpdateSessionAgentInputRaw, manager?: SessionStreamManager): Promise<{
60
+ activeAgent: string | null;
61
+ }>;
50
62
  export declare function handleDeleteSession(store: SessionStore, id: string): void;
51
63
  export declare function handleGetSessionMemoryStatus(store: SessionStore, manager: SessionStreamManager, id: string): WireSessionMemoryStatus;
52
64
  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":"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"}
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/sessions.ts"],"names":[],"mappings":"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"}
@@ -47,6 +47,22 @@ export function handleGetSessionDetail(store, id) {
47
47
  ...(store.getForkCompactSource(id) ? { forkCompactPending: true } : {}),
48
48
  };
49
49
  }
50
+ /** Async relay-path twin of {@link handleGetSessionDetail}. */
51
+ export async function handleGetSessionDetailAsync(store, id) {
52
+ const meta = await store.getSessionMetaAsync(id);
53
+ if (!meta)
54
+ throw new NotFoundError("Session not found");
55
+ return {
56
+ ...meta,
57
+ messages: [],
58
+ totalMessageCount: 0,
59
+ loadedMessageCount: 0,
60
+ hasEarlierMessages: false,
61
+ ...(await store.getForkCompactSourceAsync(id)
62
+ ? { forkCompactPending: true }
63
+ : {}),
64
+ };
65
+ }
50
66
  export function handleGetSessionMessages(store, id, query) {
51
67
  const meta = store.getSessionMeta(id);
52
68
  if (!meta)
@@ -80,6 +96,40 @@ export function handleGetSessionMessages(store, id, query) {
80
96
  hasEarlierMessages: totalMessageCount > loadedMessageCount && projectedMessages.length > 0,
81
97
  };
82
98
  }
99
+ /** Async relay-path twin of {@link handleGetSessionMessages}. */
100
+ export async function handleGetSessionMessagesAsync(store, id, query) {
101
+ const meta = await store.getSessionMetaAsync(id);
102
+ if (!meta)
103
+ throw new NotFoundError("Session not found");
104
+ const rawLimit = typeof query.limit === "string" ? Number(query.limit) : Number(query.limit ?? 50);
105
+ const limit = Number.isFinite(rawLimit) ? Math.max(1, Math.min(200, rawLimit)) : 50;
106
+ const beforeCreatedAt = typeof query.beforeCreatedAt === "string" && query.beforeCreatedAt.trim().length > 0
107
+ ? Number(query.beforeCreatedAt)
108
+ : typeof query.beforeCreatedAt === "number"
109
+ ? query.beforeCreatedAt
110
+ : null;
111
+ if (beforeCreatedAt !== null && !Number.isFinite(beforeCreatedAt)) {
112
+ throw new BadRequestError("beforeCreatedAt must be a valid number");
113
+ }
114
+ const beforeId = typeof query.beforeId === "string" && query.beforeId.trim().length > 0
115
+ ? query.beforeId
116
+ : null;
117
+ const messages = await store.getMessagesBeforeAsync(id, {
118
+ beforeCreatedAt,
119
+ beforeId,
120
+ limit,
121
+ });
122
+ const projectedMessages = projectHistoryForReplay(messages);
123
+ const totalMessageCount = store.countMessagesBySession(id);
124
+ const loadedMessageCount = projectedMessages.length;
125
+ return {
126
+ ...meta,
127
+ messages: projectedMessages,
128
+ totalMessageCount,
129
+ loadedMessageCount,
130
+ hasEarlierMessages: totalMessageCount > loadedMessageCount && projectedMessages.length > 0,
131
+ };
132
+ }
83
133
  export function handleUpdateSession(store, id, body) {
84
134
  if (typeof body.title !== "string") {
85
135
  throw new BadRequestError("title (string) is required");
@@ -94,6 +144,12 @@ export function handleGetSessionActiveAgent(store, id) {
94
144
  throw new NotFoundError("Session not found");
95
145
  return { activeAgent: store.getSessionActiveAgent(id) };
96
146
  }
147
+ /** Async relay-path twin of {@link handleGetSessionActiveAgent}. */
148
+ export async function handleGetSessionActiveAgentAsync(store, id) {
149
+ if (!await store.getSessionMetaAsync(id))
150
+ throw new NotFoundError("Session not found");
151
+ return { activeAgent: await store.getSessionActiveAgentAsync(id) };
152
+ }
97
153
  export function handleUpdateSessionActiveAgent(store, id, body, manager) {
98
154
  if (!store.getSession(id))
99
155
  throw new NotFoundError("Session not found");
@@ -108,6 +164,18 @@ export function handleUpdateSessionActiveAgent(store, id, body, manager) {
108
164
  manager?.updateActivePrimaryAgent(id, nextAgent);
109
165
  return { activeAgent: store.getSessionActiveAgent(id) };
110
166
  }
167
+ /** Async relay-path twin of {@link handleUpdateSessionActiveAgent}. */
168
+ export async function handleUpdateSessionActiveAgentAsync(store, id, body, manager) {
169
+ if (!await store.getSessionMetaAsync(id))
170
+ throw new NotFoundError("Session not found");
171
+ if (body.activeAgent !== null && body.activeAgent !== undefined && typeof body.activeAgent !== "string") {
172
+ throw new BadRequestError("activeAgent must be a string, null, or omitted");
173
+ }
174
+ const nextAgent = body.activeAgent === undefined ? null : body.activeAgent;
175
+ store.setSessionActiveAgent(id, nextAgent);
176
+ manager?.updateActivePrimaryAgent(id, nextAgent);
177
+ return { activeAgent: await store.getSessionActiveAgentAsync(id) };
178
+ }
111
179
  export function handleDeleteSession(store, id) {
112
180
  const deleted = store.deleteSession(id);
113
181
  if (!deleted)
@@ -7,6 +7,13 @@ import { BadRequestError } from "./errors.js";
7
7
  * agent) cannot interleave and corrupt the file.
8
8
  */
9
9
  export declare function acquireLockSyncWithRetry(path: string): () => void;
10
+ /**
11
+ * Async twin of {@link acquireLockSyncWithRetry}. Uses `proper-lockfile`'s
12
+ * promise API and sleeps between `ELOCKED` attempts instead of busy-waiting
13
+ * so the relay event loop stays responsive while another request holds the
14
+ * settings lock.
15
+ */
16
+ export declare function acquireLockWithRetry(path: string): Promise<() => Promise<void>>;
10
17
  /**
11
18
  * Resolve the `settings.json` path for a given agent directory.
12
19
  * Falls back to the default agent dir (`~/.spectral/agent`) when
@@ -32,6 +39,18 @@ export declare function withSettingsLock(opts: {
32
39
  settingsPath?: string;
33
40
  namespace: string;
34
41
  }, fn: (current: Record<string, unknown>) => Record<string, unknown> | undefined): void;
42
+ /**
43
+ * Async twin of {@link withSettingsLock} for the relay REST path.
44
+ *
45
+ * Reads and writes through `node:fs/promises` and acquires the lock
46
+ * asynchronously so the event loop is never blocked while waiting on
47
+ * another settings write.
48
+ */
49
+ export declare function withSettingsLockAsync(opts: {
50
+ agentDir?: string;
51
+ settingsPath?: string;
52
+ namespace: string;
53
+ }, fn: (current: Record<string, unknown>) => Record<string, unknown> | undefined): Promise<void>;
35
54
  /** Re-exported for handler convenience. */
36
55
  export { BadRequestError };
37
56
  //# sourceMappingURL=settings-lock.d.ts.map
@@ -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,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"}
1
+ {"version":3,"file":"settings-lock.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/settings-lock.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,IAAI,CAqBjE;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAoBrF;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;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,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,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED,2CAA2C;AAC3C,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
3
  import { dirname, join } from "node:path";
3
4
  import lockfile from "proper-lockfile";
4
5
  import { getAgentDir } from "../../sdk/coding-agent/index.js";
@@ -27,8 +28,34 @@ export function acquireLockSyncWithRetry(path) {
27
28
  }
28
29
  lastError = error;
29
30
  const start = Date.now();
30
- while (Date.now() - start < delayMs) {
31
+ while (Date.now() - start < delayMs) { }
32
+ }
33
+ }
34
+ throw lastError ?? new Error("Failed to acquire settings lock");
35
+ }
36
+ /**
37
+ * Async twin of {@link acquireLockSyncWithRetry}. Uses `proper-lockfile`'s
38
+ * promise API and sleeps between `ELOCKED` attempts instead of busy-waiting
39
+ * so the relay event loop stays responsive while another request holds the
40
+ * settings lock.
41
+ */
42
+ export async function acquireLockWithRetry(path) {
43
+ const maxAttempts = 10;
44
+ const delayMs = 20;
45
+ let lastError;
46
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
47
+ try {
48
+ return await lockfile.lock(path, { realpath: false });
49
+ }
50
+ catch (error) {
51
+ const code = typeof error === "object" && error !== null && "code" in error
52
+ ? String(error.code)
53
+ : undefined;
54
+ if (code !== "ELOCKED" || attempt === maxAttempts) {
55
+ throw error;
31
56
  }
57
+ lastError = error;
58
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
32
59
  }
33
60
  }
34
61
  throw lastError ?? new Error("Failed to acquire settings lock");
@@ -85,5 +112,42 @@ export function withSettingsLock(opts, fn) {
85
112
  }
86
113
  }
87
114
  }
115
+ /**
116
+ * Async twin of {@link withSettingsLock} for the relay REST path.
117
+ *
118
+ * Reads and writes through `node:fs/promises` and acquires the lock
119
+ * asynchronously so the event loop is never blocked while waiting on
120
+ * another settings write.
121
+ */
122
+ export async function withSettingsLockAsync(opts, fn) {
123
+ const path = opts.settingsPath ?? settingsFilePath(opts.agentDir);
124
+ const dir = dirname(path);
125
+ let release;
126
+ try {
127
+ const fileExists = existsSync(path);
128
+ if (fileExists) {
129
+ release = await acquireLockWithRetry(path);
130
+ }
131
+ const raw = fileExists ? await readFile(path, "utf-8") : "{}";
132
+ const parsed = JSON.parse(raw);
133
+ const ns = (parsed[opts.namespace] ?? {});
134
+ const next = fn(ns);
135
+ if (next !== undefined) {
136
+ parsed[opts.namespace] = { ...ns, ...next };
137
+ if (!existsSync(dir)) {
138
+ await mkdir(dir, { recursive: true });
139
+ }
140
+ if (!release) {
141
+ release = await acquireLockWithRetry(path);
142
+ }
143
+ await writeFile(path, JSON.stringify(parsed, null, 2), "utf-8");
144
+ }
145
+ }
146
+ finally {
147
+ if (release) {
148
+ await release();
149
+ }
150
+ }
151
+ }
88
152
  /** Re-exported for handler convenience. */
89
153
  export { BadRequestError };
@@ -32,5 +32,9 @@ export interface GetSettingsOutput {
32
32
  debugLog: boolean;
33
33
  }
34
34
  export declare function handleGetSettings(cwd: string): GetSettingsOutput;
35
+ /** Async relay-path twin of {@link handleGetSettings}. */
36
+ export declare function handleGetSettingsAsync(cwd: string): Promise<GetSettingsOutput>;
35
37
  export declare function handlePutSettings(cwd: string, body: PutSettingsInput): PutSettingsOutput;
38
+ /** Async relay-path twin of {@link handlePutSettings}. */
39
+ export declare function handlePutSettingsAsync(cwd: string, body: PutSettingsInput): Promise<PutSettingsOutput>;
36
40
  //# sourceMappingURL=settings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/settings.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAChC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB;AACD,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,IAAI,CAAC;IACT,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAEjC,0BAA0B,EAAE,MAAM,CAAC;IACnC,yBAAyB,EAAE,MAAM,CAAC;IAClC,yBAAyB,EAAE,MAAM,CAAC;IAElC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,EAAE,MAAM,CAAC;IACjC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,+BAA+B,EAAE,MAAM,CAAC;IACxC,sBAAsB,EAAE,MAAM,CAAC;IAE/B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,wBAAwB,EAAE,MAAM,CAAC;IACjC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,CAAC;IAE/B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CAClB;AAuDD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAqBhE;AAsBD,wBAAgB,iBAAiB,CAChC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,gBAAgB,GACpB,iBAAiB,CAanB"}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/settings.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAChC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB;AACD,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,IAAI,CAAC;IACT,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAEjC,0BAA0B,EAAE,MAAM,CAAC;IACnC,yBAAyB,EAAE,MAAM,CAAC;IAClC,yBAAyB,EAAE,MAAM,CAAC;IAElC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,EAAE,MAAM,CAAC;IACjC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,+BAA+B,EAAE,MAAM,CAAC;IACxC,sBAAsB,EAAE,MAAM,CAAC;IAE/B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,wBAAwB,EAAE,MAAM,CAAC;IACjC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,CAAC;IAE/B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CAClB;AAuDD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAqBhE;AAED,0DAA0D;AAC1D,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAqBpF;AAsBD,wBAAgB,iBAAiB,CAChC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,gBAAgB,GACpB,iBAAiB,CAanB;AAED,0DAA0D;AAC1D,wBAAsB,sBAAsB,CAC3C,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,gBAAgB,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAa5B"}
@@ -1,6 +1,6 @@
1
- import { loadConfig, resolveTurnLimits } from "../../memory/config.js";
1
+ import { loadConfig, loadConfigAsync, resolveTurnLimits } from "../../memory/config.js";
2
2
  import { BadRequestError } from "./errors.js";
3
- import { withSettingsLock } from "./settings-lock.js";
3
+ import { withSettingsLock, withSettingsLockAsync } from "./settings-lock.js";
4
4
  const MIN_TOKENS = 1_000;
5
5
  const MAX_TOKENS = 1_000_000;
6
6
  const MIN_ITERATION = 1;
@@ -62,6 +62,29 @@ export function handleGetSettings(cwd) {
62
62
  debugLog: config.debugLog,
63
63
  };
64
64
  }
65
+ /** Async relay-path twin of {@link handleGetSettings}. */
66
+ export async function handleGetSettingsAsync(cwd) {
67
+ const config = await loadConfigAsync(cwd);
68
+ const turnLimits = resolveTurnLimits(config);
69
+ return {
70
+ observationThresholdTokens: config.observationThresholdTokens,
71
+ compactionThresholdTokens: config.compactionThresholdTokens,
72
+ reflectionThresholdTokens: config.reflectionThresholdTokens,
73
+ dcpNudgeMinRawTokens: config.dcpNudgeMinRawTokens,
74
+ dcpNudgeMinContextTokens: config.dcpNudgeMinContextTokens,
75
+ dcpNudgeContextPercent: config.dcpNudgeContextPercent,
76
+ dcpNudgeTurnInterval: config.dcpNudgeTurnInterval,
77
+ dcpInRunNudgeIterationThreshold: config.dcpInRunNudgeIterationThreshold,
78
+ dcpInRunNudgeFrequency: config.dcpInRunNudgeFrequency,
79
+ observerMaxTurnsPerRun: turnLimits.observerMaxTurnsPerRun,
80
+ observerMaxChunkTokens: config.observerMaxChunkTokens ?? 30_000,
81
+ reflectorMaxTurnsPerPass: turnLimits.reflectorMaxTurnsPerPass,
82
+ prunerMaxTurnsPerPass: turnLimits.prunerMaxTurnsPerPass,
83
+ compactionMaxToolCalls: config.compactionMaxToolCalls ?? turnLimits.reflectorMaxTurnsPerPass,
84
+ passive: config.passive,
85
+ debugLog: config.debugLog,
86
+ };
87
+ }
65
88
  function validateValue(meta, value) {
66
89
  if (meta.kind === "boolean") {
67
90
  if (typeof value !== "boolean") {
@@ -91,3 +114,16 @@ export function handlePutSettings(cwd, body) {
91
114
  });
92
115
  return { ok: true, key, value };
93
116
  }
117
+ /** Async relay-path twin of {@link handlePutSettings}. */
118
+ export async function handlePutSettingsAsync(cwd, body) {
119
+ if (typeof body.key !== "string" || !ALLOWED_KEYS.has(body.key)) {
120
+ throw new BadRequestError(`settings key must be one of: ${[...ALLOWED_KEYS].join(", ")}`);
121
+ }
122
+ const key = body.key;
123
+ const meta = SETTING_META[key];
124
+ const value = validateValue(meta, body.value);
125
+ await withSettingsLockAsync({ namespace: "observational-memory" }, (current) => {
126
+ return { ...current, [key]: value };
127
+ });
128
+ return { ok: true, key, value };
129
+ }
@@ -286,10 +286,15 @@ export declare class SessionStreamManager {
286
286
  * initial `session_ready` frame using the returned replay payload (this
287
287
  * keeps wire-protocol concerns in the routes layer).
288
288
  *
289
+ * The first-attach full-history read goes through the adapter's paged
290
+ * async `queryAll` path so a large multi-MB event-blob scan does not block
291
+ * the Node event loop for the duration of a synchronous `better-sqlite3`
292
+ * `stmt.all()` call.
293
+ *
289
294
  * Throws if the session id is unknown in SQLite (caller should turn this
290
295
  * into a wire-level error frame + close).
291
296
  */
292
- attach(sessionId: string, subscriber: Subscriber): AttachResult;
297
+ attach(sessionId: string, subscriber: Subscriber): Promise<AttachResult>;
293
298
  /**
294
299
  * Detach a subscriber. Idempotent. Does NOT dispose the underlying spectral
295
300
  * session — even when subscribers reach zero, the in-flight turn must
@@ -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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"}
@@ -551,25 +551,45 @@ export class SessionStreamManager {
551
551
  * initial `session_ready` frame using the returned replay payload (this
552
552
  * keeps wire-protocol concerns in the routes layer).
553
553
  *
554
+ * The first-attach full-history read goes through the adapter's paged
555
+ * async `queryAll` path so a large multi-MB event-blob scan does not block
556
+ * the Node event loop for the duration of a synchronous `better-sqlite3`
557
+ * `stmt.all()` call.
558
+ *
554
559
  * Throws if the session id is unknown in SQLite (caller should turn this
555
560
  * into a wire-level error frame + close).
556
561
  */
557
- attach(sessionId, subscriber) {
562
+ async attach(sessionId, subscriber) {
558
563
  if (this.disposed)
559
564
  throw new Error("SessionStreamManager disposed");
560
- const detail = this.store.getSession(sessionId);
561
- if (!detail)
562
- throw new Error(`Unknown sessionId: ${sessionId}`);
563
- const totalMessageCount = this.store.countMessagesBySession(sessionId);
564
- const rawHistory = totalMessageCount > UI_HISTORY_TAIL_MESSAGE_LIMIT
565
- ? this.store.getMessagesTail(sessionId, UI_HISTORY_TAIL_MESSAGE_LIMIT)
566
- : detail.messages;
567
- const loadedMessageCount = rawHistory.length;
568
565
  let stream = this.streams.get(sessionId);
569
566
  if (!stream) {
570
- stream = this.createStream(sessionId, detail.messages);
567
+ // Full history is only required to rehydrate the LLM bridge on first
568
+ // attach. Subsequent attaches (e.g. a second browser tab) read only the
569
+ // bounded UI tail below, avoiding the full multi-MB event-blob scan.
570
+ // Preserve the exact `getSession()` ordering while paging the heavy
571
+ // multi-blob read through the adapter's async trampoline.
572
+ const meta = this.store.getSessionMeta(sessionId);
573
+ if (!meta)
574
+ throw new Error(`Unknown sessionId: ${sessionId}`);
575
+ const messages = await this.store.getMessagesAsync(sessionId);
576
+ stream = this.createStream(sessionId, messages);
571
577
  this.streams.set(sessionId, stream);
572
578
  }
579
+ else {
580
+ // Validate existence without loading the full message history.
581
+ if (!this.store.getSessionMeta(sessionId)) {
582
+ throw new Error(`Unknown sessionId: ${sessionId}`);
583
+ }
584
+ }
585
+ // Bounded reads for the browser replay payload: message count + the most
586
+ // recent `UI_HISTORY_TAIL_MESSAGE_LIMIT` messages. When the session has
587
+ // fewer than the tail limit, the tail query returns every message,
588
+ // matching the previous `detail.messages` path exactly. The first-attach
589
+ // branch already validated session existence via `getSession()`.
590
+ const totalMessageCount = this.store.countMessagesBySession(sessionId);
591
+ const rawHistory = this.store.getMessagesTail(sessionId, UI_HISTORY_TAIL_MESSAGE_LIMIT);
592
+ const loadedMessageCount = rawHistory.length;
573
593
  const activeTurnMessageIds = stream.currentMessageId && stream.currentTurn
574
594
  ? assistantMessageIdsForTurn(stream.currentTurn)
575
595
  : new Set();
@@ -1601,8 +1621,8 @@ export class SessionStreamManager {
1601
1621
  cwd,
1602
1622
  sessionId,
1603
1623
  activePrimaryAgent: this.store.getSessionActiveAgent(sessionId),
1604
- teamId: this.store.getProject(this.store.getSession(sessionId)?.projectId ?? "")
1605
- ?.studioTeamId ?? this.machineTeamId,
1624
+ teamId: this.store.getProject(projectId ?? "")?.studioTeamId ??
1625
+ this.machineTeamId,
1606
1626
  nativeResponseId: this.store.getSessionNativeResponseId(sessionId) ?? undefined,
1607
1627
  agentDir: this.agentDir,
1608
1628
  backendUrl: this.backendUrl,
@@ -23,10 +23,41 @@ export interface SqliteStatement<Params extends unknown[] = unknown[], Row = unk
23
23
  all(...params: Params): Row[];
24
24
  get(...params: Params): Row | undefined;
25
25
  run(...params: Params): SqliteRunResult;
26
+ /**
27
+ * Lazy row iterator used by the Node adapter's `queryAll` to page large
28
+ * result sets without materializing them in one native `stmt.all()` call.
29
+ * Bun statements do not expose a compatible iterator; implementations may
30
+ * omit it and callers must fall back to `all`.
31
+ */
32
+ iterate?(...params: Params): IterableIterator<Row>;
26
33
  }
27
34
  /** Full SQLite adapter. Mirrors the better-sqlite3 API surface used by SessionStore. */
28
35
  export interface SqliteAdapter {
29
36
  prepare<Params extends unknown[], Row = unknown>(sql: string): SqliteStatement<Params, Row>;
37
+ /**
38
+ * Off-main-thread query path used by the relay REST dispatcher.
39
+ *
40
+ * Node/better-sqlite3 is synchronous at the native layer, so this wraps
41
+ * the query in a `setImmediate` trampoline that yields to the event loop
42
+ * BEFORE executing the query. This is intentionally a yield rather than a
43
+ * worker-thread offload: it does not remove CPU cost, but it prevents a
44
+ * queue of relay requests from being serialized into one uninterrupted
45
+ * blocking burst, which was what caused each queued request to miss the
46
+ * backend's 30s timeout.
47
+ *
48
+ * Bun does not expose an equivalent promise-based query API, so the Bun
49
+ * adapter falls back to the synchronous `prepare(...).all(...)` path.
50
+ * That keeps the same wire shapes and lets Bun builds remain dependency
51
+ * free.
52
+ */
53
+ queryAll<Row = unknown>(sql: string, ...params: unknown[]): Promise<Row[]>;
54
+ /**
55
+ * Node-only paged query path. `queryAll` uses this when the statement
56
+ * exposes a lazy iterator so large result sets are read in bounded chunks
57
+ * with an event-loop yield between chunks. Bun has no compatible iterator
58
+ * and falls back to the existing synchronous `all()` trampoline.
59
+ */
60
+ queryAllPaged<Row = unknown>(sql: string, pageSize: number, ...params: unknown[]): Promise<Row[]>;
30
61
  exec(sql: string): void;
31
62
  pragma(sql: string): void;
32
63
  transaction<T>(fn: () => T): () => T;
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-adapter.d.ts","sourceRoot":"","sources":["../../src/server/sqlite-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAcH,qFAAqF;AACrF,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe,CAC9B,MAAM,SAAS,OAAO,EAAE,GAAG,OAAO,EAAE,EACpC,GAAG,GAAG,OAAO;IAEb,GAAG,CAAC,GAAG,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,CAAC;IAC9B,GAAG,CAAC,GAAG,MAAM,EAAE,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC;IACxC,GAAG,CAAC,GAAG,MAAM,EAAE,MAAM,GAAG,eAAe,CAAC;CACzC;AAED,wFAAwF;AACxF,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,MAAM,SAAS,OAAO,EAAE,EAAE,GAAG,GAAG,OAAO,EAC7C,GAAG,EAAE,MAAM,GACV,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;IACrC,KAAK,IAAI,IAAI,CAAC;CACf;AAkID;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAK/D"}
1
+ {"version":3,"file":"sqlite-adapter.d.ts","sourceRoot":"","sources":["../../src/server/sqlite-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAcH,qFAAqF;AACrF,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe,CAC9B,MAAM,SAAS,OAAO,EAAE,GAAG,OAAO,EAAE,EACpC,GAAG,GAAG,OAAO;IAEb,GAAG,CAAC,GAAG,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,CAAC;IAC9B,GAAG,CAAC,GAAG,MAAM,EAAE,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC;IACxC,GAAG,CAAC,GAAG,MAAM,EAAE,MAAM,GAAG,eAAe,CAAC;IACxC;;;;;OAKG;IACH,OAAO,CAAC,CAAC,GAAG,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;CACpD;AAED,wFAAwF;AACxF,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,MAAM,SAAS,OAAO,EAAE,EAAE,GAAG,GAAG,OAAO,EAC7C,GAAG,EAAE,MAAM,GACV,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,GAAG,GAAG,OAAO,EACpB,GAAG,EAAE,MAAM,EACX,GAAG,MAAM,EAAE,OAAO,EAAE,GACnB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAClB;;;;;OAKG;IACH,aAAa,CAAC,GAAG,GAAG,OAAO,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,GAAG,MAAM,EAAE,OAAO,EAAE,GACnB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAClB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;IACrC,KAAK,IAAI,IAAI,CAAC;CACf;AA6MD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAK/D"}
@@ -40,6 +40,47 @@ class NodeSqliteAdapter {
40
40
  prepare(sql) {
41
41
  return new NodeStatement(this.db.prepare(sql));
42
42
  }
43
+ queryAll(sql, ...params) {
44
+ return this.queryAllPaged(sql, 200, ...params);
45
+ }
46
+ queryAllPaged(sql, pageSize, ...params) {
47
+ return new Promise((resolve, reject) => {
48
+ try {
49
+ const stmt = this.db.prepare(sql);
50
+ const iterator = stmt.iterate(...params);
51
+ const rows = [];
52
+ const page = [];
53
+ const safePageSize = Number.isFinite(pageSize) && pageSize > 0
54
+ ? Math.floor(pageSize)
55
+ : 200;
56
+ const advance = () => {
57
+ try {
58
+ let next = iterator.next();
59
+ while (!next.done) {
60
+ page.push(next.value);
61
+ if (page.length >= safePageSize) {
62
+ rows.push(...page);
63
+ page.length = 0;
64
+ setImmediate(advance);
65
+ return;
66
+ }
67
+ next = iterator.next();
68
+ }
69
+ if (page.length > 0)
70
+ rows.push(...page);
71
+ resolve(rows);
72
+ }
73
+ catch (err) {
74
+ reject(err instanceof Error ? err : new Error(String(err)));
75
+ }
76
+ };
77
+ advance();
78
+ }
79
+ catch (err) {
80
+ reject(err instanceof Error ? err : new Error(String(err)));
81
+ }
82
+ });
83
+ }
43
84
  exec(sql) {
44
85
  this.db.exec(sql);
45
86
  }
@@ -96,6 +137,18 @@ class BunSqliteAdapter {
96
137
  prepare(sql) {
97
138
  return new BunStatement(this.db.query(sql));
98
139
  }
140
+ queryAll(sql, ...params) {
141
+ // Bun has no native promise-based SQLite query path. This adapter keeps
142
+ // a synchronous fallback so the relay dispatcher can share one async
143
+ // code path across runtimes; see SqliteAdapter.queryAll docs.
144
+ return Promise.resolve(this.db.query(sql).all(...params));
145
+ }
146
+ queryAllPaged(sql, _pageSize, ...params) {
147
+ // Bun does not expose a compatible lazy row iterator. Fall back to the
148
+ // synchronous `.all()` path — the relay dispatcher still shares one async
149
+ // code path and Bun keeps the same wire shapes.
150
+ return Promise.resolve(this.db.query(sql).all(...params));
151
+ }
99
152
  exec(sql) {
100
153
  this.db.exec(sql);
101
154
  }