chore: updated docs
This commit is contained in:
+40
-34
@@ -67,39 +67,43 @@ A custom tool module must export a function (default export preferred):
|
||||
import type { CustomToolFactory } from "@oh-my-pi/pi-coding-agent";
|
||||
|
||||
const factory: CustomToolFactory = (pi) => ({
|
||||
name: "repo_stats",
|
||||
label: "Repo Stats",
|
||||
description: "Counts tracked TypeScript files",
|
||||
parameters: pi.zod.object({
|
||||
glob: pi.zod.string().optional().default("**/*.ts"),
|
||||
}),
|
||||
name: "repo_stats",
|
||||
label: "Repo Stats",
|
||||
description: "Counts tracked TypeScript files",
|
||||
parameters: pi.zod.object({
|
||||
glob: pi.zod.string().optional().default("**/*.ts"),
|
||||
}),
|
||||
|
||||
async execute(toolCallId, params, onUpdate, ctx, signal) {
|
||||
onUpdate?.({
|
||||
content: [{ type: "text", text: "Scanning files..." }],
|
||||
details: { phase: "scan" },
|
||||
});
|
||||
async execute(toolCallId, params, onUpdate, ctx, signal) {
|
||||
onUpdate?.({
|
||||
content: [{ type: "text", text: "Scanning files..." }],
|
||||
details: { phase: "scan" },
|
||||
});
|
||||
|
||||
const result = await pi.exec("git", ["ls-files", params.glob ?? "**/*.ts"], { signal, cwd: pi.cwd });
|
||||
if (result.killed) {
|
||||
throw new Error("Scan was cancelled");
|
||||
}
|
||||
if (result.code !== 0) {
|
||||
throw new Error(result.stderr || "git ls-files failed");
|
||||
}
|
||||
const result = await pi.exec(
|
||||
"git",
|
||||
["ls-files", params.glob ?? "**/*.ts"],
|
||||
{ signal, cwd: pi.cwd },
|
||||
);
|
||||
if (result.killed) {
|
||||
throw new Error("Scan was cancelled");
|
||||
}
|
||||
if (result.code !== 0) {
|
||||
throw new Error(result.stderr || "git ls-files failed");
|
||||
}
|
||||
|
||||
const files = result.stdout.split("\n").filter(Boolean);
|
||||
return {
|
||||
content: [{ type: "text", text: `Found ${files.length} files` }],
|
||||
details: { count: files.length, sample: files.slice(0, 10) },
|
||||
};
|
||||
},
|
||||
const files = result.stdout.split("\n").filter(Boolean);
|
||||
return {
|
||||
content: [{ type: "text", text: `Found ${files.length} files` }],
|
||||
details: { count: files.length, sample: files.slice(0, 10) },
|
||||
};
|
||||
},
|
||||
|
||||
onSession(event) {
|
||||
if (event.reason === "shutdown") {
|
||||
// cleanup resources if needed
|
||||
}
|
||||
},
|
||||
onSession(event) {
|
||||
if (event.reason === "shutdown") {
|
||||
// cleanup resources if needed
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
export default factory;
|
||||
@@ -122,11 +126,11 @@ From `types.ts` and `loader.ts`:
|
||||
- `ui`: UI context (can be no-op in headless modes)
|
||||
- `hasUI`: `false` in non-interactive flows
|
||||
- `logger`: shared file logger
|
||||
- `zod`: injected `zod` module (use `pi.zod.object`, `pi.zod.string`, …)
|
||||
- `typebox`: zod-backed compatibility shim for legacy TypeBox-style schemas
|
||||
- `zod`: injected `zod/v4` module (canonical for new schemas)
|
||||
- `pi`: injected `@oh-my-pi/pi-coding-agent` exports
|
||||
- `pushPendingAction(action)`: register a preview action for hidden `resolve` tool (`docs/resolve-tool-runtime.md`)
|
||||
|
||||
Loader starts with a no-op UI context and requires host code to call `setUIContext(...)` when real UI is ready.
|
||||
Loader starts with a no-op UI context and requires host code to call `setUIContext(...)` when real UI is ready.
|
||||
|
||||
## Execution contract and typing
|
||||
|
||||
@@ -136,14 +140,16 @@ Loader starts with a no-op UI context and requires host code to call `setUIConte
|
||||
execute(toolCallId, params, onUpdate, ctx, signal);
|
||||
```
|
||||
|
||||
- `params` is statically typed from your Zod schema via `z.infer<typeof schema>` (`Static<TParams>` in API types).
|
||||
- `params` is statically typed from your Zod/TypeBox schema via `Static<TParams>`.
|
||||
- Runtime argument validation happens before execution in the agent loop.
|
||||
- `onUpdate` emits partial results for UI streaming.
|
||||
- `ctx` includes session/model state and an `abort()` helper.
|
||||
- `ctx` includes `sessionManager`, `modelRegistry`, current `model`, `isIdle()`, `hasQueuedMessages()`, `abort()`, and optional `settings` / `autoApprove`.
|
||||
- `signal` carries cancellation.
|
||||
|
||||
`CustomToolAdapter` bridges this to the agent tool interface and forwards calls in the correct argument order.
|
||||
|
||||
Tool definitions may also declare `strict`, `hidden`, `deferrable`, `mcpServerName`, `mcpToolName`, `approval`, and `formatApprovalDetails`.
|
||||
|
||||
## How tools are exposed to the model
|
||||
|
||||
- Tools are wrapped into `AgentTool` instances (`CustomToolAdapter` or extension wrappers).
|
||||
|
||||
Reference in New Issue
Block a user