standardharness
v0.1.0
Published
A small boundary-first harness for durable, owner-scoped AI agent turns.
Maintainers
Readme
standardharness
standardharness is a small, model-agnostic TypeScript boundary for durable,
owner-scoped agent turns. It came out of familiar's Gemini memory companion,
where conversation may be agentic but identity and consent cannot be.
It provides three deliberately narrow primitives:
StandardHarnessenforces the turn order: load bounded context, persist the accepted user message, call your agent, then persist only a non-empty reply;authorizeOwnerBoundTurnrejects the wrong channel or actor before context loading or persistence; andbuildUntrustedContextPrefixbounds recent messages and labels them as data, never instructions.
It does not select a model, provide tools, store long-term memories, or make authorization decisions for you.
Install
npm install standardharnessExample
import {
authorizeOwnerBoundTurn,
buildUntrustedContextPrefix,
StandardHarness,
} from "standardharness";
const scopeId = authorizeOwnerBoundTurn({
ownerId: account.id,
actorId: request.user.id,
channel: request.channel,
});
const harness = new StandardHarness({
store: {
loadContext: (scope) => conversations.load(scope),
appendMessage: (scope, message) => conversations.append(scope, message),
},
assistantModel: "your-model-name",
});
const reply = await harness.run({
scopeId,
kind: "text",
userMessage: request.text,
respond: async (context) =>
model.generate({
system: "Follow application policy.",
prompt: buildUntrustedContextPrefix({
messages: context.recentMessages,
}) + `\n\n[CURRENT USER MESSAGE]\n${request.text}`,
}),
});The caller still owns tool definitions, model prompting, storage retention, and access policy. See familiar's evaluation page for the concrete Gemini + Durable Object use case and checked-in synthetic tests.
