@cryer/star-cli 0.1.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +102 -10
- package/dist/chunk-RLQXGX3N.js +2314 -0
- package/dist/chunk-RLQXGX3N.js.map +1 -0
- package/dist/loop-XIILV7GY.js +10 -0
- package/dist/loop-XIILV7GY.js.map +1 -0
- package/dist/main.js +1769 -2133
- package/dist/main.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/agent/loop.ts","../src/context/compaction.ts","../src/context/tokens.ts","../src/core/git.ts","../src/core/messages.ts","../src/hooks/runner.ts","../src/permissions/gate.ts","../src/permissions/allow.ts","../src/session/title.ts","../src/tools/fs/snapshots.ts","../src/agent/project-memory.ts","../src/agent/subagent.ts","../src/tools/bash.ts","../src/tasks/manager.ts","../src/tools/fs/edit.ts","../src/tools/fs/glob.ts","../src/tools/fs/util.ts","../src/tools/fs/grep.ts","../src/tools/fs/read.ts","../src/tools/fs/write.ts","../src/tools/tasks.ts","../src/tasks/format.ts","../src/tools/todo.ts","../src/tools/web/fetch.ts","../src/tools/web/search.ts","../src/tools/registry.ts","../src/tools/index.ts"],"sourcesContent":["import type { LanguageModel } from \"ai\";\nimport { tool as aiTool } from \"ai\";\nimport type { StarConfig } from \"../config/schema\";\nimport { type CompactionResult, compactMessages, summarizeMessages } from \"../context/compaction\";\nimport type { StreamEvent } from \"../core/events\";\nimport { formatGitSummary, getGitSummary } from \"../core/git\";\nimport {\n type ChatInput,\n type CoreMessage,\n reconcileToolCalls,\n retractLastTurn,\n} from \"../core/messages\";\nimport { type HookEvent, type HookRunResult, runHooks } from \"../hooks/runner\";\nimport { checkPermission } from \"../permissions/gate\";\nimport type { PermissionRequest } from \"../permissions/types\";\nimport type { SessionStore } from \"../session/store\";\nimport { scheduleSessionTitle } from \"../session/title\";\nimport { beginTurn, currentTurnSeq, setSnapshotHooks } from \"../tools/fs/snapshots\";\nimport type { ToolRegistry } from \"../tools/registry\";\nimport type { ToolResult } from \"../tools/types\";\nimport { readProjectMemory } from \"./project-memory\";\nimport { MAX_SUBAGENT_DEPTH, createSubagentTool } from \"./subagent\";\n\nexport interface AgentLoopOptions {\n model: LanguageModel;\n registry: ToolRegistry;\n config: StarConfig;\n cwd: string;\n system?: string;\n sessionStore?: SessionStore | null;\n // Depth of this loop in the subagent chain (0 = main agent). At\n // MAX_SUBAGENT_DEPTH the subagent tool is not registered, so subagents\n // cannot spawn further subagents.\n subagentDepth?: number;\n}\n\nexport const PLAN_MODE_PROMPT =\n \"\\n\\nYou are currently in PLAN MODE. Research the task using only the read-only tools available to you, then present a concrete, step-by-step implementation plan as your final answer. You must not modify files, run shell commands, or otherwise change the system — write/exec tools are unavailable in this mode. Do not ask the user to run commands for you; note manual steps in the plan instead. The user will review your plan and approve it before any execution begins.\";\n\ninterface PendingToolCall {\n id: string;\n name: string;\n args: unknown;\n}\n\nexport class AgentLoop {\n private messages: CoreMessage[] = [];\n private readonly opts: AgentLoopOptions;\n // Seq + user-message index of each turn started via stream(); lets /undo\n // match a retracted turn to the file snapshots it produced. Cleared when\n // history is replaced wholesale (resume/compact), because indices no longer\n // line up — in that case /undo only retracts messages, never wrong files.\n private turnMarkers: { seq: number; userIndex: number }[] = [];\n private titleScheduled = false;\n confirmHandler?: (req: PermissionRequest) => Promise<boolean>;\n // Hook failures never block the turn (except an explicit PreToolUse block);\n // their stderr surfaces through this callback (REPL system message / stderr\n // in print mode).\n onHookWarning?: (message: string) => void;\n\n constructor(opts: AgentLoopOptions) {\n this.opts = opts;\n if (opts.system) {\n this.messages.push({ role: \"system\", content: opts.system });\n }\n if (opts.sessionStore) {\n this.bindSnapshotHooks(opts.sessionStore);\n }\n const depth = opts.subagentDepth ?? 0;\n if (opts.registry && depth < MAX_SUBAGENT_DEPTH) {\n opts.registry.register(\n createSubagentTool({\n model: opts.model,\n config: opts.config,\n cwd: opts.cwd,\n system: opts.system,\n depth,\n getConfirmHandler: () => this.confirmHandler,\n }),\n );\n }\n }\n\n getMessages(): readonly CoreMessage[] {\n return this.messages;\n }\n\n // Swaps the persistence target (/new starts a fresh session mid-REPL).\n // Title generation is re-armed so the new session gets one after its first\n // turn, and snapshot checkpoints now flow to the new store.\n setSessionStore(store: SessionStore | null): void {\n this.opts.sessionStore = store;\n this.titleScheduled = false;\n if (store) this.bindSnapshotHooks(store);\n }\n\n private bindSnapshotHooks(store: SessionStore): void {\n setSnapshotHooks({\n onPush: (snapshot) =>\n store.appendCheckpoint(\n {\n id: snapshot.id,\n timestamp: snapshot.timestamp,\n path: snapshot.path,\n existed: snapshot.existed,\n toolName: snapshot.toolName,\n turn: snapshot.turn,\n messageIndex: snapshot.messageIndex,\n },\n snapshot.content,\n ),\n onRemove: (ids) => store.removeCheckpoints(ids),\n });\n }\n\n async loadMessages(messages: CoreMessage[]): Promise<void> {\n this.messages = reconcileToolCalls(messages);\n this.turnMarkers = [];\n }\n\n // Drops the final user message and everything after it, and persists the\n // trimmed history so a later /resume does not bring the turn back.\n // `turn` is the retracted turn's snapshot seq when it could be verified\n // against the marker recorded at turn start — undefined means the caller\n // must not revert any file snapshots.\n async retractLastTurn(): Promise<{ removed: number; turn?: number }> {\n const result = retractLastTurn([...this.messages]);\n if (result.removed === 0) return { removed: 0 };\n const userIndex = result.messages.length;\n this.messages = result.messages;\n await this.opts.sessionStore?.replaceMessages([...this.messages]);\n const last = this.turnMarkers[this.turnMarkers.length - 1];\n let turn: number | undefined;\n if (last && last.userIndex === userIndex) {\n turn = last.seq;\n this.turnMarkers.pop();\n }\n return { removed: result.removed, turn };\n }\n\n // Cut point for a rewind: messages[index] should be the user message that\n // started the rewound turn, but compaction may have shifted indices, so\n // walk back to the nearest user message. Never touches a leading system\n // message.\n private retractionCut(index: number): number {\n const clamped = Math.max(0, Math.min(index, this.messages.length - 1));\n for (let i = clamped; i >= 0; i--) {\n if (this.messages[i]?.role === \"user\") return i;\n }\n return this.messages[0]?.role === \"system\" ? 1 : 0;\n }\n\n countRetraction(index: number): number {\n return this.messages.length - this.retractionCut(index);\n }\n\n // Truncates the history back to the given message index (the user message\n // at that index and everything after it is dropped) and persists the\n // trimmed history, so /rewind stays consistent across resume.\n async retractFromIndex(index: number): Promise<number> {\n const cut = this.retractionCut(index);\n const removed = this.messages.length - cut;\n if (removed === 0) return 0;\n this.messages = this.messages.slice(0, cut);\n await this.opts.sessionStore?.replaceMessages([...this.messages]);\n this.turnMarkers = this.turnMarkers.filter((m) => m.userIndex < cut);\n return removed;\n }\n\n async appendContextMessage(text: string, role: \"user\" | \"system\" = \"user\"): Promise<void> {\n const message: CoreMessage = { role, content: text };\n this.messages.push(message);\n await this.persist(message);\n }\n\n private async persist(message: CoreMessage): Promise<void> {\n await this.opts.sessionStore?.append(message);\n }\n\n // After the first assistant reply, kick off background title generation\n // for the session. Runs once per loop; the store-level title check makes\n // resumed sessions that already have a title a no-op.\n private maybeScheduleTitle(input: string): void {\n if (this.titleScheduled) return;\n const store = this.opts.sessionStore;\n if (!store) return;\n this.titleScheduled = true;\n scheduleSessionTitle(store, input, this.opts.model);\n }\n\n async *stream(\n input: ChatInput,\n signal: AbortSignal,\n opts?: { persistAs?: string },\n ): AsyncGenerator<StreamEvent> {\n this.syncSystemMessage();\n\n const text = typeof input === \"string\" ? input : input.text;\n const images = typeof input === \"string\" ? [] : input.images;\n const userMessage: CoreMessage =\n images.length > 0\n ? {\n role: \"user\",\n content: [\n ...images.map((img) => ({\n type: \"image\" as const,\n image: img.data,\n mimeType: img.mimeType,\n })),\n { type: \"text\" as const, text },\n ],\n }\n : { role: \"user\", content: text };\n this.messages.push(userMessage);\n // Only the root loop opens a new snapshot turn: a subagent runs inside the\n // parent's turn, and its file changes must keep the parent's turn seq and\n // message index so /undo and /rewind attribute them correctly.\n const seq =\n (this.opts.subagentDepth ?? 0) === 0 ? beginTurn(this.messages.length - 1) : currentTurnSeq();\n this.turnMarkers.push({ seq, userIndex: this.messages.length - 1 });\n await this.persist(\n opts?.persistAs !== undefined ? { role: \"user\", content: opts.persistAs } : userMessage,\n );\n\n const { config, registry, cwd } = this.opts;\n const aiTools = this.buildAiTools();\n\n for (let step = 0; step < config.maxSteps; step++) {\n const compacted = compactMessages([...this.messages], config.contextMaxTokens);\n if (compacted.compacted) {\n this.messages = await this.applyCompactionSummary(compacted);\n }\n\n let text = \"\";\n const toolCalls: PendingToolCall[] = [];\n let failed = false;\n\n try {\n for await (const event of this.streamOnce(aiTools, signal)) {\n if (event.type === \"text-delta\") {\n text += event.text;\n yield event;\n } else if (event.type === \"reasoning\") {\n yield event;\n } else if (event.type === \"tool-call\") {\n toolCalls.push({ id: event.id, name: event.name, args: event.args });\n yield event;\n } else if (event.type === \"error\") {\n failed = true;\n yield event;\n } else {\n yield event;\n }\n }\n } catch (error) {\n // A user-initiated abort is a normal end of the turn, not an error.\n if (signal.aborted) return;\n yield { type: \"error\", error: error instanceof Error ? error : new Error(String(error)) };\n return;\n }\n\n if (failed) return;\n\n const assistantMessage: CoreMessage = {\n role: \"assistant\",\n content: [\n ...(text ? [{ type: \"text\" as const, text }] : []),\n ...toolCalls.map((call) => ({\n type: \"tool-call\" as const,\n toolCallId: call.id,\n toolName: call.name,\n args: call.args,\n })),\n ],\n };\n this.messages.push(assistantMessage);\n await this.persist(assistantMessage);\n this.maybeScheduleTitle(text);\n\n if (toolCalls.length === 0) {\n await this.runEventHooks(\"Stop\");\n return;\n }\n\n const answered = new Set<string>();\n try {\n for (const call of toolCalls) {\n if (signal.aborted) break;\n const result = await this.executeTool(call, signal);\n const toolMessage: CoreMessage = {\n role: \"tool\",\n content: [\n {\n type: \"tool-result\",\n toolCallId: call.id,\n toolName: call.name,\n result: result.content,\n },\n ],\n };\n this.messages.push(toolMessage);\n await this.persist(toolMessage);\n answered.add(call.id);\n yield {\n type: \"tool-result\",\n id: call.id,\n name: call.name,\n content: result.content,\n isError: result.isError,\n };\n }\n } finally {\n // The assistant message carrying these tool calls is already persisted,\n // so every call must be closed with a tool message even when execution\n // is aborted or blows up mid-batch; otherwise the stored history can\n // no longer be sent to the API.\n for (const call of toolCalls) {\n if (answered.has(call.id)) continue;\n const content = signal.aborted\n ? \"Tool execution interrupted by user.\"\n : \"Tool execution interrupted before a result was produced.\";\n const synthetic: CoreMessage = {\n role: \"tool\",\n content: [\n {\n type: \"tool-result\",\n toolCallId: call.id,\n toolName: call.name,\n result: content,\n },\n ],\n };\n this.messages.push(synthetic);\n await this.persist(synthetic).catch(() => {});\n yield { type: \"tool-result\", id: call.id, name: call.name, content, isError: true };\n }\n }\n\n if (signal.aborted) return;\n }\n\n yield {\n type: \"error\",\n error: new Error(`Max steps (${config.maxSteps}) reached, stopping.`),\n };\n }\n\n // The permission mode can change at runtime, so the system message is\n // recomputed at the start of every turn instead of being frozen by the\n // constructor. Also restores a system message after loadMessages() (resume,\n // /model switch) replaced the history with one that has none. Git context\n // (branch, dirty count, recent commits) is refreshed here too, so the model\n // always sees the current repo state; any git failure is silently skipped.\n // Project memory (AGENTS.md in the cwd) is appended as a delimited block;\n // readProjectMemory caches by mtime, so this stays cheap per turn.\n private syncSystemMessage(): void {\n const base = this.opts.system;\n const plan = this.opts.config.permissionMode === \"plan\";\n const parts: string[] = [];\n if (base) parts.push(base);\n if (plan) parts.push(PLAN_MODE_PROMPT.trim());\n const memory = readProjectMemory(this.opts.cwd);\n if (memory) parts.push(memory);\n const git = getGitSummary(this.opts.cwd);\n if (git) parts.push(formatGitSummary(git));\n if (parts.length === 0) return;\n const content = parts.join(\"\\n\\n\");\n const head = this.messages[0];\n if (head?.role === \"system\" && typeof head.content === \"string\") {\n if (head.content !== content) head.content = content;\n } else if (head?.role !== \"system\") {\n this.messages.unshift({ role: \"system\", content });\n }\n }\n\n private async applyCompactionSummary(compacted: CompactionResult): Promise<CoreMessage[]> {\n const { config, model } = this.opts;\n if (config.contextCompaction !== \"summary\" || !model) {\n return compacted.messages;\n }\n const headCount = compacted.messages[0]?.role === \"system\" ? 1 : 0;\n const dropped = this.messages.slice(headCount, headCount + compacted.droppedCount);\n try {\n const summary = await summarizeMessages(dropped, model);\n const messages = compacted.messages.slice();\n messages[headCount] = {\n role: \"user\",\n content: `[earlier conversation summarized]\\n${summary}`,\n };\n return messages;\n } catch {\n return compacted.messages;\n }\n }\n\n private async *streamOnce(\n aiTools: Record<string, unknown>,\n signal: AbortSignal,\n ): AsyncGenerator<StreamEvent> {\n const { streamChat } = await import(\"../llm/stream\");\n yield* streamChat({\n model: this.opts.model,\n messages: this.messages,\n tools: aiTools,\n abortSignal: signal,\n idleTimeoutMs: this.opts.config.streamIdleTimeoutSec * 1000,\n });\n }\n\n private buildAiTools(): Record<string, unknown> {\n const plan = this.opts.config.permissionMode === \"plan\";\n const tools: Record<string, unknown> = {};\n for (const t of this.opts.registry.list()) {\n // Plan mode hides write/exec tools from the model entirely; the\n // permission gate stays as a backstop for anything still attempted.\n if (plan && t.permission !== \"read\") continue;\n tools[t.name] = aiTool({\n description: t.description,\n parameters: t.parameters as never,\n });\n }\n return tools;\n }\n\n private async runEventHooks(\n event: HookEvent,\n toolName?: string,\n toolInput?: unknown,\n ): Promise<HookRunResult> {\n const empty: HookRunResult = { blocked: false, warnings: [] };\n if (this.opts.config.hooks.length === 0) return empty;\n try {\n const result = await runHooks(event, this.opts.config.hooks, {\n cwd: this.opts.cwd,\n sessionId: this.opts.sessionStore?.id,\n toolName,\n toolInput,\n });\n for (const warning of result.warnings) this.onHookWarning?.(warning);\n return result;\n } catch {\n // Hooks are best-effort by design: a broken hook must never crash a turn.\n return empty;\n }\n }\n\n private async executeTool(call: PendingToolCall, signal: AbortSignal): Promise<ToolResult> {\n const { registry, config, cwd } = this.opts;\n const tool = registry.get(call.name);\n if (!tool) {\n return { content: `Unknown tool: ${call.name}`, isError: true };\n }\n\n const decision = checkPermission(\n config.permissionMode,\n { toolName: call.name, args: call.args, level: tool.permission },\n { cwd },\n config.permissions.allow,\n );\n\n if (decision === \"deny\") {\n return { content: `Permission denied for tool \"${call.name}\".`, isError: true };\n }\n if (decision === \"ask\") {\n let approved = false;\n try {\n approved = this.confirmHandler\n ? await this.confirmHandler({\n toolName: call.name,\n args: call.args,\n level: tool.permission,\n })\n : false;\n } catch {\n approved = false;\n }\n if (!approved) {\n return { content: `User rejected tool \"${call.name}\".`, isError: true };\n }\n }\n\n const parsed = tool.parameters.safeParse(call.args);\n if (!parsed.success) {\n return { content: `Invalid arguments: ${parsed.error.message}`, isError: true };\n }\n\n const pre = await this.runEventHooks(\"PreToolUse\", call.name, call.args);\n if (pre.blocked) {\n return {\n content: `Tool \"${call.name}\" blocked by a PreToolUse hook: ${pre.reason}`,\n isError: true,\n };\n }\n\n let result: ToolResult;\n try {\n result = await tool.execute(parsed.data, { cwd, abortSignal: signal });\n } catch (error) {\n if (signal.aborted) {\n return { content: \"Tool execution aborted.\", isError: true };\n }\n return {\n content: `Tool error: ${error instanceof Error ? error.message : String(error)}`,\n isError: true,\n };\n }\n\n if (!result.isError) {\n await this.runEventHooks(\"PostToolUse\", call.name, call.args);\n }\n return result;\n }\n}\n","import { type LanguageModelV1, generateText } from \"ai\";\nimport type { CoreMessage } from \"../core/messages\";\nimport { estimateTokens } from \"./tokens\";\n\nexport interface CompactionResult {\n messages: CoreMessage[];\n compacted: boolean;\n droppedCount: number;\n}\n\nconst MIN_KEPT_MESSAGES = 4;\n\nfunction placeholderMessage(droppedCount: number): CoreMessage {\n return {\n role: \"user\",\n content: `[context compacted: ${droppedCount} earlier messages dropped]`,\n };\n}\n\nconst SUMMARY_SYSTEM_PROMPT = [\n \"You are summarizing an AI coding agent's conversation for context compaction.\",\n \"Write a concise summary that preserves:\",\n \"- the user's goals and requests\",\n \"- decisions made and their rationale\",\n \"- files and code touched (paths, key changes)\",\n \"- tool results that matter (errors, key outputs)\",\n \"- outstanding TODOs and next steps\",\n \"Output only the summary, no preamble.\",\n].join(\"\\n\");\n\nfunction serializeMessage(message: CoreMessage): string {\n if (typeof message.content === \"string\") {\n return `${message.role}: ${message.content}`;\n }\n const parts = message.content.map((part) => {\n if (part.type === \"text\") return part.text;\n if (part.type === \"tool-call\")\n return `[tool-call ${part.toolName}] ${JSON.stringify(part.args)}`;\n if (part.type === \"tool-result\")\n return `[tool-result ${part.toolName}] ${JSON.stringify(part.result)}`;\n return `[${part.type}]`;\n });\n return `${message.role}: ${parts.join(\"\\n\")}`;\n}\n\nexport async function summarizeMessages(\n messages: CoreMessage[],\n model: LanguageModelV1,\n): Promise<string> {\n const transcript = messages.map(serializeMessage).join(\"\\n\");\n const { text } = await generateText({\n model,\n system: SUMMARY_SYSTEM_PROMPT,\n prompt: `Summarize this conversation so far:\\n\\n${transcript}`,\n });\n return text.trim();\n}\n\nexport function compactMessages(messages: CoreMessage[], maxTokens: number): CompactionResult {\n if (estimateTokens(messages) <= maxTokens) {\n return { messages, compacted: false, droppedCount: 0 };\n }\n\n const first = messages[0];\n const hasSystem = first?.role === \"system\";\n const head = hasSystem && first ? [first] : [];\n const rest = hasSystem ? messages.slice(1) : messages.slice();\n\n const turns: CoreMessage[][] = [];\n for (const message of rest) {\n const current = turns[turns.length - 1];\n if (message.role === \"user\" || !current) {\n turns.push([message]);\n } else {\n current.push(message);\n }\n }\n\n let droppedCount = 0;\n let turnIndex = 0;\n while (turnIndex < turns.length) {\n const turn = turns[turnIndex] as CoreMessage[];\n if (rest.length - droppedCount - turn.length < MIN_KEPT_MESSAGES) {\n break;\n }\n droppedCount += turn.length;\n turnIndex += 1;\n const candidate = [...head, placeholderMessage(droppedCount), ...rest.slice(droppedCount)];\n if (estimateTokens(candidate) <= maxTokens) {\n break;\n }\n }\n\n if (droppedCount === 0) {\n return { messages, compacted: false, droppedCount: 0 };\n }\n\n return {\n messages: [...head, placeholderMessage(droppedCount), ...rest.slice(droppedCount)],\n compacted: true,\n droppedCount,\n };\n}\n","import type { CoreMessage } from \"../core/messages\";\n\nconst CHARS_PER_TOKEN = 4;\nconst MESSAGE_OVERHEAD = 4;\nconst IMAGE_PART_TOKENS = 1024;\n\nfunction contentCharLength(message: CoreMessage): number {\n if (message.role === \"tool\") {\n let chars = 0;\n for (const part of message.content) {\n chars += JSON.stringify(part.result ?? null).length;\n }\n return chars;\n }\n if (typeof message.content === \"string\") {\n return message.content.length;\n }\n let chars = 0;\n for (const part of message.content) {\n if (part.type === \"text\" || part.type === \"reasoning\") {\n chars += part.text.length;\n } else if (part.type === \"tool-call\") {\n chars += part.toolName.length + JSON.stringify(part.args ?? null).length;\n }\n }\n return chars;\n}\n\nfunction imagePartCount(message: CoreMessage): number {\n if (typeof message.content === \"string\" || message.role === \"tool\") return 0;\n return message.content.filter((part) => part.type === \"image\" || part.type === \"file\").length;\n}\n\nexport function estimateMessageTokens(message: CoreMessage): number {\n return (\n Math.ceil(contentCharLength(message) / CHARS_PER_TOKEN) +\n MESSAGE_OVERHEAD +\n imagePartCount(message) * IMAGE_PART_TOKENS\n );\n}\n\nexport function estimateTokens(messages: CoreMessage[]): number {\n return messages.reduce((total, message) => total + estimateMessageTokens(message), 0);\n}\n","import { execFileSync } from \"node:child_process\";\n\nconst GIT_TIMEOUT_MS = 2000;\nconst GIT_MAX_BUFFER = 8 * 1024 * 1024;\n\nexport const COMMIT_DIFF_MAX_LINES = 2000;\nexport const WORKING_DIFF_MAX_LINES = 2000;\n\n// Synchronous by design: callers (system-prompt sync, slash commands) need the\n// result inline. Every failure — not a repo, git missing, timeout, oversized\n// output — returns null so the agent can never crash on git state.\nexport function runGit(args: string[], cwd: string): string | null {\n try {\n const out = execFileSync(\"git\", args, {\n cwd,\n timeout: GIT_TIMEOUT_MS,\n encoding: \"utf8\",\n maxBuffer: GIT_MAX_BUFFER,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n return out.replace(/\\n$/, \"\");\n } catch {\n return null;\n }\n}\n\nexport function isGitRepo(cwd: string): boolean {\n return runGit([\"rev-parse\", \"--is-inside-work-tree\"], cwd) === \"true\";\n}\n\nexport interface GitSummary {\n branch: string;\n dirtyCount: number;\n recentCommits: string[];\n}\n\nexport function getGitSummary(cwd: string): GitSummary | null {\n const branch = runGit([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], cwd);\n if (branch === null) return null;\n const status = runGit([\"status\", \"--porcelain\"], cwd) ?? \"\";\n const dirtyCount = status === \"\" ? 0 : status.split(\"\\n\").length;\n const log = runGit([\"log\", \"--oneline\", \"-3\"], cwd) ?? \"\";\n return { branch, dirtyCount, recentCommits: log === \"\" ? [] : log.split(\"\\n\") };\n}\n\nexport function formatGitSummary(summary: GitSummary): string {\n const lines = [\n \"Git context for the working directory (refreshed each turn):\",\n `Branch: ${summary.branch}`,\n summary.dirtyCount === 0\n ? \"Working tree: clean\"\n : `Working tree: ${summary.dirtyCount} file(s) with uncommitted changes`,\n ];\n if (summary.recentCommits.length > 0) {\n lines.push(\"Recent commits:\", ...summary.recentCommits);\n }\n return lines.join(\"\\n\");\n}\n\nexport function truncateLines(\n text: string,\n maxLines: number,\n): { text: string; truncated: boolean } {\n const lines = text.split(\"\\n\");\n if (lines.length <= maxLines) return { text, truncated: false };\n return { text: lines.slice(0, maxLines).join(\"\\n\"), truncated: true };\n}\n\nfunction collectDiffs(cwd: string): { staged: string; unstaged: string } {\n return {\n staged: runGit([\"diff\", \"--cached\"], cwd) ?? \"\",\n unstaged: runGit([\"diff\"], cwd) ?? \"\",\n };\n}\n\nexport interface CommitContext {\n status: string;\n diff: string;\n diffTruncated: boolean;\n recentLog: string;\n}\n\n// null means nothing to commit (clean tree). Untracked files still count:\n// they show up in the status even though `git diff` has no output for them.\nexport function collectCommitContext(cwd: string): CommitContext | null {\n if (!isGitRepo(cwd)) return null;\n const status = runGit([\"status\", \"--short\"], cwd) ?? \"\";\n const { staged, unstaged } = collectDiffs(cwd);\n if (status === \"\" && staged === \"\" && unstaged === \"\") return null;\n const rawDiff = [staged, unstaged].filter((part) => part !== \"\").join(\"\\n\");\n const { text: diff, truncated } = truncateLines(rawDiff, COMMIT_DIFF_MAX_LINES);\n const recentLog = runGit([\"log\", \"--oneline\", \"-5\"], cwd) ?? \"\";\n return { status, diff, diffTruncated: truncated, recentLog };\n}\n\nexport function buildCommitPrompt(context: CommitContext, instructions = \"\"): string {\n const parts = [\n \"Analyze the uncommitted git changes below and create a commit for them.\",\n \"\",\n \"Requirements:\",\n \"- Draft a commit message in Conventional Commits style (e.g. `feat(scope): summary`), consistent with the repository's recent commit history.\",\n \"- Stage the relevant files and create the commit with the bash tool (`git add` + `git commit`), through the normal permission flow.\",\n \"- Do not push and do not amend existing commits.\",\n \"- After committing, briefly report the commit hash and message.\",\n ];\n if (instructions) {\n parts.push(\"\", `Additional instructions from the user: ${instructions}`);\n }\n parts.push(\"\", \"## git status --short\", \"```\", context.status || \"(clean)\", \"```\");\n if (context.recentLog) {\n parts.push(\"\", \"## recent commits (git log --oneline -5)\", \"```\", context.recentLog, \"```\");\n }\n if (context.diff) {\n parts.push(\"\", \"## git diff (staged + unstaged)\", \"```diff\", context.diff, \"```\");\n if (context.diffTruncated) {\n parts.push(`(diff truncated to ${COMMIT_DIFF_MAX_LINES} lines)`);\n }\n }\n return parts.join(\"\\n\");\n}\n\nexport interface WorkingDiff {\n status: string;\n diff: string;\n truncated: boolean;\n}\n\nexport function collectWorkingDiff(cwd: string): WorkingDiff | null {\n if (!isGitRepo(cwd)) return null;\n const status = runGit([\"status\", \"--short\"], cwd) ?? \"\";\n const { staged, unstaged } = collectDiffs(cwd);\n const sections: string[] = [];\n if (staged) sections.push(`# Staged changes\\n${staged}`);\n if (unstaged) sections.push(`# Unstaged changes\\n${unstaged}`);\n const { text, truncated } = truncateLines(sections.join(\"\\n\"), WORKING_DIFF_MAX_LINES);\n return { status, diff: text, truncated };\n}\n","import type { CoreMessage, ToolCallPart } from \"ai\";\n\nexport type { CoreMessage };\n\nexport interface ImageInput {\n path: string;\n mimeType: string;\n /** Base64-encoded image bytes. */\n data: string;\n}\n\nexport interface MultimodalInput {\n text: string;\n images: ImageInput[];\n}\n\nexport type ChatInput = string | MultimodalInput;\n\nexport interface ConversationState {\n messages: CoreMessage[];\n}\n\nexport const MISSING_TOOL_RESULT_TEXT = \"tool result missing (session was interrupted)\";\n\nexport function reconcileToolCalls(messages: CoreMessage[]): CoreMessage[] {\n const result: CoreMessage[] = [];\n let pending: { toolCallId: string; toolName: string }[] = [];\n\n const flushPending = () => {\n for (const call of pending) {\n result.push({\n role: \"tool\",\n content: [\n {\n type: \"tool-result\",\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n result: MISSING_TOOL_RESULT_TEXT,\n },\n ],\n });\n }\n pending = [];\n };\n\n for (const message of messages) {\n if (message.role === \"assistant\" && Array.isArray(message.content)) {\n flushPending();\n pending = message.content\n .filter((part): part is ToolCallPart => part.type === \"tool-call\")\n .map((part) => ({ toolCallId: part.toolCallId, toolName: part.toolName }));\n } else if (message.role === \"tool\" && Array.isArray(message.content) && pending.length > 0) {\n const answered = new Set(message.content.map((part) => part.toolCallId));\n pending = pending.filter((call) => !answered.has(call.toolCallId));\n } else {\n flushPending();\n }\n result.push(message);\n }\n flushPending();\n return result;\n}\n\n// Removes the last conversation turn: the final user message and everything\n// after it (assistant text, tool calls and results belonging to that turn).\n// A leading system message is never touched. Returns the trimmed list and\n// how many messages were dropped (0 = nothing to retract).\nexport function retractLastTurn(messages: CoreMessage[]): {\n messages: CoreMessage[];\n removed: number;\n} {\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i]?.role === \"user\") {\n return { messages: messages.slice(0, i), removed: messages.length - i };\n }\n }\n return { messages, removed: 0 };\n}\n","import { type ChildProcess, spawn } from \"node:child_process\";\nimport type { HookConfig } from \"../config/schema\";\n\nexport type HookEvent = \"PreToolUse\" | \"PostToolUse\" | \"Stop\";\n\nexport interface HookRunContext {\n cwd: string;\n sessionId?: string;\n toolName?: string;\n toolInput?: unknown;\n}\n\nexport interface HookRunResult {\n blocked: boolean;\n reason?: string;\n warnings: string[];\n}\n\nconst STDERR_LIMIT = 2000;\nconst STDERR_CAPTURE_LIMIT = 64 * 1024;\n\ninterface CommandOutcome {\n code: number;\n stderr: string;\n timedOut: boolean;\n spawnError?: string;\n}\n\nfunction truncate(text: string): string {\n const trimmed = text.trim();\n return trimmed.length > STDERR_LIMIT ? `${trimmed.slice(0, STDERR_LIMIT)}…` : trimmed;\n}\n\n// On timeout the whole process tree must die: killing only the shell (what\n// child_process timeout does) orphans the real command. On Windows cmd.exe\n// does not exec its child — the survivor would keep running and lock the\n// working directory. On POSIX the orphaned grandchild keeps the stdio pipes\n// open, so the \"close\" event never fires and the hook hangs — hence the\n// process-group kill (the child is spawned detached, making it a group\n// leader).\nfunction killTree(pid: number | undefined): void {\n if (pid === undefined) return;\n if (process.platform === \"win32\") {\n spawn(\"taskkill\", [\"/pid\", String(pid), \"/T\", \"/F\"], { windowsHide: true }).on(\n \"error\",\n () => {},\n );\n } else {\n try {\n process.kill(-pid, \"SIGKILL\");\n } catch {\n try {\n process.kill(pid, \"SIGKILL\");\n } catch {\n // Already gone.\n }\n }\n }\n}\n\nfunction runCommand(\n hook: HookConfig,\n event: HookEvent,\n ctx: HookRunContext,\n): Promise<CommandOutcome> {\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n STAR_HOOK_EVENT: event,\n STAR_CWD: ctx.cwd,\n STAR_SESSION_ID: ctx.sessionId ?? \"\",\n };\n if (ctx.toolName !== undefined) env.STAR_TOOL_NAME = ctx.toolName;\n if (ctx.toolInput !== undefined) env.STAR_TOOL_INPUT = JSON.stringify(ctx.toolInput);\n return new Promise((resolve) => {\n let child: ChildProcess;\n try {\n child = spawn(hook.command, [], {\n shell: true,\n cwd: ctx.cwd,\n env,\n windowsHide: true,\n detached: process.platform !== \"win32\",\n });\n } catch (error) {\n resolve({\n code: 1,\n stderr: \"\",\n timedOut: false,\n spawnError: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n let stderr = \"\";\n let timedOut = false;\n let settled = false;\n const finish = (outcome: CommandOutcome) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n clearTimeout(fallback);\n resolve(outcome);\n };\n const timer = setTimeout(() => {\n timedOut = true;\n killTree(child.pid);\n child.stdout?.destroy();\n child.stderr?.destroy();\n fallback = setTimeout(() => {\n finish({ code: 1, stderr, timedOut: true });\n }, 2000);\n fallback.unref?.();\n }, hook.timeoutSec * 1000);\n let fallback: NodeJS.Timeout;\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n if (stderr.length < STDERR_CAPTURE_LIMIT) stderr += chunk.toString(\"utf8\");\n });\n child.stdout?.resume();\n child.on(\"error\", (error) => {\n finish({ code: 1, stderr, timedOut, spawnError: error.message });\n });\n child.on(\"close\", (code) => {\n finish({ code: code ?? 1, stderr, timedOut });\n });\n });\n}\n\nfunction hookMatches(hook: HookConfig, event: HookEvent, toolName?: string): boolean {\n if (hook.event !== event) return false;\n // A matcher filters by tool name; Stop carries no tool, so matchers are\n // ignored there. Invalid patterns are rejected at config load, but guard\n // anyway so a hook can never crash the agent.\n if (event === \"Stop\" || !hook.matcher) return true;\n if (toolName === undefined) return false;\n try {\n return new RegExp(hook.matcher).test(toolName);\n } catch {\n return false;\n }\n}\n\nexport async function runHooks(\n event: HookEvent,\n hooks: HookConfig[],\n ctx: HookRunContext,\n): Promise<HookRunResult> {\n const result: HookRunResult = { blocked: false, warnings: [] };\n for (const hook of hooks) {\n if (!hookMatches(hook, event, ctx.toolName)) continue;\n let outcome: CommandOutcome;\n try {\n outcome = await runCommand(hook, event, ctx);\n } catch (error) {\n result.warnings.push(\n `Hook \"${hook.command}\" (${event}) failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n continue;\n }\n if (outcome.code === 0) continue;\n const stderr = truncate(outcome.stderr);\n if (event === \"PreToolUse\" && outcome.code === 2 && !outcome.timedOut) {\n result.blocked = true;\n result.reason = stderr || `hook \"${hook.command}\" exited with code 2`;\n return result;\n }\n const detail = outcome.timedOut\n ? `timed out after ${hook.timeoutSec}s`\n : outcome.spawnError\n ? `failed to start: ${outcome.spawnError}`\n : `exited with code ${outcome.code}`;\n result.warnings.push(\n `Hook \"${hook.command}\" (${event}) ${detail}${stderr ? `: ${stderr}` : \"\"}`,\n );\n }\n return result;\n}\n","import path from \"node:path\";\nimport { isAllowedByRules } from \"./allow\";\nimport type {\n PermissionContext,\n PermissionDecision,\n PermissionMode,\n PermissionRequest,\n} from \"./types\";\n\nconst FILE_TOOLS = new Set([\"write_file\", \"edit_file\", \"read_file\"]);\n\nconst DANGEROUS_COMMAND_PATTERNS = [\n /rm\\s+-rf\\s+\\/(?:\\s|$|;|&)/i,\n /rm\\s+-rf\\s+~(?:\\s|\\/|$|;|&)/i,\n /:\\(\\)\\s*\\{\\s*:\\|:&\\s*\\}\\s*;:/,\n /\\bmkfs\\b/i,\n /dd\\s+[^|;]*\\bif=/i,\n />\\s*\\/dev\\/sd[a-z]/i,\n /\\bshutdown\\b/i,\n /\\breboot\\b/i,\n /\\bpoweroff\\b/i,\n];\n\nexport function isDangerousCommand(command: string): boolean {\n return DANGEROUS_COMMAND_PATTERNS.some((pattern) => pattern.test(command));\n}\n\nfunction getStringArg(args: unknown, key: string): string | undefined {\n if (typeof args === \"object\" && args !== null) {\n const value = (args as Record<string, unknown>)[key];\n if (typeof value === \"string\") {\n return value;\n }\n }\n return undefined;\n}\n\nfunction normalizeAbsolute(p: string, cwd: string): string {\n const abs = path.isAbsolute(p) ? path.normalize(p) : path.resolve(cwd, p);\n return abs.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\").toLowerCase();\n}\n\nfunction isOutsideCwd(p: string, cwd: string): boolean {\n const abs = normalizeAbsolute(p, cwd);\n const base = normalizeAbsolute(cwd, cwd);\n return abs !== base && !abs.startsWith(`${base}/`);\n}\n\nfunction isSensitivePath(p: string): boolean {\n const base = p.replace(/\\\\/g, \"/\").split(\"/\").pop()?.toLowerCase() ?? \"\";\n if (base === \".env.example\" || base === \".env.sample\" || base === \".env.template\") {\n return false;\n }\n return base === \".env\" || base.startsWith(\".env.\") || base === \"id_rsa\" || base.endsWith(\".pem\");\n}\n\nexport function checkPermission(\n mode: PermissionMode,\n req: PermissionRequest,\n ctx: PermissionContext,\n allowRules: readonly string[] = [],\n): PermissionDecision {\n // yolo bypasses every check, including the hard safety rules below.\n if (mode === \"yolo\") {\n return \"allow\";\n }\n\n const command = getStringArg(req.args, \"command\");\n const filePath = getStringArg(req.args, \"path\");\n\n if (req.toolName === \"bash\" && command !== undefined && isDangerousCommand(command)) {\n return \"deny\";\n }\n\n if (FILE_TOOLS.has(req.toolName) && filePath !== undefined) {\n if (\n (req.toolName === \"write_file\" || req.toolName === \"edit_file\") &&\n isSensitivePath(filePath)\n ) {\n return \"deny\";\n }\n if (isOutsideCwd(filePath, ctx.cwd)) {\n if (mode === \"ask\" && req.level === \"read\") {\n return \"ask\";\n }\n return \"deny\";\n }\n }\n\n if (mode === \"auto\") {\n return \"allow\";\n }\n if (mode === \"readonly\") {\n return req.level === \"read\" ? \"allow\" : \"deny\";\n }\n if (mode === \"plan\") {\n return req.level === \"read\" ? \"allow\" : \"deny\";\n }\n if (isAllowedByRules(allowRules, req)) {\n return \"allow\";\n }\n return req.level === \"read\" ? \"allow\" : \"ask\";\n}\n\nexport function describeDecision(decision: PermissionDecision): string {\n switch (decision) {\n case \"allow\":\n return \"允许执行该操作\";\n case \"deny\":\n return \"拒绝执行:违反权限模式或硬性安全规则\";\n case \"ask\":\n return \"需要用户确认后才能执行\";\n }\n}\n","import type { PermissionRequest } from \"./types\";\n\nexport interface AllowRule {\n toolName: string;\n pattern?: string;\n}\n\nexport function parseAllowRule(rule: string): AllowRule | null {\n const match = /^([\\w-]+)(?:\\((.*)\\))?$/.exec(rule.trim());\n if (!match) return null;\n return { toolName: match[1] as string, pattern: match[2] };\n}\n\nfunction globMatch(pattern: string, value: string): boolean {\n const escaped = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n return new RegExp(`^${escaped}$`).test(value);\n}\n\nfunction requestTarget(req: PermissionRequest): string | undefined {\n if (typeof req.args !== \"object\" || req.args === null) return undefined;\n const args = req.args as Record<string, unknown>;\n const key = req.toolName === \"bash\" ? \"command\" : \"path\";\n const value = args[key];\n return typeof value === \"string\" ? value : undefined;\n}\n\nexport function matchAllowRule(rule: AllowRule, req: PermissionRequest): boolean {\n if (rule.toolName !== req.toolName) return false;\n if (rule.pattern === undefined) return true;\n const target = requestTarget(req);\n return target !== undefined && globMatch(rule.pattern, target);\n}\n\nexport function isAllowedByRules(rules: readonly string[], req: PermissionRequest): boolean {\n return rules.some((raw) => {\n const rule = parseAllowRule(raw);\n return rule !== null && matchAllowRule(rule, req);\n });\n}\n\nexport function buildAllowRule(req: PermissionRequest): string {\n const target = requestTarget(req);\n return target !== undefined ? `${req.toolName}(${target})` : req.toolName;\n}\n","import { type LanguageModel, generateText } from \"ai\";\nimport type { SessionStore } from \"./store\";\n\nconst TITLE_MAX_CHARS = 50;\nconst TITLE_INPUT_MAX_CHARS = 1000;\nconst TITLE_MAX_TOKENS = 20;\nconst TITLE_TIMEOUT_MS = 15_000;\n\nconst TITLE_SYSTEM_PROMPT = [\n \"You write short titles for conversations.\",\n \"Summarize the user's first message into a single concise title:\",\n \"- at most 50 characters\",\n \"- no surrounding quotes, no trailing punctuation\",\n \"- same language as the user's message\",\n \"Output only the title, nothing else.\",\n].join(\"\\n\");\n\nfunction sanitizeTitle(raw: string): string {\n let title = raw.trim().split(\"\\n\")[0]?.trim() ?? \"\";\n let previous: string;\n do {\n previous = title;\n title = title\n .replace(/^[\"'“”‘’「」『』\\s]+|[\"'“”‘’「」『』\\s]+$/g, \"\")\n .replace(/[。..!!??…::;;,,、\\s]+$/u, \"\");\n } while (title !== previous);\n return title.slice(0, TITLE_MAX_CHARS).trim();\n}\n\nexport async function generateSessionTitle(\n userText: string,\n model: LanguageModel,\n): Promise<string> {\n const { text } = await generateText({\n model,\n system: TITLE_SYSTEM_PROMPT,\n prompt: userText.slice(0, TITLE_INPUT_MAX_CHARS),\n maxTokens: TITLE_MAX_TOKENS,\n abortSignal: AbortSignal.timeout(TITLE_TIMEOUT_MS),\n });\n return sanitizeTitle(text);\n}\n\n// Fire-and-forget title generation: never throws, never blocks the caller,\n// and skips sessions that already have a title. An unfinished request is\n// bounded by TITLE_TIMEOUT_MS and may simply be dropped when the process\n// exits — the title just stays empty.\nexport function scheduleSessionTitle(\n store: SessionStore,\n userText: string,\n model: LanguageModel,\n): void {\n void (async () => {\n const meta = await store.meta();\n if (meta.title) return;\n const title = await generateSessionTitle(userText, model);\n if (!title) return;\n const current = await store.meta();\n if (current.title) return;\n await store.setTitle(title);\n })().catch(() => {});\n}\n","import { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport interface FileSnapshot {\n // Checkpoint id, monotonically increasing per process (seeded from the\n // resumed session's records, so ids stay unique across resume). Assigned\n // when the snapshot is captured; failed tool calls leave gaps, which is fine.\n id: number;\n path: string;\n existed: boolean;\n content: string | null;\n // Lazy source for the old content when the snapshot was hydrated from a\n // persisted session checkpoint instead of captured in this process.\n contentFile?: string;\n toolName: string;\n timestamp: number;\n // Seq of the conversation turn that produced this snapshot (0 = no turn\n // context, e.g. direct tool use in tests). Monotonically increasing per\n // process, so a turn's snapshots can be reverted without touching older ones.\n turn: number;\n // Index of the user message that started the turn, used by /rewind to\n // retract the conversation to the same point. -1 = unknown (no turn\n // context, or the change came from a subagent turn).\n messageIndex: number;\n}\n\n// Persistence callbacks, bound by the agent loop when a session store is\n// attached. Every snapshot that enters or leaves the in-memory stack is\n// mirrored to the session directory so /rewind works after resume.\nexport interface SnapshotHooks {\n onPush?(snapshot: FileSnapshot): void | Promise<void>;\n onRemove?(ids: number[]): void | Promise<void>;\n}\n\nconst MAX_SNAPSHOTS = 50;\n\nconst stack: FileSnapshot[] = [];\nlet activeTurn = 0;\nlet activeTurnMessageIndex = -1;\nlet checkpointSeq = 0;\nlet hooks: SnapshotHooks | null = null;\n\nexport function setSnapshotHooks(next: SnapshotHooks | null): void {\n hooks = next;\n}\n\nexport function nextSnapshotId(): number {\n return ++checkpointSeq;\n}\n\n// Called by the agent loop at the start of every conversation turn; returns\n// the seq assigned to the turn. Tool-made snapshots record this seq and the\n// message index the turn started at.\nexport function beginTurn(messageIndex = -1): number {\n activeTurnMessageIndex = messageIndex;\n return ++activeTurn;\n}\n\nexport function currentTurnSeq(): number {\n return activeTurn;\n}\n\nexport function currentTurnMessageIndex(): number {\n return activeTurnMessageIndex;\n}\n\nexport async function captureSnapshot(filePath: string, toolName: string): Promise<FileSnapshot> {\n let content: string | null = null;\n let existed = false;\n try {\n content = await readFile(filePath, \"utf8\");\n existed = true;\n } catch {\n // file does not exist or is unreadable; recorded as non-existent\n }\n return {\n id: nextSnapshotId(),\n path: filePath,\n existed,\n content,\n toolName,\n timestamp: Date.now(),\n turn: activeTurn,\n messageIndex: activeTurnMessageIndex,\n };\n}\n\nexport async function pushSnapshot(snapshot: FileSnapshot): Promise<void> {\n stack.push(snapshot);\n await hooks?.onPush?.(snapshot);\n if (stack.length > MAX_SNAPSHOTS) {\n const evicted = stack.splice(0, stack.length - MAX_SNAPSHOTS);\n await removeFromStore(evicted.map((s) => s.id));\n }\n}\n\nasync function removeFromStore(ids: number[]): Promise<void> {\n if (ids.length > 0) await hooks?.onRemove?.(ids);\n}\n\nexport function snapshotCount(): number {\n return stack.length;\n}\n\nexport function listSnapshots(): FileSnapshot[] {\n return [...stack];\n}\n\nexport function clearSnapshots(): void {\n stack.length = 0;\n}\n\n// Replaces the in-memory stack with checkpoints loaded from a resumed\n// session's persisted records. The id counter is advanced past the loaded\n// records so new checkpoints never collide with persisted ones.\nexport function hydrateSnapshots(snapshots: FileSnapshot[]): void {\n stack.length = 0;\n stack.push(...snapshots.slice(-MAX_SNAPSHOTS));\n for (const snapshot of stack) {\n if (snapshot.id > checkpointSeq) checkpointSeq = snapshot.id;\n }\n}\n\nasync function resolveContent(snapshot: FileSnapshot): Promise<string | null> {\n if (snapshot.content !== null) return snapshot.content;\n if (!snapshot.contentFile) return null;\n try {\n return await readFile(snapshot.contentFile, \"utf8\");\n } catch {\n return null;\n }\n}\n\nasync function revert(snapshot: FileSnapshot): Promise<string> {\n if (snapshot.existed) {\n const content = await resolveContent(snapshot);\n if (content === null) {\n return `Skipped ${snapshot.path}: the snapshot content is no longer available.`;\n }\n await mkdir(path.dirname(snapshot.path), { recursive: true });\n await writeFile(snapshot.path, content, \"utf8\");\n return `Restored ${snapshot.path} to its state before ${snapshot.toolName}.`;\n }\n await rm(snapshot.path, { force: true });\n return `Deleted ${snapshot.path} (it did not exist before ${snapshot.toolName}).`;\n}\n\nexport async function undoLastSnapshot(): Promise<string> {\n const snapshot = stack.pop();\n if (!snapshot) {\n return \"Nothing to undo (/undo only reverts file changes made by write_file/edit_file, and none are recorded yet).\";\n }\n await removeFromStore([snapshot.id]);\n return revert(snapshot);\n}\n\n// Reverts every snapshot created by the given turn, newest first, and leaves\n// snapshots from other turns untouched. Returns one message per reverted file.\nexport async function undoTurnSnapshots(turn: number): Promise<string[]> {\n const matches: FileSnapshot[] = [];\n for (let i = stack.length - 1; i >= 0; i--) {\n const snapshot = stack[i];\n if (snapshot && snapshot.turn === turn) {\n matches.push(snapshot);\n stack.splice(i, 1);\n }\n }\n await removeFromStore(matches.map((s) => s.id));\n const messages: string[] = [];\n for (const snapshot of matches) {\n messages.push(await revert(snapshot));\n }\n return messages;\n}\n\nexport interface RewindResult {\n reverted: string[];\n // Smallest conversation message index among the reverted snapshots; the\n // caller retracts the conversation back to this point. null when none of\n // the reverted snapshots carries turn context.\n messageIndex: number | null;\n}\n\n// Reverts every snapshot from checkpoint `id` onwards, newest first, restoring\n// the file state as it was just before that checkpoint. The reverted snapshots\n// are dropped from the stack (and from the persisted store via hooks).\nexport async function rewindToSnapshot(id: number): Promise<RewindResult | null> {\n if (!stack.some((snapshot) => snapshot.id === id)) return null;\n const matches: FileSnapshot[] = [];\n for (let i = stack.length - 1; i >= 0; i--) {\n const snapshot = stack[i];\n if (snapshot && snapshot.id >= id) {\n matches.push(snapshot);\n stack.splice(i, 1);\n }\n }\n await removeFromStore(matches.map((s) => s.id));\n const reverted: string[] = [];\n let messageIndex: number | null = null;\n for (const snapshot of matches) {\n reverted.push(await revert(snapshot));\n if (snapshot.messageIndex >= 0) {\n messageIndex =\n messageIndex === null\n ? snapshot.messageIndex\n : Math.min(messageIndex, snapshot.messageIndex);\n }\n }\n return { reverted, messageIndex };\n}\n","import { readFileSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\n\nexport const PROJECT_MEMORY_FILE = \"AGENTS.md\";\nexport const PROJECT_MEMORY_MAX_CHARS = 32 * 1024;\n\ninterface CacheEntry {\n mtimeMs: number;\n block: string | null;\n}\n\nconst cache = new Map<string, CacheEntry>();\n\n// Reads <cwd>/AGENTS.md as project memory for the system prompt. Returns a\n// delimited block, or null when the file is missing, unreadable, or empty.\n// Synchronous like the git helpers; content is cached by path and re-read\n// only when the mtime changes, so /init regenerations mid-session are\n// picked up without a stat+read on every turn beyond a cheap statSync.\nexport function readProjectMemory(cwd: string): string | null {\n const file = path.join(cwd, PROJECT_MEMORY_FILE);\n let mtimeMs: number;\n try {\n mtimeMs = statSync(file).mtimeMs;\n } catch {\n return null;\n }\n const hit = cache.get(file);\n if (hit && hit.mtimeMs === mtimeMs) return hit.block;\n\n let block: string | null = null;\n try {\n let body = readFileSync(file, \"utf8\").trim();\n if (body) {\n if (body.length > PROJECT_MEMORY_MAX_CHARS) {\n body = `${body.slice(0, PROJECT_MEMORY_MAX_CHARS)}\\n\\n[AGENTS.md truncated to ${PROJECT_MEMORY_MAX_CHARS} characters]`;\n }\n block = `# Project instructions (AGENTS.md)\\n${body}`;\n }\n } catch {\n block = null;\n }\n cache.set(file, { mtimeMs, block });\n return block;\n}\n","import type { LanguageModel } from \"ai\";\nimport { z } from \"zod\";\nimport type { StarConfig } from \"../config/schema\";\nimport type { PermissionRequest } from \"../permissions/types\";\nimport { createDefaultRegistry } from \"../tools\";\nimport type { Tool, ToolResult } from \"../tools/types\";\n\n// Subagents run one level deep: the child loop is created without the\n// subagent tool, so a subagent can never spawn another subagent.\nexport const MAX_SUBAGENT_DEPTH = 1;\n\nconst MAX_REPORT_CHARS = 20_000;\n\nconst SUBAGENT_PROMPT =\n \"You are a subagent spawned to handle a focused subtask on behalf of the main agent. Work autonomously with the tools available to you, then finish with a concise report of what you found or did. Your final text is returned to the main agent as the tool result — make it self-contained.\";\n\nexport interface SubagentDeps {\n model: LanguageModel;\n config: StarConfig;\n cwd: string;\n system?: string;\n depth: number;\n getConfirmHandler?: () => ((req: PermissionRequest) => Promise<boolean>) | undefined;\n}\n\nexport function createSubagentTool(deps: SubagentDeps): Tool {\n return {\n name: \"subagent\",\n description:\n \"Spawn a subagent with its own agent loop to handle a focused subtask (research, exploration, or an isolated change). The subagent has the same tools but cannot spawn further subagents. Returns the subagent's final report. Prefer this for self-contained work that would otherwise clutter the main conversation.\",\n permission: \"exec\",\n parameters: z.object({\n prompt: z.string().describe(\"Complete, self-contained instructions for the subagent.\"),\n description: z\n .string()\n .optional()\n .describe(\"Short label for the subtask, shown in the result header.\"),\n }),\n async execute(args, ctx): Promise<ToolResult> {\n const { AgentLoop } = await import(\"./loop\");\n const child = new AgentLoop({\n model: deps.model,\n registry: createDefaultRegistry(),\n config: deps.config,\n cwd: ctx.cwd,\n system: deps.system ? `${deps.system}\\n\\n${SUBAGENT_PROMPT}` : SUBAGENT_PROMPT,\n subagentDepth: deps.depth + 1,\n });\n const confirmHandler = deps.getConfirmHandler?.();\n if (confirmHandler) child.confirmHandler = confirmHandler;\n\n const signal = ctx.abortSignal ?? new AbortController().signal;\n let toolCalls = 0;\n let error: string | null = null;\n try {\n for await (const event of child.stream(args.prompt, signal)) {\n if (event.type === \"tool-result\") {\n toolCalls++;\n } else if (event.type === \"error\") {\n error = event.error.message;\n break;\n }\n }\n } catch (e) {\n error = e instanceof Error ? e.message : String(e);\n }\n\n let report = \"\";\n const messages = child.getMessages();\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i];\n if (message?.role !== \"assistant\" || !Array.isArray(message.content)) continue;\n const text = message.content\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\");\n if (text) {\n report = text;\n break;\n }\n }\n if (report.length > MAX_REPORT_CHARS) {\n report = `${report.slice(0, MAX_REPORT_CHARS)}\\n... (truncated)`;\n }\n\n const label = args.description ? ` \"${args.description}\"` : \"\";\n const stats = `[subagent${label}: ${toolCalls} tool call(s)]`;\n if (error) {\n return {\n content: [`Subagent failed: ${error}`, stats, report].filter(Boolean).join(\"\\n\"),\n isError: true,\n };\n }\n return { content: `${stats}\\n${report || \"(subagent produced no text output)\"}` };\n },\n };\n}\n","import { type ChildProcess, spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport { defaultTaskManager } from \"../tasks/manager\";\nimport type { Tool, ToolResult } from \"./types\";\n\nconst MAX_OUTPUT = 30000;\nconst DEFAULT_TIMEOUT = 120;\nconst MAX_TIMEOUT = 600;\n\nexport interface ShellSpec {\n shell: string;\n wrap: (command: string) => string[];\n label: string;\n}\n\nfunction findOnPath(exe: string, exclude?: (dir: string) => boolean): string | null {\n for (const dir of (process.env.PATH ?? \"\").split(path.delimiter)) {\n if (!dir || exclude?.(dir)) {\n continue;\n }\n const full = path.join(dir, exe);\n if (existsSync(full)) {\n return full;\n }\n }\n return null;\n}\n\nexport function resolveShell(): ShellSpec {\n if (process.platform !== \"win32\") {\n return { shell: \"sh\", wrap: (c) => [\"-c\", c], label: \"sh\" };\n }\n const isWslStub = (dir: string) => /\\\\(system32|windowsapps)\\\\?$/i.test(dir.trim());\n const fromPath = findOnPath(\"bash.exe\", isWslStub);\n if (fromPath) {\n return { shell: fromPath, wrap: (c) => [\"-c\", c], label: \"bash\" };\n }\n const gitExe = findOnPath(\"git.exe\");\n if (gitExe) {\n const sibling = path.join(path.dirname(path.dirname(gitExe)), \"bin\", \"bash.exe\");\n if (existsSync(sibling)) {\n return { shell: sibling, wrap: (c) => [\"-c\", c], label: \"bash\" };\n }\n }\n for (const candidate of [\n \"C:\\\\Program Files\\\\Git\\\\bin\\\\bash.exe\",\n \"C:\\\\Program Files (x86)\\\\Git\\\\bin\\\\bash.exe\",\n \"D:\\\\Git\\\\bin\\\\bash.exe\",\n ]) {\n if (existsSync(candidate)) {\n return { shell: candidate, wrap: (c) => [\"-c\", c], label: \"bash\" };\n }\n }\n const comspec = process.env.ComSpec ?? \"cmd.exe\";\n return { shell: comspec, wrap: (c) => [\"/d\", \"/s\", \"/c\", c], label: \"cmd\" };\n}\n\nconst schema = z.object({\n command: z.string().describe(\"Shell command to execute\"),\n timeout: z\n .number()\n .positive()\n .max(MAX_TIMEOUT)\n .optional()\n .describe(\"Timeout in seconds (default 120, max 600)\"),\n description: z.string().optional().describe(\"Short description of what the command does\"),\n run_in_background: z\n .boolean()\n .optional()\n .describe(\n \"Run the command in the background and return a task id immediately (default false). Use task_output/task_kill to inspect or stop it.\",\n ),\n});\n\nexport function killTree(child: ChildProcess): void {\n if (process.platform === \"win32\" && child.pid) {\n spawn(\"taskkill\", [\"/pid\", String(child.pid), \"/t\", \"/f\"], {\n windowsHide: true,\n stdio: \"ignore\",\n }).unref();\n return;\n }\n child.kill(\"SIGKILL\");\n}\n\nfunction truncateMiddle(s: string): string {\n if (s.length <= MAX_OUTPUT) {\n return s;\n }\n const half = Math.floor(MAX_OUTPUT / 2);\n const head = s.slice(0, half);\n const tail = s.slice(-half);\n return `${head}\\n... [${s.length - MAX_OUTPUT} characters truncated] ...\\n${tail}`;\n}\n\nexport const bashTool: Tool<typeof schema> = {\n name: \"bash\",\n description:\n \"Execute a shell command (Git Bash on Windows when available, otherwise cmd; sh elsewhere). Stdout and stderr are merged. Output is truncated to 30000 characters. Set run_in_background for long-running commands; it returns a task id for task_list/task_output/task_kill.\",\n permission: \"exec\",\n parameters: schema,\n execute(args, ctx) {\n if (args.run_in_background) {\n const task = defaultTaskManager.start({\n command: args.command,\n description: args.description,\n cwd: ctx.cwd,\n timeoutSeconds: args.timeout,\n });\n return Promise.resolve({\n content: `Background task started: ${task.id}\\ncommand: ${args.command}\\ndescription: ${args.description ?? \"(none)\"}`,\n });\n }\n const timeoutSeconds = Math.min(args.timeout ?? DEFAULT_TIMEOUT, MAX_TIMEOUT);\n const spec = resolveShell();\n return new Promise<ToolResult>((resolve) => {\n const child = spawn(spec.shell, spec.wrap(args.command), {\n cwd: ctx.cwd,\n windowsHide: true,\n });\n let output = \"\";\n let settled = false;\n const finish = (result: ToolResult) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n ctx.abortSignal?.removeEventListener(\"abort\", onAbort);\n resolve(result);\n };\n const onAbort = () => {\n killTree(child);\n finish({ content: `${truncateMiddle(output)}\\nCommand aborted`, isError: true });\n };\n const timer = setTimeout(() => {\n killTree(child);\n finish({\n content: `${truncateMiddle(output)}\\nCommand timed out after ${timeoutSeconds}s`,\n isError: true,\n });\n }, timeoutSeconds * 1000);\n child.stdout.on(\"data\", (d: Buffer) => {\n output += d.toString(\"utf8\");\n });\n child.stderr.on(\"data\", (d: Buffer) => {\n output += d.toString(\"utf8\");\n });\n child.on(\"error\", (err) => {\n finish({ content: `Failed to start shell '${spec.label}': ${err.message}`, isError: true });\n });\n ctx.abortSignal?.addEventListener(\"abort\", onAbort);\n child.on(\"close\", (code) => {\n const trimmed = output.replace(/\\s+$/, \"\");\n if (code === 0) {\n finish({ content: truncateMiddle(trimmed) || \"(no output)\" });\n return;\n }\n const body = truncateMiddle(trimmed);\n finish({\n content: `${body}${body ? \"\\n\" : \"\"}Exit code: ${code ?? \"unknown\"}`,\n isError: true,\n });\n });\n });\n },\n};\n","import { type ChildProcess, spawn } from \"node:child_process\";\nimport { EventEmitter } from \"node:events\";\nimport { killTree, resolveShell } from \"../tools/bash\";\n\nexport type TaskStatus = \"running\" | \"completed\" | \"failed\" | \"timed_out\" | \"stopped\";\n\nexport interface TaskSnapshot {\n id: string;\n command: string;\n description?: string;\n status: TaskStatus;\n startedAt: number;\n endedAt?: number;\n exitCode?: number | null;\n output: string;\n}\n\nexport const MAX_TASK_OUTPUT = 100_000;\nexport const DEFAULT_TASK_TIMEOUT = 3600;\n\nconst TRUNCATED_PREFIX = \"[... earlier output truncated ...]\\n\";\n\ninterface TaskRecord {\n id: string;\n command: string;\n description?: string;\n status: TaskStatus;\n startedAt: number;\n endedAt?: number;\n exitCode?: number | null;\n output: string;\n truncated: boolean;\n child: ChildProcess;\n timer?: NodeJS.Timeout;\n}\n\nexport interface StartTaskOptions {\n command: string;\n description?: string;\n cwd: string;\n timeoutSeconds?: number;\n}\n\nexport class TaskManager extends EventEmitter {\n private records = new Map<string, TaskRecord>();\n private seq = 0;\n\n start(opts: StartTaskOptions): TaskSnapshot {\n const id = `task-${++this.seq}`;\n const spec = resolveShell();\n const child = spawn(spec.shell, spec.wrap(opts.command), {\n cwd: opts.cwd,\n windowsHide: true,\n });\n const rec: TaskRecord = {\n id,\n command: opts.command,\n description: opts.description,\n status: \"running\",\n startedAt: Date.now(),\n output: \"\",\n truncated: false,\n child,\n };\n this.records.set(id, rec);\n\n const append = (d: Buffer) => {\n rec.output += d.toString(\"utf8\");\n if (rec.output.length > MAX_TASK_OUTPUT) {\n rec.output = rec.output.slice(-MAX_TASK_OUTPUT);\n rec.truncated = true;\n }\n };\n child.stdout.on(\"data\", append);\n child.stderr.on(\"data\", append);\n child.on(\"error\", (err) => {\n append(Buffer.from(`Failed to start shell '${spec.label}': ${err.message}\\n`));\n if (rec.status === \"running\") {\n this.finish(rec, \"failed\", null);\n }\n });\n child.on(\"close\", (code) => {\n if (rec.status !== \"running\") return;\n this.finish(rec, code === 0 ? \"completed\" : \"failed\", code);\n });\n\n const timeoutSeconds = opts.timeoutSeconds ?? DEFAULT_TASK_TIMEOUT;\n rec.timer = setTimeout(() => this.terminate(rec, \"timed_out\"), timeoutSeconds * 1000);\n rec.timer.unref();\n\n this.emitUpdate(rec);\n return this.snapshot(rec);\n }\n\n get(id: string): TaskSnapshot | undefined {\n const rec = this.records.get(id);\n return rec ? this.snapshot(rec) : undefined;\n }\n\n list(): TaskSnapshot[] {\n return [...this.records.values()].map((rec) => this.snapshot(rec));\n }\n\n runningCount(): number {\n let count = 0;\n for (const rec of this.records.values()) {\n if (rec.status === \"running\") count += 1;\n }\n return count;\n }\n\n kill(id: string): TaskSnapshot | undefined {\n const rec = this.records.get(id);\n if (!rec || rec.status !== \"running\") return undefined;\n this.terminate(rec, \"stopped\");\n return this.snapshot(rec);\n }\n\n cleanup(): TaskSnapshot[] {\n const killed: TaskSnapshot[] = [];\n for (const rec of this.records.values()) {\n if (rec.status === \"running\") {\n this.terminate(rec, \"stopped\");\n killed.push(this.snapshot(rec));\n }\n }\n return killed;\n }\n\n private terminate(rec: TaskRecord, status: TaskStatus): void {\n killTree(rec.child);\n this.finish(rec, status, null);\n }\n\n private finish(rec: TaskRecord, status: TaskStatus, exitCode: number | null): void {\n if (rec.timer) clearTimeout(rec.timer);\n rec.status = status;\n rec.exitCode = exitCode;\n rec.endedAt = Date.now();\n this.emitUpdate(rec);\n }\n\n private emitUpdate(rec: TaskRecord): void {\n this.emit(\"update\", this.snapshot(rec));\n }\n\n private snapshot(rec: TaskRecord): TaskSnapshot {\n return {\n id: rec.id,\n command: rec.command,\n description: rec.description,\n status: rec.status,\n startedAt: rec.startedAt,\n endedAt: rec.endedAt,\n exitCode: rec.exitCode,\n output: rec.truncated ? TRUNCATED_PREFIX + rec.output : rec.output,\n };\n }\n}\n\nexport const defaultTaskManager = new TaskManager();\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"../types\";\nimport { currentTurnMessageIndex, currentTurnSeq, nextSnapshotId, pushSnapshot } from \"./snapshots\";\n\nconst schema = z.object({\n path: z.string().describe(\"File path, absolute or relative to the working directory\"),\n old_string: z.string().min(1).describe(\"Exact text to replace\"),\n new_string: z.string().describe(\"Replacement text\"),\n replace_all: z\n .boolean()\n .optional()\n .describe(\"Replace every occurrence instead of requiring a unique match\"),\n});\n\nexport const editFileTool: Tool<typeof schema> = {\n name: \"edit_file\",\n description:\n \"Replace an exact string in a file. Fails if old_string is not found or matches multiple locations unless replace_all is set.\",\n permission: \"write\",\n parameters: schema,\n async execute(args, ctx) {\n const filePath = path.resolve(ctx.cwd, args.path);\n let content: string;\n try {\n content = await readFile(filePath, \"utf8\");\n } catch (err) {\n return { content: `Failed to read ${args.path}: ${(err as Error).message}`, isError: true };\n }\n let count = 0;\n let idx = content.indexOf(args.old_string);\n while (idx !== -1) {\n count += 1;\n idx = content.indexOf(args.old_string, idx + args.old_string.length);\n }\n if (count === 0) {\n return { content: `old_string not found in ${args.path}`, isError: true };\n }\n if (count > 1 && !args.replace_all) {\n return {\n content: `old_string matches ${count} locations in ${args.path}; provide more surrounding context or set replace_all`,\n isError: true,\n };\n }\n const updated = args.replace_all\n ? content.split(args.old_string).join(args.new_string)\n : content.replace(args.old_string, args.new_string);\n try {\n await writeFile(filePath, updated, \"utf8\");\n } catch (err) {\n return { content: `Failed to write ${args.path}: ${(err as Error).message}`, isError: true };\n }\n await pushSnapshot({\n id: nextSnapshotId(),\n path: filePath,\n existed: true,\n content,\n toolName: \"edit_file\",\n timestamp: Date.now(),\n turn: currentTurnSeq(),\n messageIndex: currentTurnMessageIndex(),\n });\n return { content: `Edited ${args.path}: ${count} replacement${count > 1 ? \"s\" : \"\"}` };\n },\n};\n","import path from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"../types\";\nimport { matchesGlob, walkFiles } from \"./util\";\n\nconst MAX_RESULTS = 100;\n\nconst schema = z.object({\n pattern: z\n .string()\n .describe(\n \"Glob pattern, e.g. 'src/**/*.ts'. Supports **, * and ?. A bare pattern like '*.ts' matches basenames recursively.\",\n ),\n path: z.string().optional().describe(\"Directory to search, defaults to the working directory\"),\n});\n\nexport const globTool: Tool<typeof schema> = {\n name: \"glob\",\n description:\n \"Find files by glob pattern. Skips node_modules, .git and dist. Returns paths sorted by modification time, newest first, up to 100 results.\",\n permission: \"read\",\n parameters: schema,\n async execute(args, ctx) {\n const root = path.resolve(ctx.cwd, args.path ?? \".\");\n const files = await walkFiles(root);\n const matched = files\n .filter((f) => matchesGlob(args.pattern, f.rel))\n .sort((a, b) => b.mtimeMs - a.mtimeMs)\n .slice(0, MAX_RESULTS);\n if (matched.length === 0) {\n return { content: `No files matched pattern: ${args.pattern}` };\n }\n return { content: matched.map((f) => f.rel).join(\"\\n\") };\n },\n};\n","import { readdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport const SKIP_DIRS = new Set([\"node_modules\", \".git\", \"dist\"]);\n\nexport interface WalkedFile {\n abs: string;\n rel: string;\n mtimeMs: number;\n}\n\nexport async function walkFiles(\n root: string,\n skipDirs: Set<string> = SKIP_DIRS,\n): Promise<WalkedFile[]> {\n const out: WalkedFile[] = [];\n async function walk(dir: string, relBase: string): Promise<void> {\n const entries = await readdir(dir, { withFileTypes: true }).catch(() => null);\n if (!entries) {\n return;\n }\n for (const entry of entries) {\n const abs = path.join(dir, entry.name);\n const rel = relBase ? `${relBase}/${entry.name}` : entry.name;\n if (entry.isDirectory()) {\n if (!skipDirs.has(entry.name)) {\n await walk(abs, rel);\n }\n } else if (entry.isFile()) {\n try {\n const st = await stat(abs);\n out.push({ abs, rel, mtimeMs: st.mtimeMs });\n } catch {\n // ignore unreadable entries\n }\n }\n }\n }\n await walk(root, \"\");\n return out;\n}\n\nconst REGEX_SPECIALS = /[.+^${}()|[\\]\\\\]/g;\n\nexport function globToRegExp(pattern: string): RegExp {\n let re = \"\";\n let i = 0;\n while (i < pattern.length) {\n const c = pattern.charAt(i);\n if (c === \"*\") {\n if (pattern.charAt(i + 1) === \"*\") {\n i += 2;\n if (pattern.charAt(i) === \"/\") {\n i += 1;\n re += \"(?:[^/]+/)*\";\n } else {\n re += \".*\";\n }\n } else {\n re += \"[^/]*\";\n i += 1;\n }\n } else if (c === \"?\") {\n re += \"[^/]\";\n i += 1;\n } else {\n re += c.replace(REGEX_SPECIALS, \"\\\\$&\");\n i += 1;\n }\n }\n return new RegExp(`^${re}$`);\n}\n\nexport function matchesGlob(pattern: string, relPath: string): boolean {\n const normalized = pattern.replace(/\\\\/g, \"/\");\n if (!normalized.includes(\"/\")) {\n const base = relPath.split(\"/\").pop() ?? relPath;\n return globToRegExp(normalized).test(base);\n }\n return globToRegExp(normalized).test(relPath);\n}\n\nexport function isSensitivePath(filePath: string): boolean {\n const base = path.basename(filePath);\n if (base === \".env.example\" || base === \".env.sample\" || base === \".env.template\") {\n return false;\n }\n if (base === \".env\" || base.startsWith(\".env.\")) {\n return true;\n }\n if (base === \"id_rsa\" || base.endsWith(\".pem\")) {\n return true;\n }\n return false;\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"../types\";\nimport { type WalkedFile, matchesGlob, walkFiles } from \"./util\";\n\nconst MAX_MATCHES = 250;\n\nconst schema = z.object({\n pattern: z.string().describe(\"Regular expression to search for\"),\n path: z\n .string()\n .optional()\n .describe(\"File or directory to search, defaults to the working directory\"),\n glob: z\n .string()\n .optional()\n .describe(\"Glob pattern to filter which files are searched, e.g. '*.ts'\"),\n ignoreCase: z.boolean().optional().describe(\"Case-insensitive matching\"),\n});\n\nexport const grepTool: Tool<typeof schema> = {\n name: \"grep\",\n description:\n \"Search file contents with a regular expression. Outputs 'file:line:content', up to 250 matches. Skips binary files, node_modules and .git.\",\n permission: \"read\",\n parameters: schema,\n async execute(args, ctx) {\n let re: RegExp;\n try {\n re = new RegExp(args.pattern, args.ignoreCase ? \"i\" : \"\");\n } catch (err) {\n return { content: `Invalid regular expression: ${(err as Error).message}`, isError: true };\n }\n const root = path.resolve(ctx.cwd, args.path ?? \".\");\n let files: WalkedFile[];\n try {\n const st = await stat(root);\n if (st.isFile()) {\n files = [{ abs: root, rel: path.basename(root), mtimeMs: st.mtimeMs }];\n } else {\n files = await walkFiles(root);\n }\n } catch {\n return { content: `Path not found: ${args.path ?? \".\"}`, isError: true };\n }\n if (args.glob) {\n const glob = args.glob;\n files = files.filter((f) => matchesGlob(glob, f.rel));\n }\n const out: string[] = [];\n let truncated = false;\n outer: for (const file of files) {\n let buf: Buffer;\n try {\n buf = await readFile(file.abs);\n } catch {\n continue;\n }\n if (buf.includes(0)) {\n continue;\n }\n const lines = buf.toString(\"utf8\").split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n if (re.test(line)) {\n out.push(`${file.rel}:${i + 1}:${line}`);\n if (out.length >= MAX_MATCHES) {\n truncated = true;\n break outer;\n }\n }\n }\n }\n if (out.length === 0) {\n return { content: `No matches for pattern: ${args.pattern}` };\n }\n if (truncated) {\n out.push(`... (truncated: more than ${MAX_MATCHES} matches)`);\n }\n return { content: out.join(\"\\n\") };\n },\n};\n","import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"../types\";\nimport { isSensitivePath } from \"./util\";\n\nconst DEFAULT_LIMIT = 2000;\nconst MAX_CHARS = 100 * 1024;\n\nconst schema = z.object({\n path: z.string().describe(\"File path, absolute or relative to the working directory\"),\n offset: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"1-based line number to start reading from\"),\n limit: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Maximum number of lines to read (default 2000)\"),\n});\n\nexport const readFileTool: Tool<typeof schema> = {\n name: \"read_file\",\n description:\n \"Read a text file and return its contents with line numbers. Output is truncated to 2000 lines or 100KB by default.\",\n permission: \"read\",\n parameters: schema,\n async execute(args, ctx) {\n const filePath = path.resolve(ctx.cwd, args.path);\n if (isSensitivePath(filePath)) {\n return { content: `Refused to read sensitive file: ${args.path}`, isError: true };\n }\n const st = await stat(filePath).catch(() => null);\n if (!st) {\n return { content: `File not found: ${args.path}`, isError: true };\n }\n if (st.isDirectory()) {\n return { content: `Path is a directory, not a file: ${args.path}`, isError: true };\n }\n const raw = await readFile(filePath, \"utf8\");\n const lines = raw.split(\"\\n\");\n const start = args.offset ?? 1;\n const limit = args.limit ?? DEFAULT_LIMIT;\n const end = Math.min(lines.length, start - 1 + limit);\n const out: string[] = [];\n let size = 0;\n let truncatedBySize = false;\n for (let i = start - 1; i < end; i++) {\n const line = lines[i];\n if (line === undefined) {\n break;\n }\n const numbered = `${i + 1}\\t${line}`;\n if (size + numbered.length > MAX_CHARS) {\n truncatedBySize = true;\n break;\n }\n out.push(numbered);\n size += numbered.length;\n }\n const lastShown = start - 1 + out.length;\n if (truncatedBySize) {\n out.push(\n `... (truncated: output exceeds 100KB, showing lines ${start}-${lastShown} of ${lines.length})`,\n );\n } else if (end < lines.length) {\n out.push(`... (truncated: showing lines ${start}-${end} of ${lines.length})`);\n }\n return { content: out.join(\"\\n\") };\n },\n};\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"../types\";\nimport { captureSnapshot, pushSnapshot } from \"./snapshots\";\n\nconst schema = z.object({\n path: z.string().describe(\"File path, absolute or relative to the working directory\"),\n content: z.string().describe(\"Full content to write to the file\"),\n});\n\nexport const writeFileTool: Tool<typeof schema> = {\n name: \"write_file\",\n description:\n \"Write content to a file, creating parent directories as needed. Overwrites existing files.\",\n permission: \"write\",\n parameters: schema,\n async execute(args, ctx) {\n const filePath = path.resolve(ctx.cwd, args.path);\n const snapshot = await captureSnapshot(filePath, \"write_file\");\n try {\n await mkdir(path.dirname(filePath), { recursive: true });\n await writeFile(filePath, args.content, \"utf8\");\n } catch (err) {\n return { content: `Failed to write ${args.path}: ${(err as Error).message}`, isError: true };\n }\n await pushSnapshot(snapshot);\n return { content: `Wrote ${Buffer.byteLength(args.content, \"utf8\")} bytes to ${args.path}` };\n },\n};\n","import { z } from \"zod\";\nimport { formatTaskLine, formatTaskList } from \"../tasks/format\";\nimport { defaultTaskManager } from \"../tasks/manager\";\nimport type { Tool } from \"./types\";\n\nconst idSchema = z.object({\n id: z.string().describe(\"Task id, e.g. task-1\"),\n});\n\nexport const taskListTool: Tool = {\n name: \"task_list\",\n description: \"List background shell tasks with status, runtime, and exit code.\",\n permission: \"read\",\n parameters: z.object({}),\n execute() {\n return Promise.resolve({ content: formatTaskList(defaultTaskManager.list()) });\n },\n};\n\nexport const taskOutputTool: Tool<typeof idSchema> = {\n name: \"task_output\",\n description: \"Read the current output of a background shell task (works while still running).\",\n permission: \"read\",\n parameters: idSchema,\n execute(args) {\n const task = defaultTaskManager.get(args.id);\n if (!task) {\n return Promise.resolve({ content: `Unknown task: ${args.id}`, isError: true });\n }\n const body = task.output.replace(/\\s+$/, \"\") || \"(no output yet)\";\n return Promise.resolve({ content: `${formatTaskLine(task)}\\n${body}` });\n },\n};\n\nexport const taskKillTool: Tool<typeof idSchema> = {\n name: \"task_kill\",\n description: \"Stop a running background shell task (kills the whole process tree).\",\n permission: \"exec\",\n parameters: idSchema,\n execute(args) {\n const task = defaultTaskManager.get(args.id);\n if (!task) {\n return Promise.resolve({ content: `Unknown task: ${args.id}`, isError: true });\n }\n if (task.status !== \"running\") {\n return Promise.resolve({\n content: `Task ${args.id} is not running (status: ${task.status}).`,\n isError: true,\n });\n }\n defaultTaskManager.kill(args.id);\n return Promise.resolve({ content: `Task ${args.id} stopped.` });\n },\n};\n","import type { TaskSnapshot } from \"./manager\";\n\nexport function formatDuration(startedAt: number, endedAt?: number): string {\n const seconds = Math.max(0, Math.round(((endedAt ?? Date.now()) - startedAt) / 1000));\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m${seconds % 60}s`;\n return `${Math.floor(minutes / 60)}h${minutes % 60}m`;\n}\n\nfunction formatStatus(task: TaskSnapshot): string {\n const duration = formatDuration(task.startedAt, task.endedAt);\n if (task.status === \"running\") return `running ${duration}`;\n const exit =\n task.exitCode === null || task.exitCode === undefined ? \"\" : `, exit ${task.exitCode}`;\n return `${task.status}${exit} after ${duration}`;\n}\n\nexport function formatTaskLine(task: TaskSnapshot): string {\n const label = task.description ? `${task.description} (${task.command})` : task.command;\n return `${task.id} [${formatStatus(task)}] ${label}`;\n}\n\nexport function formatTaskList(tasks: TaskSnapshot[]): string {\n if (tasks.length === 0) return \"No background tasks.\";\n return `Background tasks:\\n${tasks.map(formatTaskLine).join(\"\\n\")}`;\n}\n\nexport function formatTaskStarted(task: TaskSnapshot): string {\n const label = task.description ? `${task.description} (${task.command})` : task.command;\n return `Background task ${task.id} started: ${label}`;\n}\n\nexport function formatTaskFinished(task: TaskSnapshot): string {\n const exit =\n task.exitCode === null || task.exitCode === undefined ? \"\" : ` (exit ${task.exitCode})`;\n switch (task.status) {\n case \"completed\":\n return `Background task ${task.id} finished${exit}: ${task.command}`;\n case \"failed\":\n return `Background task ${task.id} failed${exit}: ${task.command}`;\n case \"timed_out\":\n return `Background task ${task.id} timed out: ${task.command}`;\n case \"stopped\":\n return `Background task ${task.id} stopped: ${task.command}`;\n default:\n return `Background task ${task.id}: ${task.command}`;\n }\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"./types\";\n\nexport interface TodoItem {\n id: number;\n title: string;\n status: \"pending\" | \"in_progress\" | \"done\";\n}\n\nconst todoItemSchema = z.object({\n id: z.number().int(),\n title: z.string(),\n status: z.enum([\"pending\", \"in_progress\", \"done\"]),\n});\n\nconst writeSchema = z.object({\n todos: z.array(todoItemSchema).describe(\"The full todo list, replacing the current one\"),\n});\n\nconst readSchema = z.object({});\n\nfunction fileFor(cwd: string): string {\n return path.join(cwd, \".star\", \"todos.json\");\n}\n\nexport class TodoStore {\n private items = new Map<number, TodoItem>();\n\n list(): TodoItem[] {\n return [...this.items.values()];\n }\n\n replace(items: TodoItem[]): void {\n this.items.clear();\n for (const item of items) {\n this.items.set(item.id, item);\n }\n }\n\n async load(cwd: string): Promise<void> {\n let raw: string;\n try {\n raw = await readFile(fileFor(cwd), \"utf8\");\n } catch {\n return;\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n if (Array.isArray(parsed)) {\n this.replace(parsed.filter((it) => todoItemSchema.safeParse(it).success));\n }\n } catch {\n // corrupted file: keep current state\n }\n }\n\n async save(cwd: string): Promise<void> {\n await mkdir(path.join(cwd, \".star\"), { recursive: true });\n await writeFile(fileFor(cwd), `${JSON.stringify(this.list(), null, 2)}\\n`);\n }\n}\n\nconst SYMBOLS: Record<TodoItem[\"status\"], string> = {\n pending: \"[ ]\",\n in_progress: \"[~]\",\n done: \"[x]\",\n};\n\nexport function formatTodos(items: TodoItem[]): string {\n if (items.length === 0) {\n return \"No todos.\";\n }\n const lines = items.map((it) => `${SYMBOLS[it.status]} ${it.id}. ${it.title}`);\n const width = Math.max(...lines.map((l) => l.length));\n return lines\n .map((line, i) => {\n const status = items[i]?.status;\n return status === \"pending\" ? line : `${line.padEnd(width + 4)}(${status})`;\n })\n .join(\"\\n\");\n}\n\nconst defaultStore = new TodoStore();\n\nexport function createTodoTools(store: TodoStore = defaultStore): Tool[] {\n const todoWrite: Tool<typeof writeSchema> = {\n name: \"todo_write\",\n description:\n \"Replace the current todo list with the given items. Each item has an id, title, and status (pending, in_progress, done).\",\n permission: \"read\",\n parameters: writeSchema,\n async execute(args, ctx) {\n const parsed = writeSchema.safeParse(args);\n if (!parsed.success) {\n return { content: `Invalid todos: ${parsed.error.message}`, isError: true };\n }\n await store.load(ctx.cwd);\n store.replace(parsed.data.todos);\n await store.save(ctx.cwd);\n return { content: formatTodos(store.list()) };\n },\n };\n\n const todoRead: Tool<typeof readSchema> = {\n name: \"todo_read\",\n description: \"Read the current todo list.\",\n permission: \"read\",\n parameters: readSchema,\n async execute(_args, ctx) {\n await store.load(ctx.cwd);\n return { content: formatTodos(store.list()) };\n },\n };\n\n return [todoWrite, todoRead];\n}\n","import { z } from \"zod\";\nimport type { Tool } from \"../types\";\n\nconst DEFAULT_MAX_CHARS = 20000;\nconst MAX_BYTES = 2 * 1024 * 1024;\nconst TIMEOUT_MS = 30000;\n\nconst schema = z.object({\n url: z.string().describe(\"The http(s) URL to fetch\"),\n maxChars: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Maximum characters of text to return (default 20000)\"),\n});\n\nexport function decodeEntities(s: string): string {\n return s\n .replace(/&#(\\d+);/g, (_, n) => String.fromCodePoint(Number(n)))\n .replace(/&#x([0-9a-fA-F]+);/gi, (_, n) => String.fromCodePoint(Number.parseInt(n, 16)))\n .replace(/&(quot|lt|gt|nbsp);/g, (m) => {\n switch (m) {\n case \""\":\n return '\"';\n case \"<\":\n return \"<\";\n case \">\":\n return \">\";\n case \" \":\n return \" \";\n default:\n return m;\n }\n })\n .replace(/&/g, \"&\");\n}\n\nfunction htmlToText(html: string): string {\n const noBlocks = html.replace(/<(script|style|noscript|template)\\b[^>]*>[\\s\\S]*?<\\/\\1>/gi, \" \");\n const withBreaks = noBlocks.replace(\n /<br\\s*\\/?>|<\\/(p|div|li|tr|h[1-6]|section|article|header|footer|blockquote|pre)>/gi,\n \"\\n\",\n );\n const stripped = decodeEntities(withBreaks.replace(/<[^>]+>/g, \" \"));\n return stripped\n .split(\"\\n\")\n .map((line) => line.replace(/\\s+/g, \" \").trim())\n .join(\"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n}\n\nasync function readBody(res: Response, maxChars: number): Promise<string> {\n if (!res.body) {\n return \"\";\n }\n const reader = res.body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let bytes = 0;\n let text = \"\";\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n bytes += value.byteLength;\n text += decoder.decode(value, { stream: true });\n if (bytes >= MAX_BYTES || text.length >= maxChars * 2) {\n break;\n }\n }\n text += decoder.decode();\n } finally {\n reader.cancel().catch(() => {});\n }\n return text;\n}\n\nfunction truncate(s: string, maxChars: number): string {\n if (s.length <= maxChars) {\n return s;\n }\n return `${s.slice(0, maxChars)}\\n[truncated, showing first ${maxChars} of ${s.length} chars]`;\n}\n\nexport const webFetchTool: Tool<typeof schema> = {\n name: \"web_fetch\",\n description:\n \"Fetch a URL over http(s) and return its contents as readable text. HTML pages are converted to plain text (tags, scripts and styles removed). Output is truncated to maxChars (default 20000).\",\n permission: \"read\",\n parameters: schema,\n async execute(args, ctx) {\n let url: URL;\n try {\n url = new URL(args.url);\n } catch {\n return { content: `ERROR: invalid URL: ${args.url}`, isError: true };\n }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return {\n content: `ERROR: only http(s) URLs are supported, got: ${url.protocol}`,\n isError: true,\n };\n }\n const maxChars = args.maxChars ?? DEFAULT_MAX_CHARS;\n const timeoutSignal = AbortSignal.timeout(TIMEOUT_MS);\n const signal = ctx.abortSignal\n ? AbortSignal.any([timeoutSignal, ctx.abortSignal])\n : timeoutSignal;\n let res: Response;\n try {\n res = await fetch(url, { signal, redirect: \"follow\" });\n } catch (err) {\n if (ctx.abortSignal?.aborted) {\n return { content: \"ERROR: request aborted\", isError: true };\n }\n if (timeoutSignal.aborted) {\n return { content: `ERROR: request timed out after ${TIMEOUT_MS / 1000}s`, isError: true };\n }\n const message = err instanceof Error ? err.message : String(err);\n return { content: `ERROR: failed to fetch ${args.url}: ${message}`, isError: true };\n }\n if (!res.ok) {\n await res.body?.cancel().catch(() => {});\n return {\n content: `ERROR: HTTP ${res.status} ${res.statusText} for ${args.url}`,\n isError: true,\n };\n }\n const [rawType = \"\"] = (res.headers.get(\"content-type\") ?? \"text/plain\").split(\";\");\n const contentType = rawType.trim().toLowerCase();\n const isHtml = contentType === \"text/html\" || contentType === \"application/xhtml+xml\";\n const isText =\n contentType.startsWith(\"text/\") ||\n contentType === \"application/json\" ||\n contentType === \"application/xml\" ||\n contentType.endsWith(\"+json\") ||\n contentType.endsWith(\"+xml\");\n if (!isHtml && !isText) {\n await res.body?.cancel().catch(() => {});\n return {\n content: `ERROR: unsupported content type: ${contentType} (${args.url})`,\n isError: true,\n };\n }\n let body: string;\n try {\n body = await readBody(res, maxChars);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { content: `ERROR: failed to read response body: ${message}`, isError: true };\n }\n const text = isHtml ? htmlToText(body) : body;\n return { content: truncate(text, maxChars) };\n },\n};\n","import { z } from \"zod\";\nimport type { Tool } from \"../types\";\nimport { decodeEntities } from \"./fetch\";\n\nconst TIMEOUT_MS = 15000;\nconst DEFAULT_MAX_RESULTS = 5;\nconst MAX_RESULTS_LIMIT = 10;\nconst SEARCH_URL = \"https://html.duckduckgo.com/html/?q=\";\nconst USER_AGENT =\n \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\";\n\nconst schema = z.object({\n query: z.string().min(1).describe(\"The search query\"),\n maxResults: z\n .number()\n .int()\n .min(1)\n .max(MAX_RESULTS_LIMIT)\n .optional()\n .describe(\n `Maximum number of results to return (default ${DEFAULT_MAX_RESULTS}, max ${MAX_RESULTS_LIMIT})`,\n ),\n});\n\nexport interface SearchResult {\n title: string;\n url: string;\n snippet: string;\n}\n\nfunction stripTags(s: string): string {\n return decodeEntities(s.replace(/<[^>]+>/g, \" \"))\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction normalizeUrl(href: string): string {\n const decoded = decodeEntities(href);\n const uddg = decoded.match(/[?&]uddg=([^&]+)/);\n if (uddg?.[1]) {\n try {\n return decodeURIComponent(uddg[1]);\n } catch {\n return decoded;\n }\n }\n if (decoded.startsWith(\"//\")) {\n return `https:${decoded}`;\n }\n return decoded;\n}\n\nexport function parseResults(html: string): SearchResult[] {\n const results: SearchResult[] = [];\n const anchorRe = /<a\\b[^>]*\\bclass\\s*=\\s*\"[^\"]*\\bresult__a\\b[^\"]*\"[^>]*>[\\s\\S]*?<\\/a>/gi;\n const anchors = [...html.matchAll(anchorRe)];\n for (const [i, anchor] of anchors.entries()) {\n const full = anchor[0];\n const hrefMatch = full.match(/href\\s*=\\s*\"([^\"]*)\"/i);\n if (!hrefMatch?.[1]) {\n continue;\n }\n const url = normalizeUrl(hrefMatch[1]);\n const title = stripTags(full.replace(/^<a\\b[^>]*>/i, \"\").replace(/<\\/a>\\s*$/i, \"\"));\n const blockStart = (anchor.index ?? 0) + full.length;\n const blockEnd = i + 1 < anchors.length ? (anchors[i + 1]?.index ?? html.length) : html.length;\n const block = html.slice(blockStart, blockEnd);\n const snippetMatch = block.match(\n /<(?:a|div)\\b[^>]*\\bclass\\s*=\\s*\"[^\"]*\\bresult__snippet\\b[^\"]*\"[^>]*>([\\s\\S]*?)<\\/(?:a|div)>/i,\n );\n const snippet = snippetMatch?.[1] ? stripTags(snippetMatch[1]) : \"\";\n if (title && url) {\n results.push({ title, url, snippet });\n }\n }\n return results;\n}\n\nexport const webSearchTool: Tool<typeof schema> = {\n name: \"web_search\",\n description:\n \"Search the web using DuckDuckGo and return a numbered list of results with title, URL and snippet. No API key required. Use web_fetch to read a result's full page.\",\n permission: \"read\",\n parameters: schema,\n async execute(args, ctx) {\n const maxResults = Math.min(args.maxResults ?? DEFAULT_MAX_RESULTS, MAX_RESULTS_LIMIT);\n const url = `${SEARCH_URL}${encodeURIComponent(args.query)}`;\n const timeoutSignal = AbortSignal.timeout(TIMEOUT_MS);\n const signal = ctx.abortSignal\n ? AbortSignal.any([timeoutSignal, ctx.abortSignal])\n : timeoutSignal;\n let res: Response;\n try {\n res = await fetch(url, {\n signal,\n redirect: \"follow\",\n headers: { \"user-agent\": USER_AGENT, accept: \"text/html\" },\n });\n } catch (err) {\n if (ctx.abortSignal?.aborted) {\n return { content: \"ERROR: request aborted\", isError: true };\n }\n const name = err instanceof Error ? err.name : \"\";\n if (timeoutSignal.aborted || name === \"TimeoutError\") {\n return { content: `ERROR: search timed out after ${TIMEOUT_MS / 1000}s`, isError: true };\n }\n const message = err instanceof Error ? err.message : String(err);\n return { content: `ERROR: search request failed: ${message}`, isError: true };\n }\n if (!res.ok) {\n await res.body?.cancel().catch(() => {});\n return {\n content: `ERROR: HTTP ${res.status} ${res.statusText} from DuckDuckGo`,\n isError: true,\n };\n }\n let html: string;\n try {\n html = await res.text();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { content: `ERROR: failed to read search response: ${message}`, isError: true };\n }\n const results = parseResults(html).slice(0, maxResults);\n if (results.length === 0) {\n return {\n content: `ERROR: no results found for \"${args.query}\" (the response may have been blocked or the page layout changed)`,\n isError: true,\n };\n }\n const lines = results.map(\n (r, i) => `${i + 1}. ${r.title}\\n ${r.url}${r.snippet ? `\\n ${r.snippet}` : \"\"}`,\n );\n return { content: lines.join(\"\\n\") };\n },\n};\n","import { bashTool } from \"./bash\";\nimport { editFileTool } from \"./fs/edit\";\nimport { globTool } from \"./fs/glob\";\nimport { grepTool } from \"./fs/grep\";\nimport { readFileTool } from \"./fs/read\";\nimport { writeFileTool } from \"./fs/write\";\nimport { taskKillTool, taskListTool, taskOutputTool } from \"./tasks\";\nimport { createTodoTools } from \"./todo\";\nimport type { Tool } from \"./types\";\nimport { webFetchTool } from \"./web/fetch\";\nimport { webSearchTool } from \"./web/search\";\n\nexport class ToolRegistry {\n private tools = new Map<string, Tool>();\n\n constructor() {\n for (const tool of [\n readFileTool,\n writeFileTool,\n editFileTool,\n globTool,\n grepTool,\n bashTool,\n webFetchTool,\n webSearchTool,\n taskListTool,\n taskOutputTool,\n taskKillTool,\n ...createTodoTools(),\n ]) {\n this.register(tool);\n }\n }\n\n register(tool: Tool): void {\n this.tools.set(tool.name, tool);\n }\n\n get(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n list(): Tool[] {\n return [...this.tools.values()];\n }\n\n names(): string[] {\n return [...this.tools.keys()];\n }\n}\n","import { ToolRegistry } from \"./registry\";\nimport { createTodoTools } from \"./todo\";\n\nexport { ToolRegistry } from \"./registry\";\nexport { createTodoTools, TodoStore } from \"./todo\";\nexport type { TodoItem } from \"./todo\";\nexport type { PermissionLevel, Tool, ToolContext, ToolResult } from \"./types\";\n\nexport function createDefaultRegistry(): ToolRegistry {\n const registry = new ToolRegistry();\n for (const tool of createTodoTools()) {\n registry.register(tool);\n }\n return registry;\n}\n"],"mappings":"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","names":["chars","hooks","generateText","path","path","path","z","spawn","path","spawn","spawn","killTree","path","killTree","spawn","readFile","writeFile","path","z","schema","z","path","readFile","writeFile","path","z","path","isSensitivePath","schema","z","path","readFile","stat","path","z","schema","z","path","stat","readFile","readFile","stat","path","z","schema","z","path","isSensitivePath","stat","readFile","mkdir","writeFile","path","z","schema","z","path","mkdir","writeFile","z","z","mkdir","readFile","writeFile","path","z","z","schema","truncate","z","TIMEOUT_MS","schema","z","z","AgentLoop","text"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|