@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.
- package/dist/agent/harness/acp-adapter.d.ts +145 -0
- package/dist/agent/harness/acp-adapter.d.ts.map +1 -0
- package/dist/agent/harness/acp-adapter.js +632 -0
- package/dist/agent/harness/acp-adapter.js.map +1 -0
- package/dist/agent/harness/acp-builtin.d.ts +25 -0
- package/dist/agent/harness/acp-builtin.d.ts.map +1 -0
- package/dist/agent/harness/acp-builtin.js +57 -0
- package/dist/agent/harness/acp-builtin.js.map +1 -0
- package/dist/agent/harness/builtin.d.ts.map +1 -1
- package/dist/agent/harness/builtin.js +15 -0
- package/dist/agent/harness/builtin.js.map +1 -1
- package/dist/agent/harness/index.d.ts +2 -0
- package/dist/agent/harness/index.d.ts.map +1 -1
- package/dist/agent/harness/index.js +2 -0
- package/dist/agent/harness/index.js.map +1 -1
- package/dist/client/FeedbackButton.js +1 -1
- package/dist/client/FeedbackButton.js.map +1 -1
- package/dist/templates/workspace-core/.agents/skills/harness-agents/SKILL.md +47 -1
- package/docs/content/agent-surfaces.md +4 -2
- package/docs/content/getting-started.md +26 -11
- package/docs/content/harness-agents.md +59 -0
- package/docs/content/key-concepts.md +27 -0
- package/docs/content/writing-agent-instructions.md +20 -0
- package/package.json +1 -1
- package/src/templates/workspace-core/.agents/skills/harness-agents/SKILL.md +47 -1
|
@@ -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":"
|
|
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;
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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 (
|
|
19
|
+
everything after (writing instructions, adding skills, defining actions, running
|
|
20
|
+
the agent) is the same either way.
|
|
19
21
|
|
|
20
|
-
```an-
|
|
22
|
+
```an-file-tree title="A basic Agent-Native agent"
|
|
21
23
|
{
|
|
22
|
-
"
|
|
23
|
-
|
|
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
|
|
84
|
-
|
|
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
|
-
.
|
|
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
|
|