flavor-code 1.2.1

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 (145) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1081 -0
  3. package/dist/agent/loop.d.ts +31 -0
  4. package/dist/agent/message-queue.d.ts +19 -0
  5. package/dist/agent/planner.d.ts +28 -0
  6. package/dist/agent/subagents.d.ts +50 -0
  7. package/dist/agent/task-plan.d.ts +60 -0
  8. package/dist/agent/task-tools.d.ts +11 -0
  9. package/dist/agent/types.d.ts +117 -0
  10. package/dist/app-WC2XXGLM.js +3185 -0
  11. package/dist/app-WC2XXGLM.js.map +1 -0
  12. package/dist/auth/oauth-config.d.ts +4 -0
  13. package/dist/auth/oauth.d.ts +21 -0
  14. package/dist/auth/store.d.ts +15 -0
  15. package/dist/auth/types.d.ts +33 -0
  16. package/dist/chunk-BU64GNXE.js +15771 -0
  17. package/dist/chunk-BU64GNXE.js.map +1 -0
  18. package/dist/chunk-DM64TM4Z.js +124 -0
  19. package/dist/chunk-DM64TM4Z.js.map +1 -0
  20. package/dist/chunk-JZ322RCJ.js +40 -0
  21. package/dist/chunk-JZ322RCJ.js.map +1 -0
  22. package/dist/chunk-M744K7MK.js +246 -0
  23. package/dist/chunk-M744K7MK.js.map +1 -0
  24. package/dist/chunk-MVIMQEQT.js +692 -0
  25. package/dist/chunk-MVIMQEQT.js.map +1 -0
  26. package/dist/chunk-VOCZVFP7.js +153 -0
  27. package/dist/chunk-VOCZVFP7.js.map +1 -0
  28. package/dist/chunk-XS2JU6S3.js +35557 -0
  29. package/dist/chunk-XS2JU6S3.js.map +1 -0
  30. package/dist/claude-ink-ZL4UZMFY.js +27 -0
  31. package/dist/claude-ink-ZL4UZMFY.js.map +1 -0
  32. package/dist/cli.js +915 -0
  33. package/dist/cli.js.map +1 -0
  34. package/dist/codeisland/activate.mjs +74 -0
  35. package/dist/codeisland/bridge.mjs +97 -0
  36. package/dist/codeisland/flavor-plugin.json +27 -0
  37. package/dist/config/load.d.ts +19 -0
  38. package/dist/config/protected-file.d.ts +15 -0
  39. package/dist/config/schema.d.ts +176 -0
  40. package/dist/config/secret-envelope.d.ts +8 -0
  41. package/dist/context/compaction.d.ts +44 -0
  42. package/dist/context/manager.d.ts +65 -0
  43. package/dist/context/summarizer.d.ts +15 -0
  44. package/dist/desktop/main.js +17778 -0
  45. package/dist/desktop/main.js.map +1 -0
  46. package/dist/desktop/preload.cjs +90 -0
  47. package/dist/desktop/preload.cjs.map +1 -0
  48. package/dist/desktop-renderer/assets/index-C66pDvHs.js +144 -0
  49. package/dist/desktop-renderer/assets/index-C66pDvHs.js.map +1 -0
  50. package/dist/desktop-renderer/assets/index-Cm_ktmXm.css +1 -0
  51. package/dist/desktop-renderer/index.html +16 -0
  52. package/dist/devtools-SXJBSV2N.js +3 -0
  53. package/dist/devtools-SXJBSV2N.js.map +1 -0
  54. package/dist/execution/docker.d.ts +29 -0
  55. package/dist/execution/factory.d.ts +3 -0
  56. package/dist/execution/types.d.ts +18 -0
  57. package/dist/goal/classifier.d.ts +12 -0
  58. package/dist/goal/orchestrator.d.ts +34 -0
  59. package/dist/goal/planner.d.ts +9 -0
  60. package/dist/goal/store.d.ts +9 -0
  61. package/dist/goal/types.d.ts +190 -0
  62. package/dist/hallucination/confidence.d.ts +12 -0
  63. package/dist/hallucination/evidence-ledger.d.ts +29 -0
  64. package/dist/hallucination/guard.d.ts +27 -0
  65. package/dist/hallucination/messages.d.ts +10 -0
  66. package/dist/hallucination/retry-monitor.d.ts +19 -0
  67. package/dist/hallucination/sliding-window.d.ts +13 -0
  68. package/dist/hallucination/types.d.ts +49 -0
  69. package/dist/harness/local.d.ts +54 -0
  70. package/dist/hooks/bus.d.ts +9 -0
  71. package/dist/hooks/types.d.ts +105 -0
  72. package/dist/ide/client.d.ts +35 -0
  73. package/dist/incidents/reporter.d.ts +38 -0
  74. package/dist/init/project.d.ts +25 -0
  75. package/dist/load-WQGNTCHC.js +20 -0
  76. package/dist/load-WQGNTCHC.js.map +1 -0
  77. package/dist/loop/budget.d.ts +11 -0
  78. package/dist/loop/isolation.d.ts +21 -0
  79. package/dist/loop/orchestrator.d.ts +82 -0
  80. package/dist/loop/store.d.ts +13 -0
  81. package/dist/loop/types.d.ts +142 -0
  82. package/dist/loop/verifier.d.ts +13 -0
  83. package/dist/mcp/client.d.ts +66 -0
  84. package/dist/mcp/sdk.d.ts +27 -0
  85. package/dist/memory/coordinator.d.ts +32 -0
  86. package/dist/memory/extractor.d.ts +15 -0
  87. package/dist/memory/intent.d.ts +2 -0
  88. package/dist/memory/retrieval.d.ts +13 -0
  89. package/dist/memory/review.d.ts +36 -0
  90. package/dist/memory/similarity.d.ts +5 -0
  91. package/dist/memory/store.d.ts +58 -0
  92. package/dist/memory/types.d.ts +37 -0
  93. package/dist/models/anthropic.d.ts +24 -0
  94. package/dist/models/cache-profile.d.ts +23 -0
  95. package/dist/models/openai.d.ts +24 -0
  96. package/dist/models/registry.d.ts +16 -0
  97. package/dist/models/structured.d.ts +75 -0
  98. package/dist/models/types.d.ts +93 -0
  99. package/dist/permissions/classifier.d.ts +9 -0
  100. package/dist/permissions/engine.d.ts +28 -0
  101. package/dist/plugins/host.d.ts +15 -0
  102. package/dist/plugins/types.d.ts +136 -0
  103. package/dist/production.d.ts +59 -0
  104. package/dist/prompts/system.d.ts +28 -0
  105. package/dist/rpc/schema.d.ts +61 -0
  106. package/dist/rpc/server.d.ts +54 -0
  107. package/dist/sdk/index.d.ts +19 -0
  108. package/dist/sdk/index.js +53 -0
  109. package/dist/sdk/index.js.map +1 -0
  110. package/dist/session/checkpoint.d.ts +25 -0
  111. package/dist/session/store.d.ts +154 -0
  112. package/dist/session/tree.d.ts +31 -0
  113. package/dist/skills/builtin-loop.d.ts +12 -0
  114. package/dist/skills/registry.d.ts +47 -0
  115. package/dist/skills/tool.d.ts +9 -0
  116. package/dist/sleep/organizer.d.ts +37 -0
  117. package/dist/tools/ask-user-question.d.ts +49 -0
  118. package/dist/tools/file-diff.d.ts +9 -0
  119. package/dist/tools/files.d.ts +49 -0
  120. package/dist/tools/lsp.d.ts +77 -0
  121. package/dist/tools/managed.d.ts +59 -0
  122. package/dist/tools/runtime.d.ts +58 -0
  123. package/dist/tools/search.d.ts +76 -0
  124. package/dist/tools/shell.d.ts +37 -0
  125. package/dist/tools/task-output.d.ts +53 -0
  126. package/dist/tools/todo-write.d.ts +35 -0
  127. package/dist/tools/types.d.ts +56 -0
  128. package/dist/trace/recorder.d.ts +14 -0
  129. package/dist/trace/replay.d.ts +3 -0
  130. package/dist/trace/schema.d.ts +26 -0
  131. package/dist/ui/commands.d.ts +67 -0
  132. package/dist/ui/session.d.ts +126 -0
  133. package/dist/ui/transcript.d.ts +89 -0
  134. package/dist/utils/async.d.ts +5 -0
  135. package/dist/utils/envUtils.d.ts +1 -0
  136. package/dist/utils/error.d.ts +2 -0
  137. package/dist/utils/execFileNoThrow.d.ts +13 -0
  138. package/dist/utils/intl.d.ts +18 -0
  139. package/dist/utils/json.d.ts +44 -0
  140. package/dist/utils/log.d.ts +28 -0
  141. package/dist/utils/redact.d.ts +10 -0
  142. package/dist/utils/usage-summary.d.ts +34 -0
  143. package/dist/utils/version.d.ts +6 -0
  144. package/package.json +124 -0
  145. package//346/212/200/346/234/257/346/226/271/346/241/210/346/212/245/345/221/212.md +4797 -0
@@ -0,0 +1,66 @@
1
+ import type { McpServerConfig } from "../config/schema.js";
2
+ import type { ToolDefinition } from "../tools/types.js";
3
+ export interface McpRemoteTool {
4
+ name: string;
5
+ description?: string;
6
+ inputSchema: Record<string, unknown>;
7
+ }
8
+ export interface McpToolList {
9
+ tools: McpRemoteTool[];
10
+ nextCursor?: string;
11
+ }
12
+ export interface McpCallResult {
13
+ content?: unknown;
14
+ structuredContent?: unknown;
15
+ isError?: boolean;
16
+ [key: string]: unknown;
17
+ }
18
+ export interface McpClientConnection {
19
+ listTools(params: {
20
+ cursor?: string;
21
+ }): Promise<McpToolList>;
22
+ callTool(params: {
23
+ name: string;
24
+ arguments: Record<string, unknown>;
25
+ }, options: {
26
+ signal: AbortSignal;
27
+ timeout: number;
28
+ }): Promise<McpCallResult>;
29
+ close(): Promise<void>;
30
+ }
31
+ export interface McpClientFactoryInput {
32
+ name: string;
33
+ config: McpServerConfig;
34
+ workspace: string;
35
+ }
36
+ export type McpClientFactory = (input: McpClientFactoryInput) => Promise<McpClientConnection>;
37
+ export interface ConnectMcpServersOptions {
38
+ servers: Readonly<Record<string, McpServerConfig>>;
39
+ workspace: string;
40
+ clientFactory: McpClientFactory;
41
+ }
42
+ export type McpServerStatus = "connecting" | "connected" | "failed" | "disabled";
43
+ export interface McpServerSummary {
44
+ name: string;
45
+ transport: "stdio" | "http";
46
+ status: McpServerStatus;
47
+ toolCount: number;
48
+ error?: string;
49
+ }
50
+ export interface McpManagedTool extends McpRemoteTool {
51
+ generatedName: string;
52
+ }
53
+ export declare class McpManager {
54
+ #private;
55
+ constructor(options: ConnectMcpServersOptions);
56
+ get tools(): readonly ToolDefinition<unknown>[];
57
+ get diagnostics(): readonly string[];
58
+ initialize(): Promise<void>;
59
+ listServers(): McpServerSummary[];
60
+ toolsFor(name: string): McpManagedTool[];
61
+ reconnect(name: string): Promise<McpServerSummary>;
62
+ setEnabled(name: string, enabled: boolean): Promise<McpServerSummary>;
63
+ close(): Promise<void>;
64
+ }
65
+ export declare function connectMcpServers(options: ConnectMcpServersOptions): Promise<McpManager>;
66
+ export declare function mcpToolName(serverName: string, remoteName: string): string;
@@ -0,0 +1,27 @@
1
+ import { type StdioServerParameters } from "@modelcontextprotocol/sdk/client/stdio.js";
2
+ import { type StreamableHTTPClientTransportOptions } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
3
+ import type { McpClientConnection, McpClientFactoryInput, McpCallResult, McpToolList } from "./client.js";
4
+ interface SdkClientLike {
5
+ connect(transport: unknown, options?: {
6
+ timeout?: number;
7
+ }): Promise<void>;
8
+ listTools(params?: {
9
+ cursor?: string;
10
+ }): Promise<McpToolList>;
11
+ callTool(params: {
12
+ name: string;
13
+ arguments?: Record<string, unknown>;
14
+ }, resultSchema?: undefined, options?: {
15
+ signal?: AbortSignal;
16
+ timeout?: number;
17
+ }): Promise<McpCallResult>;
18
+ close(): Promise<void>;
19
+ }
20
+ export interface McpSdkDependencies {
21
+ createClient(): SdkClientLike;
22
+ createStdioTransport(options: StdioServerParameters): unknown;
23
+ createHttpTransport(url: URL, options: StreamableHTTPClientTransportOptions): unknown;
24
+ defaultEnvironment(): Record<string, string>;
25
+ }
26
+ export declare function connectSdkMcpClient(input: McpClientFactoryInput, dependencies?: McpSdkDependencies): Promise<McpClientConnection>;
27
+ export {};
@@ -0,0 +1,32 @@
1
+ import { type ModelMessage } from "../models/types.js";
2
+ import type { ScoredMemoryCandidate } from "./types.js";
3
+ export interface MemoryCoordinatorOptions {
4
+ review(taskId: string, candidates: readonly ScoredMemoryCandidate[]): void | Promise<void>;
5
+ remember(taskId: string, candidates: readonly ScoredMemoryCandidate[]): number | Promise<number>;
6
+ generate(prompt: string, signal: AbortSignal): Promise<string>;
7
+ minChars: number;
8
+ maxEntryChars: number;
9
+ scoreThreshold: number;
10
+ maxCandidates: number;
11
+ /** Candidates at or above this total score are stored directly without user review. Defaults to 11. */
12
+ autoStoreThreshold?: number;
13
+ language?: string;
14
+ }
15
+ export interface MemoryFinalizationResult {
16
+ evaluated: boolean;
17
+ candidates: boolean;
18
+ /** Number of candidates stored directly without review because they met the auto-store threshold. */
19
+ stored: number;
20
+ }
21
+ export interface ExplicitMemoryResult extends MemoryFinalizationResult {
22
+ stored: number;
23
+ }
24
+ export declare class MemoryCoordinator {
25
+ #private;
26
+ onError: ((error: unknown) => void) | undefined;
27
+ constructor(options: MemoryCoordinatorOptions);
28
+ finalize(taskId: string, messages: readonly ModelMessage[]): Promise<MemoryFinalizationResult>;
29
+ rememberExplicit(taskId: string, messages: readonly ModelMessage[]): Promise<ExplicitMemoryResult>;
30
+ flush(): Promise<void>;
31
+ abort(reason?: unknown): void;
32
+ }
@@ -0,0 +1,15 @@
1
+ import type { ModelMessage } from "../models/types.js";
2
+ import { type MemoryCandidate, type ScoredMemoryCandidate } from "./types.js";
3
+ export declare function buildMemoryExtractionPrompt(messages: readonly ModelMessage[], options?: {
4
+ explicitIntent?: boolean;
5
+ outputLanguage?: string;
6
+ maxCandidates?: number;
7
+ }): string;
8
+ export declare function parseScoredMemoryCandidates(raw: string, options: {
9
+ maxEntryChars: number;
10
+ scoreThreshold: number;
11
+ maxCandidates: number;
12
+ }): ScoredMemoryCandidate[];
13
+ export declare function parseMemoryCandidates(raw: string, options: {
14
+ maxEntryChars: number;
15
+ }): MemoryCandidate[];
@@ -0,0 +1,2 @@
1
+ /** Detects an explicit request to persist memory; it does not decide what is safe to store. */
2
+ export declare function isExplicitMemoryIntent(prompt: string): boolean;
@@ -0,0 +1,13 @@
1
+ import type { MemoryHeat, MemoryReference } from "./types.js";
2
+ export interface RankedMemoryReference {
3
+ reference: MemoryReference;
4
+ score: number;
5
+ heat: MemoryHeat;
6
+ }
7
+ export declare function classifyMemoryHeat(reference: MemoryReference, now?: Date): MemoryHeat;
8
+ export declare function rankMemoryReferences(references: readonly MemoryReference[], query: string, options: {
9
+ now?: Date;
10
+ topK: number;
11
+ maxChars: number;
12
+ minScore?: number;
13
+ }): RankedMemoryReference[];
@@ -0,0 +1,36 @@
1
+ import type { MemoryCandidate, MemoryScores, ScoredMemoryCandidate } from "./types.js";
2
+ export interface MemoryReviewItem extends MemoryCandidate {
3
+ id: string;
4
+ taskId?: string;
5
+ summary?: string;
6
+ topicKey?: string;
7
+ keywords?: string[];
8
+ scores?: MemoryScores;
9
+ }
10
+ export interface MemoryReviewBridgeOptions {
11
+ remember(candidate: MemoryReviewItem): Promise<unknown>;
12
+ onChange?(): void;
13
+ /** Called after a candidate is explicitly dismissed by the user. */
14
+ onDismiss?(): void;
15
+ /** Called after a candidate is accepted and stored. */
16
+ onAccept?(): void;
17
+ /**
18
+ * Seconds an unconfirmed candidate stays pending before it is silently
19
+ * dismissed. 0 (the default) disables the auto-dismiss timer. A timeout is
20
+ * not an explicit user dismissal and never triggers {@link onDismiss}.
21
+ */
22
+ autoDismissSeconds?: number;
23
+ }
24
+ /** Holds model-generated memory outside the durable store until the user accepts it. */
25
+ export declare class MemoryReviewBridge {
26
+ #private;
27
+ readonly autoDismissSeconds: number;
28
+ constructor(options: MemoryReviewBridgeOptions);
29
+ get pending(): readonly MemoryReviewItem[];
30
+ offer(candidates: readonly MemoryCandidate[]): number;
31
+ offer(taskId: string, candidates: readonly ScoredMemoryCandidate[]): number;
32
+ accept(id: string): Promise<boolean>;
33
+ dismiss(id: string): boolean;
34
+ dismissAll(): number;
35
+ dispose(): void;
36
+ }
@@ -0,0 +1,5 @@
1
+ export declare function normalizeForSimilarity(value: string): string;
2
+ export declare function jaccard(left: ReadonlySet<string>, right: ReadonlySet<string>): number;
3
+ export declare function wordTokens(value: string): Set<string>;
4
+ export declare function characterNgrams(value: string, size?: number): Set<string>;
5
+ export declare function memorySimilarity(left: string, right: string): number;
@@ -0,0 +1,58 @@
1
+ import { type MemoryCandidate, type MemoryEntry, type MemoryReference, type ScoredMemoryCandidate } from "./types.js";
2
+ export { MEMORY_TYPES } from "./types.js";
3
+ export type { MemoryCandidate, MemoryEntry, MemoryType } from "./types.js";
4
+ export interface MemoryStoreOptions {
5
+ workspace: string;
6
+ maxEntries: number;
7
+ maxEntryChars: number;
8
+ }
9
+ /** Cross-session state learned from how the user handles generated review candidates. */
10
+ export interface MemoryBehavior {
11
+ /** Consecutive explicit dismissals of review candidates without any acceptance. */
12
+ ignoreStreak: number;
13
+ /** Auto-extraction paused after the ignore streak reached the configured limit. */
14
+ autoExtractPaused: boolean;
15
+ }
16
+ export declare const DEFAULT_MEMORY_BEHAVIOR: MemoryBehavior;
17
+ export declare class MemoryStore {
18
+ #private;
19
+ readonly workspace: string;
20
+ readonly path: string;
21
+ constructor(options: MemoryStoreOptions);
22
+ loadBehavior(): Promise<MemoryBehavior>;
23
+ saveBehavior(behavior: MemoryBehavior): Promise<void>;
24
+ references(): Promise<MemoryReference[]>;
25
+ list(): Promise<MemoryEntry[]>;
26
+ userContext(): Promise<string | undefined>;
27
+ remember(candidate: MemoryCandidate): Promise<{
28
+ entry: MemoryEntry;
29
+ added: boolean;
30
+ }>;
31
+ rememberForTask(taskId: string, candidate: ScoredMemoryCandidate, now?: Date): Promise<{
32
+ entry: MemoryEntry;
33
+ added: boolean;
34
+ }>;
35
+ rememberMany(candidates: readonly MemoryCandidate[]): Promise<{
36
+ added: number;
37
+ skipped: number;
38
+ }>;
39
+ update(id: string, candidate: MemoryCandidate): Promise<MemoryEntry>;
40
+ delete(id: string): Promise<boolean>;
41
+ forget(query: string): Promise<number>;
42
+ recall(query: string, options: {
43
+ taskId: string;
44
+ topK: number;
45
+ maxChars: number;
46
+ now?: Date;
47
+ }): Promise<{
48
+ context?: string;
49
+ references: readonly MemoryReference[];
50
+ }>;
51
+ }
52
+ export declare function parseMemoryDocument(raw: string, maxEntryChars: number): MemoryEntry[];
53
+ /** Human-readable view used by management commands, not the V2 storage codec. */
54
+ export declare function renderMemoryDocument(entries: readonly MemoryEntry[]): string;
55
+ export declare function formatMemoryContext(entries: readonly MemoryEntry[], maxChars: number): string | undefined;
56
+ export declare function validateCandidate(candidate: MemoryCandidate, maxEntryChars: number): MemoryEntry;
57
+ export declare function normalizeMemoryContent(content: string): string;
58
+ export declare function containsSensitiveMemory(content: string): boolean;
@@ -0,0 +1,37 @@
1
+ export declare const MEMORY_TYPES: readonly ["user", "feedback", "project", "reference"];
2
+ export type MemoryType = (typeof MEMORY_TYPES)[number];
3
+ export interface MemoryCandidate {
4
+ type: MemoryType;
5
+ content: string;
6
+ }
7
+ export interface MemoryEntry extends MemoryCandidate {
8
+ id: string;
9
+ }
10
+ export interface MemoryScores {
11
+ durability: number;
12
+ futureUtility: number;
13
+ authority: number;
14
+ nonDerivability: number;
15
+ }
16
+ export interface ScoredMemoryCandidate extends MemoryCandidate {
17
+ summary: string;
18
+ topicKey: string;
19
+ keywords: string[];
20
+ scores: MemoryScores;
21
+ }
22
+ export interface MemoryReference {
23
+ id: string;
24
+ type: MemoryType;
25
+ taskId: string;
26
+ summary: string;
27
+ contentPath: string;
28
+ topicKey: string;
29
+ keywords: string[];
30
+ createdAt: string;
31
+ updatedAt: string;
32
+ recallTotal: number;
33
+ /** One timestamp per distinct recalling task. */
34
+ recalls: Record<string, string>;
35
+ relatedTo?: string[];
36
+ }
37
+ export type MemoryHeat = "hot" | "cold" | "normal";
@@ -0,0 +1,24 @@
1
+ import Anthropic from "@anthropic-ai/sdk";
2
+ import type { MessageCreateParamsStreaming, RawMessageStreamEvent } from "@anthropic-ai/sdk/resources/messages/messages.js";
3
+ import { type ModelAdapter, type ModelEvent, type ModelRequest } from "./types.js";
4
+ export interface AnthropicClient {
5
+ messages: {
6
+ create(body: MessageCreateParamsStreaming, options?: Anthropic.RequestOptions): AsyncIterable<RawMessageStreamEvent> | PromiseLike<AsyncIterable<RawMessageStreamEvent>>;
7
+ };
8
+ }
9
+ export interface AnthropicModelAdapterOptions {
10
+ apiKey?: string;
11
+ baseURL?: string;
12
+ client?: AnthropicClient;
13
+ maxOutputTokens?: number;
14
+ /** Mirror the per-request cache breakdown to stderr. Defaults to FLAVOR_DEBUG_USAGE=1. File logging to usage.jsonl is always on. */
15
+ debugUsage?: boolean;
16
+ }
17
+ export declare class AnthropicModelAdapter implements ModelAdapter {
18
+ #private;
19
+ private readonly client;
20
+ private readonly maxOutputTokens;
21
+ private readonly debugUsage;
22
+ constructor(options: AnthropicModelAdapterOptions);
23
+ stream(request: ModelRequest): AsyncIterable<ModelEvent>;
24
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Intelligent cache-capability identification for model providers.
3
+ *
4
+ * Provider protocol (`apiType`) is read from the project `.flavor/flavor.json`
5
+ * (or the PKCE token `llm_config`); combined with `baseURL` heuristics it
6
+ * decides which prompt-cache strategy applies so the runtime can surface
7
+ * accurate diagnostics instead of assuming every endpoint caches like
8
+ * Anthropic.
9
+ */
10
+ export type CacheStrategy = "explicit" | "implicit" | "none";
11
+ export interface CacheProfileInput {
12
+ apiType?: string | undefined;
13
+ baseURL?: string | undefined;
14
+ }
15
+ export interface CacheProfile {
16
+ strategy: CacheStrategy;
17
+ /** Whether client-side cache markers (cache_control breakpoints) are honored. */
18
+ markersSupported: boolean;
19
+ reason: string;
20
+ }
21
+ /** True when the baseURL points at an Alibaba Cloud DashScope / MaaS gateway. */
22
+ export declare function isDashScopeBaseURL(baseURL: string | undefined): boolean;
23
+ export declare function resolveCacheProfile(input: CacheProfileInput): CacheProfile;
@@ -0,0 +1,24 @@
1
+ import OpenAI from "openai";
2
+ import type { ResponseStreamEvent } from "openai/resources/responses/responses.js";
3
+ import { type ModelAdapter, type ModelEvent, type ModelRequest } from "./types.js";
4
+ type OpenAIStreamRequest = Parameters<OpenAI["responses"]["stream"]>[0];
5
+ export interface OpenAIClient {
6
+ responses: {
7
+ stream(body: OpenAIStreamRequest, options?: OpenAI.RequestOptions): AsyncIterable<ResponseStreamEvent>;
8
+ };
9
+ }
10
+ export interface OpenAIModelAdapterOptions {
11
+ apiKey?: string;
12
+ baseURL?: string;
13
+ client?: OpenAIClient;
14
+ /** Mirror the per-request cache breakdown to stderr. Defaults to FLAVOR_DEBUG_USAGE=1. File logging to usage.jsonl is always on. */
15
+ debugUsage?: boolean;
16
+ }
17
+ export declare class OpenAIModelAdapter implements ModelAdapter {
18
+ #private;
19
+ private readonly client;
20
+ private readonly debugUsage;
21
+ constructor(options: OpenAIModelAdapterOptions);
22
+ stream(request: ModelRequest): AsyncIterable<ModelEvent>;
23
+ }
24
+ export {};
@@ -0,0 +1,16 @@
1
+ import type { ModelAdapter } from "./types.js";
2
+ export interface ParsedModelId {
3
+ provider: string;
4
+ model: string;
5
+ }
6
+ export declare function parseModelId(id: string): ParsedModelId;
7
+ export declare class ModelRegistry {
8
+ private readonly adapters;
9
+ register(provider: string, adapter: ModelAdapter): this;
10
+ has(provider: string): boolean;
11
+ unregister(provider: string, adapter?: ModelAdapter): boolean;
12
+ get(id: string): {
13
+ adapter: ModelAdapter;
14
+ model: string;
15
+ };
16
+ }
@@ -0,0 +1,75 @@
1
+ import { z } from "zod";
2
+ import type { ModelRegistry } from "./registry.js";
3
+ import type { ModelMessage, ModelTool, ProviderError } from "./types.js";
4
+ export interface StructuredOutputRetryPolicy {
5
+ maxRetries: number;
6
+ backoffMs: readonly number[];
7
+ }
8
+ export interface StructuredOutputOptions<T> {
9
+ registry: ModelRegistry;
10
+ modelId: string;
11
+ name: string;
12
+ description: string;
13
+ schema: z.ZodType<T>;
14
+ retry?: StructuredOutputRetryPolicy;
15
+ beforeAttempt?(attempt: StructuredOutputAttempt): void | Promise<void>;
16
+ afterAttempt?(attempt: StructuredOutputAttemptResult): void | Promise<void>;
17
+ }
18
+ export interface StructuredOutputAttempt {
19
+ modelId: string;
20
+ attempt: number;
21
+ maxAttempts: number;
22
+ messageCount: number;
23
+ }
24
+ export interface StructuredOutputAttemptResult extends StructuredOutputAttempt {
25
+ completed: boolean;
26
+ error?: ProviderError;
27
+ }
28
+ export interface StructuredOutputRequest {
29
+ messages: ModelMessage[];
30
+ invalidOutput?: string;
31
+ validationError?: string;
32
+ signal?: AbortSignal;
33
+ }
34
+ export type StructuredOutputEvent<T> = {
35
+ type: "attempt-start";
36
+ attempt: number;
37
+ maxAttempts: number;
38
+ } | {
39
+ type: "attempt-end";
40
+ attempt: number;
41
+ maxAttempts: number;
42
+ } | {
43
+ type: "usage";
44
+ inputTokens: number;
45
+ outputTokens: number;
46
+ } | {
47
+ type: "retry";
48
+ attempt: number;
49
+ maxAttempts: number;
50
+ delayMs: number;
51
+ error: string;
52
+ } | {
53
+ type: "output";
54
+ value: T;
55
+ attempts: number;
56
+ };
57
+ export interface StructuredOutputResult<T> {
58
+ value: T;
59
+ usage: {
60
+ inputTokens: number;
61
+ outputTokens: number;
62
+ };
63
+ attempts: number;
64
+ }
65
+ export interface StructuredModel<T> {
66
+ stream(request: StructuredOutputRequest): AsyncIterable<StructuredOutputEvent<T>>;
67
+ invoke(request: StructuredOutputRequest): Promise<StructuredOutputResult<T>>;
68
+ }
69
+ export declare class StructuredOutputError extends Error {
70
+ readonly code: "structured_output_error";
71
+ constructor(message: string);
72
+ }
73
+ export declare function withStructuredOutput<T>(options: StructuredOutputOptions<T>): StructuredModel<T>;
74
+ export declare function strictJsonSchema(schema: z.ZodType<unknown>): Record<string, unknown>;
75
+ export declare function modelToolFromZod(name: string, description: string, schema: z.ZodType<unknown>): ModelTool;
@@ -0,0 +1,93 @@
1
+ export type ModelImageMediaType = "image/png" | "image/jpeg" | "image/webp";
2
+ export interface ModelTextContentBlock {
3
+ type: "text";
4
+ text: string;
5
+ }
6
+ export interface ModelImageContentBlock {
7
+ type: "image";
8
+ source: {
9
+ type: "file";
10
+ path: string;
11
+ };
12
+ mediaType: ModelImageMediaType;
13
+ sha256: string;
14
+ bytes: number;
15
+ name?: string | undefined;
16
+ }
17
+ export type ModelContentBlock = ModelTextContentBlock | ModelImageContentBlock;
18
+ export type ModelContent = string | ModelContentBlock[];
19
+ interface ModelMessageMetadata {
20
+ toolCallId?: string;
21
+ toolCalls?: ModelToolCall[];
22
+ /** Provider-neutral marker for the end of a byte-stable reusable prompt prefix. */
23
+ cacheBreakpoint?: boolean;
24
+ }
25
+ export type ModelMessage = (ModelMessageMetadata & {
26
+ role: "user";
27
+ content: ModelContent;
28
+ }) | (ModelMessageMetadata & {
29
+ role: "system" | "assistant" | "tool";
30
+ content: string;
31
+ });
32
+ export declare function modelContentText(content: ModelContent): string;
33
+ export declare function modelContentTranscriptText(content: ModelContent): string;
34
+ export declare function cloneModelContent(content: ModelContent): ModelContent;
35
+ export interface ModelToolCall {
36
+ id: string;
37
+ name: string;
38
+ input: unknown;
39
+ }
40
+ export interface ModelTool {
41
+ name: string;
42
+ description: string;
43
+ inputSchema: Record<string, unknown>;
44
+ strict?: boolean;
45
+ }
46
+ export interface ModelRequest {
47
+ model: string;
48
+ messages: ModelMessage[];
49
+ tools: ModelTool[];
50
+ signal?: AbortSignal;
51
+ }
52
+ export type ProviderErrorCode = "authentication" | "rate_limit" | "context_overflow" | "output_limit" | "model_not_found" | "network" | "cancelled" | "invalid_tool_arguments" | "structured_output_error" | "unknown";
53
+ export interface ProviderError {
54
+ code: ProviderErrorCode;
55
+ message: string;
56
+ }
57
+ export type ModelEvent = {
58
+ type: "text";
59
+ text: string;
60
+ } | {
61
+ type: "tool-call";
62
+ id: string;
63
+ name: string;
64
+ input: unknown;
65
+ } | {
66
+ type: "invalid-tool-call";
67
+ id: string;
68
+ name: string;
69
+ rawInput: string;
70
+ error: ProviderError;
71
+ } | {
72
+ type: "usage";
73
+ inputTokens: number;
74
+ outputTokens: number;
75
+ cacheReadTokens?: number;
76
+ cacheCreationTokens?: number;
77
+ } | {
78
+ type: "error";
79
+ error: ProviderError;
80
+ } | {
81
+ type: "done";
82
+ usage: {
83
+ inputTokens: number;
84
+ outputTokens: number;
85
+ cacheReadTokens?: number;
86
+ cacheCreationTokens?: number;
87
+ };
88
+ };
89
+ export interface ModelAdapter {
90
+ stream(request: ModelRequest): AsyncIterable<ModelEvent>;
91
+ }
92
+ export declare function normalizeProviderError(error: unknown): ProviderError;
93
+ export {};
@@ -0,0 +1,9 @@
1
+ import type { ModelRegistry } from "../models/registry.js";
2
+ import type { PermissionDecision, PermissionRequest } from "./engine.js";
3
+ export type PermissionClassifier = (request: PermissionRequest, signal: AbortSignal) => Promise<PermissionDecision>;
4
+ export interface PermissionClassifierOptions {
5
+ registry: ModelRegistry;
6
+ modelId(): string;
7
+ timeoutMs?: number;
8
+ }
9
+ export declare function createPermissionClassifier(options: PermissionClassifierOptions): PermissionClassifier;
@@ -0,0 +1,28 @@
1
+ import { type LegacyPermissionMode, type PermissionMode } from "../config/schema.js";
2
+ export type { PermissionMode } from "../config/schema.js";
3
+ export type PermissionDecision = {
4
+ decision: "allow" | "deny" | "ask";
5
+ reason?: string;
6
+ };
7
+ export interface PermissionRequest {
8
+ agent: "main" | "subagent";
9
+ tool: string;
10
+ paths?: readonly string[];
11
+ command?: string;
12
+ args?: readonly string[];
13
+ cwd?: string;
14
+ }
15
+ export interface PermissionEngineOptions {
16
+ workspace: string;
17
+ mode?: PermissionMode | LegacyPermissionMode;
18
+ }
19
+ export type ToolCategory = "control" | "read" | "write" | "destructive" | "shell" | "network" | "unknown";
20
+ export declare function getToolCategory(name: string): ToolCategory;
21
+ export declare function isDestructiveTool(name: string): boolean;
22
+ export declare class PermissionEngine {
23
+ #private;
24
+ constructor(options: PermissionEngineOptions);
25
+ get mode(): PermissionMode;
26
+ setMode(mode: PermissionMode | LegacyPermissionMode): void;
27
+ decide(request: PermissionRequest): PermissionDecision;
28
+ }
@@ -0,0 +1,15 @@
1
+ import type { LoadedPlugin, PluginDiagnostic, PluginHostOptions } from "./types.js";
2
+ /**
3
+ * Hosts trusted in-process plugins behind a narrow host API. Plugin roots must remain immutable
4
+ * during activation. Concurrent malicious mutation is outside the MVP trust model because plugin
5
+ * code already has Node.js authority; this is explicitly not a process sandbox.
6
+ */
7
+ export declare class PluginHost {
8
+ #private;
9
+ constructor(options: PluginHostOptions);
10
+ get diagnostics(): readonly PluginDiagnostic[];
11
+ get loadedPlugins(): readonly LoadedPlugin[];
12
+ loadAll(): Promise<void>;
13
+ unloadAll(): Promise<void>;
14
+ unload(name: string): Promise<void>;
15
+ }