@synadia-ai/agent-fabric 0.0.0-stage → 0.1.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/CHANGELOG.md +20 -0
- package/LICENSE +201 -0
- package/README.md +184 -2
- package/THIRD_PARTY_NOTICES +23 -0
- package/dist/index.cjs +4821 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1529 -0
- package/dist/index.d.ts +1529 -0
- package/dist/index.js +4733 -0
- package/dist/index.js.map +1 -0
- package/package.json +83 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/trace.ts","../src/tracing.ts","../src/durable.ts","../src/served.ts","../src/scratchpad.ts","../src/grant-request.ts","../src/scratchpad-extension.ts","../src/scratchpad-native/errors.ts","../node_modules/@unicode/unicode-15.0.0/General_Category/Unassigned/regex.mjs","../src/scratchpad-native/protocol.ts","../src/scratchpad-native/codec.ts","../src/scratchpad-native/references.ts","../src/scratchpad-cli.ts","../src/loop-guard.ts","../src/scratchpad-native/transport.ts","../src/scratchpad-native/reader.ts","../src/scratchpad-native/store.ts","../src/scratchpad-native/client.ts","../src/plugin-settings.ts","../src/plugin-scratchpad.ts"],"names":["reject","record","NatsAgentError","text","prompt","unknown","describe","value","result","bytes","SHORT_REFERENCE_PREFIX","createHash","MAX_READ_BYTES","decodeReference","refuse","RETENTION_SLOTS","GRANT_SLOTS","resolve","stdout","stderr","refusal","RequestRejectedError","count","join","now","view","slot","randomUUID","control","scope","mkdirSync","SILENT_LOGGER"],"mappings":"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","file":"index.js","sourcesContent":["// Tracing for the Synadia Agent Fabric — the vocabulary shared by the caller\n// side and the host side (`tracing.ts` builds the SDK's hooks from it).\n// Mirrors `synadia_ai/agent_fabric/trace.py` in the Python package; the two\n// must stay wire-identical.\n//\n// The ambient binding is what lets a client used as a tool inside a prompt\n// handler inherit lineage with no plumbing through user code:\n// AsyncLocalStorage flows into awaited work and into tasks created inside\n// the bound scope (Node and Bun alike).\n//\n// A thread ID names one prompt execution: minted by the caller at\n// `prompt()` time, 128-bit random as 32 lowercase hex characters, and\n// adopted by the receiving service. `rootId` has the same shape — it IS a\n// thread ID, the tree's first execution.\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { NatsAgentError, type AgentId } from \"@synadia-ai/agents\";\n\n// Bump every time you change the trace record schema\n// (be sure the Python package is updated in lockstep)\nexport const EDGE_RECORD_VERSION = 1;\n\n/** Default subject edge records are published to — the tenant-side short\n * form; the account's import qualifies it to `TRACE.{account}.edges`. */\nexport const DEFAULT_EDGE_SUBJECT = \"TRACE.edges\";\n\n/** The envelope fields that carry the lineage to the receiver. */\nexport const THREAD_ID_FIELD = \"thread_id\";\nexport const ROOT_ID_FIELD = \"root_id\";\n\n/** The headers an agent stamps on its model requests (see {@link traceHeaders}). */\nexport const THREAD_ID_HEADER = \"X-Synadia-Thread-ID\";\nexport const ROOT_ID_HEADER = \"X-Synadia-Root-ID\";\n\n/**\n * Tracing configuration for {@link fabricTracing}; `{}` takes every\n * default.\n */\nexport interface TraceOptions {\n /**\n * Where edge records are published. `null` selects propagate-only mode\n * — mint IDs and forward lineage, but publish no edge records.\n */\n readonly edgeSubject?: string | null;\n}\n\n// Spelled out rather than `\\s`, which means different things in the two\n// languages: JavaScript's includes U+FEFF and Python's does not, Python's\n// includes the C0 separators and JavaScript's does not. An explicit class\n// is the only way the two packages reject exactly the same subjects.\n// Shared with `served.ts`, whose harness thread id is held to the same\n// class; not part of the package's surface.\nexport const SUBJECT_FORBIDDEN =\n /[\\u0000-\\u0020\\u007f\\u00a0\\u1680\\u2000-\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff]/;\n\n/**\n * Throws {@link NatsAgentError} when `options.edgeSubject` names a subject\n * that can never be published to: empty, an empty token, whitespace or\n * NUL, or a wildcard. Publishing is fail-open, so without this check a\n * misconfigured subject would only ever show up as a warning on every\n * prompt; checking where the options are accepted makes it fail at\n * construction instead.\n */\nexport function assertValidTraceOptions(options: TraceOptions | undefined): void {\n if (options === undefined) return;\n const subject = options.edgeSubject;\n if (subject === undefined || subject === null) return;\n const reject = (reason: string): never => {\n throw new NatsAgentError(`trace.edgeSubject ${JSON.stringify(subject)}: ${reason}`);\n };\n if (typeof subject !== \"string\") reject(\"must be a string or null\");\n if (subject.length === 0) reject(\"must not be empty\");\n for (const token of subject.split(\".\")) {\n if (token.length === 0) reject(\"must not contain an empty token\");\n if (SUBJECT_FORBIDDEN.test(token)) reject(\"must not contain whitespace or control characters\");\n if (token.includes(\"*\") || token.includes(\">\")) reject(\"must not contain wildcards\");\n }\n}\n\n/**\n * How many trace records this process has published and dropped so far —\n * `edge` records today, counted from process start. Process-wide, not per\n * client: the records are written by whichever client a prompt handler\n * happens to use, while the agent service that owns the heartbeat is\n * another object; one counter for the process is the one they share. The\n * host reports both numbers as `records_published` and `records_dropped`\n * in its heartbeat's extras (`fabricTracing().heartbeatExtras`), so\n * whoever consumes the heartbeat knows how many records this process\n * failed to publish.\n */\nexport interface TraceRecordCounts {\n /**\n * Records handed to the connection for publishing. Handed, not\n * delivered: a record lost after that — a reconnect buffer that\n * overflowed, a process that exited before the flush — is not seen\n * here. The counts cover what this process could observe; nothing past\n * the connection is visible to them.\n */\n readonly published: number;\n /**\n * Records that were due but never went out: no identity to sign them\n * with, or a publish that threw. \"Due\" means the prompt the record\n * describes actually went out — a prompt never iterated or rejected by\n * validation owes no record and counts nothing. A record in\n * propagate-only mode (`edgeSubject: null`) is never due either.\n */\n readonly dropped: number;\n}\n\ninterface MutableCounters {\n published: number;\n dropped: number;\n}\n\n// Kept on `globalThis` under a well-known symbol rather than in module\n// state: a deployment can end up with two installed copies of this module\n// (a harness pinning its own version, or the ESM and CJS builds both\n// loaded), and the copy whose caller interceptor counts need not be the\n// copy whose heartbeat provider reads. Module state would split the\n// counter between the copies and the heartbeat would report 0/0 while\n// records were being dropped. One process, one counter, whichever copy\n// asks.\nconst COUNTERS_KEY = Symbol.for(\"@synadia-ai/agent-fabric:trace-record-counts\");\nconst counters: MutableCounters = (() => {\n const g = globalThis as unknown as Record<symbol, MutableCounters | undefined>;\n return (g[COUNTERS_KEY] ??= { published: 0, dropped: 0 });\n})();\n\n/** Count one trace record published. Called by the edge publisher. */\nexport function countTraceRecordPublished(): void {\n counters.published += 1;\n}\n\n/** Count one trace record dropped. Called by the edge publisher. */\nexport function countTraceRecordDropped(): void {\n counters.dropped += 1;\n}\n\n/** A snapshot of the process-wide {@link TraceRecordCounts}. */\nexport function traceRecordCounts(): TraceRecordCounts {\n return Object.freeze({ published: counters.published, dropped: counters.dropped });\n}\n\n/** Identity of the prompt execution running in the current async context. */\nexport interface TraceScope {\n /** This execution's own thread ID — the parent of any thread it spawns. */\n readonly threadId: string;\n /** The tree's root thread ID, inherited unchanged; equals `threadId` on a root. */\n readonly rootId: string;\n /**\n * Where in this execution any thread it spawns next was sent out: how\n * many times it has stamped trace headers on a model request so far.\n * Deliberately mutable and shared — work spawned inside the handler\n * holds the same scope object, so its turns count against this\n * execution.\n */\n turnCountHint: number;\n}\n\n// Kept on `globalThis` under a well-known symbol, for the reason the\n// counters above are: the scope is bound by the host interceptor and read\n// by a client's prompt interceptor used as a tool inside the handler, and\n// the two can come from different installed copies of this module — a\n// nested install, a harness pinning its own version, the ESM and CJS\n// builds both loaded. One AsyncLocalStorage per copy would keep the scope\n// the host bound invisible to the client, and every child thread would\n// silently become a root. One process, one storage, whichever copy asks.\nconst STORAGE_KEY = Symbol.for(\"@synadia-ai/agent-fabric:trace-scope\");\nconst storage: AsyncLocalStorage<TraceScope> = (() => {\n const g = globalThis as unknown as Record<symbol, AsyncLocalStorage<TraceScope> | undefined>;\n return (g[STORAGE_KEY] ??= new AsyncLocalStorage<TraceScope>());\n})();\n\n/**\n * Run `fn` with `scope` as the ambient execution (what the host\n * interceptor does around a prompt handler). AsyncLocalStorage restores\n * the previous binding on exit, so nothing leaks into the next request.\n */\nexport function bindActiveTrace<T>(scope: TraceScope, fn: () => T): T {\n return storage.run(scope, fn);\n}\n\n/** The ambient {@link TraceScope}, or `undefined` outside a bound handler. */\nexport function activeTrace(): TraceScope | undefined {\n return storage.getStore();\n}\n\n/**\n * Headers for every model request this execution issues.\n *\n * An agent stamps these on each completion request so the model proxy\n * files the call under the right thread and tree without seeing any NATS\n * traffic. Hierarchy is the edge records' job, so the proxy needs no\n * parent or tool-call header.\n *\n * `{}` outside a traced handler, so harness code needs no plumbing and\n * degrades to nothing.\n *\n * Each call counts against this execution: the running total is recorded\n * on the edge of any thread it spawns afterwards.\n */\nexport function traceHeaders(): Record<string, string> {\n const scope = activeTrace();\n if (scope === undefined) return {};\n scope.turnCountHint += 1;\n return {\n [THREAD_ID_HEADER]: scope.threadId,\n [ROOT_ID_HEADER]: scope.rootId,\n };\n}\n\n/** Length in hex characters of a thread ID — 128 bits. */\nexport const THREAD_ID_HEX_LEN = 32;\n\nconst THREAD_ID_RE = new RegExp(`^[0-9a-f]{${THREAD_ID_HEX_LEN}}$`);\n\n/**\n * `true` iff `value` has the shape of a thread ID: exactly\n * {@link THREAD_ID_HEX_LEN} lowercase hex characters. Ids arriving on the\n * wire are untrusted input that ends up in the headers an agent stamps on\n * its model requests, so a receiver adopts nothing that is not shaped\n * exactly like what the packages mint.\n */\nexport function isThreadId(value: string): boolean {\n return THREAD_ID_RE.test(value);\n}\n\nexport function randomThreadId(): string {\n // Thread IDs don't need to be secure and any random generator will\n // suffice. Still, using crypto.getRandomValues() doesn't cost us much.\n const bytes = new Uint8Array(THREAD_ID_HEX_LEN / 2);\n crypto.getRandomValues(bytes);\n let out = \"\";\n for (const b of bytes) out += b.toString(16).padStart(2, \"0\");\n return out;\n}\n\n/** Longest accepted tool call id, in Unicode code points. */\nexport const TOOL_CALL_ID_MAX = 256;\n\n// A surrogate half with no partner: not a Unicode scalar value, so it has\n// no UTF-8 form. `JSON.stringify` would escape it while Python could not\n// encode the record at all, and the two packages must write the same bytes.\n// Shared with `served.ts`; not part of the package's surface.\nexport const LONE_SURROGATE =\n /[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?<![\\uD800-\\uDBFF])[\\uDC00-\\uDFFF]/;\n\nexport function validToolCallId(toolCallId: string): boolean {\n // This isn't intended as strict validation. It's just a basic\n // pass to avoid obvious garbage gets into the tracing system.\n // Counted in code points — not UTF-16 units — so the Python package,\n // whose `len()` counts code points, accepts exactly the same ids.\n if (LONE_SURROGATE.test(toolCallId)) return false;\n const codePoints = Array.from(toolCallId).length;\n return codePoints > 0 && codePoints <= TOOL_CALL_ID_MAX;\n}\n\n/** One built edge record: its wire bytes and the id that de-duplicates it. */\nexport interface BuiltEdgeRecord {\n readonly recordId: string;\n readonly payload: Uint8Array;\n}\n\n/**\n * One edge record, ready to publish. The record id comes back alongside\n * the payload: the publisher signs with it as the `Agent-Sender` nonce,\n * which the SDK's signed publish also stamps as `Nats-Msg-Id`, so body,\n * header and message id carry one id and a stream de-duplicates a record\n * it already stored. Its 32 hex characters fit the nonce's\n * `[A-Za-z0-9_-]{1,64}`.\n *\n * `agent` is the writer — the caller that spawned the thread, the parent\n * side of the edge — in canonical `{account}.{user}` form. It is the same\n * identity that signs the record's `Agent-Sender` header, so a consumer\n * can cross-check the body against the verified header.\n */\nexport function buildEdgeRecord(\n agent: AgentId,\n threadId: string,\n parentId: string | null,\n rootId: string,\n toolCallId: string | null,\n turnCountHint: number,\n): BuiltEdgeRecord {\n // `turnCountHint` says where in the spawning thread this subprompt went\n // out: turns completed when it was spawned, 0 on a root (nothing spawned\n // it). A position marker, not a total — turns the parent takes after its\n // last spawn are recorded nowhere.\n const recordId = randomThreadId();\n const record = {\n version: EDGE_RECORD_VERSION,\n kind: \"edge\",\n record_id: recordId,\n ts: Math.floor(Date.now() / 1000),\n agent,\n thread_id: threadId,\n parent_id: parentId,\n root_id: rootId,\n tool_call_id: toolCallId,\n turn_count_hint: turnCountHint,\n };\n return { recordId, payload: new TextEncoder().encode(JSON.stringify(record)) };\n}\n","// Tracing on the protocol SDK's hooks: `fabricTracing()` returns the three\n// things the SDK takes — a prompt interceptor for `Agents`, a request\n// interceptor and a heartbeat extras provider for `AgentService` — built\n// from the vocabulary in `trace.ts`. Mirrors\n// `synadia_ai/agent_fabric/tracing.py`; the two must stay wire-identical.\n//\n// The caller side, per prompt:\n// - phase one (`beforePrompt`, in the async context `prompt()` was called\n// in) mints the new thread's ID and inherits root and parent from the\n// ambient scope — a root when none is bound — and adds `thread_id` and\n// `root_id` to the envelope. The parent stays in the edge record and\n// never transits the child;\n// - phase two (`beforePublish`, after the prompt is signed and its size\n// checked, immediately before it is published) builds and publishes\n// the signed edge record, so an observer sees the node before it runs\n// and a prompt that never goes out owes no record.\n//\n// The host side, per request: adopt the envelope's pair, mint a root when\n// there is none, refuse a half pair or a malformed ID with `400` before the\n// handler runs, and run the handler inside the scope — which is what\n// `traceHeaders()` reads, and what a traced client used inside the handler\n// inherits. The host writes no record.\n\nimport { RequestRejectedError, type RequestInterceptor } from \"@synadia-ai/agent-service\";\nimport type { PromptInterceptor, PromptInterceptorContext } from \"@synadia-ai/agents\";\nimport {\n activeTrace,\n assertValidTraceOptions,\n bindActiveTrace,\n buildEdgeRecord,\n countTraceRecordDropped,\n countTraceRecordPublished,\n DEFAULT_EDGE_SUBJECT,\n isThreadId,\n randomThreadId,\n ROOT_ID_FIELD,\n THREAD_ID_FIELD,\n THREAD_ID_HEX_LEN,\n traceRecordCounts,\n validToolCallId,\n type TraceOptions,\n type TraceScope,\n} from \"./trace.js\";\n\n/** The key of `PromptOptions.context` the caller interceptor reads the tool call ID from. */\nexport const TOOL_CALL_ID_CONTEXT_KEY = \"toolCallId\";\n\n/** What {@link fabricTracing} returns: the SDK's three hooks, ready to pass in. */\nexport interface FabricTracing {\n /** For the caller: `new Agents({ ..., interceptors: [tracing.promptInterceptor] })`. */\n readonly promptInterceptor: PromptInterceptor;\n /** For the host: `new AgentService({ ..., interceptors: [tracing.requestInterceptor] })`. */\n readonly requestInterceptor: RequestInterceptor;\n /**\n * For the host: `new AgentService({ ..., heartbeatExtras: tracing.heartbeatExtras })`.\n * `records_published` and `records_dropped` — the process-wide\n * {@link traceRecordCounts} — read fresh for every heartbeat and status\n * reply. `{}` in propagate-only mode, which publishes no records and\n * would otherwise report a constant 0/0 that looks like a healthy zero.\n */\n readonly heartbeatExtras: () => Readonly<Record<string, unknown>>;\n}\n\n/**\n * Tracing for an agent on the fabric, as the protocol SDK's hooks.\n *\n * Throws `NatsAgentError` for an `edgeSubject` that can never be published\n * to (see {@link assertValidTraceOptions}). `options.edgeSubject` defaults\n * to {@link DEFAULT_EDGE_SUBJECT}; `null` is propagate-only mode.\n */\nexport function fabricTracing(options: TraceOptions = {}): FabricTracing {\n assertValidTraceOptions(options);\n const edgeSubject =\n options.edgeSubject === undefined ? DEFAULT_EDGE_SUBJECT : options.edgeSubject;\n return {\n promptInterceptor: promptInterceptor(edgeSubject),\n requestInterceptor,\n heartbeatExtras:\n edgeSubject === null\n ? () => ({})\n : () => {\n const counts = traceRecordCounts();\n return { records_published: counts.published, records_dropped: counts.dropped };\n },\n };\n}\n\n/**\n * What phase one decided to record; built into a record in phase two. The\n * lineage is fixed when the prompt is planned — when the ambient trace is\n * still the caller's — but the record's `ts` and `agent` are resolved\n * immediately before the publish.\n */\ninterface EdgePlan {\n readonly threadId: string;\n readonly parentId: string | null;\n readonly rootId: string;\n readonly toolCallId: string | null;\n readonly turnCountHint: number;\n}\n\nfunction promptInterceptor(edgeSubject: string | null): PromptInterceptor {\n return {\n beforePrompt(ctx) {\n // Tracing is best-effort and shouldn't stop an agent from sending out\n // a prompt. Invalid tool call ids are just ignored.\n const raw = ctx.context[TOOL_CALL_ID_CONTEXT_KEY];\n const toolCallId = typeof raw === \"string\" && validToolCallId(raw) ? raw : null;\n const plan = { ...mintLineage(), toolCallId };\n // The envelope carries only what the receiver must inherit; the\n // parent stays in the edge record and never transits the child.\n return {\n fields: { [THREAD_ID_FIELD]: plan.threadId, [ROOT_ID_FIELD]: plan.rootId },\n state: plan,\n };\n },\n async beforePublish(ctx, extras) {\n const plan = extras?.state as EdgePlan | undefined;\n if (edgeSubject === null || plan === undefined) return;\n await publishEdge(ctx, edgeSubject, plan);\n },\n };\n}\n\n// The thread ID names this prompt's execution. Inside a prompt handler the\n// ambient trace supplies the tree root and this prompt's parent; with none\n// bound, the prompt starts its own tree.\nfunction mintLineage(): Omit<EdgePlan, \"toolCallId\"> {\n const threadId = randomThreadId();\n const ambient = activeTrace();\n if (ambient === undefined) {\n return { threadId, parentId: null, rootId: threadId, turnCountHint: 0 };\n }\n return {\n threadId,\n parentId: ambient.threadId,\n rootId: ambient.rootId,\n turnCountHint: ambient.turnCountHint,\n };\n}\n\n/**\n * Build and publish one signed edge record.\n *\n * The signature covers the short-form subject the record is published to:\n * per the identity design a remap that only drops the account token is not\n * a rename, so no `sub` override is needed. Consumers verify in stored\n * mode. The record's `agent` is the client's own identity — the one that\n * signs it — so body and header agree. Its `record_id` is the header's\n * nonce and, through the SDK's signed publish, the `Nats-Msg-Id` as well:\n * one id, so a reader de-duplicating on `(user, record_id)` and a stream\n * de-duplicating on the message id see the same record once.\n *\n * Fail-open — a failed publish never fails the prompt. It is counted:\n * every record that goes out or fails to moves the process-wide\n * {@link traceRecordCounts}, which the host reports on its heartbeat.\n */\nasync function publishEdge(\n ctx: PromptInterceptorContext,\n subject: string,\n plan: EdgePlan,\n): Promise<void> {\n // Consumers ignore unsigned records, so publishing without a signer\n // would be pure waste: warn once per connection and skip. Minting and\n // envelope lineage need no identity and still happen, so downstream\n // agents that do have one keep tracing. The record was due — the prompt\n // is about to go out — and cannot go out: a drop, counted here rather\n // than when the prompt was planned, so a prompt that is never sent owes\n // nothing and counts nothing.\n if (!ctx.identity.canSign) {\n warnEdgesUnsigned(ctx.connection);\n countTraceRecordDropped();\n return;\n }\n try {\n const agent = await ctx.identity.selfId();\n const record = buildEdgeRecord(\n agent,\n plan.threadId,\n plan.parentId,\n plan.rootId,\n plan.toolCallId,\n plan.turnCountHint,\n );\n await ctx.identity.publishSigned(subject, record.payload, { nonce: record.recordId });\n countTraceRecordPublished();\n } catch (err) {\n countTraceRecordDropped();\n console.warn(`@synadia-ai/agent-fabric: failed to publish edge record on ${subject}`, err);\n }\n}\n\n// Connections already warned that their edge records go nowhere. One\n// warning per connection: a per-prompt log would itself be a way for\n// observability to disturb an agent.\nconst warnedUnsigned = new WeakSet<PromptInterceptorContext[\"connection\"]>();\n\nfunction warnEdgesUnsigned(nc: PromptInterceptorContext[\"connection\"]): void {\n if (warnedUnsigned.has(nc)) return;\n warnedUnsigned.add(nc);\n console.warn(\n \"@synadia-ai/agent-fabric: tracing is enabled but no identity signer is configured; \" +\n \"edge records are not published (consumers ignore unsigned records). \" +\n \"Pass identity: { signer } to sign them.\",\n );\n}\n\n/**\n * The host side: this execution's `(thread, root)`, adopted from the\n * envelope or minted, bound around the rest of the request. The host\n * writes no trace record.\n */\nconst requestInterceptor: RequestInterceptor = {\n async aroundRequest(ctx, next) {\n await bindActiveTrace(scopeFor(ctx.envelope.extras ?? {}), next);\n },\n};\n\n// The half pair's description; the pre-split SDK's decoder said the same.\nconst HALF_LINEAGE_PAIR = \"envelope `thread_id` and `root_id` must be given together\";\n\n/**\n * The execution's scope from the envelope's lineage pair: adopted\n * verbatim when both fields are there, a fresh root when neither is.\n *\n * A half pair is never completed. The pair travels together: a caller\n * that traces sends both, one that does not sends neither, unless it\n * relays an envelope it received, which keeps the pair it came with\n * (§5.6). Exactly one\n * names a broken or hand-written caller, and adopting the lone field would\n * file this execution under a tree the caller never named, or root a\n * thread the caller meant as a child — so it is a malformed envelope, the\n * same `400` as a wrongly shaped id, before the handler runs. The Python\n * package reads the wire the same way.\n */\nfunction scopeFor(extras: Readonly<Record<string, unknown>>): TraceScope {\n const threadId = lineageField(extras, THREAD_ID_FIELD);\n const rootId = lineageField(extras, ROOT_ID_FIELD);\n if ((threadId === undefined) !== (rootId === undefined)) {\n throw new RequestRejectedError(400, HALF_LINEAGE_PAIR);\n }\n if (threadId !== undefined && rootId !== undefined) {\n return { threadId, rootId, turnCountHint: 0 };\n }\n const minted = randomThreadId();\n return { threadId: minted, rootId: minted, turnCountHint: 0 };\n}\n\n/**\n * One lineage field, absent when the key is missing or `null`.\n *\n * A present-but-not-a-string value is a malformed envelope (400), the same\n * as any other wrongly-typed field — and the same as the Python package,\n * which rejects it too. Silently dropping it would make the receiver mint\n * a fresh root and file the execution under a tree of its own. An empty\n * string is absent, again matching Python.\n */\nfunction lineageField(\n extras: Readonly<Record<string, unknown>>,\n wireName: string,\n): string | undefined {\n const value = Object.hasOwn(extras, wireName) ? extras[wireName] : undefined;\n if (value === undefined || value === null) return undefined;\n if (typeof value !== \"string\") {\n throw new RequestRejectedError(400, `envelope \\`${wireName}\\` must be a string`);\n }\n // An empty id names nothing. Treating it as absent keeps a receiver\n // from adopting \"\" as a thread and filing every child under it — and\n // keeps both packages reading the same wire the same way.\n if (value === \"\") return undefined;\n // Untrusted, bounded input: the id is adopted verbatim and later stamped\n // on the agent's model requests as a header value, so anything not\n // shaped like a minted id (a CRLF, a megabyte of garbage) is malformed.\n if (!isThreadId(value)) {\n throw new RequestRejectedError(\n 400,\n `envelope \\`${wireName}\\` must be ${THREAD_ID_HEX_LEN} lowercase hex characters`,\n );\n }\n return value;\n}\n","// Durable runs on the Synadia Agent Fabric — how a run of a durable\n// workflow joins the task that started it. Mirrors\n// `synadia_ai/agent_fabric/durable.py` in the Python package; the two must\n// stay wire-identical.\n//\n// The join is a convention, not a record. A run started by a tool call\n// takes the id `<thread_id>-<tool call id>`: the served thread it was\n// started from, and the model's call that started it. Whoever reads the\n// runs can name the task of each without anything else being written. A\n// model call made inside one of the run's steps carries the two headers\n// the model proxy already reads, taken from the trace the run's input\n// carries: a step runs on a worker, outside the prompt's async scope, so\n// the trace has to travel in the input.\n//\n// Nothing here depends on a durable-execution library: these are strings\n// and objects an agent hands to whichever one it uses.\n\nimport { NatsAgentError } from \"@synadia-ai/agents\";\nimport {\n activeTrace,\n bindActiveTrace,\n isThreadId,\n ROOT_ID_HEADER,\n THREAD_ID_HEADER,\n validToolCallId,\n} from \"./trace.js\";\n\n/**\n * The served prompt's trace as a run's input carries it, in this key\n * order. Wire form: the same keys and order in both packages.\n */\nexport interface DurableTrace {\n readonly thread_id: string;\n readonly root_id: string;\n}\n\n// What a run id may hold: the durable-execution protocol uses a run id as\n// a subject token and as a key, so it is held to the intersection of the\n// two. Flagged `u` so that one code point, astral or not, is one character,\n// as it is in Python.\nconst OUTSIDE_RUN_ID = /[^A-Za-z0-9_-]/gu;\n\n/**\n * The run id that joins a durable run to the task that started it:\n * `<thread_id>-<tool call id>`, the active trace's thread and the model's\n * tool-call id, with every character of the tool-call id outside\n * `[A-Za-z0-9_-]` replaced by `_`. Pass it as the run id when the run is\n * started; the run's children and generations keep it as their prefix.\n *\n * `undefined` outside a traced prompt handler: there is no served thread to\n * name. Pick a run id of your own then; that run joins no task.\n *\n * Throws {@link NatsAgentError} when the tool-call id is empty, longer than\n * the trace accepts (`TOOL_CALL_ID_MAX` code points) or not valid Unicode.\n */\nexport function durableRunId(toolCallId: string): string | undefined {\n if (!validToolCallId(toolCallId)) {\n throw new NatsAgentError(\n `durableRunId: tool call id ${JSON.stringify(toolCallId)} is empty, too long or not valid Unicode`,\n );\n }\n const scope = activeTrace();\n if (scope === undefined) return undefined;\n return `${scope.threadId}-${toolCallId.replace(OUTSIDE_RUN_ID, \"_\")}`;\n}\n\n/**\n * The active trace as `{ thread_id, root_id }`, for the run's input under a\n * key of your choosing; {@link durableHeaders} turns it back into the\n * proxy's headers inside a step. `undefined` outside a traced prompt\n * handler.\n *\n * Unlike `traceHeaders()`, it counts no model turn: it starts no model call.\n */\nexport function durableTrace(): DurableTrace | undefined {\n const scope = activeTrace();\n if (scope === undefined) return undefined;\n return { thread_id: scope.threadId, root_id: scope.rootId };\n}\n\n/**\n * The two headers the model proxy reads, `X-Synadia-Thread-ID` and\n * `X-Synadia-Root-ID`, from a trace a run's input carries, for a model call\n * inside a step. The call then lands on the thread that started the run.\n *\n * The input is read back from the run's journal, so it is checked as\n * untrusted: `{}` unless both ids have the shape of a thread id. `{}` for\n * `undefined` or `null` as well, so a run started outside a traced handler\n * makes its model calls without the headers.\n */\nexport function durableHeaders(trace: DurableTrace | null | undefined): Record<string, string> {\n const ids = checked(trace);\n if (ids === undefined) return {};\n return { [THREAD_ID_HEADER]: ids.thread_id, [ROOT_ID_HEADER]: ids.root_id };\n}\n\n/**\n * Run `fn` inside the trace a run's input carries, as the prompt's handler\n * ran inside it: a prompt sent to another agent from `fn` writes its edge\n * under the thread that started the run, in the same tree, and\n * `traceHeaders()` inside `fn` gives the same two headers as\n * {@link durableHeaders}. For a step of a durable run, which a worker runs\n * outside the prompt's async scope.\n *\n * `turnCount` is how many model calls the run has made so far; it becomes\n * the turn count hint of any edge `fn` writes. A `traceHeaders()` call\n * inside `fn` counts one more, as it does in a handler.\n *\n * A trace that is missing or not shaped like thread ids binds nothing: `fn`\n * runs as it would outside a traced handler. Throws {@link NatsAgentError}\n * when `turnCount` is not a whole number, 0 or more.\n */\nexport function withDurableTrace<T>(\n trace: DurableTrace | null | undefined,\n turnCount: number,\n fn: () => T,\n): T {\n if (!Number.isSafeInteger(turnCount) || turnCount < 0) {\n throw new NatsAgentError(\n `withDurableTrace: turn count ${String(turnCount)} is not a whole number, 0 or more`,\n );\n }\n const ids = checked(trace);\n if (ids === undefined) return fn();\n return bindActiveTrace(\n { threadId: ids.thread_id, rootId: ids.root_id, turnCountHint: turnCount },\n fn,\n );\n}\n\n// The trace a run's input carries is read back from its journal: untrusted.\n// Both ids must be shaped like thread ids, or there is no trace.\nfunction checked(trace: DurableTrace | null | undefined): DurableTrace | undefined {\n if (typeof trace !== \"object\" || trace === null) return undefined;\n const { thread_id: threadId, root_id: rootId } = trace as {\n thread_id?: unknown;\n root_id?: unknown;\n };\n if (typeof threadId !== \"string\" || typeof rootId !== \"string\") return undefined;\n if (!isThreadId(threadId) || !isThreadId(rootId)) return undefined;\n return { thread_id: threadId, root_id: rootId };\n}\n","// The `served` record — a harness plugin's binding of one prompt execution\n// to the harness's own thread id, two per received prompt (the fabric's\n// design, §8.3; the contract is `docs/schemas/served.json`, vendored under\n// `test-fixtures/schemas/`). Mirrors `synadia_ai/agent_fabric/served.py`\n// in the Python package; the two must stay wire-identical.\n//\n// An SDK-built agent stamps the thread on every model request it makes\n// (`traceHeaders()`), so the proxy files those calls under the thread the\n// caller minted. A harness makes its own model calls, and its plugin cannot\n// put a header on them: OpenClaw's carry the W3C `traceparent` of the turn,\n// Claude Code's the session id. The plugin publishes the binding instead —\n// one record at `start`, stamped with the prompt's arrival and naming the\n// thread and the harness's id, bare, under the harness's name, and one at\n// `end` with the outcome. The proxy files the harness's calls under the\n// same id, so the reader attaches the calls made between the two records\n// to the thread, and gets the thread's outcome and duration with them.\n//\n// Both records are signed with the plugin's own identity, which is also\n// the record's `agent`, and carry one id as body `record_id`, header nonce\n// and `Nats-Msg-Id`, like the edge record; they count on the same\n// process-wide trace record counts the host reports on its heartbeat.\n// Publishing is asynchronous and fail-open: a prompt is never delayed or\n// failed by it.\n\nimport {\n SenderSignatureRequiredError,\n type AgentId,\n type Agents,\n type Logger,\n} from \"@synadia-ai/agents\";\nimport {\n countTraceRecordDropped,\n countTraceRecordPublished,\n DEFAULT_EDGE_SUBJECT,\n LONE_SURROGATE,\n randomThreadId,\n SUBJECT_FORBIDDEN,\n type TraceScope,\n} from \"./trace.js\";\n\n// Bump every time you change the served record schema\n// (be sure the Python package is updated in lockstep)\nexport const SERVED_RECORD_VERSION = 1;\n\n/**\n * The version of a record that carries a `reason`: the schema's version 2\n * added the field. A record without one stays version 1, byte for byte what\n * it was.\n */\nexport const SERVED_RECORD_REASON_VERSION = 2;\n\n/**\n * The harnesses whose plugins write `served` records: the ones that cannot\n * put the fabric's headers on their own model calls. PI can, and writes\n * none. The value is what the proxy files the harness's calls under\n * (the fabric's design, §8.1).\n */\nexport type Harness = \"claude\" | \"openclaw\";\n\nconst HARNESSES: ReadonlySet<string> = new Set<Harness>([\"claude\", \"openclaw\"]);\n\n/** `start` when the prompt arrives, `end` when the turn is over. */\nexport type ServedPhase = \"start\" | \"end\";\n\nconst PHASES: ReadonlySet<string> = new Set<ServedPhase>([\"start\", \"end\"]);\n\n/** How the turn ended: answered, failed, or expired on the request's TTL. */\nexport type ServedStatus = \"ok\" | \"error\" | \"timeout\";\n\nconst STATUSES: ReadonlySet<string> = new Set<ServedStatus>([\"ok\", \"error\", \"timeout\"]);\n\n/**\n * How a prompt ended when the model did not end it with its own reply, on\n * `end` only; absent when the model replied. `final_text`: the plugin sent\n * the turn's final text as the reply (status `ok`); `no_reply`: the turn\n * ended with no reply and no final text; `shutdown`: the plugin stopped\n * with the prompt open; `delivery`: the prompt could not be handed to the\n * harness; `expired`: the prompt outlived the plugin's limit (status\n * `timeout`).\n */\nexport type ServedReason = \"final_text\" | \"no_reply\" | \"shutdown\" | \"delivery\" | \"expired\";\n\nconst REASONS: ReadonlySet<string> = new Set<ServedReason>([\n \"final_text\",\n \"no_reply\",\n \"shutdown\",\n \"delivery\",\n \"expired\",\n]);\n\n/** Longest accepted harness thread id, in Unicode code points. */\nexport const HARNESS_THREAD_ID_MAX = 256;\n\n/**\n * `true` iff `value` can be the harness thread id a served record names:\n * a non-empty string of at most {@link HARNESS_THREAD_ID_MAX} code points\n * — counted as the Python package's `len()` counts, not in UTF-16 units —\n * with no whitespace or control character (the class the SDK holds a\n * subject token to: the id is matched against a header value the proxy\n * saw, and a header value can never hold those) and no lone surrogate,\n * which has no UTF-8 form. Claude Code's session id and OpenClaw's 32-hex\n * trace id pass; the packages accept exactly the same ids.\n */\nexport function validHarnessThreadId(value: unknown): value is string {\n if (typeof value !== \"string\" || value.length === 0) return false;\n if (SUBJECT_FORBIDDEN.test(value)) return false;\n if (LONE_SURROGATE.test(value)) return false;\n return Array.from(value).length <= HARNESS_THREAD_ID_MAX;\n}\n\n/** Now, in unix seconds — the served record's `ts` resolution. */\nexport function unixSeconds(): number {\n return Math.floor(Date.now() / 1000);\n}\n\n/** One built served record: its wire bytes and the id that de-duplicates it. */\nexport interface BuiltServedRecord {\n readonly recordId: string;\n readonly payload: Uint8Array;\n}\n\n/**\n * One served record, ready to publish. The record id comes back alongside\n * the payload: the publisher signs with it as the `Agent-Sender` nonce,\n * which the SDK's signed publish also stamps as `Nats-Msg-Id`, so body,\n * header and message id carry one id and a stream de-duplicates a record\n * it already stored. Its 32 hex characters fit the nonce's\n * `[A-Za-z0-9_-]{1,64}`.\n *\n * `agent` is the plugin's own identity, the executing agent, in canonical\n * `{account}.{user}` form — the same identity that signs the record.\n * `threadId` and `rootId` are the served prompt's, from its scope.\n * `harnessThreadId` is the harness's own id, bare — never prefixed — and\n * must pass {@link validHarnessThreadId}. `status` is required on `end`\n * and must be absent on `start`. `ts` is unix seconds: when the prompt\n * arrived for `start`, when the turn ended for `end`; now by default.\n * `reason` ({@link ServedReason}) says how an `end` came about when the\n * model did not reply itself; it is refused on `start`, like `status`, and\n * a record that carries it is version {@link SERVED_RECORD_REASON_VERSION}.\n *\n * Throws `Error` for a record the contract would refuse, so a plugin's\n * mistake is its own and never a malformed record on the wire.\n */\nexport function buildServedRecord(\n agent: AgentId,\n threadId: string,\n rootId: string,\n harness: Harness,\n harnessThreadId: string,\n phase: ServedPhase,\n status?: ServedStatus,\n ts: number = unixSeconds(),\n reason?: ServedReason,\n): BuiltServedRecord {\n if (!HARNESSES.has(harness)) {\n throw new Error(`buildServedRecord: harness must be \"claude\" or \"openclaw\", got ${harness}`);\n }\n if (!PHASES.has(phase)) {\n throw new Error(`buildServedRecord: phase must be \"start\" or \"end\", got ${phase}`);\n }\n if (phase === \"end\" && status === undefined) {\n throw new Error(\"buildServedRecord: an end record needs a status\");\n }\n if (phase === \"start\" && status !== undefined) {\n throw new Error(\"buildServedRecord: a start record carries no status\");\n }\n if (status !== undefined && !STATUSES.has(status)) {\n throw new Error(`buildServedRecord: status must be \"ok\", \"error\" or \"timeout\", got ${status}`);\n }\n if (phase === \"start\" && reason !== undefined) {\n throw new Error(\"buildServedRecord: a start record carries no reason\");\n }\n if (reason !== undefined && !REASONS.has(reason)) {\n throw new Error(\n 'buildServedRecord: reason must be \"final_text\", \"no_reply\", \"shutdown\", \"delivery\" ' +\n `or \"expired\", got ${reason}`,\n );\n }\n if (!validHarnessThreadId(harnessThreadId)) {\n throw new Error(\"buildServedRecord: harnessThreadId is not a usable harness thread id\");\n }\n if (!Number.isInteger(ts) || ts < 0) {\n throw new Error(\"buildServedRecord: ts must be a non-negative integer of unix seconds\");\n }\n const recordId = randomThreadId();\n const record = {\n version: reason !== undefined ? SERVED_RECORD_REASON_VERSION : SERVED_RECORD_VERSION,\n kind: \"served\",\n record_id: recordId,\n ts,\n agent,\n thread_id: threadId,\n root_id: rootId,\n harness,\n harness_thread_id: harnessThreadId,\n phase,\n ...(status !== undefined ? { status } : {}),\n ...(reason !== undefined ? { reason } : {}),\n };\n return { recordId, payload: new TextEncoder().encode(JSON.stringify(record)) };\n}\n\nexport interface ServedPublisherOptions {\n /**\n * The plugin's own client: it signs every record as its identity, which\n * is also the record's `agent`. Without a signer nothing is published —\n * an unsigned record cannot be attributed — the publisher warns once and\n * each record owed counts as dropped.\n */\n readonly agents: Agents;\n /**\n * Where the records go: the edge subject, the same the plugin's tracing\n * runs with. {@link DEFAULT_EDGE_SUBJECT} by default.\n */\n readonly subject?: string;\n /** Where a refused binding or a failed publish is reported; the console by default. */\n readonly logger?: Logger;\n}\n\n/**\n * One prompt's served pair. `bind` names the harness thread id once and\n * publishes `start`, stamped with the prompt's arrival — the moment\n * {@link ServedPublisher.beginTurn} was called — however late the id\n * becomes known; `settle` records the outcome when the turn ends and\n * publishes `end` if the id is known. An id bound after settling is\n * refused: the pair is the turn's window, not something to backfill. Both\n * are synchronous and return at once; the records go out behind them.\n */\nexport interface ServedTurn {\n /**\n * The harness's own id for this prompt's turn, bare. An unusable id\n * (see {@link validHarnessThreadId}) is refused with a warning and the\n * prompt gets no pair; a second binding is ignored, with a warning when\n * it names another id.\n */\n bind(harnessThreadId: string): void;\n /**\n * End the turn. `atMs` is the turn's end in milliseconds since the epoch,\n * as the plugin's events report it; now by default. `reason` is how the\n * prompt ended when the model did not reply itself ({@link ServedReason}),\n * carried on `end`. A second call does nothing.\n */\n settle(status: ServedStatus, atMs?: number, reason?: ServedReason): void;\n}\n\nconst defaultLogger = (): Logger => ({\n debug: () => undefined,\n info: () => undefined,\n warn: (msg, ctx) => console.warn(`@synadia-ai/agent-fabric: ${msg}`, ctx ?? \"\"),\n error: (msg, ctx) => console.error(`@synadia-ai/agent-fabric: ${msg}`, ctx ?? \"\"),\n});\n\n/**\n * Publishes served records through the plugin's client, one after another\n * in the order they were due, so a pair's `end` never overtakes its\n * `start` on the wire and two prompts' pairs interleave as they happened.\n * See {@link servedPublisher}.\n */\nexport class ServedPublisher {\n readonly #agents: Agents;\n readonly #subject: string;\n readonly #logger: Logger;\n #unsignedWarned = false;\n // Records are built, signed and handed to the connection one after\n // another, in the order they were due. A failed record never rejects the\n // chain: `#send` catches everything.\n #chain: Promise<void> = Promise.resolve();\n\n constructor(options: ServedPublisherOptions) {\n this.#agents = options.agents;\n this.#subject = options.subject ?? DEFAULT_EDGE_SUBJECT;\n this.#logger = options.logger ?? defaultLogger();\n }\n\n /** Where the records go. */\n get subject(): string {\n return this.#subject;\n }\n\n /**\n * Start a prompt's pair: `scope` is the served prompt's trace scope —\n * the one the fabric's request interceptor bound around the handler,\n * `activeTrace()` inside it — and `harness` the one whose id `bind` will\n * name. The arrival, `start`'s `ts`, is now.\n */\n beginTurn(scope: TraceScope, harness: Harness): ServedTurn {\n const arrivedAt = unixSeconds();\n let harnessThreadId: string | undefined;\n let settled = false;\n return {\n bind: (id: string): void => {\n if (settled) {\n this.#logger.warn(\n \"served: harness thread id bound after the turn ended; no served record\",\n );\n return;\n }\n if (harnessThreadId !== undefined) {\n if (id !== harnessThreadId) {\n this.#logger.warn(\"served: harness thread id already bound for this prompt; ignored\");\n }\n return;\n }\n if (!validHarnessThreadId(id)) {\n this.#logger.warn(\"served: unusable harness thread id bound; no served record\");\n return;\n }\n harnessThreadId = id;\n void this.publish(scope, harness, id, \"start\", undefined, arrivedAt);\n },\n settle: (status: ServedStatus, atMs?: number, reason?: ServedReason): void => {\n if (settled) return;\n settled = true;\n if (harnessThreadId === undefined) return;\n const ts = atMs === undefined ? unixSeconds() : Math.floor(atMs / 1000);\n void this.publish(scope, harness, harnessThreadId, \"end\", status, ts, reason);\n },\n };\n }\n\n /**\n * Publish one signed record, after every record handed over before it.\n * Fail-open and asynchronous: the returned promise never rejects and\n * nothing awaits it on the prompt path. A record that cannot go out — no\n * signer, a client already closed, a publish that threw — is logged and\n * counts as dropped; one that went out counts as published. Every record\n * moves the process-wide {@link traceRecordCounts}.\n */\n publish(\n scope: TraceScope,\n harness: Harness,\n harnessThreadId: string,\n phase: ServedPhase,\n status: ServedStatus | undefined,\n ts: number,\n reason?: ServedReason,\n ): Promise<void> {\n const next = this.#chain.then(() =>\n this.#send(scope, harness, harnessThreadId, phase, status, ts, reason),\n );\n this.#chain = next;\n return next;\n }\n\n /**\n * Resolves once every record handed to `publish` so far has been signed\n * and handed to the connection, or dropped. For shutdown and tests.\n */\n flush(): Promise<void> {\n return this.#chain;\n }\n\n async #send(\n scope: TraceScope,\n harness: Harness,\n harnessThreadId: string,\n phase: ServedPhase,\n status: ServedStatus | undefined,\n ts: number,\n reason: ServedReason | undefined,\n ): Promise<void> {\n try {\n const agent = await this.#agents.selfId();\n const record = buildServedRecord(\n agent,\n scope.threadId,\n scope.rootId,\n harness,\n harnessThreadId,\n phase,\n status,\n ts,\n reason,\n );\n await this.#agents.publishSigned(this.#subject, record.payload, { nonce: record.recordId });\n countTraceRecordPublished();\n } catch (err) {\n countTraceRecordDropped();\n if (isSignatureRequired(err)) {\n // Consumers ignore unsigned records, so publishing without a\n // signer would be pure waste. One warning per publisher: a\n // per-prompt log would itself disturb the agent.\n if (this.#unsignedWarned) return;\n this.#unsignedWarned = true;\n this.#logger.warn(\n \"served: no identity signer is configured; served records are not published \" +\n \"(consumers ignore unsigned records). Pass identity: { signer } to sign them.\",\n );\n return;\n }\n this.#logger.warn(\"served: failed to publish served record\", {\n subject: this.#subject,\n phase,\n reason: err instanceof Error ? err.message : String(err),\n });\n }\n }\n}\n\n/**\n * `true` for the client's refusal to publish without a signer. By `name` as\n * well as by class: an add-on hands this publisher the plugin's `Agents`,\n * which runs on the plugin's own copy of the SDK and throws that copy's\n * class (`docs/plugins.md` §2.7), the way the host recognizes a\n * `RequestRejectedError` from another copy.\n */\nfunction isSignatureRequired(err: unknown): boolean {\n return (\n err instanceof SenderSignatureRequiredError ||\n (err instanceof Error && err.name === \"SenderSignatureRequiredError\")\n );\n}\n\n/**\n * The served records' publisher for a harness plugin's add-on, over the\n * plugin's own client: `agents.publishSigned` with the record id as nonce,\n * on `subject` ({@link DEFAULT_EDGE_SUBJECT} by default), the records in\n * the order they were due, every one counted on the process-wide\n * {@link traceRecordCounts}. Per served prompt the add-on calls\n * {@link ServedPublisher.beginTurn} with the prompt's scope, `bind`s the\n * harness's id once it knows it, and `settle`s with the outcome;\n * {@link ServedPublisher.flush} before the plugin stops.\n */\nexport function servedPublisher(options: ServedPublisherOptions): ServedPublisher {\n return new ServedPublisher(options);\n}\n","// ScratchPad references — the vocabulary of handing content over by\n// reference on the fabric, and the port the agent's own ScratchPad client\n// plugs into. Mirrors `synadia_ai/agent_fabric/scratchpad.py`.\n//\n// A reference is one opaque token: service-issued `sp-r1:` or the existing\n// expanded `sp-ref:` form. Models copy it unchanged; clients resolve metadata.\n// Neither form grants authority. ScratchPad authenticates every reader and\n// checks current grants. The creator is a routing claim that discovery verifies.\n//\n// The rules the fabric keeps around references (the reference agents'\n// `tools/README.md`, `agent-fabric` `docs/agent-tools.md` §2.2):\n//\n// - who reads references says so, with `scratchpad_refs_ok: \"true\"` in its\n// service metadata; a reference goes to no other agent;\n// - an agent hands on only a reference it was given: it committed it, or\n// it arrived in a prompt it served or a reply it received;\n// - least authority: one grantee, one path, read only, a short expiry,\n// granted immediately before the reference goes out;\n// - being allowed to read is not being allowed to pass on: only a\n// volume's owner grants, so an agent that wants to hand on another\n// agent's reference asks its creator (`grant-request.ts`).\n//\n// This package holds that policy. It does not talk to ScratchPad: the\n// agent brings its own client, behind the {@link ScratchPad} port.\n\n/** Prefix of the expanded reference token. */\nexport const REFERENCE_PREFIX = \"sp-ref:\";\n\nexport const SHORT_REFERENCE_PREFIX = \"sp-r1:\";\n\nconst REFERENCE_RE = /sp-(?:ref|r1):[A-Za-z0-9_-]+/g;\n\n/**\n * The service metadata key an agent that reads the references it is handed\n * registers, with the value `\"true\"` (the SDK's `extraMetadata`). A caller\n * hands a reference, and grants read on it, only to an agent that says so.\n * In the style of the protocol's `attachments_ok`.\n */\nexport const READS_REFERENCES_KEY = \"scratchpad_refs_ok\";\n\n/** The served prompt's thread and root, as `activeTrace()` reports them. */\nexport interface TraceIds {\n readonly threadId: string;\n readonly rootId: string;\n}\n\n/**\n * The principal ScratchPad grants to: the two halves of an agent identity,\n * `<account>.<user>`, both public NKEYs on the fabric.\n */\nexport interface Grantee {\n readonly account: string;\n readonly user: string;\n}\n\n/**\n * How a grant came about. `first-hand`: the agent granted an agent it\n * handed the reference itself — the verified caller of its reply, or the\n * agent it prompted with a reference of its own. `on-request`: the agent\n * granted an agent because another agent asked it to (`grant-request.ts`).\n * Only a first-hand grant entitles its holder to ask for another agent, or\n * access could be relayed from agent to agent without end.\n */\nexport type GrantKind = \"first-hand\" | \"on-request\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\n/**\n * What the policy needs of the agent's ScratchPad: its own volume, and a\n * ledger of the read grants it made. ScratchPad knows the grants but not\n * how they came about; that is the agent's own knowledge, so the\n * implementation keeps the ledger.\n */\nexport interface ScratchPad {\n /** Resolve reference metadata through the implementation's authenticated client. */\n resolveReference?(\n reference: string,\n trace?: TraceIds,\n ): MaybePromise<{ readonly creator: string }>;\n /** Whether `reference` points into this agent's own volume, where it may grant. */\n owns(reference: string): MaybePromise<boolean>;\n /**\n * Grant `grantee` read on the one path `reference` names, until the\n * grant's expiry, and note it in the ledger as `kind` (`first-hand` when\n * not given). Only for a reference into this agent's own volume. `trace`\n * and `toolCallId` label the grant, so it shows under the served prompt\n * and the tool call that caused it.\n */\n grantRead(\n reference: string,\n grantee: Grantee,\n trace: TraceIds | undefined,\n toolCallId?: string,\n kind?: GrantKind,\n ): MaybePromise<void>;\n /**\n * The live grant this agent made to `grantee` on what `reference` points\n * at, by kind; `undefined` when there is none or it has expired. A\n * first-hand grant still running is not hidden by a later one made on\n * request.\n */\n granted(reference: string, grantee: Grantee): MaybePromise<GrantKind | undefined>;\n}\n\n/** Every reference token in `text`, in order, repeats included. */\nexport function findReferences(text: string): string[] {\n return text.match(REFERENCE_RE) ?? [];\n}\n\n/**\n * `text` with reference tokens taken out — every one, or only those in\n * `only` — and the trailing spaces and extra blank lines that leaves\n * behind tidied away.\n */\nexport function removeReferences(text: string, only?: ReadonlyArray<string>): string {\n return text\n .replace(REFERENCE_RE, (token) => (only === undefined || only.includes(token) ? \"\" : token))\n .replace(/[ \\t]+$/gm, \"\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n}\n\n/**\n * The prompt address of the agent that made `reference`, as the token says;\n * `undefined` for a token that names none or does not decode.\n */\nexport function referenceCreator(reference: string): string | undefined {\n if (!reference.startsWith(REFERENCE_PREFIX)) return undefined;\n let made: unknown;\n try {\n made = JSON.parse(\n Buffer.from(reference.slice(REFERENCE_PREFIX.length), \"base64url\").toString(\"utf8\"),\n );\n } catch {\n return undefined;\n }\n if (typeof made !== \"object\" || made === null) return undefined;\n const creator = (made as Record<string, unknown>)[\"creator\"];\n return typeof creator === \"string\" && creator !== \"\" ? creator : undefined;\n}\n\n/** Whether an agent's registration metadata says it reads references. */\nexport function readsReferences(metadata: Readonly<Record<string, string>>): boolean {\n return metadata[READS_REFERENCES_KEY] === \"true\";\n}\n\n/**\n * The grantee behind an identity as discovery or a verified sender reports\n * it. Throws for anything that is not `<account>.<user>`.\n */\nexport function granteeFromIdentity(identity: string): Grantee {\n // The account half never contains a dot (an NKEY, a config-file account\n // name, or `$G`), so the first dot is the split.\n const dot = identity.indexOf(\".\");\n if (dot <= 0 || dot === identity.length - 1) {\n throw new Error(`not an agent identity: ${identity}`);\n }\n return { account: identity.slice(0, dot), user: identity.slice(dot + 1) };\n}\n","// The grant request — asking a reference's creator to let one more agent\n// read it. Mirrors `synadia_ai/agent_fabric/grant_request.py`; the two send\n// and answer the same bytes.\n//\n// An agent handed a reference may read it; it may not let a third agent\n// read it. In ScratchPad only a volume's owner grants, and being allowed to\n// read is not being allowed to pass on (ScratchPad v1 has no delegation, on\n// purpose). So before an agent hands on a reference it did not create, it\n// asks the creator, which the token names, to grant that agent read. The\n// creator decides, and if it agrees it makes the grant itself, on its own\n// volume.\n//\n// Code to code: no model sees the request or decides the answer, on either\n// side. The creator's rule:\n//\n// - the request is signed and the signature verifies: the requester is an\n// identity, not a claim (the SDK's `SenderGate`, which also refuses a\n// replay);\n// - the reference points into the creator's own volume;\n// - the creator itself granted that requester read on that reference\n// first-hand, and the grant has not expired: only an agent the creator\n// chose to hand the content to may ask for it to be handed on, and only\n// while its own access lasts;\n// - a grant made on request confers no right to ask, or access would be\n// relayed from agent to agent without end;\n// - the requester asks for another agent, never for itself: a grant that\n// renews itself would never expire.\n//\n// Then it grants what every grant is — one agent, the one path, read only,\n// its usual expiry — and records it as made on request. So content travels\n// at most one hop beyond the agents its creator chose.\n//\n// The wire: one signed NATS request (the SDK's `requestSigned`) and one\n// JSON reply, on the creator's prompt address with the verb changed:\n//\n// agents.prompt.<agent>.<owner>.<name> where it takes prompts\n// agents.sp-grant.<agent>.<owner>.<name> where it takes grant requests\n//\n// The shapes are `test-fixtures/schemas/sp-grant-{request,reply}.json`.\n// A stopgap until ScratchPad has delegation of its own; then this goes.\n\nimport { SenderGate, type AgentServiceExtraEndpoint } from \"@synadia-ai/agent-service\";\nimport { SILENT_LOGGER, type Agents, type Logger } from \"@synadia-ai/agents\";\nimport {\n granteeFromIdentity,\n type GrantKind,\n type Grantee,\n type ScratchPad,\n type TraceIds,\n} from \"./scratchpad.js\";\nimport { isThreadId, validToolCallId } from \"./trace.js\";\n\n/** What the requester sends (`sp-grant-request.json`). */\nexport interface GrantRequest {\n /** The reference, exactly as the requester was given it. */\n readonly reference: string;\n /** The identity, `<account>.<user>`, of the agent that should be able to read it. */\n readonly grantee: string;\n /**\n * The requester's served thread and the tool call the handoff belongs to,\n * so the creator's grant shows under the call that caused it. Labels\n * only, never authority.\n */\n readonly trace?: {\n readonly thread_id: string;\n readonly root_id: string;\n readonly tool_call_id?: string;\n };\n}\n\n/** What the creator answers (`sp-grant-reply.json`). */\nexport type GrantReply =\n { readonly granted: true } | { readonly granted: false; readonly reason: string };\n\n/** The name of the creator's extra endpoint, and the verb of its subject. */\nexport const GRANT_REQUEST_ENDPOINT = \"sp-grant\";\n\n/**\n * How long the requester waits for the creator's answer. The creator runs\n * one ScratchPad operation before it answers, so longer than the SDK's two\n * seconds for a signed request.\n */\nexport const DEFAULT_GRANT_REQUEST_TIMEOUT_MS = 10_000;\n\nconst PROMPT_PREFIX = \"agents.prompt.\";\nconst GRANT_PREFIX = `agents.${GRANT_REQUEST_ENDPOINT}.`;\n\n/**\n * Where the agent at `promptAddress` takes grant requests: the same subject\n * with the verb changed. Derived, never taken from what another agent says,\n * so a request only ever goes to the creator's own subject. Throws for a\n * subject that is not a prompt address.\n */\nexport function grantSubject(promptAddress: string): string {\n if (!promptAddress.startsWith(PROMPT_PREFIX) || promptAddress === PROMPT_PREFIX) {\n throw new Error(`not a prompt address: ${promptAddress}`);\n }\n return GRANT_PREFIX + promptAddress.slice(PROMPT_PREFIX.length);\n}\n\n/** A request's bytes, as both packages write them: the schema's key order. */\nexport function encodeGrantRequest(request: GrantRequest): string {\n const { trace } = request;\n return JSON.stringify({\n reference: request.reference,\n grantee: request.grantee,\n ...(trace !== undefined\n ? {\n trace: {\n thread_id: trace.thread_id,\n root_id: trace.root_id,\n ...(trace.tool_call_id !== undefined ? { tool_call_id: trace.tool_call_id } : {}),\n },\n }\n : {}),\n });\n}\n\n/** A reply's bytes, as both packages write them. */\nexport function encodeGrantReply(reply: GrantReply): string {\n return JSON.stringify(\n reply.granted ? { granted: true } : { granted: false, reason: reply.reason },\n );\n}\n\nexport interface RequestGrantOptions {\n /** How long to wait for the answer. Default {@link DEFAULT_GRANT_REQUEST_TIMEOUT_MS}. */\n readonly timeoutMs?: number;\n}\n\n/**\n * The requester's side: ask the agent at `creatorAddress` to grant what\n * `request` names, signed as `agents`' identity. Never throws: no answer,\n * or an answer that is not a grant, is a refusal with its reason in words.\n */\nexport async function requestGrant(\n agents: Agents,\n creatorAddress: string,\n request: GrantRequest,\n options: RequestGrantOptions = {},\n): Promise<GrantReply> {\n let answer: unknown;\n try {\n const msg = await agents.requestSigned(\n grantSubject(creatorAddress),\n encodeGrantRequest(request),\n { timeoutMs: options.timeoutMs ?? DEFAULT_GRANT_REQUEST_TIMEOUT_MS },\n );\n answer = JSON.parse(msg.string());\n } catch (err) {\n // Nobody listening there (an agent without ScratchPad, a harness, an\n // agent that has left), no answer in time, or no JSON.\n return refusal(`no answer from ${creatorAddress}: ${describe(err)}`);\n }\n if (typeof answer !== \"object\" || answer === null) {\n return refusal(\"refused without a reason\");\n }\n const { granted, reason } = answer as Record<string, unknown>;\n if (granted === true) return { granted: true };\n return refusal(typeof reason === \"string\" ? reason : \"refused without a reason\");\n}\n\n/**\n * The creator's rule, for a requester whose signature verified. `requester`\n * is that verified sender ID; `payload` the request's body. Never throws.\n * {@link grantRequestEndpoint} runs it after the SDK's `SenderGate`; a host\n * that takes grant requests some other way must verify the sender first.\n */\nexport async function answerGrantRequest(\n requester: string,\n payload: string,\n scratchPad: ScratchPad,\n logger: Logger = SILENT_LOGGER,\n): Promise<GrantReply> {\n const request = parseGrantRequest(payload);\n if (request === undefined) return refusal(\"not a grant request\");\n let from: Grantee;\n let to: Grantee;\n try {\n from = granteeFromIdentity(requester);\n to = granteeFromIdentity(request.grantee);\n } catch {\n return refusal(\"grantee is not an agent identity\");\n }\n const labels = request.trace;\n const trace: TraceIds | undefined =\n labels !== undefined ? { threadId: labels.thread_id, rootId: labels.root_id } : undefined;\n\n // The rule. Each refusal says which line refused.\n let own = false;\n try {\n own = await scratchPad.owns(request.reference);\n } catch {\n // A token that does not decode is nobody's.\n }\n if (!own) return refusal(\"the reference does not point into this agent's volume\");\n let held: GrantKind | undefined;\n try {\n held = await scratchPad.granted(request.reference, from);\n } catch (err) {\n logger.error(\"grant request: the ledger could not be read\", { error: describe(err) });\n return refusal(\"the grant could not be made\");\n }\n if (held === undefined) {\n return refusal(\n \"this agent holds no live read grant it made to the requester on that reference\",\n );\n }\n if (held !== \"first-hand\") {\n return refusal(\n \"the requester's own grant was made at another agent's request; \" +\n \"only an agent this agent handed the reference itself may ask for another\",\n );\n }\n if (to.account === from.account && to.user === from.user) {\n return refusal(\"a grant request is for another agent, not for the requester\");\n }\n try {\n await scratchPad.grantRead(request.reference, to, trace, labels?.tool_call_id, \"on-request\");\n } catch (err) {\n logger.error(\"grant request: the grant failed\", { error: describe(err) });\n return refusal(\"the grant could not be made\");\n }\n logger.info(\"grant request: granted\", { grantee: request.grantee, requester });\n return { granted: true };\n}\n\nexport interface GrantRequestEndpointOptions {\n /** This agent's own prompt address; the endpoint sits next to it. */\n readonly promptAddress: string;\n /** This agent's ScratchPad: the volume it may grant on, and its ledger. */\n readonly scratchPad: ScratchPad;\n /** Refusals at `info`, failures at `error`. Default: silent. */\n readonly logger?: Logger;\n}\n\ntype ServiceMsg = Parameters<AgentServiceExtraEndpoint[\"handler\"]>[1];\n\n/**\n * The creator's side, as an extra endpoint for the agent's `AgentService`\n * (`extraEndpoints: [grantRequestEndpoint({ ... })]`): it answers every\n * grant request by the rule at the top of this file. Several instances of\n * one agent share the work, in the `agents` queue group.\n */\nexport function grantRequestEndpoint(\n options: GrantRequestEndpointOptions,\n): AgentServiceExtraEndpoint {\n const { scratchPad } = options;\n const logger = options.logger ?? SILENT_LOGGER;\n // The SDK's admission of a signed message, the one its prompt endpoint\n // runs: parse the `Agent-Sender` header, verify the signature over this\n // subject and payload, check the timestamp, and record the nonce so a\n // captured request cannot be played again.\n const gate = new SenderGate({ minSenderTrust: \"signed\", logger });\n\n async function decide(msg: ServiceMsg): Promise<GrantReply> {\n const admission = await gate.admitPrompt(msg);\n if (!admission.ok) return refusal(admission.description);\n const sender = admission.sender;\n if (sender?.trust !== \"verified\") return refusal(\"a grant request must be signed\");\n return answerGrantRequest(sender.id, msg.string(), scratchPad, logger);\n }\n\n return {\n name: GRANT_REQUEST_ENDPOINT,\n subject: grantSubject(options.promptAddress),\n queue: \"agents\",\n handler: (err, msg) => {\n if (err) return;\n void decide(msg)\n .catch((e: unknown): GrantReply => {\n logger.error(\"grant request failed\", { error: describe(e) });\n return refusal(\"the grant could not be made\");\n })\n .then((reply) => {\n if (!reply.granted) logger.info(\"grant request refused\", { reason: reply.reason });\n msg.respond(encodeGrantReply(reply));\n });\n },\n };\n}\n\n// A request is taken only with the two strings; the trace labels only when\n// they look like what the fabric mints, and otherwise left off.\nfunction parseGrantRequest(text: string): GrantRequest | undefined {\n let value: unknown;\n try {\n value = JSON.parse(text);\n } catch {\n return undefined;\n }\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined;\n const { reference, grantee, trace } = value as Record<string, unknown>;\n if (typeof reference !== \"string\" || typeof grantee !== \"string\") return undefined;\n if (typeof trace !== \"object\" || trace === null) return { reference, grantee };\n const { thread_id, root_id, tool_call_id } = trace as Record<string, unknown>;\n if (\n typeof thread_id !== \"string\" ||\n typeof root_id !== \"string\" ||\n !isThreadId(thread_id) ||\n !isThreadId(root_id)\n ) {\n return { reference, grantee };\n }\n return {\n reference,\n grantee,\n trace: {\n thread_id,\n root_id,\n ...(typeof tool_call_id === \"string\" && validToolCallId(tool_call_id)\n ? { tool_call_id }\n : {}),\n },\n };\n}\n\nfunction refusal(reason: string): GrantReply {\n return { granted: false, reason };\n}\n\nfunction describe(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n","// The ScratchPad extension of the agent tools: the fabric's rules for\n// references, on the three hooks of the protocol SDK's `AgentTools`\n// (`docs/agent-tools.md` §6.3 there; `agent-fabric` `docs/agent-tools.md`\n// §2.2). Mirrors `synadia_ai/agent_fabric/scratchpad_extension.py`.\n//\n// discovery fields `reads_scratchpad_references`, from the agent's\n// registration (`scratchpad_refs_ok: \"true\"`)\n// prompt rewrite checks each `sp-ref:` token in the prompt and gets the\n// target read on it before the prompt goes out:\n// - a token this agent was not given refuses the prompt;\n// - a target that reads no references gets the text\n// without them;\n// - on this agent's own content it grants read itself,\n// first-hand, and a grant that fails refuses the prompt;\n// - on another agent's content it asks the creator\n// (`grant-request.ts`), and a refusal or no answer takes\n// that reference out;\n// removals add `references_removed` and `note` to the\n// call's results; a prompt that was nothing but removed\n// references is refused\n// reply look remembers the references that arrive in a reply or a\n// question, so the agent may hand them on\n//\n// Every grant, made here or asked of a creator, carries the served prompt's\n// thread and root (`activeTrace()`) and the model's tool-call ID, so it\n// shows under the tool call that caused it.\n//\n// What the agent was given is what it may hand on: the references it\n// committed (`remember`, or `grantCaller` on the reply side), the ones in\n// the prompts it serves (`requestInterceptor`), and the ones in the replies\n// and questions its calls bring back (the reply look).\n\nimport type { RequestInterceptor } from \"@synadia-ai/agent-service\";\nimport type {\n Agent,\n Agents,\n AgentToolsExtension,\n AgentToolsPromptContext,\n AgentToolsPromptRewrite,\n AgentToolsReplyContext,\n SenderInfo,\n} from \"@synadia-ai/agents\";\nimport { requestGrant, type GrantReply, type GrantRequest } from \"./grant-request.js\";\nimport {\n findReferences,\n granteeFromIdentity,\n readsReferences,\n referenceCreator,\n removeReferences,\n type ScratchPad,\n type TraceIds,\n} from \"./scratchpad.js\";\nimport { activeTrace, validToolCallId } from \"./trace.js\";\n\n/** The field `discover_agents` entries get. */\nexport const READS_SCRATCHPAD_REFERENCES_FIELD = \"reads_scratchpad_references\";\n\nexport interface ScratchPadExtensionOptions {\n /** The agent's own ScratchPad, behind the port. */\n readonly scratchPad: ScratchPad;\n /**\n * The client grant requests are signed and sent with, and creators are\n * looked up through: the one `AgentTools` runs on, with the agent's\n * signer.\n */\n readonly agents: Agents;\n /** How long a lookup of a creator waits; unset, the SDK's discovery default. */\n readonly discoverTimeoutMs?: number;\n /** How long a creator's answer is waited for. Default 10 seconds. */\n readonly grantRequestTimeoutMs?: number;\n}\n\n/** The extension; build it with {@link scratchPadExtension}. */\nexport class ScratchPadExtension implements AgentToolsExtension {\n /**\n * For the agent's `AgentService` (`interceptors: [...]`): remembers the\n * references in every prompt it serves.\n */\n readonly requestInterceptor: RequestInterceptor;\n\n readonly #scratchPad: ScratchPad;\n readonly #agents: Agents;\n readonly #discoverTimeoutMs: number | undefined;\n readonly #grantRequestTimeoutMs: number | undefined;\n // Every reference this agent was given, exactly as it came.\n readonly #given = new Set<string>();\n // Live handles by address, from discovery: a creator is asked only when\n // it is on the fabric with a verified identity.\n readonly #known = new Map<string, Agent>();\n\n constructor(options: ScratchPadExtensionOptions) {\n this.#scratchPad = options.scratchPad;\n this.#agents = options.agents;\n this.#discoverTimeoutMs = options.discoverTimeoutMs;\n this.#grantRequestTimeoutMs = options.grantRequestTimeoutMs;\n this.requestInterceptor = {\n aroundRequest: (ctx, next) => {\n this.remember(ctx.envelope.prompt);\n return next();\n },\n };\n }\n\n /**\n * Note the references in `text` as given to this agent: what it\n * committed, or received some way the hooks do not see.\n */\n remember(text: string): void {\n for (const reference of findReferences(text)) this.#given.add(reference);\n }\n\n /**\n * The reply side: before a reply carrying `reference`, this agent's own,\n * goes out, remember it and grant the served prompt's sender read on it,\n * first-hand — only a sender whose signature verified, since a grant\n * names a principal and an unsigned claim proves none. `true` when\n * granted, so the reference may go into the reply; `false` for a sender\n * that did not verify. Throws when the reference is not this agent's own\n * or the grant fails. The commit itself stays the agent's.\n */\n async grantCaller(reference: string, sender: SenderInfo | undefined): Promise<boolean> {\n this.remember(reference);\n if (sender?.trust !== \"verified\") return false;\n if (!(await this.#scratchPad.owns(reference))) {\n throw new Error(\"the reference points into another agent's volume; only its creator grants\");\n }\n await this.#scratchPad.grantRead(\n reference,\n granteeFromIdentity(sender.id),\n servedTrace(),\n undefined,\n \"first-hand\",\n );\n return true;\n }\n\n /** The discovery fields hook. */\n discoveryFields(agent: Agent): Record<string, unknown> {\n this.#note(agent);\n return { [READS_SCRATCHPAD_REFERENCES_FIELD]: readsReferences(agent.metadata) };\n }\n\n /** The prompt rewrite hook. */\n async beforePrompt(ctx: AgentToolsPromptContext): Promise<AgentToolsPromptRewrite | void> {\n const { address, target } = ctx;\n const found = findReferences(ctx.prompt);\n if (found.length === 0) return;\n\n // Only to an agent that reads references. Any other gets the text\n // without them, and nothing is asked or granted for it.\n if (!readsReferences(target.metadata)) {\n const prompt = removeReferences(ctx.prompt);\n if (prompt === \"\") {\n return {\n error:\n `the prompt was not sent: \"${address}\" does not read ScratchPad references ` +\n \"(discover_agents: reads_scratchpad_references is false), and the prompt held nothing but references; \" +\n \"put the content they point at into the prompt itself\",\n };\n }\n return {\n prompt,\n fields: {\n references_removed: found.length,\n note:\n `\"${address}\" does not read ScratchPad references: ${found.length} reference(s) were removed ` +\n \"from your prompt, it got only the text, and nothing was granted\",\n },\n };\n }\n\n // Only a reference this agent was given, exactly as it came.\n const references = [...new Set(found)];\n const unknown = references.filter((reference) => !this.#given.has(reference));\n if (unknown.length > 0) {\n return {\n error:\n `the prompt was not sent: ${unknown.length} of its ScratchPad references (${unknown[0]!.slice(0, 24)}…) ` +\n \"is not one you were given. Copy each reference exactly as you received it, the whole token, or leave it out.\",\n };\n }\n\n // And be allowed to read: one grant per reference, to this one agent,\n // right before the prompt goes out, and only to an identity discovery\n // verified.\n if (target.identity === undefined || !target.idSigVerified) {\n return {\n error:\n `cannot hand a ScratchPad reference to \"${address}\": its identity is not verified, ` +\n \"so no read grant can be issued; put the content in the prompt instead\",\n };\n }\n const grantee = granteeFromIdentity(target.identity);\n const trace = servedTrace();\n const toolCallId =\n ctx.toolCallId !== undefined && validToolCallId(ctx.toolCallId) ? ctx.toolCallId : undefined;\n const refused: string[] = [];\n let reason = \"\";\n for (const reference of references) {\n // On its own content the agent grants itself; a grant that fails\n // means the prompt is not sent.\n try {\n if (await this.#scratchPad.owns(reference)) {\n await this.#scratchPad.grantRead(reference, grantee, trace, toolCallId, \"first-hand\");\n continue;\n }\n } catch (err) {\n return {\n error: `could not grant \"${address}\" read on ${reference.slice(0, 32)}…: ${describe(err)}; the prompt was not sent`,\n };\n }\n // On anyone else's content only the creator can, so it is asked.\n const answer = await this.#askCreator(reference, address, target.identity, trace, toolCallId);\n if (!answer.granted) {\n refused.push(reference);\n reason = answer.reason;\n }\n }\n if (refused.length === 0) return;\n\n const removed = found.filter((reference) => refused.includes(reference)).length;\n const prompt = removeReferences(ctx.prompt, refused);\n if (prompt === \"\") {\n return {\n error:\n `the prompt was not sent: it held nothing but references, and their creator did not grant ` +\n `\"${address}\" read (${reason}); put the content they point at into the prompt itself`,\n };\n }\n return {\n prompt,\n fields: {\n references_removed: removed,\n note:\n `${removed} reference(s) were removed from your prompt, and \"${address}\" got only the text: ` +\n `you did not create that content, and its creator did not grant \"${address}\" read (${reason}). ` +\n \"If it needs the content, put the content itself in a prompt\",\n },\n };\n }\n\n /** The reply look hook. */\n afterReply(ctx: AgentToolsReplyContext): void {\n this.remember(ctx.text);\n }\n\n // Ask the creator of a reference this agent was handed to grant the\n // target read on it. The creator is the address the token names, and it\n // must be on the fabric with a verified identity: a request to anyone\n // else could not be answered with a grant anyway. A target that is the\n // creator reads its own volume and needs no grant.\n async #askCreator(\n reference: string,\n targetAddress: string,\n targetIdentity: string,\n trace: TraceIds | undefined,\n toolCallId: string | undefined,\n ): Promise<GrantReply> {\n let address = referenceCreator(reference);\n if (address === undefined && this.#scratchPad.resolveReference) {\n try {\n address = (await this.#scratchPad.resolveReference(reference, trace)).creator;\n } catch {\n return { granted: false, reason: \"the reference could not be resolved\" };\n }\n }\n if (address === undefined) {\n return { granted: false, reason: \"the reference does not name its creator\" };\n }\n if (address === targetAddress) return { granted: true };\n const creator = await this.#lookup(address);\n if (creator === undefined || !creator.idSigVerified) {\n return {\n granted: false,\n reason: `its creator, ${address}, is not on the fabric with a verified identity`,\n };\n }\n const request: GrantRequest = {\n reference,\n grantee: targetIdentity,\n ...(trace !== undefined\n ? {\n trace: {\n thread_id: trace.threadId,\n root_id: trace.rootId,\n ...(toolCallId !== undefined ? { tool_call_id: toolCallId } : {}),\n },\n }\n : {}),\n };\n return requestGrant(\n this.#agents,\n address,\n request,\n this.#grantRequestTimeoutMs !== undefined ? { timeoutMs: this.#grantRequestTimeoutMs } : {},\n );\n }\n\n // The handle for an address: from discovery so far, else from a fresh one.\n async #lookup(address: string): Promise<Agent | undefined> {\n const known = this.#known.get(address);\n if (known !== undefined) return known;\n try {\n const found = await this.#agents.discover(\n this.#discoverTimeoutMs !== undefined ? { timeoutMs: this.#discoverTimeoutMs } : {},\n );\n for (const handle of found) this.#note(handle);\n } catch {\n // Not found, as far as the caller can tell.\n }\n return this.#known.get(address);\n }\n\n // Remember a handle, preferring one whose identity verifies.\n #note(handle: Agent): void {\n const known = this.#known.get(handle.promptSubject);\n if (known === undefined || handle.idSigVerified || !known.idSigVerified) {\n this.#known.set(handle.promptSubject, handle);\n }\n }\n}\n\n/** The ScratchPad extension for `AgentTools` (`extensions: [...]`). */\nexport function scratchPadExtension(options: ScratchPadExtensionOptions): ScratchPadExtension {\n return new ScratchPadExtension(options);\n}\n\nfunction servedTrace(): TraceIds | undefined {\n const scope = activeTrace();\n return scope !== undefined ? { threadId: scope.threadId, rootId: scope.rootId } : undefined;\n}\n\nfunction describe(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n","import type { Code } from \"./protocol\";\n\n/** A failed request. `unknown` means a mutation may already have taken effect. */\nexport class NativeScratchPadError extends Error {\n readonly code: Code;\n readonly unknown: boolean;\n readonly local: boolean;\n\n constructor(\n code: Code,\n message: string,\n options: { unknown?: boolean; local?: boolean; cause?: unknown } = {},\n ) {\n super(message, options.cause === undefined ? undefined : { cause: options.cause });\n this.name = \"NativeScratchPadError\";\n this.code = code;\n this.unknown = options.unknown ?? false;\n this.local = options.local ?? false;\n }\n}\n\nexport function invalid(message: string, cause?: unknown): NativeScratchPadError {\n return new NativeScratchPadError(\"invalid\", message, { local: true, cause });\n}\n\nexport function failed(mutation: boolean, message: string, cause?: unknown): NativeScratchPadError {\n return new NativeScratchPadError(mutation ? \"unknown\" : \"corrupt\", message, {\n unknown: mutation,\n cause,\n });\n}\n","export default /[\\u0378\\u0379\\u0380-\\u0383\\u038B\\u038D\\u03A2\\u0530\\u0557\\u0558\\u058B\\u058C\\u0590\\u05C8-\\u05CF\\u05EB-\\u05EE\\u05F5-\\u05FF\\u070E\\u074B\\u074C\\u07B2-\\u07BF\\u07FB\\u07FC\\u082E\\u082F\\u083F\\u085C\\u085D\\u085F\\u086B-\\u086F\\u088F\\u0892-\\u0897\\u0984\\u098D\\u098E\\u0991\\u0992\\u09A9\\u09B1\\u09B3-\\u09B5\\u09BA\\u09BB\\u09C5\\u09C6\\u09C9\\u09CA\\u09CF-\\u09D6\\u09D8-\\u09DB\\u09DE\\u09E4\\u09E5\\u09FF\\u0A00\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A29\\u0A31\\u0A34\\u0A37\\u0A3A\\u0A3B\\u0A3D\\u0A43-\\u0A46\\u0A49\\u0A4A\\u0A4E-\\u0A50\\u0A52-\\u0A58\\u0A5D\\u0A5F-\\u0A65\\u0A77-\\u0A80\\u0A84\\u0A8E\\u0A92\\u0AA9\\u0AB1\\u0AB4\\u0ABA\\u0ABB\\u0AC6\\u0ACA\\u0ACE\\u0ACF\\u0AD1-\\u0ADF\\u0AE4\\u0AE5\\u0AF2-\\u0AF8\\u0B00\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B29\\u0B31\\u0B34\\u0B3A\\u0B3B\\u0B45\\u0B46\\u0B49\\u0B4A\\u0B4E-\\u0B54\\u0B58-\\u0B5B\\u0B5E\\u0B64\\u0B65\\u0B78-\\u0B81\\u0B84\\u0B8B-\\u0B8D\\u0B91\\u0B96-\\u0B98\\u0B9B\\u0B9D\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BBD\\u0BC3-\\u0BC5\\u0BC9\\u0BCE\\u0BCF\\u0BD1-\\u0BD6\\u0BD8-\\u0BE5\\u0BFB-\\u0BFF\\u0C0D\\u0C11\\u0C29\\u0C3A\\u0C3B\\u0C45\\u0C49\\u0C4E-\\u0C54\\u0C57\\u0C5B\\u0C5C\\u0C5E\\u0C5F\\u0C64\\u0C65\\u0C70-\\u0C76\\u0C8D\\u0C91\\u0CA9\\u0CB4\\u0CBA\\u0CBB\\u0CC5\\u0CC9\\u0CCE-\\u0CD4\\u0CD7-\\u0CDC\\u0CDF\\u0CE4\\u0CE5\\u0CF0\\u0CF4-\\u0CFF\\u0D0D\\u0D11\\u0D45\\u0D49\\u0D50-\\u0D53\\u0D64\\u0D65\\u0D80\\u0D84\\u0D97-\\u0D99\\u0DB2\\u0DBC\\u0DBE\\u0DBF\\u0DC7-\\u0DC9\\u0DCB-\\u0DCE\\u0DD5\\u0DD7\\u0DE0-\\u0DE5\\u0DF0\\u0DF1\\u0DF5-\\u0E00\\u0E3B-\\u0E3E\\u0E5C-\\u0E80\\u0E83\\u0E85\\u0E8B\\u0EA4\\u0EA6\\u0EBE\\u0EBF\\u0EC5\\u0EC7\\u0ECF\\u0EDA\\u0EDB\\u0EE0-\\u0EFF\\u0F48\\u0F6D-\\u0F70\\u0F98\\u0FBD\\u0FCD\\u0FDB-\\u0FFF\\u10C6\\u10C8-\\u10CC\\u10CE\\u10CF\\u1249\\u124E\\u124F\\u1257\\u1259\\u125E\\u125F\\u1289\\u128E\\u128F\\u12B1\\u12B6\\u12B7\\u12BF\\u12C1\\u12C6\\u12C7\\u12D7\\u1311\\u1316\\u1317\\u135B\\u135C\\u137D-\\u137F\\u139A-\\u139F\\u13F6\\u13F7\\u13FE\\u13FF\\u169D-\\u169F\\u16F9-\\u16FF\\u1716-\\u171E\\u1737-\\u173F\\u1754-\\u175F\\u176D\\u1771\\u1774-\\u177F\\u17DE\\u17DF\\u17EA-\\u17EF\\u17FA-\\u17FF\\u181A-\\u181F\\u1879-\\u187F\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191F\\u192C-\\u192F\\u193C-\\u193F\\u1941-\\u1943\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19CF\\u19DB-\\u19DD\\u1A1C\\u1A1D\\u1A5F\\u1A7D\\u1A7E\\u1A8A-\\u1A8F\\u1A9A-\\u1A9F\\u1AAE\\u1AAF\\u1ACF-\\u1AFF\\u1B4D-\\u1B4F\\u1B7F\\u1BF4-\\u1BFB\\u1C38-\\u1C3A\\u1C4A-\\u1C4C\\u1C89-\\u1C8F\\u1CBB\\u1CBC\\u1CC8-\\u1CCF\\u1CFB-\\u1CFF\\u1F16\\u1F17\\u1F1E\\u1F1F\\u1F46\\u1F47\\u1F4E\\u1F4F\\u1F58\\u1F5A\\u1F5C\\u1F5E\\u1F7E\\u1F7F\\u1FB5\\u1FC5\\u1FD4\\u1FD5\\u1FDC\\u1FF0\\u1FF1\\u1FF5\\u1FFF\\u2065\\u2072\\u2073\\u208F\\u209D-\\u209F\\u20C1-\\u20CF\\u20F1-\\u20FF\\u218C-\\u218F\\u2427-\\u243F\\u244B-\\u245F\\u2B74\\u2B75\\u2B96\\u2CF4-\\u2CF8\\u2D26\\u2D28-\\u2D2C\\u2D2E\\u2D2F\\u2D68-\\u2D6E\\u2D71-\\u2D7E\\u2D97-\\u2D9F\\u2DA7\\u2DAF\\u2DB7\\u2DBF\\u2DC7\\u2DCF\\u2DD7\\u2DDF\\u2E5E-\\u2E7F\\u2E9A\\u2EF4-\\u2EFF\\u2FD6-\\u2FEF\\u2FFC-\\u2FFF\\u3040\\u3097\\u3098\\u3100-\\u3104\\u3130\\u318F\\u31E4-\\u31EF\\u321F\\uA48D-\\uA48F\\uA4C7-\\uA4CF\\uA62C-\\uA63F\\uA6F8-\\uA6FF\\uA7CB-\\uA7CF\\uA7D2\\uA7D4\\uA7DA-\\uA7F1\\uA82D-\\uA82F\\uA83A-\\uA83F\\uA878-\\uA87F\\uA8C6-\\uA8CD\\uA8DA-\\uA8DF\\uA954-\\uA95E\\uA97D-\\uA97F\\uA9CE\\uA9DA-\\uA9DD\\uA9FF\\uAA37-\\uAA3F\\uAA4E\\uAA4F\\uAA5A\\uAA5B\\uAAC3-\\uAADA\\uAAF7-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB27\\uAB2F\\uAB6C-\\uAB6F\\uABEE\\uABEF\\uABFA-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uD7FF\\uFA6E\\uFA6F\\uFADA-\\uFAFF\\uFB07-\\uFB12\\uFB18-\\uFB1C\\uFB37\\uFB3D\\uFB3F\\uFB42\\uFB45\\uFBC3-\\uFBD2\\uFD90\\uFD91\\uFDC8-\\uFDCE\\uFDD0-\\uFDEF\\uFE1A-\\uFE1F\\uFE53\\uFE67\\uFE6C-\\uFE6F\\uFE75\\uFEFD\\uFEFE\\uFF00\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFDF\\uFFE7\\uFFEF-\\uFFF8\\uFFFE\\uFFFF]|\\uD800[\\uDC0C\\uDC27\\uDC3B\\uDC3E\\uDC4E\\uDC4F\\uDC5E-\\uDC7F\\uDCFB-\\uDCFF\\uDD03-\\uDD06\\uDD34-\\uDD36\\uDD8F\\uDD9D-\\uDD9F\\uDDA1-\\uDDCF\\uDDFE-\\uDE7F\\uDE9D-\\uDE9F\\uDED1-\\uDEDF\\uDEFC-\\uDEFF\\uDF24-\\uDF2C\\uDF4B-\\uDF4F\\uDF7B-\\uDF7F\\uDF9E\\uDFC4-\\uDFC7\\uDFD6-\\uDFFF]|\\uD801[\\uDC9E\\uDC9F\\uDCAA-\\uDCAF\\uDCD4-\\uDCD7\\uDCFC-\\uDCFF\\uDD28-\\uDD2F\\uDD64-\\uDD6E\\uDD7B\\uDD8B\\uDD93\\uDD96\\uDDA2\\uDDB2\\uDDBA\\uDDBD-\\uDDFF\\uDF37-\\uDF3F\\uDF56-\\uDF5F\\uDF68-\\uDF7F\\uDF86\\uDFB1\\uDFBB-\\uDFFF]|\\uD802[\\uDC06\\uDC07\\uDC09\\uDC36\\uDC39-\\uDC3B\\uDC3D\\uDC3E\\uDC56\\uDC9F-\\uDCA6\\uDCB0-\\uDCDF\\uDCF3\\uDCF6-\\uDCFA\\uDD1C-\\uDD1E\\uDD3A-\\uDD3E\\uDD40-\\uDD7F\\uDDB8-\\uDDBB\\uDDD0\\uDDD1\\uDE04\\uDE07-\\uDE0B\\uDE14\\uDE18\\uDE36\\uDE37\\uDE3B-\\uDE3E\\uDE49-\\uDE4F\\uDE59-\\uDE5F\\uDEA0-\\uDEBF\\uDEE7-\\uDEEA\\uDEF7-\\uDEFF\\uDF36-\\uDF38\\uDF56\\uDF57\\uDF73-\\uDF77\\uDF92-\\uDF98\\uDF9D-\\uDFA8\\uDFB0-\\uDFFF]|\\uD803[\\uDC49-\\uDC7F\\uDCB3-\\uDCBF\\uDCF3-\\uDCF9\\uDD28-\\uDD2F\\uDD3A-\\uDE5F\\uDE7F\\uDEAA\\uDEAE\\uDEAF\\uDEB2-\\uDEFC\\uDF28-\\uDF2F\\uDF5A-\\uDF6F\\uDF8A-\\uDFAF\\uDFCC-\\uDFDF\\uDFF7-\\uDFFF]|\\uD804[\\uDC4E-\\uDC51\\uDC76-\\uDC7E\\uDCC3-\\uDCCC\\uDCCE\\uDCCF\\uDCE9-\\uDCEF\\uDCFA-\\uDCFF\\uDD35\\uDD48-\\uDD4F\\uDD77-\\uDD7F\\uDDE0\\uDDF5-\\uDDFF\\uDE12\\uDE42-\\uDE7F\\uDE87\\uDE89\\uDE8E\\uDE9E\\uDEAA-\\uDEAF\\uDEEB-\\uDEEF\\uDEFA-\\uDEFF\\uDF04\\uDF0D\\uDF0E\\uDF11\\uDF12\\uDF29\\uDF31\\uDF34\\uDF3A\\uDF45\\uDF46\\uDF49\\uDF4A\\uDF4E\\uDF4F\\uDF51-\\uDF56\\uDF58-\\uDF5C\\uDF64\\uDF65\\uDF6D-\\uDF6F\\uDF75-\\uDFFF]|\\uD805[\\uDC5C\\uDC62-\\uDC7F\\uDCC8-\\uDCCF\\uDCDA-\\uDD7F\\uDDB6\\uDDB7\\uDDDE-\\uDDFF\\uDE45-\\uDE4F\\uDE5A-\\uDE5F\\uDE6D-\\uDE7F\\uDEBA-\\uDEBF\\uDECA-\\uDEFF\\uDF1B\\uDF1C\\uDF2C-\\uDF2F\\uDF47-\\uDFFF]|\\uD806[\\uDC3C-\\uDC9F\\uDCF3-\\uDCFE\\uDD07\\uDD08\\uDD0A\\uDD0B\\uDD14\\uDD17\\uDD36\\uDD39\\uDD3A\\uDD47-\\uDD4F\\uDD5A-\\uDD9F\\uDDA8\\uDDA9\\uDDD8\\uDDD9\\uDDE5-\\uDDFF\\uDE48-\\uDE4F\\uDEA3-\\uDEAF\\uDEF9-\\uDEFF\\uDF0A-\\uDFFF]|\\uD807[\\uDC09\\uDC37\\uDC46-\\uDC4F\\uDC6D-\\uDC6F\\uDC90\\uDC91\\uDCA8\\uDCB7-\\uDCFF\\uDD07\\uDD0A\\uDD37-\\uDD39\\uDD3B\\uDD3E\\uDD48-\\uDD4F\\uDD5A-\\uDD5F\\uDD66\\uDD69\\uDD8F\\uDD92\\uDD99-\\uDD9F\\uDDAA-\\uDEDF\\uDEF9-\\uDEFF\\uDF11\\uDF3B-\\uDF3D\\uDF5A-\\uDFAF\\uDFB1-\\uDFBF\\uDFF2-\\uDFFE]|\\uD808[\\uDF9A-\\uDFFF]|\\uD809[\\uDC6F\\uDC75-\\uDC7F\\uDD44-\\uDFFF]|[\\uD80A\\uD80E-\\uD810\\uD812-\\uD819\\uD824-\\uD82A\\uD82D\\uD82E\\uD830-\\uD832\\uD83F\\uD87B-\\uD87D\\uD87F\\uD889-\\uDB3F\\uDB41-\\uDB7F][\\uDC00-\\uDFFF]|\\uD80B[\\uDC00-\\uDF8F\\uDFF3-\\uDFFF]|\\uD80D[\\uDC56-\\uDFFF]|\\uD811[\\uDE47-\\uDFFF]|\\uD81A[\\uDE39-\\uDE3F\\uDE5F\\uDE6A-\\uDE6D\\uDEBF\\uDECA-\\uDECF\\uDEEE\\uDEEF\\uDEF6-\\uDEFF\\uDF46-\\uDF4F\\uDF5A\\uDF62\\uDF78-\\uDF7C\\uDF90-\\uDFFF]|\\uD81B[\\uDC00-\\uDE3F\\uDE9B-\\uDEFF\\uDF4B-\\uDF4E\\uDF88-\\uDF8E\\uDFA0-\\uDFDF\\uDFE5-\\uDFEF\\uDFF2-\\uDFFF]|\\uD821[\\uDFF8-\\uDFFF]|\\uD823[\\uDCD6-\\uDCFF\\uDD09-\\uDFFF]|\\uD82B[\\uDC00-\\uDFEF\\uDFF4\\uDFFC\\uDFFF]|\\uD82C[\\uDD23-\\uDD31\\uDD33-\\uDD4F\\uDD53\\uDD54\\uDD56-\\uDD63\\uDD68-\\uDD6F\\uDEFC-\\uDFFF]|\\uD82F[\\uDC6B-\\uDC6F\\uDC7D-\\uDC7F\\uDC89-\\uDC8F\\uDC9A\\uDC9B\\uDCA4-\\uDFFF]|\\uD833[\\uDC00-\\uDEFF\\uDF2E\\uDF2F\\uDF47-\\uDF4F\\uDFC4-\\uDFFF]|\\uD834[\\uDCF6-\\uDCFF\\uDD27\\uDD28\\uDDEB-\\uDDFF\\uDE46-\\uDEBF\\uDED4-\\uDEDF\\uDEF4-\\uDEFF\\uDF57-\\uDF5F\\uDF79-\\uDFFF]|\\uD835[\\uDC55\\uDC9D\\uDCA0\\uDCA1\\uDCA3\\uDCA4\\uDCA7\\uDCA8\\uDCAD\\uDCBA\\uDCBC\\uDCC4\\uDD06\\uDD0B\\uDD0C\\uDD15\\uDD1D\\uDD3A\\uDD3F\\uDD45\\uDD47-\\uDD49\\uDD51\\uDEA6\\uDEA7\\uDFCC\\uDFCD]|\\uD836[\\uDE8C-\\uDE9A\\uDEA0\\uDEB0-\\uDFFF]|\\uD837[\\uDC00-\\uDEFF\\uDF1F-\\uDF24\\uDF2B-\\uDFFF]|\\uD838[\\uDC07\\uDC19\\uDC1A\\uDC22\\uDC25\\uDC2B-\\uDC2F\\uDC6E-\\uDC8E\\uDC90-\\uDCFF\\uDD2D-\\uDD2F\\uDD3E\\uDD3F\\uDD4A-\\uDD4D\\uDD50-\\uDE8F\\uDEAF-\\uDEBF\\uDEFA-\\uDEFE\\uDF00-\\uDFFF]|\\uD839[\\uDC00-\\uDCCF\\uDCFA-\\uDFDF\\uDFE7\\uDFEC\\uDFEF\\uDFFF]|\\uD83A[\\uDCC5\\uDCC6\\uDCD7-\\uDCFF\\uDD4C-\\uDD4F\\uDD5A-\\uDD5D\\uDD60-\\uDFFF]|\\uD83B[\\uDC00-\\uDC70\\uDCB5-\\uDD00\\uDD3E-\\uDDFF\\uDE04\\uDE20\\uDE23\\uDE25\\uDE26\\uDE28\\uDE33\\uDE38\\uDE3A\\uDE3C-\\uDE41\\uDE43-\\uDE46\\uDE48\\uDE4A\\uDE4C\\uDE50\\uDE53\\uDE55\\uDE56\\uDE58\\uDE5A\\uDE5C\\uDE5E\\uDE60\\uDE63\\uDE65\\uDE66\\uDE6B\\uDE73\\uDE78\\uDE7D\\uDE7F\\uDE8A\\uDE9C-\\uDEA0\\uDEA4\\uDEAA\\uDEBC-\\uDEEF\\uDEF2-\\uDFFF]|\\uD83C[\\uDC2C-\\uDC2F\\uDC94-\\uDC9F\\uDCAF\\uDCB0\\uDCC0\\uDCD0\\uDCF6-\\uDCFF\\uDDAE-\\uDDE5\\uDE03-\\uDE0F\\uDE3C-\\uDE3F\\uDE49-\\uDE4F\\uDE52-\\uDE5F\\uDE66-\\uDEFF]|\\uD83D[\\uDED8-\\uDEDB\\uDEED-\\uDEEF\\uDEFD-\\uDEFF\\uDF77-\\uDF7A\\uDFDA-\\uDFDF\\uDFEC-\\uDFEF\\uDFF1-\\uDFFF]|\\uD83E[\\uDC0C-\\uDC0F\\uDC48-\\uDC4F\\uDC5A-\\uDC5F\\uDC88-\\uDC8F\\uDCAE\\uDCAF\\uDCB2-\\uDCFF\\uDE54-\\uDE5F\\uDE6E\\uDE6F\\uDE7D-\\uDE7F\\uDE89-\\uDE8F\\uDEBE\\uDEC6-\\uDECD\\uDEDC-\\uDEDF\\uDEE9-\\uDEEF\\uDEF9-\\uDEFF\\uDF93\\uDFCB-\\uDFEF\\uDFFA-\\uDFFF]|\\uD869[\\uDEE0-\\uDEFF]|\\uD86D[\\uDF3A-\\uDF3F]|\\uD86E[\\uDC1E\\uDC1F]|\\uD873[\\uDEA2-\\uDEAF]|\\uD87A[\\uDFE1-\\uDFFF]|\\uD87E[\\uDE1E-\\uDFFF]|\\uD884[\\uDF4B-\\uDF4F]|\\uD888[\\uDFB0-\\uDFFF]|\\uDB40[\\uDC00\\uDC02-\\uDC1F\\uDC80-\\uDCFF\\uDDF0-\\uDFFF]|[\\uDBBF\\uDBFF][\\uDFFE\\uDFFF]/;\n","import { invalid } from \"./errors\";\nimport unicode15Unassigned from \"@unicode/unicode-15.0.0/General_Category/Unassigned/regex.mjs\";\n\n// api/v2 and ADR-0004 at ScratchPad 2f59c514c9d8aed39b510eae1abbab8062185ed5.\nexport const SUBJECT_PREFIX = \"sp.v1.api.v2.\";\nexport const METADATA_HEADER = \"ScratchPad-Metadata\";\nexport const REPLY_HEADER = \"ScratchPad-Reply\";\nexport const CHUNK_SIZE = 512 * 1024;\nexport const MAX_NODE_BYTES = 900 * 1024;\nexport const MAX_CHUNKS = 20480;\nexport const MAX_TREE_ENTRIES = 8192;\nexport const MAX_DEPTH = 128;\nexport const MAX_CONTROL_BYTES = 16 * 1024;\nexport const MAX_REPLY_BYTES = 128 * 1024;\nexport const MAX_HEADER_BYTES = 8 * 1024;\nexport const MAX_READ_BYTES = CHUNK_SIZE;\nexport const MAX_PREPARE_OBJECTS = 64;\nexport const MAX_VOLUME_OBJECTS = 65536;\nexport const MAX_VOLUME_BYTES = 8 * 2 ** 30;\nexport const WRITER_SLOTS = 8;\nexport const RETENTION_SLOTS = 8;\nexport const GRANT_SLOTS = 16;\nexport const MAX_GRANT_SECONDS = 3600;\nexport const ZERO_CONTENT_ID = \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\";\n\nexport const CODES = [\n \"ok\",\n \"invalid\",\n \"unauthenticated\",\n \"denied\",\n \"not_found\",\n \"exists\",\n \"conflict\",\n \"fenced\",\n \"intent_changed\",\n \"capacity\",\n \"summary_limit\",\n \"closed\",\n \"epoch_changed\",\n \"expired\",\n \"corrupt\",\n \"incomplete\",\n \"busy\",\n \"unknown\",\n \"unavailable\",\n \"internal\",\n] as const;\nexport type Code = (typeof CODES)[number];\nexport type ContentID = string;\nexport interface Principal {\n account: string;\n user: string;\n}\nexport interface Trace {\n thread_id?: string;\n root_id?: string;\n tool_call_id?: string;\n}\nexport interface Action {\n operation_id: string;\n trace: Trace;\n}\nexport interface Target {\n volume: string;\n creation_id: string;\n}\nexport interface Head {\n generation: number;\n root: ContentID;\n}\nexport interface Writer {\n slot: number;\n generation: number;\n}\nexport interface RetentionIntent {\n enabled: boolean;\n slot: number;\n generation: number;\n until: number;\n}\nexport interface RetentionHandle {\n slot: number;\n generation: number;\n}\nexport interface GrantHandle {\n slot: number;\n generation: number;\n}\nexport interface RetentionOrigin {\n writer: Writer;\n number: number;\n}\nexport interface Command {\n creation_id: string;\n writer: Writer;\n number: number;\n operation_id: string;\n base: Head;\n root: ContentID;\n trace: Trace;\n retention: RetentionIntent;\n}\nexport interface Receipt {\n volume: string;\n principal: Principal;\n command: Command;\n head: Head;\n retention: RetentionHandle;\n}\nexport interface WriterSlot {\n generation: number;\n number: number;\n principal?: Principal;\n write: boolean;\n receipt?: Receipt;\n}\nexport interface RetentionValue {\n root: ContentID;\n until: number;\n origin: RetentionOrigin;\n}\nexport interface RetentionSlot {\n generation: number;\n pin?: RetentionValue;\n}\nexport interface GrantValue {\n principal: Principal;\n root: ContentID;\n path: string;\n directory: boolean;\n retention: RetentionHandle;\n until: number;\n}\nexport interface GrantSlot {\n generation: number;\n grant?: GrantValue;\n}\nexport interface VolumeView {\n target: Target;\n owner: Principal;\n head: Head;\n revision: number;\n closed: boolean;\n epoch: number;\n objects: number;\n bytes: number;\n writers: WriterSlot[];\n retentions: RetentionSlot[];\n grants: GrantSlot[];\n}\nexport interface Limits {\n object_bytes: number;\n read_bytes: number;\n control_bytes: number;\n reply_bytes: number;\n writers: number;\n retentions: number;\n grants: number;\n grant_seconds: number;\n}\nexport const PUBLIC_LIMITS: Readonly<Limits> = Object.freeze({\n object_bytes: MAX_NODE_BYTES,\n read_bytes: MAX_READ_BYTES,\n control_bytes: MAX_CONTROL_BYTES,\n reply_bytes: MAX_REPLY_BYTES,\n writers: WRITER_SLOTS,\n retentions: RETENTION_SLOTS,\n grants: GRANT_SLOTS,\n grant_seconds: MAX_GRANT_SECONDS,\n});\nexport interface ReservedScope {\n volume: string;\n objects: number;\n bytes: number;\n}\nexport interface Info {\n principal: Principal;\n scopes: ReservedScope[];\n limits: Limits;\n}\nexport interface ContentObject {\n kind: \"chnk\" | \"fobj\" | \"tree\";\n id: ContentID;\n}\nexport interface ObjectSpec {\n object: ContentObject;\n length: number;\n}\nexport type AllocationState = \"reserved\" | \"verifying\" | \"verified\" | \"refused\";\nexport interface ObjectProgress extends ObjectSpec {\n state: AllocationState;\n next: number;\n code: Code;\n}\nexport interface PrepareRequest {\n target: Target;\n objects: ObjectSpec[];\n}\nexport interface PrepareResult {\n epoch: number;\n objects: ObjectProgress[];\n}\nexport interface VerifyRequest {\n target: Target;\n epoch: number;\n objects: ContentObject[];\n}\nexport interface VerifyResult {\n epoch: number;\n objects: ObjectProgress[];\n}\nexport interface PutRequest {\n target: Target;\n object: ContentObject;\n epoch: number;\n}\nexport interface CreateRequest {\n volume: string;\n action: Action;\n}\nexport interface PublishRequest {\n target: Target;\n command: Command;\n}\nexport interface ResetRequest {\n target: Target;\n writer: Writer;\n}\nexport interface RetainRequest {\n target: Target;\n slot: number;\n generation: number;\n root: ContentID;\n until: number;\n action: Action;\n}\nexport interface ReleaseRequest {\n target: Target;\n handle: RetentionHandle;\n}\nexport interface GrantIssueRequest {\n target: Target;\n slot: number;\n generation: number;\n principal: Principal;\n root: ContentID;\n path: string;\n retention: RetentionHandle;\n until: number;\n action: Action;\n}\nexport interface RevokeRequest {\n target: Target;\n handle: GrantHandle;\n action: Action;\n}\nexport interface PathRequest {\n target: Target;\n root: ContentID;\n path: string;\n trace: Trace;\n}\nexport interface ReadRequest extends PathRequest {\n offset: number;\n length: number;\n}\nexport interface ListRequest extends PathRequest {\n offset: number;\n limit: number;\n}\nexport interface Stat {\n type: \"file\" | \"directory\" | \"symlink\";\n object: ContentID;\n size: number;\n sha256: string;\n executable: boolean;\n link_target?: string;\n}\nexport interface Entry {\n name: string;\n type: \"file\" | \"directory\" | \"symlink\";\n object: ContentID;\n executable: boolean;\n link_target?: string;\n}\nexport interface ListResult {\n entries: Entry[];\n next: number;\n done: boolean;\n}\nexport interface RangeMetadata {\n stat: Stat;\n offset: number;\n length: number;\n}\nexport interface ReplyMetadata {\n code: Code;\n message: string;\n range?: RangeMetadata;\n}\nexport interface ReadResult {\n stat: Stat;\n offset: number;\n data: Uint8Array;\n}\nexport interface MaintenanceRequest {\n target: Target;\n revision: number;\n}\nexport interface CollectionReport {\n inventory_objects: number;\n inventory_bytes: number;\n live_objects: number;\n live_bytes: number;\n candidate_objects: number;\n candidate_bytes: number;\n delete_objects: number;\n}\nexport interface CollectionResult {\n volume: VolumeView;\n collection: CollectionReport;\n}\n\nexport type Validator<T> = (value: unknown) => asserts value is T;\ntype RecordValue = Record<string, unknown>;\nexport function check(condition: unknown, message: string): asserts condition {\n if (!condition) throw invalid(message);\n}\nexport function record(value: unknown, required: string[], optional: string[] = []): RecordValue {\n check(\n typeof value === \"object\" && value !== null && !Array.isArray(value),\n \"expected JSON object\",\n );\n const result = value as RecordValue;\n check(\n required.every((key) => Object.hasOwn(result, key)),\n \"required field is absent\",\n );\n check(\n Object.keys(result).every((key) => required.includes(key) || optional.includes(key)),\n \"unknown field\",\n );\n return result;\n}\nexport function uint(\n value: unknown,\n max = Number.MAX_SAFE_INTEGER,\n min = 0,\n): asserts value is number {\n check(\n typeof value === \"number\" && Number.isSafeInteger(value) && value >= min && value <= max,\n \"integer outside its bound\",\n );\n}\nfunction bool(value: unknown): asserts value is boolean {\n check(typeof value === \"boolean\", \"expected boolean\");\n}\nexport function text(value: unknown, max: number, min = 0): asserts value is string {\n check(\n typeof value === \"string\" && Buffer.from(value).toString(\"utf8\") === value,\n \"invalid Unicode text\",\n );\n check(\n Buffer.byteLength(value) <= max && Buffer.byteLength(value) >= min,\n \"text outside its byte bound\",\n );\n}\nexport function validateContentID(value: unknown): asserts value is ContentID {\n check(typeof value === \"string\" && /^[A-Za-z0-9_-]{43}$/.test(value), \"invalid content identity\");\n const bytes = Buffer.from(value, \"base64url\");\n check(\n bytes.length === 32 && bytes.toString(\"base64url\") === value,\n \"noncanonical content identity\",\n );\n}\nexport function validatePublicKey(\n value: unknown,\n kind: \"account\" | \"user\",\n): asserts value is string {\n check(typeof value === \"string\" && /^[A-Z2-7]{56}$/.test(value), \"invalid public NKEY\");\n const alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567\";\n let bits = 0,\n pending = 0;\n const data: number[] = [];\n for (const character of value) {\n pending = (pending << 5) | alphabet.indexOf(character);\n bits += 5;\n if (bits >= 8) {\n bits -= 8;\n data.push((pending >>> bits) & 255);\n }\n }\n check(data.length === 35 && data[0] === (kind === \"account\" ? 0 : 160), \"wrong NKEY kind\");\n let crc = 0;\n for (const byte of data.slice(0, 33)) {\n crc ^= byte << 8;\n for (let i = 0; i < 8; i++) crc = ((crc << 1) ^ (crc & 0x8000 ? 0x1021 : 0)) & 0xffff;\n }\n check(data[33] === (crc & 255) && data[34] === crc >>> 8, \"NKEY checksum differs\");\n}\nexport function validatePrincipal(value: unknown): asserts value is Principal {\n const v = record(value, [\"account\", \"user\"]);\n validatePublicKey(v.account, \"account\");\n validatePublicKey(v.user, \"user\");\n}\nexport function validateName(value: unknown): asserts value is string {\n text(value, 255, 1);\n check(value !== \".\" && value !== \"..\" && !/[\\x00-\\x1f\\x7f/]/.test(value), \"forbidden entry name\");\n check(normalizeUnicode15(value) === value, \"entry name is not NFC\");\n}\n/** Unicode normalization is stable for assigned characters. Characters that\n * were unassigned in 15.0 are inert boundaries, even on newer Node runtimes.\n */\nexport function normalizeUnicode15(value: string): string {\n let result = \"\",\n assigned = \"\";\n for (const point of value) {\n if (unicode15Unassigned.test(point)) {\n result += assigned.normalize(\"NFC\") + point;\n assigned = \"\";\n } else assigned += point;\n }\n return result + assigned.normalize(\"NFC\");\n}\nexport function validatePath(value: unknown, maxBytes = 4096): asserts value is string {\n text(value, maxBytes, 1);\n check(value.startsWith(\"/\"), \"path must be absolute\");\n if (value === \"/\") return;\n const names = value.slice(1).split(\"/\");\n check(names.length <= MAX_DEPTH, \"path exceeds its depth bound\");\n for (const name of names) validateName(name);\n}\nexport function validateVolume(value: unknown): asserts value is string {\n check(typeof value === \"string\" && /^[0-9A-Za-z]{1,64}$/.test(value), \"invalid volume name\");\n}\nexport function validateTarget(value: unknown): asserts value is Target {\n const v = record(value, [\"volume\", \"creation_id\"]);\n validateVolume(v.volume);\n check(\n typeof v.creation_id === \"string\" && /^[0-9a-f]{32}$/.test(v.creation_id),\n \"invalid volume creation identity\",\n );\n}\nexport function validateTrace(value: unknown): asserts value is Trace {\n const v = record(value, [], [\"thread_id\", \"root_id\", \"tool_call_id\"]);\n for (const field of [\"thread_id\", \"root_id\"] as const) {\n if (v[field] !== undefined) text(v[field], 32);\n }\n if (v.tool_call_id !== undefined) {\n text(v.tool_call_id, 1024);\n check([...v.tool_call_id].length <= 256, \"tool-call label is too long\");\n }\n if (!v.thread_id && !v.root_id && !v.tool_call_id) return;\n check(\n typeof v.thread_id === \"string\" && /^[0-9a-f]{32}$/.test(v.thread_id),\n \"invalid trace thread\",\n );\n check(typeof v.root_id === \"string\" && /^[0-9a-f]{32}$/.test(v.root_id), \"invalid trace root\");\n}\nexport function validateAction(value: unknown): asserts value is Action {\n const v = record(value, [\"operation_id\", \"trace\"]);\n text(v.operation_id, 256, 1);\n check([...v.operation_id].length <= 64, \"operation identity is too long\");\n validateTrace(v.trace);\n}\nexport function validateHead(value: unknown): asserts value is Head {\n const v = record(value, [\"generation\", \"root\"]);\n uint(v.generation, undefined, 1);\n validateContentID(v.root);\n}\nexport function validateWriter(value: unknown): asserts value is Writer {\n const v = record(value, [\"slot\", \"generation\"]);\n uint(v.slot, WRITER_SLOTS - 1);\n uint(v.generation, undefined, 1);\n}\nexport function validateRetentionHandle(value: unknown): asserts value is RetentionHandle {\n const v = record(value, [\"slot\", \"generation\"]);\n uint(v.slot, RETENTION_SLOTS - 1);\n uint(v.generation, undefined, 1);\n}\nexport function validateGrantHandle(value: unknown): asserts value is GrantHandle {\n const v = record(value, [\"slot\", \"generation\"]);\n uint(v.slot, GRANT_SLOTS - 1);\n uint(v.generation, undefined, 1);\n}\nexport function validateCommand(value: unknown): asserts value is Command {\n const v = record(value, [\n \"creation_id\",\n \"writer\",\n \"number\",\n \"operation_id\",\n \"base\",\n \"root\",\n \"trace\",\n \"retention\",\n ]);\n validateTarget({ volume: \"v\", creation_id: v.creation_id });\n validateWriter(v.writer);\n uint(v.number, undefined, 1);\n validateAction({ operation_id: v.operation_id, trace: v.trace });\n validateHead(v.base);\n validateContentID(v.root);\n const r = record(v.retention, [\"enabled\", \"slot\", \"generation\", \"until\"]);\n bool(r.enabled);\n uint(r.slot, RETENTION_SLOTS - 1);\n uint(r.generation);\n uint(r.until);\n check(\n r.enabled || (r.slot === 0 && r.generation === 0 && r.until === 0),\n \"disabled retention must be zero\",\n );\n}\nexport function validateReceipt(value: unknown): asserts value is Receipt {\n const v = record(value, [\"volume\", \"principal\", \"command\", \"head\", \"retention\"]);\n validateVolume(v.volume);\n validatePrincipal(v.principal);\n validateCommand(v.command);\n validateHead(v.head);\n check(\n v.head.root === v.command.root && v.head.generation - v.command.base.generation === 1,\n \"receipt head differs from command\",\n );\n if (v.command.retention.enabled) {\n validateRetentionHandle(v.retention);\n check(\n v.retention.slot === v.command.retention.slot &&\n v.retention.generation > v.command.retention.generation,\n \"receipt retention differs from command\",\n );\n } else {\n const retention = record(v.retention, [\"slot\", \"generation\"]);\n check(retention.slot === 0 && retention.generation === 0, \"unexpected receipt retention\");\n }\n}\nexport function sameValue(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (!a || !b || typeof a !== \"object\" || typeof b !== \"object\") return false;\n const left = a as RecordValue,\n right = b as RecordValue;\n return (\n Object.keys(left).length === Object.keys(right).length &&\n Object.keys(left).every((key) => Object.hasOwn(right, key) && sameValue(left[key], right[key]))\n );\n}\n\nexport function validateVolumeView(value: unknown): asserts value is VolumeView {\n const v = record(value, [\n \"target\",\n \"owner\",\n \"head\",\n \"revision\",\n \"closed\",\n \"epoch\",\n \"objects\",\n \"bytes\",\n \"writers\",\n \"retentions\",\n \"grants\",\n ]);\n validateTarget(v.target);\n validatePrincipal(v.owner);\n validateHead(v.head);\n uint(v.revision, undefined, 1);\n bool(v.closed);\n uint(v.epoch, v.revision);\n uint(v.objects, MAX_VOLUME_OBJECTS);\n uint(v.bytes, MAX_VOLUME_BYTES);\n check(\n v.head.generation <= v.revision && (!v.closed || v.epoch === v.revision),\n \"inconsistent volume revision\",\n );\n check(Array.isArray(v.writers) && v.writers.length === WRITER_SLOTS, \"wrong writer slot count\");\n for (const [index, raw] of v.writers.entries()) {\n const slot = record(raw, [\"generation\", \"number\", \"write\"], [\"principal\", \"receipt\"]);\n uint(slot.generation, v.revision, 1);\n uint(slot.number);\n bool(slot.write);\n if (slot.principal !== undefined) {\n validatePrincipal(slot.principal);\n check(slot.principal.account === v.owner.account, \"writer belongs to another account\");\n } else check(!slot.write && slot.number === 0, \"writer identity absent\");\n if (slot.number === 0) check(slot.receipt === undefined, \"unused writer has a receipt\");\n else {\n validateReceipt(slot.receipt);\n check(\n slot.write &&\n sameValue(slot.receipt.principal, slot.principal) &&\n slot.receipt.volume === v.target.volume &&\n slot.receipt.command.creation_id === v.target.creation_id &&\n slot.receipt.command.writer.slot === index &&\n slot.receipt.command.writer.generation === slot.generation &&\n slot.receipt.command.number === slot.number &&\n slot.receipt.head.generation <= v.head.generation,\n \"writer receipt differs from slot\",\n );\n }\n }\n check(\n Array.isArray(v.retentions) && v.retentions.length === RETENTION_SLOTS,\n \"wrong retention slot count\",\n );\n for (const raw of v.retentions) {\n const slot = record(raw, [\"generation\"], [\"pin\"]);\n uint(slot.generation, v.revision);\n if (slot.pin !== undefined) {\n check(slot.generation > 0, \"retention pin has zero generation\");\n const pin = record(slot.pin, [\"root\", \"until\", \"origin\"]);\n validateContentID(pin.root);\n uint(pin.until);\n const origin = record(pin.origin, [\"writer\", \"number\"]);\n uint(origin.number);\n if (origin.number === 0) {\n const writer = record(origin.writer, [\"slot\", \"generation\"]);\n check(writer.slot === 0 && writer.generation === 0, \"empty retention origin is not zero\");\n } else {\n validateWriter(origin.writer);\n check(origin.writer.generation < slot.generation, \"retention origin generation is invalid\");\n }\n }\n }\n check(Array.isArray(v.grants) && v.grants.length === GRANT_SLOTS, \"wrong grant slot count\");\n for (const raw of v.grants) {\n const slot = record(raw, [\"generation\"], [\"grant\"]);\n uint(slot.generation, v.revision);\n if (slot.grant !== undefined) {\n check(slot.generation > 0, \"grant has zero generation\");\n const grant = record(slot.grant, [\n \"principal\",\n \"root\",\n \"path\",\n \"directory\",\n \"retention\",\n \"until\",\n ]);\n validatePrincipal(grant.principal);\n validateContentID(grant.root);\n validatePath(grant.path, 256);\n bool(grant.directory);\n validateRetentionHandle(grant.retention);\n uint(grant.until, undefined, 1);\n check(\n grant.principal.account === v.owner.account && grant.retention.generation < slot.generation,\n \"invalid grant principal or retention generation\",\n );\n }\n }\n}\nexport function validateInfo(value: unknown): asserts value is Info {\n const v = record(value, [\"principal\", \"scopes\", \"limits\"]);\n validatePrincipal(v.principal);\n check(sameValue(v.limits, PUBLIC_LIMITS), \"service limits differ from this client contract\");\n check(Array.isArray(v.scopes) && v.scopes.length <= 16, \"scope count exceeds bound\");\n const seen = new Set<string>();\n for (const raw of v.scopes) {\n const scope = record(raw, [\"volume\", \"objects\", \"bytes\"]);\n validateVolume(scope.volume);\n uint(scope.objects, MAX_VOLUME_OBJECTS, 1);\n uint(scope.bytes, MAX_VOLUME_BYTES, 4);\n check(!seen.has(scope.volume), \"duplicate scope\");\n seen.add(scope.volume);\n }\n}\nexport function validateContentObject(value: unknown): asserts value is ContentObject {\n const v = record(value, [\"kind\", \"id\"]);\n validateContentID(v.id);\n check(v.kind === \"chnk\" || v.kind === \"fobj\" || v.kind === \"tree\", \"unsupported object kind\");\n}\nexport function validateObjectSpec(value: unknown): asserts value is ObjectSpec {\n const v = record(value, [\"object\", \"length\"]);\n validateContentObject(v.object);\n uint(v.length, v.object.kind === \"chnk\" ? CHUNK_SIZE : MAX_NODE_BYTES, 1);\n}\nfunction validateProgress(value: unknown, preparation: boolean): asserts value is ObjectProgress {\n const v = record(value, [\"object\", \"length\", \"state\", \"next\", \"code\"]);\n validateObjectSpec({ object: v.object, length: v.length });\n validateContentObject(v.object);\n uint(v.next);\n if (v.state === \"refused\") {\n check(preparation && v.next === 0 && v.code === \"capacity\", \"invalid refusal state\");\n return;\n }\n check(v.code === \"ok\", \"invalid progress code\");\n if (v.state === \"reserved\" || v.state === \"verified\")\n check(v.next === 0, \"unexpected progress cursor\");\n else {\n check(v.state === \"verifying\" && v.object.kind !== \"chnk\", \"invalid progress state\");\n uint(v.next, (v.object.kind === \"tree\" ? MAX_TREE_ENTRIES : MAX_CHUNKS) - 1, 1);\n }\n}\nfunction validateProgressResult(\n value: unknown,\n preparation: boolean,\n): asserts value is PrepareResult {\n const v = record(value, [\"epoch\", \"objects\"]);\n uint(v.epoch);\n check(\n Array.isArray(v.objects) && v.objects.length > 0 && v.objects.length <= MAX_PREPARE_OBJECTS,\n \"invalid progress count\",\n );\n const seen = new Set<string>();\n for (const raw of v.objects) {\n validateProgress(raw, preparation);\n const key = raw.object.kind + \":\" + raw.object.id;\n check(!seen.has(key), \"duplicate object progress\");\n seen.add(key);\n }\n}\nexport function validatePrepareResult(value: unknown): asserts value is PrepareResult {\n validateProgressResult(value, true);\n}\nexport function validateVerifyResult(value: unknown): asserts value is VerifyResult {\n validateProgressResult(value, false);\n}\nfunction validateEntryBody(v: RecordValue): void {\n validateContentID(v.object);\n bool(v.executable);\n if (v.type === \"symlink\") {\n text(v.link_target, 4096, 1);\n check(\n !v.link_target.includes(\"\\0\") && !v.executable && v.object === ZERO_CONTENT_ID,\n \"invalid symlink metadata\",\n );\n } else {\n check(v.type === \"file\" || v.type === \"directory\", \"invalid entry type\");\n check(v.link_target === undefined || v.link_target === \"\", \"unexpected symlink target\");\n check(v.type === \"file\" || !v.executable, \"directory is executable\");\n }\n}\nexport function validateStat(value: unknown): asserts value is Stat {\n const v = record(value, [\"type\", \"object\", \"size\", \"sha256\", \"executable\"], [\"link_target\"]);\n validateEntryBody(v);\n uint(v.size, MAX_VOLUME_BYTES);\n if (v.type === \"file\")\n check(typeof v.sha256 === \"string\" && /^[0-9a-f]{64}$/.test(v.sha256), \"invalid file digest\");\n else check(v.size === 0 && v.sha256 === \"\", \"non-file metadata contains file bytes\");\n}\nexport function validateListResult(value: unknown): asserts value is ListResult {\n const v = record(value, [\"entries\", \"next\", \"done\"]);\n uint(v.next, MAX_TREE_ENTRIES);\n bool(v.done);\n check(\n Array.isArray(v.entries) &&\n v.entries.length <= 64 &&\n v.entries.length <= v.next &&\n (v.done || v.entries.length > 0),\n \"invalid list window\",\n );\n let last = Buffer.alloc(0),\n bytes = 0;\n for (const raw of v.entries) {\n const entry = record(raw, [\"name\", \"type\", \"object\", \"executable\"], [\"link_target\"]);\n validateName(entry.name);\n validateEntryBody(entry);\n const name = Buffer.from(entry.name);\n check(Buffer.compare(last, name) < 0, \"list names are not strictly ordered\");\n last = name;\n bytes += Buffer.byteLength(goJSON(entry)) + 1;\n }\n check(bytes <= 64 * 1024, \"list bytes exceed bound\");\n}\nexport function validateReplyMetadata(value: unknown): asserts value is ReplyMetadata {\n const v = record(value, [\"code\", \"message\"], [\"range\"]);\n check(\n typeof v.code === \"string\" && (CODES as readonly string[]).includes(v.code),\n \"unknown reply code\",\n );\n text(v.message, 256);\n if (v.code !== \"ok\") {\n check(v.message !== \"\" && v.range === undefined, \"invalid error reply\");\n return;\n }\n check(v.message === \"\", \"success reply has an error message\");\n if (v.range !== undefined) {\n const range = record(v.range, [\"stat\", \"offset\", \"length\"]);\n validateStat(range.stat);\n check(range.stat.type === \"file\", \"range is not a file\");\n uint(range.offset, range.stat.size);\n uint(range.length, MAX_READ_BYTES);\n check(range.length <= range.stat.size - range.offset, \"range exceeds file\");\n }\n}\nexport function validateCollectionReport(value: unknown): asserts value is CollectionReport {\n const v = record(value, [\n \"inventory_objects\",\n \"inventory_bytes\",\n \"live_objects\",\n \"live_bytes\",\n \"candidate_objects\",\n \"candidate_bytes\",\n \"delete_objects\",\n ]);\n uint(v.inventory_objects, MAX_VOLUME_OBJECTS);\n uint(v.inventory_bytes, MAX_VOLUME_BYTES);\n uint(v.live_objects, v.inventory_objects);\n uint(v.live_bytes, v.inventory_bytes);\n uint(v.candidate_objects);\n uint(v.candidate_bytes);\n uint(v.delete_objects);\n check(\n v.candidate_objects === v.inventory_objects - v.live_objects &&\n v.candidate_bytes === v.inventory_bytes - v.live_bytes &&\n v.delete_objects <= v.candidate_objects,\n \"collection counters differ\",\n );\n}\nexport function validateCollectionResult(value: unknown): asserts value is CollectionResult {\n const v = record(value, [\"volume\", \"collection\"]);\n validateVolumeView(v.volume);\n validateCollectionReport(v.collection);\n check(\n !v.volume.closed &&\n v.volume.objects === v.collection.live_objects &&\n v.volume.bytes === v.collection.live_bytes,\n \"collection does not match reopened volume\",\n );\n}\nexport function validateEmpty(value: unknown): asserts value is Record<string, never> {\n record(value, []);\n}\n\n/** JSON's Unicode escaping matches encoding/json; HTML escaping is selectable for references. */\nexport function goJSON(value: unknown, escapeHTML = true): string {\n let encoded = JSON.stringify(value);\n check(encoded !== undefined, \"value cannot be encoded as JSON\");\n encoded = encoded.replace(/\\u2028/g, \"\\\\u2028\").replace(/\\u2029/g, \"\\\\u2029\");\n return escapeHTML\n ? encoded.replace(/</g, \"\\\\u003c\").replace(/>/g, \"\\\\u003e\").replace(/&/g, \"\\\\u0026\")\n : encoded;\n}\n\n/** Reject duplicate keys, non-integral wire numbers, unsafe counters, and invalid UTF-8. */\nexport function parseStrictJSON(data: Uint8Array | string, limit: number): unknown {\n const bytes = typeof data === \"string\" ? Buffer.from(data) : Buffer.from(data);\n check(bytes.length <= limit, \"JSON exceeds its byte bound\");\n const source = new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\n let cursor = 0;\n const whitespace = (): void => {\n while (/[\\t\\n\\r ]/.test(source[cursor] ?? \"!\")) cursor++;\n };\n const string = (): string => {\n const start = cursor++;\n for (;;) {\n check(cursor < source.length, \"unterminated JSON string\");\n const char = source[cursor++];\n if (char === \"\\\\\") {\n cursor++;\n continue;\n }\n if (char === '\"') break;\n }\n const value: unknown = JSON.parse(source.slice(start, cursor));\n text(value, limit);\n return value;\n };\n const value = (depth: number): unknown => {\n check(depth <= 64, \"JSON nesting exceeds bound\");\n whitespace();\n const first = source[cursor];\n if (first === '\"') return string();\n if (first === \"{\") {\n cursor++;\n whitespace();\n const result: RecordValue = Object.create(null) as RecordValue;\n if (source[cursor] === \"}\") {\n cursor++;\n return result;\n }\n for (;;) {\n check(source[cursor] === '\"', \"JSON key must be a string\");\n const key = string();\n whitespace();\n check(!Object.hasOwn(result, key), \"duplicate JSON key\");\n check(source[cursor++] === \":\", \"missing JSON colon\");\n result[key] = value(depth + 1);\n whitespace();\n const delimiter = source[cursor++];\n if (delimiter === \"}\") return result;\n check(delimiter === \",\", \"invalid JSON object separator\");\n whitespace();\n }\n }\n if (first === \"[\") {\n cursor++;\n whitespace();\n const result: unknown[] = [];\n if (source[cursor] === \"]\") {\n cursor++;\n return result;\n }\n for (;;) {\n result.push(value(depth + 1));\n whitespace();\n const delimiter = source[cursor++];\n if (delimiter === \"]\") return result;\n check(delimiter === \",\", \"invalid JSON array separator\");\n whitespace();\n }\n }\n for (const [token, decoded] of [\n [\"true\", true],\n [\"false\", false],\n [\"null\", null],\n ] as const) {\n if (source.startsWith(token, cursor)) {\n cursor += token.length;\n return decoded;\n }\n }\n const match = /^-?(?:0|[1-9][0-9]*)/.exec(source.slice(cursor));\n check(match, \"invalid JSON value\");\n cursor += match[0].length;\n const number = Number(match[0]);\n check(\n Number.isSafeInteger(number) && !Object.is(number, -0),\n \"unsafe or noncanonical JSON integer\",\n );\n return number;\n };\n const result = value(0);\n whitespace();\n check(cursor === source.length, \"trailing JSON data\");\n return result;\n}\n","import { createHash } from \"node:crypto\";\nimport {\n CHUNK_SIZE,\n MAX_CHUNKS,\n MAX_DEPTH,\n MAX_NODE_BYTES,\n MAX_TREE_ENTRIES,\n ZERO_CONTENT_ID,\n check,\n goJSON,\n parseStrictJSON,\n record,\n text,\n uint,\n validateContentID,\n validateName,\n validatePath,\n validatePublicKey,\n validateRetentionHandle,\n validateTarget,\n} from \"./protocol\";\nimport type { ContentObject, RetentionHandle, Target } from \"./protocol\";\nexport {\n CHUNK_SIZE,\n MAX_CHUNKS,\n MAX_DEPTH,\n MAX_NODE_BYTES,\n MAX_TREE_ENTRIES,\n ZERO_CONTENT_ID,\n} from \"./protocol\";\n\nexport interface ChunkRef {\n id: string;\n length: number;\n}\nexport interface FileObject {\n size: number;\n digest: string;\n chunks: ChunkRef[];\n}\nexport interface TreeEntry {\n name: string;\n type: \"file\" | \"directory\" | \"symlink\";\n object?: string;\n executable?: boolean;\n linkTarget?: string;\n}\nexport interface Reference {\n version: 2;\n creator: string;\n account: string;\n target: Target;\n root: string;\n generation: number;\n path: string;\n retention: RetentionHandle;\n expires_at: number;\n}\nexport class CodecError extends Error {\n constructor(\n readonly reason: string,\n message: string,\n ) {\n super(message);\n this.name = \"CodecError\";\n }\n}\nfunction reject(reason: string, message: string): never {\n throw new CodecError(reason, message);\n}\nfunction hash(tag: string, data: Uint8Array): string {\n return createHash(\"sha256\").update(tag).update(\"\\0\").update(data).digest(\"base64url\");\n}\nexport function chunkID(data: Uint8Array): string {\n return hash(\"scratchpad:v1:chunk\", data);\n}\nexport function fileObjectID(data: Uint8Array): string {\n return hash(\"scratchpad:v1:file\", data);\n}\nexport function treeNodeID(data: Uint8Array): string {\n return hash(\"scratchpad:v1:tree\", data);\n}\n\n/** Memory is one 512 KiB chunk plus at most MAX_CHUNKS metadata entries.\n * The callback must consume or copy its bytes before it returns.\n */\nexport async function chunkStream(\n source: AsyncIterable<Uint8Array> | Iterable<Uint8Array>,\n emit: (index: number, object: ContentObject, data: Uint8Array) => Promise<void> | void,\n): Promise<FileObject> {\n const file: FileObject = { size: 0, digest: \"\", chunks: [] };\n const digest = createHash(\"sha256\"),\n buffer = Buffer.alloc(CHUNK_SIZE);\n let used = 0;\n const flush = async (): Promise<void> => {\n if (file.chunks.length >= MAX_CHUNKS) reject(\"chunk-shape\", \"file exceeds chunk count bound\");\n const bytes = buffer.subarray(0, used),\n id = chunkID(bytes);\n digest.update(bytes);\n file.size += used;\n file.chunks.push({ id, length: used });\n await emit(file.chunks.length - 1, { kind: \"chnk\", id }, bytes);\n used = 0;\n };\n for await (const part of source) {\n check(part instanceof Uint8Array, \"stream must yield bytes\");\n let offset = 0;\n while (offset < part.length) {\n const length = Math.min(CHUNK_SIZE - used, part.length - offset);\n buffer.set(part.subarray(offset, offset + length), used);\n used += length;\n offset += length;\n if (used === CHUNK_SIZE) await flush();\n }\n }\n if (used !== 0) await flush();\n file.digest = digest.digest(\"hex\");\n return file;\n}\n\n// This restricted CBOR subset contains only unsigned integers, bytes, text,\n// arrays, and string-keyed maps. No generic serializer can add tagged values.\nfunction head(major: number, value: number): Buffer {\n uint(value);\n if (value < 24) return Buffer.from([(major << 5) | value]);\n if (value <= 255) return Buffer.from([(major << 5) | 24, value]);\n if (value <= 65535) {\n const bytes = Buffer.alloc(3);\n bytes[0] = (major << 5) | 25;\n bytes.writeUInt16BE(value, 1);\n return bytes;\n }\n if (value <= 0xffffffff) {\n const bytes = Buffer.alloc(5);\n bytes[0] = (major << 5) | 26;\n bytes.writeUInt32BE(value, 1);\n return bytes;\n }\n const bytes = Buffer.alloc(9);\n bytes[0] = (major << 5) | 27;\n bytes.writeBigUInt64BE(BigInt(value), 1);\n return bytes;\n}\nfunction byteString(bytes: Uint8Array): Buffer {\n return Buffer.concat([head(2, bytes.length), bytes]);\n}\nfunction textString(value: string): Buffer {\n const bytes = Buffer.from(value);\n return Buffer.concat([head(3, bytes.length), bytes]);\n}\nfunction validateFile(file: FileObject): void {\n uint(file.size);\n check(\n typeof file.digest === \"string\" && /^[0-9a-f]{64}$/.test(file.digest),\n \"invalid logical file digest\",\n );\n if (!Array.isArray(file.chunks) || file.chunks.length > MAX_CHUNKS)\n reject(\"chunk-shape\", \"chunk count exceeds bound\");\n let total = 0;\n for (const [index, chunk] of file.chunks.entries()) {\n validateContentID(chunk.id);\n uint(chunk.length);\n if (\n chunk.length === 0 ||\n chunk.length > CHUNK_SIZE ||\n (index !== file.chunks.length - 1 && chunk.length !== CHUNK_SIZE)\n )\n reject(\"chunk-shape\", \"invalid fixed chunk length\");\n total += chunk.length;\n }\n if (total !== file.size) reject(\"chunk-shape\", \"chunk lengths differ from file size\");\n}\nexport function encodeFileObject(file: FileObject): Uint8Array {\n validateFile(file);\n const parts = [head(5, 3), textString(\"c\"), head(4, file.chunks.length)];\n for (const chunk of file.chunks)\n parts.push(head(4, 2), byteString(Buffer.from(chunk.id, \"base64url\")), head(0, chunk.length));\n parts.push(\n textString(\"d\"),\n byteString(Buffer.from(file.digest, \"hex\")),\n textString(\"s\"),\n head(0, file.size),\n );\n return Buffer.concat(parts);\n}\nfunction entryName(name: string): void {\n if (typeof name !== \"string\" || Buffer.from(name).toString(\"utf8\") !== name)\n reject(\"utf8\", \"invalid entry name UTF-8\");\n if (Buffer.byteLength(name) === 0 || Buffer.byteLength(name) > 255)\n reject(\"name-length\", \"entry name length exceeds bound\");\n if (name === \".\" || name === \"..\" || /[\\x00-\\x1f\\x7f/]/.test(name))\n reject(\"name-forbidden\", \"forbidden entry name\");\n try {\n validateName(name);\n } catch {\n reject(\"not-nfc\", \"entry name is not NFC\");\n }\n}\nfunction validateEntry(entry: TreeEntry): void {\n entryName(entry.name);\n if (entry.type === \"symlink\") {\n if (entry.executable || (entry.object !== undefined && entry.object !== ZERO_CONTENT_ID))\n reject(\"type-invalid\", \"symlink has file fields\");\n const target = entry.linkTarget ?? \"\";\n if (typeof target !== \"string\" || Buffer.from(target).toString(\"utf8\") !== target)\n reject(\"utf8\", \"invalid symlink UTF-8\");\n if (\n Buffer.byteLength(target) === 0 ||\n Buffer.byteLength(target) > 4096 ||\n target.includes(\"\\0\")\n )\n reject(\"target-invalid\", \"invalid symlink target\");\n } else {\n if (entry.type !== \"file\" && entry.type !== \"directory\")\n reject(\"type-invalid\", \"unknown entry type\");\n validateContentID(entry.object);\n if (entry.linkTarget || (entry.type === \"directory\" && entry.executable))\n reject(\"type-invalid\", \"entry has fields of another type\");\n }\n}\nexport function encodeTreeNode(entries: readonly TreeEntry[]): Uint8Array {\n for (const entry of entries) validateEntry(entry);\n const sorted = [...entries].sort((a, b) =>\n Buffer.compare(Buffer.from(a.name), Buffer.from(b.name)),\n );\n for (let index = 1; index < sorted.length; index++)\n if (sorted[index]!.name === sorted[index - 1]!.name)\n reject(\"duplicate-name\", \"duplicate tree entry\");\n if (entries.length > MAX_TREE_ENTRIES) reject(\"entry-count\", \"tree entry count exceeds bound\");\n const parts = [head(5, 1), textString(\"e\"), head(4, entries.length)];\n let length = parts.reduce((sum, part) => sum + part.length, 0);\n for (const entry of sorted) {\n const fields = [head(5, entry.executable ? 4 : 3)];\n if (entry.type === \"symlink\") fields.push(textString(\"l\"), textString(entry.linkTarget!));\n else fields.push(textString(\"i\"), byteString(Buffer.from(entry.object!, \"base64url\")));\n fields.push(\n textString(\"n\"),\n textString(entry.name),\n textString(\"t\"),\n head(0, entry.type === \"file\" ? 0 : entry.type === \"directory\" ? 1 : 2),\n );\n if (entry.executable) fields.push(textString(\"x\"), head(0, 1));\n length += fields.reduce((sum, part) => sum + part.length, 0);\n if (length > MAX_NODE_BYTES) reject(\"node-size\", \"tree node byte count exceeds bound\");\n parts.push(...fields);\n }\n return Buffer.concat(parts);\n}\nexport const EMPTY_ROOT = treeNodeID(encodeTreeNode([]));\nexport interface Directory {\n entries: (TreeEntry & { child?: Directory })[];\n}\n/** Assemble an explicitly bounded logical directory; streaming file bytes stay separate. */\nexport function encodeDirectory(directory: Directory): {\n root: string;\n nodes: Map<string, Uint8Array>;\n} {\n const nodes = new Map<string, Uint8Array>();\n const walk = (dir: Directory, depth: number): string => {\n if (depth > MAX_DEPTH) reject(\"depth\", \"directory exceeds depth bound\");\n const entries = dir.entries.map((entry): TreeEntry => {\n if (entry.type !== \"directory\") return entry;\n if (!entry.child) reject(\"type-invalid\", \"directory entry has no child\");\n return { ...entry, object: walk(entry.child, depth + 1) };\n });\n const data = encodeTreeNode(entries),\n id = treeNodeID(data);\n nodes.set(id, data);\n return id;\n };\n return { root: walk(directory, 1), nodes };\n}\n\ntype CBOR = number | string | Uint8Array | CBOR[] | Map<string, CBOR>;\nfunction decodeCBOR(data: Uint8Array): CBOR {\n let cursor = 0;\n const take = (length: number): Buffer => {\n if (!Number.isSafeInteger(length) || length > data.length - cursor)\n reject(\"type-mismatch\", \"truncated CBOR\");\n const bytes = Buffer.from(data.buffer, data.byteOffset + cursor, length);\n cursor += length;\n return bytes;\n };\n const item = (depth: number): CBOR => {\n if (depth > 8) reject(\"type-mismatch\", \"CBOR nesting exceeds object shape\");\n const first = take(1)[0]!,\n major = first >>> 5,\n additional = first & 31;\n if (additional === 31) reject(\"indefinite-length\", \"indefinite CBOR length\");\n if (![0, 2, 3, 4, 5].includes(major)) reject(\"forbidden-item\", \"forbidden CBOR item\");\n let value = additional;\n if (additional >= 24) {\n if (additional > 27) reject(\"forbidden-item\", \"reserved CBOR length\");\n const bytes = take(2 ** (additional - 24));\n const large =\n additional === 27 ? bytes.readBigUInt64BE() : BigInt(bytes.readUIntBE(0, bytes.length));\n const minimum = [24n, 256n, 65536n, 4294967296n][additional - 24]!;\n if (large < minimum) reject(\"non-shortest\", \"CBOR integer is not shortest\");\n if (large > BigInt(Number.MAX_SAFE_INTEGER))\n reject(\"type-mismatch\", \"CBOR integer exceeds exact range\");\n value = Number(large);\n }\n if (major === 0) return value;\n if (major === 2) return take(value);\n if (major === 3) {\n try {\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(take(value));\n } catch {\n return reject(\"utf8\", \"CBOR text is not UTF-8\");\n }\n }\n // Each item needs at least one input byte; bound allocation before looping.\n if (value > data.length - cursor) reject(\"type-mismatch\", \"CBOR item count exceeds input\");\n if (major === 4) {\n const values: CBOR[] = [];\n for (let index = 0; index < value; index++) values.push(item(depth + 1));\n return values;\n }\n const result = new Map<string, CBOR>();\n let last: Buffer | undefined;\n for (let index = 0; index < value; index++) {\n const start = cursor;\n let key: CBOR;\n try {\n key = item(depth + 1);\n } catch (error) {\n if (error instanceof CodecError && error.reason === \"utf8\")\n reject(\"key-unknown\", \"invalid UTF-8 map key cannot be a schema key\");\n throw error;\n }\n const encoded = Buffer.from(data.subarray(start, cursor));\n if (typeof key !== \"string\") reject(\"type-mismatch\", \"CBOR map key must be text\");\n if (last && Buffer.compare(last, encoded) >= 0)\n reject(\"key-order\", \"CBOR keys are not strictly ordered\");\n last = encoded;\n result.set(key, item(depth + 1));\n }\n return result;\n };\n const result = item(0);\n if (cursor !== data.length) reject(\"trailing-bytes\", \"trailing CBOR bytes\");\n return result;\n}\nfunction map(value: CBOR, keys: string[]): Map<string, CBOR> {\n if (!(value instanceof Map)) reject(\"type-mismatch\", \"expected CBOR map\");\n for (const key of value.keys())\n if (!keys.includes(key)) reject(\"key-unknown\", \"unknown object key\");\n for (const key of keys) if (!value.has(key)) reject(\"key-missing\", \"missing object key\");\n return value;\n}\nfunction bytes32(value: CBOR | undefined): Buffer {\n if (!(value instanceof Uint8Array) || value.length !== 32)\n reject(\"type-mismatch\", \"expected 32-byte digest\");\n return Buffer.from(value);\n}\nfunction integer(value: CBOR | undefined): number {\n if (typeof value !== \"number\") reject(\"type-mismatch\", \"expected unsigned integer\");\n return value;\n}\nexport function decodeFileObject(data: Uint8Array): FileObject {\n const fields = map(decodeCBOR(data), [\"c\", \"d\", \"s\"]),\n refs = fields.get(\"c\");\n if (!Array.isArray(refs)) reject(\"type-mismatch\", \"chunks must be array\");\n const file: FileObject = {\n size: integer(fields.get(\"s\")),\n digest: bytes32(fields.get(\"d\")).toString(\"hex\"),\n chunks: [],\n };\n for (const ref of refs) {\n if (!Array.isArray(ref) || ref.length !== 2)\n reject(\"type-mismatch\", \"chunk reference must have two fields\");\n file.chunks.push({ id: bytes32(ref[0]).toString(\"base64url\"), length: integer(ref[1]) });\n }\n validateFile(file);\n return file;\n}\nexport function decodeTreeNode(data: Uint8Array): TreeEntry[] {\n if (data.length > MAX_NODE_BYTES) reject(\"node-size\", \"tree node exceeds byte bound\");\n const fields = map(decodeCBOR(data), [\"e\"]),\n raw = fields.get(\"e\");\n if (!Array.isArray(raw)) reject(\"type-mismatch\", \"entries must be an array\");\n if (raw.length > MAX_TREE_ENTRIES) reject(\"entry-count\", \"tree entry count exceeds bound\");\n const entries: TreeEntry[] = [];\n let previous: string | undefined;\n for (const item of raw) {\n if (!(item instanceof Map)) reject(\"type-mismatch\", \"entry must be a map\");\n for (const key of item.keys())\n if (![\"i\", \"l\", \"n\", \"t\", \"x\"].includes(key)) reject(\"key-unknown\", \"unknown entry key\");\n if (!item.has(\"n\") || !item.has(\"t\")) reject(\"key-missing\", \"missing entry name or type\");\n const name = item.get(\"n\"),\n type = integer(item.get(\"t\"));\n if (typeof name !== \"string\") reject(\"type-mismatch\", \"entry name must be text\");\n if (type > 2) reject(\"type-invalid\", \"unknown entry type\");\n if (!item.has(type === 2 ? \"l\" : \"i\")) reject(\"key-missing\", \"missing entry target\");\n if (item.has(type === 2 ? \"i\" : \"l\")) reject(\"type-invalid\", \"entry has other target type\");\n if (item.has(\"x\") && integer(item.get(\"x\")) !== 1)\n reject(\"type-invalid\", \"executable flag must be one\");\n const entry: TreeEntry = {\n name,\n type: type === 0 ? \"file\" : type === 1 ? \"directory\" : \"symlink\",\n };\n if (item.has(\"x\")) entry.executable = true;\n if (type === 2) {\n const target = item.get(\"l\");\n if (typeof target !== \"string\") reject(\"type-mismatch\", \"symlink target must be text\");\n entry.linkTarget = target;\n } else entry.object = bytes32(item.get(\"i\")).toString(\"base64url\");\n validateEntry(entry);\n if (previous !== undefined) {\n const order = Buffer.compare(Buffer.from(previous), Buffer.from(name));\n if (order === 0) reject(\"duplicate-name\", \"duplicate tree entry\");\n if (order > 0) reject(\"entry-order\", \"entries are not sorted\");\n }\n previous = name;\n entries.push(entry);\n }\n return entries;\n}\nexport function verifyObject(object: ContentObject, data: Uint8Array): void {\n validateContentID(object.id);\n if (object.kind === \"chnk\") {\n if (data.length === 0 || data.length > CHUNK_SIZE)\n reject(\"chunk-shape\", \"chunk length outside bound\");\n if (chunkID(data) !== object.id) reject(\"id-mismatch\", \"chunk identity differs\");\n } else if (object.kind === \"fobj\") {\n const file = decodeFileObject(data);\n if (!Buffer.from(encodeFileObject(file)).equals(data))\n reject(\"type-invalid\", \"file bytes are not canonical\");\n if (fileObjectID(data) !== object.id) reject(\"id-mismatch\", \"file identity differs\");\n } else if (object.kind === \"tree\") {\n const entries = decodeTreeNode(data);\n if (!Buffer.from(encodeTreeNode(entries)).equals(data))\n reject(\"type-invalid\", \"tree bytes are not canonical\");\n if (treeNodeID(data) !== object.id) reject(\"id-mismatch\", \"tree identity differs\");\n } else reject(\"type-invalid\", \"unsupported object kind\");\n}\nexport function validateReference(value: unknown): asserts value is Reference {\n const v = record(value, [\n \"version\",\n \"creator\",\n \"account\",\n \"target\",\n \"root\",\n \"generation\",\n \"path\",\n \"retention\",\n \"expires_at\",\n ]);\n check(v.version === 2, \"reference version must be two\");\n text(v.creator, 512, 1);\n validatePublicKey(v.account, \"account\");\n validateTarget(v.target);\n validateContentID(v.root);\n uint(v.generation, undefined, 1);\n validatePath(v.path, 256);\n validateRetentionHandle(v.retention);\n uint(v.expires_at, undefined, 1);\n}\nexport function encodeReference(reference: Reference): string {\n validateReference(reference);\n const ordered: Reference = {\n version: 2,\n creator: reference.creator,\n account: reference.account,\n target: { volume: reference.target.volume, creation_id: reference.target.creation_id },\n root: reference.root,\n generation: reference.generation,\n path: reference.path,\n retention: { slot: reference.retention.slot, generation: reference.retention.generation },\n expires_at: reference.expires_at,\n };\n const token = \"sp-ref:\" + Buffer.from(goJSON(ordered, false)).toString(\"base64url\");\n check(Buffer.byteLength(token) <= 16 * 1024, \"reference exceeds byte bound\");\n return token;\n}\nexport function decodeReference(token: string): Reference {\n text(token, 16 * 1024);\n check(token.startsWith(\"sp-ref:\"), \"reference prefix is absent\");\n const encoded = token.slice(7);\n check(/^[A-Za-z0-9_-]+$/.test(encoded), \"reference is not unpadded base64url\");\n const data = Buffer.from(encoded, \"base64url\");\n check(data.toString(\"base64url\") === encoded, \"reference base64url has stray bits\");\n const reference = parseStrictJSON(data, 16 * 1024);\n validateReference(reference);\n check(encodeReference(reference) === token, \"reference JSON is not canonical\");\n return reference;\n}\n","import { createHash } from \"node:crypto\";\nimport { validateReference, type Reference } from \"./codec\";\nimport * as p from \"./protocol\";\n\nexport const SHORT_REFERENCE_PREFIX = \"sp-r1:\";\nexport const SHORT_REFERENCE_BYTES = 66;\nexport const REFERENCE_PATHS = 8;\nexport const MAX_REFERENCE_INTENT_BYTES = 3072;\nexport const MAX_REFERENCE_METADATA_BYTES = 32768;\n\nexport interface ShortReference {\n route: string;\n creation_id: string;\n retention: p.RetentionHandle;\n path_index: number;\n}\nexport interface ReferenceSpec {\n creator: string;\n paths: string[];\n}\nexport interface ResolvedReference {\n short: string;\n expanded: Reference;\n}\nexport interface ReferenceCapabilities {\n enabled: boolean;\n version: number;\n prefix: string;\n token_bytes: number;\n paths_per_retention: number;\n max_intent_bytes: number;\n max_metadata_bytes: number;\n}\nexport interface ReferencePublishRequest extends p.PublishRequest {\n reference: ReferenceSpec;\n}\nexport interface ReferencePublishResult {\n receipt: p.Receipt;\n references: ResolvedReference[];\n}\nexport interface ReferenceResolveRequest {\n reference: string;\n trace: p.Trace;\n}\nexport interface ReferenceStatResult {\n reference: ResolvedReference;\n stat: p.Stat;\n}\n\n/** Decode the locator only. The service verifies its metadata verifier. */\nexport function decodeShortReference(token: string): ShortReference {\n p.text(token, SHORT_REFERENCE_BYTES, SHORT_REFERENCE_BYTES);\n p.check(/^sp-r1:[A-Za-z0-9_-]{60}$/.test(token), \"malformed short reference\");\n const data = Buffer.from(token.slice(SHORT_REFERENCE_PREFIX.length), \"base64url\");\n p.check(data.length === 45 && data[32]! < 64, \"invalid short reference slots\");\n const generation = Number(data.readBigUInt64BE(24));\n p.uint(generation, undefined, 1);\n const result = {\n route: data.subarray(0, 8).toString(\"hex\"),\n creation_id: data.subarray(8, 24).toString(\"hex\"),\n retention: { slot: data[32]! >> 3, generation },\n path_index: data[32]! & 7,\n };\n p.validateTarget({ volume: \"Reference\", creation_id: result.creation_id });\n return result;\n}\n\nexport function referenceRoute(account: string, volume: string): string {\n return createHash(\"sha256\")\n .update(`scratchpad-reference-volume-v1\\0${account}\\0${volume}`)\n .digest()\n .subarray(0, 8)\n .toString(\"hex\");\n}\n\nexport function validateReferenceSpec(value: unknown): asserts value is ReferenceSpec {\n const v = p.record(value, [\"creator\", \"paths\"]);\n p.text(v.creator, 512, 1);\n p.check(\n Array.isArray(v.paths) && v.paths.length > 0 && v.paths.length <= REFERENCE_PATHS,\n \"reference paths exceed bound\",\n );\n let previous = \"\";\n for (const path of v.paths) {\n p.validatePath(path, 256);\n p.check(\n Buffer.compare(Buffer.from(previous), Buffer.from(path)) < 0,\n \"reference paths must be distinct and sorted\",\n );\n previous = path;\n }\n p.check(\n Buffer.byteLength(p.goJSON({ creator: v.creator, paths: v.paths })) <=\n MAX_REFERENCE_INTENT_BYTES,\n \"reference intent exceeds byte bound\",\n );\n}\n\nexport function validateResolvedReference(value: unknown): asserts value is ResolvedReference {\n const v = p.record(value, [\"short\", \"expanded\"]);\n p.text(v.short, SHORT_REFERENCE_BYTES, SHORT_REFERENCE_BYTES);\n const locator = decodeShortReference(v.short);\n validateReference(v.expanded);\n p.check(\n locator.route === referenceRoute(v.expanded.account, v.expanded.target.volume) &&\n locator.creation_id === v.expanded.target.creation_id &&\n p.sameValue(locator.retention, v.expanded.retention),\n \"short reference binding differs\",\n );\n}\n\nexport function validateReferenceCapabilities(\n value: unknown,\n): asserts value is ReferenceCapabilities {\n const v = p.record(value, [\n \"enabled\",\n \"version\",\n \"prefix\",\n \"token_bytes\",\n \"paths_per_retention\",\n \"max_intent_bytes\",\n \"max_metadata_bytes\",\n ]);\n p.check(\n typeof v.enabled === \"boolean\" &&\n v.version === 1 &&\n v.prefix === SHORT_REFERENCE_PREFIX &&\n v.token_bytes === SHORT_REFERENCE_BYTES &&\n v.paths_per_retention === REFERENCE_PATHS &&\n v.max_intent_bytes === MAX_REFERENCE_INTENT_BYTES &&\n v.max_metadata_bytes === MAX_REFERENCE_METADATA_BYTES,\n \"unsupported reference capability\",\n );\n}\n\nexport function validateReferencePublishRequest(\n value: unknown,\n): asserts value is ReferencePublishRequest {\n const v = p.record(value, [\"target\", \"command\", \"reference\"]);\n p.validateTarget(v.target);\n p.validateCommand(v.command);\n p.check(\n v.target.creation_id === v.command.creation_id &&\n v.command.retention.enabled &&\n v.command.retention.until > 0,\n \"referenced publication requires finite retention and matching target\",\n );\n validateReferenceSpec(v.reference);\n}\n\nexport function validateReferencePublishResult(\n value: unknown,\n): asserts value is ReferencePublishResult {\n const v = p.record(value, [\"receipt\", \"references\"]);\n p.validateReceipt(v.receipt);\n p.check(\n v.receipt.command.retention.enabled &&\n Array.isArray(v.references) &&\n v.references.length > 0 &&\n v.references.length <= REFERENCE_PATHS,\n \"invalid referenced receipt\",\n );\n let previous = \"\",\n creator: string | undefined;\n for (const [index, pair] of v.references.entries()) {\n validateResolvedReference(pair);\n const ref = pair.expanded;\n creator ??= ref.creator;\n p.check(\n decodeShortReference(pair.short).path_index === index &&\n ref.creator === creator &&\n Buffer.compare(Buffer.from(previous), Buffer.from(ref.path)) < 0 &&\n ref.account === v.receipt.principal.account &&\n ref.target.volume === v.receipt.volume &&\n ref.target.creation_id === v.receipt.command.creation_id &&\n ref.root === v.receipt.head.root &&\n ref.generation === v.receipt.head.generation &&\n p.sameValue(ref.retention, v.receipt.retention) &&\n ref.expires_at === v.receipt.command.retention.until,\n \"reference differs from receipt\",\n );\n previous = ref.path;\n }\n}\n\nexport function validateReferenceStatResult(value: unknown): asserts value is ReferenceStatResult {\n const v = p.record(value, [\"reference\", \"stat\"]);\n validateResolvedReference(v.reference);\n p.validateStat(v.stat);\n}\n\nexport interface ReferenceRetainRequest {\n retain: p.RetainRequest;\n reference: ReferenceSpec;\n}\nexport interface ReferenceRetainResult {\n volume: p.VolumeView;\n references: ResolvedReference[];\n}\nexport function validateReferenceRetainRequest(\n value: unknown,\n): asserts value is ReferenceRetainRequest {\n const v = p.record(value, [\"retain\", \"reference\"]);\n const retain = p.record(v.retain, [\"target\", \"slot\", \"generation\", \"root\", \"until\", \"action\"]);\n p.validateTarget(retain.target);\n p.uint(retain.slot, p.RETENTION_SLOTS - 1);\n p.uint(retain.generation);\n p.validateContentID(retain.root);\n p.uint(retain.until, undefined, 1);\n p.validateAction(retain.action);\n validateReferenceSpec(v.reference);\n}\nexport function validateReferenceRetainResult(\n value: unknown,\n): asserts value is ReferenceRetainResult {\n const v = p.record(value, [\"volume\", \"references\"]);\n p.validateVolumeView(v.volume);\n p.check(\n Array.isArray(v.references) &&\n v.references.length > 0 &&\n v.references.length <= REFERENCE_PATHS,\n \"invalid retained references\",\n );\n let first: Reference | undefined,\n previous = \"\";\n for (const [index, pair] of v.references.entries()) {\n validateResolvedReference(pair);\n const ref = pair.expanded;\n first ??= ref;\n const retained = v.volume.retentions[ref.retention.slot]!;\n p.check(\n decodeShortReference(pair.short).path_index === index &&\n Buffer.compare(Buffer.from(previous), Buffer.from(ref.path)) < 0 &&\n ref.creator === first.creator &&\n ref.root === first.root &&\n ref.generation === first.generation &&\n p.sameValue(ref.retention, first.retention) &&\n ref.expires_at === first.expires_at &&\n p.sameValue(ref.target, v.volume.target) &&\n ref.account === v.volume.owner.account &&\n retained.generation === ref.retention.generation &&\n retained.pin?.root === ref.root &&\n retained.pin.until === ref.expires_at,\n \"reference differs from retained root\",\n );\n previous = ref.path;\n }\n}\n","// The ready implementation of the ScratchPad port, through the `sp` command\n// line. Mirrors `synadia_ai/agent_fabric/scratchpad_cli.py`.\n//\n// ScratchPad is the fabric's store for what agents produce: durable,\n// permissioned volumes, every commit, grant and read written to the agent's\n// timeline. This optional adapter drives the sp v2 command line.\n// For direct NATS access, use nativeScratchPad from this package.\n// The binary must be on the machine; it connects with the agent's own\n// credentials. Five operations are all an\n// agent needs:\n//\n// commit(text, path) publish the text as this agent's reply, retained\n// for ten minutes, and return the reference the CLI\n// made for it: one token that fits in a prompt\n// read(reference) fetch the exact bytes the reference names\n// owns(reference) whether the token points into this agent's own\n// volume, the only one it may grant on\n// grantRead(reference, let one agent read what the reference points at,\n// grantee) for a short while — the last thing done before a\n// reference leaves this agent\n// granted(reference, whom this agent granted read, and how: the\n// grantee) ledger a grant request is decided by\n//\n// The last three are the {@link ScratchPad} port the extension and the\n// grant request run on; the first two are the agent's own. Together they\n// are {@link ScratchPadClient}, which the native implementation also satisfies.\n//\n// Every call carries the served prompt's thread and root ids, so the\n// commit, the grant and the read show up on the thread in the console next\n// to the model calls that produced and consumed the content.\n//\n// The CLI keeps a small private workspace in `dir`: which volume this agent\n// owns, and the one command it may still have to finish. A command whose\n// outcome is unknown (the connection dropped after sending) stays pending\n// there, and the CLI refuses any different command until that one is\n// resolved. This never resets or replaces it; it only asks the CLI to\n// finish the same command. Keep the directory across restarts.\n//\n// Each commit is a new root that holds only that reply, not every earlier\n// one, and the CLI retains it for ten minutes in the same step. The volume\n// has a few retention slots and a small content allowance. When they are\n// full, this asks the CLI to release expired retention and collect content\n// nothing retains any more, then tries the same commit once more. The\n// refused commit leaves its prepared copy (the CLI's spool) in the\n// workspace, and the CLI publishes nothing else until that is removed, so\n// this first asks the CLI to remove it. It first\n// reads the volume: with every retention slot held by a pin that cannot be\n// released now, cleanup cannot free one, so the commit fails at once and\n// the volume stays open for the agents reading earlier replies. A live\n// handoff is never evicted to make room: the commit fails, and the agent\n// answers in plain text instead. A cleanup the CLI cannot finish stays\n// saved in the workspace; the next mutation asks the CLI to recover it, so\n// an interrupted cleanup never leaves the volume closed.\n//\n// The CLI returns one token unchanged: service-issued `sp-r1:` or the\n// existing `sp-ref:` form. resolveReference expands short metadata through\n// `sp resolve`; a bounded cache helps creator and grant routing. Reads pass\n// the original token to `sp read` so cached metadata never skips current\n// token validity or content authorization. Python follows the same rules.\n//\n// Who may read: nobody but the volume's owner, until the owner grants it.\n// The token is application data, not a credential: ScratchPad\n// authenticates the reader as the `(account, user)` the server stamped on\n// its connection and checks the grants on the volume. So a reference is\n// handed over in two moves: a grant to the one agent that is about to\n// receive it, then the prompt or reply that carries it. Least authority:\n// one grantee, one root, one path, read only, a short expiry; nothing is\n// granted when content is committed, and never to everyone discovered. A\n// grant goes only to a principal in the reference's own account; the CLI\n// refuses any other, and refuses to read another account's token.\n//\n// Being allowed to read is not being allowed to pass on. An agent handed a\n// reference cannot let a third agent read it: ScratchPad has no\n// delegation, on purpose. It does not copy the content into its own volume\n// to get around that either; it asks the creator, and the creator decides\n// (`grant-request.ts`). For that decision this keeps a ledger of whom this\n// agent granted what, and how: first-hand, to an agent it handed the\n// reference itself, or on request, to an agent someone else wanted to hand\n// it to. Only the first kind entitles its holder to ask for another agent.\n\nimport { execFile } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { mkdir, realpath } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { NatsConnectionSource } from \"@synadia-ai/agents\";\nimport {\n REFERENCE_PREFIX,\n type GrantKind,\n type Grantee,\n type ScratchPad,\n type TraceIds,\n} from \"./scratchpad.js\";\nimport { activeTrace } from \"./trace.js\";\nimport {\n SHORT_REFERENCE_PREFIX,\n decodeShortReference,\n validateResolvedReference,\n} from \"./scratchpad-native/references\";\nimport { encodeReference } from \"./scratchpad-native/codec\";\n\n/**\n * The agent's ScratchPad: the {@link ScratchPad} port, which the rules for\n * references run on, and the commit and read the agent makes itself.\n */\nexport interface ScratchPadClient extends ScratchPad {\n /**\n * Publish `text` at `path` in this agent's volume, retained for ten\n * minutes, and return the reference token the CLI made for it.\n */\n commit(text: string, path: string, trace: TraceIds | undefined): Promise<string>;\n /** Fetch the exact content a reference token names, as text. */\n read(reference: string, trace: TraceIds | undefined): Promise<string>;\n}\n\nexport interface SpCliScratchPadOptions {\n /**\n * The volume this agent writes to, by name: letters and digits only. The\n * deployment provisions it for the agent's account and user; the first\n * commit creates it.\n */\n readonly volume: string;\n /**\n * The agent's own connection source: `sp` authenticates the same way. It\n * takes a URL with a credentials file; it reads no NATS context, and an\n * nkey seed alone is not a form it accepts.\n */\n readonly nats: NatsConnectionSource;\n /** The `sp` binary. Default `sp` on PATH. */\n readonly bin?: string;\n /**\n * A private directory for the CLI's workspace; created if missing, and\n * used by its real path. Keep it across restarts: it records the volume\n * and any command still to finish. Default `scratchpad-<volume>` under\n * the temp directory.\n */\n readonly dir?: string;\n /** How long a read grant lasts, in seconds. Default and ceiling ten minutes. */\n readonly grantTtlS?: number;\n /**\n * This agent's prompt address, written into every reference it makes, so\n * an agent handed one knows whom to ask before passing it on. A commit\n * needs it.\n */\n readonly creator?: string;\n}\n\n/** The `sp` binary when none is given: the one on PATH. */\nexport const DEFAULT_SP_BIN = \"sp\";\n/** How long a committed reply stays retained, and its reference valid. */\nconst HANDOFF_TTL_S = 600;\n/**\n * How long a read grant lasts at most: long enough for the receiving agent\n * to read what it was handed when it starts on the prompt, short enough\n * that the access does not outlive the task. A grant also never outlives\n * the reference it is on.\n */\nexport const DEFAULT_GRANT_TTL_S = 600;\n/**\n * Seconds a grant stays short of its reference's expiry. The CLI checks the\n * bound on its own clock a moment later, so a grant asked for to the exact\n * second could outlive the reference by the time it arrives.\n */\nconst EXPIRY_MARGIN_S = 5;\n/** Live entries the grant ledger holds; ScratchPad itself has 16 grant slots. */\nconst MAX_LEDGER = 16;\n/** A reference token's size bound, the CLI's. */\nconst MAX_REFERENCE_BYTES = 16 * 1024;\n/** The largest file a read returns: the SDK's logical limit. */\nconst MAX_READ_BYTES = 16 * 1024 * 1024;\n/** A read's stdout: the file in base64, plus room for the JSON around it. */\nconst MAX_READ_STDOUT = Math.ceil(MAX_READ_BYTES / 3) * 4 + 64 * 1024;\n/** Every other reply, and every error, is small. */\nconst MAX_STDOUT = 256 * 1024;\nconst MAX_STDERR = 64 * 1024;\n\nconst ACCOUNT_RE = /^A[A-Z2-7]{55}$/;\nconst VOLUME_RE = /^[0-9A-Za-z]{1,64}$/;\nconst CREATION_RE = /^[0-9a-f]{32}$/;\nconst ROOT_RE = /^[A-Za-z0-9_-]{43}$/;\nconst BASE64URL_RE = /^[A-Za-z0-9_-]+$/;\nconst BASE64_RE = /^[A-Za-z0-9+/]*={0,2}$/;\n\n/** What a reference token holds, as the CLI writes it. No field is a credential. */\nexport interface Reference {\n readonly version: 2;\n readonly creator: string;\n readonly account: string;\n readonly target: Target;\n readonly root: string;\n readonly generation: number;\n readonly path: string;\n readonly retention: { readonly slot: number; readonly generation: number };\n readonly expires_at: number;\n}\n\ninterface Target {\n readonly volume: string;\n readonly creation_id: string;\n}\n\n/** The volume this agent owns: whom the CLI authenticated, and the volume's exact incarnation. */\ninterface Binding {\n readonly account: string;\n readonly target: Target;\n}\n\n/**\n * A refusal or failure from `sp`: its error code, and whether the outcome\n * is unknown — a mutation that may still have taken effect.\n */\nexport class ScratchPadError extends Error {\n constructor(\n message: string,\n readonly code: string,\n readonly unknown: boolean,\n ) {\n super(message);\n this.name = \"ScratchPadError\";\n }\n}\n\nconst isObject = (v: unknown): v is Record<string, unknown> =>\n typeof v === \"object\" && v !== null && !Array.isArray(v);\nconst hasKeys = (v: Record<string, unknown>, keys: string[]): boolean =>\n Object.keys(v).length === keys.length && keys.every((k) => k in v);\nconst positive = (v: unknown): v is number => Number.isSafeInteger(v) && (v as number) > 0;\nconst utf8Bytes = (s: string): number => Buffer.byteLength(s, \"utf8\");\n\nfunction validTarget(v: unknown): v is Target {\n return (\n isObject(v) &&\n hasKeys(v, [\"volume\", \"creation_id\"]) &&\n typeof v[\"volume\"] === \"string\" &&\n VOLUME_RE.test(v[\"volume\"]) &&\n typeof v[\"creation_id\"] === \"string\" &&\n CREATION_RE.test(v[\"creation_id\"])\n );\n}\n\nfunction validPath(p: unknown): p is string {\n if (typeof p !== \"string\" || !p.startsWith(\"/\") || utf8Bytes(p) > 256) return false;\n if (p === \"/\") return true;\n return p\n .slice(1)\n .split(\"/\")\n .every((name) => name !== \"\" && name !== \".\" && name !== \"..\");\n}\n\n/**\n * The token's fields, when its shape is right: the size bound, the prefix,\n * unpadded base64url, exactly the nine fields and their kinds. The CLI\n * checks the rest (canonical bytes, the path's names, the NKEY checksum).\n */\nexport function decodeReference(reference: string): Reference {\n const refuse = (why: string): never => {\n throw new Error(`malformed ScratchPad reference: ${why}`);\n };\n if (typeof reference !== \"string\" || !reference.startsWith(REFERENCE_PREFIX)) {\n refuse(\"no sp-ref: prefix\");\n }\n if (reference.length > MAX_REFERENCE_BYTES) refuse(\"longer than 16 KiB\");\n const body = reference.slice(REFERENCE_PREFIX.length);\n if (!BASE64URL_RE.test(body) || body.length % 4 === 1) refuse(\"not unpadded base64url\");\n let v: unknown;\n try {\n v = JSON.parse(Buffer.from(body, \"base64url\").toString(\"utf8\"));\n } catch {\n refuse(\"not JSON\");\n }\n const keys = [\n \"version\",\n \"creator\",\n \"account\",\n \"target\",\n \"root\",\n \"generation\",\n \"path\",\n \"retention\",\n \"expires_at\",\n ];\n if (!isObject(v) || !hasKeys(v, keys)) return refuse(\"not the version 2 fields\");\n const r = v.retention;\n if (\n v[\"version\"] !== 2 ||\n typeof v[\"creator\"] !== \"string\" ||\n v[\"creator\"].length === 0 ||\n utf8Bytes(v[\"creator\"]) > 512 ||\n typeof v[\"account\"] !== \"string\" ||\n !ACCOUNT_RE.test(v[\"account\"]) ||\n !validTarget(v[\"target\"]) ||\n typeof v[\"root\"] !== \"string\" ||\n !ROOT_RE.test(v[\"root\"]) ||\n !positive(v[\"generation\"]) ||\n !validPath(v[\"path\"]) ||\n !isObject(r) ||\n !hasKeys(r, [\"slot\", \"generation\"]) ||\n !Number.isSafeInteger(r[\"slot\"]) ||\n (r[\"slot\"] as number) < 0 ||\n (r[\"slot\"] as number) > 7 ||\n !positive(r[\"generation\"]) ||\n !positive(v[\"expires_at\"])\n ) {\n refuse(\"a field is out of shape\");\n }\n return v as unknown as Reference;\n}\n\nconst now = (): number => Math.floor(Date.now() / 1000);\n\n/** The parts of the CLI's `describe` reply that decide whether cleanup can make room. */\nexport interface VolumeView {\n readonly closed: boolean;\n /** The saved request the CLI has not finished, by kind: `close`, `apply`, `release` or `grant`. */\n readonly control: string | undefined;\n readonly retentions: readonly {\n readonly generation: number;\n readonly until: number | undefined;\n }[];\n readonly grants: readonly {\n readonly slot: number;\n readonly generation: number;\n readonly until: number;\n }[];\n}\n\nconst RETENTION_SLOTS = 8;\nconst GRANT_SLOTS = 16;\nconst CONTROL_KINDS = [\"close\", \"apply\", \"release\", \"grant\"];\n/** The codes `describe` refuses with when the workspace holds no volume yet. */\nconst NO_VOLUME_CODES = [\"workspace\", \"not_found\"];\nconst count = (v: unknown): v is number => Number.isSafeInteger(v) && (v as number) >= 0;\n\n/**\n * The volume view in a `describe` reply, checked field by field: exactly\n * eight retention slots and sixteen grant slots, each with the kinds the\n * CLI writes. Anything else is refused, never guessed at.\n */\nexport function decodeDescribe(reply: unknown): VolumeView {\n const refuse = (why: string): never => {\n throw new ScratchPadError(`sp describe: ${why}`, \"malformed_reply\", false);\n };\n if (!isObject(reply) || !isObject(reply[\"volume\"])) return refuse(\"the reply names no volume\");\n const volume = reply[\"volume\"];\n const control = reply[\"control\"];\n let kind: string | undefined;\n if (control !== null && control !== undefined) {\n if (\n !isObject(control) ||\n typeof control[\"kind\"] !== \"string\" ||\n !CONTROL_KINDS.includes(control[\"kind\"])\n ) {\n return refuse(\"the saved control request is out of shape\");\n }\n kind = control[\"kind\"];\n }\n if (typeof volume[\"closed\"] !== \"boolean\") return refuse(\"the volume names no closed state\");\n const retentions = volume[\"retentions\"];\n const grants = volume[\"grants\"];\n if (!Array.isArray(retentions) || retentions.length !== RETENTION_SLOTS)\n return refuse(\"not eight retention slots\");\n if (!Array.isArray(grants) || grants.length !== GRANT_SLOTS)\n return refuse(\"not sixteen grant slots\");\n const pins = retentions.map((slot: unknown) => {\n if (!isObject(slot) || !count(slot[\"generation\"]))\n return refuse(\"a retention slot is out of shape\");\n const pin = slot[\"pin\"];\n if (pin === undefined || pin === null)\n return { generation: slot[\"generation\"], until: undefined };\n if (!isObject(pin) || !count(pin[\"until\"]) || typeof pin[\"root\"] !== \"string\")\n return refuse(\"a retention pin is out of shape\");\n return { generation: slot[\"generation\"], until: pin[\"until\"] };\n });\n const live: { slot: number; generation: number; until: number }[] = [];\n for (const slot of grants as unknown[]) {\n if (!isObject(slot) || !count(slot[\"generation\"]))\n return refuse(\"a grant slot is out of shape\");\n const grant = slot[\"grant\"];\n if (grant === undefined || grant === null) continue;\n const handle = isObject(grant) ? grant[\"retention\"] : undefined;\n if (\n !isObject(grant) ||\n !count(grant[\"until\"]) ||\n !isObject(handle) ||\n !count(handle[\"slot\"]) ||\n handle[\"slot\"] >= RETENTION_SLOTS ||\n !positive(handle[\"generation\"])\n ) {\n return refuse(\"a grant is out of shape\");\n }\n live.push({\n slot: handle[\"slot\"],\n generation: handle[\"generation\"],\n until: grant[\"until\"],\n });\n }\n return { closed: volume[\"closed\"], control: kind, retentions: pins, grants: live };\n}\n\n/** The spool a `spool-remove` reply describes: whether one is there, and whether it went. */\nexport interface SpoolView {\n readonly present: boolean;\n readonly removable: boolean;\n readonly applied: boolean;\n}\n\n/**\n * A `spool-remove` or `spool-inspect` reply, checked field by field: exactly\n * `present`, `files`, `bytes`, `removable` and `applied`, and `phase` when,\n * and only when, a spool is present. Anything else is refused.\n */\nexport function decodeSpool(reply: unknown): SpoolView {\n const refuse = (why: string): never => {\n throw new ScratchPadError(`sp spool-remove: ${why}`, \"malformed_reply\", false);\n };\n if (!isObject(reply) || typeof reply[\"present\"] !== \"boolean\")\n return refuse(\"the reply says no spool state\");\n const present = reply[\"present\"];\n const keys = [\"present\", \"files\", \"bytes\", \"removable\", \"applied\"];\n if (present) keys.push(\"phase\");\n if (\n !hasKeys(reply, keys) ||\n (present && (typeof reply[\"phase\"] !== \"string\" || reply[\"phase\"] === \"\")) ||\n !count(reply[\"files\"]) ||\n !count(reply[\"bytes\"]) ||\n typeof reply[\"removable\"] !== \"boolean\" ||\n typeof reply[\"applied\"] !== \"boolean\"\n ) {\n return refuse(\"the spool state is out of shape\");\n }\n return { present, removable: reply[\"removable\"], applied: reply[\"applied\"] };\n}\n\n/**\n * Why `maintain --apply` cannot make room for a retained commit now, or\n * `undefined` when it can: a slot is free, or an expired pin no live grant\n * names can be released. A closed volume with no saved cleanup of this\n * agent's is someone else's maintenance, and never reopened from here.\n */\nexport function cleanupCannotHelp(view: VolumeView, at: number = now()): string | undefined {\n const maintenance = view.control === \"close\" || view.control === \"apply\";\n if (view.closed && !maintenance)\n return \"the volume is closed, and no cleanup of this agent's is saved\";\n if (maintenance) return undefined; // finish the saved cleanup first\n const room = view.retentions.some(\n (pin, slot) =>\n pin.until === undefined || // free\n (pin.until !== 0 && // expired, and no live grant names this exact handle\n pin.until <= at &&\n !view.grants.some(\n (g) => g.slot === slot && g.generation === pin.generation && g.until > at,\n )),\n );\n return room ? undefined : \"every retention slot holds a live pin\";\n}\n\n/**\n * Commit, read and grant by reference, through one `sp` binary and one\n * volume: the {@link ScratchPadClient} an agent hands to\n * `scratchPadExtension()` and `grantRequestEndpoint()` and commits and reads\n * with itself.\n */\nexport function spCliScratchPad(options: SpCliScratchPadOptions): ScratchPadClient {\n // `sp` takes a URL and a credentials file. It reads no NATS context, and\n // an nkey seed alone is not a form it accepts.\n if (!(\"creds\" in options.nats) || options.nats.creds === undefined) {\n throw new Error(\n \"ScratchPad: the sp CLI needs NATS_URL and NATS_CREDS; a NATS context or an nkey seed alone is not supported\",\n );\n }\n const connection = [\"--url\", options.nats.url, \"--creds\", options.nats.creds];\n const bin = options.bin ?? DEFAULT_SP_BIN;\n const configuredDir = options.dir ?? join(tmpdir(), `scratchpad-${options.volume}`);\n const grantTtlS = Math.min(options.grantTtlS ?? DEFAULT_GRANT_TTL_S, DEFAULT_GRANT_TTL_S);\n\n // The CLI's workspace: the configured directory with every symlink\n // resolved, because on macOS both `/tmp` and `$TMPDIR` are symlinks.\n let dir: Promise<string> | undefined;\n // Which volume this agent owns, once the CLI has said so.\n let binding: Binding | undefined;\n // One mutation at a time (init, commit, maintenance, grant). The CLI\n // locks its workspace too; this keeps the agent's own calls in order\n // rather than having the CLI refuse the second of two at once.\n let mutations: Promise<unknown> = Promise.resolve();\n // Whether the workspace may hold a commit or a cleanup whose outcome is\n // unknown or unfinished: at start (a previous process may have left one),\n // after a commit that ended unknown, and after a cleanup that failed. The\n // next commit or grant first asks the CLI to recover it.\n let mayHavePending = true;\n // A grant whose outcome is unknown: its exact arguments, to finish before\n // any other grant, because the CLI refuses a different one meanwhile.\n let pendingGrant: { args: string[]; key: string; kind: GrantKind; ref: Reference } | undefined;\n\n // Whom this agent granted read: the account, the volume's incarnation,\n // the root, the path and the grantee, to the expiry of its latest grant\n // of each kind. ScratchPad knows the grants but not how they came about;\n // that is this agent's own knowledge. In memory, so one ledger per\n // process: after a restart, or in another instance behind the same\n // address, the answer is \"not granted\", which is the safe one.\n const ledger = new Map<string, Partial<Record<GrantKind, number>>>();\n\n function serialize<T>(work: () => Promise<T>): Promise<T> {\n const next = mutations.then(work);\n mutations = next.catch(() => undefined);\n return next;\n }\n\n const expansions = new Map<string, Reference>();\n async function resolveReference(token: string, trace?: TraceIds): Promise<Reference> {\n if (!token.startsWith(SHORT_REFERENCE_PREFIX)) return decodeReference(token);\n decodeShortReference(token);\n const cached = expansions.get(token);\n if (cached && cached.expires_at > now()) return structuredClone(cached);\n const reply = await sp<{ reference: unknown; full_reference: string }>(\n \"resolve\",\n [\"--ref\", token],\n { trace },\n );\n const pair = { short: token, expanded: reply?.reference };\n validateResolvedReference(pair);\n if (reply.full_reference !== encodeReference(pair.expanded))\n throw new ScratchPadError(\n \"sp resolve: expanded token differs from descriptor\",\n \"malformed_reply\",\n false,\n );\n const ref = decodeReference(reply.full_reference);\n if (ref.expires_at <= now()) throw new Error(\"the reference has expired\");\n expansions.delete(token);\n expansions.set(token, ref);\n if (expansions.size > 64) expansions.delete(expansions.keys().next().value!);\n return structuredClone(ref);\n }\n\n async function workspace(): Promise<string> {\n dir ??= (async () => {\n await mkdir(configuredDir, { recursive: true, mode: 0o700 });\n return realpath(configuredDir);\n })();\n return dir;\n }\n\n async function sp<T>(\n command: string,\n args: string[],\n opts: {\n trace?: TraceIds | undefined;\n toolCallId?: string | undefined;\n stdin?: string;\n maxStdout?: number;\n mutation?: boolean;\n } = {},\n ): Promise<T> {\n const trace = opts.trace\n ? [\"--thread-id\", opts.trace.threadId, \"--root-id\", opts.trace.rootId]\n : [];\n if (opts.trace && opts.toolCallId !== undefined) trace.push(\"--tool-call-id\", opts.toolCallId);\n // A read targets the reference's volume, which can belong to another agent.\n const volume = [\"read\", \"resolve\"].includes(command) ? [] : [\"--volume\", options.volume];\n const argv = [command, ...connection, \"--dir\", await workspace(), ...volume, ...args, ...trace];\n const maxStdout = opts.maxStdout ?? MAX_STDOUT;\n const { code, stdout, stderr } = await new Promise<{\n code: number | null;\n stdout: string;\n stderr: string;\n }>((resolve) => {\n const child = execFile(\n bin,\n argv,\n { maxBuffer: Math.max(maxStdout, MAX_STDERR), encoding: \"utf8\" },\n (err, stdout, stderr) => {\n const e = err as (NodeJS.ErrnoException & { code?: unknown }) | null;\n resolve({\n code: e === null ? 0 : typeof e.code === \"number\" ? e.code : null,\n stdout: stdout ?? \"\",\n stderr: stderr || (e !== null && typeof e.code === \"string\" ? e.message : \"\"),\n });\n },\n );\n child.stdin?.end(opts.stdin ?? \"\");\n });\n if (code === null && /^spawn .*(ENOENT|EACCES)/m.test(stderr)) {\n // Not started: nothing was sent.\n throw new ScratchPadError(`sp ${command}: ${stderr.trim()}`, \"spawn_failed\", false);\n }\n if (code === 0 && stdout.length <= maxStdout) {\n try {\n return JSON.parse(stdout) as T;\n } catch {\n // Fall through: a mutation whose reply cannot be read may still\n // have happened.\n }\n }\n // A refusal is JSON on stderr: `{\"error\": {\"code\", \"message\", \"unknown\"}}`.\n // Anything else from a mutation (a crash, a cut-off reply) proves nothing\n // about whether it took effect, so it counts as unknown.\n let failure: { code: string; message: string; unknown: boolean } = {\n code: code === 0 ? \"malformed_reply\" : \"failed\",\n message: stderr.trim().slice(0, 512) || `exit ${code ?? \"by signal\"}`,\n unknown: opts.mutation === true,\n };\n if (code !== 0) {\n try {\n const e = (JSON.parse(stderr) as { error?: Record<string, unknown> }).error;\n if (isObject(e) && typeof e[\"code\"] === \"string\") {\n failure = {\n code: e[\"code\"],\n message: typeof e[\"message\"] === \"string\" ? e[\"message\"] : \"\",\n unknown:\n e[\"unknown\"] === true ||\n (opts.mutation === true && typeof e[\"unknown\"] !== \"boolean\"),\n };\n }\n } catch {\n // Not JSON: keep the conservative reading above.\n }\n }\n throw new ScratchPadError(\n `sp ${command}: ${failure.code}${failure.unknown ? \" (outcome unknown)\" : \"\"}: ${failure.message}`,\n failure.code,\n failure.unknown,\n );\n }\n\n function bind(reply: unknown, command: string): Binding {\n const r = reply as { principal?: { account?: unknown }; target?: unknown };\n const account = r?.principal?.account;\n if (typeof account !== \"string\" || !ACCOUNT_RE.test(account) || !validTarget(r.target)) {\n throw new ScratchPadError(\n `sp ${command}: the reply names no principal and target`,\n \"malformed_reply\",\n false,\n );\n }\n if (r.target.volume !== options.volume) {\n throw new ScratchPadError(\n `sp ${command}: the workspace is bound to another volume`,\n \"invalid\",\n false,\n );\n }\n return { account, target: { volume: r.target.volume, creation_id: r.target.creation_id } };\n }\n\n // Create the volume, or resume it: the CLI makes this safe to repeat.\n async function init(trace: TraceIds | undefined): Promise<Binding> {\n binding ??= bind(await sp(\"init\", [], { trace, mutation: true }), \"init\");\n return binding;\n }\n\n // The volume this agent owns, without creating it: `undefined` when the\n // workspace was never initialized, which the CLI refuses as `workspace`\n // (\"run init\"). A workspace bound to another volume or principal answers\n // the same, and the next commit's `init` reports it.\n async function describe(trace: TraceIds | undefined): Promise<Binding | undefined> {\n if (binding !== undefined) return binding;\n try {\n binding = bind(await sp(\"describe\", [], { trace }), \"describe\");\n } catch (err) {\n if (err instanceof ScratchPadError && NO_VOLUME_CODES.includes(err.code)) return undefined;\n throw err;\n }\n return binding;\n }\n\n const ownedBy = (ref: Reference, b: Binding | undefined): boolean =>\n b !== undefined &&\n ref.account === b.account &&\n ref.target.volume === b.target.volume &&\n ref.target.creation_id === b.target.creation_id;\n\n const ledgerKey = (ref: Reference, grantee: Grantee): string =>\n JSON.stringify([\n ref.account,\n ref.target.volume,\n ref.target.creation_id,\n ref.root,\n ref.path,\n grantee.account,\n grantee.user,\n ]);\n\n function prune(): void {\n const t = now();\n for (const [key, until] of ledger) {\n if (Math.max(until[\"first-hand\"] ?? 0, until[\"on-request\"] ?? 0) <= t) ledger.delete(key);\n }\n }\n\n function record(key: string, kind: GrantKind, expiresAt: number): void {\n ledger.set(key, { ...ledger.get(key), [kind]: expiresAt });\n }\n\n // The expiry the CLI reports for a grant, never later than the reference's.\n function grantExpiry(reply: unknown, ref: Reference): number {\n const r = reply as { handle?: unknown; expires_at?: unknown };\n if (!isObject(r) || !isObject(r.handle) || !positive(r.expires_at)) {\n throw new ScratchPadError(\n \"sp grant: the reply names no handle and expiry\",\n \"malformed_reply\",\n true,\n );\n }\n return Math.min(r.expires_at, ref.expires_at);\n }\n\n async function publish(\n bytes: string,\n path: string,\n operationId: string,\n trace: TraceIds | undefined,\n ): Promise<unknown> {\n return sp(\n \"publish-file\",\n [\n \"--source\",\n \"-\",\n \"--path\",\n path,\n \"--operation-id\",\n operationId,\n \"--creator\",\n options.creator!,\n \"--ttl-seconds\",\n String(HANDOFF_TTL_S),\n ],\n { trace, stdin: bytes, mutation: true },\n );\n }\n\n // Finish what an earlier call may have left unresolved: a commit or a\n // saved cleanup. This repeats that exact request; it never starts another\n // one. A definite refusal (nothing pending, say) lets the new mutation go\n // ahead, and the CLI refuses that one too if something is still pending.\n async function recover(trace: TraceIds | undefined): Promise<void> {\n if (!mayHavePending) return;\n try {\n await sp(\"recover\", [], { trace, mutation: true });\n } catch (err) {\n if (!(err instanceof ScratchPadError) || err.unknown) throw err;\n }\n mayHavePending = false;\n }\n\n // After a definite refusal of a commit: remove the spool its preparation\n // left in the workspace, which the CLI requires before any other\n // publication. The CLI removes only a spool of this workspace's that no\n // unresolved command protects; one it keeps means the refused command is\n // still pending, and the next mutation recovers it first.\n async function removeRefusedSpool(\n refusal: ScratchPadError,\n trace: TraceIds | undefined,\n ): Promise<void> {\n let why: string;\n try {\n const spool = decodeSpool(await sp(\"spool-remove\", [\"--apply\"], { trace, mutation: true }));\n if (!spool.present || spool.applied) return;\n why = \"the refused publication's spool is protected\";\n } catch (err) {\n if (err instanceof ScratchPadError && err.unknown) throw err;\n why = `its spool was not removed: ${(err as Error).message}`;\n }\n mayHavePending = true;\n throw new ScratchPadError(\n `${refusal.message}; cleanup not started: ${why}`,\n refusal.code,\n false,\n );\n }\n\n // The volume's current slots and state, as the CLI describes them.\n async function volumeView(trace: TraceIds | undefined): Promise<VolumeView> {\n return decodeDescribe(await sp(\"describe\", [], { trace }));\n }\n\n async function commit(text: string, path: string, trace: TraceIds | undefined): Promise<string> {\n if (options.creator === undefined) {\n throw new Error(\n \"ScratchPad: a reference names its creator; this ScratchPad was made without one\",\n );\n }\n const own = await init(trace);\n await recover(trace);\n const operationId = randomUUID();\n let reply: unknown;\n try {\n reply = await publish(text, path, operationId, trace);\n } catch (err) {\n if (err instanceof ScratchPadError && err.unknown) mayHavePending = true;\n if (!(err instanceof ScratchPadError) || err.code !== \"capacity\" || err.unknown) throw err;\n // Full: release expired retention and collect what nothing retains,\n // then the same commit once more, but only when cleanup can make room.\n // The CLI releases only expired retention; a live handoff stays.\n await removeRefusedSpool(err, trace);\n let reason: string | undefined;\n try {\n reason = cleanupCannotHelp(await volumeView(trace));\n } catch (inspect) {\n // Unread, nothing is known about the slots: close nothing.\n throw new ScratchPadError(\n `${err.message}; cleanup not started: ${(inspect as Error).message}`,\n err.code,\n false,\n );\n }\n if (reason !== undefined)\n throw new ScratchPadError(\n `${err.message}; cleanup not started: ${reason}`,\n err.code,\n false,\n );\n try {\n await sp(\"maintain\", [\"--apply\"], { trace, mutation: true });\n } catch (cleanup) {\n // The CLI keeps the unfinished cleanup saved; recover finishes it\n // before the next mutation. An unknown cleanup stays unknown.\n mayHavePending = true;\n const unknown = !(cleanup instanceof ScratchPadError) || cleanup.unknown;\n throw new ScratchPadError(\n `${err.message}; cleanup: ${(cleanup as Error).message}`,\n unknown && cleanup instanceof ScratchPadError\n ? cleanup.code\n : unknown\n ? \"failed\"\n : err.code,\n unknown,\n );\n }\n try {\n reply = await publish(text, path, operationId, trace);\n } catch (again) {\n if (again instanceof ScratchPadError && again.unknown) mayHavePending = true;\n throw again;\n }\n }\n const token = (reply as { reference?: unknown } | null)?.reference;\n if (typeof token !== \"string\" || !isObject((reply as { receipt?: unknown }).receipt)) {\n mayHavePending = true;\n throw new ScratchPadError(\n \"sp publish-file: the reply names no receipt and reference\",\n \"malformed_reply\",\n true,\n );\n }\n const ref = await resolveReference(token, trace);\n if (!ownedBy(ref, own) || ref.path !== path || ref.creator !== options.creator) {\n throw new ScratchPadError(\n \"sp publish-file: the reference names another volume, path or creator\",\n \"malformed_reply\",\n false,\n );\n }\n // Exactly the token the CLI made.\n return token;\n }\n\n async function runGrant(\n args: string[],\n trace: TraceIds | undefined,\n toolCallId: string | undefined,\n ref: Reference,\n ): Promise<number> {\n return grantExpiry(await sp(\"grant\", args, { trace, toolCallId, mutation: true }), ref);\n }\n\n async function grantRead(\n reference: string,\n grantee: Grantee,\n trace: TraceIds | undefined,\n toolCallId: string | undefined,\n kind: GrantKind,\n ): Promise<void> {\n const ref = await resolveReference(reference, trace);\n if (!ownedBy(ref, await describe(trace))) {\n // Only a volume's owner grants on it. Reading someone else's content\n // and granting on a copy would pass on a permission this agent was\n // never given; its creator is asked instead.\n throw new Error(\n \"the reference points into another agent's volume; only its creator can grant read on it\",\n );\n }\n await recover(trace);\n if (pendingGrant !== undefined) {\n // Finish the grant that ended unknown, with its exact arguments,\n // before any other: the CLI refuses a different one meanwhile.\n const earlier = pendingGrant;\n try {\n record(\n earlier.key,\n earlier.kind,\n await runGrant(earlier.args, undefined, undefined, earlier.ref),\n );\n pendingGrant = undefined;\n } catch (err) {\n if (!(err instanceof ScratchPadError) || err.unknown) throw err;\n pendingGrant = undefined;\n }\n }\n const remaining = ref.expires_at - now() - EXPIRY_MARGIN_S;\n const ttl = Math.floor(Math.min(grantTtlS, remaining));\n if (ttl < 1)\n throw new Error(\n \"the reference has expired, or is about to; there is nothing left to grant on\",\n );\n const key = ledgerKey(ref, grantee);\n prune();\n if (!ledger.has(key) && ledger.size >= MAX_LEDGER) {\n // The ledger stays finite. ScratchPad has 16 grant slots too.\n throw new Error(\n `this agent already holds ${MAX_LEDGER} live grants; try again when one expires`,\n );\n }\n const trail = trace ? [\"--thread-id\", trace.threadId, \"--root-id\", trace.rootId] : [];\n if (trace && toolCallId !== undefined) trail.push(\"--tool-call-id\", toolCallId);\n const args = [\n \"--ref\",\n reference,\n \"--grantee-account\",\n grantee.account,\n \"--grantee-user\",\n grantee.user,\n \"--operation-id\",\n randomUUID(),\n \"--ttl-seconds\",\n String(ttl),\n ];\n try {\n record(key, kind, await runGrant(args, trace, toolCallId, ref));\n } catch (err) {\n // Unknown: the grant may exist, but the ledger says nothing until the\n // CLI confirms it. The same arguments, trace labels included, go again\n // before the next grant.\n if (err instanceof ScratchPadError && err.unknown)\n pendingGrant = { args: [...args, ...trail], key, kind, ref };\n throw err;\n }\n }\n\n const pad: ScratchPadClient = {\n commit(text, path, trace) {\n return serialize(() => commit(text, path, trace));\n },\n\n async read(reference, trace) {\n const ref = await resolveReference(reference, trace);\n // An expired reference opens nothing; the CLI would refuse it too.\n if (ref.expires_at <= now()) throw new Error(\"the reference has expired\");\n const got = await sp<{ data_base64?: unknown; bytes?: unknown }>(\n \"read\",\n [\"--ref\", reference],\n {\n trace,\n maxStdout: MAX_READ_STDOUT,\n },\n );\n const { data_base64: data, bytes } = got ?? {};\n if (\n typeof data !== \"string\" ||\n !BASE64_RE.test(data) ||\n !Number.isSafeInteger(bytes) ||\n (bytes as number) > MAX_READ_BYTES\n ) {\n throw new ScratchPadError(\"sp read: the reply carries no data\", \"malformed_reply\", false);\n }\n const raw = Buffer.from(data, \"base64\");\n if (raw.length !== bytes || raw.toString(\"base64\") !== data) {\n throw new ScratchPadError(\n \"sp read: the data does not match its length\",\n \"malformed_reply\",\n false,\n );\n }\n try {\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(raw);\n } catch {\n throw new Error(\"the referenced file is not UTF-8 text\");\n }\n },\n\n resolveReference,\n\n async owns(reference) {\n // A token that does not decode is nobody's. An agent that has\n // committed nothing yet has no volume, and owns nothing; asking never\n // creates one. The port passes no thread; inside a served prompt the\n // question still goes on that prompt's thread.\n let ref: Reference;\n try {\n ref = await resolveReference(reference);\n } catch {\n return false;\n }\n return ownedBy(ref, await describe(activeTrace()));\n },\n\n grantRead(reference, grantee, trace, toolCallId, kind = \"first-hand\") {\n return serialize(() => grantRead(reference, grantee, trace, toolCallId, kind));\n },\n\n granted(reference, grantee) {\n const find = (ref: Reference): GrantKind | undefined => {\n if (!ownedBy(ref, binding)) return undefined;\n const until = ledger.get(ledgerKey(ref, grantee)),\n t = now();\n if ((until?.[\"first-hand\"] ?? 0) > t) return \"first-hand\";\n if ((until?.[\"on-request\"] ?? 0) > t) return \"on-request\";\n return undefined;\n };\n if (reference.startsWith(SHORT_REFERENCE_PREFIX))\n return resolveReference(reference).then(find, () => undefined);\n try {\n return find(decodeReference(reference));\n } catch {\n return undefined;\n }\n },\n };\n return pad;\n}\n\n/** The variables {@link scratchPadFromEnv} reads. */\nexport const SCRATCHPAD_VOLUME_VAR = \"SCRATCHPAD_VOLUME\";\nexport const SCRATCHPAD_BIN_VAR = \"SCRATCHPAD_BIN\";\nexport const SCRATCHPAD_DIR_VAR = \"SCRATCHPAD_DIR\";\nexport const SCRATCHPAD_GRANT_TTL_S_VAR = \"SCRATCHPAD_GRANT_TTL_S\";\n\n/** What {@link scratchPadFromEnv} takes besides the environment. */\nexport interface ScratchPadFromEnvOptions {\n /** This agent's prompt address, written into every reference it makes. */\n readonly creator?: string;\n /**\n * The agent's connection source, when it is not the environment's\n * `NATS_CONTEXT`, or `NATS_CREDS` with `NATS_URL`.\n */\n readonly nats?: NatsConnectionSource;\n}\n\n/**\n * The agent's ScratchPad as the environment configures it, or `undefined`\n * when `SCRATCHPAD_VOLUME` is unset: ScratchPad off. Reads\n * `SCRATCHPAD_VOLUME`, `SCRATCHPAD_BIN`, `SCRATCHPAD_DIR` and\n * `SCRATCHPAD_GRANT_TTL_S`, and, unless `options.nats` is given, the\n * connection the agent's own configuration reads: `NATS_CREDS` with\n * `NATS_URL` (default `nats://127.0.0.1:4222`), or `NATS_CONTEXT`, which\n * `sp` cannot use. An empty variable counts as unset. Throws for a grant TTL\n * that is not a positive number, and, like {@link spCliScratchPad}, for a\n * connection `sp` cannot use: a NATS context without credentials, or no\n * credentials at all.\n */\nexport function scratchPadFromEnv(\n env: Readonly<Record<string, string | undefined>> = process.env,\n options: ScratchPadFromEnvOptions = {},\n): ScratchPadClient | undefined {\n const optional = (name: string): string | undefined => {\n const value = env[name];\n return value === undefined || value === \"\" ? undefined : value;\n };\n const volume = optional(SCRATCHPAD_VOLUME_VAR);\n if (volume === undefined) return undefined;\n const ttl = optional(SCRATCHPAD_GRANT_TTL_S_VAR);\n let grantTtlS: number | undefined;\n if (ttl !== undefined) {\n grantTtlS = Number(ttl);\n if (!Number.isFinite(grantTtlS) || grantTtlS <= 0) {\n throw new Error(`${SCRATCHPAD_GRANT_TTL_S_VAR} must be a positive number, got \"${ttl}\"`);\n }\n }\n const context = optional(\"NATS_CONTEXT\");\n const creds = optional(\"NATS_CREDS\");\n const url = optional(\"NATS_URL\") ?? \"nats://127.0.0.1:4222\";\n // `sp` reads no NATS context: the credentials file, when there is one,\n // even beside a context, and otherwise the context, which is refused.\n const nats: NatsConnectionSource =\n options.nats ??\n (creds !== undefined ? { url, creds } : context !== undefined ? { context } : { url });\n const bin = optional(SCRATCHPAD_BIN_VAR);\n const dir = optional(SCRATCHPAD_DIR_VAR);\n return spCliScratchPad({\n volume,\n nats,\n ...(bin !== undefined ? { bin } : {}),\n ...(dir !== undefined ? { dir } : {}),\n ...(grantTtlS !== undefined ? { grantTtlS } : {}),\n ...(options.creator !== undefined ? { creator: options.creator } : {}),\n });\n}\n","// The `409` loop guard (the fabric's design of the agent tools, §2.3). A\n// harness serves one turn at a time and cannot serve a prompt while its\n// model waits inside a call to another agent, so a prompt of a tree the\n// harness is waiting in would wait until the turn ends, which is never when\n// the turn is what it waits for. The guard refuses such a prompt at once\n// with `409` instead.\n//\n// A served request is *waiting* from the moment its model sends a prompt to\n// another agent until every call it has open has settled — completed,\n// failed, cancelled or expired:\n//\n// - a blocking `prompt_agent`: from its send until it returns;\n// - a call started with `wait: false`: for as long as it is open, since\n// the model may `wait_agent` on it at any moment;\n// - no open call: not waiting, and a prompt of the tree is admitted.\n//\n// Built from the SDK's two hooks, the add-ons' `aroundToolCall` and the\n// fabric's scope, nothing else:\n//\n// - the request interceptor, placed after the fabric's tracing interceptor\n// so it runs inside the scope tracing bound, keeps the served request by\n// that scope object for the handler's duration; an arriving request\n// whose root a served request is waiting in is refused before `next()`\n// — the caller gets no ack and a §9 error with code 409;\n// - the prompt interceptor, on the plugin's `Agents` client, runs in the\n// async context `prompt()` was called in — the tool call's, which the\n// add-on binds to the served request's scope — and marks that request\n// as waiting;\n// - `aroundToolCall`, which the add-on calls around every agent-tool call\n// of the served request, lifts the mark when a tool result says no call\n// is open (`AgentTools` puts `open_calls` on every result while one is)\n// and no other agent-tool call of the request is still running;\n// - the marks live no longer than the served request: its entry is\n// removed when `next()` settles.\n//\n// The mark falls at a tool result, so a call that settles while the model\n// runs no agent tool — one started with `wait: false` that fails or expires\n// meanwhile — keeps it until the model's next agent-tool result or the end\n// of the served request, whichever comes first. `AgentTools` asks the model\n// to collect its open calls before it answers, and ends them with the\n// served prompt; how long a call can stay open is its own runtime limit.\n//\n// A result the guard cannot read — a tool call that threw, or a wrapper that\n// returned something other than the tool's result object — leaves the mark\n// as it was: refusing a prompt the harness could have served costs the\n// caller a retry, admitting one it cannot serve costs both sides the wait.\n//\n// The root is read from the scope tracing bound, never from the envelope:\n// tracing already validated and adopted (or minted) it, so the guard sees\n// one value with one meaning. Without tracing's interceptor before it the\n// guard sees no scope and admits everything.\n//\n// Stated honestly: the guard refuses a legitimate second prompt of the same\n// tree that arrives while the harness waits in it, a sibling delegation the\n// same coordinator issues with `wait: false`. The harness serves one turn at\n// a time anyway, so that prompt would have queued behind the wait; the guard\n// turns the queue into a refusal the caller sees at once.\n//\n// For the harness add-ons under `plugins/`, every one of which returns the\n// guard's two interceptors after tracing's and calls its `aroundToolCall`\n// in its own. TypeScript only: the plugins are, and the guard puts nothing\n// on the wire but the SDK's §9 error.\n\nimport { RequestRejectedError, type RequestInterceptor } from \"@synadia-ai/agent-service\";\nimport type { PromptInterceptor } from \"@synadia-ai/agents\";\nimport { activeTrace, type TraceScope } from \"./trace.js\";\n\n/** The §9 code the guard refuses with. */\nexport const LOOP_GUARD_CODE = 409;\n\n/** The description the refused caller sees, for `rootId`. */\nexport function loopGuardDescription(rootId: string): string {\n return (\n `the agent's model is waiting inside a prompt of this tree (root ${rootId}); ` +\n \"a prompt of the same tree cannot be served until that call returns\"\n );\n}\n\ninterface Served {\n readonly rootId: string;\n /** Set by a prompt sent from the request; lifted when its calls have settled. */\n waiting: boolean;\n /** The request's agent-tool calls still running. */\n running: number;\n /** The open calls the last readable tool result counted. */\n open: number;\n}\n\nexport interface LoopGuard {\n /** For the service, after the fabric's tracing interceptor. */\n readonly requestInterceptor: RequestInterceptor;\n /** For the plugin's client, next to the fabric's prompt interceptor. */\n readonly promptInterceptor: PromptInterceptor;\n /**\n * For the add-on's `aroundToolCall`: runs `run` once, synchronously, and\n * returns its value untouched, a promise included. `scope` is the served\n * request's, the one tracing bound around its handler; with another or\n * none the call is only run.\n */\n aroundToolCall<T>(scope: TraceScope | undefined, run: () => T): T;\n /** `true` while a served request of tree `rootId` is open. */\n serving(rootId: string): boolean;\n /** `true` while a served request of tree `rootId` waits on a call it made. */\n waiting(rootId: string): boolean;\n}\n\n/** `open_calls` of an `AgentTools` result: `0` when absent, `undefined` when unreadable. */\nfunction openCalls(result: unknown): number | undefined {\n if (typeof result !== \"object\" || result === null || Array.isArray(result)) return undefined;\n const open = (result as { open_calls?: unknown }).open_calls;\n if (open === undefined) return 0;\n return typeof open === \"number\" && Number.isInteger(open) && open >= 0 ? open : undefined;\n}\n\nfunction isThenable(value: unknown): value is PromiseLike<unknown> {\n return (\n (typeof value === \"object\" || typeof value === \"function\") &&\n value !== null &&\n typeof (value as { then?: unknown }).then === \"function\"\n );\n}\n\nexport function loopGuard(): LoopGuard {\n // Every open served request, by the scope object tracing bound around its\n // handler — the same object `aroundToolCall` rebinds, so a prompt sent\n // from the tool call finds its request here — and by root for the check.\n const byScope = new Map<TraceScope, Served>();\n const byRoot = new Map<string, Set<Served>>();\n\n const waiting = (rootId: string): boolean => {\n const entries = byRoot.get(rootId);\n if (entries === undefined) return false;\n for (const entry of entries) if (entry.waiting) return true;\n return false;\n };\n\n // One agent-tool call of `entry` has ended, with `result` when it returned.\n const toolCallEnded = (entry: Served, returned: boolean, result?: unknown): void => {\n entry.running -= 1;\n const open = returned ? openCalls(result) : undefined;\n if (open === undefined) return;\n entry.open = open;\n if (entry.running === 0 && entry.open === 0) entry.waiting = false;\n };\n\n return {\n requestInterceptor: {\n async aroundRequest(_ctx, next) {\n const scope = activeTrace();\n if (scope === undefined) {\n // No tracing before this interceptor: nothing to key on, nothing to guard.\n await next();\n return;\n }\n const { rootId } = scope;\n if (waiting(rootId)) {\n throw new RequestRejectedError(LOOP_GUARD_CODE, loopGuardDescription(rootId));\n }\n const entry: Served = { rootId, waiting: false, running: 0, open: 0 };\n byScope.set(scope, entry);\n let ofRoot = byRoot.get(rootId);\n if (ofRoot === undefined) byRoot.set(rootId, (ofRoot = new Set()));\n ofRoot.add(entry);\n try {\n await next();\n } finally {\n byScope.delete(scope);\n ofRoot.delete(entry);\n if (ofRoot.size === 0) byRoot.delete(rootId);\n }\n },\n },\n promptInterceptor: {\n beforePrompt() {\n // The scope in the tool call's context is the served request's own\n // object; a prompt from any other context marks nothing.\n const scope = activeTrace();\n const entry = scope === undefined ? undefined : byScope.get(scope);\n if (entry !== undefined) entry.waiting = true;\n },\n },\n aroundToolCall(scope, run) {\n const entry = scope === undefined ? undefined : byScope.get(scope);\n if (entry === undefined) return run();\n entry.running += 1;\n let value: ReturnType<typeof run>;\n try {\n value = run();\n } catch (err) {\n toolCallEnded(entry, false);\n throw err;\n }\n if (isThenable(value)) {\n void value.then(\n (result) => toolCallEnded(entry, true, result),\n () => toolCallEnded(entry, false),\n );\n } else {\n toolCallEnded(entry, true, value);\n }\n return value;\n },\n serving: (rootId) => byRoot.has(rootId),\n waiting,\n };\n}\n","import { headers } from \"@nats-io/nats-core\";\nimport type { Msg, NatsConnection } from \"@nats-io/nats-core\";\nimport { verifyObject } from \"./codec\";\nimport { NativeScratchPadError, failed, invalid } from \"./errors\";\nimport * as p from \"./protocol\";\nimport * as r from \"./references\";\n\nexport interface RequestOptions {\n signal?: AbortSignal;\n}\nexport interface TransportOptions {\n timeoutMs?: number;\n}\n\nfunction pathRequest(v: Record<string, unknown>): void {\n p.validateTarget(v.target);\n p.validateContentID(v.root);\n p.validatePath(v.path);\n p.validateTrace(v.trace);\n}\nfunction validateRequest(verb: string, value: unknown): void {\n switch (verb) {\n case \"reference.info\":\n case \"info\":\n p.validateEmpty(value);\n return;\n case \"volume.create\": {\n const v = p.record(value, [\"volume\", \"action\"]);\n p.validateVolume(v.volume);\n p.validateAction(v.action);\n return;\n }\n case \"volume.get\": {\n const v = p.record(value, [\"target\"]);\n p.validateTarget(v.target);\n return;\n }\n case \"object.prepare\": {\n const v = p.record(value, [\"target\", \"objects\"]);\n p.validateTarget(v.target);\n p.check(\n Array.isArray(v.objects) &&\n v.objects.length > 0 &&\n v.objects.length <= p.MAX_PREPARE_OBJECTS,\n \"invalid preparation count\",\n );\n const seen = new Set<string>();\n for (const raw of v.objects) {\n p.validateObjectSpec(raw);\n const key = raw.object.kind + \":\" + raw.object.id;\n p.check(!seen.has(key), \"duplicate preparation object\");\n seen.add(key);\n }\n return;\n }\n case \"object.verify\": {\n const v = p.record(value, [\"target\", \"epoch\", \"objects\"]);\n p.validateTarget(v.target);\n p.uint(v.epoch);\n p.check(\n Array.isArray(v.objects) &&\n v.objects.length > 0 &&\n v.objects.length <= p.MAX_PREPARE_OBJECTS,\n \"invalid verification count\",\n );\n const seen = new Set<string>();\n for (const raw of v.objects) {\n p.validateContentObject(raw);\n const key = raw.kind + \":\" + raw.id;\n p.check(!seen.has(key), \"duplicate verification object\");\n seen.add(key);\n }\n return;\n }\n case \"object.put\": {\n const v = p.record(value, [\"target\", \"object\", \"epoch\"]);\n p.validateTarget(v.target);\n p.validateContentObject(v.object);\n p.uint(v.epoch);\n return;\n }\n case \"reference.retain\":\n r.validateReferenceRetainRequest(value);\n return;\n case \"reference.publish\":\n case \"reference.receipt\":\n r.validateReferencePublishRequest(value);\n return;\n case \"reference.resolve\":\n case \"reference.stat\": {\n const v = p.record(value, [\"reference\", \"trace\"]);\n p.text(v.reference, r.SHORT_REFERENCE_BYTES, r.SHORT_REFERENCE_BYTES);\n r.decodeShortReference(v.reference);\n p.validateTrace(v.trace);\n return;\n }\n case \"checkpoint.publish\": {\n const v = p.record(value, [\"target\", \"command\"]);\n p.validateTarget(v.target);\n p.validateCommand(v.command);\n p.check(\n v.target.creation_id === v.command.creation_id,\n \"command names another creation identity\",\n );\n return;\n }\n case \"writer.reset\": {\n const v = p.record(value, [\"target\", \"writer\"]);\n p.validateTarget(v.target);\n p.validateWriter(v.writer);\n return;\n }\n case \"root.retain\": {\n const v = p.record(value, [\"target\", \"slot\", \"generation\", \"root\", \"until\", \"action\"]);\n p.validateTarget(v.target);\n p.uint(v.slot, p.RETENTION_SLOTS - 1);\n p.uint(v.generation);\n p.validateContentID(v.root);\n p.uint(v.until);\n p.validateAction(v.action);\n return;\n }\n case \"root.release\": {\n const v = p.record(value, [\"target\", \"handle\"]);\n p.validateTarget(v.target);\n p.validateRetentionHandle(v.handle);\n return;\n }\n case \"grant.issue\": {\n const v = p.record(value, [\n \"target\",\n \"slot\",\n \"generation\",\n \"principal\",\n \"root\",\n \"path\",\n \"retention\",\n \"until\",\n \"action\",\n ]);\n p.validateTarget(v.target);\n p.uint(v.slot, p.GRANT_SLOTS - 1);\n p.uint(v.generation);\n p.validatePrincipal(v.principal);\n p.validateContentID(v.root);\n p.validatePath(v.path, 256);\n p.validateRetentionHandle(v.retention);\n p.uint(v.until, undefined, 1);\n p.validateAction(v.action);\n return;\n }\n case \"grant.revoke\": {\n const v = p.record(value, [\"target\", \"handle\", \"action\"]);\n p.validateTarget(v.target);\n p.validateGrantHandle(v.handle);\n p.validateAction(v.action);\n return;\n }\n case \"content.stat\": {\n const v = p.record(value, [\"target\", \"root\", \"path\", \"trace\"]);\n pathRequest(v);\n return;\n }\n case \"content.read\": {\n const v = p.record(value, [\"target\", \"root\", \"path\", \"trace\", \"offset\", \"length\"]);\n pathRequest(v);\n p.uint(v.offset);\n p.uint(v.length, p.MAX_READ_BYTES, 1);\n return;\n }\n case \"content.list\": {\n const v = p.record(value, [\"target\", \"root\", \"path\", \"trace\", \"offset\", \"limit\"]);\n pathRequest(v);\n p.uint(v.offset, 0xffffffff);\n p.uint(v.limit, 64, 1);\n return;\n }\n case \"maintenance.close\":\n case \"maintenance.plan\":\n case \"maintenance.apply\": {\n const v = p.record(value, [\"target\", \"revision\"]);\n p.validateTarget(v.target);\n p.uint(v.revision, undefined, 1);\n return;\n }\n default:\n throw invalid(\"unknown ScratchPad verb\");\n }\n}\n\n/** One request per operation on a borrowed NATS connection. No retry or identity override. */\nexport class ScratchPadTransport {\n readonly timeoutMs: number;\n constructor(\n private readonly nc: NatsConnection,\n options: TransportOptions = {},\n ) {\n p.check(nc && !nc.isClosed() && !nc.isDraining(), \"an open NATS connection is required\");\n p.check(nc.info?.headers === true, \"NATS header support is required\");\n p.check(\n (nc.info?.max_payload ?? 0) >= p.MAX_NODE_BYTES + p.MAX_HEADER_BYTES,\n \"NATS max_payload cannot carry the largest canonical object\",\n );\n this.timeoutMs = options.timeoutMs ?? 10000;\n p.uint(this.timeoutMs, 5 * 60 * 1000, 1);\n }\n\n private async within<T>(work: Promise<T>, deadline: number, signal?: AbortSignal): Promise<T> {\n // Attach a rejection observer even if cancellation wins before the race.\n void work.catch(() => {});\n if (signal?.aborted) throw signal.reason ?? new Error(\"operation cancelled\");\n const remaining = deadline - performance.now();\n if (remaining <= 0) throw new Error(\"request deadline exceeded\");\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => {\n cleanup();\n reject(new Error(\"request deadline exceeded\"));\n }, remaining);\n const cancel = (): void => {\n cleanup();\n const cause: unknown = signal?.reason;\n reject(cause instanceof Error ? cause : new Error(\"operation cancelled\", { cause }));\n };\n const cleanup = (): void => {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", cancel);\n };\n signal?.addEventListener(\"abort\", cancel, { once: true });\n void work.then(\n (value) => {\n cleanup();\n resolve(value);\n },\n (error: unknown) => {\n cleanup();\n reject(error instanceof Error ? error : new Error(\"request failed\", { cause: error }));\n },\n );\n });\n }\n\n private async exchange(\n verb: string,\n body: Uint8Array,\n mutation: boolean,\n ranged: boolean,\n options: RequestOptions,\n metadata?: string,\n ): Promise<{ metadata: p.ReplyMetadata; body: Uint8Array }> {\n let headerBytes = 0;\n const requestHeaders = metadata === undefined ? undefined : headers();\n if (metadata !== undefined) {\n headerBytes = 12 + Buffer.byteLength(p.METADATA_HEADER) + 4 + Buffer.byteLength(metadata);\n p.check(\n headerBytes <= p.MAX_HEADER_BYTES && !/[\\r\\n\\0]/.test(metadata),\n \"invalid request header\",\n );\n requestHeaders!.set(p.METADATA_HEADER, metadata);\n }\n p.check(\n body.length + headerBytes <= (this.nc.info?.max_payload ?? 0),\n \"request exceeds NATS payload bound\",\n );\n const deadline = performance.now() + this.timeoutMs;\n // The public JS NATS API cannot disable reconnect buffering. A failed\n // flush has sent no application request. After request(), every missing\n // reply remains unknown; the workflow must preserve the original intent.\n try {\n if (options.signal?.aborted || this.nc.isClosed() || this.nc.isDraining())\n throw new Error(\"connection or signal closed before transmission\");\n await this.within(this.nc.flush(), deadline, options.signal);\n if (options.signal?.aborted || this.nc.isClosed() || this.nc.isDraining())\n throw new Error(\"connection or signal closed before transmission\");\n if (deadline <= performance.now()) throw new Error(\"deadline ended before transmission\");\n p.check(this.nc.info?.headers === true, \"NATS header support is required\");\n p.check(\n body.length + headerBytes <= (this.nc.info?.max_payload ?? 0),\n \"request exceeds current NATS payload bound\",\n );\n } catch (cause) {\n throw new NativeScratchPadError(\"unavailable\", \"request not transmitted\", {\n local: true,\n cause,\n });\n }\n let reply: Msg;\n try {\n const request = this.nc.request(p.SUBJECT_PREFIX + verb, body, {\n timeout: Math.max(1, Math.ceil(deadline - performance.now())),\n ...(requestHeaders === undefined ? {} : { headers: requestHeaders }),\n });\n reply = await this.within(request, deadline, options.signal);\n } catch (cause) {\n throw new NativeScratchPadError(\n mutation ? \"unknown\" : \"unavailable\",\n \"request returned no trustworthy reply\",\n { unknown: mutation, cause },\n );\n }\n try {\n let count = 0,\n size = 12,\n value = \"\";\n for (const [key, values] of reply.headers ?? []) {\n for (const item of values) size += Buffer.byteLength(key) + 4 + Buffer.byteLength(item);\n if (key.toLowerCase() === p.REPLY_HEADER.toLowerCase()) {\n count += values.length;\n value = values[0] ?? \"\";\n }\n }\n p.check(\n size <= p.MAX_HEADER_BYTES && count === 1,\n \"reply must have one bounded ScratchPad-Reply header\",\n );\n const meta = p.parseStrictJSON(value, p.MAX_HEADER_BYTES);\n p.validateReplyMetadata(meta);\n if (meta.code !== \"ok\") {\n p.check(reply.data.length === 0, \"error reply has a body\");\n throw new NativeScratchPadError(meta.code, meta.message, {\n unknown: mutation && [\"unknown\", \"unavailable\", \"internal\"].includes(meta.code),\n });\n }\n p.check(ranged === (meta.range !== undefined), \"reply range does not match verb\");\n p.check(\n reply.data.length <= (ranged ? p.MAX_READ_BYTES : p.MAX_REPLY_BYTES),\n \"reply body exceeds bound\",\n );\n return { metadata: meta, body: reply.data };\n } catch (cause) {\n if (cause instanceof NativeScratchPadError && !cause.local) throw cause;\n throw failed(mutation, \"reply metadata is malformed\", cause);\n }\n }\n\n private async control<T>(\n verb: string,\n request: unknown,\n validate: p.Validator<T>,\n mutation: boolean,\n options: RequestOptions,\n ): Promise<T> {\n validateRequest(verb, request);\n const body = Buffer.from(p.goJSON(request));\n p.check(body.length <= p.MAX_CONTROL_BYTES, \"control request exceeds bound\");\n const reply = await this.exchange(verb, body, mutation, false, options);\n try {\n const result = p.parseStrictJSON(reply.body, p.MAX_REPLY_BYTES);\n validate(result);\n return result;\n } catch (cause) {\n throw failed(mutation, \"reply body is malformed\", cause);\n }\n }\n private matching(condition: boolean, mutation: boolean, detail: string): void {\n if (!condition) throw failed(mutation, detail);\n }\n private async view(\n verb: string,\n target: p.Target,\n request: unknown,\n mutation: boolean,\n options: RequestOptions,\n ): Promise<p.VolumeView> {\n const result = await this.control(verb, request, p.validateVolumeView, mutation, options);\n this.matching(\n p.sameValue(result.target, target),\n mutation,\n \"reply names another volume incarnation\",\n );\n return result;\n }\n\n info(options: RequestOptions = {}): Promise<p.Info> {\n return this.control(\"info\", {}, p.validateInfo, false, options);\n }\n async createVolume(\n request: p.CreateRequest,\n options: RequestOptions = {},\n ): Promise<p.VolumeView> {\n const expected = structuredClone(request);\n const result = await this.control(\n \"volume.create\",\n expected,\n p.validateVolumeView,\n true,\n options,\n );\n this.matching(result.target.volume === expected.volume, true, \"reply names another volume\");\n return result;\n }\n getVolume(target: p.Target, options: RequestOptions = {}): Promise<p.VolumeView> {\n const expected = structuredClone(target);\n return this.view(\"volume.get\", expected, { target: expected }, false, options);\n }\n async prepare(request: p.PrepareRequest, options: RequestOptions = {}): Promise<p.PrepareResult> {\n const expected = structuredClone(request);\n const result = await this.control(\n \"object.prepare\",\n expected,\n p.validatePrepareResult,\n true,\n options,\n );\n this.matching(\n result.objects.length === expected.objects.length &&\n result.objects.every(\n (progress, index) =>\n p.sameValue(progress.object, expected.objects[index]!.object) &&\n progress.length === expected.objects[index]!.length,\n ),\n true,\n \"preparation reply names other objects\",\n );\n return result;\n }\n async putPrepared(\n request: p.PutRequest,\n data: Uint8Array,\n options: RequestOptions = {},\n ): Promise<void> {\n const expected = structuredClone(request),\n bytes = Uint8Array.from(data);\n validateRequest(\"object.put\", expected);\n p.check(bytes.length > 0 && bytes.length <= p.MAX_NODE_BYTES, \"object bytes exceed bound\");\n try {\n verifyObject(expected.object, bytes);\n } catch (cause) {\n throw invalid(\"object bytes differ from canonical identity\", cause);\n }\n const reply = await this.exchange(\n \"object.put\",\n bytes,\n true,\n false,\n options,\n p.goJSON(expected),\n );\n try {\n p.validateEmpty(p.parseStrictJSON(reply.body, p.MAX_REPLY_BYTES));\n } catch (cause) {\n throw failed(true, \"put reply body is malformed\", cause);\n }\n }\n async verify(request: p.VerifyRequest, options: RequestOptions = {}): Promise<p.VerifyResult> {\n const expected = structuredClone(request);\n const result = await this.control(\n \"object.verify\",\n expected,\n p.validateVerifyResult,\n true,\n options,\n );\n this.matching(\n result.epoch === expected.epoch &&\n result.objects.length === expected.objects.length &&\n result.objects.every((progress, index) =>\n p.sameValue(progress.object, expected.objects[index]),\n ),\n true,\n \"verification reply names other objects or epoch\",\n );\n return result;\n }\n async publish(request: p.PublishRequest, options: RequestOptions = {}): Promise<p.Receipt> {\n const expected = structuredClone(request);\n const result = await this.control(\n \"checkpoint.publish\",\n expected,\n p.validateReceipt,\n true,\n options,\n );\n const normalize = (command: p.Command): p.Command => ({\n ...command,\n trace: Object.fromEntries(Object.entries(command.trace).filter(([, value]) => value !== \"\")),\n });\n this.matching(\n result.volume === expected.target.volume &&\n p.sameValue(normalize(result.command), normalize(expected.command)),\n true,\n \"receipt names another command\",\n );\n return result;\n }\n /** Unknown reference verbs on older services return invalid. Other failures propagate. */\n async referenceInfo(options: RequestOptions = {}): Promise<r.ReferenceCapabilities | undefined> {\n try {\n return await this.control(\n \"reference.info\",\n {},\n r.validateReferenceCapabilities,\n false,\n options,\n );\n } catch (error) {\n if (\n error instanceof NativeScratchPadError &&\n error.code === \"invalid\" &&\n !error.local &&\n !error.unknown\n )\n return undefined;\n throw error;\n }\n }\n private async referencePublication(\n verb: \"reference.publish\" | \"reference.receipt\",\n request: r.ReferencePublishRequest,\n options: RequestOptions,\n ): Promise<r.ReferencePublishResult> {\n const expected = structuredClone(request),\n mutation = verb === \"reference.publish\";\n const result = await this.control(\n verb,\n expected,\n r.validateReferencePublishResult,\n mutation,\n options,\n );\n this.matching(\n result.receipt.volume === expected.target.volume &&\n p.sameValue(\n {\n ...result.receipt.command,\n trace: Object.fromEntries(\n Object.entries(result.receipt.command.trace).filter(([, value]) => value !== \"\"),\n ),\n },\n {\n ...expected.command,\n trace: Object.fromEntries(\n Object.entries(expected.command.trace).filter(([, value]) => value !== \"\"),\n ),\n },\n ) &&\n result.references.length === expected.reference.paths.length &&\n result.references.every(\n (pair, index) =>\n pair.expanded.creator === expected.reference.creator &&\n pair.expanded.path === expected.reference.paths[index],\n ),\n mutation,\n \"referenced receipt names another intent\",\n );\n return result;\n }\n referencePublish(\n request: r.ReferencePublishRequest,\n options: RequestOptions = {},\n ): Promise<r.ReferencePublishResult> {\n return this.referencePublication(\"reference.publish\", request, options);\n }\n referenceReceipt(\n request: r.ReferencePublishRequest,\n options: RequestOptions = {},\n ): Promise<r.ReferencePublishResult> {\n return this.referencePublication(\"reference.receipt\", request, options);\n }\n async referenceResolve(\n request: r.ReferenceResolveRequest,\n options: RequestOptions = {},\n ): Promise<r.ResolvedReference> {\n const expected = structuredClone(request);\n const result = await this.control(\n \"reference.resolve\",\n expected,\n r.validateResolvedReference,\n false,\n options,\n );\n this.matching(result.short === expected.reference, false, \"resolution names another reference\");\n return result;\n }\n async referenceStat(\n request: r.ReferenceResolveRequest,\n options: RequestOptions = {},\n ): Promise<r.ReferenceStatResult> {\n const expected = structuredClone(request);\n const result = await this.control(\n \"reference.stat\",\n expected,\n r.validateReferenceStatResult,\n false,\n options,\n );\n this.matching(\n result.reference.short === expected.reference,\n false,\n \"stat names another reference\",\n );\n return result;\n }\n async referenceRetain(\n request: r.ReferenceRetainRequest,\n options: RequestOptions = {},\n ): Promise<r.ReferenceRetainResult> {\n const expected = structuredClone(request),\n retain = expected.retain;\n const result = await this.control(\n \"reference.retain\",\n expected,\n r.validateReferenceRetainResult,\n true,\n options,\n );\n this.matching(\n p.sameValue(result.volume.target, retain.target) &&\n result.references.length === expected.reference.paths.length &&\n result.references.every(\n (pair, index) =>\n pair.expanded.creator === expected.reference.creator &&\n pair.expanded.path === expected.reference.paths[index] &&\n pair.expanded.root === retain.root &&\n pair.expanded.expires_at === retain.until &&\n pair.expanded.retention.slot === retain.slot &&\n pair.expanded.retention.generation === retain.generation + 1,\n ),\n true,\n \"retained references name another intent\",\n );\n return result;\n }\n async resetWriter(\n target: p.Target,\n writer: p.Writer,\n options: RequestOptions = {},\n ): Promise<p.Writer> {\n const expected = structuredClone({ target, writer });\n const result = await this.control(\"writer.reset\", expected, p.validateWriter, true, options);\n this.matching(\n result.slot === expected.writer.slot && result.generation > expected.writer.generation,\n true,\n \"reset reply names another writer generation\",\n );\n return result;\n }\n retain(request: p.RetainRequest, options: RequestOptions = {}): Promise<p.VolumeView> {\n const expected = structuredClone(request);\n return this.view(\"root.retain\", expected.target, expected, true, options);\n }\n release(request: p.ReleaseRequest, options: RequestOptions = {}): Promise<p.VolumeView> {\n const expected = structuredClone(request);\n return this.view(\"root.release\", expected.target, expected, true, options);\n }\n async issueGrant(\n request: p.GrantIssueRequest,\n options: RequestOptions = {},\n ): Promise<p.GrantHandle> {\n const expected = structuredClone(request);\n const result = await this.control(\n \"grant.issue\",\n expected,\n p.validateGrantHandle,\n true,\n options,\n );\n this.matching(\n result.slot === expected.slot && result.generation > expected.generation,\n true,\n \"grant reply names another slot generation\",\n );\n return result;\n }\n revokeGrant(request: p.RevokeRequest, options: RequestOptions = {}): Promise<p.VolumeView> {\n const expected = structuredClone(request);\n return this.view(\"grant.revoke\", expected.target, expected, true, options);\n }\n stat(request: p.PathRequest, options: RequestOptions = {}): Promise<p.Stat> {\n return this.control(\"content.stat\", structuredClone(request), p.validateStat, false, options);\n }\n async list(request: p.ListRequest, options: RequestOptions = {}): Promise<p.ListResult> {\n const expected = structuredClone(request);\n const result = await this.control(\n \"content.list\",\n expected,\n p.validateListResult,\n false,\n options,\n );\n this.matching(\n result.entries.length <= expected.limit &&\n result.next === expected.offset + result.entries.length,\n false,\n \"list result differs from requested window\",\n );\n return result;\n }\n async read(request: p.ReadRequest, options: RequestOptions = {}): Promise<p.ReadResult> {\n const expected = structuredClone(request);\n validateRequest(\"content.read\", expected);\n const data = Buffer.from(p.goJSON(expected));\n p.check(data.length <= p.MAX_CONTROL_BYTES, \"read request exceeds bound\");\n const reply = await this.exchange(\"content.read\", data, false, true, options),\n range = reply.metadata.range!;\n this.matching(\n range.offset === expected.offset &&\n range.length === Math.min(expected.length, range.stat.size - range.offset) &&\n reply.body.length === range.length,\n false,\n \"range result differs from request\",\n );\n return { stat: range.stat, offset: range.offset, data: reply.body };\n }\n closeVolume(request: p.MaintenanceRequest, options: RequestOptions = {}): Promise<p.VolumeView> {\n const expected = structuredClone(request);\n return this.view(\"maintenance.close\", expected.target, expected, true, options);\n }\n planCollection(\n request: p.MaintenanceRequest,\n options: RequestOptions = {},\n ): Promise<p.CollectionReport> {\n return this.control(\n \"maintenance.plan\",\n structuredClone(request),\n p.validateCollectionReport,\n false,\n options,\n );\n }\n async applyCollection(\n request: p.MaintenanceRequest,\n options: RequestOptions = {},\n ): Promise<p.CollectionResult> {\n const expected = structuredClone(request);\n const result = await this.control(\n \"maintenance.apply\",\n expected,\n p.validateCollectionResult,\n true,\n options,\n );\n this.matching(\n p.sameValue(result.volume.target, expected.target),\n true,\n \"collection names another volume incarnation\",\n );\n return result;\n }\n}\n","import { createHash } from \"node:crypto\";\nimport type { NatsConnection } from \"@nats-io/nats-core\";\nimport type { TraceIds } from \"../scratchpad\";\nimport { chunkID, decodeReference, encodeFileObject, fileObjectID } from \"./codec\";\nimport type { ChunkRef, Reference } from \"./codec\";\nimport { NativeScratchPadError } from \"./errors\";\nimport { check, CHUNK_SIZE, MAX_VOLUME_BYTES, sameValue, uint, validateTrace } from \"./protocol\";\nimport type { PathRequest, Principal, Stat, Trace } from \"./protocol\";\nimport { ScratchPadTransport } from \"./transport\";\nimport { SHORT_REFERENCE_PREFIX, decodeShortReference, type ResolvedReference } from \"./references\";\n\nexport const DEFAULT_READ_LIMIT_BYTES = 16 * 1024 * 1024;\nexport interface ScratchPadReaderOptions {\n nc: NatsConnection;\n timeoutMs?: number;\n}\nexport interface ReadBytesOptions {\n limitBytes?: number;\n trace?: TraceIds;\n}\n\nexport function wireTrace(trace?: TraceIds, toolCallId?: string): Trace {\n const result: Trace = trace ? { thread_id: trace.threadId, root_id: trace.rootId } : {};\n if (toolCallId) result.tool_call_id = toolCallId;\n validateTrace(result);\n return Object.fromEntries(Object.entries(result).filter(([, value]) => value !== \"\"));\n}\n\n/** Authenticated reads through a borrowed NATS connection; no workspace needed. */\nexport class ScratchPadReader {\n private readonly expansions = new Map<string, Reference>();\n constructor(\n protected readonly transport: ScratchPadTransport,\n readonly principal: Principal,\n ) {}\n\n protected reference(token: string): Reference {\n return this.checkedReference(decodeReference(token));\n }\n\n protected checkedReference(reference: Reference): Reference {\n if (reference.account !== this.principal.account)\n throw new NativeScratchPadError(\"denied\", \"reference belongs to another account\", {\n local: true,\n });\n this.checkDeadline(reference.expires_at);\n return reference;\n }\n\n private checkDeadline(expiresAt: number): void {\n if (Date.now() >= expiresAt * 1000)\n throw new NativeScratchPadError(\"expired\", \"reference has expired\", { local: true });\n }\n\n protected cacheReference(pair: ResolvedReference): void {\n this.expansions.delete(pair.short);\n this.expansions.set(pair.short, structuredClone(pair.expanded));\n if (this.expansions.size > 64) this.expansions.delete(this.expansions.keys().next().value!);\n }\n\n /** Expand either form for programmatic use. Metadata supplies no read authority. */\n async resolveReference(token: string, trace?: TraceIds): Promise<Reference> {\n if (!token.startsWith(SHORT_REFERENCE_PREFIX)) return this.reference(token);\n decodeShortReference(token);\n const cached = this.expansions.get(token);\n if (cached) return this.checkedReference(structuredClone(cached));\n const pair = await this.transport.referenceResolve({\n reference: token,\n trace: wireTrace(trace),\n });\n this.checkedReference(pair.expanded);\n this.cacheReference(pair);\n return structuredClone(pair.expanded);\n }\n\n private async openFile(\n token: string,\n options: ReadBytesOptions,\n ): Promise<{ request: PathRequest; stat: Stat; expiresAt: number }> {\n const limit = options.limitBytes ?? DEFAULT_READ_LIMIT_BYTES;\n uint(limit, MAX_VOLUME_BYTES);\n // A cached descriptor never skips current authorization or token validity.\n const resolved = token.startsWith(SHORT_REFERENCE_PREFIX)\n ? await this.transport.referenceStat({ reference: token, trace: wireTrace(options.trace) })\n : undefined;\n const reference = resolved\n ? this.checkedReference(resolved.reference.expanded)\n : this.reference(token);\n if (resolved) this.cacheReference(resolved.reference);\n const request = {\n target: reference.target,\n root: reference.root,\n path: reference.path,\n trace: wireTrace(options.trace),\n };\n const stat = resolved?.stat ?? (await this.transport.stat(request));\n this.checkDeadline(reference.expires_at);\n check(stat.type === \"file\", \"reference does not name a file\");\n if (stat.size > limit)\n throw new NativeScratchPadError(\n \"capacity\",\n `file has ${stat.size} bytes; read limit is ${limit}`,\n { local: true },\n );\n return { request, stat, expiresAt: reference.expires_at };\n }\n\n private async *chunks(\n request: PathRequest,\n stat: Stat,\n expiresAt: number,\n ): AsyncGenerator<Uint8Array> {\n this.checkDeadline(expiresAt);\n const chunks: ChunkRef[] = [],\n digest = createHash(\"sha256\");\n for (let offset = 0; offset < stat.size; offset += CHUNK_SIZE) {\n const length = Math.min(CHUNK_SIZE, stat.size - offset);\n this.checkDeadline(expiresAt);\n const result = await this.transport.read({ ...request, offset, length });\n this.checkDeadline(expiresAt);\n if (\n !sameValue(stat, result.stat) ||\n result.offset !== offset ||\n result.data.length !== length\n ) {\n throw new NativeScratchPadError(\"corrupt\", \"read range differs from the immutable file\");\n }\n digest.update(result.data);\n chunks.push({ id: chunkID(result.data), length });\n yield result.data;\n this.checkDeadline(expiresAt);\n }\n const sha256 = digest.digest(\"hex\");\n const object = fileObjectID(encodeFileObject({ size: stat.size, digest: sha256, chunks }));\n this.checkDeadline(expiresAt);\n if (sha256 !== stat.sha256 || object !== stat.object)\n throw new NativeScratchPadError(\"corrupt\", \"file bytes differ from their digest or identity\");\n }\n\n /** Returns bytes only after size, logical digest and canonical file identity agree. */\n async readBytes(token: string, options: ReadBytesOptions = {}): Promise<Uint8Array> {\n const { request, stat, expiresAt } = await this.openFile(token, options);\n const output = new Uint8Array(stat.size);\n let offset = 0;\n for await (const bytes of this.chunks(request, stat, expiresAt)) {\n output.set(bytes, offset);\n offset += bytes.length;\n }\n this.checkDeadline(expiresAt);\n return output;\n }\n\n /** Bytes are provisional until iteration completes without error. Consume to EOF\n * and publish a downloaded file only after success; early cancellation is unverified.\n * The caller must set an explicit whole-file size allowance.\n */\n async *readStream(\n token: string,\n options: ReadBytesOptions & { limitBytes: number },\n ): AsyncGenerator<Uint8Array> {\n uint(options?.limitBytes, MAX_VOLUME_BYTES);\n const { request, stat, expiresAt } = await this.openFile(token, options);\n yield* this.chunks(request, stat, expiresAt);\n this.checkDeadline(expiresAt);\n }\n\n async read(reference: string, trace?: TraceIds): Promise<string> {\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(\n await this.readBytes(reference, trace ? { trace } : {}),\n );\n }\n}\n\nexport async function scratchPadReader(\n options: ScratchPadReaderOptions,\n): Promise<ScratchPadReader> {\n const transport = new ScratchPadTransport(options.nc, options);\n const info = await transport.info();\n return new ScratchPadReader(transport, info.principal);\n}\n","import {\n closeSync,\n constants,\n fsyncSync,\n lstatSync,\n mkdirSync,\n openSync,\n realpathSync,\n} from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport type { DatabaseSync } from \"node:sqlite\";\nimport { NativeScratchPadError } from \"./errors\";\nimport { check, MAX_NODE_BYTES, parseStrictJSON, uint } from \"./protocol\";\nimport type { ContentObject, ObjectSpec } from \"./protocol\";\nimport { verifyObject } from \"./codec\";\n\nconst STATE_LIMIT = 128 * 1024;\n// Shared by ESM/CJS copies too. Opening and closing another descriptor for the\n// same database can release POSIX process locks, even with another SQLite user.\nconst OWNERS = Symbol.for(\"synadia.fabric.scratchpad.workspace-owners.v1\");\nconst globals = globalThis as typeof globalThis & { [OWNERS]?: Set<string> };\nconst owners = (globals[OWNERS] ??= new Set<string>());\n\n/** One private local database, exclusively owned for the client's lifetime. */\nexport class WorkspaceStore {\n private poisoned = false;\n private closed = false;\n\n private constructor(\n private readonly db: DatabaseSync,\n private readonly directory: string,\n ) {}\n\n static async open(directory: string): Promise<WorkspaceStore> {\n check(\n typeof directory === \"string\" && directory.length > 0,\n \"a persistent workspace directory is required\",\n );\n const [major, minor] = process.versions.node.split(\".\").map(Number);\n check(\n major! > 22 || (major === 22 && minor! >= 13),\n \"native ScratchPad requires Node 22.13 or later\",\n );\n const { DatabaseSync } = await import(\"node:sqlite\");\n const requested = resolve(directory);\n mkdirSync(requested, { recursive: true, mode: 0o700 });\n const directoryStat = lstatSync(requested);\n check(\n directoryStat.isDirectory() && !directoryStat.isSymbolicLink(),\n \"workspace must be a real directory\",\n );\n check(\n process.platform === \"win32\" || (directoryStat.mode & 0o077) === 0,\n \"workspace directory must have mode 0700\",\n );\n const canonical = realpathSync(requested);\n if (owners.has(canonical))\n throw new NativeScratchPadError(\"busy\", \"workspace is already open in this process\", {\n local: true,\n });\n owners.add(canonical);\n let db: DatabaseSync | undefined;\n try {\n const file = join(canonical, \"scratchpad.sqlite\");\n try {\n const fd = openSync(\n file,\n constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY | (constants.O_NOFOLLOW ?? 0),\n 0o600,\n );\n try {\n fsyncSync(fd);\n } finally {\n closeSync(fd);\n }\n if (process.platform !== \"win32\") {\n const parent = openSync(canonical, constants.O_RDONLY);\n try {\n fsyncSync(parent);\n } finally {\n closeSync(parent);\n }\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n }\n const stat = lstatSync(file);\n check(\n stat.isFile() && !stat.isSymbolicLink() && stat.nlink === 1,\n \"workspace database must be a private regular file\",\n );\n check(\n process.platform === \"win32\" || (stat.mode & 0o077) === 0,\n \"workspace database must have mode 0600\",\n );\n db = new DatabaseSync(file);\n db.exec(\n \"PRAGMA busy_timeout=0; PRAGMA locking_mode=EXCLUSIVE; PRAGMA journal_mode=DELETE; PRAGMA synchronous=EXTRA; PRAGMA fullfsync=ON; BEGIN EXCLUSIVE; COMMIT;\",\n );\n db.exec(\n \"CREATE TABLE IF NOT EXISTS state (id INTEGER PRIMARY KEY CHECK(id=1), value TEXT NOT NULL); CREATE TABLE IF NOT EXISTS objects (kind TEXT NOT NULL, id TEXT NOT NULL, ordinal INTEGER NOT NULL, body BLOB NOT NULL, PRIMARY KEY(kind,id)); CREATE INDEX IF NOT EXISTS object_order ON objects(ordinal);\",\n );\n return new WorkspaceStore(db, canonical);\n } catch (cause) {\n db?.close();\n owners.delete(canonical);\n if (cause instanceof NativeScratchPadError) throw cause;\n throw new NativeScratchPadError(\"busy\", \"cannot exclusively open the workspace database\", {\n local: true,\n cause,\n });\n }\n }\n\n private usable(): void {\n check(\n !this.closed && !this.poisoned,\n \"workspace is closed or had a write failure; close and reopen it\",\n );\n }\n\n load(): unknown {\n this.usable();\n const row = this.db.prepare(\"SELECT value FROM state WHERE id=1\").get();\n return row ? parseStrictJSON(String(row.value), STATE_LIMIT) : undefined;\n }\n\n save(state: unknown, afterRemote = false, clearObjects = false): void {\n this.usable();\n try {\n const json = JSON.stringify(state);\n check(Buffer.byteLength(json) <= STATE_LIMIT, \"workspace metadata exceeds its byte bound\");\n this.db.exec(\"BEGIN IMMEDIATE\");\n this.db\n .prepare(\n \"INSERT INTO state(id,value) VALUES(1,?) ON CONFLICT(id) DO UPDATE SET value=excluded.value\",\n )\n .run(json);\n if (clearObjects) this.db.exec(\"DELETE FROM objects\");\n this.db.exec(\"COMMIT\");\n } catch (cause) {\n this.poisoned = true;\n if (this.db.isTransaction) this.db.exec(\"ROLLBACK\");\n throw new NativeScratchPadError(\n \"unavailable\",\n \"workspace write failed; close and reopen before recovery\",\n { local: true, unknown: afterRemote, cause },\n );\n }\n }\n\n clearObjects(): void {\n this.usable();\n this.db.exec(\"DELETE FROM objects\");\n }\n\n putObject(ordinal: number, object: ContentObject, data: Uint8Array): void {\n this.usable();\n uint(ordinal);\n check(data.length > 0 && data.length <= MAX_NODE_BYTES, \"spool object exceeds bound\");\n verifyObject(object, data);\n // DatabaseSync copies the callback's reused chunk buffer before returning.\n this.db\n .prepare(\n \"INSERT INTO objects(kind,id,ordinal,body) VALUES(?,?,?,?) ON CONFLICT(kind,id) DO NOTHING\",\n )\n .run(object.kind, object.id, ordinal, data);\n }\n\n objects(): ObjectSpec[] {\n this.usable();\n return this.db\n .prepare(\"SELECT kind,id,length(body) AS length FROM objects ORDER BY ordinal\")\n .all()\n .map((row) => ({\n object: { kind: row.kind as ContentObject[\"kind\"], id: String(row.id) },\n length: Number(row.length),\n }));\n }\n\n bytes(object: ContentObject): Uint8Array {\n this.usable();\n const row = this.db\n .prepare(\"SELECT body FROM objects WHERE kind=? AND id=?\")\n .get(object.kind, object.id);\n check(row?.body instanceof Uint8Array, \"saved publication payload is missing\");\n verifyObject(object, row.body);\n return row.body;\n }\n\n close(): void {\n if (this.closed) return;\n this.db.close();\n this.closed = true;\n owners.delete(this.directory);\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { GrantKind, Grantee, TraceIds } from \"../scratchpad\";\nimport type { ScratchPadClient } from \"../scratchpad-cli\";\nimport {\n chunkStream,\n decodeReference,\n encodeFileObject,\n encodeReference,\n encodeTreeNode,\n fileObjectID,\n treeNodeID,\n} from \"./codec\";\nimport { NativeScratchPadError } from \"./errors\";\nimport {\n check,\n MAX_GRANT_SECONDS,\n MAX_PREPARE_OBJECTS,\n record,\n sameValue,\n text,\n uint,\n validateAction,\n validateCommand,\n validatePrincipal,\n validateReceipt,\n validateTarget,\n validateVolume,\n validateWriter,\n validatePath,\n validateRetentionHandle,\n} from \"./protocol\";\nimport type {\n Action,\n Command,\n GrantHandle,\n GrantIssueRequest,\n Info,\n MaintenanceRequest,\n ObjectSpec,\n Principal,\n Receipt,\n ReleaseRequest,\n ReservedScope,\n Target,\n Trace,\n VolumeView,\n Writer,\n} from \"./protocol\";\nimport { ScratchPadReader, wireTrace } from \"./reader\";\nimport type { ScratchPadReaderOptions } from \"./reader\";\nimport { ScratchPadTransport } from \"./transport\";\nimport { WorkspaceStore } from \"./store\";\nimport {\n SHORT_REFERENCE_PREFIX,\n validateReferenceSpec,\n validateResolvedReference,\n validateReferencePublishResult,\n type ReferenceSpec,\n type ResolvedReference,\n} from \"./references\";\nimport type { Reference } from \"./codec\";\n\nexport interface NativeScratchPadOptions extends ScratchPadReaderOptions {\n /** Private directory on a persistent local filesystem. One client owns it at a time. */\n dir: string;\n volume: string;\n /** Prompt address used only to route Fabric grant requests. It is not authentication. */\n creator: string;\n ttlSeconds?: number;\n}\nexport interface PublishOptions {\n operationId: string;\n ttlSeconds?: number;\n trace?: TraceIds;\n}\nexport interface PublishResult {\n reference: string;\n receipt: Receipt;\n}\nexport interface RecoveryResult {\n kind: string;\n reference?: string;\n receipt?: Receipt;\n}\ninterface Publication {\n kind: \"publish\";\n command: Command;\n path: string;\n ttl: number;\n expiry_revision?: number;\n reference?: ReferenceSpec;\n}\ninterface Granted {\n request: GrantIssueRequest;\n handle: GrantHandle;\n kind: GrantKind;\n}\ntype Control =\n | { kind: \"grant\"; request: GrantIssueRequest; provenance: GrantKind }\n | { kind: \"release\"; request: ReleaseRequest }\n | { kind: \"close\" | \"apply\"; request: MaintenanceRequest };\ntype Pending = Publication | Control | { kind: \"reset\"; writer: Writer };\ninterface State {\n version: 1;\n principal: Principal;\n volume: string;\n creator: string;\n creation: Action;\n target?: Target;\n writer?: Writer;\n next: number;\n pending?: Pending;\n last?: PublishResult & { path: string; ttl: number; resolved?: ResolvedReference };\n grants: Granted[];\n}\n\nfunction now(): number {\n return Math.floor(Date.now() / 1000);\n}\nfunction refuse(\n code: \"busy\" | \"fenced\" | \"capacity\" | \"denied\" | \"expired\" | \"intent_changed\" | \"closed\",\n message: string,\n): never {\n throw new NativeScratchPadError(code, message, { local: true });\n}\nfunction unknown(error: unknown, message: string): NativeScratchPadError {\n return new NativeScratchPadError(\n error instanceof NativeScratchPadError ? error.code : \"unknown\",\n message,\n { unknown: true, cause: error },\n );\n}\n\nfunction validateState(value: unknown): asserts value is State {\n const s = record(\n value,\n [\"version\", \"principal\", \"volume\", \"creator\", \"creation\", \"next\", \"grants\"],\n [\"target\", \"writer\", \"pending\", \"last\"],\n );\n check(s.version === 1, \"unsupported workspace version\");\n validatePrincipal(s.principal);\n validateVolume(s.volume);\n text(s.creator, 512, 1);\n validateAction(s.creation);\n uint(s.next, undefined, 1);\n if (s.target !== undefined) {\n validateTarget(s.target);\n check(s.target.volume === s.volume, \"workspace target differs from volume\");\n }\n if (s.writer !== undefined) {\n validateWriter(s.writer);\n check(s.writer.slot === 0 && s.target, \"workspace writer binding is invalid\");\n }\n check(Array.isArray(s.grants) && s.grants.length <= 16, \"workspace grant ledger exceeds bound\");\n for (const raw of s.grants) {\n const g = record(raw, [\"request\", \"handle\", \"kind\"]);\n check(g.kind === \"first-hand\" || g.kind === \"on-request\", \"invalid grant provenance\");\n validateGrant(g.request);\n const h = record(g.handle, [\"slot\", \"generation\"]);\n uint(h.slot, 15);\n uint(h.generation, undefined, 1);\n }\n if (s.last !== undefined) {\n const last = record(s.last, [\"reference\", \"receipt\", \"path\", \"ttl\"], [\"resolved\"]);\n validateReceipt(last.receipt);\n text(last.reference, 8192, 1);\n let reference: Reference;\n if (last.reference.startsWith(SHORT_REFERENCE_PREFIX)) {\n validateResolvedReference(last.resolved);\n validateReferencePublishResult({ receipt: last.receipt, references: [last.resolved] });\n check(last.resolved.short === last.reference, \"saved short reference differs\");\n reference = last.resolved.expanded;\n } else {\n check(last.resolved === undefined, \"full reference has unexpected expansion\");\n reference = decodeReference(last.reference);\n }\n validatePath(last.path, 256);\n uint(last.ttl, MAX_GRANT_SECONDS, 1);\n check(\n sameValue(last.receipt.principal, s.principal) &&\n sameValue(reference.target, s.target) &&\n reference.root === last.receipt.head.root &&\n reference.path === last.path &&\n sameValue(reference.retention, last.receipt.retention),\n \"saved receipt differs from workspace\",\n );\n }\n if (s.pending !== undefined) {\n check(s.target, \"pending operation has no target\");\n const p = s.pending as Pending;\n switch (p.kind) {\n case \"publish\":\n record(p, [\"kind\", \"command\", \"path\", \"ttl\"], [\"expiry_revision\", \"reference\"]);\n if (p.reference !== undefined) {\n validateReferenceSpec(p.reference);\n check(\n p.reference.creator === s.creator && sameValue(p.reference.paths, [p.path]),\n \"saved reference intent differs from publication\",\n );\n }\n validateCommand(p.command);\n validatePath(p.path, 256);\n uint(p.ttl, MAX_GRANT_SECONDS, 1);\n if (p.expiry_revision !== undefined) uint(p.expiry_revision, undefined, 1);\n check(\n p.command.creation_id === s.target.creation_id &&\n sameValue(p.command.writer, s.writer) &&\n p.command.number === s.next,\n \"pending writer position differs\",\n );\n break;\n case \"reset\":\n record(p, [\"kind\", \"writer\"]);\n validateWriter(p.writer);\n break;\n case \"grant\":\n record(p, [\"kind\", \"request\", \"provenance\"]);\n validateGrant(p.request);\n check(\n p.provenance === \"first-hand\" || p.provenance === \"on-request\",\n \"invalid pending grant provenance\",\n );\n break;\n case \"release\":\n record(p, [\"kind\", \"request\"]);\n record(p.request, [\"target\", \"handle\"]);\n validateTarget(p.request.target);\n validateRetentionHandle(p.request.handle);\n break;\n case \"close\":\n case \"apply\":\n record(p, [\"kind\", \"request\"]);\n record(p.request, [\"target\", \"revision\"]);\n validateTarget(p.request.target);\n uint(p.request.revision, undefined, 1);\n break;\n default:\n check(false, \"unknown workspace pending operation\");\n }\n if (\"request\" in p)\n check(sameValue(p.request.target, s.target), \"pending operation names another target\");\n }\n}\nfunction validateGrant(value: unknown): asserts value is GrantIssueRequest {\n const g = record(value, [\n \"target\",\n \"slot\",\n \"generation\",\n \"principal\",\n \"root\",\n \"path\",\n \"retention\",\n \"until\",\n \"action\",\n ]);\n validateTarget(g.target);\n uint(g.slot, 15);\n uint(g.generation);\n validatePrincipal(g.principal);\n validatePath(g.path, 256);\n validateRetentionHandle(g.retention);\n uint(g.until, undefined, 1);\n validateAction(g.action);\n text(g.root, 43, 43);\n}\n\n/** A native writer and Fabric adapter. It borrows the caller's authenticated connection. */\nexport class NativeScratchPad extends ScratchPadReader implements ScratchPadClient {\n private tail: Promise<void> = Promise.resolve();\n private closing = false;\n private closePromise?: Promise<void>;\n\n constructor(\n transport: ScratchPadTransport,\n private readonly store: WorkspaceStore,\n private state: State,\n private readonly scope: ReservedScope,\n private readonly ttl: number,\n ) {\n super(transport, state.principal);\n }\n\n private run<T>(work: () => Promise<T>): Promise<T> {\n if (this.closing)\n return Promise.reject(\n new NativeScratchPadError(\"closed\", \"native client is closed\", { local: true }),\n );\n const result = this.tail.then(work);\n this.tail = result.then(\n () => {},\n () => {},\n );\n return result;\n }\n\n private save(state: State, remote = false, clearObjects = false): void {\n try {\n validateState(state);\n this.store.save(state, remote, clearObjects);\n this.state = state;\n } catch (error) {\n if (remote)\n throw unknown(\n error,\n \"remote effect may be accepted; close and reopen the workspace before recovery\",\n );\n throw error;\n }\n }\n private change(pending: Pending): void {\n this.save({ ...this.state, pending });\n }\n private target(): Target {\n check(this.state.target, \"workspace has no volume\");\n return this.state.target;\n }\n\n private async ensureTarget(): Promise<VolumeView> {\n if (!this.state.target) {\n const view = await this.transport.createVolume({\n volume: this.state.volume,\n action: this.state.creation,\n });\n if (!sameValue(view.owner, this.principal))\n throw unknown(undefined, \"volume creation names another owner\");\n this.save({ ...this.state, target: view.target }, true);\n return view;\n }\n const view = await this.transport.getVolume(this.state.target);\n check(\n sameValue(view.owner, this.principal),\n \"workspace principal is no longer the volume owner\",\n );\n return view;\n }\n\n private async initialize(): Promise<void> {\n if (this.state.writer) return;\n const view = await this.ensureTarget();\n if (this.state.pending)\n refuse(\"fenced\", \"writer reset needs an explicit resetWriter with the observed generation\");\n const slot = view.writers[0]!;\n if (slot.number !== 0)\n refuse(\n \"fenced\",\n \"writer slot 0 has accepted commands but this workspace has no journal; inspect describe and reset explicitly\",\n );\n await this.reset({ slot: 0, generation: slot.generation });\n }\n\n private async reset(writer: Writer): Promise<Writer> {\n const previous = this.state;\n this.change({ kind: \"reset\", writer });\n let result: Writer;\n try {\n result = await this.transport.resetWriter(this.target(), writer);\n } catch (error) {\n if (error instanceof NativeScratchPadError && !error.unknown) this.save(previous, true);\n throw error;\n }\n const state = { ...this.state, writer: result, next: 1 };\n delete state.pending;\n delete state.last;\n this.save(state, true, true);\n return result;\n }\n\n /** Explicitly abandon writer recovery, fencing the exact generation observed by describe(). */\n resetWriter(options: { expectedGeneration: number; target?: Target }): Promise<Writer> {\n return this.run(async () => {\n uint(options.expectedGeneration, undefined, 1);\n if (options.target) {\n validateTarget(options.target);\n check(\n options.target.volume === this.state.volume,\n \"explicit reset target names another volume\",\n );\n if (this.state.target)\n check(\n sameValue(options.target, this.state.target),\n \"explicit reset target differs from workspace\",\n );\n else {\n const view = await this.transport.getVolume(options.target);\n check(sameValue(view.owner, this.principal), \"explicit reset target has another owner\");\n this.save({ ...this.state, target: view.target });\n }\n }\n await this.ensureTarget();\n if (this.state.pending && ![\"reset\", \"publish\"].includes(this.state.pending.kind))\n refuse(\"busy\", \"recover the pending control request before resetting the writer\");\n return this.reset({ slot: 0, generation: options.expectedGeneration });\n });\n }\n\n describe(): Promise<{ volume: VolumeView; pending?: string }> {\n return this.run(async () => {\n const volume = await this.ensureTarget();\n return this.state.pending ? { volume, pending: this.state.pending.kind } : { volume };\n });\n }\n\n recover(): Promise<RecoveryResult> {\n return this.run(() => this.recoverPending());\n }\n\n private async recoverPending(): Promise<RecoveryResult> {\n if (this.state.pending?.kind === \"reset\")\n refuse(\"fenced\", \"reset outcome needs an explicit resetWriter with the observed generation\");\n await this.initialize();\n const pending = this.state.pending;\n if (pending?.kind === \"publish\") {\n try {\n return { kind: \"publish\", ...(await this.resumePublish(pending)) };\n } catch (error) {\n if (\n error instanceof NativeScratchPadError &&\n error.code === \"expired\" &&\n !error.unknown &&\n !this.state.pending\n )\n return { kind: \"expired\" };\n throw error;\n }\n }\n if (pending) {\n await this.control(pending, false);\n return { kind: pending.kind };\n }\n return this.state.last\n ? { kind: \"ready\", reference: this.state.last.reference, receipt: this.state.last.receipt }\n : { kind: \"ready\" };\n }\n\n publishBytes(bytes: Uint8Array, path: string, options: PublishOptions): Promise<PublishResult> {\n // Own the input immediately, including while this call waits for an earlier one.\n const stable = Uint8Array.from(bytes);\n return this.publishStream([stable], path, options);\n }\n\n /** A publication replaces the head with one file at path. Older references keep their retained roots. */\n publishStream(\n source: AsyncIterable<Uint8Array> | Iterable<Uint8Array>,\n path: string,\n options: PublishOptions,\n ): Promise<PublishResult> {\n return this.publish(source, path, options, false);\n }\n\n private publish(\n source: AsyncIterable<Uint8Array> | Iterable<Uint8Array>,\n path: string,\n options: PublishOptions,\n recover: boolean,\n ): Promise<PublishResult> {\n options = structuredClone(options);\n return this.run(async () => {\n validatePath(path, 256);\n check(path !== \"/\", \"a file path is required\");\n const trace = wireTrace(options.trace),\n ttl = options.ttlSeconds ?? this.ttl;\n uint(ttl, MAX_GRANT_SECONDS, 1);\n validateAction({ operation_id: options.operationId, trace });\n if (recover) await this.recoverPending();\n await this.initialize();\n const pending = this.state.pending;\n if (pending) {\n if (pending.kind !== \"publish\" || pending.command.operation_id !== options.operationId)\n refuse(\"busy\", \"recover the pending operation before publishing another one\");\n this.samePublication(pending, path, ttl, trace);\n return this.resumePublish(pending);\n }\n if (this.state.last?.receipt.command.operation_id === options.operationId) {\n const last = this.state.last;\n this.samePublication(\n { kind: \"publish\", command: last.receipt.command, path: last.path, ttl: last.ttl },\n path,\n ttl,\n trace,\n );\n return { reference: last.reference, receipt: last.receipt };\n }\n const capabilities = await this.transport.referenceInfo();\n const reference: ReferenceSpec | undefined = capabilities?.enabled\n ? { creator: this.state.creator, paths: [path] }\n : undefined;\n if (reference) validateReferenceSpec(reference);\n // Local preparation carries no remote mutation. An interrupted build can\n // be replaced; only the atomic save of the complete intent makes it pending.\n this.store.clearObjects();\n let ordinal = 0,\n totalBytes = 0;\n const put = (object: ObjectSpec[\"object\"], data: Uint8Array): void => {\n totalBytes += data.length;\n if (totalBytes > this.scope.bytes || ordinal + 1 > this.scope.objects)\n refuse(\"capacity\", \"artifact exceeds this volume's configured capacity\");\n this.store.putObject(ordinal++, object, data);\n };\n try {\n const file = await chunkStream(source, (_index, object, data) => put(object, data));\n const fileBytes = encodeFileObject(file);\n let root = fileObjectID(fileBytes);\n put({ kind: \"fobj\", id: root }, fileBytes);\n let type: \"file\" | \"directory\" = \"file\";\n for (const name of path.slice(1).split(\"/\").reverse()) {\n const data = encodeTreeNode([{ name, type, object: root }]);\n root = treeNodeID(data);\n put({ kind: \"tree\", id: root }, data);\n type = \"directory\";\n }\n const objects = this.store.objects();\n let view = await this.transport.getVolume(this.target());\n const clock = now();\n const fullRetention = view.retentions.every((slot) => slot.pin);\n const canRelease = view.retentions.some(\n (slot, index) =>\n slot.pin &&\n slot.pin.until !== 0 &&\n slot.pin.until <= clock &&\n !view.grants.some(\n (grant) =>\n grant.grant &&\n grant.grant.until > clock &&\n sameValue(grant.grant.retention, { slot: index, generation: slot.generation }),\n ),\n );\n if (fullRetention && !canRelease)\n refuse(\n \"capacity\",\n \"all retention slots hold live or protected handoffs; cleanup cannot free a slot\",\n );\n // Conservative admission can reject an artifact whose objects overlap\n // existing content. It cannot leave a new pending intent on capacity.\n const needsCleanup =\n fullRetention ||\n view.objects + objects.length > this.scope.objects ||\n view.bytes + objects.reduce((n, object) => n + object.length, 0) > this.scope.bytes;\n if (needsCleanup) view = await this.maintainInternal();\n const slot = view.retentions.findIndex((entry) => !entry.pin);\n if (slot < 0)\n refuse(\n \"capacity\",\n \"all retention slots are occupied; release finished handoffs or wait for their expiry\",\n );\n if (\n view.objects + objects.length > this.scope.objects ||\n view.bytes + objects.reduce((n, object) => n + object.length, 0) > this.scope.bytes\n )\n refuse(\"capacity\", \"live roots and this artifact exceed the volume's capacity\");\n const writer = this.state.writer!;\n const actual = view.writers[writer.slot]!;\n if (actual.generation !== writer.generation || actual.number + 1 !== this.state.next)\n refuse(\"fenced\", \"remote writer position differs from the durable workspace\");\n if (view.closed) refuse(\"closed\", \"volume is closed by another maintenance interval\");\n const command: Command = {\n creation_id: this.target().creation_id,\n writer,\n number: this.state.next,\n operation_id: options.operationId,\n base: view.head,\n root,\n trace,\n retention: {\n enabled: true,\n slot,\n generation: view.retentions[slot]!.generation,\n until: now() + ttl,\n },\n };\n const publication: Publication = {\n kind: \"publish\",\n command,\n path,\n ttl,\n ...(reference ? { reference } : {}),\n };\n this.change(publication);\n return await this.resumePublish(publication);\n } catch (error) {\n // Never remove stable payload when a command or maintenance step is pending.\n if (!this.state.pending) this.store.clearObjects();\n throw error;\n }\n });\n }\n\n private samePublication(publication: Publication, path: string, ttl: number, trace: Trace): void {\n if (\n publication.path !== path ||\n publication.ttl !== ttl ||\n !sameValue(publication.command.trace, trace)\n )\n refuse(\n \"intent_changed\",\n \"operation id is already bound to another publication; recover uses its saved payload\",\n );\n }\n\n private async resumePublish(publication: Publication): Promise<PublishResult> {\n if (publication.reference) {\n try {\n const result = await this.transport.referenceReceipt({\n target: this.target(),\n command: publication.command,\n reference: publication.reference,\n });\n if (!sameValue(result.receipt.principal, this.principal))\n throw unknown(undefined, \"referenced receipt names another principal\");\n return this.accept(publication, result.receipt, result.references[0]);\n } catch (error) {\n if (!(\n error instanceof NativeScratchPadError &&\n error.code === \"not_found\" &&\n !error.unknown\n ))\n throw error;\n }\n }\n const view = await this.transport.getVolume(this.target());\n const slot = view.writers[publication.command.writer.slot]!;\n // Read authoritative receipts before touching the spool: accepted data may\n // already have been collected, and a lost local spool does not erase success.\n if (\n !publication.reference &&\n slot.receipt &&\n sameValue(slot.receipt.command, publication.command) &&\n sameValue(slot.receipt.principal, this.principal)\n )\n return this.accept(publication, slot.receipt);\n if (\n slot.generation !== publication.command.writer.generation ||\n slot.number >= publication.command.number\n )\n refuse(\"fenced\", \"saved writer position has been fenced; inspect and reset explicitly\");\n if (publication.expiry_revision !== undefined) {\n await this.fenceExpired(publication, view);\n throw new NativeScratchPadError(\"expired\", \"saved publication expired without acceptance\");\n }\n // An accepted command still returns its receipt after expiry. An expired\n // refusal needs a durable revision fence before an earlier in-flight CAS\n // can be ruled out; a clock check alone does not provide that fence.\n if (publication.command.retention.until > now()) await this.upload();\n let receipt: Receipt, resolved: ResolvedReference | undefined;\n try {\n if (publication.reference) {\n const result = await this.transport.referencePublish({\n target: this.target(),\n command: publication.command,\n reference: publication.reference,\n });\n receipt = result.receipt;\n resolved = result.references[0];\n } else {\n receipt = await this.transport.publish({\n target: this.target(),\n command: publication.command,\n });\n }\n } catch (error) {\n if (error instanceof NativeScratchPadError && error.code === \"expired\" && !error.unknown) {\n await this.fenceExpired(publication, view);\n }\n throw error;\n }\n if (\n !sameValue(receipt.command, publication.command) ||\n !sameValue(receipt.principal, this.principal)\n )\n throw unknown(undefined, \"publish receipt differs from the saved command\");\n return this.accept(publication, receipt, resolved);\n }\n\n private async fenceExpired(publication: Publication, view: VolumeView): Promise<void> {\n let revision = publication.expiry_revision;\n if (revision === undefined) {\n if (view.closed) refuse(\"closed\", \"another maintenance interval owns this closed volume\");\n revision = view.revision;\n publication = { ...publication, expiry_revision: revision };\n this.change(publication);\n }\n if (!(view.closed && view.revision === revision + 1)) {\n if (view.revision !== revision) {\n const pending = { ...publication };\n delete pending.expiry_revision;\n this.change(pending);\n throw new NativeScratchPadError(\n \"conflict\",\n \"expiry fence changed; recover the saved publication again\",\n );\n }\n view = await this.transport.closeVolume({ target: this.target(), revision });\n }\n const slot = view.writers[publication.command.writer.slot]!;\n if (\n !view.closed ||\n view.revision !== revision + 1 ||\n slot.generation !== publication.command.writer.generation ||\n slot.number !== publication.command.number - 1\n )\n throw unknown(undefined, \"expiry fence has not established publication absence\");\n // Closing advanced the same metadata record that publication CAS uses.\n // Every older in-flight write is fenced; a new attempt fails on expiry.\n const continuation: Control = {\n kind: \"apply\",\n request: { target: this.target(), revision: view.revision },\n };\n this.save({ ...this.state, pending: continuation }, true, true);\n await this.control(continuation, true);\n }\n\n private accept(\n publication: Publication,\n receipt: Receipt,\n resolved?: ResolvedReference,\n ): PublishResult {\n check(\n Boolean(publication.reference) === Boolean(resolved),\n \"referenced publication lost its descriptor\",\n );\n const reference =\n resolved?.short ??\n encodeReference({\n version: 2,\n creator: this.state.creator,\n account: this.principal.account,\n target: this.target(),\n root: receipt.head.root,\n generation: receipt.head.generation,\n path: publication.path,\n retention: receipt.retention,\n expires_at: publication.command.retention.until,\n });\n const state: State = {\n ...this.state,\n next: receipt.command.number + 1,\n last: {\n reference,\n receipt,\n path: publication.path,\n ttl: publication.ttl,\n ...(resolved ? { resolved } : {}),\n },\n };\n delete state.pending;\n this.save(state, true, true);\n if (resolved) this.cacheReference(resolved);\n return { reference, receipt };\n }\n\n private async upload(): Promise<void> {\n const objects = this.store.objects();\n check(objects.length > 0, \"saved publication payload is missing\");\n const sorted = [...objects].sort((a, b) =>\n Buffer.compare(\n Buffer.from(`${a.object.kind}:${a.object.id}`),\n Buffer.from(`${b.object.kind}:${b.object.id}`),\n ),\n );\n const verified = new Set<string>();\n let epoch: number | undefined;\n const key = (o: ObjectSpec[\"object\"]): string => o.kind + \":\" + o.id;\n for (let start = 0; start < sorted.length; start += MAX_PREPARE_OBJECTS) {\n const result = await this.transport.prepare({\n target: this.target(),\n objects: sorted.slice(start, start + MAX_PREPARE_OBJECTS),\n });\n if (epoch !== undefined && epoch !== result.epoch)\n throw unknown(undefined, \"upload preparation changed epoch; recover the saved publication\");\n epoch = result.epoch;\n for (const object of result.objects) {\n if (object.state === \"refused\")\n refuse(\n \"capacity\",\n \"object reservation refused; saved publication stays pending for recovery or explicit reset\",\n );\n if (object.state === \"verified\") verified.add(key(object.object));\n }\n }\n check(epoch !== undefined, \"publication contains no objects\");\n // Spool order is dependency order: chunks, file, then directories from leaf to root.\n for (const spec of objects) {\n if (verified.has(key(spec.object))) continue;\n await this.transport.putPrepared(\n { target: this.target(), object: spec.object, epoch },\n this.store.bytes(spec.object),\n );\n let next = -1;\n for (;;) {\n const result = await this.transport.verify({\n target: this.target(),\n epoch,\n objects: [spec.object],\n });\n const progress = result.objects[0]!;\n if (progress.state === \"verified\") break;\n if (progress.state !== \"verifying\" || progress.next <= next)\n throw unknown(undefined, \"object verification did not advance\");\n next = progress.next;\n }\n }\n }\n\n async commit(value: string, path: string, trace: TraceIds | undefined): Promise<string> {\n const result = await this.publish(\n [Buffer.from(value)],\n path.startsWith(\"/\") ? path : \"/\" + path,\n { operationId: randomUUID(), ...(trace ? { trace } : {}) },\n true,\n );\n return result.reference;\n }\n\n owns(token: string): boolean | Promise<boolean> {\n const matches = (ref: Reference): boolean =>\n ref.creator === this.state.creator && sameValue(ref.target, this.state.target);\n if (token.startsWith(SHORT_REFERENCE_PREFIX))\n return this.resolveReference(token).then(matches, () => false);\n try {\n return matches(this.reference(token));\n } catch {\n return false;\n }\n }\n\n granted(token: string, grantee: Grantee): GrantKind | undefined | Promise<GrantKind | undefined> {\n const find = (ref: Reference): GrantKind | undefined => {\n if (ref.creator !== this.state.creator || !sameValue(ref.target, this.state.target))\n return undefined;\n let kind: GrantKind | undefined;\n for (const grant of this.state.grants) {\n const q = grant.request;\n if (\n q.until > now() &&\n sameValue(q.principal, grantee) &&\n q.root === ref.root &&\n q.path === ref.path &&\n sameValue(q.retention, ref.retention)\n ) {\n if (grant.kind === \"first-hand\") return grant.kind;\n kind = grant.kind;\n }\n }\n return kind;\n };\n if (token.startsWith(SHORT_REFERENCE_PREFIX))\n return this.resolveReference(token).then(find, () => undefined);\n try {\n return find(this.reference(token));\n } catch {\n return undefined;\n }\n }\n\n grantRead(\n token: string,\n grantee: Grantee,\n trace?: TraceIds,\n toolCallId?: string,\n kind: GrantKind = \"first-hand\",\n ): Promise<void> {\n return this.run(async () => {\n validatePrincipal(grantee);\n const labels = wireTrace(trace, toolCallId);\n if (!(await this.owns(token)) || grantee.account !== this.principal.account)\n refuse(\"denied\", \"only the owner can grant this same-account reference\");\n const ref = await this.resolveReference(token, trace);\n if (this.state.pending) await this.recoverPending();\n const view = await this.transport.getVolume(this.target()),\n clock = now();\n const pin = view.retentions[ref.retention.slot]!;\n if (pin.generation !== ref.retention.generation || pin.pin?.root !== ref.root)\n refuse(\"expired\", \"reference retention is no longer held\");\n const until = Math.min(\n clock + this.ttl,\n ref.expires_at,\n pin.pin.until || Number.MAX_SAFE_INTEGER,\n );\n if (until <= clock) refuse(\"expired\", \"reference retention has expired\");\n // Reuse a still-live exact grant, preserving first-hand provenance.\n const old = this.state.grants.find(\n (g) =>\n g.request.until >= until &&\n sameValue(g.request.principal, grantee) &&\n g.request.root === ref.root &&\n g.request.path === ref.path &&\n sameValue(g.request.retention, ref.retention) &&\n view.grants[g.handle.slot]?.generation === g.handle.generation,\n );\n if (old) {\n if (kind === \"first-hand\" && old.kind !== kind) {\n const grants = this.state.grants.map((g) => (g === old ? { ...g, kind } : g));\n this.save({ ...this.state, grants });\n }\n return;\n }\n const slot = view.grants.findIndex((g) => !g.grant || g.grant.until <= clock);\n if (slot < 0) refuse(\"capacity\", \"all read-grant slots hold live grants\");\n const control: Control = {\n kind: \"grant\",\n provenance: kind,\n request: {\n target: this.target(),\n slot,\n generation: view.grants[slot]!.generation,\n principal: { ...grantee },\n root: ref.root,\n path: ref.path,\n retention: ref.retention,\n until,\n action: { operation_id: randomUUID(), trace: labels },\n },\n };\n this.change(control);\n await this.control(control, true);\n });\n }\n\n /** Release a completed handoff. Refuses while any live grant names its retention. */\n release(token: string): Promise<void> {\n return this.run(async () => {\n if (this.state.pending) refuse(\"busy\", \"recover the pending operation before release\");\n const ref = token.startsWith(SHORT_REFERENCE_PREFIX)\n ? await this.resolveReference(token)\n : decodeReference(token);\n if (ref.account !== this.principal.account || !sameValue(ref.target, this.state.target))\n refuse(\"denied\", \"reference belongs to another workspace\");\n const view = await this.transport.getVolume(this.target());\n if (\n view.grants.some(\n (g) => g.grant && g.grant.until > now() && sameValue(g.grant.retention, ref.retention),\n )\n )\n refuse(\"busy\", \"a live read grant still uses this retention\");\n const control: Control = {\n kind: \"release\",\n request: { target: this.target(), handle: ref.retention },\n };\n this.change(control);\n await this.control(control, true);\n });\n }\n\n /** Collect unreferenced content in this client's own maintenance interval. */\n maintain(): Promise<VolumeView> {\n return this.run(() => this.maintainInternal());\n }\n\n private async maintainInternal(): Promise<VolumeView> {\n if (this.state.pending) refuse(\"busy\", \"recover the pending operation before collection\");\n let view = await this.ensureTarget();\n if (view.closed) refuse(\"closed\", \"another maintenance interval owns this closed volume\");\n const clock = now();\n for (const [slot, held] of view.retentions.entries()) {\n if (!held.pin || held.pin.until === 0 || held.pin.until > clock) continue;\n const handle = { slot, generation: held.generation };\n if (\n view.grants.some(\n (g) => g.grant && g.grant.until > clock && sameValue(g.grant.retention, handle),\n )\n )\n continue;\n const control: Control = { kind: \"release\", request: { target: this.target(), handle } };\n this.change(control);\n await this.control(control, true);\n }\n view = await this.transport.getVolume(this.target());\n const control: Control = {\n kind: \"close\",\n request: { target: this.target(), revision: view.revision },\n };\n this.change(control);\n await this.control(control, true);\n return this.transport.getVolume(this.target());\n }\n\n private async control(control: Control, fresh: boolean): Promise<void> {\n let failure: unknown, view: VolumeView | undefined, handle: GrantHandle | undefined;\n let settled = false;\n try {\n switch (control.kind) {\n case \"grant\":\n handle = await this.transport.issueGrant(control.request);\n break;\n case \"release\":\n view = await this.transport.release(control.request);\n break;\n case \"close\":\n view = await this.transport.closeVolume(control.request);\n break;\n case \"apply\":\n view = (await this.transport.applyCollection(control.request)).volume;\n break;\n }\n settled = true;\n } catch (error) {\n failure = error;\n if (control.kind !== \"release\") {\n try {\n view = await this.transport.getVolume(this.target());\n if (control.kind === \"grant\") {\n const q = control.request,\n observed = view.grants[q.slot]!,\n g = observed.grant;\n if (\n observed.generation > q.generation &&\n g &&\n sameValue(g.principal, q.principal) &&\n g.root === q.root &&\n g.path === q.path &&\n sameValue(g.retention, q.retention) &&\n g.until === q.until\n ) {\n handle = { slot: q.slot, generation: observed.generation };\n failure = undefined;\n settled = true;\n }\n } else if (control.kind === \"close\") {\n if (view.closed && view.revision === control.request.revision + 1) {\n failure = undefined;\n settled = true;\n } else if (view.revision !== control.request.revision) {\n settled = true;\n failure = new NativeScratchPadError(\n \"conflict\",\n \"saved close is fenced by another revision\",\n );\n }\n } else if (!view.closed) {\n failure = undefined;\n settled = true;\n }\n } catch {\n /* A failed observation cannot turn an unknown effect into absence. */\n }\n }\n if (\n error instanceof NativeScratchPadError &&\n !error.unknown &&\n (fresh ||\n control.kind === \"release\" ||\n (control.kind === \"grant\" && error.code === \"expired\"))\n )\n settled = true;\n }\n if (!settled)\n throw unknown(failure, `the saved ${control.kind} request stays pending; call recover()`);\n if (\n !failure &&\n control.kind === \"close\" &&\n (!view?.closed || view.revision !== control.request.revision + 1)\n )\n throw unknown(undefined, \"close returned another maintenance interval\");\n const state = { ...this.state };\n delete state.pending;\n if (!failure && control.kind === \"grant\") {\n check(handle, \"grant acceptance has no handle\");\n state.grants = state.grants.filter(\n (g) => g.request.until > now() && g.handle.slot !== handle.slot,\n );\n state.grants.push({ request: control.request, handle, kind: control.provenance });\n }\n if (!failure && control.kind === \"close\")\n state.pending = {\n kind: \"apply\",\n request: { target: this.target(), revision: view!.revision },\n };\n this.save(state, true);\n if (failure)\n throw failure instanceof Error\n ? failure\n : new Error(\"control request failed\", { cause: failure });\n if (state.pending?.kind === \"apply\") await this.control(state.pending, true);\n }\n\n close(): Promise<void> {\n if (this.closePromise) return this.closePromise;\n this.closing = true;\n return (this.closePromise = this.tail.then(() => this.store.close()));\n }\n}\n\n/** Construct a native client without creating a remote volume until first use. */\nexport async function nativeScratchPad(\n options: NativeScratchPadOptions,\n): Promise<NativeScratchPad> {\n validateVolume(options.volume);\n text(options.creator, 512, 1);\n const ttl = options.ttlSeconds ?? 600;\n uint(ttl, MAX_GRANT_SECONDS, 1);\n const transport = new ScratchPadTransport(options.nc, options);\n const info: Info = await transport.info();\n const scope = info.scopes.find((scope) => scope.volume === options.volume);\n if (!scope) refuse(\"denied\", \"authenticated principal owns no provisioned scope for this volume\");\n const store = await WorkspaceStore.open(options.dir);\n try {\n let state = store.load();\n if (state === undefined) {\n state = {\n version: 1,\n principal: info.principal,\n volume: options.volume,\n creator: options.creator,\n creation: { operation_id: randomUUID(), trace: {} },\n next: 1,\n grants: [],\n } satisfies State;\n store.save(state);\n }\n validateState(state);\n check(\n sameValue(state.principal, info.principal) &&\n state.volume === options.volume &&\n state.creator === options.creator,\n \"workspace is bound to another principal, volume, or creator\",\n );\n return new NativeScratchPad(transport, store, state, scope, ttl);\n } catch (error) {\n store.close();\n throw error;\n }\n}\n\n/** Environment configuration for SDK agents, using their existing connection. */\nexport async function nativeScratchPadFromEnv(\n env: Readonly<Record<string, string | undefined>>,\n options: ScratchPadReaderOptions & { creator: string },\n): Promise<NativeScratchPad | undefined> {\n const volume = env[\"SCRATCHPAD_VOLUME\"];\n if (!volume) return undefined;\n const dir = env[\"SCRATCHPAD_DIR\"];\n check(dir, \"SCRATCHPAD_DIR must name a persistent private directory for the native client\");\n const value = env[\"SCRATCHPAD_GRANT_TTL_S\"];\n check(value === undefined || /^[0-9]+$/.test(value), \"SCRATCHPAD_GRANT_TTL_S must be an integer\");\n return nativeScratchPad({\n ...options,\n volume,\n dir,\n ...(value === undefined ? {} : { ttlSeconds: Number(value) }),\n });\n}\n","// The harness add-ons' one setting, the edge subject, read the same way by\n// every add-on under `plugins/` (`docs/plugins.md` §3.1). TypeScript only,\n// like the plugins; the subject itself is validated where tracing takes it\n// (`assertValidTraceOptions`).\n\nimport { DEFAULT_EDGE_SUBJECT } from \"./trace.js\";\n\n/** The one setting: the edge subject, in the config entry's `options`. */\nexport const EDGE_SUBJECT_OPTION = \"edgeSubject\";\n\n/** The same setting as a variable, read when the option is not given. */\nexport const EDGE_SUBJECT_VAR = \"SYNADIA_FABRIC_EDGE_SUBJECT\";\n\n/**\n * The edge subject an add-on runs with: the config entry's\n * `options.edgeSubject` when the key is there (`null` is propagate-only:\n * lineage without records), else `SYNADIA_FABRIC_EDGE_SUBJECT` when set,\n * else the fabric's default. The value is returned as given; the package\n * validates it (`assertValidTraceOptions`) and throws for one that can\n * never be published to, which stops the add-on's factory — the plugin\n * then logs the error and starts plain, so a misconfigured subject is\n * visible at start rather than as a warning on every prompt.\n */\nexport function resolveEdgeSubject(\n options: Readonly<Record<string, unknown>>,\n env: NodeJS.ProcessEnv = process.env,\n): string | null {\n if (Object.hasOwn(options, EDGE_SUBJECT_OPTION)) {\n // The runtime type is the package's to check, so the cast claims nothing.\n return options[EDGE_SUBJECT_OPTION] as string | null;\n }\n const fromEnv = env[EDGE_SUBJECT_VAR];\n if (fromEnv !== undefined) return fromEnv;\n return DEFAULT_EDGE_SUBJECT;\n}\n","// ScratchPad for a harness's model (`docs/plugins.md` §9), what every add-on\n// under `plugins/` shares: the environment the skill's `scripts/sp` reads,\n// set in the harness's process, which its shell tool passes to every command\n// it runs (PI's measured, OpenClaw's read in its code; §9.4), and the\n// ScratchPad extension for the plugin's agent tools. TypeScript only, like\n// the rest of the plugins' contract: none of it is wire.\n//\n// At start, once: the connection, the workspace and the volume, from the\n// config entry's `options.scratchpad`, else the variables of the same names\n// the package reads (`SCRATCHPAD_VOLUME`, `SCRATCHPAD_DIR`, `NATS_URL`,\n// `NATS_CREDS`), else, for the connection, the plugin's own: its NATS\n// context, which `sp` cannot read (PI's, Claude Code's), or the `url` and\n// `credentials` of its configuration (OpenClaw's account block). `sp` must\n// connect as the plugin does, since a caller grants read to the agent it\n// prompted.\n// Without a volume ScratchPad is off and nothing is set.\n//\n// When the service is up: `SP_CREATOR`, the agent's prompt address, which\n// every reference it publishes names as its creator.\n//\n// The registration says the harness reads references (`scratchpad_refs_ok`),\n// so a caller's `prompt_agent` hands them to it. And references its model\n// puts into its own `prompt_agent` go through the ScratchPad extension, as\n// an SDK-built agent's do: granted to a receiver that reads references,\n// removed with a note for any other (`ScratchPadHandOn`). And it answers\n// grant requests for what it published, as an SDK-built agent does\n// (`grant-request.ts`): the grants its model made through `scripts/sp`, which\n// the extension does not see, are recorded by the wrapper in a file the\n// add-on reads (`SP_GRANTS_FILE`, `withRecordedGrants`).\n//\n// Per served prompt, from when the harness starts working on it to its end:\n// the prompt's trace (`SP_THREAD_ID`, `SP_ROOT_ID`) and its verified caller\n// (`SP_CALLER_ACCOUNT`, `SP_CALLER_USER`), the one agent `scripts/sp grant`\n// grants to (`ServedPromptEnv`). Process-wide variables are sound only for a\n// harness that works on one served prompt at a time; each add-on says why\n// its harness does.\n\nimport { mkdirSync, readFileSync, renameSync, writeFileSync } from \"node:fs\";\nimport { arch, homedir, platform } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type {\n AgentService,\n RequestInterceptor,\n RequestInterceptorContext,\n} from \"@synadia-ai/agent-service\";\nimport {\n readContextFile,\n SILENT_LOGGER,\n type Agent,\n type Agents,\n type AgentToolsExtension,\n type AgentToolsPromptContext,\n type AgentToolsPromptRewrite,\n type AgentToolsReplyContext,\n type Logger,\n} from \"@synadia-ai/agents\";\nimport { grantRequestEndpoint } from \"./grant-request.js\";\nimport type { AgentExtensionContext, ServedRequest } from \"./plugin-contract.js\";\nimport {\n findReferences,\n granteeFromIdentity,\n readsReferences,\n type GrantKind,\n type Grantee,\n type ScratchPad,\n type TraceIds,\n} from \"./scratchpad.js\";\nimport {\n SCRATCHPAD_BIN_VAR,\n SCRATCHPAD_DIR_VAR,\n SCRATCHPAD_VOLUME_VAR,\n spCliScratchPad,\n} from \"./scratchpad-cli.js\";\nimport {\n READS_SCRATCHPAD_REFERENCES_FIELD,\n scratchPadExtension,\n type ScratchPadExtension,\n} from \"./scratchpad-extension.js\";\nimport type { TraceScope } from \"./trace.js\";\n\n/** The config entry's option that holds ScratchPad's settings. */\nexport const SCRATCHPAD_OPTION = \"scratchpad\";\n\n/**\n * The variables `scripts/sp` reads. The connection has names of its own,\n * not `NATS_URL` and `NATS_CREDS`, which a plugin may read as its own\n * connection (OpenClaw's does) and which the add-on therefore never sets.\n */\nexport const SP_VARS = {\n url: \"SP_NATS_URL\",\n creds: \"SP_NATS_CREDS\",\n dir: SCRATCHPAD_DIR_VAR,\n volume: SCRATCHPAD_VOLUME_VAR,\n creator: \"SP_CREATOR\",\n threadId: \"SP_THREAD_ID\",\n rootId: \"SP_ROOT_ID\",\n callerAccount: \"SP_CALLER_ACCOUNT\",\n callerUser: \"SP_CALLER_USER\",\n grants: \"SP_GRANTS_FILE\",\n} as const;\n\n/** What ScratchPad was resolved to at start. */\nexport interface ScratchPadSettings {\n readonly url: string;\n readonly creds: string;\n readonly volume: string;\n /** Unset when neither a setting nor the plugin's state directory gives one. */\n readonly dir?: string;\n /**\n * The file `scripts/sp` records its grants in, beside the workspace:\n * `<dir>.grants`. Unset without a workspace, and then the grants the\n * model makes do not entitle anyone to a grant request.\n */\n readonly grants?: string;\n}\n\ntype Env = Record<string, string | undefined>;\n\n/**\n * ScratchPad's settings as the options, the environment and the plugin's\n * NATS context give them, or `undefined` when ScratchPad is off: no volume,\n * or a connection `sp` cannot use, which is logged.\n */\nexport async function resolveScratchPad(\n ctx: AgentExtensionContext,\n env: Env,\n): Promise<ScratchPadSettings | undefined> {\n const log = ctx.logger;\n const raw = ctx.options[SCRATCHPAD_OPTION];\n const options: Readonly<Record<string, unknown>> =\n raw !== null && typeof raw === \"object\" ? (raw as Record<string, unknown>) : {};\n const pick = (option: string, variable: string): string | undefined => {\n const fromOptions = options[option];\n if (typeof fromOptions === \"string\" && fromOptions !== \"\") return fromOptions;\n const fromEnv = env[variable];\n return fromEnv === undefined || fromEnv === \"\" ? undefined : fromEnv;\n };\n\n const volume = pick(\"volume\", SP_VARS.volume);\n if (volume === undefined) return undefined;\n\n let url = pick(\"url\", \"NATS_URL\");\n let creds = pick(\"creds\", \"NATS_CREDS\");\n if (url === undefined || creds === undefined) {\n const context = env[\"NATS_CONTEXT\"] || stringOf(ctx.settings.config[\"context\"]);\n if (context !== undefined) {\n try {\n const { fields } = await readContextFile(context);\n url ??= stringOf(fields[\"url\"]);\n creds ??= stringOf(fields[\"creds\"]);\n } catch (err) {\n log.warn(\n `agent-fabric: ScratchPad is off: the NATS context \"${context}\" could not be read (${String(err)})`,\n );\n return undefined;\n }\n }\n }\n // A plugin that connects without a context names the two in its own\n // configuration: OpenClaw's account block has `url` and `credentials`.\n url ??= stringOf(ctx.settings.config[\"url\"]);\n creds ??= stringOf(ctx.settings.config[\"credentials\"]);\n if (url === undefined || creds === undefined) {\n log.warn(\n \"agent-fabric: ScratchPad is off: sp needs a NATS URL and a credentials file \" +\n \"(options.scratchpad, NATS_URL and NATS_CREDS, a NATS context with both, \" +\n \"or url and credentials in the plugin's configuration)\",\n );\n return undefined;\n }\n\n let dir = pick(\"dir\", SP_VARS.dir);\n if (dir === undefined && ctx.settings.stateDir !== undefined) {\n dir = join(ctx.settings.stateDir, \"scratchpad\");\n }\n if (dir !== undefined) {\n dir = resolve(expandHome(dir));\n try {\n // sp requires the workspace directory to exist.\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n } catch (err) {\n log.warn(`agent-fabric: ScratchPad workspace ${dir} could not be created (${String(err)})`);\n }\n }\n const grants = dir !== undefined ? `${dir}.grants` : undefined;\n if (grants !== undefined) pruneRecordedGrants(grants, log);\n return {\n url,\n creds: expandHome(creds),\n volume,\n ...(dir !== undefined ? { dir } : {}),\n ...(grants !== undefined ? { grants } : {}),\n };\n}\n\n/** Sets the start-time variables. */\nexport function exportScratchPad(settings: ScratchPadSettings, env: Env): void {\n env[SP_VARS.url] = settings.url;\n env[SP_VARS.creds] = settings.creds;\n env[SP_VARS.volume] = settings.volume;\n if (settings.dir !== undefined) env[SP_VARS.dir] = settings.dir;\n if (settings.grants !== undefined) env[SP_VARS.grants] = settings.grants;\n}\n\n/**\n * The per-prompt variables, keyed to one request at a time: `enter` sets\n * them for a request, `leave` clears them only if that request still holds\n * them, so the end of a prompt never clears the next one's.\n */\nexport class ServedPromptEnv {\n #holder: string | undefined;\n\n constructor(private readonly env: Env) {}\n\n enter(request: ServedRequest, scope: TraceScope | undefined): void {\n this.#clear();\n this.#holder = request.id;\n if (scope !== undefined) {\n this.env[SP_VARS.threadId] = scope.threadId;\n this.env[SP_VARS.rootId] = scope.rootId;\n }\n if (request.caller !== undefined) {\n try {\n const grantee = granteeFromIdentity(request.caller);\n this.env[SP_VARS.callerAccount] = grantee.account;\n this.env[SP_VARS.callerUser] = grantee.user;\n } catch {\n // Not an `<account>.<user>` identity: no grant for this caller.\n }\n }\n }\n\n leave(request: ServedRequest): void {\n if (this.#holder === request.id) {\n this.#clear();\n this.#holder = undefined;\n }\n }\n\n #clear(): void {\n delete this.env[SP_VARS.threadId];\n delete this.env[SP_VARS.rootId];\n delete this.env[SP_VARS.callerAccount];\n delete this.env[SP_VARS.callerUser];\n }\n}\n\n/**\n * The sp binary an add-on ships for this machine in `skillDir` (its\n * `skill/scratchpad`), or `SCRATCHPAD_BIN`; `undefined` on a platform it is\n * not built for. The add-on's own grants run it directly, with the flags\n * `scripts/sp` would add.\n */\nexport function spBinary(env: Env, skillDir: string): string | undefined {\n const own = env[SCRATCHPAD_BIN_VAR];\n if (own !== undefined && own !== \"\") return own;\n const os = platform() === \"darwin\" ? \"darwin\" : platform() === \"linux\" ? \"linux\" : undefined;\n const cpu = arch() === \"arm64\" ? \"arm64\" : arch() === \"x64\" ? \"amd64\" : undefined;\n if (os === undefined || cpu === undefined) return undefined;\n return join(skillDir, \"bin\", `sp-${os}-${cpu}`);\n}\n\n/**\n * The fabric package's ScratchPad extension, for the plugin's `AgentTools`\n * and its service, before it can exist: it needs the plugin's `Agents`\n * client and this agent's address, which arrive in `started()`, after the\n * factory returned its hooks. Until then it keeps the prompts it serves, to\n * remember their references once it is built.\n *\n * One addition to the extension: the harness's model publishes with\n * `scripts/sp`, which the extension does not see, and the extension hands on\n * only what the agent was given. So a reference into its own volume is remembered as\n * given before the prompt rewrite looks, exactly as an SDK-built agent\n * remembers what it commits.\n */\nexport class ScratchPadHandOn implements AgentToolsExtension {\n #inner: ScratchPadExtension | undefined;\n #scratchPad: ScratchPad | undefined;\n readonly #early: string[] = [];\n\n readonly requestInterceptor: RequestInterceptor = {\n aroundRequest: (ctx: RequestInterceptorContext, next: () => Promise<void>) => {\n if (this.#inner === undefined) this.#early.push(ctx.envelope.prompt);\n else this.#inner.remember(ctx.envelope.prompt);\n return next();\n },\n };\n\n /**\n * Builds the extension, once the plugin's client is on the bus. Given the\n * plugin's service, also answers grant requests for what this agent\n * published, on the endpoint an SDK-built agent serves them on\n * (`grantRequestEndpoint`), added through the service's own\n * `addEndpoint`, since the plugin builds its service before the add-on\n * could name an extra endpoint. Several instances of one agent share the\n * work, as an SDK-built agent's do.\n */\n start(options: {\n readonly scratchPad: ScratchPad;\n readonly agents: Agents;\n readonly service?: AgentService;\n readonly logger?: Logger;\n }): void {\n const { scratchPad, agents, service } = options;\n this.#scratchPad = scratchPad;\n this.#inner = scratchPadExtension({ scratchPad, agents });\n for (const text of this.#early.splice(0)) this.#inner.remember(text);\n if (service === undefined) return;\n const logger = options.logger ?? SILENT_LOGGER;\n const ep = grantRequestEndpoint({\n promptAddress: service.subject.prompt,\n scratchPad,\n logger,\n });\n try {\n service.service.addEndpoint(ep.name, {\n subject: ep.subject,\n ...(ep.queue !== undefined ? { queue: ep.queue } : {}),\n handler: ep.handler,\n });\n } catch (err) {\n logger.warn(`agent-fabric: grant requests are not answered: ${String(err)}`);\n }\n }\n\n discoveryFields(agent: Agent): Record<string, unknown> {\n return (\n this.#inner?.discoveryFields(agent) ?? {\n [READS_SCRATCHPAD_REFERENCES_FIELD]: readsReferences(agent.metadata),\n }\n );\n }\n\n async beforePrompt(ctx: AgentToolsPromptContext): Promise<AgentToolsPromptRewrite | void> {\n const inner = this.#inner;\n const scratchPad = this.#scratchPad;\n if (inner === undefined || scratchPad === undefined) {\n if (findReferences(ctx.prompt).length === 0) return;\n return {\n error: \"the prompt was not sent: ScratchPad is not ready yet; try again in a moment\",\n };\n }\n for (const reference of new Set(findReferences(ctx.prompt))) {\n if (await scratchPad.owns(reference)) inner.remember(reference);\n }\n return inner.beforePrompt(ctx);\n }\n\n afterReply(ctx: AgentToolsReplyContext): void {\n this.#inner?.afterReply(ctx);\n }\n}\n\n/**\n * The ScratchPad port over the add-on's packaged sp, for its own grants and\n * the grant requests it answers, with the grants `scripts/sp` recorded.\n */\nexport function spPort(\n settings: ScratchPadSettings,\n creator: string,\n env: Env,\n skillDir: string,\n): ScratchPad | undefined {\n const bin = spBinary(env, skillDir);\n if (bin === undefined) return undefined;\n const port = spCliScratchPad({\n volume: settings.volume,\n nats: { url: settings.url, creds: settings.creds },\n bin,\n creator,\n ...(settings.dir !== undefined ? { dir: settings.dir } : {}),\n });\n return settings.grants !== undefined ? withRecordedGrants(port, settings.grants) : port;\n}\n\n// The grants `scripts/sp` made, one line each, appended by the wrapper after\n// sp confirmed the grant: `<expires_at> <account> <user> <reference>`, the\n// expiry in seconds since the epoch as sp reported it, the grantee the\n// served prompt's verified caller, the reference as it was granted on.\n\n/** One grant `scripts/sp` recorded. */\nexport interface RecordedGrant {\n readonly expiresAt: number;\n readonly grantee: Grantee;\n readonly reference: string;\n}\n\nconst RECORDED_LINE = /^(\\d+) (\\S+) (\\S+) (sp-(?:ref|r1):[A-Za-z0-9_-]+)$/;\n\n/** The grants recorded in `file`; none when it does not exist. Malformed lines are skipped. */\nexport function readRecordedGrants(file: string): RecordedGrant[] {\n let text: string;\n try {\n text = readFileSync(file, \"utf8\");\n } catch {\n return [];\n }\n const grants: RecordedGrant[] = [];\n for (const line of text.split(\"\\n\")) {\n const m = RECORDED_LINE.exec(line);\n if (m === null) continue;\n grants.push({\n expiresAt: Number(m[1]),\n grantee: { account: m[2] as string, user: m[3] as string },\n reference: m[4] as string,\n });\n }\n return grants;\n}\n\n// At start, before the model runs: the file keeps only what is still live.\nfunction pruneRecordedGrants(file: string, log: Logger): void {\n const t = Math.floor(Date.now() / 1000);\n const live = readRecordedGrants(file).filter((g) => g.expiresAt > t);\n try {\n const staging = `${file}.${process.pid}.tmp`;\n writeFileSync(\n staging,\n live\n .map((g) => `${g.expiresAt} ${g.grantee.account} ${g.grantee.user} ${g.reference}\\n`)\n .join(\"\"),\n { mode: 0o600 },\n );\n renameSync(staging, file);\n } catch (err) {\n log.warn(`agent-fabric: ScratchPad grants file ${file} could not be written (${String(err)})`);\n }\n}\n\n/**\n * `port`, whose ledger also holds the grants `scripts/sp` recorded in `file`.\n * The wrapper grants only to the served prompt's caller, the agent the\n * harness's model handed its reply to, so each is first-hand, as an\n * SDK-built agent's grant to the caller of its reply is: its holder may ask\n * for one more agent. A first-hand grant of the port's own comes first;\n * the port's answer stands when nothing live is recorded. The reference\n * must be the one granted on, token for token, as the requester was given\n * it. `now` is seconds since the epoch.\n */\nexport function withRecordedGrants(\n port: ScratchPad,\n file: string,\n now: () => number = () => Date.now() / 1000,\n): ScratchPad {\n return {\n ...(port.resolveReference\n ? {\n resolveReference: (reference: string, trace?: TraceIds) =>\n port.resolveReference!(reference, trace),\n }\n : {}),\n owns: (reference) => port.owns(reference),\n grantRead: (reference, grantee, trace, toolCallId, kind) =>\n port.grantRead(reference, grantee, trace, toolCallId, kind),\n async granted(reference, grantee): Promise<GrantKind | undefined> {\n const own = await port.granted(reference, grantee);\n if (own === \"first-hand\") return own;\n const t = now();\n const recorded = readRecordedGrants(file).some(\n (g) =>\n g.reference === reference &&\n g.grantee.account === grantee.account &&\n g.grantee.user === grantee.user &&\n g.expiresAt > t,\n );\n return recorded ? \"first-hand\" : own;\n },\n };\n}\n\nfunction stringOf(value: unknown): string | undefined {\n return typeof value === \"string\" && value !== \"\" ? value : undefined;\n}\n\nfunction expandHome(path: string): string {\n if (path === \"~\") return homedir();\n if (path.startsWith(\"~/\")) return join(homedir(), path.slice(2));\n return path;\n}\n"]}
|