@aexol/spectral 0.9.230 → 0.9.234

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 (265) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/agent/index.d.ts.map +1 -1
  3. package/dist/agent/index.js +89 -14
  4. package/dist/backend/generated-images.d.ts +1 -1
  5. package/dist/backend/generated-images.d.ts.map +1 -1
  6. package/dist/commands/serve.d.ts.map +1 -1
  7. package/dist/commands/serve.js +12 -1
  8. package/dist/designer/data/skills/blog-post.d.ts +3 -0
  9. package/dist/designer/data/skills/blog-post.d.ts.map +1 -0
  10. package/dist/designer/data/skills/blog-post.js +84 -0
  11. package/dist/designer/data/skills/blog-post.ts +87 -0
  12. package/dist/designer/data/skills/critique.d.ts +3 -0
  13. package/dist/designer/data/skills/critique.d.ts.map +1 -0
  14. package/dist/designer/data/skills/critique.js +109 -0
  15. package/dist/designer/data/skills/critique.ts +112 -0
  16. package/dist/designer/data/skills/dashboard.d.ts +3 -0
  17. package/dist/designer/data/skills/dashboard.d.ts.map +1 -0
  18. package/dist/designer/data/skills/dashboard.js +165 -0
  19. package/dist/designer/data/skills/dashboard.ts +168 -0
  20. package/dist/designer/data/skills/design-brief.d.ts +3 -0
  21. package/dist/designer/data/skills/design-brief.d.ts.map +1 -0
  22. package/dist/designer/data/skills/design-brief.js +141 -0
  23. package/dist/designer/data/skills/design-brief.ts +144 -0
  24. package/dist/designer/data/skills/design-skill.d.ts +10 -0
  25. package/dist/designer/data/skills/design-skill.d.ts.map +1 -0
  26. package/dist/designer/data/skills/design-skill.js +1 -0
  27. package/dist/designer/data/skills/design-skill.ts +9 -0
  28. package/dist/designer/data/skills/docs-page.d.ts +3 -0
  29. package/dist/designer/data/skills/docs-page.d.ts.map +1 -0
  30. package/dist/designer/data/skills/docs-page.js +68 -0
  31. package/dist/designer/data/skills/docs-page.ts +71 -0
  32. package/dist/designer/data/skills/index.d.ts +3 -0
  33. package/dist/designer/data/skills/index.d.ts.map +1 -0
  34. package/dist/designer/data/skills/index.js +28 -0
  35. package/dist/designer/data/skills/index.ts +30 -0
  36. package/dist/designer/data/skills/magazine-poster.d.ts +3 -0
  37. package/dist/designer/data/skills/magazine-poster.d.ts.map +1 -0
  38. package/dist/designer/data/skills/magazine-poster.js +70 -0
  39. package/dist/designer/data/skills/magazine-poster.ts +73 -0
  40. package/dist/designer/data/skills/mobile-app.d.ts +3 -0
  41. package/dist/designer/data/skills/mobile-app.d.ts.map +1 -0
  42. package/dist/designer/data/skills/mobile-app.js +229 -0
  43. package/dist/designer/data/skills/mobile-app.ts +232 -0
  44. package/dist/designer/data/skills/motion-frames.d.ts +3 -0
  45. package/dist/designer/data/skills/motion-frames.d.ts.map +1 -0
  46. package/dist/designer/data/skills/motion-frames.js +121 -0
  47. package/dist/designer/data/skills/motion-frames.ts +124 -0
  48. package/dist/designer/data/skills/pricing-page.d.ts +3 -0
  49. package/dist/designer/data/skills/pricing-page.d.ts.map +1 -0
  50. package/dist/designer/data/skills/pricing-page.js +76 -0
  51. package/dist/designer/data/skills/pricing-page.ts +79 -0
  52. package/dist/designer/data/skills/saas-landing.d.ts +3 -0
  53. package/dist/designer/data/skills/saas-landing.d.ts.map +1 -0
  54. package/dist/designer/data/skills/saas-landing.js +71 -0
  55. package/dist/designer/data/skills/saas-landing.ts +74 -0
  56. package/dist/designer/data/skills/slide-deck.d.ts +3 -0
  57. package/dist/designer/data/skills/slide-deck.d.ts.map +1 -0
  58. package/dist/designer/data/skills/slide-deck.js +213 -0
  59. package/dist/designer/data/skills/slide-deck.ts +216 -0
  60. package/dist/designer/data/skills/social-carousel.d.ts +3 -0
  61. package/dist/designer/data/skills/social-carousel.d.ts.map +1 -0
  62. package/dist/designer/data/skills/social-carousel.js +135 -0
  63. package/dist/designer/data/skills/social-carousel.ts +138 -0
  64. package/dist/designer/data/skills/web-prototype.d.ts +3 -0
  65. package/dist/designer/data/skills/web-prototype.d.ts.map +1 -0
  66. package/dist/designer/data/skills/web-prototype.js +159 -0
  67. package/dist/designer/data/skills/web-prototype.ts +162 -0
  68. package/dist/designer/skills.d.ts +4 -10
  69. package/dist/designer/skills.d.ts.map +1 -1
  70. package/dist/designer/skills.js +2 -1643
  71. package/dist/extensions/logic-trace.d.ts +1 -1
  72. package/dist/extensions/logic-trace.d.ts.map +1 -1
  73. package/dist/extensions/logic-trace.js +199 -70
  74. package/dist/extensions/video-generation/index.d.ts +3 -0
  75. package/dist/extensions/video-generation/index.d.ts.map +1 -0
  76. package/dist/extensions/video-generation/index.js +299 -0
  77. package/dist/extensions/wizard/index.js +9 -1
  78. package/dist/generated/parser/ast/nodes.d.ts +115 -0
  79. package/dist/generated/parser/ast/nodes.d.ts.map +1 -0
  80. package/dist/generated/parser/ast/nodes.js +8 -0
  81. package/dist/generated/parser/lexer/lexer.d.ts +28 -0
  82. package/dist/generated/parser/lexer/lexer.d.ts.map +1 -0
  83. package/dist/generated/parser/{lexer.js → lexer/lexer.js} +1 -180
  84. package/dist/generated/parser/{lexer.d.ts → lexer/tokens.d.ts} +5 -24
  85. package/dist/generated/parser/lexer/tokens.d.ts.map +1 -0
  86. package/dist/generated/parser/lexer/tokens.js +187 -0
  87. package/dist/generated/parser/mod.d.ts +5 -7
  88. package/dist/generated/parser/mod.d.ts.map +1 -1
  89. package/dist/generated/parser/mod.js +2 -1
  90. package/dist/generated/parser/parser/cursor.d.ts +47 -0
  91. package/dist/generated/parser/parser/cursor.d.ts.map +1 -0
  92. package/dist/generated/parser/parser/cursor.js +12 -0
  93. package/dist/generated/parser/parser/definitions.d.ts +16 -0
  94. package/dist/generated/parser/parser/definitions.d.ts.map +1 -0
  95. package/dist/generated/parser/parser/definitions.js +353 -0
  96. package/dist/generated/parser/parser/expressions.d.ts +17 -0
  97. package/dist/generated/parser/parser/expressions.d.ts.map +1 -0
  98. package/dist/generated/parser/parser/expressions.js +165 -0
  99. package/dist/generated/parser/parser.d.ts +18 -133
  100. package/dist/generated/parser/parser.d.ts.map +1 -1
  101. package/dist/generated/parser/parser.js +9 -505
  102. package/dist/generated/parser/tokenizer.d.ts +1 -2
  103. package/dist/generated/parser/tokenizer.d.ts.map +1 -1
  104. package/dist/generated/parser/tokenizer.js +2 -1
  105. package/dist/generated/parser/validator.d.ts +1 -1
  106. package/dist/generated/parser/validator.d.ts.map +1 -1
  107. package/dist/generated/zeus/const.d.ts.map +1 -1
  108. package/dist/generated/zeus/const.js +30 -0
  109. package/dist/generated/zeus/index.d.ts +140 -0
  110. package/dist/generated/zeus/index.d.ts.map +1 -1
  111. package/dist/generated/zeus/index.js +5 -0
  112. package/dist/mcp/glimpse-ui.js +9 -1
  113. package/dist/relay/dispatcher.d.ts +23 -104
  114. package/dist/relay/dispatcher.d.ts.map +1 -1
  115. package/dist/relay/dispatcher.js +21 -1130
  116. package/dist/relay/rest.d.ts +31 -0
  117. package/dist/relay/rest.d.ts.map +1 -0
  118. package/dist/relay/rest.js +85 -0
  119. package/dist/relay/routing.d.ts +109 -0
  120. package/dist/relay/routing.d.ts.map +1 -0
  121. package/dist/relay/routing.js +669 -0
  122. package/dist/relay/wizard-login.d.ts +17 -0
  123. package/dist/relay/wizard-login.d.ts.map +1 -0
  124. package/dist/relay/wizard-login.js +419 -0
  125. package/dist/sdk/agent-core/agent-loop.d.ts +2 -9
  126. package/dist/sdk/agent-core/agent-loop.d.ts.map +1 -1
  127. package/dist/sdk/agent-core/agent-loop.js +17 -291
  128. package/dist/sdk/agent-core/agent.d.ts +11 -4
  129. package/dist/sdk/agent-core/agent.d.ts.map +1 -1
  130. package/dist/sdk/agent-core/agent.js +16 -4
  131. package/dist/sdk/agent-core/tool-call-registry.d.ts +75 -0
  132. package/dist/sdk/agent-core/tool-call-registry.d.ts.map +1 -0
  133. package/dist/sdk/agent-core/tool-call-registry.js +131 -0
  134. package/dist/sdk/agent-core/tool-execution.d.ts +33 -0
  135. package/dist/sdk/agent-core/tool-execution.d.ts.map +1 -0
  136. package/dist/sdk/agent-core/tool-execution.js +399 -0
  137. package/dist/sdk/agent-core/types.d.ts +15 -4
  138. package/dist/sdk/agent-core/types.d.ts.map +1 -1
  139. package/dist/sdk/ai/env-api-keys.js +9 -1
  140. package/dist/sdk/ai/index.d.ts +3 -0
  141. package/dist/sdk/ai/index.d.ts.map +1 -1
  142. package/dist/sdk/ai/index.js +3 -0
  143. package/dist/sdk/ai/providers/faux.d.ts.map +1 -1
  144. package/dist/sdk/ai/providers/faux.js +3 -0
  145. package/dist/sdk/ai/providers/leaked-tool-call-parser.d.ts +39 -6
  146. package/dist/sdk/ai/providers/leaked-tool-call-parser.d.ts.map +1 -1
  147. package/dist/sdk/ai/providers/leaked-tool-call-parser.js +159 -18
  148. package/dist/sdk/ai/providers/openai/reasoning-replay.d.ts +48 -0
  149. package/dist/sdk/ai/providers/openai/reasoning-replay.d.ts.map +1 -0
  150. package/dist/sdk/ai/providers/openai/reasoning-replay.js +209 -0
  151. package/dist/sdk/ai/providers/openai-completions.d.ts.map +1 -1
  152. package/dist/sdk/ai/providers/openai-completions.js +23 -211
  153. package/dist/sdk/ai/providers/openrouter-videos.d.ts +3 -0
  154. package/dist/sdk/ai/providers/openrouter-videos.d.ts.map +1 -0
  155. package/dist/sdk/ai/providers/openrouter-videos.js +412 -0
  156. package/dist/sdk/ai/providers/register-builtins.d.ts.map +1 -1
  157. package/dist/sdk/ai/providers/register-builtins.js +6 -0
  158. package/dist/sdk/ai/providers/simple-options.d.ts +1 -6
  159. package/dist/sdk/ai/providers/simple-options.d.ts.map +1 -1
  160. package/dist/sdk/ai/providers/simple-options.js +0 -22
  161. package/dist/sdk/ai/providers/transform-messages.d.ts.map +1 -1
  162. package/dist/sdk/ai/providers/transform-messages.js +52 -1
  163. package/dist/sdk/ai/types.d.ts +91 -10
  164. package/dist/sdk/ai/types.d.ts.map +1 -1
  165. package/dist/sdk/ai/video-models.d.ts +10 -0
  166. package/dist/sdk/ai/video-models.d.ts.map +1 -0
  167. package/dist/sdk/ai/video-models.generated.d.ts +440 -0
  168. package/dist/sdk/ai/video-models.generated.d.ts.map +1 -0
  169. package/dist/sdk/ai/video-models.generated.js +441 -0
  170. package/dist/sdk/ai/video-models.js +22 -0
  171. package/dist/sdk/ai/videos-api-registry.d.ts +14 -0
  172. package/dist/sdk/ai/videos-api-registry.d.ts.map +1 -0
  173. package/dist/sdk/ai/videos-api-registry.js +21 -0
  174. package/dist/sdk/ai/videos.d.ts +4 -0
  175. package/dist/sdk/ai/videos.d.ts.map +1 -0
  176. package/dist/sdk/ai/videos.js +13 -0
  177. package/dist/sdk/coding-agent/core/agent-session.d.ts +8 -0
  178. package/dist/sdk/coding-agent/core/agent-session.d.ts.map +1 -1
  179. package/dist/sdk/coding-agent/core/agent-session.js +11 -0
  180. package/dist/sdk/coding-agent/core/compaction/compaction.d.ts +6 -118
  181. package/dist/sdk/coding-agent/core/compaction/compaction.d.ts.map +1 -1
  182. package/dist/sdk/coding-agent/core/compaction/compaction.js +11 -733
  183. package/dist/sdk/coding-agent/core/compaction/cut-points.d.ts +58 -0
  184. package/dist/sdk/coding-agent/core/compaction/cut-points.d.ts.map +1 -0
  185. package/dist/sdk/coding-agent/core/compaction/cut-points.js +191 -0
  186. package/dist/sdk/coding-agent/core/compaction/dedupe.d.ts +28 -0
  187. package/dist/sdk/coding-agent/core/compaction/dedupe.d.ts.map +1 -0
  188. package/dist/sdk/coding-agent/core/compaction/dedupe.js +156 -0
  189. package/dist/sdk/coding-agent/core/compaction/summarize.d.ts +21 -0
  190. package/dist/sdk/coding-agent/core/compaction/summarize.d.ts.map +1 -0
  191. package/dist/sdk/coding-agent/core/compaction/summarize.js +181 -0
  192. package/dist/sdk/coding-agent/core/compaction/tokens.d.ts +47 -0
  193. package/dist/sdk/coding-agent/core/compaction/tokens.d.ts.map +1 -0
  194. package/dist/sdk/coding-agent/core/compaction/tokens.js +224 -0
  195. package/dist/sdk/coding-agent/core/extensions/loader.d.ts.map +1 -1
  196. package/dist/sdk/coding-agent/core/extensions/loader.js +14 -0
  197. package/dist/sdk/coding-agent/core/extensions/native-extensions.d.ts +26 -0
  198. package/dist/sdk/coding-agent/core/extensions/native-extensions.d.ts.map +1 -1
  199. package/dist/sdk/coding-agent/core/extensions/native-extensions.js +23 -0
  200. package/dist/sdk/coding-agent/core/extensions/session-events.d.ts +157 -0
  201. package/dist/sdk/coding-agent/core/extensions/session-events.d.ts.map +1 -0
  202. package/dist/sdk/coding-agent/core/extensions/session-events.js +13 -0
  203. package/dist/sdk/coding-agent/core/extensions/types.d.ts +10 -367
  204. package/dist/sdk/coding-agent/core/extensions/types.d.ts.map +1 -1
  205. package/dist/sdk/coding-agent/core/extensions/types.js +2 -10
  206. package/dist/sdk/coding-agent/core/extensions/ui-types.d.ts +219 -0
  207. package/dist/sdk/coding-agent/core/extensions/ui-types.d.ts.map +1 -0
  208. package/dist/sdk/coding-agent/core/extensions/ui-types.js +4 -0
  209. package/dist/sdk/coding-agent/core/messages.d.ts.map +1 -1
  210. package/dist/sdk/coding-agent/core/messages.js +42 -2
  211. package/dist/sdk/coding-agent/core/package/default-package-manager.d.ts +115 -0
  212. package/dist/sdk/coding-agent/core/package/default-package-manager.d.ts.map +1 -0
  213. package/dist/sdk/coding-agent/core/package/default-package-manager.js +1184 -0
  214. package/dist/sdk/coding-agent/core/package/discovery.d.ts +20 -0
  215. package/dist/sdk/coding-agent/core/package/discovery.d.ts.map +1 -0
  216. package/dist/sdk/coding-agent/core/package/discovery.js +283 -0
  217. package/dist/sdk/coding-agent/core/package/ignore.d.ts +29 -0
  218. package/dist/sdk/coding-agent/core/package/ignore.d.ts.map +1 -0
  219. package/dist/sdk/coding-agent/core/package/ignore.js +235 -0
  220. package/dist/sdk/coding-agent/core/package/types.d.ts +128 -0
  221. package/dist/sdk/coding-agent/core/package/types.d.ts.map +1 -0
  222. package/dist/sdk/coding-agent/core/package/types.js +18 -0
  223. package/dist/sdk/coding-agent/core/package/update-check.d.ts +43 -0
  224. package/dist/sdk/coding-agent/core/package/update-check.d.ts.map +1 -0
  225. package/dist/sdk/coding-agent/core/package/update-check.js +253 -0
  226. package/dist/sdk/coding-agent/core/package-manager.d.ts +2 -188
  227. package/dist/sdk/coding-agent/core/package-manager.d.ts.map +1 -1
  228. package/dist/sdk/coding-agent/core/package-manager.js +1 -1940
  229. package/dist/sdk/coding-agent/core/resource-loader.d.ts +11 -0
  230. package/dist/sdk/coding-agent/core/resource-loader.d.ts.map +1 -1
  231. package/dist/sdk/coding-agent/core/resource-loader.js +23 -6
  232. package/dist/sdk/coding-agent/core/sdk.d.ts +24 -2
  233. package/dist/sdk/coding-agent/core/sdk.d.ts.map +1 -1
  234. package/dist/sdk/coding-agent/core/sdk.js +15 -3
  235. package/dist/sdk/coding-agent/core/session/migrate.d.ts +18 -0
  236. package/dist/sdk/coding-agent/core/session/migrate.d.ts.map +1 -0
  237. package/dist/sdk/coding-agent/core/session/migrate.js +78 -0
  238. package/dist/sdk/coding-agent/core/session/types.d.ts +165 -0
  239. package/dist/sdk/coding-agent/core/session/types.d.ts.map +1 -0
  240. package/dist/sdk/coding-agent/core/session/types.js +4 -0
  241. package/dist/sdk/coding-agent/core/session-manager.d.ts +3 -161
  242. package/dist/sdk/coding-agent/core/session-manager.d.ts.map +1 -1
  243. package/dist/sdk/coding-agent/core/session-manager.js +4 -72
  244. package/dist/sdk/coding-agent/core/settings-manager.d.ts +0 -8
  245. package/dist/sdk/coding-agent/core/settings-manager.d.ts.map +1 -1
  246. package/dist/sdk/coding-agent/core/settings-manager.js +3 -3
  247. package/dist/sdk/coding-agent/index.d.ts +2 -2
  248. package/dist/sdk/coding-agent/index.d.ts.map +1 -1
  249. package/dist/sdk/coding-agent/index.js +1 -1
  250. package/dist/sdk-public.d.ts +96 -0
  251. package/dist/sdk-public.d.ts.map +1 -0
  252. package/dist/sdk-public.js +109 -0
  253. package/dist/server/agent-bridge/rehydrate.d.ts +2 -2
  254. package/dist/server/agent-bridge/rehydrate.d.ts.map +1 -1
  255. package/dist/server/agent-bridge/rehydrate.js +14 -0
  256. package/dist/server/agent-bridge.d.ts +8 -2
  257. package/dist/server/agent-bridge.d.ts.map +1 -1
  258. package/dist/server/agent-bridge.js +25 -2
  259. package/dist/server/session-stream.d.ts +19 -0
  260. package/dist/server/session-stream.d.ts.map +1 -1
  261. package/dist/server/session-stream.js +35 -0
  262. package/dist/server/wire.d.ts +13 -0
  263. package/dist/server/wire.d.ts.map +1 -1
  264. package/package.json +8 -2
  265. package/dist/generated/parser/lexer.d.ts.map +0 -1
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Token estimation utilities for compaction.
3
+ *
4
+ * Pure functions for estimating context tokens, message sizes, and compaction
5
+ * token metrics.
6
+ */
7
+ import type { AgentMessage } from "../../../agent-core/index.js";
8
+ import type { Usage } from "../../../ai/index.js";
9
+ import type { SessionEntry } from "../session-manager.js";
10
+ import type { CompactionPreparation, CompactionResult, CompactionSettings } from "./compaction.js";
11
+ export interface CompactionTokenSourceBucket {
12
+ type: "role" | "tool" | "source";
13
+ name: string;
14
+ tokens: number;
15
+ }
16
+ /**
17
+ * Calculate total context tokens from usage.
18
+ * Uses the native totalTokens field when available, falls back to computing from components.
19
+ */
20
+ export declare function calculateContextTokens(usage: Usage): number;
21
+ /**
22
+ * Find the last non-aborted assistant message usage from session entries.
23
+ */
24
+ export declare function getLastAssistantUsage(entries: SessionEntry[]): Usage | undefined;
25
+ export interface ContextUsageEstimate {
26
+ tokens: number;
27
+ usageTokens: number;
28
+ trailingTokens: number;
29
+ lastUsageIndex: number | null;
30
+ }
31
+ /**
32
+ * Estimate context tokens from messages, using the last assistant usage when available.
33
+ * If there are messages after the last usage, estimate their tokens with estimateTokens.
34
+ */
35
+ export declare function estimateContextTokens(messages: AgentMessage[]): ContextUsageEstimate;
36
+ /**
37
+ * Check if compaction should trigger based on context usage.
38
+ */
39
+ export declare function shouldCompact(contextTokens: number, contextWindow: number, settings: CompactionSettings): boolean;
40
+ /**
41
+ * Estimate token count for a message using chars/4 heuristic.
42
+ * This is conservative (overestimates tokens).
43
+ */
44
+ export declare function estimateTokens(message: AgentMessage): number;
45
+ export declare function estimateTextTokens(text: string): number;
46
+ export declare function estimateCompactionTokenMetrics(preparation: Pick<CompactionPreparation, "messagesToSummarize" | "turnPrefixMessages"> & Partial<Pick<CompactionPreparation, "compactionNumber">>, summary: string): Pick<CompactionResult, "tokensCompacted" | "tokensRemoved" | "summaryTokens" | "reductionPercent" | "compactionNumber" | "largestTokenSources">;
47
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/coding-agent/core/compaction/tokens.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAoB,KAAK,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGnG,MAAM,WAAW,2BAA2B;IAC3C,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CACf;AAMD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAE3D;AAgBD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,KAAK,GAAG,SAAS,CAShF;AAED,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAUD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,oBAAoB,CA4BpF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAKjH;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CA0D5D;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGvD;AAUD,wBAAgB,8BAA8B,CAC7C,WAAW,EAAE,IAAI,CAAC,qBAAqB,EAAE,qBAAqB,GAAG,oBAAoB,CAAC,GACrF,OAAO,CAAC,IAAI,CAAC,qBAAqB,EAAE,kBAAkB,CAAC,CAAC,EACzD,OAAO,EAAE,MAAM,GACb,IAAI,CACN,gBAAgB,EAChB,iBAAiB,GAAG,eAAe,GAAG,eAAe,GAAG,kBAAkB,GAAG,kBAAkB,GAAG,qBAAqB,CACvH,CAgBA"}
@@ -0,0 +1,224 @@
1
+ /**
2
+ * Token estimation utilities for compaction.
3
+ *
4
+ * Pure functions for estimating context tokens, message sizes, and compaction
5
+ * token metrics.
6
+ */
7
+ import { CONTEXT_LIMIT_RATIO } from "./policy.js";
8
+ // ============================================================================
9
+ // Token calculation
10
+ // ============================================================================
11
+ /**
12
+ * Calculate total context tokens from usage.
13
+ * Uses the native totalTokens field when available, falls back to computing from components.
14
+ */
15
+ export function calculateContextTokens(usage) {
16
+ return usage.totalTokens || usage.input + usage.output + usage.cacheRead + usage.cacheWrite;
17
+ }
18
+ /**
19
+ * Get usage from an assistant message if available.
20
+ * Skips aborted and error messages as they don't have valid usage data.
21
+ */
22
+ function getAssistantUsage(msg) {
23
+ if (msg.role === "assistant" && "usage" in msg) {
24
+ const assistantMsg = msg;
25
+ if (assistantMsg.stopReason !== "aborted" && assistantMsg.stopReason !== "error" && assistantMsg.usage) {
26
+ return assistantMsg.usage;
27
+ }
28
+ }
29
+ return undefined;
30
+ }
31
+ /**
32
+ * Find the last non-aborted assistant message usage from session entries.
33
+ */
34
+ export function getLastAssistantUsage(entries) {
35
+ for (let i = entries.length - 1; i >= 0; i--) {
36
+ const entry = entries[i];
37
+ if (entry.type === "message") {
38
+ const usage = getAssistantUsage(entry.message);
39
+ if (usage)
40
+ return usage;
41
+ }
42
+ }
43
+ return undefined;
44
+ }
45
+ function getLastAssistantUsageInfo(messages) {
46
+ for (let i = messages.length - 1; i >= 0; i--) {
47
+ const usage = getAssistantUsage(messages[i]);
48
+ if (usage)
49
+ return { usage, index: i };
50
+ }
51
+ return undefined;
52
+ }
53
+ /**
54
+ * Estimate context tokens from messages, using the last assistant usage when available.
55
+ * If there are messages after the last usage, estimate their tokens with estimateTokens.
56
+ */
57
+ export function estimateContextTokens(messages) {
58
+ const usageInfo = getLastAssistantUsageInfo(messages);
59
+ if (!usageInfo) {
60
+ let estimated = 0;
61
+ for (const message of messages) {
62
+ estimated += estimateTokens(message);
63
+ }
64
+ return {
65
+ tokens: estimated,
66
+ usageTokens: 0,
67
+ trailingTokens: estimated,
68
+ lastUsageIndex: null,
69
+ };
70
+ }
71
+ const usageTokens = calculateContextTokens(usageInfo.usage);
72
+ let trailingTokens = 0;
73
+ for (let i = usageInfo.index + 1; i < messages.length; i++) {
74
+ trailingTokens += estimateTokens(messages[i]);
75
+ }
76
+ return {
77
+ tokens: usageTokens + trailingTokens,
78
+ usageTokens,
79
+ trailingTokens,
80
+ lastUsageIndex: usageInfo.index,
81
+ };
82
+ }
83
+ /**
84
+ * Check if compaction should trigger based on context usage.
85
+ */
86
+ export function shouldCompact(contextTokens, contextWindow, settings) {
87
+ if (!settings.enabled)
88
+ return false;
89
+ if (!Number.isFinite(contextWindow) || contextWindow <= 0)
90
+ return false;
91
+ if (!Number.isFinite(contextTokens) || contextTokens < 0)
92
+ return false;
93
+ return contextTokens >= contextWindow * CONTEXT_LIMIT_RATIO;
94
+ }
95
+ /**
96
+ * Estimate token count for a message using chars/4 heuristic.
97
+ * This is conservative (overestimates tokens).
98
+ */
99
+ export function estimateTokens(message) {
100
+ let chars = 0;
101
+ switch (message.role) {
102
+ case "user": {
103
+ const content = message.content;
104
+ if (typeof content === "string") {
105
+ chars = content.length;
106
+ }
107
+ else if (Array.isArray(content)) {
108
+ for (const block of content) {
109
+ if (block.type === "text" && block.text) {
110
+ chars += block.text.length;
111
+ }
112
+ }
113
+ }
114
+ return Math.ceil(chars / 4);
115
+ }
116
+ case "assistant": {
117
+ const assistant = message;
118
+ for (const block of assistant.content) {
119
+ if (block.type === "text") {
120
+ chars += block.text.length;
121
+ }
122
+ else if (block.type === "thinking") {
123
+ chars += block.thinking.length;
124
+ }
125
+ else if (block.type === "toolCall") {
126
+ chars += block.name.length + JSON.stringify(block.arguments).length;
127
+ }
128
+ }
129
+ return Math.ceil(chars / 4);
130
+ }
131
+ case "custom":
132
+ case "toolResult": {
133
+ if (typeof message.content === "string") {
134
+ chars = message.content.length;
135
+ }
136
+ else {
137
+ for (const block of message.content) {
138
+ if (block.type === "text" && block.text) {
139
+ chars += block.text.length;
140
+ }
141
+ if (block.type === "image") {
142
+ chars += 4800; // Estimate images as 4000 chars, or 1200 tokens
143
+ }
144
+ }
145
+ }
146
+ return Math.ceil(chars / 4);
147
+ }
148
+ case "bashExecution": {
149
+ chars = message.command.length + message.output.length;
150
+ return Math.ceil(chars / 4);
151
+ }
152
+ case "branchSummary":
153
+ case "compactionSummary": {
154
+ chars = message.summary.length;
155
+ return Math.ceil(chars / 4);
156
+ }
157
+ }
158
+ return 0;
159
+ }
160
+ export function estimateTextTokens(text) {
161
+ if (!text.trim())
162
+ return 0;
163
+ return Math.ceil(text.length / 4);
164
+ }
165
+ function estimateMessagesTokens(messages) {
166
+ let tokens = 0;
167
+ for (const message of messages) {
168
+ tokens += estimateTokens(message);
169
+ }
170
+ return tokens;
171
+ }
172
+ export function estimateCompactionTokenMetrics(preparation, summary) {
173
+ const tokensCompacted = estimateMessagesTokens(preparation.messagesToSummarize) +
174
+ estimateMessagesTokens(preparation.turnPrefixMessages);
175
+ const summaryTokens = estimateTextTokens(summary);
176
+ const tokensRemoved = Math.max(0, tokensCompacted - summaryTokens);
177
+ const reductionPercent = tokensCompacted > 0
178
+ ? Math.round((tokensRemoved / tokensCompacted) * 10_000) / 100
179
+ : 0;
180
+ return {
181
+ tokensCompacted,
182
+ tokensRemoved,
183
+ summaryTokens,
184
+ reductionPercent,
185
+ compactionNumber: preparation.compactionNumber,
186
+ largestTokenSources: collectLargestTokenSources(preparation.messagesToSummarize, preparation.turnPrefixMessages),
187
+ };
188
+ }
189
+ function addBucket(buckets, bucket) {
190
+ const key = `${bucket.type}:${bucket.name}`;
191
+ const previous = buckets.get(key);
192
+ buckets.set(key, {
193
+ ...bucket,
194
+ tokens: (previous?.tokens ?? 0) + bucket.tokens,
195
+ });
196
+ }
197
+ function collectLargestTokenSources(messagesToSummarize, turnPrefixMessages) {
198
+ const buckets = new Map();
199
+ const collect = (messages, source) => {
200
+ for (const message of messages) {
201
+ const messageTokens = estimateTokens(message);
202
+ addBucket(buckets, { type: "source", name: source, tokens: messageTokens });
203
+ addBucket(buckets, { type: "role", name: message.role, tokens: messageTokens });
204
+ if (message.role === "toolResult") {
205
+ addBucket(buckets, { type: "tool", name: message.toolName, tokens: messageTokens });
206
+ continue;
207
+ }
208
+ if (message.role === "assistant") {
209
+ for (const block of message.content) {
210
+ if (block.type !== "toolCall")
211
+ continue;
212
+ const toolTokens = estimateTextTokens(`${block.name} ${JSON.stringify(block.arguments)}`);
213
+ addBucket(buckets, { type: "tool", name: block.name, tokens: toolTokens });
214
+ }
215
+ }
216
+ }
217
+ };
218
+ collect(messagesToSummarize, "history");
219
+ collect(turnPrefixMessages, "turn_prefix");
220
+ return [...buckets.values()]
221
+ .filter((bucket) => bucket.tokens > 0)
222
+ .sort((a, b) => b.tokens - a.tokens || a.type.localeCompare(b.type) || a.name.localeCompare(b.name))
223
+ .slice(0, 5);
224
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/coding-agent/core/extensions/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhE,OAAO,KAAK,EACX,SAAS,EAET,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EAKpB,MAAM,YAAY,CAAC;AAoDpB;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CA+CzD;AAiOD;;GAEG;AACH,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,gBAAgB,EACzB,aAAa,SAAa,GACxB,OAAO,CAAC,SAAS,CAAC,CAMpB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAyBrH;AA+GD;;GAEG;AACH,wBAAsB,yBAAyB,CAC9C,eAAe,EAAE,MAAM,EAAE,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAsB,EAChC,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,oBAAoB,CAAC,CA2C/B"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/coding-agent/core/extensions/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhE,OAAO,KAAK,EACX,SAAS,EAET,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EAKpB,MAAM,YAAY,CAAC;AAkEpB;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CA+CzD;AAiOD;;GAEG;AACH,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,gBAAgB,EACzB,aAAa,SAAa,GACxB,OAAO,CAAC,SAAS,CAAC,CAMpB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAyBrH;AA+GD;;GAEG;AACH,wBAAsB,yBAAyB,CAC9C,eAAe,EAAE,MAAM,EAAE,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAsB,EAChC,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,oBAAoB,CAAC,CA2C/B"}
@@ -31,18 +31,32 @@ function getAliases() {
31
31
  if (fs.existsSync(workspacePath)) {
32
32
  return workspacePath;
33
33
  }
34
+ // Vite SSR (vitest) does not provide import.meta.resolve — fall back to
35
+ // resolving the specifier relative to this module, which is the same
36
+ // anchor import.meta.resolve uses.
37
+ if (typeof import.meta.resolve !== "function") {
38
+ return path.resolve(__dirname, specifier);
39
+ }
34
40
  return fileURLToPath(import.meta.resolve(specifier));
35
41
  };
36
42
  const spectralCodingAgentEntry = packageIndex;
37
43
  const spectralAgentCoreEntry = resolveWorkspaceOrImport("agent/dist/index.js", "../../../agent-core/index.ts");
38
44
  const spectralAiEntry = resolveWorkspaceOrImport("ai/dist/index.js", "../../../ai/index.ts");
39
45
  const spectralAiOauthEntry = resolveWorkspaceOrImport("ai/dist/oauth.js", "../../../ai/oauth.ts");
46
+ // `@aexol/spectral/sdk` (programmatic SDK subpath) resolves, via package
47
+ // exports, to sdk-public. Prefer the repo/dev source (tsx layout), then the
48
+ // compiled dist sibling (published layout), so extensions loaded through
49
+ // jiti can import runtime values from the SDK barrel.
50
+ const sdkPublicSrcEntry = path.resolve(__dirname, "../../../../", "sdk-public.ts");
51
+ const sdkPublicDistEntry = path.resolve(__dirname, "../../../../", "sdk-public.js");
52
+ const spectralSdkEntry = fs.existsSync(sdkPublicSrcEntry) ? sdkPublicSrcEntry : sdkPublicDistEntry;
40
53
  _aliases = {
41
54
  "../../index.ts": spectralCodingAgentEntry,
42
55
  "../../../agent-core/index.ts": spectralAgentCoreEntry,
43
56
  "../../../ai/index.ts": spectralAiEntry,
44
57
  "../../../ai/oauth.ts": spectralAiOauthEntry,
45
58
  "@aexol/spectral": spectralCodingAgentEntry,
59
+ "@aexol/spectral/sdk": spectralSdkEntry,
46
60
  typebox: typeboxEntry,
47
61
  "typebox/compile": typeboxCompileEntry,
48
62
  "typebox/value": typeboxValueEntry,
@@ -11,6 +11,24 @@
11
11
  * in the agent runtime (e.g., memory). They don't need a file to load, but
12
12
  * they still appear in the settings panel so users can see and toggle them.
13
13
  */
14
+ /**
15
+ * Native (built-in) extension selection.
16
+ *
17
+ * Single source of truth shared by the SDK (`sdk.ts`) and the default
18
+ * resource loader (`resource-loader.ts`) so the two option types cannot
19
+ * drift apart.
20
+ *
21
+ * - "all": every file-based native extension is loaded.
22
+ * - "none": no native extensions are loaded (programmatic SDK default —
23
+ * SDK sessions are opt-in only, unlike the CLI/serve path where native
24
+ * extensions are on by default).
25
+ * - { enabled, disabled }: explicit selection — enabled ids minus disabled
26
+ * ids. Extension ids come from `NATIVE_EXTENSIONS`.
27
+ */
28
+ export type NativeExtensionsOption = "all" | "none" | {
29
+ enabled: string[];
30
+ disabled: string[];
31
+ };
14
32
  export interface NativeExtensionManifest {
15
33
  /** Stable identifier used in settings (e.g. "memory", "browser"). */
16
34
  id: string;
@@ -47,6 +65,14 @@ export declare function getNativeExtension(id: string): NativeExtensionManifest
47
65
  * respecting default-on disabled ids and default-off enabled ids.
48
66
  */
49
67
  export declare function getEnabledNativeExtensionPaths(disabledIds: Set<string>, enabledIds: Set<string>): string[];
68
+ /**
69
+ * Get native extension entry paths from an explicit selection.
70
+ *
71
+ * Loaded = enabled ids minus disabled ids. The `defaultEnabled` flags are
72
+ * ignored — the caller takes full control. Used by the programmatic SDK path,
73
+ * where native extensions are opt-in only.
74
+ */
75
+ export declare function getExplicitNativeExtensionPaths(enabledIds: Set<string>, disabledIds: Set<string>): string[];
50
76
  /**
51
77
  * Build the payload for the `native_extensions_info` relay frame.
52
78
  */
@@ -1 +1 @@
1
- {"version":3,"file":"native-extensions.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/coding-agent/core/extensions/native-extensions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,uBAAuB;IACtC,qEAAqE;IACrE,EAAE,EAAE,MAAM,CAAC;IACX,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,aAAa,CAAC;IAChD;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,cAAc,EAAE,OAAO,CAAC;IACxB,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,EAAE,uBAAuB,EAiKtD,CAAC;AAEF;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,uBAAuB,GAAG,SAAS,CAElF;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAI1G;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;IAClG,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC,CAUD"}
1
+ {"version":3,"file":"native-extensions.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/coding-agent/core/extensions/native-extensions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,sBAAsB,GAAG,KAAK,GAAG,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEhG,MAAM,WAAW,uBAAuB;IACtC,qEAAqE;IACrE,EAAE,EAAE,MAAM,CAAC;IACX,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,aAAa,CAAC;IAChD;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,cAAc,EAAE,OAAO,CAAC;IACxB,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,EAAE,uBAAuB,EA6KtD,CAAC;AAEF;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,uBAAuB,GAAG,SAAS,CAElF;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAI1G;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAI3G;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;IAClG,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC,CAUD"}
@@ -68,6 +68,17 @@ export const NATIVE_EXTENSIONS = [
68
68
  defaultEnabled: true,
69
69
  tags: ["images", "generation", "openrouter"],
70
70
  },
71
+ {
72
+ id: "video-generation",
73
+ label: "Video Generation",
74
+ description: "Generates videos through OpenRouter's Videos API. Supports text prompts " +
75
+ "and optional frame images for image-to-video workflows. Models cannot " +
76
+ "read video — results carry a text summary plus a video block for the UI.",
77
+ category: "automation",
78
+ entryPath: "src/extensions/video-generation/index.ts",
79
+ defaultEnabled: true,
80
+ tags: ["videos", "generation", "openrouter"],
81
+ },
71
82
  {
72
83
  id: "spectral-vision-fallback",
73
84
  label: "Spectral Vision Fallback",
@@ -181,6 +192,18 @@ export function getEnabledNativeExtensionPaths(disabledIds, enabledIds) {
181
192
  .filter((e) => (e.defaultEnabled ? !disabledIds.has(e.id) : enabledIds.has(e.id)) && e.entryPath !== "")
182
193
  .map((e) => e.entryPath);
183
194
  }
195
+ /**
196
+ * Get native extension entry paths from an explicit selection.
197
+ *
198
+ * Loaded = enabled ids minus disabled ids. The `defaultEnabled` flags are
199
+ * ignored — the caller takes full control. Used by the programmatic SDK path,
200
+ * where native extensions are opt-in only.
201
+ */
202
+ export function getExplicitNativeExtensionPaths(enabledIds, disabledIds) {
203
+ return NATIVE_EXTENSIONS
204
+ .filter((e) => e.entryPath !== "" && enabledIds.has(e.id) && !disabledIds.has(e.id))
205
+ .map((e) => e.entryPath);
206
+ }
184
207
  /**
185
208
  * Build the payload for the `native_extensions_info` relay frame.
186
209
  */
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Session and tool call/result event types for the extension system.
3
+ */
4
+ import type { ImageContent, TextContent, VideoContent } from "../../../ai/index.js";
5
+ import type { CompactionPreparation } from "../compaction/index.js";
6
+ import type { BranchSummaryEntry, CompactionEntry, SessionEntry } from "../session-manager.js";
7
+ import type { BashToolDetails, BashToolInput, ReadToolDetails, ReadToolInput } from "../tools/index.js";
8
+ /** Fired when a session is started, loaded, or reloaded */
9
+ export interface SessionStartEvent {
10
+ type: "session_start";
11
+ /** Why this session start happened. */
12
+ reason: "startup" | "reload" | "new" | "resume" | "fork";
13
+ /** Previously active session file. Present for "new", "resume", and "fork". */
14
+ previousSessionFile?: string;
15
+ }
16
+ /** Fired before switching to another session (can be cancelled) */
17
+ export interface SessionBeforeSwitchEvent {
18
+ type: "session_before_switch";
19
+ reason: "new" | "resume";
20
+ targetSessionFile?: string;
21
+ }
22
+ /** Fired before forking a session (can be cancelled) */
23
+ export interface SessionBeforeForkEvent {
24
+ type: "session_before_fork";
25
+ entryId: string;
26
+ position: "before" | "at";
27
+ }
28
+ /** Fired before context compaction (can be cancelled or customized) */
29
+ export interface SessionBeforeCompactEvent {
30
+ type: "session_before_compact";
31
+ preparation: CompactionPreparation;
32
+ branchEntries: SessionEntry[];
33
+ customInstructions?: string;
34
+ signal: AbortSignal;
35
+ /**
36
+ * Emit live compaction progress to the host UI. Extensions that provide a
37
+ * custom compaction result should call this while building it so the browser
38
+ * does not appear idle until the final compaction object is returned.
39
+ */
40
+ emitProgress?: (delta: string, content?: string) => void;
41
+ }
42
+ /** Fired after context compaction */
43
+ export interface SessionCompactEvent {
44
+ type: "session_compact";
45
+ compactionEntry: CompactionEntry;
46
+ fromExtension: boolean;
47
+ }
48
+ /** Fired before an extension runtime is torn down due to quit, reload, or session replacement. */
49
+ export interface SessionShutdownEvent {
50
+ type: "session_shutdown";
51
+ reason: "quit" | "reload" | "new" | "resume" | "fork";
52
+ /** Destination session file when shutting down due to session replacement. */
53
+ targetSessionFile?: string;
54
+ }
55
+ /** Preparation data for tree navigation */
56
+ export interface TreePreparation {
57
+ targetId: string;
58
+ oldLeafId: string | null;
59
+ commonAncestorId: string | null;
60
+ entriesToSummarize: SessionEntry[];
61
+ userWantsSummary: boolean;
62
+ /** Custom instructions for summarization */
63
+ customInstructions?: string;
64
+ /** If true, customInstructions replaces the default prompt instead of being appended */
65
+ replaceInstructions?: boolean;
66
+ /** Label to attach to the branch summary entry */
67
+ label?: string;
68
+ }
69
+ /** Fired before navigating in the session tree (can be cancelled) */
70
+ export interface SessionBeforeTreeEvent {
71
+ type: "session_before_tree";
72
+ preparation: TreePreparation;
73
+ signal: AbortSignal;
74
+ }
75
+ /** Fired after navigating in the session tree */
76
+ export interface SessionTreeEvent {
77
+ type: "session_tree";
78
+ newLeafId: string | null;
79
+ oldLeafId: string | null;
80
+ summaryEntry?: BranchSummaryEntry;
81
+ fromExtension?: boolean;
82
+ }
83
+ export type SessionEvent = SessionStartEvent | SessionBeforeSwitchEvent | SessionBeforeForkEvent | SessionBeforeCompactEvent | SessionCompactEvent | SessionShutdownEvent | SessionBeforeTreeEvent | SessionTreeEvent;
84
+ interface ToolCallEventBase {
85
+ type: "tool_call";
86
+ toolCallId: string;
87
+ }
88
+ export interface BashToolCallEvent extends ToolCallEventBase {
89
+ toolName: "bash";
90
+ input: BashToolInput;
91
+ }
92
+ export interface ReadToolCallEvent extends ToolCallEventBase {
93
+ toolName: "read";
94
+ input: ReadToolInput;
95
+ }
96
+ export interface CustomToolCallEvent extends ToolCallEventBase {
97
+ toolName: string;
98
+ input: Record<string, unknown>;
99
+ }
100
+ /**
101
+ * Fired before a tool executes. Can block.
102
+ *
103
+ * `event.input` is mutable. Mutate it in place to patch tool arguments before execution.
104
+ * Later `tool_call` handlers see earlier mutations. No re-validation is performed after mutation.
105
+ */
106
+ export type ToolCallEvent = BashToolCallEvent | ReadToolCallEvent | CustomToolCallEvent;
107
+ interface ToolResultEventBase {
108
+ type: "tool_result";
109
+ toolCallId: string;
110
+ input: Record<string, unknown>;
111
+ content: (TextContent | ImageContent | VideoContent)[];
112
+ isError: boolean;
113
+ }
114
+ export interface BashToolResultEvent extends ToolResultEventBase {
115
+ toolName: "bash";
116
+ details: BashToolDetails | undefined;
117
+ }
118
+ export interface ReadToolResultEvent extends ToolResultEventBase {
119
+ toolName: "read";
120
+ details: ReadToolDetails | undefined;
121
+ }
122
+ export interface CustomToolResultEvent extends ToolResultEventBase {
123
+ toolName: string;
124
+ details: unknown;
125
+ }
126
+ /** Fired after a tool executes. Can modify result. */
127
+ export type ToolResultEvent = BashToolResultEvent | ReadToolResultEvent | CustomToolResultEvent;
128
+ export declare function isBashToolResult(e: ToolResultEvent): e is BashToolResultEvent;
129
+ export declare function isReadToolResult(e: ToolResultEvent): e is ReadToolResultEvent;
130
+ /**
131
+ * Type guard for narrowing ToolCallEvent by tool name.
132
+ *
133
+ * Built-in tools narrow automatically (no type params needed):
134
+ * ```ts
135
+ * if (isToolCallEventType("bash", event)) {
136
+ * event.input.command; // string
137
+ * }
138
+ * ```
139
+ *
140
+ * Custom tools require explicit type parameters:
141
+ * ```ts
142
+ * if (isToolCallEventType<"my_tool", MyToolInput>("my_tool", event)) {
143
+ * event.input.action; // typed
144
+ * }
145
+ * ```
146
+ *
147
+ * Note: Direct narrowing via `event.toolName === "bash"` doesn't work because
148
+ * CustomToolCallEvent.toolName is `string` which overlaps with all literals.
149
+ */
150
+ export declare function isToolCallEventType(toolName: "bash", event: ToolCallEvent): event is BashToolCallEvent;
151
+ export declare function isToolCallEventType(toolName: "read", event: ToolCallEvent): event is ReadToolCallEvent;
152
+ export declare function isToolCallEventType<TName extends string, TInput extends Record<string, unknown>>(toolName: TName, event: ToolCallEvent): event is ToolCallEvent & {
153
+ toolName: TName;
154
+ input: TInput;
155
+ };
156
+ export {};
157
+ //# sourceMappingURL=session-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-events.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/coding-agent/core/extensions/session-events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Session and tool call/result event types for the extension system.
3
+ */
4
+ // Type guards for ToolResultEvent
5
+ export function isBashToolResult(e) {
6
+ return e.toolName === "bash";
7
+ }
8
+ export function isReadToolResult(e) {
9
+ return e.toolName === "read";
10
+ }
11
+ export function isToolCallEventType(toolName, event) {
12
+ return event.toolName === toolName;
13
+ }