Inspect
read · list · grep
Find context with bounded file reads, directory listings, and content search.
NAH is a small TypeScript runtime and CLI. Bring an AI SDK model, follow streamed tool calls, and set clear limits on what the agent can do.
[01 // THE LOOP]
NAH owns the loop around the model: one streamed response per step, real tool execution, then an explicit check against the run limits.
HarnessRun HarnessEvent stream
Consume events while the run is in progress. The final promise returns the text, stop reason, usage, and transcript.
run-start
stepBudget · tokenBudget
step-start
step: 1
tool-call
toolName · input · call ID
tool-result
capped output · isError
step-finish
cumulative usage
[02 // TOOLS & PERMISSIONS]
Six focused tools cover the coding loop. Read operations stay available; mutating operations can pause for approval or be disabled.
Default coding tools
read · list · grep · edit · write · bash
read · list · grep
Find context with bounded file reads, directory listings, and content search.
edit · write
Require read-before-write by default. Gate changes with an approval callback.
bash · optional
Run workspace commands with a timeout. Disable bash when a task should stay read-only.
[03 // CONTROL]
The CLI and TypeScript SDK are the product. Run in your project, choose a supported model provider, and consume the same explicit event stream.
import { runAgent, buildSystemPrompt,
createCodingTools } from "@astracollab/not-another-harness";
import { createNodeEnvironment } from
"@astracollab/not-another-harness/node";
const run = runAgent({
model, // AI SDK v5 LanguageModel
prompt: "fix the session refresh edge case",
system: buildSystemPrompt({ cwdLabel: process.cwd() }),
tools: createCodingTools(
createNodeEnvironment(process.cwd()),
),
maxSteps: 32,
});
for await (const event of run.events) {
console.log(event.type, event);
}$ nah --permissions ask "fix the session refresh edge case"
› tool: read src/auth/session.ts
› streamed response · step 1
! edit src/auth/session.ts — allow? [y/N/a]
Changes wait for your approval.
Install the CLI for a ready-to-use terminal workflow, or compose the TypeScript runtime into your own application.