@agent-native/core 0.65.0 → 0.66.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-adapter.js","sourceRoot":"","sources":["../../../src/agent/harness/acp-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ACP (Agent Client Protocol) harness adapter.\n *\n * Lets Agent-Native act as an ACP *client* and drive a local coding agent —\n * Gemini CLI, Claude Code, or any other ACP-compliant agent — through the\n * existing {@link AgentHarnessAdapter} substrate. The agent runs as a local\n * subprocess that owns its own loop, tools, and workspace filesystem access,\n * which is exactly the shape ACP was designed for. See:\n * https://agentclientprotocol.com\n *\n * Scope: this adapter targets *local* coding. The agent is spawned as a child\n * process and speaks newline-delimited JSON-RPC over stdio. It reuses whatever\n * local CLI login the agent already has (e.g. `gemini`/`claude` auth in the\n * user's home dir) by inheriting the parent environment. It is not a hosted or\n * sandboxed transport, and it is not a chat/A2A transport.\n *\n * The protocol transport and framing are handled by the official\n * `@zed-industries/agent-client-protocol` package, loaded lazily as an optional\n * dependency so apps that never use ACP do not pay for it. Everything in this\n * file beyond the thin spawn/connection glue is pure mapping logic between ACP\n * `session/update` notifications and {@link AgentHarnessEvent}s.\n */\n\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport { Readable, Writable } from \"node:stream\";\n\nimport type {\n AgentHarnessAdapter,\n AgentHarnessApproval,\n AgentHarnessCapabilities,\n AgentHarnessCreateSessionOptions,\n AgentHarnessEvent,\n AgentHarnessMessage,\n AgentHarnessPermissionMode,\n AgentHarnessSession,\n AgentHarnessTurnInput,\n} from \"./types.js\";\n\n/** Grace period between SIGTERM and SIGKILL when tearing a session down. */\nconst SIGKILL_GRACE_MS = 2_000;\n/** Keep a bounded tail of child stderr for diagnostics. */\nconst STDERR_TAIL_LIMIT = 8_000;\n\n/**\n * The optional package that carries the ACP protocol transport. Loaded lazily;\n * `resolveAgentHarness` surfaces a clear install error when it is missing.\n */\nexport const ACP_PACKAGE = \"@zed-industries/agent-client-protocol\";\n\nexport interface AcpHarnessAdapterOptions {\n /** Adapter id, e.g. \"acp:gemini\". Defaults to \"acp\". */\n name?: string;\n /** Human-readable label for pickers. */\n label?: string;\n /** Short description for pickers and diagnostics. */\n description?: string;\n /** Executable to spawn (the ACP agent binary), e.g. \"gemini\" or \"npx\". */\n command?: string;\n /** Arguments passed to the agent binary, e.g. [\"--experimental-acp\"]. */\n args?: string[];\n /**\n * Extra environment variables for the agent process. Merged over the parent\n * environment, which the agent inherits so it can reuse the user's local CLI\n * login.\n */\n env?: Record<string, string>;\n /** Default working directory when a turn does not specify one. */\n cwd?: string;\n /** Hint shown when the optional ACP package is missing. */\n installPackage?: string;\n}\n\nconst DEFAULT_CAPABILITIES: AgentHarnessCapabilities = {\n // The agent runs locally with its own workspace access; Agent-Native does not\n // provide it an isolated sandbox.\n sandbox: false,\n // Best-effort: resumable when the agent advertises the `loadSession`\n // capability. Degrades to a fresh session per turn otherwise.\n resumable: true,\n approvals: true,\n // ACP host tools would flow through MCP servers; not wired in this adapter.\n hostTools: false,\n fileEvents: true,\n};\n\n/**\n * Indirect dynamic import so bundlers/TS do not try to resolve the optional ACP\n * package at build time (mirrors the AI SDK harness adapter).\n */\nconst dynamicImport = new Function(\"specifier\", \"return import(specifier)\") as (\n specifier: string,\n) => Promise<any>;\n\nexport function createAcpHarnessAdapter(\n options: AcpHarnessAdapterOptions,\n): AgentHarnessAdapter {\n const name = options.name ?? \"acp\";\n return {\n name,\n label: options.label ?? \"ACP Agent\",\n description:\n options.description ??\n \"Drives a local ACP-compliant coding agent over stdio.\",\n installPackage: options.installPackage ?? ACP_PACKAGE,\n capabilities: DEFAULT_CAPABILITIES,\n async createSession(sessionOptions) {\n const command = options.command?.trim();\n if (!command) {\n throw new Error(\n `[acp-harness] Harness \"${name}\" requires a command. Pass { command, args } when resolving the harness (e.g. resolveAgentHarness(\"acp\", { command: \"gemini\", args: [\"--experimental-acp\"] })).`,\n );\n }\n const acp = await dynamicImport(ACP_PACKAGE);\n const cwd = path.resolve(\n sessionOptions.cwd ?? options.cwd ?? process.cwd(),\n );\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n ...(options.env ?? {}),\n };\n const child = spawn(command, options.args ?? [], {\n cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n const session = new AcpHarnessSession({\n acp,\n child,\n command,\n cwd,\n permissionMode: sessionOptions.permissionMode ?? \"allow-reads\",\n });\n try {\n await session.initialize(sessionOptions);\n } catch (error) {\n await session.destroy();\n throw error;\n }\n return session;\n },\n };\n}\n\ninterface AcpHarnessSessionDeps {\n acp: any;\n child: ChildProcessWithoutNullStreams;\n command: string;\n cwd: string;\n permissionMode: AgentHarnessPermissionMode;\n}\n\ninterface PendingPermission {\n resolve: (response: AcpPermissionResponse) => void;\n options: AcpPermissionOption[];\n}\n\nclass AcpHarnessSession implements AgentHarnessSession {\n readonly id: string;\n\n private readonly acp: any;\n private readonly child: ChildProcessWithoutNullStreams;\n private readonly command: string;\n private readonly cwd: string;\n private readonly permissionMode: AgentHarnessPermissionMode;\n private connection: any;\n private acpSessionId = \"\";\n private supportsLoad = false;\n\n private queue: AsyncEventQueue<AgentHarnessEvent> | null = null;\n private readonly pendingPermissions = new Map<string, PendingPermission>();\n private readonly toolTitles = new Map<string, string>();\n private approvalCounter = 0;\n private stderrTail = \"\";\n private childExited = false;\n private shuttingDown = false;\n\n constructor(deps: AcpHarnessSessionDeps) {\n this.acp = deps.acp;\n this.child = deps.child;\n this.command = deps.command;\n this.cwd = deps.cwd;\n this.permissionMode = deps.permissionMode;\n // Placeholder until newSession/loadSession assigns the real id.\n this.id = `acp-${Math.random().toString(36).slice(2)}`;\n\n this.child.stderr?.on(\"data\", (chunk: Buffer) => {\n this.stderrTail = (this.stderrTail + chunk.toString()).slice(\n -STDERR_TAIL_LIMIT,\n );\n });\n this.child.on(\"exit\", () => {\n this.childExited = true;\n if (!this.shuttingDown && this.queue) {\n this.queue.push({\n type: \"error\",\n error: this.childExitMessage(),\n });\n this.queue.close();\n }\n this.rejectAllPending();\n });\n this.child.on(\"error\", (error: Error) => {\n this.childExited = true;\n if (this.queue) {\n this.queue.push({\n type: \"error\",\n error: `[acp-harness] ${this.command}: ${error.message}`,\n });\n this.queue.close();\n }\n this.rejectAllPending();\n });\n }\n\n async initialize(opts: AgentHarnessCreateSessionOptions): Promise<void> {\n const stream = this.acp.ndJsonStream(\n Writable.toWeb(this.child.stdin) as WritableStream<Uint8Array>,\n Readable.toWeb(this.child.stdout) as ReadableStream<Uint8Array>,\n );\n this.connection = new this.acp.ClientSideConnection(\n () => this.createClient(),\n stream,\n );\n\n const initResponse = await this.connection.initialize({\n protocolVersion: this.acp.PROTOCOL_VERSION ?? 1,\n clientCapabilities: {\n fs: { readTextFile: true, writeTextFile: true },\n terminal: false,\n },\n });\n this.supportsLoad = Boolean(initResponse?.agentCapabilities?.loadSession);\n\n const resume = opts.resumeState as\n | { sessionId?: string }\n | undefined\n | null;\n if (resume?.sessionId && this.supportsLoad) {\n try {\n await this.connection.loadSession({\n sessionId: resume.sessionId,\n cwd: this.cwd,\n mcpServers: [],\n });\n this.acpSessionId = resume.sessionId;\n return;\n } catch {\n // Fall through to a fresh session if the agent could not load it.\n }\n }\n\n const created = await this.connection.newSession({\n cwd: this.cwd,\n mcpServers: [],\n });\n this.acpSessionId =\n typeof created?.sessionId === \"string\" ? created.sessionId : this.id;\n }\n\n async *streamTurn(\n input: AgentHarnessTurnInput,\n ): AsyncIterable<AgentHarnessEvent> {\n if (this.childExited) {\n yield { type: \"error\", error: this.childExitMessage() };\n return;\n }\n const queue = new AsyncEventQueue<AgentHarnessEvent>();\n this.queue = queue;\n\n const abort = input.abortSignal;\n const onAbort = () => {\n this.connection?.cancel({ sessionId: this.acpSessionId }).catch(() => {});\n };\n if (abort) {\n if (abort.aborted) onAbort();\n else abort.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n this.connection\n .prompt({\n sessionId: this.acpSessionId,\n prompt: buildAcpPromptBlocks(input),\n })\n .then((response: AcpPromptResponse) => {\n queue.push({ type: \"done\", reason: response?.stopReason });\n })\n .catch((error: unknown) => {\n queue.push({ type: \"error\", error: acpErrorMessage(error) });\n })\n .finally(() => {\n if (abort) abort.removeEventListener(\"abort\", onAbort);\n this.rejectAllPending();\n queue.close();\n this.queue = null;\n });\n\n yield* queue;\n }\n\n async approve(approval: AgentHarnessApproval): Promise<void> {\n const pending = this.pendingPermissions.get(approval.id);\n if (!pending) return;\n this.pendingPermissions.delete(approval.id);\n pending.resolve(\n buildAcpPermissionResponse(pending.options, approval.approved),\n );\n }\n\n async detach(): Promise<unknown> {\n const state = { sessionId: this.acpSessionId, cwd: this.cwd };\n await this.destroy();\n return state;\n }\n\n async stop(): Promise<unknown> {\n return this.detach();\n }\n\n async destroy(): Promise<void> {\n if (this.shuttingDown) return;\n this.shuttingDown = true;\n this.rejectAllPending();\n try {\n this.child.stdin?.end();\n } catch {}\n if (!this.childExited && this.child.exitCode === null) {\n try {\n this.child.kill(\"SIGTERM\");\n } catch {}\n const killTimer = setTimeout(() => {\n try {\n if (this.child.exitCode === null) this.child.kill(\"SIGKILL\");\n } catch {}\n }, SIGKILL_GRACE_MS);\n killTimer.unref?.();\n }\n }\n\n // --- ACP Client implementation (agent -> client) ---\n\n private createClient() {\n return {\n sessionUpdate: async (params: AcpSessionNotification) => {\n this.handleSessionUpdate(params.update);\n },\n requestPermission: async (params: AcpRequestPermissionRequest) =>\n this.handlePermission(params),\n readTextFile: async (params: AcpReadTextFileRequest) =>\n this.handleReadTextFile(params),\n writeTextFile: async (params: AcpWriteTextFileRequest) =>\n this.handleWriteTextFile(params),\n };\n }\n\n private handleSessionUpdate(update: AcpSessionUpdate): void {\n if (update?.sessionUpdate === \"tool_call\" && update.title) {\n this.toolTitles.set(update.toolCallId, update.title);\n }\n // Updates that arrive without an active turn are history replay from\n // loadSession; the transcript already contains them, so drop them.\n if (!this.queue) return;\n for (const event of acpUpdateToHarnessEvents(update, (id) =>\n this.toolTitles.get(id),\n )) {\n this.queue.push(event);\n }\n }\n\n private async handlePermission(\n params: AcpRequestPermissionRequest,\n ): Promise<AcpPermissionResponse> {\n const toolCall = params.toolCall ?? {};\n const decision = acpAutoPermissionDecision(\n toolCall.kind ?? undefined,\n this.permissionMode,\n );\n if (decision === \"allow\") {\n const optionId = selectAcpPermissionOption(params.options ?? [], true);\n if (optionId) return { outcome: { outcome: \"selected\", optionId } };\n }\n if (!this.queue) {\n // No surface to prompt on: decline rather than hang the agent's turn.\n return buildAcpPermissionResponse(params.options ?? [], false);\n }\n const id = `acp-approval-${++this.approvalCounter}`;\n const response = new Promise<AcpPermissionResponse>((resolve) => {\n this.pendingPermissions.set(id, {\n resolve,\n options: params.options ?? [],\n });\n });\n this.queue.push({\n type: \"approval-request\",\n id,\n tool: toolCall.toolCallId ?? toolCall.title,\n message: toolCall.title\n ? `Approve: ${toolCall.title}`\n : \"Agent is requesting permission\",\n input: toolCall.rawInput,\n });\n return response;\n }\n\n private async handleReadTextFile(\n params: AcpReadTextFileRequest,\n ): Promise<{ content: string }> {\n const abs = resolveAcpWorkspacePath(this.cwd, params.path);\n const raw = await fs.readFile(abs, \"utf8\");\n return { content: sliceTextFile(raw, params.line, params.limit) };\n }\n\n private async handleWriteTextFile(\n params: AcpWriteTextFileRequest,\n ): Promise<Record<string, never>> {\n const abs = resolveAcpWorkspacePath(this.cwd, params.path);\n const existed = await fileExists(abs);\n await fs.mkdir(path.dirname(abs), { recursive: true });\n await fs.writeFile(abs, params.content, \"utf8\");\n this.queue?.push({\n type: \"file-change\",\n path: params.path,\n operation: existed ? \"update\" : \"create\",\n });\n return {};\n }\n\n private rejectAllPending(): void {\n if (this.pendingPermissions.size === 0) return;\n for (const [, pending] of this.pendingPermissions) {\n pending.resolve({ outcome: { outcome: \"cancelled\" } });\n }\n this.pendingPermissions.clear();\n }\n\n private childExitMessage(): string {\n const tail = this.stderrTail.trim();\n const base = `[acp-harness] ${this.command} exited before the turn completed.`;\n return tail ? `${base}\\n${tail.slice(-1_000)}` : base;\n }\n}\n\n// --- Pure helpers (exported for testing) ---\n\n/** Build the ACP prompt content blocks for a turn. */\nexport function buildAcpPromptBlocks(input: {\n prompt?: string;\n messages?: AgentHarnessMessage[];\n}): Array<{ type: \"text\"; text: string }> {\n if (input.prompt && input.prompt.trim()) {\n return [{ type: \"text\", text: input.prompt }];\n }\n const messages = input.messages ?? [];\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === \"user\") {\n const text = messageToText(messages[i].content);\n if (text.trim()) return [{ type: \"text\", text }];\n }\n }\n const joined = messages\n .map((message) => messageToText(message.content))\n .filter(Boolean)\n .join(\"\\n\\n\");\n return [{ type: \"text\", text: joined }];\n}\n\nfunction messageToText(content: string | unknown[]): string {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n return content\n .map((part) => {\n if (typeof part === \"string\") return part;\n if (part && typeof part === \"object\" && \"text\" in part) {\n const text = (part as { text?: unknown }).text;\n return typeof text === \"string\" ? text : \"\";\n }\n return \"\";\n })\n .filter(Boolean)\n .join(\"\");\n}\n\n/**\n * Translate a single ACP `session/update` payload into harness events. Pure and\n * stateless; the caller supplies a resolver for tool titles seen on earlier\n * `tool_call` updates so completion events can be labelled.\n */\nexport function acpUpdateToHarnessEvents(\n update: AcpSessionUpdate,\n titleFor?: (toolCallId: string) => string | undefined,\n): AgentHarnessEvent[] {\n switch (update.sessionUpdate) {\n case \"agent_message_chunk\": {\n const text = acpContentBlockToText(update.content);\n return text ? [{ type: \"text-delta\", text }] : [];\n }\n case \"agent_thought_chunk\": {\n const text = acpContentBlockToText(update.content);\n return text ? [{ type: \"thinking-delta\", text }] : [];\n }\n case \"user_message_chunk\":\n // The user's own message; already in the transcript.\n return [];\n case \"tool_call\": {\n const events: AgentHarnessEvent[] = [\n {\n type: \"tool-start\",\n id: update.toolCallId,\n name: update.title || update.kind || \"tool\",\n input: update.rawInput ?? {},\n },\n ];\n events.push(...acpFileChangeEventsFromToolContent(update.content));\n if (isTerminalToolStatus(update.status)) {\n events.push({\n type: \"tool-done\",\n id: update.toolCallId,\n name: update.title || titleFor?.(update.toolCallId) || \"tool\",\n result: update.rawOutput ?? acpToolContentText(update.content),\n });\n }\n return events;\n }\n case \"tool_call_update\": {\n const content = update.content ?? undefined;\n const events: AgentHarnessEvent[] =\n acpFileChangeEventsFromToolContent(content);\n if (isTerminalToolStatus(update.status)) {\n events.push({\n type: \"tool-done\",\n id: update.toolCallId,\n name: update.title || titleFor?.(update.toolCallId) || \"tool\",\n result: update.rawOutput ?? acpToolContentText(content),\n });\n }\n return events;\n }\n case \"plan\":\n return [\n {\n type: \"activity\",\n label: acpPlanLabel(update.entries),\n tool: \"acp:plan\",\n },\n ];\n case \"available_commands_update\":\n case \"current_mode_update\":\n return [];\n default:\n return [];\n }\n}\n\nfunction isTerminalToolStatus(status: unknown): boolean {\n return status === \"completed\" || status === \"failed\";\n}\n\n/** Extract displayable text from an ACP content block. */\nexport function acpContentBlockToText(\n block: AcpContentBlock | undefined,\n): string {\n if (!block || typeof block !== \"object\") return \"\";\n if (block.type === \"text\")\n return typeof block.text === \"string\" ? block.text : \"\";\n if (block.type === \"resource_link\") {\n const label = block.name || block.uri || \"\";\n return block.uri ? `[${label}](${block.uri})` : label;\n }\n return \"\";\n}\n\nfunction acpToolContentText(\n content: AcpToolCallContent[] | undefined | null,\n): string {\n if (!Array.isArray(content)) return \"\";\n return content\n .map((entry) => {\n if (entry?.type === \"content\")\n return acpContentBlockToText(entry.content);\n if (entry?.type === \"diff\" && entry.path) return `diff: ${entry.path}`;\n return \"\";\n })\n .filter(Boolean)\n .join(\"\\n\");\n}\n\n/** Derive file-change events from a tool call's `diff` content blocks. */\nexport function acpFileChangeEventsFromToolContent(\n content: AcpToolCallContent[] | undefined | null,\n): AgentHarnessEvent[] {\n if (!Array.isArray(content)) return [];\n const events: AgentHarnessEvent[] = [];\n for (const entry of content) {\n if (entry?.type === \"diff\" && typeof entry.path === \"string\") {\n events.push({\n type: \"file-change\",\n path: entry.path,\n operation:\n entry.oldText === null || entry.oldText === undefined\n ? \"create\"\n : \"update\",\n });\n }\n }\n return events;\n}\n\nfunction acpPlanLabel(entries: AcpPlanEntry[] | undefined): string {\n const list = Array.isArray(entries) ? entries : [];\n const total = list.length;\n const done = list.filter((entry) => entry?.status === \"completed\").length;\n const active = list.find((entry) => entry?.status === \"in_progress\");\n const suffix = active?.content ? ` — ${active.content}` : \"\";\n return `Updated plan (${done}/${total})${suffix}`;\n}\n\n/**\n * Map an Agent-Native permission mode onto a decision for an ACP permission\n * request, using the tool-call kind the agent reports. Reads always run; edits\n * run under `allow-edits`; everything risky prompts unless `allow-all`.\n */\nexport function acpAutoPermissionDecision(\n kind: string | undefined,\n mode: AgentHarnessPermissionMode,\n): \"allow\" | \"prompt\" {\n if (mode === \"allow-all\") return \"allow\";\n const resolved = kind ?? \"other\";\n const readish =\n resolved === \"read\" ||\n resolved === \"search\" ||\n resolved === \"fetch\" ||\n resolved === \"think\";\n if (readish) return \"allow\";\n if (mode === \"allow-edits\") {\n return resolved === \"edit\" || resolved === \"move\" ? \"allow\" : \"prompt\";\n }\n return \"prompt\";\n}\n\n/**\n * Pick the option id to return for an ACP permission request. Prefers the\n * \"once\" variant so approvals do not silently become \"always\".\n */\nexport function selectAcpPermissionOption(\n options: AcpPermissionOption[],\n approved: boolean,\n): string | undefined {\n const order = approved\n ? ([\"allow_once\", \"allow_always\"] as const)\n : ([\"reject_once\", \"reject_always\"] as const);\n for (const kind of order) {\n const match = options.find((option) => option?.kind === kind);\n if (match) return match.optionId;\n }\n return undefined;\n}\n\nfunction buildAcpPermissionResponse(\n options: AcpPermissionOption[],\n approved: boolean,\n): AcpPermissionResponse {\n const optionId = selectAcpPermissionOption(options, approved);\n if (optionId) return { outcome: { outcome: \"selected\", optionId } };\n return { outcome: { outcome: \"cancelled\" } };\n}\n\n/**\n * Resolve a path requested by the agent against the session workspace, refusing\n * anything that escapes it. The agent already has its own filesystem tools;\n * this `fs/*` surface is a scoped convenience, not an arbitrary read/write hole.\n */\nexport function resolveAcpWorkspacePath(\n cwd: string,\n requestedPath: string,\n): string {\n if (typeof requestedPath !== \"string\" || requestedPath.length === 0) {\n throw new Error(\"[acp-harness] File path must be a non-empty string.\");\n }\n const normalizedCwd = path.resolve(cwd);\n const abs = path.isAbsolute(requestedPath)\n ? path.resolve(requestedPath)\n : path.resolve(normalizedCwd, requestedPath);\n const rel = path.relative(normalizedCwd, abs);\n if (rel === \"\") return abs;\n if (rel === \"..\" || rel.startsWith(`..${path.sep}`) || path.isAbsolute(rel)) {\n throw new Error(\n `[acp-harness] Refusing file access outside the session workspace: ${requestedPath}`,\n );\n }\n return abs;\n}\n\nfunction sliceTextFile(\n content: string,\n line?: number | null,\n limit?: number | null,\n): string {\n if (line == null && limit == null) return content;\n const lines = content.split(\"\\n\");\n const start = line && line > 0 ? line - 1 : 0;\n const end = limit && limit > 0 ? start + limit : lines.length;\n return lines.slice(start, end).join(\"\\n\");\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction acpErrorMessage(error: unknown): string {\n if (error && typeof error === \"object\") {\n const record = error as { message?: unknown; code?: unknown };\n if (typeof record.message === \"string\" && record.message) {\n return record.message;\n }\n if (record.code !== undefined) {\n return `ACP request failed (code ${String(record.code)})`;\n }\n }\n return typeof error === \"string\" ? error : \"ACP request failed\";\n}\n\n// --- Minimal structural mirrors of the ACP schema (avoids a build-time dep) ---\n\ninterface AcpContentBlock {\n type: string;\n text?: string;\n uri?: string;\n name?: string;\n [key: string]: unknown;\n}\n\ninterface AcpToolCallContent {\n type: string;\n content?: AcpContentBlock;\n path?: string;\n oldText?: string | null;\n newText?: string;\n terminalId?: string;\n}\n\ninterface AcpPlanEntry {\n content?: string;\n status?: string;\n priority?: string;\n}\n\nexport type AcpSessionUpdate =\n | {\n sessionUpdate:\n | \"agent_message_chunk\"\n | \"user_message_chunk\"\n | \"agent_thought_chunk\";\n content: AcpContentBlock;\n }\n | {\n sessionUpdate: \"tool_call\";\n toolCallId: string;\n title: string;\n kind?: string;\n status?: string;\n content?: AcpToolCallContent[];\n rawInput?: Record<string, unknown>;\n rawOutput?: Record<string, unknown>;\n locations?: unknown[];\n }\n | {\n sessionUpdate: \"tool_call_update\";\n toolCallId: string;\n title?: string | null;\n kind?: string | null;\n status?: string | null;\n content?: AcpToolCallContent[] | null;\n rawInput?: Record<string, unknown>;\n rawOutput?: Record<string, unknown>;\n }\n | { sessionUpdate: \"plan\"; entries: AcpPlanEntry[] }\n | { sessionUpdate: \"available_commands_update\"; availableCommands: unknown[] }\n | { sessionUpdate: \"current_mode_update\"; currentModeId: string };\n\ninterface AcpSessionNotification {\n sessionId: string;\n update: AcpSessionUpdate;\n}\n\ninterface AcpPermissionOption {\n optionId: string;\n name: string;\n kind: \"allow_once\" | \"allow_always\" | \"reject_once\" | \"reject_always\";\n}\n\ninterface AcpRequestPermissionRequest {\n sessionId: string;\n options: AcpPermissionOption[];\n toolCall: {\n toolCallId?: string;\n title?: string;\n kind?: string | null;\n rawInput?: Record<string, unknown>;\n };\n}\n\ntype AcpPermissionResponse = {\n outcome: { outcome: \"selected\"; optionId: string } | { outcome: \"cancelled\" };\n};\n\ninterface AcpReadTextFileRequest {\n sessionId: string;\n path: string;\n line?: number | null;\n limit?: number | null;\n}\n\ninterface AcpWriteTextFileRequest {\n sessionId: string;\n path: string;\n content: string;\n}\n\ninterface AcpPromptResponse {\n stopReason?: string;\n}\n\n/** Minimal async queue bridging ACP's callback updates to an async iterable. */\nclass AsyncEventQueue<T> implements AsyncIterable<T> {\n private readonly values: T[] = [];\n private readonly resolvers: Array<(result: IteratorResult<T>) => void> = [];\n private closed = false;\n\n push(value: T): void {\n if (this.closed) return;\n const resolver = this.resolvers.shift();\n if (resolver) resolver({ value, done: false });\n else this.values.push(value);\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n let resolver: ((result: IteratorResult<T>) => void) | undefined;\n while ((resolver = this.resolvers.shift())) {\n resolver({ value: undefined as never, done: true });\n }\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return {\n next: (): Promise<IteratorResult<T>> => {\n if (this.values.length > 0) {\n return Promise.resolve({\n value: this.values.shift() as T,\n done: false,\n });\n }\n if (this.closed) {\n return Promise.resolve({ value: undefined as never, done: true });\n }\n return new Promise<IteratorResult<T>>((resolve) => {\n this.resolvers.push(resolve);\n });\n },\n };\n }\n}\n"]}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Built-in ACP harness presets.
3
+ *
4
+ * These register convenient defaults for known ACP-compliant local coding
5
+ * agents. Each preset's command/args are overridable through the resolve
6
+ * config, e.g.
7
+ *
8
+ * resolveAgentHarness("acp:gemini", { command: "gemini" });
9
+ *
10
+ * The default commands launch the agents through `npx` so they work without a
11
+ * prior global install. They are documented and overridable because agent CLIs
12
+ * still evolve their ACP entry flags.
13
+ */
14
+ interface AcpPreset {
15
+ name: string;
16
+ label: string;
17
+ description: string;
18
+ command: string;
19
+ args: string[];
20
+ }
21
+ export declare const BUILTIN_ACP_PRESETS: AcpPreset[];
22
+ /** Register the built-in ACP presets. */
23
+ export declare function registerBuiltinAcpHarnesses(): void;
24
+ export {};
25
+ //# sourceMappingURL=acp-builtin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-builtin.d.ts","sourceRoot":"","sources":["../../../src/agent/harness/acp-builtin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,eAAO,MAAM,mBAAmB,EAAE,SAAS,EAe1C,CAAC;AAEF,yCAAyC;AACzC,wBAAgB,2BAA2B,IAAI,IAAI,CAuBlD"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Built-in ACP harness presets.
3
+ *
4
+ * These register convenient defaults for known ACP-compliant local coding
5
+ * agents. Each preset's command/args are overridable through the resolve
6
+ * config, e.g.
7
+ *
8
+ * resolveAgentHarness("acp:gemini", { command: "gemini" });
9
+ *
10
+ * The default commands launch the agents through `npx` so they work without a
11
+ * prior global install. They are documented and overridable because agent CLIs
12
+ * still evolve their ACP entry flags.
13
+ */
14
+ import { createAcpHarnessAdapter, } from "./acp-adapter.js";
15
+ import { registerAgentHarness } from "./registry.js";
16
+ export const BUILTIN_ACP_PRESETS = [
17
+ {
18
+ name: "acp:gemini",
19
+ label: "Gemini CLI (ACP)",
20
+ description: "Drives the Gemini CLI as a local ACP coding agent.",
21
+ command: "npx",
22
+ args: ["-y", "@google/gemini-cli", "--experimental-acp"],
23
+ },
24
+ {
25
+ name: "acp:claude-code",
26
+ label: "Claude Code (ACP)",
27
+ description: "Drives Claude Code as a local ACP coding agent.",
28
+ command: "npx",
29
+ args: ["-y", "@zed-industries/claude-code-acp"],
30
+ },
31
+ ];
32
+ /** Register the built-in ACP presets. */
33
+ export function registerBuiltinAcpHarnesses() {
34
+ for (const preset of BUILTIN_ACP_PRESETS) {
35
+ registerAgentHarness({
36
+ name: preset.name,
37
+ label: preset.label,
38
+ description: preset.description,
39
+ installPackage: createAcpHarnessAdapter({ command: preset.command })
40
+ .installPackage,
41
+ capabilities: createAcpHarnessAdapter({ command: preset.command })
42
+ .capabilities,
43
+ create: (config) => {
44
+ const overrides = (config ?? {});
45
+ return createAcpHarnessAdapter({
46
+ name: preset.name,
47
+ label: preset.label,
48
+ description: preset.description,
49
+ command: preset.command,
50
+ args: preset.args,
51
+ ...overrides,
52
+ });
53
+ },
54
+ });
55
+ }
56
+ }
57
+ //# sourceMappingURL=acp-builtin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-builtin.js","sourceRoot":"","sources":["../../../src/agent/harness/acp-builtin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,uBAAuB,GAExB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAUrD,MAAM,CAAC,MAAM,mBAAmB,GAAgB;IAC9C;QACE,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,oDAAoD;QACjE,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,CAAC,IAAI,EAAE,oBAAoB,EAAE,oBAAoB,CAAC;KACzD;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,iDAAiD;QAC9D,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,CAAC,IAAI,EAAE,iCAAiC,CAAC;KAChD;CACF,CAAC;AAEF,yCAAyC;AACzC,MAAM,UAAU,2BAA2B;IACzC,KAAK,MAAM,MAAM,IAAI,mBAAmB,EAAE,CAAC;QACzC,oBAAoB,CAAC;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,cAAc,EAAE,uBAAuB,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;iBACjE,cAAc;YACjB,YAAY,EAAE,uBAAuB,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;iBAC/D,YAAY;YACf,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;gBACjB,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,EAAE,CAAsC,CAAC;gBACtE,OAAO,uBAAuB,CAAC;oBAC7B,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,GAAG,SAAS;iBACb,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;IACL,CAAC;AACH,CAAC","sourcesContent":["/**\n * Built-in ACP harness presets.\n *\n * These register convenient defaults for known ACP-compliant local coding\n * agents. Each preset's command/args are overridable through the resolve\n * config, e.g.\n *\n * resolveAgentHarness(\"acp:gemini\", { command: \"gemini\" });\n *\n * The default commands launch the agents through `npx` so they work without a\n * prior global install. They are documented and overridable because agent CLIs\n * still evolve their ACP entry flags.\n */\n\nimport {\n createAcpHarnessAdapter,\n type AcpHarnessAdapterOptions,\n} from \"./acp-adapter.js\";\nimport { registerAgentHarness } from \"./registry.js\";\n\ninterface AcpPreset {\n name: string;\n label: string;\n description: string;\n command: string;\n args: string[];\n}\n\nexport const BUILTIN_ACP_PRESETS: AcpPreset[] = [\n {\n name: \"acp:gemini\",\n label: \"Gemini CLI (ACP)\",\n description: \"Drives the Gemini CLI as a local ACP coding agent.\",\n command: \"npx\",\n args: [\"-y\", \"@google/gemini-cli\", \"--experimental-acp\"],\n },\n {\n name: \"acp:claude-code\",\n label: \"Claude Code (ACP)\",\n description: \"Drives Claude Code as a local ACP coding agent.\",\n command: \"npx\",\n args: [\"-y\", \"@zed-industries/claude-code-acp\"],\n },\n];\n\n/** Register the built-in ACP presets. */\nexport function registerBuiltinAcpHarnesses(): void {\n for (const preset of BUILTIN_ACP_PRESETS) {\n registerAgentHarness({\n name: preset.name,\n label: preset.label,\n description: preset.description,\n installPackage: createAcpHarnessAdapter({ command: preset.command })\n .installPackage,\n capabilities: createAcpHarnessAdapter({ command: preset.command })\n .capabilities,\n create: (config) => {\n const overrides = (config ?? {}) as Partial<AcpHarnessAdapterOptions>;\n return createAcpHarnessAdapter({\n name: preset.name,\n label: preset.label,\n description: preset.description,\n command: preset.command,\n args: preset.args,\n ...overrides,\n });\n },\n });\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"builtin.d.ts","sourceRoot":"","sources":["../../../src/agent/harness/builtin.ts"],"names":[],"mappings":"AAYA,wBAAgB,6BAA6B,IAAI,IAAI,CAgBpD"}
1
+ {"version":3,"file":"builtin.d.ts","sourceRoot":"","sources":["../../../src/agent/harness/builtin.ts"],"names":[],"mappings":"AAiBA,wBAAgB,6BAA6B,IAAI,IAAI,CAgCpD"}
@@ -1,3 +1,5 @@
1
+ import { createAcpHarnessAdapter, } from "./acp-adapter.js";
2
+ import { registerBuiltinAcpHarnesses } from "./acp-builtin.js";
1
3
  import { createAiSdkHarnessAdapter, } from "./ai-sdk-adapter.js";
2
4
  import { registerAgentHarness } from "./registry.js";
3
5
  const AI_SDK_HARNESS_RUNTIMES = [
@@ -20,5 +22,18 @@ export function registerBuiltinAgentHarnesses() {
20
22
  }),
21
23
  });
22
24
  }
25
+ // Generic ACP entry: resolve with { command, args } for any ACP agent.
26
+ const acpAdapter = createAcpHarnessAdapter({ command: "acp" });
27
+ registerAgentHarness({
28
+ name: "acp",
29
+ label: "ACP Agent",
30
+ description: "Drives a local ACP-compliant coding agent over stdio.",
31
+ installPackage: acpAdapter.installPackage,
32
+ capabilities: acpAdapter.capabilities,
33
+ create: (config) => createAcpHarnessAdapter({
34
+ ...(config ?? {}),
35
+ }),
36
+ });
37
+ registerBuiltinAcpHarnesses();
23
38
  }
24
39
  //# sourceMappingURL=builtin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"builtin.js","sourceRoot":"","sources":["../../../src/agent/harness/builtin.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,GAE1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,uBAAuB,GAA0B;IACrD,aAAa;IACb,OAAO;IACP,IAAI;CACL,CAAC;AAEF,MAAM,UAAU,6BAA6B;IAC3C,KAAK,MAAM,OAAO,IAAI,uBAAuB,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,yBAAyB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QACvD,oBAAoB,CAAC;YACnB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CACjB,yBAAyB,CAAC;gBACxB,OAAO;gBACP,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;aACiC,CAAC;SACxD,CAAC,CAAC;IACL,CAAC;AACH,CAAC","sourcesContent":["import {\n createAiSdkHarnessAdapter,\n type AiSdkHarnessRuntime,\n} from \"./ai-sdk-adapter.js\";\nimport { registerAgentHarness } from \"./registry.js\";\n\nconst AI_SDK_HARNESS_RUNTIMES: AiSdkHarnessRuntime[] = [\n \"claude-code\",\n \"codex\",\n \"pi\",\n];\n\nexport function registerBuiltinAgentHarnesses(): void {\n for (const runtime of AI_SDK_HARNESS_RUNTIMES) {\n const adapter = createAiSdkHarnessAdapter({ runtime });\n registerAgentHarness({\n name: adapter.name,\n label: adapter.label,\n description: adapter.description,\n installPackage: adapter.installPackage,\n capabilities: adapter.capabilities,\n create: (config) =>\n createAiSdkHarnessAdapter({\n runtime,\n ...(config ?? {}),\n } as Parameters<typeof createAiSdkHarnessAdapter>[0]),\n });\n }\n}\n"]}
1
+ {"version":3,"file":"builtin.js","sourceRoot":"","sources":["../../../src/agent/harness/builtin.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,GAExB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EACL,yBAAyB,GAE1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,uBAAuB,GAA0B;IACrD,aAAa;IACb,OAAO;IACP,IAAI;CACL,CAAC;AAEF,MAAM,UAAU,6BAA6B;IAC3C,KAAK,MAAM,OAAO,IAAI,uBAAuB,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,yBAAyB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QACvD,oBAAoB,CAAC;YACnB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CACjB,yBAAyB,CAAC;gBACxB,OAAO;gBACP,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;aACiC,CAAC;SACxD,CAAC,CAAC;IACL,CAAC;IAED,uEAAuE;IACvE,MAAM,UAAU,GAAG,uBAAuB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,oBAAoB,CAAC;QACnB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,uDAAuD;QACpE,cAAc,EAAE,UAAU,CAAC,cAAc;QACzC,YAAY,EAAE,UAAU,CAAC,YAAY;QACrC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CACjB,uBAAuB,CAAC;YACtB,GAAI,CAAC,MAAM,IAAI,EAAE,CAAuC;SACzD,CAAC;KACL,CAAC,CAAC;IAEH,2BAA2B,EAAE,CAAC;AAChC,CAAC","sourcesContent":["import {\n createAcpHarnessAdapter,\n type AcpHarnessAdapterOptions,\n} from \"./acp-adapter.js\";\nimport { registerBuiltinAcpHarnesses } from \"./acp-builtin.js\";\nimport {\n createAiSdkHarnessAdapter,\n type AiSdkHarnessRuntime,\n} from \"./ai-sdk-adapter.js\";\nimport { registerAgentHarness } from \"./registry.js\";\n\nconst AI_SDK_HARNESS_RUNTIMES: AiSdkHarnessRuntime[] = [\n \"claude-code\",\n \"codex\",\n \"pi\",\n];\n\nexport function registerBuiltinAgentHarnesses(): void {\n for (const runtime of AI_SDK_HARNESS_RUNTIMES) {\n const adapter = createAiSdkHarnessAdapter({ runtime });\n registerAgentHarness({\n name: adapter.name,\n label: adapter.label,\n description: adapter.description,\n installPackage: adapter.installPackage,\n capabilities: adapter.capabilities,\n create: (config) =>\n createAiSdkHarnessAdapter({\n runtime,\n ...(config ?? {}),\n } as Parameters<typeof createAiSdkHarnessAdapter>[0]),\n });\n }\n\n // Generic ACP entry: resolve with { command, args } for any ACP agent.\n const acpAdapter = createAcpHarnessAdapter({ command: \"acp\" });\n registerAgentHarness({\n name: \"acp\",\n label: \"ACP Agent\",\n description: \"Drives a local ACP-compliant coding agent over stdio.\",\n installPackage: acpAdapter.installPackage,\n capabilities: acpAdapter.capabilities,\n create: (config) =>\n createAcpHarnessAdapter({\n ...((config ?? {}) as Partial<AcpHarnessAdapterOptions>),\n }),\n });\n\n registerBuiltinAcpHarnesses();\n}\n"]}
@@ -4,6 +4,8 @@ export { getAgentHarnessEntry, isAgentHarnessPackageInstalled, listAgentHarnesse
4
4
  export { ensureAgentHarnessSessionTables, getAgentHarnessSession, getAgentHarnessSessionByRunId, getLatestAgentHarnessSessionForThread, listAgentHarnessSessions, markAgentHarnessSessionStopped, saveAgentHarnessSession, updateAgentHarnessSession, type AgentHarnessSessionStatus, type SaveAgentHarnessSessionInput, type StoredAgentHarnessSession, } from "./store.js";
5
5
  export { sendAgentHarnessEvent, startAgentHarnessRun, type StartAgentHarnessRunOptions, } from "./runner.js";
6
6
  export { aiSdkHarnessPartToEvents, createAiSdkHarnessAdapter, type AiSdkHarnessAdapterOptions, type AiSdkHarnessRuntime, type CodexCliAuthConfig, } from "./ai-sdk-adapter.js";
7
+ export { ACP_PACKAGE, acpAutoPermissionDecision, acpContentBlockToText, acpFileChangeEventsFromToolContent, acpUpdateToHarnessEvents, buildAcpPromptBlocks, createAcpHarnessAdapter, resolveAcpWorkspacePath, selectAcpPermissionOption, type AcpHarnessAdapterOptions, type AcpSessionUpdate, } from "./acp-adapter.js";
8
+ export { BUILTIN_ACP_PRESETS, registerBuiltinAcpHarnesses, } from "./acp-builtin.js";
7
9
  export { registerBuiltinAgentHarnesses } from "./builtin.js";
8
10
  export { agentHarnessBackgroundAgentController, createAgentHarnessBackgroundAgentController, getAgentHarnessBackgroundRun, listAgentHarnessBackgroundRuns, listAgentHarnessBackgroundTranscriptEvents, stopAgentHarnessBackgroundRun, } from "./background.js";
9
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/harness/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,EACzB,gCAAgC,EAChC,iBAAiB,EACjB,mBAAmB,EACnB,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,kCAAkC,EAClC,eAAe,IAAI,2BAA2B,GAC/C,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,oBAAoB,EACpB,8BAA8B,EAC9B,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,KAAK,iBAAiB,GACvB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,+BAA+B,EAC/B,sBAAsB,EACtB,6BAA6B,EAC7B,qCAAqC,EACrC,wBAAwB,EACxB,8BAA8B,EAC9B,uBAAuB,EACvB,yBAAyB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,GAC/B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,2BAA2B,GACjC,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EACL,qCAAqC,EACrC,2CAA2C,EAC3C,4BAA4B,EAC5B,8BAA8B,EAC9B,0CAA0C,EAC1C,6BAA6B,GAC9B,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/harness/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,EACzB,gCAAgC,EAChC,iBAAiB,EACjB,mBAAmB,EACnB,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,kCAAkC,EAClC,eAAe,IAAI,2BAA2B,GAC/C,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,oBAAoB,EACpB,8BAA8B,EAC9B,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,KAAK,iBAAiB,GACvB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,+BAA+B,EAC/B,sBAAsB,EACtB,6BAA6B,EAC7B,qCAAqC,EACrC,wBAAwB,EACxB,8BAA8B,EAC9B,uBAAuB,EACvB,yBAAyB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,GAC/B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,2BAA2B,GACjC,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,WAAW,EACX,yBAAyB,EACzB,qBAAqB,EACrB,kCAAkC,EAClC,wBAAwB,EACxB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EACL,qCAAqC,EACrC,2CAA2C,EAC3C,4BAA4B,EAC5B,8BAA8B,EAC9B,0CAA0C,EAC1C,6BAA6B,GAC9B,MAAM,iBAAiB,CAAC"}
@@ -3,6 +3,8 @@ export { getAgentHarnessEntry, isAgentHarnessPackageInstalled, listAgentHarnesse
3
3
  export { ensureAgentHarnessSessionTables, getAgentHarnessSession, getAgentHarnessSessionByRunId, getLatestAgentHarnessSessionForThread, listAgentHarnessSessions, markAgentHarnessSessionStopped, saveAgentHarnessSession, updateAgentHarnessSession, } from "./store.js";
4
4
  export { sendAgentHarnessEvent, startAgentHarnessRun, } from "./runner.js";
5
5
  export { aiSdkHarnessPartToEvents, createAiSdkHarnessAdapter, } from "./ai-sdk-adapter.js";
6
+ export { ACP_PACKAGE, acpAutoPermissionDecision, acpContentBlockToText, acpFileChangeEventsFromToolContent, acpUpdateToHarnessEvents, buildAcpPromptBlocks, createAcpHarnessAdapter, resolveAcpWorkspacePath, selectAcpPermissionOption, } from "./acp-adapter.js";
7
+ export { BUILTIN_ACP_PRESETS, registerBuiltinAcpHarnesses, } from "./acp-builtin.js";
6
8
  export { registerBuiltinAgentHarnesses } from "./builtin.js";
7
9
  export { agentHarnessBackgroundAgentController, createAgentHarnessBackgroundAgentController, getAgentHarnessBackgroundRun, listAgentHarnessBackgroundRuns, listAgentHarnessBackgroundTranscriptEvents, stopAgentHarnessBackgroundRun, } from "./background.js";
8
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent/harness/index.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,kCAAkC,EAClC,eAAe,IAAI,2BAA2B,GAC/C,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,oBAAoB,EACpB,8BAA8B,EAC9B,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,GAEpB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,+BAA+B,EAC/B,sBAAsB,EACtB,6BAA6B,EAC7B,qCAAqC,EACrC,wBAAwB,EACxB,8BAA8B,EAC9B,uBAAuB,EACvB,yBAAyB,GAI1B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GAErB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,wBAAwB,EACxB,yBAAyB,GAI1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EACL,qCAAqC,EACrC,2CAA2C,EAC3C,4BAA4B,EAC5B,8BAA8B,EAC9B,0CAA0C,EAC1C,6BAA6B,GAC9B,MAAM,iBAAiB,CAAC","sourcesContent":["export type {\n AgentHarnessAdapter,\n AgentHarnessApproval,\n AgentHarnessCapabilities,\n AgentHarnessContinueInput,\n AgentHarnessCreateSessionOptions,\n AgentHarnessEvent,\n AgentHarnessMessage,\n AgentHarnessPermissionMode,\n AgentHarnessSession,\n AgentHarnessTurnInput,\n} from \"./types.js\";\nexport {\n agentHarnessEventToAgentChatEvents,\n stringifyResult as stringifyAgentHarnessResult,\n} from \"./translate.js\";\nexport {\n getAgentHarnessEntry,\n isAgentHarnessPackageInstalled,\n listAgentHarnesses,\n registerAgentHarness,\n resolveAgentHarness,\n type AgentHarnessEntry,\n} from \"./registry.js\";\nexport {\n ensureAgentHarnessSessionTables,\n getAgentHarnessSession,\n getAgentHarnessSessionByRunId,\n getLatestAgentHarnessSessionForThread,\n listAgentHarnessSessions,\n markAgentHarnessSessionStopped,\n saveAgentHarnessSession,\n updateAgentHarnessSession,\n type AgentHarnessSessionStatus,\n type SaveAgentHarnessSessionInput,\n type StoredAgentHarnessSession,\n} from \"./store.js\";\nexport {\n sendAgentHarnessEvent,\n startAgentHarnessRun,\n type StartAgentHarnessRunOptions,\n} from \"./runner.js\";\nexport {\n aiSdkHarnessPartToEvents,\n createAiSdkHarnessAdapter,\n type AiSdkHarnessAdapterOptions,\n type AiSdkHarnessRuntime,\n type CodexCliAuthConfig,\n} from \"./ai-sdk-adapter.js\";\nexport { registerBuiltinAgentHarnesses } from \"./builtin.js\";\nexport {\n agentHarnessBackgroundAgentController,\n createAgentHarnessBackgroundAgentController,\n getAgentHarnessBackgroundRun,\n listAgentHarnessBackgroundRuns,\n listAgentHarnessBackgroundTranscriptEvents,\n stopAgentHarnessBackgroundRun,\n} from \"./background.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent/harness/index.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,kCAAkC,EAClC,eAAe,IAAI,2BAA2B,GAC/C,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,oBAAoB,EACpB,8BAA8B,EAC9B,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,GAEpB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,+BAA+B,EAC/B,sBAAsB,EACtB,6BAA6B,EAC7B,qCAAqC,EACrC,wBAAwB,EACxB,8BAA8B,EAC9B,uBAAuB,EACvB,yBAAyB,GAI1B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GAErB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,wBAAwB,EACxB,yBAAyB,GAI1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,WAAW,EACX,yBAAyB,EACzB,qBAAqB,EACrB,kCAAkC,EAClC,wBAAwB,EACxB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,GAG1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EACL,qCAAqC,EACrC,2CAA2C,EAC3C,4BAA4B,EAC5B,8BAA8B,EAC9B,0CAA0C,EAC1C,6BAA6B,GAC9B,MAAM,iBAAiB,CAAC","sourcesContent":["export type {\n AgentHarnessAdapter,\n AgentHarnessApproval,\n AgentHarnessCapabilities,\n AgentHarnessContinueInput,\n AgentHarnessCreateSessionOptions,\n AgentHarnessEvent,\n AgentHarnessMessage,\n AgentHarnessPermissionMode,\n AgentHarnessSession,\n AgentHarnessTurnInput,\n} from \"./types.js\";\nexport {\n agentHarnessEventToAgentChatEvents,\n stringifyResult as stringifyAgentHarnessResult,\n} from \"./translate.js\";\nexport {\n getAgentHarnessEntry,\n isAgentHarnessPackageInstalled,\n listAgentHarnesses,\n registerAgentHarness,\n resolveAgentHarness,\n type AgentHarnessEntry,\n} from \"./registry.js\";\nexport {\n ensureAgentHarnessSessionTables,\n getAgentHarnessSession,\n getAgentHarnessSessionByRunId,\n getLatestAgentHarnessSessionForThread,\n listAgentHarnessSessions,\n markAgentHarnessSessionStopped,\n saveAgentHarnessSession,\n updateAgentHarnessSession,\n type AgentHarnessSessionStatus,\n type SaveAgentHarnessSessionInput,\n type StoredAgentHarnessSession,\n} from \"./store.js\";\nexport {\n sendAgentHarnessEvent,\n startAgentHarnessRun,\n type StartAgentHarnessRunOptions,\n} from \"./runner.js\";\nexport {\n aiSdkHarnessPartToEvents,\n createAiSdkHarnessAdapter,\n type AiSdkHarnessAdapterOptions,\n type AiSdkHarnessRuntime,\n type CodexCliAuthConfig,\n} from \"./ai-sdk-adapter.js\";\nexport {\n ACP_PACKAGE,\n acpAutoPermissionDecision,\n acpContentBlockToText,\n acpFileChangeEventsFromToolContent,\n acpUpdateToHarnessEvents,\n buildAcpPromptBlocks,\n createAcpHarnessAdapter,\n resolveAcpWorkspacePath,\n selectAcpPermissionOption,\n type AcpHarnessAdapterOptions,\n type AcpSessionUpdate,\n} from \"./acp-adapter.js\";\nexport {\n BUILTIN_ACP_PRESETS,\n registerBuiltinAcpHarnesses,\n} from \"./acp-builtin.js\";\nexport { registerBuiltinAgentHarnesses } from \"./builtin.js\";\nexport {\n agentHarnessBackgroundAgentController,\n createAgentHarnessBackgroundAgentController,\n getAgentHarnessBackgroundRun,\n listAgentHarnessBackgroundRuns,\n listAgentHarnessBackgroundTranscriptEvents,\n stopAgentHarnessBackgroundRun,\n} from \"./background.js\";\n"]}
@@ -7,7 +7,7 @@ import { cn } from "./utils.js";
7
7
  import { useSession } from "./use-session.js";
8
8
  import { getFeedbackClientContext } from "./feedback-context.js";
9
9
  const DEFAULT_FEEDBACK_URL = "https://forms.agent-native.com/f/agent-native-feedback/_16ewV";
10
- const DEFAULT_PLACEHOLDER = 'What\'s working, what\'s broken, or what would you change?\n\ne.g. "The Send button isn\'t obvious", "I wish I could change the theme", "Search is slow when…"';
10
+ const DEFAULT_PLACEHOLDER = "What's working, what's broken, or what would you change?";
11
11
  const DEFAULT_SUBMIT_TEXT = "Send feedback";
12
12
  const DEFAULT_SUCCESS_MESSAGE = "Thanks for the feedback!";
13
13
  function parseTarget(url) {
@@ -1 +1 @@
1
- {"version":3,"file":"FeedbackButton.js","sourceRoot":"","sources":["../../src/client/FeedbackButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n useState,\n useEffect,\n useRef,\n useCallback,\n type CSSProperties,\n type FormEvent,\n type ReactNode,\n} from \"react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport { IconMessage2, IconCheck } from \"@tabler/icons-react\";\nimport { cn } from \"./utils.js\";\nimport { useSession } from \"./use-session.js\";\nimport { getFeedbackClientContext } from \"./feedback-context.js\";\n\nconst DEFAULT_FEEDBACK_URL =\n \"https://forms.agent-native.com/f/agent-native-feedback/_16ewV\";\n\ninterface ParsedTarget {\n endpoint: string;\n slug: string;\n}\n\ninterface FormSchema {\n formId: string;\n fieldId: string;\n}\n\nconst DEFAULT_PLACEHOLDER =\n 'What\\'s working, what\\'s broken, or what would you change?\\n\\ne.g. \"The Send button isn\\'t obvious\", \"I wish I could change the theme\", \"Search is slow when…\"';\nconst DEFAULT_SUBMIT_TEXT = \"Send feedback\";\nconst DEFAULT_SUCCESS_MESSAGE = \"Thanks for the feedback!\";\n\nfunction parseTarget(url: string): ParsedTarget | null {\n try {\n const u = new URL(url);\n const idx = u.pathname.indexOf(\"/f/\");\n if (idx === -1) return null;\n const slug = u.pathname.slice(idx + 3).replace(/\\/$/, \"\");\n if (!slug) return null;\n return { endpoint: u.origin, slug };\n } catch {\n return null;\n }\n}\n\nconst schemaCache = new Map<string, Promise<FormSchema>>();\n\nasync function loadSchema(target: ParsedTarget): Promise<FormSchema> {\n const key = `${target.endpoint}|${target.slug}`;\n let pending = schemaCache.get(key);\n if (pending) return pending;\n pending = (async () => {\n const res = await fetch(\n `${target.endpoint}/api/forms/public/${encodeURIComponent(target.slug)}`,\n { headers: { Accept: \"application/json\" } },\n );\n if (!res.ok) throw new Error(`form fetch ${res.status}`);\n const body = (await res.json()) as {\n id: string;\n fields: Array<{ id: string; type: string }>;\n };\n const field =\n body.fields.find((f) => f.type === \"textarea\") ??\n body.fields.find((f) => f.type === \"text\") ??\n body.fields[0];\n if (!field) throw new Error(\"form has no fields\");\n return { formId: body.id, fieldId: field.id };\n })();\n pending.catch(() => schemaCache.delete(key));\n schemaCache.set(key, pending);\n return pending;\n}\n\nexport interface FeedbackButtonProps {\n /**\n * \"sidebar\" renders a full-width row with icon + label (for app left sidebars).\n * \"icon\" renders a small icon-only button (for dense toolbars, e.g. the agent panel header).\n * \"outlined\" renders an outlined pill button with icon + label (for top-nav bars, e.g. docs).\n */\n variant?: \"sidebar\" | \"icon\" | \"outlined\";\n label?: string;\n url?: string;\n className?: string;\n /** Which side the popover opens on. Defaults match the variant. */\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n align?: \"start\" | \"center\" | \"end\";\n /** Placeholder text for the textarea. */\n placeholder?: string;\n /** Current chat session/thread id, when the host already knows it. */\n chatSessionId?: string | null;\n /** Chat localStorage namespace, when the host uses per-app chat storage. */\n chatStorageKey?: string | null;\n /** Controlled popover open state for hosts that trigger feedback from a menu. */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Optional custom trigger element. */\n trigger?: ReactNode;\n}\n\nconst surfaceStyle: CSSProperties = {\n width: \"min(380px, calc(100vw - 32px))\",\n};\n\nconst honeypotStyle: CSSProperties = {\n position: \"absolute\",\n left: \"-10000px\",\n top: \"auto\",\n width: \"1px\",\n height: \"1px\",\n overflow: \"hidden\",\n};\n\nexport function FeedbackButton({\n variant = \"sidebar\",\n label = \"Feedback\",\n url = DEFAULT_FEEDBACK_URL,\n className,\n side,\n align = \"end\",\n placeholder,\n chatSessionId,\n chatStorageKey,\n open: controlledOpen,\n onOpenChange,\n trigger: customTrigger,\n}: FeedbackButtonProps) {\n const target = parseTarget(url);\n const { session } = useSession();\n\n const [uncontrolledOpen, setUncontrolledOpen] = useState(false);\n const open = controlledOpen ?? uncontrolledOpen;\n const setOpen = useCallback(\n (nextOpen: boolean) => {\n if (controlledOpen === undefined) setUncontrolledOpen(nextOpen);\n onOpenChange?.(nextOpen);\n },\n [controlledOpen, onOpenChange],\n );\n const [value, setValue] = useState(\"\");\n const [honeypot, setHoneypot] = useState(\"\");\n const [submitting, setSubmitting] = useState(false);\n const [submitted, setSubmitted] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [schema, setSchema] = useState<FormSchema | null>(null);\n const openedAtRef = useRef<number>(0);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n\n // Reset transient state and kick off schema load on each open.\n useEffect(() => {\n if (!open) return;\n openedAtRef.current = Date.now();\n setValue(\"\");\n setHoneypot(\"\");\n setSubmitting(false);\n setSubmitted(false);\n setError(null);\n setSchema(null);\n if (target) {\n loadSchema(target)\n .then((s) => setSchema(s))\n .catch((err) => {\n console.error(\"[FeedbackButton] schema load failed\", err);\n setError(\"Couldn't load feedback form\");\n });\n } else {\n setError(\"Invalid feedback URL\");\n }\n const t = setTimeout(() => textareaRef.current?.focus(), 30);\n return () => {\n clearTimeout(t);\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n };\n }, [open, url]);\n\n const submit = useCallback(\n async (e?: FormEvent) => {\n e?.preventDefault();\n if (!target || submitting) return;\n const trimmed = value.trim();\n if (!trimmed) {\n setError(\"Please write something first\");\n return;\n }\n setSubmitting(true);\n setError(null);\n try {\n const resolvedSchema = schema ?? (await loadSchema(target));\n if (!schema) setSchema(resolvedSchema);\n const submitterEmail = session?.email;\n const feedbackContext = getFeedbackClientContext({\n chatSessionId,\n storageKey: chatStorageKey,\n });\n const res = await fetch(\n `${target.endpoint}/api/submit/${encodeURIComponent(resolvedSchema.formId)}`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n data: { [resolvedSchema.fieldId]: trimmed },\n _t: openedAtRef.current,\n _hp: honeypot,\n _meta: {\n ...(submitterEmail ? { submitterEmail } : {}),\n ...feedbackContext,\n },\n }),\n },\n );\n if (!res.ok) {\n const body = (await res.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(body.error || `submit failed (${res.status})`);\n }\n setSubmitted(true);\n closeTimerRef.current = setTimeout(() => setOpen(false), 1400);\n } catch (err) {\n setSubmitting(false);\n setError(err instanceof Error ? err.message : \"Couldn't send feedback\");\n }\n },\n [\n target,\n schema,\n value,\n honeypot,\n submitting,\n session?.email,\n chatSessionId,\n chatStorageKey,\n setOpen,\n ],\n );\n\n let trigger;\n if (customTrigger) {\n trigger = (\n <PopoverPrimitive.Trigger asChild>\n {customTrigger}\n </PopoverPrimitive.Trigger>\n );\n } else if (variant === \"icon\") {\n trigger = (\n <TooltipPrimitive.Provider delayDuration={200}>\n <TooltipPrimitive.Root>\n <TooltipPrimitive.Trigger asChild>\n <PopoverPrimitive.Trigger asChild>\n <button\n type=\"button\"\n aria-label={label}\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\",\n className,\n )}\n >\n <IconMessage2 size={14} />\n </button>\n </PopoverPrimitive.Trigger>\n </TooltipPrimitive.Trigger>\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n sideOffset={6}\n className=\"z-[300] overflow-hidden rounded-md border border-border bg-popover px-2 py-1 text-[11px] text-foreground shadow-md animate-in fade-in-0 zoom-in-95\"\n >\n {label}\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n </TooltipPrimitive.Root>\n </TooltipPrimitive.Provider>\n );\n } else if (variant === \"outlined\") {\n trigger = (\n <PopoverPrimitive.Trigger asChild>\n <button\n type=\"button\"\n aria-label={label}\n className={cn(\n \"flex h-8 items-center gap-2 rounded-md border border-border bg-transparent px-3 text-sm text-muted-foreground transition hover:border-foreground/40 hover:text-foreground\",\n className,\n )}\n >\n <IconMessage2 size={14} stroke={1.5} />\n <span>{label}</span>\n </button>\n </PopoverPrimitive.Trigger>\n );\n } else {\n trigger = (\n <PopoverPrimitive.Trigger asChild>\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center gap-3 rounded-lg px-3 py-2 text-sm text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground\",\n className,\n )}\n >\n <IconMessage2 className=\"h-4 w-4\" />\n <span>{label}</span>\n </button>\n </PopoverPrimitive.Trigger>\n );\n }\n\n const resolvedSide = side ?? (variant === \"sidebar\" ? \"top\" : \"bottom\");\n const resolvedPlaceholder = placeholder ?? DEFAULT_PLACEHOLDER;\n\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n {trigger}\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n side={resolvedSide}\n align={align}\n sideOffset={8}\n collisionPadding={16}\n className=\"z-[300] overflow-hidden rounded-lg border border-border bg-popover shadow-xl outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\"\n style={surfaceStyle}\n >\n {submitted ? (\n <div className=\"flex flex-col items-center justify-center gap-3 px-6 py-10 text-center\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-emerald-500/10 text-emerald-500\">\n <IconCheck size={20} stroke={2.5} />\n </div>\n <div className=\"text-sm font-medium text-foreground\">\n {DEFAULT_SUCCESS_MESSAGE}\n </div>\n </div>\n ) : (\n <form onSubmit={submit} className=\"flex flex-col gap-3 p-3\">\n <textarea\n ref={textareaRef}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={(e) => {\n if ((e.metaKey || e.ctrlKey) && e.key === \"Enter\") submit();\n }}\n placeholder={resolvedPlaceholder}\n rows={5}\n maxLength={10000}\n className=\"w-full resize-none rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n <input\n type=\"text\"\n tabIndex={-1}\n autoComplete=\"off\"\n aria-hidden=\"true\"\n value={honeypot}\n onChange={(e) => setHoneypot(e.target.value)}\n style={honeypotStyle}\n />\n <div className=\"flex items-center justify-between gap-3\">\n <div\n className={cn(\n \"text-[11px]\",\n error ? \"text-destructive\" : \"text-muted-foreground/75\",\n )}\n >\n {error ??\n `${/Mac|iPhone|iPad/.test(navigator.userAgent) ? \"⌘\" : \"Ctrl\"}+Enter to send`}\n </div>\n <button\n type=\"submit\"\n disabled={submitting || !value.trim()}\n className=\"inline-flex h-8 items-center justify-center rounded-md bg-primary px-3 text-xs font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50\"\n >\n {submitting ? \"Sending…\" : DEFAULT_SUBMIT_TEXT}\n </button>\n </div>\n </form>\n )}\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n}\n"]}
1
+ {"version":3,"file":"FeedbackButton.js","sourceRoot":"","sources":["../../src/client/FeedbackButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n useState,\n useEffect,\n useRef,\n useCallback,\n type CSSProperties,\n type FormEvent,\n type ReactNode,\n} from \"react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport { IconMessage2, IconCheck } from \"@tabler/icons-react\";\nimport { cn } from \"./utils.js\";\nimport { useSession } from \"./use-session.js\";\nimport { getFeedbackClientContext } from \"./feedback-context.js\";\n\nconst DEFAULT_FEEDBACK_URL =\n \"https://forms.agent-native.com/f/agent-native-feedback/_16ewV\";\n\ninterface ParsedTarget {\n endpoint: string;\n slug: string;\n}\n\ninterface FormSchema {\n formId: string;\n fieldId: string;\n}\n\nconst DEFAULT_PLACEHOLDER =\n \"What's working, what's broken, or what would you change?\";\nconst DEFAULT_SUBMIT_TEXT = \"Send feedback\";\nconst DEFAULT_SUCCESS_MESSAGE = \"Thanks for the feedback!\";\n\nfunction parseTarget(url: string): ParsedTarget | null {\n try {\n const u = new URL(url);\n const idx = u.pathname.indexOf(\"/f/\");\n if (idx === -1) return null;\n const slug = u.pathname.slice(idx + 3).replace(/\\/$/, \"\");\n if (!slug) return null;\n return { endpoint: u.origin, slug };\n } catch {\n return null;\n }\n}\n\nconst schemaCache = new Map<string, Promise<FormSchema>>();\n\nasync function loadSchema(target: ParsedTarget): Promise<FormSchema> {\n const key = `${target.endpoint}|${target.slug}`;\n let pending = schemaCache.get(key);\n if (pending) return pending;\n pending = (async () => {\n const res = await fetch(\n `${target.endpoint}/api/forms/public/${encodeURIComponent(target.slug)}`,\n { headers: { Accept: \"application/json\" } },\n );\n if (!res.ok) throw new Error(`form fetch ${res.status}`);\n const body = (await res.json()) as {\n id: string;\n fields: Array<{ id: string; type: string }>;\n };\n const field =\n body.fields.find((f) => f.type === \"textarea\") ??\n body.fields.find((f) => f.type === \"text\") ??\n body.fields[0];\n if (!field) throw new Error(\"form has no fields\");\n return { formId: body.id, fieldId: field.id };\n })();\n pending.catch(() => schemaCache.delete(key));\n schemaCache.set(key, pending);\n return pending;\n}\n\nexport interface FeedbackButtonProps {\n /**\n * \"sidebar\" renders a full-width row with icon + label (for app left sidebars).\n * \"icon\" renders a small icon-only button (for dense toolbars, e.g. the agent panel header).\n * \"outlined\" renders an outlined pill button with icon + label (for top-nav bars, e.g. docs).\n */\n variant?: \"sidebar\" | \"icon\" | \"outlined\";\n label?: string;\n url?: string;\n className?: string;\n /** Which side the popover opens on. Defaults match the variant. */\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n align?: \"start\" | \"center\" | \"end\";\n /** Placeholder text for the textarea. */\n placeholder?: string;\n /** Current chat session/thread id, when the host already knows it. */\n chatSessionId?: string | null;\n /** Chat localStorage namespace, when the host uses per-app chat storage. */\n chatStorageKey?: string | null;\n /** Controlled popover open state for hosts that trigger feedback from a menu. */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Optional custom trigger element. */\n trigger?: ReactNode;\n}\n\nconst surfaceStyle: CSSProperties = {\n width: \"min(380px, calc(100vw - 32px))\",\n};\n\nconst honeypotStyle: CSSProperties = {\n position: \"absolute\",\n left: \"-10000px\",\n top: \"auto\",\n width: \"1px\",\n height: \"1px\",\n overflow: \"hidden\",\n};\n\nexport function FeedbackButton({\n variant = \"sidebar\",\n label = \"Feedback\",\n url = DEFAULT_FEEDBACK_URL,\n className,\n side,\n align = \"end\",\n placeholder,\n chatSessionId,\n chatStorageKey,\n open: controlledOpen,\n onOpenChange,\n trigger: customTrigger,\n}: FeedbackButtonProps) {\n const target = parseTarget(url);\n const { session } = useSession();\n\n const [uncontrolledOpen, setUncontrolledOpen] = useState(false);\n const open = controlledOpen ?? uncontrolledOpen;\n const setOpen = useCallback(\n (nextOpen: boolean) => {\n if (controlledOpen === undefined) setUncontrolledOpen(nextOpen);\n onOpenChange?.(nextOpen);\n },\n [controlledOpen, onOpenChange],\n );\n const [value, setValue] = useState(\"\");\n const [honeypot, setHoneypot] = useState(\"\");\n const [submitting, setSubmitting] = useState(false);\n const [submitted, setSubmitted] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [schema, setSchema] = useState<FormSchema | null>(null);\n const openedAtRef = useRef<number>(0);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n\n // Reset transient state and kick off schema load on each open.\n useEffect(() => {\n if (!open) return;\n openedAtRef.current = Date.now();\n setValue(\"\");\n setHoneypot(\"\");\n setSubmitting(false);\n setSubmitted(false);\n setError(null);\n setSchema(null);\n if (target) {\n loadSchema(target)\n .then((s) => setSchema(s))\n .catch((err) => {\n console.error(\"[FeedbackButton] schema load failed\", err);\n setError(\"Couldn't load feedback form\");\n });\n } else {\n setError(\"Invalid feedback URL\");\n }\n const t = setTimeout(() => textareaRef.current?.focus(), 30);\n return () => {\n clearTimeout(t);\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n };\n }, [open, url]);\n\n const submit = useCallback(\n async (e?: FormEvent) => {\n e?.preventDefault();\n if (!target || submitting) return;\n const trimmed = value.trim();\n if (!trimmed) {\n setError(\"Please write something first\");\n return;\n }\n setSubmitting(true);\n setError(null);\n try {\n const resolvedSchema = schema ?? (await loadSchema(target));\n if (!schema) setSchema(resolvedSchema);\n const submitterEmail = session?.email;\n const feedbackContext = getFeedbackClientContext({\n chatSessionId,\n storageKey: chatStorageKey,\n });\n const res = await fetch(\n `${target.endpoint}/api/submit/${encodeURIComponent(resolvedSchema.formId)}`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n data: { [resolvedSchema.fieldId]: trimmed },\n _t: openedAtRef.current,\n _hp: honeypot,\n _meta: {\n ...(submitterEmail ? { submitterEmail } : {}),\n ...feedbackContext,\n },\n }),\n },\n );\n if (!res.ok) {\n const body = (await res.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(body.error || `submit failed (${res.status})`);\n }\n setSubmitted(true);\n closeTimerRef.current = setTimeout(() => setOpen(false), 1400);\n } catch (err) {\n setSubmitting(false);\n setError(err instanceof Error ? err.message : \"Couldn't send feedback\");\n }\n },\n [\n target,\n schema,\n value,\n honeypot,\n submitting,\n session?.email,\n chatSessionId,\n chatStorageKey,\n setOpen,\n ],\n );\n\n let trigger;\n if (customTrigger) {\n trigger = (\n <PopoverPrimitive.Trigger asChild>\n {customTrigger}\n </PopoverPrimitive.Trigger>\n );\n } else if (variant === \"icon\") {\n trigger = (\n <TooltipPrimitive.Provider delayDuration={200}>\n <TooltipPrimitive.Root>\n <TooltipPrimitive.Trigger asChild>\n <PopoverPrimitive.Trigger asChild>\n <button\n type=\"button\"\n aria-label={label}\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\",\n className,\n )}\n >\n <IconMessage2 size={14} />\n </button>\n </PopoverPrimitive.Trigger>\n </TooltipPrimitive.Trigger>\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n sideOffset={6}\n className=\"z-[300] overflow-hidden rounded-md border border-border bg-popover px-2 py-1 text-[11px] text-foreground shadow-md animate-in fade-in-0 zoom-in-95\"\n >\n {label}\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n </TooltipPrimitive.Root>\n </TooltipPrimitive.Provider>\n );\n } else if (variant === \"outlined\") {\n trigger = (\n <PopoverPrimitive.Trigger asChild>\n <button\n type=\"button\"\n aria-label={label}\n className={cn(\n \"flex h-8 items-center gap-2 rounded-md border border-border bg-transparent px-3 text-sm text-muted-foreground transition hover:border-foreground/40 hover:text-foreground\",\n className,\n )}\n >\n <IconMessage2 size={14} stroke={1.5} />\n <span>{label}</span>\n </button>\n </PopoverPrimitive.Trigger>\n );\n } else {\n trigger = (\n <PopoverPrimitive.Trigger asChild>\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center gap-3 rounded-lg px-3 py-2 text-sm text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground\",\n className,\n )}\n >\n <IconMessage2 className=\"h-4 w-4\" />\n <span>{label}</span>\n </button>\n </PopoverPrimitive.Trigger>\n );\n }\n\n const resolvedSide = side ?? (variant === \"sidebar\" ? \"top\" : \"bottom\");\n const resolvedPlaceholder = placeholder ?? DEFAULT_PLACEHOLDER;\n\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n {trigger}\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n side={resolvedSide}\n align={align}\n sideOffset={8}\n collisionPadding={16}\n className=\"z-[300] overflow-hidden rounded-lg border border-border bg-popover shadow-xl outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\"\n style={surfaceStyle}\n >\n {submitted ? (\n <div className=\"flex flex-col items-center justify-center gap-3 px-6 py-10 text-center\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-emerald-500/10 text-emerald-500\">\n <IconCheck size={20} stroke={2.5} />\n </div>\n <div className=\"text-sm font-medium text-foreground\">\n {DEFAULT_SUCCESS_MESSAGE}\n </div>\n </div>\n ) : (\n <form onSubmit={submit} className=\"flex flex-col gap-3 p-3\">\n <textarea\n ref={textareaRef}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={(e) => {\n if ((e.metaKey || e.ctrlKey) && e.key === \"Enter\") submit();\n }}\n placeholder={resolvedPlaceholder}\n rows={5}\n maxLength={10000}\n className=\"w-full resize-none rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n <input\n type=\"text\"\n tabIndex={-1}\n autoComplete=\"off\"\n aria-hidden=\"true\"\n value={honeypot}\n onChange={(e) => setHoneypot(e.target.value)}\n style={honeypotStyle}\n />\n <div className=\"flex items-center justify-between gap-3\">\n <div\n className={cn(\n \"text-[11px]\",\n error ? \"text-destructive\" : \"text-muted-foreground/75\",\n )}\n >\n {error ??\n `${/Mac|iPhone|iPad/.test(navigator.userAgent) ? \"⌘\" : \"Ctrl\"}+Enter to send`}\n </div>\n <button\n type=\"submit\"\n disabled={submitting || !value.trim()}\n className=\"inline-flex h-8 items-center justify-center rounded-md bg-primary px-3 text-xs font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50\"\n >\n {submitting ? \"Sending…\" : DEFAULT_SUBMIT_TEXT}\n </button>\n </div>\n </form>\n )}\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: harness-agents
3
3
  description: >-
4
- Add or use full agent harness runtimes like Claude Code, Codex, Pi, Cursor, or Mastra inside Agent Native.
4
+ Add or use full agent harness runtimes like Claude Code, Codex, Pi, Cursor, Mastra, or ACP agents inside Agent Native.
5
5
  scope: dev
6
6
  ---
7
7
 
@@ -68,6 +68,52 @@ Harness runs are projected into the shared `BackgroundAgentRun` shape with
68
68
  `createAgentHarnessBackgroundAgentController()` and are available through the
69
69
  existing run routes as `goalId=agent-harness`.
70
70
 
71
+ ## ACP Agents
72
+
73
+ Agent Native can act as an [ACP](https://agentclientprotocol.com) (Agent Client
74
+ Protocol) client and drive a local coding agent — Gemini CLI, Claude Code, or
75
+ any ACP-compliant agent — through this same substrate. This is scoped to **local
76
+ coding**: the agent is spawned as a child process speaking newline-delimited
77
+ JSON-RPC over stdio, and inherits the parent environment so it reuses the user's
78
+ local CLI login. It is not a hosted/sandboxed transport, and it is not a
79
+ chat/A2A transport.
80
+
81
+ ```ts
82
+ import {
83
+ registerBuiltinAgentHarnesses,
84
+ resolveAgentHarness,
85
+ } from "@agent-native/core/agent/harness";
86
+
87
+ registerBuiltinAgentHarnesses();
88
+
89
+ // Built-in presets (commands overridable via the resolve config):
90
+ const gemini = resolveAgentHarness("acp:gemini");
91
+ const claude = resolveAgentHarness("acp:claude-code");
92
+
93
+ // Or any ACP agent by command:
94
+ const custom = resolveAgentHarness("acp", {
95
+ command: "gemini",
96
+ args: ["--experimental-acp"],
97
+ });
98
+ ```
99
+
100
+ - The protocol transport (`@zed-industries/agent-client-protocol`) is an optional
101
+ dependency loaded lazily; `installPackage` surfaces a clear install hint.
102
+ - The agent binary (e.g. `@google/gemini-cli`, `@zed-industries/claude-code-acp`)
103
+ is a separate external CLI the user installs; presets launch it through `npx`
104
+ by default and the command/args are overridable because agent ACP entry flags
105
+ still evolve.
106
+ - `permissionMode` maps onto ACP `session/request_permission` using the reported
107
+ tool-call kind: reads always run, edits run under `allow-edits`, everything
108
+ risky prompts unless `allow-all`. Approvals surface as `approval-request`
109
+ events; answer them through the harness session's `approve()`.
110
+ - `resumeState` carries the ACP `sessionId`; resume works when the agent
111
+ advertises the `loadSession` capability and degrades to a fresh session
112
+ otherwise.
113
+ - `fs/read_text_file` and `fs/write_text_file` are served against the session
114
+ workspace and refuse paths that escape it; terminal methods are not advertised
115
+ (the agent uses its own shell).
116
+
71
117
  ## Adapter Guidance
72
118
 
73
119
  - Keep harness packages optional. Use dynamic imports in adapters and expose an
@@ -295,8 +295,10 @@ export function SupportAgentChat() {
295
295
  Ready-made runtime helpers exist for OpenAI Agents, OpenAI Responses, the Claude
296
296
  Agent SDK, the Vercel AI SDK, and AG-UI, plus the normalized HTTP runtime above
297
297
  for any other agent (Mastra, Flue, Eve, LangGraph, or a custom service). ACP is
298
- not the default end-user app chat protocol, and Agent-Native does not currently
299
- claim A2UI support.
298
+ not the end-user app chat or A2A transport, and Agent-Native does not currently
299
+ claim A2UI support. ACP is supported in one specific place — driving a local
300
+ coding agent (Gemini CLI, Claude Code, …) through the
301
+ [harness layer](/docs/harness-agents#acp), not as the chat runtime here.
300
302
 
301
303
  [Native Chat UI — BYO agent runtimes](/docs/native-chat-ui#byo-agent-runtimes)
302
304
  is the canonical home for the event shapes, the runtime helpers, and `chatUI`
@@ -1,12 +1,13 @@
1
1
  ---
2
2
  title: "Getting Started"
3
- description: "Create an agent app with a chat UI or headless — add an action, and watch the agent call it."
3
+ description: "Create an agent app, understand instructions, skills, and actions, then watch the agent call its first action."
4
4
  ---
5
5
 
6
6
  # Getting Started
7
7
 
8
8
  Agent-Native apps give an AI agent and your UI the same actions, data, and
9
- state. The smallest useful app is a single action.
9
+ state. A basic agent is made from instructions that guide it, skills that teach
10
+ repeatable behavior, and actions that let it do real work.
10
11
 
11
12
  **Want a complete app to start from?** Clone one of our rich templates —
12
13
  [Chat](/docs/template-chat), [Mail](/docs/template-mail),
@@ -15,15 +16,23 @@ state. The smallest useful app is a single action.
15
16
  each a full-featured app you customize.
16
17
 
17
18
  Building from scratch? The only choice up front is whether you want a UI —
18
- everything after (defining actions, running the agent) is the same either way.
19
+ everything after (writing instructions, adding skills, defining actions, running
20
+ the agent) is the same either way.
19
21
 
20
- ```an-diagram title="The three-step on-ramp" summary="Create an app, add one action, run it. The action is then reachable from every surface."
22
+ ```an-file-tree title="A basic Agent-Native agent"
21
23
  {
22
- "html": "<div class=\"diagram-flow\"><div class=\"diagram-card\"><span class=\"diagram-pill\">1</span><strong>Create</strong><small class=\"diagram-muted\">chat template or headless</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&rarr;</div><div class=\"diagram-card\"><span class=\"diagram-pill\">2</span><strong>Add an action</strong><small class=\"diagram-muted\">one defineAction file</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&rarr;</div><div class=\"diagram-card\"><span class=\"diagram-pill accent\">3</span><strong>Run it</strong><small class=\"diagram-muted\">CLI, agent, or browser</small></div></div>",
23
- "css": ".diagram-flow{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.diagram-flow .diagram-card{display:flex;flex-direction:column;gap:6px;padding:14px 16px;min-width:140px}.diagram-flow .diagram-arrow{font-size:22px;line-height:1}"
24
+ "entries": [
25
+ { "path": "AGENTS.md", "note": "always-on instructions: purpose, rules, tone, and the map of what the agent can do" },
26
+ { "path": ".agents/skills/customer-research/SKILL.md", "note": "a reusable playbook the agent loads when the task matches" },
27
+ { "path": "actions/summarize-week.ts", "note": "typed code the agent, UI, CLI, HTTP, MCP, A2A, jobs, and webhooks can run" }
28
+ ]
24
29
  }
25
30
  ```
26
31
 
32
+ This is true whether you start with a chat UI, a headless agent, or a full app.
33
+ The UI changes the surface; instructions, skills, and actions give the agent its
34
+ guidance and behavior.
35
+
27
36
  ## 1. Create your app
28
37
 
29
38
  You'll need [Node.js 22+](https://nodejs.org) and [pnpm](https://pnpm.io).
@@ -51,10 +60,10 @@ loop, no UI shell:
51
60
  npx @agent-native/core@latest create my-agent --headless
52
61
  ```
53
62
 
54
- Then install:
63
+ Then install from the folder you created:
55
64
 
56
65
  ```bash
57
- cd my-app
66
+ cd my-agent # or my-app if you chose the Chat template
58
67
  pnpm install
59
68
  ```
60
69
 
@@ -80,8 +89,13 @@ ship with this example:
80
89
  }
81
90
  ```
82
91
 
83
- Replace `hello` with the smallest real operation in your domain. You define it
84
- once; every surface picks it up.
92
+ Replace `hello` with the first real operation in your domain. You define it once;
93
+ every surface picks it up.
94
+
95
+ Use `AGENTS.md` for guidance that should apply every turn. Use a skill when the
96
+ agent needs a reusable workflow or domain procedure. Use an action when the
97
+ agent needs a typed, testable way to read data, write data, call an API, or
98
+ perform an approval.
85
99
 
86
100
  ## 3. Run it
87
101
 
@@ -182,7 +196,8 @@ my-app/
182
196
  actions/ # Agent-callable actions
183
197
  app/ # React frontend (UI templates only; omitted when headless)
184
198
  server/ # Nitro API server (routes, plugins)
185
- .agents/ # Agent instructions and skills
199
+ AGENTS.md # Always-on agent instructions
200
+ .agents/ # Skills the agent can pull in when relevant
186
201
  data/app.db # Local SQLite state when DATABASE_URL is unset
187
202
  ```
188
203