@justin06lee/yagami 0.5.0 → 0.6.0
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/README.md +27 -0
- package/dist/{chunk-GPX47OIO.js → chunk-D2PNH6GV.js} +2 -2
- package/dist/{chunk-2UG5CR5X.js → chunk-ZYHC7PXX.js} +615 -8
- package/dist/chunk-ZYHC7PXX.js.map +1 -0
- package/dist/cli.js +2 -2
- package/dist/{hostConfig-Bzr9JB8R.d.ts → hostConfig-HmZ3z297.d.ts} +95 -2
- package/dist/index.d.ts +11 -4
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-2UG5CR5X.js.map +0 -1
- /package/dist/{chunk-GPX47OIO.js.map → chunk-D2PNH6GV.js.map} +0 -0
|
@@ -165,6 +165,92 @@ interface ModelRef {
|
|
|
165
165
|
*/
|
|
166
166
|
declare function parseModelRef(model: string | undefined, providerIds: Iterable<string>): ModelRef;
|
|
167
167
|
declare function qualifiedModel(providerId: string, model: string): string;
|
|
168
|
+
type SessionPermissionDecision = "allow" | "allow_always" | "deny" | "deny_always";
|
|
169
|
+
/** A harness asking the host whether a tool may run. */
|
|
170
|
+
interface SessionPermissionRequest {
|
|
171
|
+
provider: string;
|
|
172
|
+
sessionId?: string;
|
|
173
|
+
/** Tool name as the harness calls it (e.g. "Bash", "Edit", or an ACP title). */
|
|
174
|
+
tool: string;
|
|
175
|
+
/** Coarse category when known: read | edit | delete | execute | fetch | other … */
|
|
176
|
+
kind?: string;
|
|
177
|
+
title?: string;
|
|
178
|
+
input?: unknown;
|
|
179
|
+
/** Provider-native payload for hosts that want to go deep. */
|
|
180
|
+
raw?: unknown;
|
|
181
|
+
}
|
|
182
|
+
interface SessionPermissionHandler {
|
|
183
|
+
decide(req: SessionPermissionRequest, signal?: AbortSignal): Promise<SessionPermissionDecision>;
|
|
184
|
+
}
|
|
185
|
+
type AgentEvent = {
|
|
186
|
+
type: "session";
|
|
187
|
+
sessionId: string;
|
|
188
|
+
} | {
|
|
189
|
+
type: "text";
|
|
190
|
+
text: string;
|
|
191
|
+
} | {
|
|
192
|
+
type: "thinking";
|
|
193
|
+
text: string;
|
|
194
|
+
} | {
|
|
195
|
+
type: "tool_call";
|
|
196
|
+
id: string;
|
|
197
|
+
name: string;
|
|
198
|
+
status: "started" | "updated" | "completed" | "failed";
|
|
199
|
+
title?: string;
|
|
200
|
+
kind?: string;
|
|
201
|
+
input?: unknown;
|
|
202
|
+
output?: unknown;
|
|
203
|
+
} | {
|
|
204
|
+
type: "permission";
|
|
205
|
+
request: SessionPermissionRequest;
|
|
206
|
+
decision: SessionPermissionDecision;
|
|
207
|
+
} | {
|
|
208
|
+
type: "done";
|
|
209
|
+
usage?: Usage;
|
|
210
|
+
costUsd?: number;
|
|
211
|
+
stopReason?: string;
|
|
212
|
+
}
|
|
213
|
+
/** Anything the harness said that has no normalized shape. */
|
|
214
|
+
| {
|
|
215
|
+
type: "raw";
|
|
216
|
+
provider: string;
|
|
217
|
+
payload: unknown;
|
|
218
|
+
};
|
|
219
|
+
interface ProviderSessionOptions {
|
|
220
|
+
/** Project directory the agent works in. */
|
|
221
|
+
cwd: string;
|
|
222
|
+
model?: string;
|
|
223
|
+
/** Provider session id to continue. */
|
|
224
|
+
resume?: string;
|
|
225
|
+
/**
|
|
226
|
+
* "terminal" loads the same settings the interactive CLI would — user and
|
|
227
|
+
* project config, CLAUDE.md, skills, hooks, MCP servers. "isolated" loads
|
|
228
|
+
* none of it. Default "terminal", because that is the promise.
|
|
229
|
+
*/
|
|
230
|
+
parity?: "terminal" | "isolated";
|
|
231
|
+
permissions: SessionPermissionHandler;
|
|
232
|
+
appName?: string;
|
|
233
|
+
effort?: string;
|
|
234
|
+
thinking?: ThinkingParam;
|
|
235
|
+
/** Override the harness's interactive system prompt. */
|
|
236
|
+
systemPrompt?: string;
|
|
237
|
+
/** Provider-specific escape hatch (Claude: Agent SDK Options; Codex: { sandbox }; ACP: { mode }). */
|
|
238
|
+
native?: Record<string, unknown>;
|
|
239
|
+
}
|
|
240
|
+
/** One live conversation with a harness: send turns, get normalized events. */
|
|
241
|
+
interface ProviderSession {
|
|
242
|
+
readonly provider: string;
|
|
243
|
+
/** Provider session id once known (use it to resume later). */
|
|
244
|
+
readonly id: string | undefined;
|
|
245
|
+
send(input: string | ContentBlockParam[]): AsyncGenerator<AgentEvent, void, undefined>;
|
|
246
|
+
interrupt(): Promise<void>;
|
|
247
|
+
close(): Promise<void>;
|
|
248
|
+
}
|
|
249
|
+
/** Providers that can host agentic sessions implement this too. */
|
|
250
|
+
interface SessionProvider extends Provider {
|
|
251
|
+
openSession(options: ProviderSessionOptions): ProviderSession;
|
|
252
|
+
}
|
|
253
|
+
declare function isSessionProvider(p: Provider): p is SessionProvider;
|
|
168
254
|
|
|
169
255
|
type CodexSandboxMode = "read-only" | "workspace-write" | "danger-full-access";
|
|
170
256
|
interface CodexProviderOptions {
|
|
@@ -177,7 +263,7 @@ interface CodexProviderOptions {
|
|
|
177
263
|
env?: Record<string, string>;
|
|
178
264
|
}
|
|
179
265
|
/** OpenAI Codex CLI via `codex exec --json`, signed in with the user's ChatGPT account. */
|
|
180
|
-
declare class CodexProvider implements
|
|
266
|
+
declare class CodexProvider implements SessionProvider {
|
|
181
267
|
readonly id = "codex";
|
|
182
268
|
readonly label = "Codex CLI";
|
|
183
269
|
readonly executable: string;
|
|
@@ -190,6 +276,13 @@ declare class CodexProvider implements Provider {
|
|
|
190
276
|
/** Build the `codex exec` argument list for a turn (exported for tests). */
|
|
191
277
|
buildArgs(req: TurnRequest, imagePaths: string[]): string[];
|
|
192
278
|
run(req: TurnRequest): AsyncGenerator<TurnEvent, void, undefined>;
|
|
279
|
+
/**
|
|
280
|
+
* A live, interactive Codex session (`codex app-server` — the TUI's own
|
|
281
|
+
* engine): streamed tool events, the user's config.toml verbatim, and
|
|
282
|
+
* approval requests forwarded to the host's permission handler. The
|
|
283
|
+
* completion-turn `run()` path above stays for API-style callers.
|
|
284
|
+
*/
|
|
285
|
+
openSession(options: ProviderSessionOptions): ProviderSession;
|
|
193
286
|
/** Ask the app-server protocol for the model catalog (no tokens spent). */
|
|
194
287
|
listModels(): Promise<EngineModel[]>;
|
|
195
288
|
version(): Promise<string | undefined>;
|
|
@@ -397,4 +490,4 @@ interface HostEngineConfig {
|
|
|
397
490
|
}
|
|
398
491
|
declare function loadHostEngineConfig(): HostEngineConfig;
|
|
399
492
|
|
|
400
|
-
export { ApiError as A,
|
|
493
|
+
export { ApiError as A, type StreamResultInfo as B, CodexProvider as C, type DetectedProvider as D, type EngineModel as E, type StreamStart as F, type SystemParam as G, type HostEngineConfig as H, createProvider as I, detectProviders as J, isSessionProvider as K, type LoadedProviders as L, type MessagesRequest as M, loadHostEngineConfig as N, loadProviders as O, type Provider as P, parseModelRef as Q, presetFor as R, type SseEvent as S, type TurnRequest as T, type Usage as U, qualifiedModel as V, yagamiConfigDir as W, YagamiEngine as Y, type MessagesResponse as a, type EngineOptions as b, type ProviderCapabilities as c, type TurnEvent as d, type SessionProvider as e, type ProviderSessionOptions as f, type ProviderSession as g, type AgentEvent as h, type ApiErrorType as i, type CodexProviderOptions as j, type CodexSandboxMode as k, type CompleteResult as l, type ContentBlock as m, type ContentBlockParam as n, type MessageParam as o, type ModelRef as p, PROVIDER_PRESETS as q, type ProviderConfigEntry as r, type ProviderKind as s, type ProviderPreset as t, SessionCache as u, type SessionCacheOptions as v, type SessionPermissionDecision as w, type SessionPermissionHandler as x, type SessionPermissionRequest as y, type StreamOptions as z };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { S as SseEvent, M as MessagesRequest, E as EngineModel, A as ApiError, a as MessagesResponse, Y as YagamiEngine, b as EngineOptions, P as Provider, c as ProviderCapabilities, T as TurnRequest, d as TurnEvent } from './hostConfig-
|
|
2
|
-
export {
|
|
1
|
+
import { S as SseEvent, M as MessagesRequest, E as EngineModel, A as ApiError, a as MessagesResponse, Y as YagamiEngine, b as EngineOptions, P as Provider, c as ProviderCapabilities, T as TurnRequest, d as TurnEvent, e as SessionProvider, f as ProviderSessionOptions, g as ProviderSession } from './hostConfig-HmZ3z297.js';
|
|
2
|
+
export { h as AgentEvent, i as ApiErrorType, C as CodexProvider, j as CodexProviderOptions, k as CodexSandboxMode, l as CompleteResult, m as ContentBlock, n as ContentBlockParam, D as DetectedProvider, H as HostEngineConfig, L as LoadedProviders, o as MessageParam, p as ModelRef, q as PROVIDER_PRESETS, r as ProviderConfigEntry, s as ProviderKind, t as ProviderPreset, u as SessionCache, v as SessionCacheOptions, w as SessionPermissionDecision, x as SessionPermissionHandler, y as SessionPermissionRequest, z as StreamOptions, B as StreamResultInfo, F as StreamStart, G as SystemParam, U as Usage, I as createProvider, J as detectProviders, K as isSessionProvider, N as loadHostEngineConfig, O as loadProviders, Q as parseModelRef, R as presetFor, V as qualifiedModel, W as yagamiConfigDir } from './hostConfig-HmZ3z297.js';
|
|
3
3
|
import { Options, SDKUserMessage, Query, SettingSource, PermissionUpdate, CanUseTool, PermissionResult, SDKMessage } from '@anthropic-ai/claude-agent-sdk';
|
|
4
4
|
export { Options as AgentOptions, CanUseTool, PermissionMode, Query, SDKMessage, SDKUserMessage } from '@anthropic-ai/claude-agent-sdk';
|
|
5
5
|
import { ClientSideConnection, InitializeResponse, SessionNotification, RequestPermissionRequest, RequestPermissionResponse } from '@agentclientprotocol/sdk';
|
|
@@ -471,7 +471,7 @@ interface AcpProviderOptions {
|
|
|
471
471
|
* Gemini CLI, Copilot, Cursor, Qwen Code, Kimi, Goose, and anything in the
|
|
472
472
|
* ACP registry. One adapter, many harnesses.
|
|
473
473
|
*/
|
|
474
|
-
declare class AcpProvider implements
|
|
474
|
+
declare class AcpProvider implements SessionProvider {
|
|
475
475
|
readonly id: string;
|
|
476
476
|
readonly label: string;
|
|
477
477
|
readonly executable: string;
|
|
@@ -487,6 +487,13 @@ declare class AcpProvider implements Provider {
|
|
|
487
487
|
private spawnConnection;
|
|
488
488
|
private classify;
|
|
489
489
|
run(req: TurnRequest): AsyncGenerator<TurnEvent, void, undefined>;
|
|
490
|
+
/**
|
|
491
|
+
* A live, interactive ACP session: the agent runs warm in the project
|
|
492
|
+
* directory with ITS OWN defaults — no plan-mode hardening, no forced
|
|
493
|
+
* config. Tool calls stream as normalized events and permission requests
|
|
494
|
+
* go to the host's handler, exactly as the agent's own client would ask.
|
|
495
|
+
*/
|
|
496
|
+
openSession(options: ProviderSessionOptions): ProviderSession;
|
|
490
497
|
private selectModel;
|
|
491
498
|
listModels(): Promise<EngineModel[]>;
|
|
492
499
|
/**
|
|
@@ -520,4 +527,4 @@ declare function resolveClaudeExecutable(explicit?: string): string;
|
|
|
520
527
|
|
|
521
528
|
declare const VERSION = "0.5.0";
|
|
522
529
|
|
|
523
|
-
export { type AcpConnection, AcpProvider, type AcpProviderOptions, AgentSession, type AgentSessionOptions, ApiError, AuthRequiredError, ChatChunkTranslator, type ChatCompletion, type ChatCompletionChunk, type ChatCompletionsRequest, type ChatMessageParam, ClaudeProvider, type ClaudeProviderOptions, type ClaudeSessionOptions, EngineModel, EngineOptions, type MessageStreamEvent, MessagesRequest, MessagesResponse, type OpenAiUsage, type Parity, PermissionAdapter, type PermissionAdapterOptions, type PermissionDecision, type PermissionHandler, type PermissionRequest, Provider, ProviderCapabilities, ProviderError, ProviderNotInstalledError, SseEvent, type TranslatedChatRequest, TurnEvent, TurnRequest, VERSION, type VersionSkew, Yagami, type YagamiChatCompletions, YagamiEngine, YagamiError, type YagamiMessages, type YagamiOptions, chatToMessagesRequest, claudeCodeSession, findExecutable, modelListBody, openAiErrorBody, resolveClaudeExecutable, resolveExecutable, settingSourcesFor, startAgentSession, toApiError, toChatCompletion };
|
|
530
|
+
export { type AcpConnection, AcpProvider, type AcpProviderOptions, AgentSession, type AgentSessionOptions, ApiError, AuthRequiredError, ChatChunkTranslator, type ChatCompletion, type ChatCompletionChunk, type ChatCompletionsRequest, type ChatMessageParam, ClaudeProvider, type ClaudeProviderOptions, type ClaudeSessionOptions, EngineModel, EngineOptions, type MessageStreamEvent, MessagesRequest, MessagesResponse, type OpenAiUsage, type Parity, PermissionAdapter, type PermissionAdapterOptions, type PermissionDecision, type PermissionHandler, type PermissionRequest, Provider, ProviderCapabilities, ProviderError, ProviderNotInstalledError, ProviderSession, ProviderSessionOptions, SessionProvider, SseEvent, type TranslatedChatRequest, TurnEvent, TurnRequest, VERSION, type VersionSkew, Yagami, type YagamiChatCompletions, YagamiEngine, YagamiError, type YagamiMessages, type YagamiOptions, chatToMessagesRequest, claudeCodeSession, findExecutable, modelListBody, openAiErrorBody, resolveClaudeExecutable, resolveExecutable, settingSourcesFor, startAgentSession, toApiError, toChatCompletion };
|
package/dist/index.js
CHANGED
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
createProvider,
|
|
19
19
|
detectProviders,
|
|
20
20
|
findExecutable,
|
|
21
|
+
isSessionProvider,
|
|
21
22
|
loadHostEngineConfig,
|
|
22
23
|
loadProviders,
|
|
23
24
|
modelListBody,
|
|
@@ -30,7 +31,7 @@ import {
|
|
|
30
31
|
toApiError,
|
|
31
32
|
toChatCompletion,
|
|
32
33
|
yagamiConfigDir
|
|
33
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-ZYHC7PXX.js";
|
|
34
35
|
|
|
35
36
|
// src/core/client.ts
|
|
36
37
|
var Yagami = class {
|
|
@@ -315,6 +316,7 @@ export {
|
|
|
315
316
|
createProvider,
|
|
316
317
|
detectProviders,
|
|
317
318
|
findExecutable,
|
|
319
|
+
isSessionProvider,
|
|
318
320
|
loadHostEngineConfig,
|
|
319
321
|
loadProviders,
|
|
320
322
|
modelListBody,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/client.ts","../src/core/session.ts","../src/core/agentSession.ts","../src/core/parity.ts","../src/core/permission.ts"],"sourcesContent":["/**\n * `Yagami` — the zero-config library client. `new Yagami()` needs no URL and\n * no API key: it finds the coding-agent CLIs already installed and signed in\n * on this machine (the same T3-Code trick the server does) and mirrors the\n * Anthropic and OpenAI SDK surfaces on top of them, so an app written\n * against either SDK shape drops in with nothing to configure.\n *\n * By default it also reads the host's yagami config\n * (~/.config/yagami/config.json), so an embedded client and the `yagami`\n * binary on the same machine agree on providers, paths, and defaults.\n */\n\nimport { YagamiEngine, type EngineOptions } from \"./engine.js\";\nimport { loadHostEngineConfig } from \"./hostConfig.js\";\nimport { ApiError, type MessagesRequest, type MessagesResponse } from \"./types.js\";\nimport type { EngineModel } from \"./models.js\";\nimport {\n ChatChunkTranslator,\n chatToMessagesRequest,\n modelListBody,\n toChatCompletion,\n type ChatCompletion,\n type ChatCompletionChunk,\n type ChatCompletionsRequest,\n} from \"./openai.js\";\n\nexport interface YagamiOptions extends EngineOptions {\n /**\n * Merge the host machine's yagami config (providers, defaults) under any\n * explicit options, so library and binary stay in sync. Default true;\n * ignored when explicit `providers` instances are passed.\n */\n syncHostConfig?: boolean;\n}\n\n/** An Anthropic stream event's payload (`message_start`, `content_block_delta`, …). */\nexport interface MessageStreamEvent {\n type: string;\n [key: string]: unknown;\n}\n\nexport interface YagamiMessages {\n /** Anthropic-SDK-shaped: non-stream resolves to the message; `stream: true` yields stream events. */\n create(req: MessagesRequest & { stream: true }): AsyncGenerator<MessageStreamEvent, void, undefined>;\n create(req: MessagesRequest & { stream?: false | undefined }): Promise<MessagesResponse>;\n /** Always-streaming variant (the SDK's `messages.stream`). */\n stream(req: MessagesRequest): AsyncGenerator<MessageStreamEvent, void, undefined>;\n}\n\nexport interface YagamiChatCompletions {\n /** OpenAI-SDK-shaped: non-stream resolves to a chat.completion; `stream: true` yields chunks. */\n create(req: ChatCompletionsRequest & { stream: true }): AsyncGenerator<ChatCompletionChunk, void, undefined>;\n create(req: ChatCompletionsRequest & { stream?: false | undefined }): Promise<ChatCompletion>;\n}\n\nexport class Yagami {\n /** The underlying engine, for anything beyond the SDK-shaped surface. */\n readonly engine: YagamiEngine;\n\n constructor(options: YagamiOptions = {}) {\n const { syncHostConfig, ...engineOptions } = options;\n const host = syncHostConfig === false || engineOptions.providers ? {} : loadHostEngineConfig();\n this.engine = new YagamiEngine({ ...host, ...definedProps(engineOptions) });\n }\n\n readonly messages: YagamiMessages = (() => {\n const streamEvents = (req: MessagesRequest) => this.streamMessageEvents(req);\n const complete = async (req: MessagesRequest) => (await this.engine.complete(req)).response;\n function create(req: MessagesRequest & { stream: true }): AsyncGenerator<MessageStreamEvent, void, undefined>;\n function create(req: MessagesRequest & { stream?: false | undefined }): Promise<MessagesResponse>;\n function create(req: MessagesRequest): unknown {\n return req.stream === true ? streamEvents(req) : complete(req);\n }\n return { create, stream: streamEvents };\n })();\n\n readonly chat: { completions: YagamiChatCompletions } = (() => {\n const streamChunks = (req: ChatCompletionsRequest) => this.streamChatChunks(req);\n const complete = async (req: ChatCompletionsRequest) => {\n const { req: translated } = chatToMessagesRequest(req);\n return toChatCompletion((await this.engine.complete(translated)).response);\n };\n function create(req: ChatCompletionsRequest & { stream: true }): AsyncGenerator<ChatCompletionChunk, void, undefined>;\n function create(req: ChatCompletionsRequest & { stream?: false | undefined }): Promise<ChatCompletion>;\n function create(req: ChatCompletionsRequest): unknown {\n return req.stream === true ? streamChunks(req) : complete(req);\n }\n return { completions: { create } };\n })();\n\n readonly models = {\n /** Both SDK shapes at once (Anthropic + OpenAI model-list fields). */\n list: async (): Promise<ReturnType<typeof modelListBody>> => modelListBody(await this.engine.listModels()),\n /** The engine's raw model list. */\n raw: (): Promise<EngineModel[]> => this.engine.listModels(),\n };\n\n private async *streamMessageEvents(req: MessagesRequest): AsyncGenerator<MessageStreamEvent, void, undefined> {\n const { events } = this.engine.stream(req);\n for await (const ev of events) {\n if (ev.event === \"error\") throw errorFromEvent(ev.data);\n yield ev.data as MessageStreamEvent;\n }\n }\n\n private async *streamChatChunks(req: ChatCompletionsRequest): AsyncGenerator<ChatCompletionChunk, void, undefined> {\n const { req: translated, includeUsage } = chatToMessagesRequest({ ...req, stream: true });\n const translator = new ChatChunkTranslator(includeUsage);\n const { events } = this.engine.stream(translated);\n for await (const ev of events) {\n if (ev.event === \"error\") throw errorFromEvent(ev.data);\n for (const chunk of translator.push(ev)) yield chunk as ChatCompletionChunk;\n }\n }\n}\n\nfunction errorFromEvent(data: unknown): ApiError {\n const error = (data as { error?: { type?: string; message?: string } } | undefined)?.error;\n return new ApiError(500, (error?.type as ApiError[\"type\"]) ?? \"api_error\", error?.message ?? \"stream error\");\n}\n\nfunction definedProps<T extends object>(obj: T): Partial<T> {\n return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as Partial<T>;\n}\n","import {\n query,\n type Options,\n type Query,\n type SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport { resolveClaudeExecutable } from \"./executable.js\";\n\nexport interface ClaudeSessionOptions {\n /** Path to the `claude` binary. Auto-resolved when omitted. */\n claudePath?: string;\n /** Agent SDK options; merged over yagami's defaults. */\n options?: Options;\n}\n\n/**\n * Full agentic Claude Code session (tools, permissions, plan mode — the\n * works), backed by the user's installed, signed-in CLI. This is the\n * embeddable \"what T3 Code does\" primitive for building UIs on top of\n * Claude Code: unlike the Messages-API engine, nothing is restricted here.\n *\n * Defaults to the `claude_code` system prompt preset so behavior matches the\n * interactive CLI; pass `options.systemPrompt` to override.\n */\nexport function claudeCodeSession(\n prompt: string | AsyncIterable<SDKUserMessage>,\n sessionOptions: ClaudeSessionOptions = {},\n): Query {\n const claudePath = resolveClaudeExecutable(\n sessionOptions.claudePath ?? sessionOptions.options?.pathToClaudeCodeExecutable,\n );\n return query({\n prompt,\n options: {\n systemPrompt: { type: \"preset\", preset: \"claude_code\" },\n ...sessionOptions.options,\n pathToClaudeCodeExecutable: claudePath,\n },\n });\n}\n\nexport type {\n Options as AgentOptions,\n Query,\n SDKMessage,\n SDKUserMessage,\n PermissionMode,\n CanUseTool,\n} from \"@anthropic-ai/claude-agent-sdk\";\n","import {\n query,\n type Options,\n type Query,\n type SDKMessage,\n type SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport { resolveClaudeExecutable } from \"./executable.js\";\nimport { classifyProviderFailure } from \"./errors.js\";\nimport { settingSourcesFor, type Parity } from \"./parity.js\";\nimport { PermissionAdapter, type PermissionHandler, type PermissionAdapterOptions } from \"./permission.js\";\nimport { AsyncQueue } from \"./providers/queue.js\";\nimport { VERSION } from \"../version.js\";\n\nexport interface AgentSessionOptions {\n /** Path to the `claude` binary. Auto-resolved when omitted. */\n claudePath?: string;\n /** Project directory the agent works in. */\n cwd?: string;\n /** How closely to mirror the interactive terminal (default \"terminal\"). */\n parity?: Parity;\n /** Model id/alias; the CLI default when omitted. */\n model?: string;\n /** Host permission callback (see {@link PermissionAdapter}). */\n onPermission?: PermissionHandler;\n /** Options for the permission adapter (fallback, auto-allow/deny). */\n permission?: PermissionAdapterOptions;\n /** Reported to the CLI as the client application (e.g. your app name). */\n appName?: string;\n /** Extra Agent SDK options, merged last (wins over the above). */\n options?: Options;\n}\n\n/**\n * A long-lived, agentic Claude Code session for building a UI on top of the\n * CLI — the ruri use case. It keeps one warm process across turns (so only\n * the first turn pays cold-start), threads permission decisions to a host\n * callback, mirrors your terminal settings by default, and exposes the\n * lifecycle the interactive CLI gives you for free: send, interrupt, resume,\n * change model/permission mode, close.\n *\n * Everything the model produces is an {@link SDKMessage} you render yourself.\n */\nexport class AgentSession implements AsyncIterable<SDKMessage> {\n readonly permissions: PermissionAdapter;\n private readonly claudePath: string;\n private readonly appName: string;\n private readonly baseOptions: Options;\n private readonly input = new AsyncQueue<SDKUserMessage>();\n private query: Query | undefined;\n private started = false;\n private closed = false;\n private currentSessionId: string | undefined;\n\n constructor(options: AgentSessionOptions = {}) {\n this.claudePath = resolveClaudeExecutable(options.claudePath ?? options.options?.pathToClaudeCodeExecutable);\n this.appName = options.appName ?? \"yagami\";\n this.permissions = new PermissionAdapter(options.permission ?? {});\n if (options.onPermission) this.permissions.setHandler(options.onPermission);\n this.baseOptions = {\n systemPrompt: { type: \"preset\", preset: \"claude_code\" },\n settingSources: settingSourcesFor(options.parity ?? \"terminal\"),\n includePartialMessages: true,\n ...(options.cwd ? { cwd: options.cwd } : {}),\n ...(options.model ? { model: options.model } : {}),\n ...options.options,\n canUseTool: options.options?.canUseTool ?? this.permissions.canUseTool,\n pathToClaudeCodeExecutable: this.claudePath,\n env: {\n ...process.env,\n CLAUDE_AGENT_SDK_CLIENT_APP: `${this.appName}/${VERSION}`,\n ...options.options?.env,\n },\n };\n }\n\n /** Set (or clear) the host permission callback after construction. */\n setPermissionHandler(handler: PermissionHandler | undefined): void {\n this.permissions.setHandler(handler);\n }\n\n /** The live Claude Code session id, once the first turn has started. */\n get sessionId(): string | undefined {\n return this.currentSessionId;\n }\n\n /** Queue a user turn. The process starts on the first send and stays warm. */\n send(text: string, options: { images?: Array<{ data: string; mediaType?: string }> } = {}): void {\n if (this.closed) throw new Error(\"session is closed\");\n const content =\n options.images && options.images.length > 0\n ? [\n ...options.images.map((img) => ({ type: \"image\" as const, source: { type: \"base64\" as const, media_type: img.mediaType ?? \"image/png\", data: img.data } })),\n { type: \"text\" as const, text },\n ]\n : text;\n this.input.push({\n type: \"user\",\n message: { role: \"user\", content } as SDKUserMessage[\"message\"],\n parent_tool_use_id: null,\n session_id: this.currentSessionId ?? \"\",\n } as SDKUserMessage);\n this.ensureStarted();\n }\n\n private ensureStarted(): void {\n if (this.started) return;\n this.started = true;\n this.query = query({ prompt: this.input, options: this.baseOptions });\n }\n\n /** Iterate every SDK message the agent produces across all turns. */\n async *[Symbol.asyncIterator](): AsyncIterator<SDKMessage> {\n this.ensureStarted();\n try {\n for await (const msg of this.query!) {\n if (msg.type === \"system\" && msg.subtype === \"init\") this.currentSessionId = msg.session_id;\n else if (msg.type === \"result\") this.currentSessionId = msg.session_id;\n yield msg;\n }\n } catch (err) {\n throw classifyProviderFailure(\"claude\", \"claude (then /login)\", err);\n }\n }\n\n /** Interrupt the in-flight turn (the CLI's Esc/Ctrl-C). */\n async interrupt(): Promise<void> {\n await this.query?.interrupt();\n }\n\n /** Switch models mid-session (the CLI's /model). */\n async setModel(model: string): Promise<void> {\n await this.query?.setModel(model);\n }\n\n /** Switch permission mode mid-session (default/acceptEdits/plan/bypassPermissions). */\n async setPermissionMode(mode: \"default\" | \"acceptEdits\" | \"plan\" | \"bypassPermissions\"): Promise<void> {\n await this.query?.setPermissionMode(mode);\n }\n\n /** Models the CLI reports as available (for a picker). */\n async supportedModels(): Promise<Array<{ value: string; displayName: string }>> {\n this.ensureStarted();\n const models = await this.query!.supportedModels();\n return models.map((m) => ({ value: m.value, displayName: m.displayName }));\n }\n\n /** End the session and tear down the process. */\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.input.end();\n this.query?.close();\n }\n}\n\n/**\n * Convenience: start an {@link AgentSession} and immediately send one turn.\n * Returns the session so callers can iterate it, interrupt, or send more.\n */\nexport function startAgentSession(prompt: string, options: AgentSessionOptions = {}): AgentSession {\n const session = new AgentSession(options);\n session.send(prompt);\n return session;\n}\n","import type { SettingSource } from \"@anthropic-ai/claude-agent-sdk\";\n\n/**\n * How closely an embedded session should mirror the interactive `claude`\n * terminal. This resolves the single most common surprise in library mode:\n * the Agent SDK loads none of your settings by default.\n *\n * - `\"terminal\"` — behave like your CLI: load user + project + local\n * settings, so CLAUDE.md, skills, hooks, and .mcp.json all apply.\n * - `\"isolated\"` — load nothing (the raw SDK default); the app supplies\n * everything explicitly. Best when the session must be reproducible or\n * must not pick up the developer's personal config.\n * - `\"project\"` — load project + local settings but not the user's global\n * ones: shared repo config without personal CLAUDE.md/skills.\n */\nexport type Parity = \"terminal\" | \"project\" | \"isolated\";\n\nconst SETTING_SOURCES: Record<Parity, SettingSource[]> = {\n terminal: [\"user\", \"project\", \"local\"],\n project: [\"project\", \"local\"],\n isolated: [],\n};\n\n/** The `settingSources` a parity level maps to. */\nexport function settingSourcesFor(parity: Parity): SettingSource[] {\n return [...SETTING_SOURCES[parity]];\n}\n","import type {\n CanUseTool,\n PermissionResult,\n PermissionUpdate,\n} from \"@anthropic-ai/claude-agent-sdk\";\n\n/** A tool-use request handed to the host for a decision. */\nexport interface PermissionRequest {\n toolName: string;\n input: Record<string, unknown>;\n signal: AbortSignal;\n /**\n * Suggested permission updates the host can echo back to stop being asked\n * again this session (e.g. behind an \"always allow\" button).\n */\n suggestions?: PermissionUpdate[];\n}\n\n/**\n * The host's answer. `allow` optionally rewrites the tool input and/or\n * persists permission updates for the rest of the session; `deny` carries a\n * message the model sees and can optionally interrupt the turn.\n */\nexport type PermissionDecision =\n | { behavior: \"allow\"; updatedInput?: Record<string, unknown>; updatedPermissions?: PermissionUpdate[] }\n | { behavior: \"deny\"; message?: string; interrupt?: boolean };\n\n/** What the app implements: show UI, return a decision. */\nexport type PermissionHandler = (req: PermissionRequest) => PermissionDecision | Promise<PermissionDecision>;\n\nexport interface PermissionAdapterOptions {\n /**\n * Decision used when no handler is set, a handler throws, or the request is\n * aborted. Defaults to denying — the safe choice for an unattended host.\n */\n fallback?: \"allow\" | \"deny\";\n /** Tool names to auto-allow without ever calling the handler. */\n autoAllow?: Iterable<string>;\n /** Tool names to auto-deny without ever calling the handler. */\n autoDeny?: Iterable<string>;\n}\n\n/**\n * Turns a host-supplied {@link PermissionHandler} into the Agent SDK's\n * {@link CanUseTool} callback, owning the state machine so the app only has\n * to answer one question: allow or deny this tool call?\n *\n * The policy (what to auto-approve) stays with the app — yagami never bakes\n * in a permissive default. Without a handler, everything falls back (deny by\n * default), so a session is safe before the UI is wired up.\n */\nexport class PermissionAdapter {\n private handler: PermissionHandler | undefined;\n private readonly fallback: \"allow\" | \"deny\";\n private readonly autoAllow: Set<string>;\n private readonly autoDeny: Set<string>;\n\n constructor(options: PermissionAdapterOptions = {}) {\n this.fallback = options.fallback ?? \"deny\";\n this.autoAllow = new Set(options.autoAllow ?? []);\n this.autoDeny = new Set(options.autoDeny ?? []);\n }\n\n /** Install (or replace) the host decision callback. */\n setHandler(handler: PermissionHandler | undefined): void {\n this.handler = handler;\n }\n\n allowTool(toolName: string): void {\n this.autoDeny.delete(toolName);\n this.autoAllow.add(toolName);\n }\n\n denyTool(toolName: string): void {\n this.autoAllow.delete(toolName);\n this.autoDeny.add(toolName);\n }\n\n private fallbackResult(reason: string): PermissionResult {\n return this.fallback === \"allow\"\n ? { behavior: \"allow\", updatedInput: {} }\n : { behavior: \"deny\", message: reason };\n }\n\n /**\n * The callback to hand to `claudeCodeSession`/the Agent SDK. Typed to\n * always resolve (never null), and assignable to the SDK's CanUseTool.\n */\n readonly canUseTool: (\n ...args: Parameters<CanUseTool>\n ) => Promise<PermissionResult> = async (toolName, input, options) => {\n if (this.autoDeny.has(toolName)) {\n return { behavior: \"deny\", message: `tool \"${toolName}\" is disabled for this session` };\n }\n if (this.autoAllow.has(toolName)) {\n return { behavior: \"allow\", updatedInput: input };\n }\n if (!this.handler) return this.fallbackResult(`no permission handler is set; denying \"${toolName}\"`);\n if (options.signal.aborted) return this.fallbackResult(\"request aborted\");\n\n let decision: PermissionDecision;\n try {\n decision = await this.handler({\n toolName,\n input,\n signal: options.signal,\n ...(options.suggestions ? { suggestions: options.suggestions } : {}),\n });\n } catch (err) {\n return this.fallbackResult(`permission handler threw: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n if (decision.behavior === \"allow\") {\n return {\n behavior: \"allow\",\n updatedInput: decision.updatedInput ?? input,\n ...(decision.updatedPermissions ? { updatedPermissions: decision.updatedPermissions } : {}),\n };\n }\n return {\n behavior: \"deny\",\n message: decision.message ?? `tool \"${toolName}\" denied by host`,\n ...(decision.interrupt ? { interrupt: true } : {}),\n };\n };\n}\n"],"mappings":"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","names":["query","query"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/client.ts","../src/core/session.ts","../src/core/agentSession.ts","../src/core/parity.ts","../src/core/permission.ts"],"sourcesContent":["/**\n * `Yagami` — the zero-config library client. `new Yagami()` needs no URL and\n * no API key: it finds the coding-agent CLIs already installed and signed in\n * on this machine (the same T3-Code trick the server does) and mirrors the\n * Anthropic and OpenAI SDK surfaces on top of them, so an app written\n * against either SDK shape drops in with nothing to configure.\n *\n * By default it also reads the host's yagami config\n * (~/.config/yagami/config.json), so an embedded client and the `yagami`\n * binary on the same machine agree on providers, paths, and defaults.\n */\n\nimport { YagamiEngine, type EngineOptions } from \"./engine.js\";\nimport { loadHostEngineConfig } from \"./hostConfig.js\";\nimport { ApiError, type MessagesRequest, type MessagesResponse } from \"./types.js\";\nimport type { EngineModel } from \"./models.js\";\nimport {\n ChatChunkTranslator,\n chatToMessagesRequest,\n modelListBody,\n toChatCompletion,\n type ChatCompletion,\n type ChatCompletionChunk,\n type ChatCompletionsRequest,\n} from \"./openai.js\";\n\nexport interface YagamiOptions extends EngineOptions {\n /**\n * Merge the host machine's yagami config (providers, defaults) under any\n * explicit options, so library and binary stay in sync. Default true;\n * ignored when explicit `providers` instances are passed.\n */\n syncHostConfig?: boolean;\n}\n\n/** An Anthropic stream event's payload (`message_start`, `content_block_delta`, …). */\nexport interface MessageStreamEvent {\n type: string;\n [key: string]: unknown;\n}\n\nexport interface YagamiMessages {\n /** Anthropic-SDK-shaped: non-stream resolves to the message; `stream: true` yields stream events. */\n create(req: MessagesRequest & { stream: true }): AsyncGenerator<MessageStreamEvent, void, undefined>;\n create(req: MessagesRequest & { stream?: false | undefined }): Promise<MessagesResponse>;\n /** Always-streaming variant (the SDK's `messages.stream`). */\n stream(req: MessagesRequest): AsyncGenerator<MessageStreamEvent, void, undefined>;\n}\n\nexport interface YagamiChatCompletions {\n /** OpenAI-SDK-shaped: non-stream resolves to a chat.completion; `stream: true` yields chunks. */\n create(req: ChatCompletionsRequest & { stream: true }): AsyncGenerator<ChatCompletionChunk, void, undefined>;\n create(req: ChatCompletionsRequest & { stream?: false | undefined }): Promise<ChatCompletion>;\n}\n\nexport class Yagami {\n /** The underlying engine, for anything beyond the SDK-shaped surface. */\n readonly engine: YagamiEngine;\n\n constructor(options: YagamiOptions = {}) {\n const { syncHostConfig, ...engineOptions } = options;\n const host = syncHostConfig === false || engineOptions.providers ? {} : loadHostEngineConfig();\n this.engine = new YagamiEngine({ ...host, ...definedProps(engineOptions) });\n }\n\n readonly messages: YagamiMessages = (() => {\n const streamEvents = (req: MessagesRequest) => this.streamMessageEvents(req);\n const complete = async (req: MessagesRequest) => (await this.engine.complete(req)).response;\n function create(req: MessagesRequest & { stream: true }): AsyncGenerator<MessageStreamEvent, void, undefined>;\n function create(req: MessagesRequest & { stream?: false | undefined }): Promise<MessagesResponse>;\n function create(req: MessagesRequest): unknown {\n return req.stream === true ? streamEvents(req) : complete(req);\n }\n return { create, stream: streamEvents };\n })();\n\n readonly chat: { completions: YagamiChatCompletions } = (() => {\n const streamChunks = (req: ChatCompletionsRequest) => this.streamChatChunks(req);\n const complete = async (req: ChatCompletionsRequest) => {\n const { req: translated } = chatToMessagesRequest(req);\n return toChatCompletion((await this.engine.complete(translated)).response);\n };\n function create(req: ChatCompletionsRequest & { stream: true }): AsyncGenerator<ChatCompletionChunk, void, undefined>;\n function create(req: ChatCompletionsRequest & { stream?: false | undefined }): Promise<ChatCompletion>;\n function create(req: ChatCompletionsRequest): unknown {\n return req.stream === true ? streamChunks(req) : complete(req);\n }\n return { completions: { create } };\n })();\n\n readonly models = {\n /** Both SDK shapes at once (Anthropic + OpenAI model-list fields). */\n list: async (): Promise<ReturnType<typeof modelListBody>> => modelListBody(await this.engine.listModels()),\n /** The engine's raw model list. */\n raw: (): Promise<EngineModel[]> => this.engine.listModels(),\n };\n\n private async *streamMessageEvents(req: MessagesRequest): AsyncGenerator<MessageStreamEvent, void, undefined> {\n const { events } = this.engine.stream(req);\n for await (const ev of events) {\n if (ev.event === \"error\") throw errorFromEvent(ev.data);\n yield ev.data as MessageStreamEvent;\n }\n }\n\n private async *streamChatChunks(req: ChatCompletionsRequest): AsyncGenerator<ChatCompletionChunk, void, undefined> {\n const { req: translated, includeUsage } = chatToMessagesRequest({ ...req, stream: true });\n const translator = new ChatChunkTranslator(includeUsage);\n const { events } = this.engine.stream(translated);\n for await (const ev of events) {\n if (ev.event === \"error\") throw errorFromEvent(ev.data);\n for (const chunk of translator.push(ev)) yield chunk as ChatCompletionChunk;\n }\n }\n}\n\nfunction errorFromEvent(data: unknown): ApiError {\n const error = (data as { error?: { type?: string; message?: string } } | undefined)?.error;\n return new ApiError(500, (error?.type as ApiError[\"type\"]) ?? \"api_error\", error?.message ?? \"stream error\");\n}\n\nfunction definedProps<T extends object>(obj: T): Partial<T> {\n return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as Partial<T>;\n}\n","import {\n query,\n type Options,\n type Query,\n type SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport { resolveClaudeExecutable } from \"./executable.js\";\n\nexport interface ClaudeSessionOptions {\n /** Path to the `claude` binary. Auto-resolved when omitted. */\n claudePath?: string;\n /** Agent SDK options; merged over yagami's defaults. */\n options?: Options;\n}\n\n/**\n * Full agentic Claude Code session (tools, permissions, plan mode — the\n * works), backed by the user's installed, signed-in CLI. This is the\n * embeddable \"what T3 Code does\" primitive for building UIs on top of\n * Claude Code: unlike the Messages-API engine, nothing is restricted here.\n *\n * Defaults to the `claude_code` system prompt preset so behavior matches the\n * interactive CLI; pass `options.systemPrompt` to override.\n */\nexport function claudeCodeSession(\n prompt: string | AsyncIterable<SDKUserMessage>,\n sessionOptions: ClaudeSessionOptions = {},\n): Query {\n const claudePath = resolveClaudeExecutable(\n sessionOptions.claudePath ?? sessionOptions.options?.pathToClaudeCodeExecutable,\n );\n return query({\n prompt,\n options: {\n systemPrompt: { type: \"preset\", preset: \"claude_code\" },\n ...sessionOptions.options,\n pathToClaudeCodeExecutable: claudePath,\n },\n });\n}\n\nexport type {\n Options as AgentOptions,\n Query,\n SDKMessage,\n SDKUserMessage,\n PermissionMode,\n CanUseTool,\n} from \"@anthropic-ai/claude-agent-sdk\";\n","import {\n query,\n type Options,\n type Query,\n type SDKMessage,\n type SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport { resolveClaudeExecutable } from \"./executable.js\";\nimport { classifyProviderFailure } from \"./errors.js\";\nimport { settingSourcesFor, type Parity } from \"./parity.js\";\nimport { PermissionAdapter, type PermissionHandler, type PermissionAdapterOptions } from \"./permission.js\";\nimport { AsyncQueue } from \"./providers/queue.js\";\nimport { VERSION } from \"../version.js\";\n\nexport interface AgentSessionOptions {\n /** Path to the `claude` binary. Auto-resolved when omitted. */\n claudePath?: string;\n /** Project directory the agent works in. */\n cwd?: string;\n /** How closely to mirror the interactive terminal (default \"terminal\"). */\n parity?: Parity;\n /** Model id/alias; the CLI default when omitted. */\n model?: string;\n /** Host permission callback (see {@link PermissionAdapter}). */\n onPermission?: PermissionHandler;\n /** Options for the permission adapter (fallback, auto-allow/deny). */\n permission?: PermissionAdapterOptions;\n /** Reported to the CLI as the client application (e.g. your app name). */\n appName?: string;\n /** Extra Agent SDK options, merged last (wins over the above). */\n options?: Options;\n}\n\n/**\n * A long-lived, agentic Claude Code session for building a UI on top of the\n * CLI — the ruri use case. It keeps one warm process across turns (so only\n * the first turn pays cold-start), threads permission decisions to a host\n * callback, mirrors your terminal settings by default, and exposes the\n * lifecycle the interactive CLI gives you for free: send, interrupt, resume,\n * change model/permission mode, close.\n *\n * Everything the model produces is an {@link SDKMessage} you render yourself.\n */\nexport class AgentSession implements AsyncIterable<SDKMessage> {\n readonly permissions: PermissionAdapter;\n private readonly claudePath: string;\n private readonly appName: string;\n private readonly baseOptions: Options;\n private readonly input = new AsyncQueue<SDKUserMessage>();\n private query: Query | undefined;\n private started = false;\n private closed = false;\n private currentSessionId: string | undefined;\n\n constructor(options: AgentSessionOptions = {}) {\n this.claudePath = resolveClaudeExecutable(options.claudePath ?? options.options?.pathToClaudeCodeExecutable);\n this.appName = options.appName ?? \"yagami\";\n this.permissions = new PermissionAdapter(options.permission ?? {});\n if (options.onPermission) this.permissions.setHandler(options.onPermission);\n this.baseOptions = {\n systemPrompt: { type: \"preset\", preset: \"claude_code\" },\n settingSources: settingSourcesFor(options.parity ?? \"terminal\"),\n includePartialMessages: true,\n ...(options.cwd ? { cwd: options.cwd } : {}),\n ...(options.model ? { model: options.model } : {}),\n ...options.options,\n canUseTool: options.options?.canUseTool ?? this.permissions.canUseTool,\n pathToClaudeCodeExecutable: this.claudePath,\n env: {\n ...process.env,\n CLAUDE_AGENT_SDK_CLIENT_APP: `${this.appName}/${VERSION}`,\n ...options.options?.env,\n },\n };\n }\n\n /** Set (or clear) the host permission callback after construction. */\n setPermissionHandler(handler: PermissionHandler | undefined): void {\n this.permissions.setHandler(handler);\n }\n\n /** The live Claude Code session id, once the first turn has started. */\n get sessionId(): string | undefined {\n return this.currentSessionId;\n }\n\n /** Queue a user turn. The process starts on the first send and stays warm. */\n send(text: string, options: { images?: Array<{ data: string; mediaType?: string }> } = {}): void {\n if (this.closed) throw new Error(\"session is closed\");\n const content =\n options.images && options.images.length > 0\n ? [\n ...options.images.map((img) => ({ type: \"image\" as const, source: { type: \"base64\" as const, media_type: img.mediaType ?? \"image/png\", data: img.data } })),\n { type: \"text\" as const, text },\n ]\n : text;\n this.input.push({\n type: \"user\",\n message: { role: \"user\", content } as SDKUserMessage[\"message\"],\n parent_tool_use_id: null,\n session_id: this.currentSessionId ?? \"\",\n } as SDKUserMessage);\n this.ensureStarted();\n }\n\n private ensureStarted(): void {\n if (this.started) return;\n this.started = true;\n this.query = query({ prompt: this.input, options: this.baseOptions });\n }\n\n /** Iterate every SDK message the agent produces across all turns. */\n async *[Symbol.asyncIterator](): AsyncIterator<SDKMessage> {\n this.ensureStarted();\n try {\n for await (const msg of this.query!) {\n if (msg.type === \"system\" && msg.subtype === \"init\") this.currentSessionId = msg.session_id;\n else if (msg.type === \"result\") this.currentSessionId = msg.session_id;\n yield msg;\n }\n } catch (err) {\n throw classifyProviderFailure(\"claude\", \"claude (then /login)\", err);\n }\n }\n\n /** Interrupt the in-flight turn (the CLI's Esc/Ctrl-C). */\n async interrupt(): Promise<void> {\n await this.query?.interrupt();\n }\n\n /** Switch models mid-session (the CLI's /model). */\n async setModel(model: string): Promise<void> {\n await this.query?.setModel(model);\n }\n\n /** Switch permission mode mid-session (default/acceptEdits/plan/bypassPermissions). */\n async setPermissionMode(mode: \"default\" | \"acceptEdits\" | \"plan\" | \"bypassPermissions\"): Promise<void> {\n await this.query?.setPermissionMode(mode);\n }\n\n /** Models the CLI reports as available (for a picker). */\n async supportedModels(): Promise<Array<{ value: string; displayName: string }>> {\n this.ensureStarted();\n const models = await this.query!.supportedModels();\n return models.map((m) => ({ value: m.value, displayName: m.displayName }));\n }\n\n /** End the session and tear down the process. */\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.input.end();\n this.query?.close();\n }\n}\n\n/**\n * Convenience: start an {@link AgentSession} and immediately send one turn.\n * Returns the session so callers can iterate it, interrupt, or send more.\n */\nexport function startAgentSession(prompt: string, options: AgentSessionOptions = {}): AgentSession {\n const session = new AgentSession(options);\n session.send(prompt);\n return session;\n}\n","import type { SettingSource } from \"@anthropic-ai/claude-agent-sdk\";\n\n/**\n * How closely an embedded session should mirror the interactive `claude`\n * terminal. This resolves the single most common surprise in library mode:\n * the Agent SDK loads none of your settings by default.\n *\n * - `\"terminal\"` — behave like your CLI: load user + project + local\n * settings, so CLAUDE.md, skills, hooks, and .mcp.json all apply.\n * - `\"isolated\"` — load nothing (the raw SDK default); the app supplies\n * everything explicitly. Best when the session must be reproducible or\n * must not pick up the developer's personal config.\n * - `\"project\"` — load project + local settings but not the user's global\n * ones: shared repo config without personal CLAUDE.md/skills.\n */\nexport type Parity = \"terminal\" | \"project\" | \"isolated\";\n\nconst SETTING_SOURCES: Record<Parity, SettingSource[]> = {\n terminal: [\"user\", \"project\", \"local\"],\n project: [\"project\", \"local\"],\n isolated: [],\n};\n\n/** The `settingSources` a parity level maps to. */\nexport function settingSourcesFor(parity: Parity): SettingSource[] {\n return [...SETTING_SOURCES[parity]];\n}\n","import type {\n CanUseTool,\n PermissionResult,\n PermissionUpdate,\n} from \"@anthropic-ai/claude-agent-sdk\";\n\n/** A tool-use request handed to the host for a decision. */\nexport interface PermissionRequest {\n toolName: string;\n input: Record<string, unknown>;\n signal: AbortSignal;\n /**\n * Suggested permission updates the host can echo back to stop being asked\n * again this session (e.g. behind an \"always allow\" button).\n */\n suggestions?: PermissionUpdate[];\n}\n\n/**\n * The host's answer. `allow` optionally rewrites the tool input and/or\n * persists permission updates for the rest of the session; `deny` carries a\n * message the model sees and can optionally interrupt the turn.\n */\nexport type PermissionDecision =\n | { behavior: \"allow\"; updatedInput?: Record<string, unknown>; updatedPermissions?: PermissionUpdate[] }\n | { behavior: \"deny\"; message?: string; interrupt?: boolean };\n\n/** What the app implements: show UI, return a decision. */\nexport type PermissionHandler = (req: PermissionRequest) => PermissionDecision | Promise<PermissionDecision>;\n\nexport interface PermissionAdapterOptions {\n /**\n * Decision used when no handler is set, a handler throws, or the request is\n * aborted. Defaults to denying — the safe choice for an unattended host.\n */\n fallback?: \"allow\" | \"deny\";\n /** Tool names to auto-allow without ever calling the handler. */\n autoAllow?: Iterable<string>;\n /** Tool names to auto-deny without ever calling the handler. */\n autoDeny?: Iterable<string>;\n}\n\n/**\n * Turns a host-supplied {@link PermissionHandler} into the Agent SDK's\n * {@link CanUseTool} callback, owning the state machine so the app only has\n * to answer one question: allow or deny this tool call?\n *\n * The policy (what to auto-approve) stays with the app — yagami never bakes\n * in a permissive default. Without a handler, everything falls back (deny by\n * default), so a session is safe before the UI is wired up.\n */\nexport class PermissionAdapter {\n private handler: PermissionHandler | undefined;\n private readonly fallback: \"allow\" | \"deny\";\n private readonly autoAllow: Set<string>;\n private readonly autoDeny: Set<string>;\n\n constructor(options: PermissionAdapterOptions = {}) {\n this.fallback = options.fallback ?? \"deny\";\n this.autoAllow = new Set(options.autoAllow ?? []);\n this.autoDeny = new Set(options.autoDeny ?? []);\n }\n\n /** Install (or replace) the host decision callback. */\n setHandler(handler: PermissionHandler | undefined): void {\n this.handler = handler;\n }\n\n allowTool(toolName: string): void {\n this.autoDeny.delete(toolName);\n this.autoAllow.add(toolName);\n }\n\n denyTool(toolName: string): void {\n this.autoAllow.delete(toolName);\n this.autoDeny.add(toolName);\n }\n\n private fallbackResult(reason: string): PermissionResult {\n return this.fallback === \"allow\"\n ? { behavior: \"allow\", updatedInput: {} }\n : { behavior: \"deny\", message: reason };\n }\n\n /**\n * The callback to hand to `claudeCodeSession`/the Agent SDK. Typed to\n * always resolve (never null), and assignable to the SDK's CanUseTool.\n */\n readonly canUseTool: (\n ...args: Parameters<CanUseTool>\n ) => Promise<PermissionResult> = async (toolName, input, options) => {\n if (this.autoDeny.has(toolName)) {\n return { behavior: \"deny\", message: `tool \"${toolName}\" is disabled for this session` };\n }\n if (this.autoAllow.has(toolName)) {\n return { behavior: \"allow\", updatedInput: input };\n }\n if (!this.handler) return this.fallbackResult(`no permission handler is set; denying \"${toolName}\"`);\n if (options.signal.aborted) return this.fallbackResult(\"request aborted\");\n\n let decision: PermissionDecision;\n try {\n decision = await this.handler({\n toolName,\n input,\n signal: options.signal,\n ...(options.suggestions ? { suggestions: options.suggestions } : {}),\n });\n } catch (err) {\n return this.fallbackResult(`permission handler threw: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n if (decision.behavior === \"allow\") {\n return {\n behavior: \"allow\",\n updatedInput: decision.updatedInput ?? input,\n ...(decision.updatedPermissions ? { updatedPermissions: decision.updatedPermissions } : {}),\n };\n }\n return {\n behavior: \"deny\",\n message: decision.message ?? `tool \"${toolName}\" denied by host`,\n ...(decision.interrupt ? { interrupt: true } : {}),\n };\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDO,IAAM,SAAN,MAAa;AAAA;AAAA,EAET;AAAA,EAET,YAAY,UAAyB,CAAC,GAAG;AACvC,UAAM,EAAE,gBAAgB,GAAG,cAAc,IAAI;AAC7C,UAAM,OAAO,mBAAmB,SAAS,cAAc,YAAY,CAAC,IAAI,qBAAqB;AAC7F,SAAK,SAAS,IAAI,aAAa,EAAE,GAAG,MAAM,GAAG,aAAa,aAAa,EAAE,CAAC;AAAA,EAC5E;AAAA,EAES,WAA4B,uBAAM;AACzC,UAAM,eAAe,CAAC,QAAyB,KAAK,oBAAoB,GAAG;AAC3E,UAAM,WAAW,OAAO,SAA0B,MAAM,KAAK,OAAO,SAAS,GAAG,GAAG;AAGnF,aAAS,OAAO,KAA+B;AAC7C,aAAO,IAAI,WAAW,OAAO,aAAa,GAAG,IAAI,SAAS,GAAG;AAAA,IAC/D;AACA,WAAO,EAAE,QAAQ,QAAQ,aAAa;AAAA,EACxC,GAAG;AAAA,EAEM,OAAgD,uBAAM;AAC7D,UAAM,eAAe,CAAC,QAAgC,KAAK,iBAAiB,GAAG;AAC/E,UAAM,WAAW,OAAO,QAAgC;AACtD,YAAM,EAAE,KAAK,WAAW,IAAI,sBAAsB,GAAG;AACrD,aAAO,kBAAkB,MAAM,KAAK,OAAO,SAAS,UAAU,GAAG,QAAQ;AAAA,IAC3E;AAGA,aAAS,OAAO,KAAsC;AACpD,aAAO,IAAI,WAAW,OAAO,aAAa,GAAG,IAAI,SAAS,GAAG;AAAA,IAC/D;AACA,WAAO,EAAE,aAAa,EAAE,OAAO,EAAE;AAAA,EACnC,GAAG;AAAA,EAEM,SAAS;AAAA;AAAA,IAEhB,MAAM,YAAuD,cAAc,MAAM,KAAK,OAAO,WAAW,CAAC;AAAA;AAAA,IAEzG,KAAK,MAA8B,KAAK,OAAO,WAAW;AAAA,EAC5D;AAAA,EAEA,OAAe,oBAAoB,KAA2E;AAC5G,UAAM,EAAE,OAAO,IAAI,KAAK,OAAO,OAAO,GAAG;AACzC,qBAAiB,MAAM,QAAQ;AAC7B,UAAI,GAAG,UAAU,QAAS,OAAM,eAAe,GAAG,IAAI;AACtD,YAAM,GAAG;AAAA,IACX;AAAA,EACF;AAAA,EAEA,OAAe,iBAAiB,KAAmF;AACjH,UAAM,EAAE,KAAK,YAAY,aAAa,IAAI,sBAAsB,EAAE,GAAG,KAAK,QAAQ,KAAK,CAAC;AACxF,UAAM,aAAa,IAAI,oBAAoB,YAAY;AACvD,UAAM,EAAE,OAAO,IAAI,KAAK,OAAO,OAAO,UAAU;AAChD,qBAAiB,MAAM,QAAQ;AAC7B,UAAI,GAAG,UAAU,QAAS,OAAM,eAAe,GAAG,IAAI;AACtD,iBAAW,SAAS,WAAW,KAAK,EAAE,EAAG,OAAM;AAAA,IACjD;AAAA,EACF;AACF;AAEA,SAAS,eAAe,MAAyB;AAC/C,QAAM,QAAS,MAAsE;AACrF,SAAO,IAAI,SAAS,KAAM,OAAO,QAA6B,aAAa,OAAO,WAAW,cAAc;AAC7G;AAEA,SAAS,aAA+B,KAAoB;AAC1D,SAAO,OAAO,YAAY,OAAO,QAAQ,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,MAAM,MAAS,CAAC;AAClF;;;AC3HA;AAAA,EACE;AAAA,OAIK;AAmBA,SAAS,kBACd,QACA,iBAAuC,CAAC,GACjC;AACP,QAAM,aAAa;AAAA,IACjB,eAAe,cAAc,eAAe,SAAS;AAAA,EACvD;AACA,SAAO,MAAM;AAAA,IACX;AAAA,IACA,SAAS;AAAA,MACP,cAAc,EAAE,MAAM,UAAU,QAAQ,cAAc;AAAA,MACtD,GAAG,eAAe;AAAA,MAClB,4BAA4B;AAAA,IAC9B;AAAA,EACF,CAAC;AACH;;;ACvCA;AAAA,EACE,SAAAA;AAAA,OAKK;;;ACWP,IAAM,kBAAmD;AAAA,EACvD,UAAU,CAAC,QAAQ,WAAW,OAAO;AAAA,EACrC,SAAS,CAAC,WAAW,OAAO;AAAA,EAC5B,UAAU,CAAC;AACb;AAGO,SAAS,kBAAkB,QAAiC;AACjE,SAAO,CAAC,GAAG,gBAAgB,MAAM,CAAC;AACpC;;;ACyBO,IAAM,oBAAN,MAAwB;AAAA,EACrB;AAAA,EACS;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,UAAoC,CAAC,GAAG;AAClD,SAAK,WAAW,QAAQ,YAAY;AACpC,SAAK,YAAY,IAAI,IAAI,QAAQ,aAAa,CAAC,CAAC;AAChD,SAAK,WAAW,IAAI,IAAI,QAAQ,YAAY,CAAC,CAAC;AAAA,EAChD;AAAA;AAAA,EAGA,WAAW,SAA8C;AACvD,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,UAAU,UAAwB;AAChC,SAAK,SAAS,OAAO,QAAQ;AAC7B,SAAK,UAAU,IAAI,QAAQ;AAAA,EAC7B;AAAA,EAEA,SAAS,UAAwB;AAC/B,SAAK,UAAU,OAAO,QAAQ;AAC9B,SAAK,SAAS,IAAI,QAAQ;AAAA,EAC5B;AAAA,EAEQ,eAAe,QAAkC;AACvD,WAAO,KAAK,aAAa,UACrB,EAAE,UAAU,SAAS,cAAc,CAAC,EAAE,IACtC,EAAE,UAAU,QAAQ,SAAS,OAAO;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMS,aAEwB,OAAO,UAAU,OAAO,YAAY;AACnE,QAAI,KAAK,SAAS,IAAI,QAAQ,GAAG;AAC/B,aAAO,EAAE,UAAU,QAAQ,SAAS,SAAS,QAAQ,iCAAiC;AAAA,IACxF;AACA,QAAI,KAAK,UAAU,IAAI,QAAQ,GAAG;AAChC,aAAO,EAAE,UAAU,SAAS,cAAc,MAAM;AAAA,IAClD;AACA,QAAI,CAAC,KAAK,QAAS,QAAO,KAAK,eAAe,0CAA0C,QAAQ,GAAG;AACnG,QAAI,QAAQ,OAAO,QAAS,QAAO,KAAK,eAAe,iBAAiB;AAExE,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,KAAK,QAAQ;AAAA,QAC5B;AAAA,QACA;AAAA,QACA,QAAQ,QAAQ;AAAA,QAChB,GAAI,QAAQ,cAAc,EAAE,aAAa,QAAQ,YAAY,IAAI,CAAC;AAAA,MACpE,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,aAAO,KAAK,eAAe,6BAA6B,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAAA,IAC5G;AAEA,QAAI,SAAS,aAAa,SAAS;AACjC,aAAO;AAAA,QACL,UAAU;AAAA,QACV,cAAc,SAAS,gBAAgB;AAAA,QACvC,GAAI,SAAS,qBAAqB,EAAE,oBAAoB,SAAS,mBAAmB,IAAI,CAAC;AAAA,MAC3F;AAAA,IACF;AACA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,SAAS,SAAS,WAAW,SAAS,QAAQ;AAAA,MAC9C,GAAI,SAAS,YAAY,EAAE,WAAW,KAAK,IAAI,CAAC;AAAA,IAClD;AAAA,EACF;AACF;;;AFlFO,IAAM,eAAN,MAAwD;AAAA,EACpD;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ,IAAI,WAA2B;AAAA,EAChD;AAAA,EACA,UAAU;AAAA,EACV,SAAS;AAAA,EACT;AAAA,EAER,YAAY,UAA+B,CAAC,GAAG;AAC7C,SAAK,aAAa,wBAAwB,QAAQ,cAAc,QAAQ,SAAS,0BAA0B;AAC3G,SAAK,UAAU,QAAQ,WAAW;AAClC,SAAK,cAAc,IAAI,kBAAkB,QAAQ,cAAc,CAAC,CAAC;AACjE,QAAI,QAAQ,aAAc,MAAK,YAAY,WAAW,QAAQ,YAAY;AAC1E,SAAK,cAAc;AAAA,MACjB,cAAc,EAAE,MAAM,UAAU,QAAQ,cAAc;AAAA,MACtD,gBAAgB,kBAAkB,QAAQ,UAAU,UAAU;AAAA,MAC9D,wBAAwB;AAAA,MACxB,GAAI,QAAQ,MAAM,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC;AAAA,MAC1C,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,MAChD,GAAG,QAAQ;AAAA,MACX,YAAY,QAAQ,SAAS,cAAc,KAAK,YAAY;AAAA,MAC5D,4BAA4B,KAAK;AAAA,MACjC,KAAK;AAAA,QACH,GAAG,QAAQ;AAAA,QACX,6BAA6B,GAAG,KAAK,OAAO,IAAI,OAAO;AAAA,QACvD,GAAG,QAAQ,SAAS;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,qBAAqB,SAA8C;AACjE,SAAK,YAAY,WAAW,OAAO;AAAA,EACrC;AAAA;AAAA,EAGA,IAAI,YAAgC;AAClC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,KAAK,MAAc,UAAoE,CAAC,GAAS;AAC/F,QAAI,KAAK,OAAQ,OAAM,IAAI,MAAM,mBAAmB;AACpD,UAAM,UACJ,QAAQ,UAAU,QAAQ,OAAO,SAAS,IACtC;AAAA,MACE,GAAG,QAAQ,OAAO,IAAI,CAAC,SAAS,EAAE,MAAM,SAAkB,QAAQ,EAAE,MAAM,UAAmB,YAAY,IAAI,aAAa,aAAa,MAAM,IAAI,KAAK,EAAE,EAAE;AAAA,MAC1J,EAAE,MAAM,QAAiB,KAAK;AAAA,IAChC,IACA;AACN,SAAK,MAAM,KAAK;AAAA,MACd,MAAM;AAAA,MACN,SAAS,EAAE,MAAM,QAAQ,QAAQ;AAAA,MACjC,oBAAoB;AAAA,MACpB,YAAY,KAAK,oBAAoB;AAAA,IACvC,CAAmB;AACnB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,gBAAsB;AAC5B,QAAI,KAAK,QAAS;AAClB,SAAK,UAAU;AACf,SAAK,QAAQC,OAAM,EAAE,QAAQ,KAAK,OAAO,SAAS,KAAK,YAAY,CAAC;AAAA,EACtE;AAAA;AAAA,EAGA,QAAQ,OAAO,aAAa,IAA+B;AACzD,SAAK,cAAc;AACnB,QAAI;AACF,uBAAiB,OAAO,KAAK,OAAQ;AACnC,YAAI,IAAI,SAAS,YAAY,IAAI,YAAY,OAAQ,MAAK,mBAAmB,IAAI;AAAA,iBACxE,IAAI,SAAS,SAAU,MAAK,mBAAmB,IAAI;AAC5D,cAAM;AAAA,MACR;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,wBAAwB,UAAU,wBAAwB,GAAG;AAAA,IACrE;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,YAA2B;AAC/B,UAAM,KAAK,OAAO,UAAU;AAAA,EAC9B;AAAA;AAAA,EAGA,MAAM,SAAS,OAA8B;AAC3C,UAAM,KAAK,OAAO,SAAS,KAAK;AAAA,EAClC;AAAA;AAAA,EAGA,MAAM,kBAAkB,MAA+E;AACrG,UAAM,KAAK,OAAO,kBAAkB,IAAI;AAAA,EAC1C;AAAA;AAAA,EAGA,MAAM,kBAA0E;AAC9E,SAAK,cAAc;AACnB,UAAM,SAAS,MAAM,KAAK,MAAO,gBAAgB;AACjD,WAAO,OAAO,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,aAAa,EAAE,YAAY,EAAE;AAAA,EAC3E;AAAA;AAAA,EAGA,QAAc;AACZ,QAAI,KAAK,OAAQ;AACjB,SAAK,SAAS;AACd,SAAK,MAAM,IAAI;AACf,SAAK,OAAO,MAAM;AAAA,EACpB;AACF;AAMO,SAAS,kBAAkB,QAAgB,UAA+B,CAAC,GAAiB;AACjG,QAAM,UAAU,IAAI,aAAa,OAAO;AACxC,UAAQ,KAAK,MAAM;AACnB,SAAO;AACT;","names":["query","query"]}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ServerType } from '@hono/node-server';
|
|
2
|
-
import {
|
|
3
|
-
export {
|
|
2
|
+
import { r as ProviderConfigEntry, M as MessagesRequest, l as CompleteResult, z as StreamOptions, F as StreamStart, E as EngineModel, Y as YagamiEngine, u as SessionCache } from './hostConfig-HmZ3z297.js';
|
|
3
|
+
export { W as yagamiConfigDir } from './hostConfig-HmZ3z297.js';
|
|
4
4
|
import { Hono } from 'hono';
|
|
5
5
|
|
|
6
6
|
interface YagamiConfig {
|
package/dist/server.js
CHANGED
|
@@ -13,10 +13,10 @@ import {
|
|
|
13
13
|
sessionCachePath,
|
|
14
14
|
startYagami,
|
|
15
15
|
writeServerState
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-D2PNH6GV.js";
|
|
17
17
|
import {
|
|
18
18
|
yagamiConfigDir
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-ZYHC7PXX.js";
|
|
20
20
|
export {
|
|
21
21
|
clearServerState,
|
|
22
22
|
configFilePath,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@justin06lee/yagami",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Self-hosted Anthropic- and OpenAI-compatible API backed by your signed-in coding-agent CLIs, plus a zero-config library for driving them from your own apps — no API keys needed.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|