@aexol/spectral 0.9.212 → 0.9.215

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 (110) hide show
  1. package/dist/backend/generated-images.d.ts +90 -0
  2. package/dist/backend/generated-images.d.ts.map +1 -0
  3. package/dist/backend/generated-images.js +214 -0
  4. package/dist/backend/machine-routing.d.ts +25 -0
  5. package/dist/backend/machine-routing.d.ts.map +1 -0
  6. package/dist/backend/machine-routing.js +35 -0
  7. package/dist/commands/serve.d.ts.map +1 -1
  8. package/dist/commands/serve.js +20 -2
  9. package/dist/extensions/browser/browser-service.d.ts +75 -1
  10. package/dist/extensions/browser/browser-service.d.ts.map +1 -1
  11. package/dist/extensions/browser/browser-service.js +600 -34
  12. package/dist/extensions/browser/index.d.ts +10 -4
  13. package/dist/extensions/browser/index.d.ts.map +1 -1
  14. package/dist/extensions/browser/index.js +44 -5
  15. package/dist/extensions/browser/stream/stream-tool.d.ts +10 -0
  16. package/dist/extensions/browser/stream/stream-tool.d.ts.map +1 -1
  17. package/dist/extensions/browser/stream/stream-tool.js +42 -14
  18. package/dist/extensions/browser/tools/core.d.ts.map +1 -1
  19. package/dist/extensions/browser/tools/core.js +63 -2
  20. package/dist/extensions/desktop-control/index.d.ts +55 -0
  21. package/dist/extensions/desktop-control/index.d.ts.map +1 -0
  22. package/dist/extensions/desktop-control/index.js +633 -0
  23. package/dist/extensions/desktop-control/keys.d.ts +33 -0
  24. package/dist/extensions/desktop-control/keys.d.ts.map +1 -0
  25. package/dist/extensions/desktop-control/keys.js +170 -0
  26. package/dist/extensions/desktop-control/linux.d.ts +26 -0
  27. package/dist/extensions/desktop-control/linux.d.ts.map +1 -0
  28. package/dist/extensions/desktop-control/linux.js +195 -0
  29. package/dist/extensions/desktop-control/macos.d.ts +53 -0
  30. package/dist/extensions/desktop-control/macos.d.ts.map +1 -0
  31. package/dist/extensions/desktop-control/macos.js +382 -0
  32. package/dist/extensions/desktop-control/safety.d.ts +89 -0
  33. package/dist/extensions/desktop-control/safety.d.ts.map +1 -0
  34. package/dist/extensions/desktop-control/safety.js +157 -0
  35. package/dist/extensions/desktop-control/types.d.ts +79 -0
  36. package/dist/extensions/desktop-control/types.d.ts.map +1 -0
  37. package/dist/extensions/desktop-control/types.js +10 -0
  38. package/dist/extensions/desktop-control/windows.d.ts +31 -0
  39. package/dist/extensions/desktop-control/windows.d.ts.map +1 -0
  40. package/dist/extensions/desktop-control/windows.js +276 -0
  41. package/dist/extensions/desktop-screenshot/index.d.ts +103 -0
  42. package/dist/extensions/desktop-screenshot/index.d.ts.map +1 -1
  43. package/dist/extensions/desktop-screenshot/index.js +363 -17
  44. package/dist/extensions/image-generation/index.d.ts.map +1 -1
  45. package/dist/extensions/image-generation/index.js +133 -34
  46. package/dist/extensions/seo/index.d.ts.map +1 -1
  47. package/dist/extensions/seo/index.js +4 -0
  48. package/dist/extensions/seo/tools/backend-bridge.d.ts +4 -0
  49. package/dist/extensions/seo/tools/backend-bridge.d.ts.map +1 -0
  50. package/dist/extensions/seo/tools/backend-bridge.js +378 -0
  51. package/dist/extensions/seo/tools/full-audit.d.ts +2 -0
  52. package/dist/extensions/seo/tools/full-audit.d.ts.map +1 -1
  53. package/dist/extensions/seo/tools/full-audit.js +1 -1
  54. package/dist/extensions/seo/tools/report.d.ts +10 -0
  55. package/dist/extensions/seo/tools/report.d.ts.map +1 -1
  56. package/dist/extensions/seo/tools/report.js +1 -1
  57. package/dist/extensions/spectral-vision-fallback.d.ts.map +1 -1
  58. package/dist/extensions/spectral-vision-fallback.js +11 -1
  59. package/dist/generated/zeus/const.d.ts.map +1 -1
  60. package/dist/generated/zeus/const.js +121 -4
  61. package/dist/generated/zeus/index.d.ts +527 -0
  62. package/dist/generated/zeus/index.d.ts.map +1 -1
  63. package/dist/mcp/tool-registrar.d.ts.map +1 -1
  64. package/dist/mcp/tool-registrar.js +5 -2
  65. package/dist/mcp/types.d.ts +5 -0
  66. package/dist/mcp/types.d.ts.map +1 -1
  67. package/dist/relay/dispatcher.d.ts +12 -1
  68. package/dist/relay/dispatcher.d.ts.map +1 -1
  69. package/dist/relay/dispatcher.js +44 -42
  70. package/dist/sdk/ai/providers/faux.js +1 -1
  71. package/dist/sdk/ai/providers/openai-completions.d.ts.map +1 -1
  72. package/dist/sdk/ai/providers/openai-completions.js +57 -16
  73. package/dist/sdk/ai/providers/openrouter-images.d.ts.map +1 -1
  74. package/dist/sdk/ai/providers/openrouter-images.js +45 -9
  75. package/dist/sdk/ai/providers/simple-options.d.ts.map +1 -1
  76. package/dist/sdk/ai/providers/simple-options.js +2 -0
  77. package/dist/sdk/ai/types.d.ts +37 -1
  78. package/dist/sdk/ai/types.d.ts.map +1 -1
  79. package/dist/sdk/ai/utils/image-source.d.ts +121 -0
  80. package/dist/sdk/ai/utils/image-source.d.ts.map +1 -0
  81. package/dist/sdk/ai/utils/image-source.js +410 -0
  82. package/dist/sdk/coding-agent/core/extensions/native-extensions.d.ts.map +1 -1
  83. package/dist/sdk/coding-agent/core/extensions/native-extensions.js +14 -0
  84. package/dist/sdk/coding-agent/core/extensions/types.d.ts +9 -0
  85. package/dist/sdk/coding-agent/core/extensions/types.d.ts.map +1 -1
  86. package/dist/sdk/coding-agent/core/system-prompt.d.ts.map +1 -1
  87. package/dist/sdk/coding-agent/core/system-prompt.js +15 -9
  88. package/dist/sdk/coding-agent/modes/rpc/rpc-mode.d.ts.map +1 -1
  89. package/dist/sdk/coding-agent/modes/rpc/rpc-mode.js +16 -3
  90. package/dist/sdk/coding-agent/utils/image-resize.d.ts.map +1 -1
  91. package/dist/sdk/coding-agent/utils/image-resize.js +7 -3
  92. package/dist/server/agent-bridge.d.ts +14 -0
  93. package/dist/server/agent-bridge.d.ts.map +1 -1
  94. package/dist/server/agent-bridge.js +105 -26
  95. package/dist/server/handlers/queue.d.ts.map +1 -1
  96. package/dist/server/handlers/queue.js +11 -34
  97. package/dist/server/image-attachments.d.ts +109 -0
  98. package/dist/server/image-attachments.d.ts.map +1 -0
  99. package/dist/server/image-attachments.js +195 -0
  100. package/dist/server/session-stream.d.ts +67 -0
  101. package/dist/server/session-stream.d.ts.map +1 -1
  102. package/dist/server/session-stream.js +222 -23
  103. package/dist/server/storage.d.ts.map +1 -1
  104. package/dist/server/storage.js +10 -31
  105. package/dist/server/ui/terminal-confirm.d.ts +145 -0
  106. package/dist/server/ui/terminal-confirm.d.ts.map +1 -0
  107. package/dist/server/ui/terminal-confirm.js +333 -0
  108. package/dist/server/wire.d.ts +30 -5
  109. package/dist/server/wire.d.ts.map +1 -1
  110. package/package.json +1 -1
@@ -50,6 +50,7 @@ import { setProjectObsStore } from "../memory/project-observations-store.js";
50
50
  import { estimateStringTokens } from "../memory/tokens.js";
51
51
  import { reflectionContent, reflectionId, } from "../memory/types.js";
52
52
  import { humanizeProviderError } from "./error-humanizer.js";
53
+ import { estimateImagesTokens, parseImagesJson, } from "./image-attachments.js";
53
54
  /**
54
55
  * Extract the `creditsUsed` value from a `token_usage` event embedded in an
55
56
  * events JSONL string. Returns `null` if no `token_usage` event is present
@@ -232,7 +233,7 @@ function persistObservationalMemorySnapshot(store, sessionId, bridge) {
232
233
  function estimateStoredMessageReplayTokens(message) {
233
234
  return (estimateStringTokens(message.content) +
234
235
  estimateStringTokens(message.events) +
235
- (message.images?.length ?? 0) * 2_000);
236
+ estimateImagesTokens(message.images));
236
237
  }
237
238
  function formatCompactionTokenStats(event) {
238
239
  const parts = [];
@@ -817,6 +818,155 @@ export class SessionStreamManager {
817
818
  }
818
819
  await Promise.all(promises);
819
820
  }
821
+ /**
822
+ * Hot-reload extension settings (`settings.json`) on every idle, attached
823
+ * session so enabling/disabling a native extension takes effect without
824
+ * restarting the session or waiting for a new session to be created.
825
+ *
826
+ * Busy sessions (in-flight turn, compaction, loop, pending continuation,
827
+ * or a `prompt()` dispatch in progress) are SKIPPED, never queued: the
828
+ * reload swaps the tool registry / extension runner underneath the
829
+ * running turn, so a dispatched tool can resolve against a torn-down
830
+ * runner. Those sessions pick up the new settings the next time a
831
+ * bridge/session is constructed (or on the next explicit refresh while
832
+ * idle, or — via `pendingExtensionsReload` — at their next prompt).
833
+ *
834
+ * Failures are isolated per stream — one broken session (including one
835
+ * whose bridge throws synchronously) must not abort the remaining
836
+ * reloads. Failed streams are re-marked pending so the reload is retried
837
+ * at their next `prompt()`.
838
+ *
839
+ * Concurrent triggers for the same stream share a single reload (the
840
+ * in-flight promise is stored on the stream) — see
841
+ * `reloadStreamExtensions()`.
842
+ *
843
+ * Returns the number of streams reloaded and deferred.
844
+ */
845
+ async reloadExtensions() {
846
+ let reloaded = 0;
847
+ let deferred = 0;
848
+ const promises = [];
849
+ for (const stream of this.streams.values()) {
850
+ if (!stream.bridge?.reloadExtensions)
851
+ continue;
852
+ // Never reload during an in-flight turn — see the doc comment above.
853
+ // `dispatching` closes the R1 window inside `prompt()` between its
854
+ // idle check and `currentTurn` being armed.
855
+ if (this.isReloadBlocked(stream)) {
856
+ // Skip, don't queue: the change is applied before the next prompt.
857
+ stream.pendingExtensionsReload = true;
858
+ deferred++;
859
+ continue;
860
+ }
861
+ // Shared (already in-flight) reloads are accounted for by the caller
862
+ // that started them — we only wait for them here.
863
+ const shared = stream.reloadingExtensions != null;
864
+ const pending = this.reloadStreamExtensions(stream);
865
+ if (shared) {
866
+ promises.push(Promise.resolve(pending).then(() => undefined));
867
+ continue;
868
+ }
869
+ promises.push(pending.then((result) => {
870
+ if (result.status === "reloaded") {
871
+ reloaded++;
872
+ this.broadcast(stream, {
873
+ type: "agent_notification",
874
+ level: "info",
875
+ system: "extension",
876
+ message: "Extensions reloaded from settings",
877
+ });
878
+ return;
879
+ }
880
+ deferred++;
881
+ if (result.status === "skipped")
882
+ return;
883
+ const err = result.error;
884
+ console.warn(`[spectral] warn: extension reload failed for ${stream.sessionId}: ${err instanceof Error ? err.message : String(err)}`);
885
+ this.broadcast(stream, {
886
+ type: "agent_notification",
887
+ level: "warning",
888
+ system: "extension",
889
+ message: `Extension reload failed: ${err instanceof Error ? err.message : String(err)}`,
890
+ });
891
+ }));
892
+ }
893
+ await Promise.all(promises);
894
+ return { reloaded, deferred };
895
+ }
896
+ /**
897
+ * True when an extension hot-reload must not touch this stream right now:
898
+ * a turn is in flight, a `prompt()` dispatch is in progress (R1), or the
899
+ * session is otherwise busy (compaction, loop, pending continuation).
900
+ */
901
+ isReloadBlocked(stream) {
902
+ return (stream.currentTurn !== null ||
903
+ stream.dispatching === true ||
904
+ this.computeBusy(stream));
905
+ }
906
+ /**
907
+ * Hot-reload extension settings on ONE stream, deduped.
908
+ *
909
+ * Dedupe (R5): while a reload for this stream is in flight, every caller
910
+ * (REST refresh racing a `config_patch`, or `prompt()`) awaits the same
911
+ * promise, so the session is reloaded exactly once. The slot is released
912
+ * when the reload settles.
913
+ *
914
+ * Never rejects: the outcome is returned so the caller can decide how to
915
+ * notify. On success `pendingExtensionsReload` is cleared (R3); on failure
916
+ * it is re-armed so the reload is retried at the next `prompt()` (R4).
917
+ */
918
+ reloadStreamExtensions(stream) {
919
+ const inFlight = stream.reloadingExtensions;
920
+ if (inFlight)
921
+ return inFlight;
922
+ const run = (async () => {
923
+ // R2: a bridge whose `start()` hasn't resolved yet has no
924
+ // `AgentSession`, so `reloadExtensions()` would be a silent no-op
925
+ // (counted as reloaded + a false notification) and could interleave
926
+ // with `bindExtensions`. Wait for start first — best-effort, a failed
927
+ // start is handled below.
928
+ if (stream.started !== true) {
929
+ await Promise.resolve(stream.ready).catch(() => undefined);
930
+ }
931
+ if (stream.started !== true) {
932
+ // Start never resolved (still starting, or it failed): there is no
933
+ // session to reload, and the next bridge/session built for this
934
+ // stream reads current settings when it is constructed.
935
+ stream.pendingExtensionsReload = false;
936
+ return { status: "skipped", reason: "bridge not started" };
937
+ }
938
+ // The stream may have become busy while we waited for `start()`.
939
+ if (this.isReloadBlocked(stream)) {
940
+ stream.pendingExtensionsReload = true;
941
+ return { status: "skipped", reason: "session is busy" };
942
+ }
943
+ const reload = stream.bridge?.reloadExtensions;
944
+ if (!reload) {
945
+ return { status: "skipped", reason: "bridge has no reloadExtensions" };
946
+ }
947
+ try {
948
+ // R4: `Promise.resolve().then(...)` so a SYNCHRONOUS throw from
949
+ // reload() becomes a rejection we can isolate to this stream
950
+ // instead of escaping and aborting the whole reload loop.
951
+ await Promise.resolve().then(() => reload.call(stream.bridge));
952
+ }
953
+ catch (err) {
954
+ // Remember it: `prompt()` retries before arming the next turn.
955
+ stream.pendingExtensionsReload = true;
956
+ return { status: "failed", error: err };
957
+ }
958
+ // R3: satisfied — `prompt()` must not redo this reload.
959
+ stream.pendingExtensionsReload = false;
960
+ return { status: "reloaded" };
961
+ })();
962
+ const tracked = run.finally(() => {
963
+ if (stream.reloadingExtensions === tracked) {
964
+ stream.reloadingExtensions = undefined;
965
+ }
966
+ });
967
+ stream.reloadingExtensions = tracked;
968
+ return tracked;
969
+ }
820
970
  /**
821
971
  * Push a new session-level primary-agent override to the running bridge
822
972
  * (if any) without restarting it. The `before_agent_start` hook reads the
@@ -1086,9 +1236,29 @@ export class SessionStreamManager {
1086
1236
  async prompt(sessionId, content, modelId, images, reasoningEffort, opts) {
1087
1237
  if (this.disposed)
1088
1238
  throw new Error("SessionStreamManager disposed");
1089
- let stream = this.streams.get(sessionId);
1239
+ const stream = this.streams.get(sessionId);
1090
1240
  if (!stream)
1091
1241
  throw new Error(`No active stream for session: ${sessionId}`);
1242
+ // R1: make the dispatch visible SYNCHRONOUSLY — before any `await` — so
1243
+ // `reloadExtensions()` can never see this stream as idle inside the
1244
+ // await window below (`await stream.ready`, deferred reload,
1245
+ // `setModel`) i.e. before `currentTurn` is armed. Counts as busy (see
1246
+ // `resolveRunState`). Cleared in the `finally` below — which covers
1247
+ // every exit path (normal arming, every early return, and throws).
1248
+ stream.dispatching = true;
1249
+ try {
1250
+ await this.dispatchPrompt(stream, sessionId, content, modelId, images, reasoningEffort, opts);
1251
+ }
1252
+ finally {
1253
+ stream.dispatching = false;
1254
+ }
1255
+ }
1256
+ /**
1257
+ * Body of `prompt()` — everything that happens after the stream is
1258
+ * resolved and the dispatch marker is armed. Split out so `prompt()` can
1259
+ * clear the marker in a `finally` (see R1 in `prompt()`).
1260
+ */
1261
+ async dispatchPrompt(stream, sessionId, content, modelId, images, reasoningEffort, opts) {
1092
1262
  // Guard: block new prompts while compaction is running. Compaction
1093
1263
  // takes ~1 LLM call (<5 s) and the bridge emits a clear error message
1094
1264
  // so the user knows to wait a moment.
@@ -1147,7 +1317,16 @@ export class SessionStreamManager {
1147
1317
  };
1148
1318
  stream.bridge = this.bridgeFactory(bridgeOpts);
1149
1319
  stream.startError = null;
1150
- stream.ready = stream.bridge.start().catch((err) => {
1320
+ // A freshly constructed bridge/session already reads current settings,
1321
+ // so any deferred extension reload is satisfied by the rebuild itself.
1322
+ stream.pendingExtensionsReload = false;
1323
+ stream.started = false;
1324
+ stream.ready = stream.bridge
1325
+ .start()
1326
+ .then(() => {
1327
+ stream.started = true;
1328
+ })
1329
+ .catch((err) => {
1151
1330
  const e = err instanceof Error ? err : new Error(String(err));
1152
1331
  stream.startError = e;
1153
1332
  this.broadcast(stream, {
@@ -1170,6 +1349,35 @@ export class SessionStreamManager {
1170
1349
  });
1171
1350
  return;
1172
1351
  }
1352
+ // R5: an extension reload may already be in flight (a `config_patch`
1353
+ // raced this prompt). Wait for it instead of starting a second one.
1354
+ if (stream.reloadingExtensions) {
1355
+ await stream.reloadingExtensions.catch(() => undefined);
1356
+ }
1357
+ // Deferred extension hot-reload: an extension setting changed while this
1358
+ // session was busy, so `reloadExtensions()` skipped it (or it failed).
1359
+ // Apply it now — the bridge is ready and no turn is in flight yet.
1360
+ if (stream.pendingExtensionsReload) {
1361
+ stream.pendingExtensionsReload = false;
1362
+ // This dispatch is the reload's owner: no turn is armed yet, so it is
1363
+ // safe. Drop the marker while we reload — it only exists to keep
1364
+ // CONCURRENT triggers out of this window, not this one.
1365
+ stream.dispatching = false;
1366
+ try {
1367
+ const result = await this.reloadStreamExtensions(stream);
1368
+ if (result.status === "failed") {
1369
+ console.warn(`[spectral] warn: deferred extension reload failed for ${sessionId}: ${result.error instanceof Error
1370
+ ? result.error.message
1371
+ : String(result.error)}`);
1372
+ }
1373
+ }
1374
+ catch (err) {
1375
+ console.warn(`[spectral] warn: deferred extension reload failed for ${sessionId}: ${err instanceof Error ? err.message : String(err)}`);
1376
+ }
1377
+ finally {
1378
+ stream.dispatching = true;
1379
+ }
1380
+ }
1173
1381
  // Sticky-model resolution & application. Phase 3 (Available Models
1174
1382
  // whitelist). Order:
1175
1383
  // a) If envelope carried a `modelId`, use it.
@@ -1298,6 +1506,8 @@ export class SessionStreamManager {
1298
1506
  };
1299
1507
  stream.pendingContinue = false;
1300
1508
  this.emitRunState(stream);
1509
+ // R1: the turn is armed, so `busy` is now carried by `currentTurn`;
1510
+ // `prompt()`'s `finally` clears the dispatch marker.
1301
1511
  // 4. Fire spectral. `prompt` resolves on agent_end; errors inside
1302
1512
  // AgentBridge are caught and emitted as wire errors. Synchronous throws
1303
1513
  // (e.g. disposed bridge, missing session) arrive as a rejected promise
@@ -1924,6 +2134,7 @@ export class SessionStreamManager {
1924
2134
  },
1925
2135
  };
1926
2136
  stream.bridge = this.bridgeFactory(bridgeOpts);
2137
+ stream.started = false;
1927
2138
  // Subscribe this session to live inter-agent observation messages so the
1928
2139
  // browser UI can surface them even before the memory extension injects
1929
2140
  // them into the agent context.
@@ -1963,6 +2174,7 @@ export class SessionStreamManager {
1963
2174
  stream.ready = stream.bridge
1964
2175
  .start()
1965
2176
  .then(() => {
2177
+ stream.started = true;
1966
2178
  // After spectral has replayed history into its session manager, populate
1967
2179
  // context window state from its built-in getContextUsage() estimator.
1968
2180
  // Historical sessions need this — without it, the initial
@@ -2430,7 +2642,11 @@ export class SessionStreamManager {
2430
2642
  flags.retrying ||
2431
2643
  flags.compacting ||
2432
2644
  flags.looping ||
2433
- stream.pendingContinue;
2645
+ stream.pendingContinue ||
2646
+ // R1: a `prompt()` dispatch is in flight — the turn is not armed yet
2647
+ // (we may still be awaiting `ready`/`setModel`), but the session is
2648
+ // already committed to running work.
2649
+ stream.dispatching === true;
2434
2650
  const phase = flags.retrying
2435
2651
  ? "retrying"
2436
2652
  : flags.compacting
@@ -2567,7 +2783,7 @@ export class SessionStreamManager {
2567
2783
  const queue = rows.map((r) => ({
2568
2784
  id: r.id,
2569
2785
  content: r.content,
2570
- images: parseQueueImagesJson(r.images_json),
2786
+ images: parseImagesJson(r.images_json),
2571
2787
  position: r.position,
2572
2788
  createdAt: r.created_at,
2573
2789
  }));
@@ -2600,7 +2816,7 @@ export class SessionStreamManager {
2600
2816
  // Fire the next prompt. Reuses the sticky model from the just-completed
2601
2817
  // turn (persisted by `prompt()` into the sessions.model_id column).
2602
2818
  const lastModelId = this.store.getSessionModel(stream.sessionId);
2603
- this.prompt(stream.sessionId, next.content, lastModelId ?? undefined, parseQueueImagesJson(next.images_json)).catch((err) => {
2819
+ this.prompt(stream.sessionId, next.content, lastModelId ?? undefined, parseImagesJson(next.images_json)).catch((err) => {
2604
2820
  // Surface any errors from the auto-dequeue prompt (synchronous throws
2605
2821
  // before the first await, e.g. disposed manager, missing stream) so
2606
2822
  // subscribers see what went wrong instead of a silent dead turn.
@@ -2614,23 +2830,6 @@ export class SessionStreamManager {
2614
2830
  return true;
2615
2831
  }
2616
2832
  }
2617
- function parseQueueImagesJson(raw) {
2618
- if (!raw)
2619
- return undefined;
2620
- try {
2621
- const parsed = JSON.parse(raw);
2622
- if (!Array.isArray(parsed))
2623
- return undefined;
2624
- const images = parsed.filter((item) => item !== null &&
2625
- typeof item === "object" &&
2626
- typeof item.data === "string" &&
2627
- typeof item.mimeType === "string");
2628
- return images.length > 0 ? images : undefined;
2629
- }
2630
- catch {
2631
- return undefined;
2632
- }
2633
- }
2634
2833
  function isReplayable(event) {
2635
2834
  return (event.type === "message_start" ||
2636
2835
  event.type === "text_delta" ||
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/server/storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/server/storage.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,7 @@ import { mkdirSync, readFileSync } from "node:fs";
34
34
  import { dirname, join, resolve } from "node:path";
35
35
  import { getConfigDir } from "../config.js";
36
36
  import { stripJsoncComments } from "../studio-binding.js";
37
+ import { coerceImages, parseImagesJson } from "./image-attachments.js";
37
38
  /**
38
39
  * Schema version — informational, stamped into every new database.
39
40
  *
@@ -234,35 +235,6 @@ function applyBindingFields(project, rowBinding) {
234
235
  studioTeamId: binding.teamId,
235
236
  };
236
237
  }
237
- /** Tables we own — used by the migration drop step. */
238
- /** Best-effort parse of the `images_json` column into `ImageAttachment[]`. */
239
- function parseImagesJson(raw) {
240
- if (!raw || raw === "")
241
- return undefined;
242
- try {
243
- const parsed = JSON.parse(raw);
244
- if (!Array.isArray(parsed))
245
- return undefined;
246
- const out = [];
247
- for (const i of parsed) {
248
- if (i !== null &&
249
- typeof i === "object" &&
250
- typeof i.data === "string" &&
251
- typeof i.mimeType === "string") {
252
- out.push({
253
- data: i.data,
254
- mimeType: i.mimeType,
255
- width: typeof i.width === "number" ? i.width : undefined,
256
- height: typeof i.height === "number" ? i.height : undefined,
257
- });
258
- }
259
- }
260
- return out.length > 0 ? out : undefined;
261
- }
262
- catch {
263
- return undefined;
264
- }
265
- }
266
238
  export class SessionStore {
267
239
  path;
268
240
  db;
@@ -1182,7 +1154,14 @@ export class SessionStore {
1182
1154
  const createdAt = msg.createdAt ?? Date.now();
1183
1155
  const eventsJsonl = msg.eventsJsonl ?? "";
1184
1156
  const creditsUsed = msg.creditsUsed ?? null;
1185
- const imagesJson = msg.images && msg.images.length > 0 ? JSON.stringify(msg.images) : "";
1157
+ // Last line of defence: never persist an attachment that carries neither
1158
+ // a url nor data, and never persist megabytes of inline base64 — both
1159
+ // would bloat the DB and the history replay. Ingress paths reject these
1160
+ // earlier; here we only guarantee the invariant.
1161
+ const storedImages = coerceImages(msg.images, {
1162
+ onReject: (reason) => console.warn(`[spectral] warn: not persisting image for ${sessionId}: ${reason}`),
1163
+ });
1164
+ const imagesJson = storedImages && storedImages.length > 0 ? JSON.stringify(storedImages) : "";
1186
1165
  let sequence = 0;
1187
1166
  const tx = this.db.transaction(() => {
1188
1167
  // Idempotent sequence assignment. A rewrite of the same message id must
@@ -1203,7 +1182,7 @@ export class SessionStore {
1203
1182
  events: eventsJsonl,
1204
1183
  createdAt,
1205
1184
  sequence,
1206
- ...(msg.images && msg.images.length > 0 ? { images: msg.images } : {}),
1185
+ ...(storedImages && storedImages.length > 0 ? { images: storedImages } : {}),
1207
1186
  ...(creditsUsed != null ? { creditsUsed } : {}),
1208
1187
  };
1209
1188
  }
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Terminal-native permission confirmations for `spectral serve`.
3
+ *
4
+ * In serve mode there is no TUI, but extensions (notably desktop-control)
5
+ * still call `ctx.ui.confirm(...)` to gate potentially harmful actions. The
6
+ * user is chatting via the web UI, while `spectral serve` itself runs in a
7
+ * real terminal — so the confirmation is rendered there, on serve's stdout,
8
+ * and answered with a single keypress.
9
+ *
10
+ * Behavior:
11
+ * - Non-TTY stdin: resolves `false` immediately (honest headless deny).
12
+ * - The prompt is a boxed render with a key legend: Enter/y = Allow,
13
+ * n/Esc/q = Deny, Ctrl+C = Deny (consumed as data in raw mode — it must
14
+ * never kill the serve process).
15
+ * - Stdin is put into raw mode for the duration of the prompt and always
16
+ * restored afterwards.
17
+ * - Title and message are sanitized before rendering: ANSI escape sequences
18
+ * and control characters are stripped (newlines collapse to spaces) so a
19
+ * malicious extension cannot inject terminal escapes.
20
+ * - Concurrent confirmations (multiple sessions share one terminal) are
21
+ * serialized through a module-level queue; queued requests print a short
22
+ * "waiting" notice.
23
+ * - Timeouts: `SPECTRAL_CONFIRM_TIMEOUT_MS` env (default 5 min) or the
24
+ * per-dialog `opts.timeout`. On timeout the confirmation resolves `false`.
25
+ * - `onOutcome` reports how the dialog ended exactly once, letting callers
26
+ * (e.g. desktop-control) distinguish an explicit user denial from
27
+ * auto-deny causes (timeout, non-TTY, abort) that must not lock sessions.
28
+ *
29
+ * The prompt logic is pure and takes injectable IO (`write` + `readKey`) so
30
+ * tests run without a TTY.
31
+ */
32
+ /** Injectable terminal IO for the confirmation prompt. */
33
+ export interface ConfirmPromptIO {
34
+ /** Write text to the terminal (serve's stdout). */
35
+ write(text: string): void;
36
+ /**
37
+ * Start listening for the next keypress and pass raw stdin data to
38
+ * `handler`. Returns a cancel function that must detach the listener and
39
+ * restore any terminal state (raw mode).
40
+ */
41
+ readKey(handler: (data: string) => void): () => void;
42
+ }
43
+ /** Minimal shape of a stdin stream the default IO implementation needs. */
44
+ export interface ConfirmStdin {
45
+ readonly isTTY?: boolean;
46
+ readonly isRaw?: boolean;
47
+ setRawMode?(mode: boolean): unknown;
48
+ on(event: "data", listener: (chunk: Buffer | string) => void): unknown;
49
+ off(event: "data", listener: (chunk: Buffer | string) => void): unknown;
50
+ resume(): unknown;
51
+ }
52
+ export type ConfirmKeyAction = "allow" | "deny" | "ignore";
53
+ /**
54
+ * How a confirmation ended. `deny` is an explicit human decision (deny key);
55
+ * `timeout`, `no_tty` and `cancelled` mean the dialog ended without a user
56
+ * answer. Same values as `ExtensionConfirmOutcome`.
57
+ */
58
+ export type TerminalConfirmOutcome = "allow" | "deny" | "timeout" | "no_tty" | "cancelled";
59
+ /** Default confirmation timeout: 5 minutes. */
60
+ export declare const DEFAULT_CONFIRM_TIMEOUT_MS = 300000;
61
+ /**
62
+ * Classify a raw keypress. Only single-byte keys are acted on; multi-byte
63
+ * sequences (arrow keys, pastes) are ignored so they can't accidentally
64
+ * answer the prompt.
65
+ */
66
+ export declare function classifyConfirmKey(data: string): ConfirmKeyAction;
67
+ /**
68
+ * Strip ANSI escape sequences and control characters from extension-provided
69
+ * text. Newlines become spaces (the box renders one wrapped block); every
70
+ * other C0 control character (incl. \r and tab), DEL and C1 are removed, as
71
+ * is any stray ESC left over from an unterminated sequence. Keeps the prompt
72
+ * box and result lines safe against terminal escape injection.
73
+ */
74
+ export declare function sanitizeConfirmText(text: string): string;
75
+ /**
76
+ * Render the confirmation prompt as a boxed block of text (with trailing
77
+ * newline). Pure — no IO.
78
+ */
79
+ export declare function renderConfirmBox(title: string, message: string): string;
80
+ /** Read the confirmation timeout from the environment (ms). */
81
+ export declare function parseConfirmTimeoutMs(env?: NodeJS.ProcessEnv): number;
82
+ export interface TerminalConfirmOptions {
83
+ title: string;
84
+ message: string;
85
+ io: ConfirmPromptIO;
86
+ /** Whether stdin is an interactive TTY. Defaults to `process.stdin.isTTY`. */
87
+ isTTY?: boolean;
88
+ /** Timeout in ms. Defaults to `parseConfirmTimeoutMs()` (env-driven). */
89
+ timeoutMs?: number;
90
+ /** AbortSignal to programmatically deny the dialog. */
91
+ signal?: AbortSignal;
92
+ /** Called when the prompt is actually rendered (not while queued). */
93
+ onShown?: () => void;
94
+ /**
95
+ * Called exactly once with the final outcome, before the promise settles.
96
+ * `deny` means an explicit human denial; `timeout`/`no_tty`/`cancelled`
97
+ * are auto-deny causes (no user decision was made).
98
+ */
99
+ onOutcome?: (outcome: TerminalConfirmOutcome) => void;
100
+ }
101
+ /**
102
+ * Run a single terminal confirmation. Resolves `true` (allow) or `false`
103
+ * (deny / timeout / abort / non-TTY). Never throws.
104
+ */
105
+ export declare function runTerminalConfirm(options: TerminalConfirmOptions): Promise<boolean>;
106
+ /**
107
+ * Request a terminal confirmation, serialized with all other pending
108
+ * confirmations in this process. Queued requests print a short notice.
109
+ */
110
+ export declare function requestTerminalConfirm(options: TerminalConfirmOptions): Promise<boolean>;
111
+ /**
112
+ * Default IO bound to the serve process's real terminal: writes to stdout,
113
+ * reads raw keypresses from stdin (entering raw mode for the duration and
114
+ * restoring the previous mode on cancel).
115
+ */
116
+ export declare function createStdinConfirmIO(stdin?: ConfirmStdin): ConfirmPromptIO;
117
+ /** Wire event shape emitted when a confirm prompt is actually shown. */
118
+ export interface BridgeConfirmNotifyEvent {
119
+ type: "agent_notification";
120
+ message: string;
121
+ level: "info" | "warning" | "error";
122
+ }
123
+ /** Per-dialog options as passed by extensions (`ExtensionUIDialogOptions`). */
124
+ export interface BridgeConfirmDialogOptions {
125
+ /** AbortSignal to programmatically deny the dialog. */
126
+ signal?: AbortSignal;
127
+ /** Per-dialog timeout in ms (auto-deny when it fires). */
128
+ timeout?: number;
129
+ /** Outcome side-channel, forwarded to `runTerminalConfirm.onOutcome`. */
130
+ onOutcome?: (outcome: TerminalConfirmOutcome) => void;
131
+ }
132
+ /**
133
+ * Build the `confirm(title, message, opts?)` implementation used by the
134
+ * serve-mode headless UI context: routes through `requestTerminalConfirm`
135
+ * (cross-session queue), maps `opts.timeout` → `timeoutMs` and
136
+ * `opts.signal` → `signal`, forwards `opts.onOutcome` (auto-deny vs explicit
137
+ * user denial side-channel), and emits an `agent_notification` (level
138
+ * "warning") once the prompt is rendered so web users know to look at the
139
+ * terminal. `io` defaults to the real stdin IO; `isTTY` overrides the TTY
140
+ * probe (defaults to `process.stdin.isTTY`, i.e. headless-safe).
141
+ */
142
+ export declare function createBridgeConfirm(emit: (event: BridgeConfirmNotifyEvent) => void, io?: ConfirmPromptIO, opts?: {
143
+ isTTY?: boolean;
144
+ }): (title: string, message: string, dialog?: BridgeConfirmDialogOptions) => Promise<boolean>;
145
+ //# sourceMappingURL=terminal-confirm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-confirm.d.ts","sourceRoot":"","sources":["../../../src/server/ui/terminal-confirm.ts"],"names":[],"mappings":"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"}