@aexol/spectral 0.9.230 → 0.9.231

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 (172) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/designer/data/skills/blog-post.d.ts +3 -0
  3. package/dist/designer/data/skills/blog-post.d.ts.map +1 -0
  4. package/dist/designer/data/skills/blog-post.js +84 -0
  5. package/dist/designer/data/skills/blog-post.ts +87 -0
  6. package/dist/designer/data/skills/critique.d.ts +3 -0
  7. package/dist/designer/data/skills/critique.d.ts.map +1 -0
  8. package/dist/designer/data/skills/critique.js +109 -0
  9. package/dist/designer/data/skills/critique.ts +112 -0
  10. package/dist/designer/data/skills/dashboard.d.ts +3 -0
  11. package/dist/designer/data/skills/dashboard.d.ts.map +1 -0
  12. package/dist/designer/data/skills/dashboard.js +165 -0
  13. package/dist/designer/data/skills/dashboard.ts +168 -0
  14. package/dist/designer/data/skills/design-brief.d.ts +3 -0
  15. package/dist/designer/data/skills/design-brief.d.ts.map +1 -0
  16. package/dist/designer/data/skills/design-brief.js +141 -0
  17. package/dist/designer/data/skills/design-brief.ts +144 -0
  18. package/dist/designer/data/skills/design-skill.d.ts +10 -0
  19. package/dist/designer/data/skills/design-skill.d.ts.map +1 -0
  20. package/dist/designer/data/skills/design-skill.js +1 -0
  21. package/dist/designer/data/skills/design-skill.ts +9 -0
  22. package/dist/designer/data/skills/docs-page.d.ts +3 -0
  23. package/dist/designer/data/skills/docs-page.d.ts.map +1 -0
  24. package/dist/designer/data/skills/docs-page.js +68 -0
  25. package/dist/designer/data/skills/docs-page.ts +71 -0
  26. package/dist/designer/data/skills/index.d.ts +3 -0
  27. package/dist/designer/data/skills/index.d.ts.map +1 -0
  28. package/dist/designer/data/skills/index.js +28 -0
  29. package/dist/designer/data/skills/index.ts +30 -0
  30. package/dist/designer/data/skills/magazine-poster.d.ts +3 -0
  31. package/dist/designer/data/skills/magazine-poster.d.ts.map +1 -0
  32. package/dist/designer/data/skills/magazine-poster.js +70 -0
  33. package/dist/designer/data/skills/magazine-poster.ts +73 -0
  34. package/dist/designer/data/skills/mobile-app.d.ts +3 -0
  35. package/dist/designer/data/skills/mobile-app.d.ts.map +1 -0
  36. package/dist/designer/data/skills/mobile-app.js +229 -0
  37. package/dist/designer/data/skills/mobile-app.ts +232 -0
  38. package/dist/designer/data/skills/motion-frames.d.ts +3 -0
  39. package/dist/designer/data/skills/motion-frames.d.ts.map +1 -0
  40. package/dist/designer/data/skills/motion-frames.js +121 -0
  41. package/dist/designer/data/skills/motion-frames.ts +124 -0
  42. package/dist/designer/data/skills/pricing-page.d.ts +3 -0
  43. package/dist/designer/data/skills/pricing-page.d.ts.map +1 -0
  44. package/dist/designer/data/skills/pricing-page.js +76 -0
  45. package/dist/designer/data/skills/pricing-page.ts +79 -0
  46. package/dist/designer/data/skills/saas-landing.d.ts +3 -0
  47. package/dist/designer/data/skills/saas-landing.d.ts.map +1 -0
  48. package/dist/designer/data/skills/saas-landing.js +71 -0
  49. package/dist/designer/data/skills/saas-landing.ts +74 -0
  50. package/dist/designer/data/skills/slide-deck.d.ts +3 -0
  51. package/dist/designer/data/skills/slide-deck.d.ts.map +1 -0
  52. package/dist/designer/data/skills/slide-deck.js +213 -0
  53. package/dist/designer/data/skills/slide-deck.ts +216 -0
  54. package/dist/designer/data/skills/social-carousel.d.ts +3 -0
  55. package/dist/designer/data/skills/social-carousel.d.ts.map +1 -0
  56. package/dist/designer/data/skills/social-carousel.js +135 -0
  57. package/dist/designer/data/skills/social-carousel.ts +138 -0
  58. package/dist/designer/data/skills/web-prototype.d.ts +3 -0
  59. package/dist/designer/data/skills/web-prototype.d.ts.map +1 -0
  60. package/dist/designer/data/skills/web-prototype.js +159 -0
  61. package/dist/designer/data/skills/web-prototype.ts +162 -0
  62. package/dist/designer/skills.d.ts +4 -10
  63. package/dist/designer/skills.d.ts.map +1 -1
  64. package/dist/designer/skills.js +2 -1643
  65. package/dist/extensions/wizard/index.js +9 -1
  66. package/dist/generated/parser/ast/nodes.d.ts +115 -0
  67. package/dist/generated/parser/ast/nodes.d.ts.map +1 -0
  68. package/dist/generated/parser/ast/nodes.js +8 -0
  69. package/dist/generated/parser/lexer/lexer.d.ts +28 -0
  70. package/dist/generated/parser/lexer/lexer.d.ts.map +1 -0
  71. package/dist/generated/parser/{lexer.js → lexer/lexer.js} +1 -180
  72. package/dist/generated/parser/{lexer.d.ts → lexer/tokens.d.ts} +5 -24
  73. package/dist/generated/parser/lexer/tokens.d.ts.map +1 -0
  74. package/dist/generated/parser/lexer/tokens.js +187 -0
  75. package/dist/generated/parser/mod.d.ts +5 -7
  76. package/dist/generated/parser/mod.d.ts.map +1 -1
  77. package/dist/generated/parser/mod.js +2 -1
  78. package/dist/generated/parser/parser/cursor.d.ts +47 -0
  79. package/dist/generated/parser/parser/cursor.d.ts.map +1 -0
  80. package/dist/generated/parser/parser/cursor.js +12 -0
  81. package/dist/generated/parser/parser/definitions.d.ts +16 -0
  82. package/dist/generated/parser/parser/definitions.d.ts.map +1 -0
  83. package/dist/generated/parser/parser/definitions.js +353 -0
  84. package/dist/generated/parser/parser/expressions.d.ts +17 -0
  85. package/dist/generated/parser/parser/expressions.d.ts.map +1 -0
  86. package/dist/generated/parser/parser/expressions.js +165 -0
  87. package/dist/generated/parser/parser.d.ts +18 -133
  88. package/dist/generated/parser/parser.d.ts.map +1 -1
  89. package/dist/generated/parser/parser.js +9 -505
  90. package/dist/generated/parser/tokenizer.d.ts +1 -2
  91. package/dist/generated/parser/tokenizer.d.ts.map +1 -1
  92. package/dist/generated/parser/tokenizer.js +2 -1
  93. package/dist/generated/parser/validator.d.ts +1 -1
  94. package/dist/generated/parser/validator.d.ts.map +1 -1
  95. package/dist/mcp/glimpse-ui.js +9 -1
  96. package/dist/relay/dispatcher.d.ts +11 -104
  97. package/dist/relay/dispatcher.d.ts.map +1 -1
  98. package/dist/relay/dispatcher.js +10 -1130
  99. package/dist/relay/rest.d.ts +31 -0
  100. package/dist/relay/rest.d.ts.map +1 -0
  101. package/dist/relay/rest.js +85 -0
  102. package/dist/relay/routing.d.ts +109 -0
  103. package/dist/relay/routing.d.ts.map +1 -0
  104. package/dist/relay/routing.js +669 -0
  105. package/dist/relay/wizard-login.d.ts +17 -0
  106. package/dist/relay/wizard-login.d.ts.map +1 -0
  107. package/dist/relay/wizard-login.js +419 -0
  108. package/dist/sdk/agent-core/agent-loop.d.ts +2 -9
  109. package/dist/sdk/agent-core/agent-loop.d.ts.map +1 -1
  110. package/dist/sdk/agent-core/agent-loop.js +4 -288
  111. package/dist/sdk/agent-core/tool-execution.d.ts +33 -0
  112. package/dist/sdk/agent-core/tool-execution.d.ts.map +1 -0
  113. package/dist/sdk/agent-core/tool-execution.js +300 -0
  114. package/dist/sdk/ai/env-api-keys.js +9 -1
  115. package/dist/sdk/ai/providers/openai/reasoning-replay.d.ts +48 -0
  116. package/dist/sdk/ai/providers/openai/reasoning-replay.d.ts.map +1 -0
  117. package/dist/sdk/ai/providers/openai/reasoning-replay.js +209 -0
  118. package/dist/sdk/ai/providers/openai-completions.d.ts.map +1 -1
  119. package/dist/sdk/ai/providers/openai-completions.js +1 -203
  120. package/dist/sdk/coding-agent/core/compaction/compaction.d.ts +6 -118
  121. package/dist/sdk/coding-agent/core/compaction/compaction.d.ts.map +1 -1
  122. package/dist/sdk/coding-agent/core/compaction/compaction.js +11 -733
  123. package/dist/sdk/coding-agent/core/compaction/cut-points.d.ts +58 -0
  124. package/dist/sdk/coding-agent/core/compaction/cut-points.d.ts.map +1 -0
  125. package/dist/sdk/coding-agent/core/compaction/cut-points.js +191 -0
  126. package/dist/sdk/coding-agent/core/compaction/dedupe.d.ts +28 -0
  127. package/dist/sdk/coding-agent/core/compaction/dedupe.d.ts.map +1 -0
  128. package/dist/sdk/coding-agent/core/compaction/dedupe.js +156 -0
  129. package/dist/sdk/coding-agent/core/compaction/summarize.d.ts +21 -0
  130. package/dist/sdk/coding-agent/core/compaction/summarize.d.ts.map +1 -0
  131. package/dist/sdk/coding-agent/core/compaction/summarize.js +181 -0
  132. package/dist/sdk/coding-agent/core/compaction/tokens.d.ts +47 -0
  133. package/dist/sdk/coding-agent/core/compaction/tokens.d.ts.map +1 -0
  134. package/dist/sdk/coding-agent/core/compaction/tokens.js +224 -0
  135. package/dist/sdk/coding-agent/core/extensions/session-events.d.ts +157 -0
  136. package/dist/sdk/coding-agent/core/extensions/session-events.d.ts.map +1 -0
  137. package/dist/sdk/coding-agent/core/extensions/session-events.js +13 -0
  138. package/dist/sdk/coding-agent/core/extensions/types.d.ts +6 -365
  139. package/dist/sdk/coding-agent/core/extensions/types.d.ts.map +1 -1
  140. package/dist/sdk/coding-agent/core/extensions/types.js +2 -10
  141. package/dist/sdk/coding-agent/core/extensions/ui-types.d.ts +219 -0
  142. package/dist/sdk/coding-agent/core/extensions/ui-types.d.ts.map +1 -0
  143. package/dist/sdk/coding-agent/core/extensions/ui-types.js +4 -0
  144. package/dist/sdk/coding-agent/core/package/default-package-manager.d.ts +115 -0
  145. package/dist/sdk/coding-agent/core/package/default-package-manager.d.ts.map +1 -0
  146. package/dist/sdk/coding-agent/core/package/default-package-manager.js +1184 -0
  147. package/dist/sdk/coding-agent/core/package/discovery.d.ts +20 -0
  148. package/dist/sdk/coding-agent/core/package/discovery.d.ts.map +1 -0
  149. package/dist/sdk/coding-agent/core/package/discovery.js +283 -0
  150. package/dist/sdk/coding-agent/core/package/ignore.d.ts +29 -0
  151. package/dist/sdk/coding-agent/core/package/ignore.d.ts.map +1 -0
  152. package/dist/sdk/coding-agent/core/package/ignore.js +235 -0
  153. package/dist/sdk/coding-agent/core/package/types.d.ts +128 -0
  154. package/dist/sdk/coding-agent/core/package/types.d.ts.map +1 -0
  155. package/dist/sdk/coding-agent/core/package/types.js +18 -0
  156. package/dist/sdk/coding-agent/core/package/update-check.d.ts +43 -0
  157. package/dist/sdk/coding-agent/core/package/update-check.d.ts.map +1 -0
  158. package/dist/sdk/coding-agent/core/package/update-check.js +253 -0
  159. package/dist/sdk/coding-agent/core/package-manager.d.ts +2 -188
  160. package/dist/sdk/coding-agent/core/package-manager.d.ts.map +1 -1
  161. package/dist/sdk/coding-agent/core/package-manager.js +1 -1940
  162. package/dist/sdk/coding-agent/core/session/migrate.d.ts +18 -0
  163. package/dist/sdk/coding-agent/core/session/migrate.d.ts.map +1 -0
  164. package/dist/sdk/coding-agent/core/session/migrate.js +78 -0
  165. package/dist/sdk/coding-agent/core/session/types.d.ts +165 -0
  166. package/dist/sdk/coding-agent/core/session/types.d.ts.map +1 -0
  167. package/dist/sdk/coding-agent/core/session/types.js +4 -0
  168. package/dist/sdk/coding-agent/core/session-manager.d.ts +3 -161
  169. package/dist/sdk/coding-agent/core/session-manager.d.ts.map +1 -1
  170. package/dist/sdk/coding-agent/core/session-manager.js +4 -72
  171. package/package.json +2 -2
  172. 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
+ }
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Session and tool call/result event types for the extension system.
3
+ */
4
+ import type { ImageContent, TextContent } 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)[];
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
+ }