@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.
- package/CHANGELOG.md +2 -0
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +89 -14
- package/dist/backend/generated-images.d.ts +1 -1
- package/dist/backend/generated-images.d.ts.map +1 -1
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +12 -1
- package/dist/designer/data/skills/blog-post.d.ts +3 -0
- package/dist/designer/data/skills/blog-post.d.ts.map +1 -0
- package/dist/designer/data/skills/blog-post.js +84 -0
- package/dist/designer/data/skills/blog-post.ts +87 -0
- package/dist/designer/data/skills/critique.d.ts +3 -0
- package/dist/designer/data/skills/critique.d.ts.map +1 -0
- package/dist/designer/data/skills/critique.js +109 -0
- package/dist/designer/data/skills/critique.ts +112 -0
- package/dist/designer/data/skills/dashboard.d.ts +3 -0
- package/dist/designer/data/skills/dashboard.d.ts.map +1 -0
- package/dist/designer/data/skills/dashboard.js +165 -0
- package/dist/designer/data/skills/dashboard.ts +168 -0
- package/dist/designer/data/skills/design-brief.d.ts +3 -0
- package/dist/designer/data/skills/design-brief.d.ts.map +1 -0
- package/dist/designer/data/skills/design-brief.js +141 -0
- package/dist/designer/data/skills/design-brief.ts +144 -0
- package/dist/designer/data/skills/design-skill.d.ts +10 -0
- package/dist/designer/data/skills/design-skill.d.ts.map +1 -0
- package/dist/designer/data/skills/design-skill.js +1 -0
- package/dist/designer/data/skills/design-skill.ts +9 -0
- package/dist/designer/data/skills/docs-page.d.ts +3 -0
- package/dist/designer/data/skills/docs-page.d.ts.map +1 -0
- package/dist/designer/data/skills/docs-page.js +68 -0
- package/dist/designer/data/skills/docs-page.ts +71 -0
- package/dist/designer/data/skills/index.d.ts +3 -0
- package/dist/designer/data/skills/index.d.ts.map +1 -0
- package/dist/designer/data/skills/index.js +28 -0
- package/dist/designer/data/skills/index.ts +30 -0
- package/dist/designer/data/skills/magazine-poster.d.ts +3 -0
- package/dist/designer/data/skills/magazine-poster.d.ts.map +1 -0
- package/dist/designer/data/skills/magazine-poster.js +70 -0
- package/dist/designer/data/skills/magazine-poster.ts +73 -0
- package/dist/designer/data/skills/mobile-app.d.ts +3 -0
- package/dist/designer/data/skills/mobile-app.d.ts.map +1 -0
- package/dist/designer/data/skills/mobile-app.js +229 -0
- package/dist/designer/data/skills/mobile-app.ts +232 -0
- package/dist/designer/data/skills/motion-frames.d.ts +3 -0
- package/dist/designer/data/skills/motion-frames.d.ts.map +1 -0
- package/dist/designer/data/skills/motion-frames.js +121 -0
- package/dist/designer/data/skills/motion-frames.ts +124 -0
- package/dist/designer/data/skills/pricing-page.d.ts +3 -0
- package/dist/designer/data/skills/pricing-page.d.ts.map +1 -0
- package/dist/designer/data/skills/pricing-page.js +76 -0
- package/dist/designer/data/skills/pricing-page.ts +79 -0
- package/dist/designer/data/skills/saas-landing.d.ts +3 -0
- package/dist/designer/data/skills/saas-landing.d.ts.map +1 -0
- package/dist/designer/data/skills/saas-landing.js +71 -0
- package/dist/designer/data/skills/saas-landing.ts +74 -0
- package/dist/designer/data/skills/slide-deck.d.ts +3 -0
- package/dist/designer/data/skills/slide-deck.d.ts.map +1 -0
- package/dist/designer/data/skills/slide-deck.js +213 -0
- package/dist/designer/data/skills/slide-deck.ts +216 -0
- package/dist/designer/data/skills/social-carousel.d.ts +3 -0
- package/dist/designer/data/skills/social-carousel.d.ts.map +1 -0
- package/dist/designer/data/skills/social-carousel.js +135 -0
- package/dist/designer/data/skills/social-carousel.ts +138 -0
- package/dist/designer/data/skills/web-prototype.d.ts +3 -0
- package/dist/designer/data/skills/web-prototype.d.ts.map +1 -0
- package/dist/designer/data/skills/web-prototype.js +159 -0
- package/dist/designer/data/skills/web-prototype.ts +162 -0
- package/dist/designer/skills.d.ts +4 -10
- package/dist/designer/skills.d.ts.map +1 -1
- package/dist/designer/skills.js +2 -1643
- package/dist/extensions/logic-trace.d.ts +1 -1
- package/dist/extensions/logic-trace.d.ts.map +1 -1
- package/dist/extensions/logic-trace.js +199 -70
- package/dist/extensions/video-generation/index.d.ts +3 -0
- package/dist/extensions/video-generation/index.d.ts.map +1 -0
- package/dist/extensions/video-generation/index.js +299 -0
- package/dist/extensions/wizard/index.js +9 -1
- package/dist/generated/parser/ast/nodes.d.ts +115 -0
- package/dist/generated/parser/ast/nodes.d.ts.map +1 -0
- package/dist/generated/parser/ast/nodes.js +8 -0
- package/dist/generated/parser/lexer/lexer.d.ts +28 -0
- package/dist/generated/parser/lexer/lexer.d.ts.map +1 -0
- package/dist/generated/parser/{lexer.js → lexer/lexer.js} +1 -180
- package/dist/generated/parser/{lexer.d.ts → lexer/tokens.d.ts} +5 -24
- package/dist/generated/parser/lexer/tokens.d.ts.map +1 -0
- package/dist/generated/parser/lexer/tokens.js +187 -0
- package/dist/generated/parser/mod.d.ts +5 -7
- package/dist/generated/parser/mod.d.ts.map +1 -1
- package/dist/generated/parser/mod.js +2 -1
- package/dist/generated/parser/parser/cursor.d.ts +47 -0
- package/dist/generated/parser/parser/cursor.d.ts.map +1 -0
- package/dist/generated/parser/parser/cursor.js +12 -0
- package/dist/generated/parser/parser/definitions.d.ts +16 -0
- package/dist/generated/parser/parser/definitions.d.ts.map +1 -0
- package/dist/generated/parser/parser/definitions.js +353 -0
- package/dist/generated/parser/parser/expressions.d.ts +17 -0
- package/dist/generated/parser/parser/expressions.d.ts.map +1 -0
- package/dist/generated/parser/parser/expressions.js +165 -0
- package/dist/generated/parser/parser.d.ts +18 -133
- package/dist/generated/parser/parser.d.ts.map +1 -1
- package/dist/generated/parser/parser.js +9 -505
- package/dist/generated/parser/tokenizer.d.ts +1 -2
- package/dist/generated/parser/tokenizer.d.ts.map +1 -1
- package/dist/generated/parser/tokenizer.js +2 -1
- package/dist/generated/parser/validator.d.ts +1 -1
- package/dist/generated/parser/validator.d.ts.map +1 -1
- package/dist/generated/zeus/const.d.ts.map +1 -1
- package/dist/generated/zeus/const.js +30 -0
- package/dist/generated/zeus/index.d.ts +140 -0
- package/dist/generated/zeus/index.d.ts.map +1 -1
- package/dist/generated/zeus/index.js +5 -0
- package/dist/mcp/glimpse-ui.js +9 -1
- package/dist/relay/dispatcher.d.ts +23 -104
- package/dist/relay/dispatcher.d.ts.map +1 -1
- package/dist/relay/dispatcher.js +21 -1130
- package/dist/relay/rest.d.ts +31 -0
- package/dist/relay/rest.d.ts.map +1 -0
- package/dist/relay/rest.js +85 -0
- package/dist/relay/routing.d.ts +109 -0
- package/dist/relay/routing.d.ts.map +1 -0
- package/dist/relay/routing.js +669 -0
- package/dist/relay/wizard-login.d.ts +17 -0
- package/dist/relay/wizard-login.d.ts.map +1 -0
- package/dist/relay/wizard-login.js +419 -0
- package/dist/sdk/agent-core/agent-loop.d.ts +2 -9
- package/dist/sdk/agent-core/agent-loop.d.ts.map +1 -1
- package/dist/sdk/agent-core/agent-loop.js +17 -291
- package/dist/sdk/agent-core/agent.d.ts +11 -4
- package/dist/sdk/agent-core/agent.d.ts.map +1 -1
- package/dist/sdk/agent-core/agent.js +16 -4
- package/dist/sdk/agent-core/tool-call-registry.d.ts +75 -0
- package/dist/sdk/agent-core/tool-call-registry.d.ts.map +1 -0
- package/dist/sdk/agent-core/tool-call-registry.js +131 -0
- package/dist/sdk/agent-core/tool-execution.d.ts +33 -0
- package/dist/sdk/agent-core/tool-execution.d.ts.map +1 -0
- package/dist/sdk/agent-core/tool-execution.js +399 -0
- package/dist/sdk/agent-core/types.d.ts +15 -4
- package/dist/sdk/agent-core/types.d.ts.map +1 -1
- package/dist/sdk/ai/env-api-keys.js +9 -1
- package/dist/sdk/ai/index.d.ts +3 -0
- package/dist/sdk/ai/index.d.ts.map +1 -1
- package/dist/sdk/ai/index.js +3 -0
- package/dist/sdk/ai/providers/faux.d.ts.map +1 -1
- package/dist/sdk/ai/providers/faux.js +3 -0
- package/dist/sdk/ai/providers/leaked-tool-call-parser.d.ts +39 -6
- package/dist/sdk/ai/providers/leaked-tool-call-parser.d.ts.map +1 -1
- package/dist/sdk/ai/providers/leaked-tool-call-parser.js +159 -18
- package/dist/sdk/ai/providers/openai/reasoning-replay.d.ts +48 -0
- package/dist/sdk/ai/providers/openai/reasoning-replay.d.ts.map +1 -0
- package/dist/sdk/ai/providers/openai/reasoning-replay.js +209 -0
- package/dist/sdk/ai/providers/openai-completions.d.ts.map +1 -1
- package/dist/sdk/ai/providers/openai-completions.js +23 -211
- package/dist/sdk/ai/providers/openrouter-videos.d.ts +3 -0
- package/dist/sdk/ai/providers/openrouter-videos.d.ts.map +1 -0
- package/dist/sdk/ai/providers/openrouter-videos.js +412 -0
- package/dist/sdk/ai/providers/register-builtins.d.ts.map +1 -1
- package/dist/sdk/ai/providers/register-builtins.js +6 -0
- package/dist/sdk/ai/providers/simple-options.d.ts +1 -6
- package/dist/sdk/ai/providers/simple-options.d.ts.map +1 -1
- package/dist/sdk/ai/providers/simple-options.js +0 -22
- package/dist/sdk/ai/providers/transform-messages.d.ts.map +1 -1
- package/dist/sdk/ai/providers/transform-messages.js +52 -1
- package/dist/sdk/ai/types.d.ts +91 -10
- package/dist/sdk/ai/types.d.ts.map +1 -1
- package/dist/sdk/ai/video-models.d.ts +10 -0
- package/dist/sdk/ai/video-models.d.ts.map +1 -0
- package/dist/sdk/ai/video-models.generated.d.ts +440 -0
- package/dist/sdk/ai/video-models.generated.d.ts.map +1 -0
- package/dist/sdk/ai/video-models.generated.js +441 -0
- package/dist/sdk/ai/video-models.js +22 -0
- package/dist/sdk/ai/videos-api-registry.d.ts +14 -0
- package/dist/sdk/ai/videos-api-registry.d.ts.map +1 -0
- package/dist/sdk/ai/videos-api-registry.js +21 -0
- package/dist/sdk/ai/videos.d.ts +4 -0
- package/dist/sdk/ai/videos.d.ts.map +1 -0
- package/dist/sdk/ai/videos.js +13 -0
- package/dist/sdk/coding-agent/core/agent-session.d.ts +8 -0
- package/dist/sdk/coding-agent/core/agent-session.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/agent-session.js +11 -0
- package/dist/sdk/coding-agent/core/compaction/compaction.d.ts +6 -118
- package/dist/sdk/coding-agent/core/compaction/compaction.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/compaction/compaction.js +11 -733
- package/dist/sdk/coding-agent/core/compaction/cut-points.d.ts +58 -0
- package/dist/sdk/coding-agent/core/compaction/cut-points.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/compaction/cut-points.js +191 -0
- package/dist/sdk/coding-agent/core/compaction/dedupe.d.ts +28 -0
- package/dist/sdk/coding-agent/core/compaction/dedupe.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/compaction/dedupe.js +156 -0
- package/dist/sdk/coding-agent/core/compaction/summarize.d.ts +21 -0
- package/dist/sdk/coding-agent/core/compaction/summarize.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/compaction/summarize.js +181 -0
- package/dist/sdk/coding-agent/core/compaction/tokens.d.ts +47 -0
- package/dist/sdk/coding-agent/core/compaction/tokens.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/compaction/tokens.js +224 -0
- package/dist/sdk/coding-agent/core/extensions/loader.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/extensions/loader.js +14 -0
- package/dist/sdk/coding-agent/core/extensions/native-extensions.d.ts +26 -0
- package/dist/sdk/coding-agent/core/extensions/native-extensions.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/extensions/native-extensions.js +23 -0
- package/dist/sdk/coding-agent/core/extensions/session-events.d.ts +157 -0
- package/dist/sdk/coding-agent/core/extensions/session-events.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/extensions/session-events.js +13 -0
- package/dist/sdk/coding-agent/core/extensions/types.d.ts +10 -367
- package/dist/sdk/coding-agent/core/extensions/types.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/extensions/types.js +2 -10
- package/dist/sdk/coding-agent/core/extensions/ui-types.d.ts +219 -0
- package/dist/sdk/coding-agent/core/extensions/ui-types.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/extensions/ui-types.js +4 -0
- package/dist/sdk/coding-agent/core/messages.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/messages.js +42 -2
- package/dist/sdk/coding-agent/core/package/default-package-manager.d.ts +115 -0
- package/dist/sdk/coding-agent/core/package/default-package-manager.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/package/default-package-manager.js +1184 -0
- package/dist/sdk/coding-agent/core/package/discovery.d.ts +20 -0
- package/dist/sdk/coding-agent/core/package/discovery.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/package/discovery.js +283 -0
- package/dist/sdk/coding-agent/core/package/ignore.d.ts +29 -0
- package/dist/sdk/coding-agent/core/package/ignore.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/package/ignore.js +235 -0
- package/dist/sdk/coding-agent/core/package/types.d.ts +128 -0
- package/dist/sdk/coding-agent/core/package/types.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/package/types.js +18 -0
- package/dist/sdk/coding-agent/core/package/update-check.d.ts +43 -0
- package/dist/sdk/coding-agent/core/package/update-check.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/package/update-check.js +253 -0
- package/dist/sdk/coding-agent/core/package-manager.d.ts +2 -188
- package/dist/sdk/coding-agent/core/package-manager.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/package-manager.js +1 -1940
- package/dist/sdk/coding-agent/core/resource-loader.d.ts +11 -0
- package/dist/sdk/coding-agent/core/resource-loader.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/resource-loader.js +23 -6
- package/dist/sdk/coding-agent/core/sdk.d.ts +24 -2
- package/dist/sdk/coding-agent/core/sdk.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/sdk.js +15 -3
- package/dist/sdk/coding-agent/core/session/migrate.d.ts +18 -0
- package/dist/sdk/coding-agent/core/session/migrate.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/session/migrate.js +78 -0
- package/dist/sdk/coding-agent/core/session/types.d.ts +165 -0
- package/dist/sdk/coding-agent/core/session/types.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/session/types.js +4 -0
- package/dist/sdk/coding-agent/core/session-manager.d.ts +3 -161
- package/dist/sdk/coding-agent/core/session-manager.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/session-manager.js +4 -72
- package/dist/sdk/coding-agent/core/settings-manager.d.ts +0 -8
- package/dist/sdk/coding-agent/core/settings-manager.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/settings-manager.js +3 -3
- package/dist/sdk/coding-agent/index.d.ts +2 -2
- package/dist/sdk/coding-agent/index.d.ts.map +1 -1
- package/dist/sdk/coding-agent/index.js +1 -1
- package/dist/sdk-public.d.ts +96 -0
- package/dist/sdk-public.d.ts.map +1 -0
- package/dist/sdk-public.js +109 -0
- package/dist/server/agent-bridge/rehydrate.d.ts +2 -2
- package/dist/server/agent-bridge/rehydrate.d.ts.map +1 -1
- package/dist/server/agent-bridge/rehydrate.js +14 -0
- package/dist/server/agent-bridge.d.ts +8 -2
- package/dist/server/agent-bridge.d.ts.map +1 -1
- package/dist/server/agent-bridge.js +25 -2
- package/dist/server/session-stream.d.ts +19 -0
- package/dist/server/session-stream.d.ts.map +1 -1
- package/dist/server/session-stream.js +35 -0
- package/dist/server/wire.d.ts +13 -0
- package/dist/server/wire.d.ts.map +1 -1
- package/package.json +8 -2
- 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;
|
|
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,
|
|
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
|
+
}
|