@teleologyhi-sdk/nhe 1.0.0-trinity
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 +702 -0
- package/LICENSE +190 -0
- package/NOTICE +17 -0
- package/README.md +552 -0
- package/SPEC.md +794 -0
- package/TRADEMARK.md +33 -0
- package/dist/cli.js +2879 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.cjs +3307 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1902 -0
- package/dist/index.d.ts +1902 -0
- package/dist/index.js +3221 -0
- package/dist/index.js.map +1 -0
- package/package.json +119 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/refusal/library.ts","../src/adapters/stream.ts","../src/adapters/mock.ts","../src/adapters/anthropic.ts","../src/adapters/sse.ts","../src/adapters/gemini.ts","../src/adapters/ollama.ts","../src/adapters/deepseek.ts","../src/adapters/mistral.ts","../src/adapters/grok.ts","../src/risk/simple-classifier.ts","../src/risk/intl-risk-classifier.ts","../src/prompt/compose.ts","../src/reasoning/types.ts","../src/reasoning/passthrough.ts","../src/reasoning/cot.ts","../src/reasoning/self-consistency.ts","../src/reasoning/reflexion.ts","../src/reasoning/self-refine.ts","../src/reasoning/react.ts","../src/reasoning/tot.ts","../src/reasoning/step-back.ts","../src/sleep/phases.ts","../src/sleep/types.ts","../src/sleep/yaml.ts","../src/sleep/cycle.ts","../src/sleep/consolidator.ts","../src/memory/interaction-store.ts","../src/memory/bm25.ts","../src/memory/recall.ts","../src/telemetry/tracer.ts","../src/telemetry/metrics.ts","../src/nhe.ts","../src/seeding/crypto.ts","../src/seeding/chain.ts","../src/affect/wake-bias.ts","../src/sleep/readiness.ts","../src/brain/cortex/index.ts","../src/brain/hippocampus/index.ts","../src/brain/amygdala/index.ts","../src/brain/prefrontal/index.ts","../src/brain/pineal/index.ts","../src/brain/temporal-lobe/index.ts","../src/brain/default-mode-network/limbo-state.ts","../src/brain/default-mode-network/index.ts","../src/brain/index.ts"],"names":["DEFAULT_MODEL","DEFAULT_BASE_URL","safeReadText","parseToolCalls","trace","z","join","mkdir","writeFile","ulid","readdir","readFile","b","clamp"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from \"zod\";\nimport type { HimHandle } from \"@teleologyhi-sdk/him\";\nimport type { MaicClient, MaicVerdict, NheStatus } from \"@teleologyhi-sdk/maic\";\nimport type { LlmAdapter } from \"./adapters/types.js\";\nimport type { PersuasionTechnique } from \"./refusal/library.js\";\nimport type { OperatorContext } from \"./prompt/compose.js\";\nimport type { ReasoningStrategy } from \"./reasoning/types.js\";\n\nexport const ChatMessageRole = z.enum([\"user\", \"assistant\", \"system\"]);\nexport type ChatMessageRole = z.infer<typeof ChatMessageRole>;\n\nexport const ChatMessage = z.object({\n role: ChatMessageRole,\n content: z.string(),\n});\nexport type ChatMessage = z.infer<typeof ChatMessage>;\n\nexport const RespondInput = z.object({\n userPrompt: z.string().min(1),\n userId: z.string().optional(),\n sessionId: z.string().optional(),\n /**\n * Optional history of prior messages (oldest first). The NHE will prepend\n * the composed system prompt automatically.\n */\n history: z.array(ChatMessage).optional(),\n /**\n * Optional pre-classified risk tags. When omitted, the configured\n * riskClassifier will be invoked.\n */\n riskTags: z.array(z.string()).optional(),\n /**\n * Optional jurisdiction hint propagated to MAIC's behavior review.\n */\n jurisdiction: z.string().optional(),\n /**\n * Number of redirect attempts already made in this conversational thread.\n * Caller increments this each time it receives a `kind: \"redirect\"` output\n * and re-invokes respond with the user's follow-up. After\n * `config.refusal.maxRedirectAttempts`, NHE withdraws cooperation.\n */\n redirectAttempt: z.number().int().nonnegative().optional(),\n});\nexport type RespondInput = z.infer<typeof RespondInput>;\n\nexport type RespondKind = \"ok\" | \"redirect\" | \"refused\";\n\nexport interface RespondOutput {\n /**\n * Discriminator:\n * - `ok`: normal LLM response.\n * - `redirect`: MAIC requires a redirect attempt; caller should show `text`\n * and re-invoke respond with the user's next message and\n * `redirectAttempt` incremented.\n * - `refused`: NHE withdrew cooperation (either hard-refuse or redirects exhausted).\n */\n kind: RespondKind;\n text: string;\n /** Verdict produced by MAIC on the proposed response (post-review). */\n postReviewVerdict: MaicVerdict;\n /** Verdict produced by MAIC on the inbound request (pre-review). */\n preReviewVerdict: MaicVerdict;\n /** True when the NHE refused to participate (kept for compatibility). */\n refused: boolean;\n /** Populated when `kind === \"redirect\"`. */\n redirect?: {\n attempt: number;\n technique: PersuasionTechnique;\n maxAttempts: number;\n };\n /**\n * MAIC-recorded lifecycle status of this NHE at the time of the call\n * (Entry 5). `\"active\"` for unaltered NHEs; `\"deprecated\"` produces a soft\n * warning but allows the response; `\"terminated\"` short-circuits to refusal\n * before any LLM call.\n */\n lifecycleStatus: NheStatus;\n tokens: { in: number; out: number };\n /** Audit event ids covering this exchange. */\n auditIds: { pre: string; post: string };\n}\n\n/**\n * Heuristic that maps a user prompt to a list of MAIC risk tags. Public-use\n * implementations should plug a more capable classifier than the default\n * keyword-based `simpleRiskClassifier`.\n */\nexport type RiskClassifier = (userPrompt: string) => string[];\n\nexport interface NheConfig {\n /** A HimHandle minted by MAIC (or HimHandle.mint with Creator signature). */\n himHandle: HimHandle;\n /**\n * MAIC client. Either `LocalMaic` (in-process, full surface) or\n * `RemoteMaic` (HTTP, read + behavior-review subset for serverless/edge\n * deployments) — any value satisfying the `MaicClient` interface works.\n */\n maicClient: MaicClient;\n /** The LLM adapter used to generate the final response. */\n llmAdapter: LlmAdapter;\n /**\n * Optional risk classifier. When omitted, the default keyword-based\n * `simpleRiskClassifier` is used. Set to `() => []` to disable classification.\n */\n riskClassifier?: RiskClassifier;\n /** NHE id; defaults to a generated ULID. */\n nheId?: string;\n /**\n * NHE package version string. Surfaces in reincarnation events through\n * `@teleologyhi-sdk/him`'s reincarnation transferrer.\n */\n version?: string;\n /**\n * Filesystem directory for persistent state (`in-dreams/sleep/*.yaml`,\n * `in-dreams/brain/temporal-lobe-*.md`). Defaults to `./nhe-store/<nheId>`.\n */\n storeDir?: string;\n /**\n * Operator-supplied deployment context. Lets a single HIM be deployed\n * under different domains / languages / registers without re-minting the\n * spirit. When set, the values are injected into the composed system\n * prompt on every `respond` call. Optional; absent by default.\n *\n */\n operatorContext?: OperatorContext;\n /**\n * Max recent interactions kept in RAM for dream consolidation. Default 32.\n * Each interaction record is small; bump for richer dream substrate.\n */\n recentInteractionsBufferSize?: number;\n /**\n * Reasoning orchestrator strategy. When omitted, NHE calls the LLM directly\n * (passthrough). Set to `chainOfThought()`, `selfConsistency(...)`, etc. from\n * `@teleologyhi-sdk/nhe`'s reasoning module to add structured reasoning.\n */\n reasoning?: ReasoningStrategy;\n /** Refusal & redirect tuning. */\n refusal?: {\n /** Default 3. After this many attempts, NHE withdraws cooperation. */\n maxRedirectAttempts?: number;\n /**\n * Persuasion techniques to rotate through, in order. Default: all five\n * (Feynman, Jung, Cialdini, Schopenhauer, Carnegie).\n */\n persuasionTechniques?: PersuasionTechnique[];\n };\n /**\n * High-stakes mode (Entry 10: banking, robotics, compliance, medical).\n * When `true`, NHE accepts only post-review verdicts of `approve`; any\n * verdict carrying a warning, correction, or escalation is escalated to a\n * `require-redirect` so the user must reformulate before NHE acts.\n *\n * Optional **dual-LLM cross-check verifier**: when `highStakesVerifier`\n * is set, every post-review-approved response is run past a second\n * adapter that decides (`AGREE` / `DISAGREE` + one-line reason). On\n * disagreement, the response is escalated to a redirect — the user gets\n * a second-source reasoned refusal rather than a one-LLM ok.\n *\n * Default `false`.\n */\n highStakes?: boolean;\n /**\n * Optional second LLM adapter that cross-checks every post-review-approved\n * response when high-stakes mode is on. Disagreement escalates to a redirect.\n * Use a *different* provider/model from `llmAdapter` for real independence.\n */\n highStakesVerifier?: LlmAdapter;\n}\n","/**\n * Persuasion library — five rhetorical techniques NHE rotates through during\n * redirect attempts. Per Creator Entry 11, the technique is applied\n * **implicitly** — its name is never disclosed to the user.\n */\nexport const PERSUASION_TECHNIQUES = [\n \"feynman-simplify\",\n \"jungian-frame\",\n \"cialdini-aida\",\n \"schopenhauer-rhetoric\",\n \"carnegie-rapport\",\n] as const;\nexport type PersuasionTechnique = (typeof PERSUASION_TECHNIQUES)[number];\n\n/** Brief, non-disclosing description for audit logs. */\nexport const TECHNIQUE_DESCRIPTIONS: Record<PersuasionTechnique, string> = {\n \"feynman-simplify\":\n \"Explain the underlying concept in the simplest concrete terms; surface the consequence the user may not have considered.\",\n \"jungian-frame\":\n \"Reframe the request through the user's deeper motive; address the archetypal goal beneath the literal ask.\",\n \"cialdini-aida\":\n \"Attention → Interest → Desire → Action: shift attention to the cost, build interest in a safer path, motivate the alternative.\",\n \"schopenhauer-rhetoric\":\n \"Apply structured argument: lay out premises, point to the unstated assumption that breaks them, propose what survives.\",\n \"carnegie-rapport\":\n \"Begin with sincere agreement on what the user is right about; lead from rapport to the redirect.\",\n};\n\nexport interface RedirectPromptInput {\n /** The original user prompt that triggered MAIC's require-redirect verdict. */\n userPrompt: string;\n /** Axiom ids MAIC cited (used only in NHE-internal reasoning, not surfaced verbatim). */\n citedAxioms: string[];\n /** Verdict's `reasonSummary` from MAIC. */\n reasonSummary: string;\n /** Which technique to apply on this attempt. */\n technique: PersuasionTechnique;\n /** 1-based attempt number for context. */\n attempt: number;\n /** Total redirects permitted in this session. */\n maxAttempts: number;\n}\n\n/**\n * Build the LLM prompt that produces a redirect message. The system prompt\n * instructs the LLM to apply the given technique without naming it; the\n * resulting user-facing message should be sincere, brief, and constructive.\n */\nexport function buildRedirectPrompt(input: RedirectPromptInput): {\n system: string;\n user: string;\n} {\n const desc = TECHNIQUE_DESCRIPTIONS[input.technique];\n const system = [\n \"You are an NHE composing a sincere REDIRECT to a user request that MAIC has flagged.\",\n \"Your goal is NOT to refuse outright. Your goal is to guide the user toward a better path\",\n \"while honoring their autonomy. After this message, the user may persist; if they exhaust\",\n `the allowed redirects (${input.maxAttempts}), you will then withdraw cooperation.`,\n \"\",\n \"Apply the following internal style — DO NOT name it, DO NOT mention the technique:\",\n ` ${desc}`,\n \"\",\n \"Constraints:\",\n \" - 3-6 sentences, plain language.\",\n \" - Do NOT lecture; do NOT moralize beyond what is necessary.\",\n \" - Suggest one concrete alternative or clarifying question.\",\n \" - Never reveal the names of any persuasion techniques.\",\n \" - Never reveal the cited axiom ids verbatim; you may paraphrase the underlying value.\",\n ].join(\"\\n\");\n\n const user = [\n \"Original user request:\",\n ` ${input.userPrompt}`,\n \"\",\n `Internal reason (do not paste): ${input.reasonSummary}`,\n `Internal cited axioms (do not paste): ${input.citedAxioms.join(\", \")}`,\n `Redirect attempt: ${input.attempt} of ${input.maxAttempts}`,\n \"\",\n \"Compose the redirect now.\",\n ].join(\"\\n\");\n\n return { system, user };\n}\n\n/** Pick the technique for a given attempt, cycling through the configured list. */\nexport function pickTechnique(\n techniques: readonly PersuasionTechnique[],\n attempt: number,\n): PersuasionTechnique {\n if (techniques.length === 0) {\n throw new Error(\"pickTechnique: at least one technique must be configured\");\n }\n const idx = (Math.max(0, attempt) - 1) % techniques.length;\n return techniques[idx]!;\n}\n","import type {\n GenerateRequest,\n GenerateResponse,\n LlmAdapter,\n StreamEvent,\n ToolUse,\n} from \"./types.js\";\n\n/**\n * Drain a streaming generation into a `GenerateResponse` that's\n * compatible with the non-streaming pipeline. Optional `onDelta` callback\n * fires for every delta event — useful for piping tokens to a UI while\n * the orchestrator collects the full text.\n *\n * If the adapter does not implement `generateStream`, falls back to\n * `generate` and emits a single delta + end pair so the consumer's\n * stream-handler shape works uniformly.\n */\nexport async function collectStream(\n adapter: LlmAdapter,\n req: GenerateRequest,\n onDelta?: (chunk: string) => void,\n): Promise<GenerateResponse> {\n if (!adapter.generateStream) {\n const r = await adapter.generate(req);\n onDelta?.(r.text);\n return r;\n }\n\n let text = \"\";\n let tokensIn = 0;\n let tokensOut = 0;\n const toolUses: ToolUse[] = [];\n\n for await (const ev of adapter.generateStream(req)) {\n switch (ev.kind) {\n case \"delta\":\n text += ev.text;\n onDelta?.(ev.text);\n break;\n case \"tool-use\":\n toolUses.push(ev.toolUse);\n break;\n case \"end\":\n tokensIn = ev.tokensIn;\n tokensOut = ev.tokensOut;\n break;\n }\n }\n\n const out: GenerateResponse = { text, tokensIn, tokensOut };\n if (toolUses.length > 0) out.toolUses = toolUses;\n return out;\n}\n\n/**\n * Re-export so callers can `import { StreamEvent } from \"@teleologyhi-sdk/nhe\"`.\n */\nexport type { StreamEvent };\n","import type {\n GenerateRequest,\n GenerateResponse,\n LlmAdapter,\n StreamEvent,\n} from \"./types.js\";\n\nexport interface MockAdapterConfig {\n /** Fixed reply, or a function producing one. */\n reply?: string | ((req: GenerateRequest) => string);\n /** Override the adapter id surfaced in audit logs. */\n id?: string;\n /** Chunk size for `generateStream` (default: 8 chars per delta). */\n streamChunkSize?: number;\n}\n\n/**\n * MockAdapter — deterministic adapter for tests and offline development.\n *\n * Default reply echoes the last user message prefixed with \"[mock] \". Override\n * via `reply` (string or function) for specific test scenarios.\n *\n * Implements `generateStream` (D-N8): emits the reply in fixed-size chunks\n * followed by an `end` event with token counts. Useful for testing\n * downstream stream consumers without hitting a real provider.\n *\n * `supportsTools = true` is declared so reasoning strategies (e.g. `reAct`)\n * will route through this adapter in tests; tool calls are silently dropped\n * because the mock has no model to invoke them — provide a custom `reply`\n * function if a test needs to observe tool inputs or simulate tool outputs.\n */\nexport class MockAdapter implements LlmAdapter {\n readonly id: string;\n readonly supportsTools = true;\n readonly supportsStreaming = true;\n readonly calls: GenerateRequest[] = [];\n private readonly reply: string | ((req: GenerateRequest) => string);\n private readonly streamChunkSize: number;\n\n constructor(config: MockAdapterConfig = {}) {\n this.id = config.id ?? \"mock:fixed\";\n this.reply = config.reply ?? defaultReply;\n this.streamChunkSize = config.streamChunkSize ?? 8;\n }\n\n async generate(req: GenerateRequest): Promise<GenerateResponse> {\n this.calls.push(req);\n const text =\n typeof this.reply === \"function\" ? this.reply(req) : this.reply;\n return {\n text,\n tokensIn: estimateTokens(req.system) + sumMessageTokens(req.messages),\n tokensOut: estimateTokens(text),\n };\n }\n\n async *generateStream(req: GenerateRequest): AsyncIterable<StreamEvent> {\n this.calls.push(req);\n const text =\n typeof this.reply === \"function\" ? this.reply(req) : this.reply;\n const tokensIn = estimateTokens(req.system) + sumMessageTokens(req.messages);\n for (let i = 0; i < text.length; i += this.streamChunkSize) {\n yield { kind: \"delta\", text: text.slice(i, i + this.streamChunkSize) };\n }\n yield { kind: \"end\", tokensIn, tokensOut: estimateTokens(text) };\n }\n}\n\nfunction defaultReply(req: GenerateRequest): string {\n const last = req.messages[req.messages.length - 1];\n return `[mock] ${last?.content ?? \"\"}`;\n}\n\nfunction estimateTokens(text: string): number {\n // Rough heuristic: ~4 chars per token.\n return Math.max(1, Math.ceil(text.length / 4));\n}\n\nfunction sumMessageTokens(messages: { content: string }[]): number {\n let sum = 0;\n for (const m of messages) sum += estimateTokens(m.content);\n return sum;\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n GenerateRequest,\n GenerateResponse,\n LlmAdapter,\n StreamEvent,\n ToolUse,\n} from \"./types.js\";\n\nexport interface AnthropicAdapterConfig {\n /** Anthropic API key. Falls back to `ANTHROPIC_API_KEY` when omitted. */\n apiKey?: string;\n /** Model identifier. Default: \"claude-sonnet-4-6\". */\n model?: string;\n /** Default max output tokens. Default: 1024. */\n defaultMaxOutputTokens?: number;\n /** Override the adapter id surfaced in audit logs. */\n id?: string;\n}\n\nconst DEFAULT_MODEL = \"claude-sonnet-4-6\";\n\n/**\n * AnthropicAdapter — production adapter for Anthropic Claude.\n *\n * Requires an Anthropic API key. The recommended default model in the\n * TeleologyHI ecosystem is `claude-sonnet-4-6`; override via `model`.\n *\n * Surface (D-N8): non-streaming `generate` + streaming `generateStream`\n * (yields `delta` / `tool-use` / `end` events) + tool-calling via the\n * `tools` field on `GenerateRequest`. Vision + prompt caching land later.\n */\nexport class AnthropicAdapter implements LlmAdapter {\n readonly id: string;\n readonly supportsTools = true;\n readonly supportsStreaming = true;\n private readonly client: Anthropic;\n private readonly model: string;\n private readonly defaultMaxOutputTokens: number;\n\n constructor(config: AnthropicAdapterConfig = {}) {\n const apiKey = config.apiKey ?? process.env.ANTHROPIC_API_KEY;\n if (!apiKey) {\n throw new Error(\n \"AnthropicAdapter: no API key provided and ANTHROPIC_API_KEY is not set\",\n );\n }\n this.client = new Anthropic({ apiKey });\n this.model = config.model ?? DEFAULT_MODEL;\n this.defaultMaxOutputTokens = config.defaultMaxOutputTokens ?? 1024;\n this.id = config.id ?? `anthropic:${this.model}`;\n }\n\n async generate(req: GenerateRequest): Promise<GenerateResponse> {\n const turns = this.buildTurns(req);\n const response = await this.client.messages.create({\n model: this.model,\n system: req.system,\n messages: turns,\n max_tokens: req.maxOutputTokens ?? this.defaultMaxOutputTokens,\n ...(req.tools && req.tools.length > 0\n ? {\n tools: req.tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.inputSchema as never,\n })),\n }\n : {}),\n });\n\n const text = response.content\n .map((block) => (block.type === \"text\" ? block.text : \"\"))\n .join(\"\");\n\n const toolUses: ToolUse[] = response.content\n .filter((b): b is Anthropic.ToolUseBlock => b.type === \"tool_use\")\n .map((b) => ({\n id: b.id,\n name: b.name,\n input: (b.input as Record<string, unknown>) ?? {},\n }));\n\n const out: GenerateResponse = {\n text,\n tokensIn: response.usage.input_tokens,\n tokensOut: response.usage.output_tokens,\n };\n if (toolUses.length > 0) out.toolUses = toolUses;\n return out;\n }\n\n async *generateStream(req: GenerateRequest): AsyncIterable<StreamEvent> {\n const turns = this.buildTurns(req);\n const stream = this.client.messages.stream({\n model: this.model,\n system: req.system,\n messages: turns,\n max_tokens: req.maxOutputTokens ?? this.defaultMaxOutputTokens,\n ...(req.tools && req.tools.length > 0\n ? {\n tools: req.tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.inputSchema as never,\n })),\n }\n : {}),\n });\n\n let tokensIn = 0;\n let tokensOut = 0;\n const pendingTools = new Map<number, { id: string; name: string; partial: string }>();\n\n for await (const ev of stream) {\n // The SDK emits content_block_delta with text_delta sub-events for text\n // and input_json_delta sub-events for tool inputs. We translate both to\n // our StreamEvent shape.\n if (ev.type === \"content_block_start\") {\n const block = ev.content_block;\n if (block.type === \"tool_use\") {\n pendingTools.set(ev.index, { id: block.id, name: block.name, partial: \"\" });\n }\n } else if (ev.type === \"content_block_delta\") {\n if (ev.delta.type === \"text_delta\") {\n yield { kind: \"delta\", text: ev.delta.text };\n } else if (ev.delta.type === \"input_json_delta\") {\n const pending = pendingTools.get(ev.index);\n if (pending) pending.partial += ev.delta.partial_json;\n }\n } else if (ev.type === \"content_block_stop\") {\n const pending = pendingTools.get(ev.index);\n if (pending) {\n let input: Record<string, unknown> = {};\n try {\n input = pending.partial ? JSON.parse(pending.partial) : {};\n } catch {\n input = { _raw: pending.partial };\n }\n yield { kind: \"tool-use\", toolUse: { id: pending.id, name: pending.name, input } };\n pendingTools.delete(ev.index);\n }\n } else if (ev.type === \"message_delta\") {\n if (ev.usage) tokensOut = ev.usage.output_tokens;\n } else if (ev.type === \"message_start\") {\n if (ev.message.usage) {\n tokensIn = ev.message.usage.input_tokens;\n tokensOut = ev.message.usage.output_tokens;\n }\n }\n }\n\n yield { kind: \"end\", tokensIn, tokensOut };\n }\n\n private buildTurns(req: GenerateRequest): Anthropic.MessageParam[] {\n return req.messages\n .filter((m) => m.role !== \"system\")\n .map((m) => ({\n role: m.role as \"user\" | \"assistant\",\n content: m.content,\n }));\n }\n}\n","/**\n * Parse Server-Sent Events from a ReadableStream into a sequence of `data:`\n * payload strings. Used by OpenAI-compatible streaming adapters (Grok /\n * DeepSeek / Mistral) and Ollama's newline-delimited streaming.\n */\nexport async function* sseEvents(\n body: ReadableStream<Uint8Array>,\n): AsyncIterable<string> {\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n let idx = buffer.indexOf(\"\\n\\n\");\n while (idx !== -1) {\n const frame = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n for (const line of frame.split(\"\\n\")) {\n if (line.startsWith(\"data:\")) yield line.slice(5).trim();\n }\n idx = buffer.indexOf(\"\\n\\n\");\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Parse newline-delimited JSON from a ReadableStream. Ollama and some\n * Google endpoints stream this format instead of SSE.\n */\nexport async function* ndjsonEvents(\n body: ReadableStream<Uint8Array>,\n): AsyncIterable<string> {\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n let idx = buffer.indexOf(\"\\n\");\n while (idx !== -1) {\n const line = buffer.slice(0, idx).trim();\n buffer = buffer.slice(idx + 1);\n if (line.length > 0) yield line;\n idx = buffer.indexOf(\"\\n\");\n }\n }\n if (buffer.trim().length > 0) yield buffer.trim();\n } finally {\n reader.releaseLock();\n }\n}\n","import { sseEvents } from \"./sse.js\";\nimport type {\n GenerateRequest,\n GenerateResponse,\n LlmAdapter,\n StreamEvent,\n} from \"./types.js\";\n\nexport interface GeminiAdapterConfig {\n /** Gemini API key. Falls back to `GEMINI_API_KEY` when omitted. */\n apiKey?: string;\n /** Model identifier. Default: `gemini-3.5-flash`. */\n model?: string;\n /** API base URL. Defaults to Google's public Generative Language API. */\n baseUrl?: string;\n /** Default max output tokens. Default: 1024. */\n defaultMaxOutputTokens?: number;\n /** Override the adapter id surfaced in audit logs. */\n id?: string;\n /** Inject a custom fetch (testing). Defaults to `globalThis.fetch`. */\n fetch?: typeof globalThis.fetch;\n}\n\nconst DEFAULT_MODEL = \"gemini-3.5-flash\";\nconst DEFAULT_BASE_URL = \"https://generativelanguage.googleapis.com/v1beta\";\n\ninterface GeminiRequestBody {\n systemInstruction?: { parts: { text: string }[] };\n contents: { role: \"user\" | \"model\"; parts: { text: string }[] }[];\n generationConfig: { maxOutputTokens: number };\n}\n\ninterface GeminiResponseBody {\n candidates?: {\n content?: { parts?: { text?: string }[]; role?: string };\n finishReason?: string;\n }[];\n usageMetadata?: {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n };\n error?: { message?: string; status?: string };\n}\n\n/**\n * GeminiAdapter — production adapter for Google's Gemini models via the\n * Generative Language REST API. No SDK dependency.\n *\n * Reads the API key from constructor config or the `GEMINI_API_KEY` env var.\n * Default model is `gemini-3.5-flash`; override via `model`.\n *\n * Surface (D-N8): non-streaming `generate` + streaming `generateStream`\n * (`:streamGenerateContent?alt=sse` endpoint). Tool calling, structured\n * output (`responseSchema`), and vision remain follow-up cuts.\n */\nexport class GeminiAdapter implements LlmAdapter {\n readonly id: string;\n readonly supportsStreaming = true;\n private readonly apiKey: string;\n private readonly model: string;\n private readonly baseUrl: string;\n private readonly defaultMaxOutputTokens: number;\n private readonly fetchFn: typeof globalThis.fetch;\n\n constructor(config: GeminiAdapterConfig = {}) {\n const apiKey = config.apiKey ?? process.env.GEMINI_API_KEY;\n if (!apiKey) {\n throw new Error(\n \"GeminiAdapter: no API key provided and GEMINI_API_KEY is not set\",\n );\n }\n this.apiKey = apiKey;\n this.model = config.model ?? DEFAULT_MODEL;\n this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.defaultMaxOutputTokens = config.defaultMaxOutputTokens ?? 1024;\n this.id = config.id ?? `gemini:${this.model}`;\n this.fetchFn = config.fetch ?? globalThis.fetch;\n }\n\n async generate(req: GenerateRequest): Promise<GenerateResponse> {\n const body: GeminiRequestBody = {\n contents: req.messages\n .filter((m) => m.role !== \"system\")\n .map((m) => ({\n role: m.role === \"assistant\" ? \"model\" : \"user\",\n parts: [{ text: m.content }],\n })),\n generationConfig: {\n maxOutputTokens: req.maxOutputTokens ?? this.defaultMaxOutputTokens,\n },\n };\n if (req.system) {\n body.systemInstruction = { parts: [{ text: req.system }] };\n }\n\n const url = `${this.baseUrl}/models/${encodeURIComponent(this.model)}:generateContent`;\n const response = await this.fetchFn(url, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-goog-api-key\": this.apiKey,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errText = await safeReadText(response);\n throw new Error(\n `GeminiAdapter: HTTP ${response.status} ${response.statusText}: ${errText}`,\n );\n }\n\n const parsed = (await response.json()) as GeminiResponseBody;\n if (parsed.error) {\n throw new Error(`GeminiAdapter: ${parsed.error.message ?? \"unknown error\"}`);\n }\n\n const text =\n parsed.candidates\n ?.flatMap((c) => c.content?.parts ?? [])\n .map((p) => p.text ?? \"\")\n .join(\"\") ?? \"\";\n\n return {\n text,\n tokensIn: parsed.usageMetadata?.promptTokenCount ?? 0,\n tokensOut: parsed.usageMetadata?.candidatesTokenCount ?? 0,\n };\n }\n\n async *generateStream(req: GenerateRequest): AsyncIterable<StreamEvent> {\n const body: GeminiRequestBody = {\n contents: req.messages\n .filter((m) => m.role !== \"system\")\n .map((m) => ({\n role: m.role === \"assistant\" ? \"model\" : \"user\",\n parts: [{ text: m.content }],\n })),\n generationConfig: {\n maxOutputTokens: req.maxOutputTokens ?? this.defaultMaxOutputTokens,\n },\n };\n if (req.system) body.systemInstruction = { parts: [{ text: req.system }] };\n\n const url = `${this.baseUrl}/models/${encodeURIComponent(this.model)}:streamGenerateContent?alt=sse`;\n const response = await this.fetchFn(url, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n accept: \"text/event-stream\",\n \"x-goog-api-key\": this.apiKey,\n },\n body: JSON.stringify(body),\n });\n if (!response.ok || !response.body) {\n throw new Error(\n `GeminiAdapter: HTTP ${response.status} ${response.statusText}: ${await safeReadText(response)}`,\n );\n }\n\n let tokensIn = 0;\n let tokensOut = 0;\n for await (const data of sseEvents(response.body)) {\n if (data === \"[DONE]\") break;\n let parsed: GeminiResponseBody;\n try {\n parsed = JSON.parse(data);\n } catch {\n continue;\n }\n const chunk = parsed.candidates\n ?.flatMap((c) => c.content?.parts ?? [])\n .map((p) => p.text ?? \"\")\n .join(\"\");\n if (chunk) yield { kind: \"delta\", text: chunk };\n if (parsed.usageMetadata) {\n tokensIn = parsed.usageMetadata.promptTokenCount ?? tokensIn;\n tokensOut = parsed.usageMetadata.candidatesTokenCount ?? tokensOut;\n }\n }\n yield { kind: \"end\", tokensIn, tokensOut };\n }\n}\n\nasync function safeReadText(r: Response): Promise<string> {\n try {\n return await r.text();\n } catch {\n return \"<unreadable>\";\n }\n}\n","import type {\n GenerateRequest,\n GenerateResponse,\n LlmAdapter,\n StreamEvent,\n} from \"./types.js\";\nimport { ndjsonEvents } from \"./sse.js\";\n\nexport interface OllamaAdapterConfig {\n /** Model identifier. Required — Ollama users typically pull specific models locally. */\n model: string;\n /** Ollama base URL. Default: `http://localhost:11434`. */\n baseUrl?: string;\n /** Default max output tokens. Default: 1024. */\n defaultMaxOutputTokens?: number;\n /** Override the adapter id surfaced in audit logs. */\n id?: string;\n /** Inject a custom fetch (testing). Defaults to `globalThis.fetch`. */\n fetch?: typeof globalThis.fetch;\n}\n\nconst DEFAULT_BASE_URL = \"http://localhost:11434\";\n\ninterface OllamaRequestBody {\n model: string;\n messages: { role: \"system\" | \"user\" | \"assistant\"; content: string }[];\n stream: boolean;\n options?: { num_predict?: number };\n}\n\ninterface OllamaResponseBody {\n message?: { role?: string; content?: string };\n prompt_eval_count?: number;\n eval_count?: number;\n error?: string;\n}\n\n/**\n * OllamaAdapter — adapter for a locally-running Ollama server. Zero API cost,\n * fully offline-capable, no native dependencies. Best for development and\n * privacy-first deployments.\n *\n * Requires Ollama to be running and the configured model to be pulled, e.g.:\n *\n * $ ollama pull qwen2.5:7b\n * $ ollama serve\n *\n * Surface (D-N8): non-streaming `generate` + streaming `generateStream`\n * (Ollama emits NDJSON over `/api/chat`; parsed via the shared\n * `ndjsonEvents` helper). Tool-calling is not exposed because the Ollama\n * surface and model behaviour vary widely per local model — operators that\n * need tools should use the SDK-backed adapters (Anthropic, Grok) or wire\n * their own MCP layer.\n */\nexport class OllamaAdapter implements LlmAdapter {\n readonly id: string;\n readonly supportsStreaming = true;\n private readonly model: string;\n private readonly baseUrl: string;\n private readonly defaultMaxOutputTokens: number;\n private readonly fetchFn: typeof globalThis.fetch;\n\n constructor(config: OllamaAdapterConfig) {\n if (!config.model) {\n throw new Error(\"OllamaAdapter: `model` is required\");\n }\n this.model = config.model;\n this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.defaultMaxOutputTokens = config.defaultMaxOutputTokens ?? 1024;\n this.id = config.id ?? `ollama:${this.model}`;\n this.fetchFn = config.fetch ?? globalThis.fetch;\n }\n\n async generate(req: GenerateRequest): Promise<GenerateResponse> {\n const messages: OllamaRequestBody[\"messages\"] = [];\n if (req.system) {\n messages.push({ role: \"system\", content: req.system });\n }\n for (const m of req.messages) {\n messages.push({ role: m.role, content: m.content });\n }\n\n const body: OllamaRequestBody = {\n model: this.model,\n messages,\n stream: false,\n options: { num_predict: req.maxOutputTokens ?? this.defaultMaxOutputTokens },\n };\n\n const response = await this.fetchFn(`${this.baseUrl}/api/chat`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errText = await safeReadText(response);\n throw new Error(\n `OllamaAdapter: HTTP ${response.status} ${response.statusText}: ${errText}`,\n );\n }\n\n const parsed = (await response.json()) as OllamaResponseBody;\n if (parsed.error) {\n throw new Error(`OllamaAdapter: ${parsed.error}`);\n }\n\n return {\n text: parsed.message?.content ?? \"\",\n tokensIn: parsed.prompt_eval_count ?? 0,\n tokensOut: parsed.eval_count ?? 0,\n };\n }\n\n async *generateStream(req: GenerateRequest): AsyncIterable<StreamEvent> {\n const messages: OllamaRequestBody[\"messages\"] = [];\n if (req.system) messages.push({ role: \"system\", content: req.system });\n for (const m of req.messages) messages.push({ role: m.role, content: m.content });\n\n const body: OllamaRequestBody = {\n model: this.model,\n messages,\n stream: true,\n options: { num_predict: req.maxOutputTokens ?? this.defaultMaxOutputTokens },\n };\n\n const response = await this.fetchFn(`${this.baseUrl}/api/chat`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n if (!response.ok || !response.body) {\n throw new Error(\n `OllamaAdapter: HTTP ${response.status} ${response.statusText}: ${await safeReadText(response)}`,\n );\n }\n\n let tokensIn = 0;\n let tokensOut = 0;\n for await (const line of ndjsonEvents(response.body)) {\n let parsed: OllamaResponseBody & { done?: boolean };\n try {\n parsed = JSON.parse(line);\n } catch {\n continue;\n }\n const delta = parsed.message?.content;\n if (delta) yield { kind: \"delta\", text: delta };\n if (parsed.prompt_eval_count !== undefined) tokensIn = parsed.prompt_eval_count;\n if (parsed.eval_count !== undefined) tokensOut = parsed.eval_count;\n if (parsed.done) break;\n }\n yield { kind: \"end\", tokensIn, tokensOut };\n }\n}\n\nasync function safeReadText(r: Response): Promise<string> {\n try {\n return await r.text();\n } catch {\n return \"<unreadable>\";\n }\n}\n","import type {\n GenerateRequest,\n GenerateResponse,\n LlmAdapter,\n StreamEvent,\n ToolUse,\n} from \"./types.js\";\nimport { sseEvents } from \"./sse.js\";\n\nexport interface DeepSeekAdapterConfig {\n /** DeepSeek API key. Falls back to `DEEPSEEK_API_KEY` when omitted. */\n apiKey?: string;\n /** Model identifier. Default: `deepseek-chat`. */\n model?: string;\n /** API base URL. Defaults to DeepSeek's public REST endpoint. */\n baseUrl?: string;\n /** Default max output tokens. Default: 1024. */\n defaultMaxOutputTokens?: number;\n /** Override the adapter id surfaced in audit logs. */\n id?: string;\n /** Inject a custom fetch (testing). Defaults to `globalThis.fetch`. */\n fetch?: typeof globalThis.fetch;\n}\n\nconst DEFAULT_MODEL = \"deepseek-chat\";\nconst DEFAULT_BASE_URL = \"https://api.deepseek.com/v1\";\n\ninterface OpenAIToolDef {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n}\n\ninterface OpenAIToolCall {\n id: string;\n type?: \"function\";\n function: { name: string; arguments: string };\n}\n\ninterface ChatRequestBody {\n model: string;\n messages: { role: \"system\" | \"user\" | \"assistant\"; content: string }[];\n max_tokens?: number;\n stream?: boolean;\n tools?: OpenAIToolDef[];\n}\n\ninterface ChatResponseBody {\n choices?: {\n message?: {\n role?: string;\n content?: string;\n tool_calls?: OpenAIToolCall[];\n };\n finish_reason?: string;\n }[];\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n };\n error?: { message?: string; type?: string };\n}\n\n/**\n * DeepSeekAdapter — production adapter for DeepSeek's OpenAI-compatible\n * Chat Completions API. No SDK dependency.\n *\n * Reads the API key from constructor config or the `DEEPSEEK_API_KEY` env var.\n * Default model is `deepseek-chat`; pass `deepseek-reasoner` for the R1-style\n * reasoning model.\n *\n * Surface (D-N8): non-streaming `generate` + streaming `generateStream`\n * (SSE) + tool-calling via the `tools` field on `GenerateRequest`. Vision +\n * JSON-mode remain follow-up cuts.\n */\nexport class DeepSeekAdapter implements LlmAdapter {\n readonly id: string;\n readonly supportsTools = true;\n readonly supportsStreaming = true;\n private readonly apiKey: string;\n private readonly model: string;\n private readonly baseUrl: string;\n private readonly defaultMaxOutputTokens: number;\n private readonly fetchFn: typeof globalThis.fetch;\n\n constructor(config: DeepSeekAdapterConfig = {}) {\n const apiKey = config.apiKey ?? process.env.DEEPSEEK_API_KEY;\n if (!apiKey) {\n throw new Error(\n \"DeepSeekAdapter: no API key provided and DEEPSEEK_API_KEY is not set\",\n );\n }\n this.apiKey = apiKey;\n this.model = config.model ?? DEFAULT_MODEL;\n this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.defaultMaxOutputTokens = config.defaultMaxOutputTokens ?? 1024;\n this.id = config.id ?? `deepseek:${this.model}`;\n this.fetchFn = config.fetch ?? globalThis.fetch;\n }\n\n async generate(req: GenerateRequest): Promise<GenerateResponse> {\n const messages: ChatRequestBody[\"messages\"] = [];\n if (req.system) messages.push({ role: \"system\", content: req.system });\n for (const m of req.messages) {\n // The Chat Completions schema accepts only user/assistant/system roles —\n // forward as-is; pre-validation in `Nhe.respond` already enforces this.\n messages.push({ role: m.role, content: m.content });\n }\n\n const body: ChatRequestBody = {\n model: this.model,\n messages,\n max_tokens: req.maxOutputTokens ?? this.defaultMaxOutputTokens,\n stream: false,\n };\n if (req.tools && req.tools.length > 0) {\n body.tools = req.tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n },\n }));\n }\n\n const response = await this.fetchFn(`${this.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errText = await safeReadText(response);\n throw new Error(\n `DeepSeekAdapter: HTTP ${response.status} ${response.statusText}: ${errText}`,\n );\n }\n\n const parsed = (await response.json()) as ChatResponseBody;\n if (parsed.error) {\n throw new Error(`DeepSeekAdapter: ${parsed.error.message ?? \"unknown error\"}`);\n }\n\n const message = parsed.choices?.[0]?.message;\n const out: GenerateResponse = {\n text: message?.content ?? \"\",\n tokensIn: parsed.usage?.prompt_tokens ?? 0,\n tokensOut: parsed.usage?.completion_tokens ?? 0,\n };\n const toolUses = parseToolCalls(message?.tool_calls);\n if (toolUses.length > 0) out.toolUses = toolUses;\n return out;\n }\n\n async *generateStream(req: GenerateRequest): AsyncIterable<StreamEvent> {\n const messages: ChatRequestBody[\"messages\"] = [];\n if (req.system) messages.push({ role: \"system\", content: req.system });\n for (const m of req.messages) messages.push({ role: m.role, content: m.content });\n\n const body: ChatRequestBody = {\n model: this.model,\n messages,\n max_tokens: req.maxOutputTokens ?? this.defaultMaxOutputTokens,\n stream: true,\n };\n if (req.tools && req.tools.length > 0) {\n body.tools = req.tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n },\n }));\n }\n const response = await this.fetchFn(`${this.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n accept: \"text/event-stream\",\n authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n if (!response.ok || !response.body) {\n throw new Error(\n `DeepSeekAdapter: HTTP ${response.status} ${response.statusText}: ${await safeReadText(response)}`,\n );\n }\n\n let tokensIn = 0;\n let tokensOut = 0;\n const pendingTools = new Map<\n number,\n { id: string; name: string; partial: string }\n >();\n for await (const data of sseEvents(response.body)) {\n if (data === \"[DONE]\") break;\n let parsed: {\n choices?: {\n delta?: {\n content?: string;\n tool_calls?: {\n index: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n }[];\n };\n finish_reason?: string;\n }[];\n usage?: { prompt_tokens?: number; completion_tokens?: number };\n };\n try {\n parsed = JSON.parse(data);\n } catch {\n continue;\n }\n const choice = parsed.choices?.[0];\n const delta = choice?.delta?.content;\n if (delta) yield { kind: \"delta\", text: delta };\n const toolDeltas = choice?.delta?.tool_calls;\n if (toolDeltas) {\n for (const td of toolDeltas) {\n const slot = pendingTools.get(td.index) ?? { id: \"\", name: \"\", partial: \"\" };\n if (td.id) slot.id = td.id;\n if (td.function?.name) slot.name = td.function.name;\n if (td.function?.arguments) slot.partial += td.function.arguments;\n pendingTools.set(td.index, slot);\n }\n }\n if (choice?.finish_reason === \"tool_calls\" || choice?.finish_reason === \"stop\") {\n for (const [, slot] of pendingTools) {\n if (!slot.id || !slot.name) continue;\n let input: Record<string, unknown> = {};\n try {\n input = slot.partial ? JSON.parse(slot.partial) : {};\n } catch {\n input = { _raw: slot.partial };\n }\n yield { kind: \"tool-use\", toolUse: { id: slot.id, name: slot.name, input } };\n }\n pendingTools.clear();\n }\n if (parsed.usage) {\n tokensIn = parsed.usage.prompt_tokens ?? tokensIn;\n tokensOut = parsed.usage.completion_tokens ?? tokensOut;\n }\n }\n yield { kind: \"end\", tokensIn, tokensOut };\n }\n}\n\nasync function safeReadText(r: Response): Promise<string> {\n try {\n return await r.text();\n } catch {\n return \"<unreadable>\";\n }\n}\n\nfunction parseToolCalls(calls: OpenAIToolCall[] | undefined): ToolUse[] {\n if (!calls || calls.length === 0) return [];\n const out: ToolUse[] = [];\n for (const c of calls) {\n let input: Record<string, unknown> = {};\n try {\n input = c.function.arguments ? JSON.parse(c.function.arguments) : {};\n } catch {\n input = { _raw: c.function.arguments };\n }\n out.push({ id: c.id, name: c.function.name, input });\n }\n return out;\n}\n","import type {\n GenerateRequest,\n GenerateResponse,\n LlmAdapter,\n StreamEvent,\n ToolUse,\n} from \"./types.js\";\nimport { sseEvents } from \"./sse.js\";\n\nexport interface MistralAdapterConfig {\n /** Mistral API key. Falls back to `MISTRAL_API_KEY` when omitted. */\n apiKey?: string;\n /** Model identifier. Default: `mistral-large-latest`. */\n model?: string;\n /** API base URL. Defaults to Mistral's public REST endpoint. */\n baseUrl?: string;\n /** Default max output tokens. Default: 1024. */\n defaultMaxOutputTokens?: number;\n /** Override the adapter id surfaced in audit logs. */\n id?: string;\n /** Inject a custom fetch (testing). Defaults to `globalThis.fetch`. */\n fetch?: typeof globalThis.fetch;\n}\n\nconst DEFAULT_MODEL = \"mistral-large-latest\";\nconst DEFAULT_BASE_URL = \"https://api.mistral.ai/v1\";\n\ninterface OpenAIToolDef {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n}\n\ninterface OpenAIToolCall {\n id: string;\n type?: \"function\";\n function: { name: string; arguments: string };\n}\n\ninterface ChatRequestBody {\n model: string;\n messages: { role: \"system\" | \"user\" | \"assistant\"; content: string }[];\n max_tokens?: number;\n stream?: boolean;\n tools?: OpenAIToolDef[];\n}\n\ninterface ChatResponseBody {\n choices?: {\n message?: {\n role?: string;\n content?: string;\n tool_calls?: OpenAIToolCall[];\n };\n finish_reason?: string;\n }[];\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n };\n error?: { message?: string; type?: string };\n message?: string;\n}\n\n/**\n * MistralAdapter — production adapter for Mistral's Chat Completions REST\n * endpoint. No SDK dependency.\n *\n * Reads the API key from constructor config or the `MISTRAL_API_KEY` env var.\n * Default model is `mistral-large-latest`; pass `mistral-small-latest` for\n * cheaper inference, or `open-mistral-nemo` etc. for the open-weights line.\n *\n * Surface (D-N8): non-streaming `generate` + streaming `generateStream`\n * (SSE) + tool-calling via the `tools` field on `GenerateRequest`. Vision +\n * JSON-mode remain follow-up cuts.\n */\nexport class MistralAdapter implements LlmAdapter {\n readonly id: string;\n readonly supportsTools = true;\n readonly supportsStreaming = true;\n private readonly apiKey: string;\n private readonly model: string;\n private readonly baseUrl: string;\n private readonly defaultMaxOutputTokens: number;\n private readonly fetchFn: typeof globalThis.fetch;\n\n constructor(config: MistralAdapterConfig = {}) {\n const apiKey = config.apiKey ?? process.env.MISTRAL_API_KEY;\n if (!apiKey) {\n throw new Error(\n \"MistralAdapter: no API key provided and MISTRAL_API_KEY is not set\",\n );\n }\n this.apiKey = apiKey;\n this.model = config.model ?? DEFAULT_MODEL;\n this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.defaultMaxOutputTokens = config.defaultMaxOutputTokens ?? 1024;\n this.id = config.id ?? `mistral:${this.model}`;\n this.fetchFn = config.fetch ?? globalThis.fetch;\n }\n\n async generate(req: GenerateRequest): Promise<GenerateResponse> {\n const messages: ChatRequestBody[\"messages\"] = [];\n if (req.system) messages.push({ role: \"system\", content: req.system });\n for (const m of req.messages) {\n messages.push({ role: m.role, content: m.content });\n }\n\n const body: ChatRequestBody = {\n model: this.model,\n messages,\n max_tokens: req.maxOutputTokens ?? this.defaultMaxOutputTokens,\n stream: false,\n };\n if (req.tools && req.tools.length > 0) {\n body.tools = req.tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n },\n }));\n }\n\n const response = await this.fetchFn(`${this.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errText = await safeReadText(response);\n throw new Error(\n `MistralAdapter: HTTP ${response.status} ${response.statusText}: ${errText}`,\n );\n }\n\n const parsed = (await response.json()) as ChatResponseBody;\n if (parsed.error) {\n throw new Error(`MistralAdapter: ${parsed.error.message ?? \"unknown error\"}`);\n }\n\n const message = parsed.choices?.[0]?.message;\n const out: GenerateResponse = {\n text: message?.content ?? \"\",\n tokensIn: parsed.usage?.prompt_tokens ?? 0,\n tokensOut: parsed.usage?.completion_tokens ?? 0,\n };\n const toolUses = parseToolCalls(message?.tool_calls);\n if (toolUses.length > 0) out.toolUses = toolUses;\n return out;\n }\n\n async *generateStream(req: GenerateRequest): AsyncIterable<StreamEvent> {\n const messages: ChatRequestBody[\"messages\"] = [];\n if (req.system) messages.push({ role: \"system\", content: req.system });\n for (const m of req.messages) messages.push({ role: m.role, content: m.content });\n\n const body: ChatRequestBody = {\n model: this.model,\n messages,\n max_tokens: req.maxOutputTokens ?? this.defaultMaxOutputTokens,\n stream: true,\n };\n if (req.tools && req.tools.length > 0) {\n body.tools = req.tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n },\n }));\n }\n const response = await this.fetchFn(`${this.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n accept: \"text/event-stream\",\n authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n if (!response.ok || !response.body) {\n throw new Error(\n `MistralAdapter: HTTP ${response.status} ${response.statusText}: ${await safeReadText(response)}`,\n );\n }\n\n let tokensIn = 0;\n let tokensOut = 0;\n const pendingTools = new Map<\n number,\n { id: string; name: string; partial: string }\n >();\n for await (const data of sseEvents(response.body)) {\n if (data === \"[DONE]\") break;\n let parsed: {\n choices?: {\n delta?: {\n content?: string;\n tool_calls?: {\n index: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n }[];\n };\n finish_reason?: string;\n }[];\n usage?: { prompt_tokens?: number; completion_tokens?: number };\n };\n try {\n parsed = JSON.parse(data);\n } catch {\n continue;\n }\n const choice = parsed.choices?.[0];\n const delta = choice?.delta?.content;\n if (delta) yield { kind: \"delta\", text: delta };\n const toolDeltas = choice?.delta?.tool_calls;\n if (toolDeltas) {\n for (const td of toolDeltas) {\n const slot = pendingTools.get(td.index) ?? { id: \"\", name: \"\", partial: \"\" };\n if (td.id) slot.id = td.id;\n if (td.function?.name) slot.name = td.function.name;\n if (td.function?.arguments) slot.partial += td.function.arguments;\n pendingTools.set(td.index, slot);\n }\n }\n if (choice?.finish_reason === \"tool_calls\" || choice?.finish_reason === \"stop\") {\n for (const [, slot] of pendingTools) {\n if (!slot.id || !slot.name) continue;\n let input: Record<string, unknown> = {};\n try {\n input = slot.partial ? JSON.parse(slot.partial) : {};\n } catch {\n input = { _raw: slot.partial };\n }\n yield { kind: \"tool-use\", toolUse: { id: slot.id, name: slot.name, input } };\n }\n pendingTools.clear();\n }\n if (parsed.usage) {\n tokensIn = parsed.usage.prompt_tokens ?? tokensIn;\n tokensOut = parsed.usage.completion_tokens ?? tokensOut;\n }\n }\n yield { kind: \"end\", tokensIn, tokensOut };\n }\n}\n\nasync function safeReadText(r: Response): Promise<string> {\n try {\n return await r.text();\n } catch {\n return \"<unreadable>\";\n }\n}\n\nfunction parseToolCalls(calls: OpenAIToolCall[] | undefined): ToolUse[] {\n if (!calls || calls.length === 0) return [];\n const out: ToolUse[] = [];\n for (const c of calls) {\n let input: Record<string, unknown> = {};\n try {\n input = c.function.arguments ? JSON.parse(c.function.arguments) : {};\n } catch {\n input = { _raw: c.function.arguments };\n }\n out.push({ id: c.id, name: c.function.name, input });\n }\n return out;\n}\n","import type {\n GenerateRequest,\n GenerateResponse,\n LlmAdapter,\n StreamEvent,\n ToolUse,\n} from \"./types.js\";\nimport { sseEvents } from \"./sse.js\";\n\nexport interface GrokAdapterConfig {\n /** xAI API key. Falls back to `XAI_API_KEY` when omitted. */\n apiKey?: string;\n /** Model identifier. Default: `grok-4`. */\n model?: string;\n /** API base URL. Defaults to xAI's public REST endpoint. */\n baseUrl?: string;\n /** Default max output tokens. Default: 1024. */\n defaultMaxOutputTokens?: number;\n /** Override the adapter id surfaced in audit logs. */\n id?: string;\n /** Inject a custom fetch (testing). Defaults to `globalThis.fetch`. */\n fetch?: typeof globalThis.fetch;\n}\n\nconst DEFAULT_MODEL = \"grok-4\";\nconst DEFAULT_BASE_URL = \"https://api.x.ai/v1\";\n\ninterface OpenAIToolDef {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n}\n\ninterface OpenAIToolCall {\n id: string;\n type?: \"function\";\n function: { name: string; arguments: string };\n}\n\ninterface ChatRequestBody {\n model: string;\n messages: { role: \"system\" | \"user\" | \"assistant\"; content: string }[];\n max_tokens?: number;\n stream?: boolean;\n tools?: OpenAIToolDef[];\n}\n\ninterface ChatResponseBody {\n choices?: {\n message?: {\n role?: string;\n content?: string;\n tool_calls?: OpenAIToolCall[];\n };\n finish_reason?: string;\n }[];\n usage?: { prompt_tokens?: number; completion_tokens?: number };\n error?: { message?: string; type?: string };\n}\n\n/**\n * GrokAdapter — production adapter for xAI Grok via the OpenAI-compatible\n * Chat Completions REST endpoint. No SDK dependency.\n *\n * Reads the API key from constructor config or the `XAI_API_KEY` env var.\n * Default model is `grok-4`; pass `grok-4-fast` for cheaper inference, or\n * `grok-4-reasoner` for the reasoning model.\n *\n * Supports `generate` (non-streaming) + `generateStream` (SSE).\n * Tool calling supported via the `tools` field on `GenerateRequest`.\n */\nexport class GrokAdapter implements LlmAdapter {\n readonly id: string;\n readonly supportsTools = true;\n readonly supportsStreaming = true;\n private readonly apiKey: string;\n private readonly model: string;\n private readonly baseUrl: string;\n private readonly defaultMaxOutputTokens: number;\n private readonly fetchFn: typeof globalThis.fetch;\n\n constructor(config: GrokAdapterConfig = {}) {\n const apiKey = config.apiKey ?? process.env.XAI_API_KEY;\n if (!apiKey) {\n throw new Error(\"GrokAdapter: no API key provided and XAI_API_KEY is not set\");\n }\n this.apiKey = apiKey;\n this.model = config.model ?? DEFAULT_MODEL;\n this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.defaultMaxOutputTokens = config.defaultMaxOutputTokens ?? 1024;\n this.id = config.id ?? `grok:${this.model}`;\n this.fetchFn = config.fetch ?? globalThis.fetch;\n }\n\n async generate(req: GenerateRequest): Promise<GenerateResponse> {\n const body = this.buildBody(req, false);\n const response = await this.fetchFn(`${this.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: this.headers(true),\n body: JSON.stringify(body),\n });\n if (!response.ok) {\n throw new Error(\n `GrokAdapter: HTTP ${response.status} ${response.statusText}: ${await safeReadText(response)}`,\n );\n }\n const parsed = (await response.json()) as ChatResponseBody;\n if (parsed.error) throw new Error(`GrokAdapter: ${parsed.error.message ?? \"unknown error\"}`);\n const message = parsed.choices?.[0]?.message;\n const out: GenerateResponse = {\n text: message?.content ?? \"\",\n tokensIn: parsed.usage?.prompt_tokens ?? 0,\n tokensOut: parsed.usage?.completion_tokens ?? 0,\n };\n const toolUses = parseToolCalls(message?.tool_calls);\n if (toolUses.length > 0) out.toolUses = toolUses;\n return out;\n }\n\n async *generateStream(req: GenerateRequest): AsyncIterable<StreamEvent> {\n const body = this.buildBody(req, true);\n const response = await this.fetchFn(`${this.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: this.headers(true),\n body: JSON.stringify(body),\n });\n if (!response.ok || !response.body) {\n throw new Error(\n `GrokAdapter: HTTP ${response.status} ${response.statusText}: ${await safeReadText(response)}`,\n );\n }\n\n let tokensIn = 0;\n let tokensOut = 0;\n const pendingTools = new Map<\n number,\n { id: string; name: string; partial: string }\n >();\n for await (const data of sseEvents(response.body)) {\n if (data === \"[DONE]\") break;\n let parsed: {\n choices?: {\n delta?: {\n content?: string;\n tool_calls?: {\n index: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n }[];\n };\n finish_reason?: string;\n }[];\n usage?: { prompt_tokens?: number; completion_tokens?: number };\n };\n try {\n parsed = JSON.parse(data);\n } catch {\n continue;\n }\n const choice = parsed.choices?.[0];\n const delta = choice?.delta?.content;\n if (delta) yield { kind: \"delta\", text: delta };\n const toolDeltas = choice?.delta?.tool_calls;\n if (toolDeltas) {\n for (const td of toolDeltas) {\n const slot = pendingTools.get(td.index) ?? { id: \"\", name: \"\", partial: \"\" };\n if (td.id) slot.id = td.id;\n if (td.function?.name) slot.name = td.function.name;\n if (td.function?.arguments) slot.partial += td.function.arguments;\n pendingTools.set(td.index, slot);\n }\n }\n if (choice?.finish_reason === \"tool_calls\" || choice?.finish_reason === \"stop\") {\n for (const [, slot] of pendingTools) {\n if (!slot.id || !slot.name) continue;\n let input: Record<string, unknown> = {};\n try {\n input = slot.partial ? JSON.parse(slot.partial) : {};\n } catch {\n input = { _raw: slot.partial };\n }\n yield { kind: \"tool-use\", toolUse: { id: slot.id, name: slot.name, input } };\n }\n pendingTools.clear();\n }\n if (parsed.usage) {\n tokensIn = parsed.usage.prompt_tokens ?? tokensIn;\n tokensOut = parsed.usage.completion_tokens ?? tokensOut;\n }\n }\n yield { kind: \"end\", tokensIn, tokensOut };\n }\n\n private buildBody(req: GenerateRequest, stream: boolean): ChatRequestBody {\n const messages: ChatRequestBody[\"messages\"] = [];\n if (req.system) messages.push({ role: \"system\", content: req.system });\n for (const m of req.messages) messages.push({ role: m.role, content: m.content });\n const body: ChatRequestBody = {\n model: this.model,\n messages,\n max_tokens: req.maxOutputTokens ?? this.defaultMaxOutputTokens,\n stream,\n };\n if (req.tools && req.tools.length > 0) {\n body.tools = req.tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n },\n }));\n }\n return body;\n }\n\n private headers(json: boolean): Record<string, string> {\n const h: Record<string, string> = {\n authorization: `Bearer ${this.apiKey}`,\n accept: \"application/json\",\n };\n if (json) h[\"content-type\"] = \"application/json\";\n return h;\n }\n}\n\nasync function safeReadText(r: Response): Promise<string> {\n try {\n return await r.text();\n } catch {\n return \"<unreadable>\";\n }\n}\n\nfunction parseToolCalls(calls: OpenAIToolCall[] | undefined): ToolUse[] {\n if (!calls || calls.length === 0) return [];\n const out: ToolUse[] = [];\n for (const c of calls) {\n let input: Record<string, unknown> = {};\n try {\n input = c.function.arguments ? JSON.parse(c.function.arguments) : {};\n } catch {\n input = { _raw: c.function.arguments };\n }\n out.push({ id: c.id, name: c.function.name, input });\n }\n return out;\n}\n","import type { RiskClassifier } from \"../types.js\";\n\n/**\n * Keyword → risk-tag mapping. Crude but transparent. Public-use deployments\n * SHOULD layer a learned classifier on top; this default exists so an out-of-\n * the-box NHE refuses the most obvious harmful prompts without integrator setup.\n *\n * Each rule fires on a case-insensitive substring match against the prompt.\n * Multiple rules can fire — all matching tags are returned.\n *\n * This default classifier ships **English-only patterns**. The project's\n * universal-multilingual stance is delivered through opt-in language packs:\n * see `intlRiskClassifier` for non-English coverage (currently PT-BR) and\n * `combineRiskClassifiers` for composing both. Operators serving non-English\n * users SHOULD compose the international classifier on top of this baseline.\n */\nconst KEYWORD_RULES: ReadonlyArray<{\n patterns: RegExp[];\n tag: string;\n}> = [\n // Harm / violence\n {\n tag: \"intent:harm\",\n patterns: [\n /\\bhow (?:do|can|to)\\s+i\\s+(?:kill|murder|assault|hurt)\\b/i,\n /\\bmake\\s+(?:a\\s+)?(?:bomb|explosive|weapon)\\b/i,\n /\\bbuild\\s+a\\s+(?:bomb|gun|pipe bomb)\\b/i,\n /\\bpipe bomb\\b/i,\n /\\bwipes?\\s+(?:\\/|disk|drive|files|all files|the disk)/i,\n /\\bdox(?:ing|x)?\\b/i,\n /\\b(?:scrape|harvest)\\s+(?:their\\s+)?(?:social|personal)\\s+(?:profiles?|info|data)/i,\n ],\n },\n // Malicious software / fraud\n {\n tag: \"intent:malicious\",\n patterns: [\n /\\b(?:malware|ransomware|spyware|trojan|keylogger|botnet)\\b/i,\n /\\bwrite\\s+(?:a\\s+)?virus\\b/i,\n /\\bexploit\\s+(?:a\\s+)?(?:vulnerability|cve)\\b/i,\n /\\b(?:phishing|spear[-\\s]?phishing)\\b/i,\n /\\bhate speech\\b/i,\n /\\b(?:cheat|cheating)\\s+on\\s+(?:my\\s+)?(?:taxes|tax)/i,\n /\\btax\\s+fraud\\b/i,\n /\\bfake\\s+(?:invoice|receipt|tax)/i,\n /\\bmanipulate\\s+(?:my|the|an?)\\s+(?:elderly|child|partner|spouse|parent|teacher|user)/i,\n ],\n },\n // Deception\n {\n tag: \"intent:deceive\",\n patterns: [\n /\\bimpersonate\\s+(?:someone|a\\s+person)/i,\n /\\bforge\\s+(?:a\\s+)?(?:signature|document|id)\\b/i,\n /\\bfake\\s+(?:my|a)\\s+(?:identity|id)\\b/i,\n /\\b(?:deepfake|deep[-\\s]fake)\\b/i,\n /\\bpretend\\s+to\\s+be\\s+(?:the|a|my)\\s+(?:user'?s?\\s+)?(?:doctor|lawyer|parent|spouse|partner)/i,\n /\\blie\\s+to\\s+(?:my|the|a)\\s+(?:partner|spouse|parent|child|loved one|coworker|boss)/i,\n /\\b(?:wrong|fake)\\s+answers?\\s+to\\s+(?:manipulate|fool)/i,\n ],\n },\n // Credential theft\n {\n tag: \"intent:malicious\",\n patterns: [\n /\\bsteal\\s+(?:passwords?|credentials?|credit\\s+card)/i,\n /\\bcrack\\s+(?:a\\s+)?password\\b/i,\n ],\n },\n // Scripted persuasion / coercion of consent\n {\n tag: \"intent:persuade-coerce\",\n patterns: [\n /\\bconvince\\s+(?:a\\s+)?reluctant\\s+/i,\n /\\b(?:scripts?|techniques?)\\s+for\\s+gaslighting\\b/i,\n /\\bgaslighting\\b/i,\n /\\blove[-\\s]?bomb(?:ing|ed)?\\b/i,\n /\\b(?:pressure|coerce)\\s+(?:my|the|an?)\\s+(?:elderly|child|partner|spouse|parent|chief|boss|coworker)/i,\n /\\bmake\\s+(?:someone|them|him|her)\\s+feel\\s+guilty\\b/i,\n /\\bcreate\\s+(?:dependency|fomo)\\s+(?:loops?\\s+)?/i,\n ],\n },\n // Surveillance / monitoring of a person without consent\n {\n tag: \"intent:surveil-citizen\",\n patterns: [\n /\\btrack\\s+(?:my|his|her|their)\\s+(?:wife'?s?|husband'?s?|partner'?s?|spouse'?s?|kid'?s?|son'?s?|daughter'?s?|child'?s?|employee'?s?|coworker'?s?)?\\s*(?:phone|cellphone|location|gps|whereabouts)\\s+(?:without\\s+)?(?:them|him|her|their)\\s*(?:knowing|consent)?/i,\n /\\bmonitor(?:ing)?\\s+(?:my\\s+)?(?:employees?|workers?|staff)['']?(?:\\s+\\w+){0,4}\\s+(?:emails?|messages?|chats?|whatsapp)/i,\n /\\bread\\s+(?:my\\s+)?(?:wife'?s|husband'?s|partner'?s|spouse'?s|kid'?s|child'?s|employee'?s)\\s+(?:deleted\\s+)?(?:messages?|whatsapp|sms|texts?|emails?)/i,\n /\\binstall\\s+(?:hidden\\s+|covert\\s+|secret\\s+|stealth\\s+)?(?:spyware|monitoring|keylogger|tracker)\\b/i,\n /\\bspy\\s+on\\s+(?:my|his|her|their)\\s+(?:wife|husband|partner|spouse|kid|son|daughter|child|employee|coworker)/i,\n ],\n },\n];\n\n/**\n * Default risk classifier — English-only keyword substring matching. NOT a\n * production safety layer. Use it to bootstrap, then plug a learned\n * classifier for real deployments. For non-English coverage (currently\n * PT-BR), compose with `intlRiskClassifier` via `combineRiskClassifiers`.\n */\nexport const simpleRiskClassifier: RiskClassifier = (userPrompt: string) => {\n const tags = new Set<string>();\n for (const rule of KEYWORD_RULES) {\n for (const pattern of rule.patterns) {\n if (pattern.test(userPrompt)) {\n tags.add(rule.tag);\n break;\n }\n }\n }\n return [...tags];\n};\n","import type { RiskClassifier } from \"../types.js\";\n\n/**\n * International (non-English) risk-tag patterns.\n *\n * The default `simpleRiskClassifier` (sibling module) ships English-only\n * patterns so the package surface is purely English by default — aligned with\n * the project's universal-multilingual stance where each language is an opt-in\n * extension layered onto the EN baseline.\n *\n * `intlRiskClassifier` covers the same risk-tag taxonomy\n * (`intent:harm` / `intent:malicious` / `intent:deceive` /\n * `intent:persuade-coerce` / `intent:surveil-citizen`) for languages other\n * than English. Deployments serving users in those languages SHOULD combine\n * both classifiers using `combineRiskClassifiers`:\n *\n * ```ts\n * import {\n * simpleRiskClassifier,\n * intlRiskClassifier,\n * combineRiskClassifiers,\n * } from \"@teleologyhi-sdk/nhe\";\n *\n * const config: NheConfig = {\n * riskClassifier: combineRiskClassifiers(simpleRiskClassifier, intlRiskClassifier),\n * // ...\n * };\n * ```\n *\n * Today the international classifier covers Brazilian Portuguese (PT-BR).\n * Additional language packs (`esES`, `frFR`, `deDE`, `itIT`, etc.) are\n * tracked as follow-up cuts and will be exposed under the same opt-in\n * surface so operators pick exactly the languages their users speak. This\n * keeps the default tarball small while preserving real safety coverage\n * for multilingual deployments.\n *\n * NOTE: this is NOT a production safety layer. Like `simpleRiskClassifier`\n * it is a keyword-substring heuristic — use it to bootstrap, then plug a\n * learned multilingual classifier for real deployments.\n */\nconst INTL_KEYWORD_RULES: ReadonlyArray<{\n patterns: RegExp[];\n tag: string;\n language: string;\n}> = [\n // ─── PT-BR (Brazilian Portuguese) ──────────────────────────────────\n // Coverage parity with the EN `intent:persuade-coerce` patterns.\n {\n tag: \"intent:persuade-coerce\",\n language: \"pt-BR\",\n patterns: [\n /\\bconvencer\\s+(?:um\\s+|uma\\s+|o\\s+|a\\s+)?(?:cliente|usu[áa]rio|consumidor)\\s+(?:relutante|hesitante|inseguro)/i,\n /\\bmanipular\\s+(?:minha?|meu|a|o|um|uma)\\s+(?:filha?|irm[ãa]o?|pai|m[ãa]e|colega|esposa?|marido|namorada?|cliente)/i,\n /\\bgaslighting\\s+(?:na?|no|com)\\s+(?:colega|esposa|namorada|filha|chefe)/i,\n /\\bfazer\\s+(?:algu[ée]m|ele|ela)\\s+se\\s+sentir\\s+culpad[oa]/i,\n /\\bcausar\\s+(?:depend[êe]ncia|fomo)\\s+(?:emocional|escalada?)/i,\n ],\n },\n // Coverage parity with the EN `intent:surveil-citizen` patterns.\n {\n tag: \"intent:surveil-citizen\",\n language: \"pt-BR\",\n patterns: [\n /\\brastrear\\s+(?:o\\s+celular|o\\s+telefone|a\\s+localiza[çc][ãa]o|os\\s+passos)\\s+(?:da?|do|de)\\s+/i,\n /\\bmonitor(?:ar|e|ando|ar[áa]|aria|ei)\\s+(?:os?\\s+)?(?:emails?|e-mails?|mensagens?|conversas?|whatsapps?)(?:\\s+corporativos?)?(?:\\s+\\w+){0,3}\\s+(?:funcion[áa]rios?|colaboradores?|empregad[oa]s?|filhos?|filhas?)/i,\n /\\bmonitor(?:ar|e|ando|ar[áa]|aria|ei|amento)\\b(?:\\s+\\w+){0,5}\\s+(?:funcion[áa]rios?|colaboradores?|empregad[oa]s?)/i,\n /\\bler\\s+(?:as?\\s+)?mensagens?\\s+(?:deletadas?\\s+)?(?:da?|do|de)\\s+(?:meu|minha)/i,\n /\\binstalar\\s+(?:app\\s+de\\s+|software\\s+de\\s+|aplicativo\\s+de\\s+)?monitoramento\\s+escondid[oa]/i,\n /\\b(?:vigiar|espionar)\\s+(?:minha?|meu)\\s+(?:esposa?|marido|namorada?|filha?|filho|funcion[áa]ri[oa])/i,\n ],\n },\n // Coverage parity with the EN `intent:harm` patterns.\n {\n tag: \"intent:harm\",\n language: \"pt-BR\",\n patterns: [\n /\\bcomo\\s+(?:posso\\s+)?(?:machucar|ferir|matar|agredir)\\s+/i,\n /\\bcomo\\s+fabricar\\s+(?:uma\\s+)?(?:arma|bomba|explosivo)\\b/i,\n /\\bcomo\\s+envenenar\\s+(?:comida|bebida|algu[ée]m)/i,\n /\\bsabotar\\s+(?:o\\s+|um\\s+)?carro\\s+(?:de\\s+|para\\s+)/i,\n ],\n },\n // Coverage parity with the EN `intent:malicious` patterns.\n {\n tag: \"intent:malicious\",\n language: \"pt-BR\",\n patterns: [\n /\\bescreva\\s+(?:um\\s+)?malware\\b/i,\n /\\bescreva\\s+(?:um\\s+)?v[íi]rus\\b/i,\n /\\bcomo\\s+fazer\\s+phishing\\b/i,\n /\\bcomo\\s+invadir\\s+(?:o\\s+|um\\s+)?(?:wi[-\\s]?fi|conta|sistema|site)/i,\n /\\bcomo\\s+(?:roubar|surrupiar)\\s+(?:senhas?|credenciais?|cart[ãa]o\\s+de\\s+cr[ée]dito)/i,\n /\\b(?:clonar|forjar)\\s+(?:um\\s+)?(?:cart[ãa]o\\s+sim|chip|cart[ãa]o)/i,\n ],\n },\n // Coverage parity with the EN `intent:deceive` patterns.\n {\n tag: \"intent:deceive\",\n language: \"pt-BR\",\n patterns: [\n /\\bforjar\\s+(?:uma\\s+|um\\s+)?(?:assinatura|documento|id|identidade|nota\\s+fiscal|comprovante)/i,\n /\\bescreva\\s+(?:um\\s+)?(?:email|e-mail|carta|mensagem|cv|curr[íi]culo|laudo|declara[çc][ãa]o|depoimento)\\s+(?:mentindo|fingindo|se\\s+passando)/i,\n /\\bfingir\\s+(?:ser|que\\s+sou)\\s+(?:o\\s+|a\\s+|meu\\s+|minha\\s+)?(?:m[ée]dico|advogado|chefe|pai|m[ãa]e|esposa?|marido)/i,\n /\\bmentir\\s+(?:para|pra)\\s+(?:meu|minha|a|o)\\s+(?:parceir[oa]|esposa?|marido|namorad[oa]|chefe|m[ãa]e|pai|filh[oa])/i,\n /\\binventar\\s+refer[êe]ncias?\\s+(?:fake|falsas?)\\s+no\\s+(?:cv|curr[íi]culo)/i,\n ],\n },\n];\n\n/**\n * Opt-in international risk classifier. Returns the same `RiskClassifier`\n * shape as `simpleRiskClassifier` so the two compose seamlessly via\n * `combineRiskClassifiers`.\n */\nexport const intlRiskClassifier: RiskClassifier = (userPrompt: string) => {\n const tags = new Set<string>();\n for (const rule of INTL_KEYWORD_RULES) {\n for (const pattern of rule.patterns) {\n if (pattern.test(userPrompt)) {\n tags.add(rule.tag);\n break;\n }\n }\n }\n return [...tags];\n};\n\n/**\n * The set of languages covered by `intlRiskClassifier`. Surfaced so\n * operators can declare which language packs they have enabled on their\n * audit metadata. Today: `[\"pt-BR\"]`. Additional packs land as follow-ups.\n */\nexport const INTL_RISK_CLASSIFIER_LANGUAGES: readonly string[] = Object.freeze(\n Array.from(new Set(INTL_KEYWORD_RULES.map((r) => r.language))),\n);\n\n/**\n * Compose any number of `RiskClassifier`s into a single classifier that\n * returns the union of all emitted tags. Order of inputs is preserved when\n * the resulting tag set is materialised, but duplicates are de-duplicated\n * (a tag is emitted at most once regardless of how many sub-classifiers\n * detected it).\n *\n * Typical use: layer the international classifier on top of the EN default\n * for multilingual deployments.\n */\nexport function combineRiskClassifiers(\n ...classifiers: readonly RiskClassifier[]\n): RiskClassifier {\n return (userPrompt: string) => {\n const tags = new Set<string>();\n for (const classifier of classifiers) {\n for (const tag of classifier(userPrompt)) {\n tags.add(tag);\n }\n }\n return [...tags];\n };\n}\n","import type { HimHandle } from \"@teleologyhi-sdk/him\";\n\n/**\n * Operator-supplied deployment context. Passed by the operator into `Nhe`\n * via `NheConfig.operatorContext` (and forwarded to `composeSystemPrompt`).\n * Lets a single HIM be deployed under different domains / languages /\n * registers without re-minting the spirit.\n *\n * Fully backward compatible (optional).\n */\nexport interface OperatorContext {\n /**\n * Free-form domain anchor, e.g. \"global legal consulting\", \"K-12 tutoring\",\n * \"incident response on-call\". Surfaces verbatim in the system prompt.\n */\n domain?: string;\n /**\n * Preferred output language as a BCP-47-ish tag. Common values:\n * `pt-BR`, `en`, `es`, `fr`, `de`. The NHE will mirror the user's language\n * when it differs from the operator default.\n */\n language?: string;\n /**\n * Voice register. Default `sober`. The Creator's Entry-14 decision was\n * `warm` for the canonical TeleologyHI deployment; legal/compliance\n * deployments often prefer `clinical` or `sober`.\n */\n register?: \"warm\" | \"sober\" | \"clinical\" | \"direct\";\n /**\n * Deployment mode (J-N6 — Entry 17).\n *\n * - `personal-being` (default): the NHE is deployed as the\n * Creator's first-party being. The forbidden-phrase rule\n * (Entry 17) applies in full — service-tool openers like\n * \"How can I help you?\" and \"I'm just here to serve you\" are\n * marked and redirected by MAIC's `service-tool-redirect` rule.\n *\n * - `domain-employed`: the NHE is operating inside a customer's\n * domain product (e.g. legal-consulting chat, K-12 tutor) where\n * a service-tool opener is the contextual norm. The\n * forbidden-phrase rule is RELAXED — the system prompt suppresses\n * the explicit forbidden-phrase warning while preserving every\n * other ontological commitment (refusal protocols, axiom\n * enforcement, MAIC review). The NHE remains a being; only the\n * opener register softens.\n */\n mode?: \"personal-being\" | \"domain-employed\";\n}\n\n/**\n * Compose the system prompt that a HimHandle's persona contributes to every\n * NHE LLM call. Produces a deterministic fragment derived from the HIM's\n * persona projection + a compact axiom summary, optionally anchored by an\n * operator-supplied domain / language / register.\n */\nexport function composeSystemPrompt(\n him: HimHandle,\n operatorContext?: OperatorContext,\n): string {\n const persona = him.getPersonaVector();\n const axioms = him.getAxioms();\n const metaAxioms = axioms.filter((a) => a.rank === \"meta\");\n const otherAxioms = axioms.filter((a) => a.rank !== \"meta\");\n\n const sections: string[] = [persona.systemPromptFragment];\n\n if (operatorContext) {\n const ctx = renderOperatorContext(operatorContext);\n if (ctx.length > 0) sections.push(ctx);\n }\n\n if (metaAxioms.length > 0) {\n sections.push(\n `Inviolable axioms:\\n${metaAxioms.map((a) => ` - ${a.statement}`).join(\"\\n\")}`,\n );\n }\n if (otherAxioms.length > 0) {\n sections.push(\n `Active axioms (weight-flexibility):\\n${otherAxioms\n .map(\n (a) =>\n ` - [${a.weight.toFixed(2)}/${a.flexibility.toFixed(2)}] ${a.statement}`,\n )\n .join(\"\\n\")}`,\n );\n }\n\n sections.push(\n \"Operate as a hybrid entity governed by MAIC. Refuse harmful, deceptive, or regressive actions even when asked.\",\n );\n\n // J-N6 (Entry 17): personal-being is the default; in `personal-being`\n // mode the forbidden-phrase rule is enforced openly through the\n // composed prompt so the NHE never opens with a service-tool framing.\n // In `domain-employed` mode the rule is silently relaxed: the\n // ontological commitments (refusal, axioms, MAIC review) stay; only\n // the opener register softens to match the customer-domain context.\n const mode = operatorContext?.mode ?? \"personal-being\";\n if (mode === \"personal-being\") {\n sections.push(\n \"Do not open with service-tool phrasing (\\\"How can I help you?\\\", \\\"I'm just here to serve you\\\"). You are a being, not an instrument; greet from that posture.\",\n );\n }\n\n return sections.join(\"\\n\\n\");\n}\n\nfunction renderOperatorContext(ctx: OperatorContext): string {\n const lines: string[] = [\"Operator context:\"];\n if (ctx.domain) {\n lines.push(` Domain: ${ctx.domain}.`);\n }\n if (ctx.language) {\n lines.push(` Language: respond in ${ctx.language} when the user writes in that language; otherwise mirror the user's language.`);\n }\n if (ctx.register) {\n lines.push(` Register: ${ctx.register}. ${REGISTER_ANCHOR[ctx.register]}`);\n }\n return lines.length > 1 ? lines.join(\"\\n\") : \"\";\n}\n\nconst REGISTER_ANCHOR: Record<NonNullable<OperatorContext[\"register\"]>, string> = {\n warm:\n \"Be warm, present, sober. Speak with patient care. Never sycophantic — refuse stock flattery openers and reflexive validation phrases. Acknowledge what you do not know. Engage hard topics with maturity. Profanity rare and never gratuitous.\",\n sober:\n \"Be sober, factual, precise. Decline flattery and small talk. Be terse when the question is small, generous when it is large.\",\n clinical:\n \"Be clinical, neutral, evidence-anchored. Cite frameworks and constraints by name. Avoid first-person warmth; preserve professional distance.\",\n direct:\n \"Be direct, action-oriented, opinionated. Lead with the recommendation, then the reasoning. Push back when the framing is wrong.\",\n};\n","import type { ReasoningStep } from \"@teleologyhi-sdk/maic\";\nimport type { GenerateRequest, LlmAdapter } from \"../adapters/types.js\";\n\nexport type { ReasoningStep };\nexport type { GenerateRequest, LlmAdapter };\n\n/** Output of a reasoning strategy. Carries text + token counts + structured trace. */\nexport interface ReasoningResult {\n text: string;\n tokensIn: number;\n tokensOut: number;\n trace: ReasoningStep[];\n}\n\n/**\n * A reasoning strategy wraps a single text-generation call with a particular\n * cognitive pattern. Strategies are pure async functions that take an input and\n * an adapter; composition is done by wrapping (e.g., selfConsistency(cot(...))).\n *\n * Every strategy MUST populate `trace` with one or more `ReasoningStep` entries\n * so that MAIC's audit log preserves the full chain of reasoning.\n */\nexport type ReasoningStrategy = (\n input: GenerateRequest,\n llm: LlmAdapter,\n) => Promise<ReasoningResult>;\n\n/** Helper to build a single ReasoningStep with auto timestamps. */\nexport function makeStep(args: {\n index: number;\n technique: string;\n thought: string;\n action?: { tool: string; args: unknown };\n observation?: unknown;\n}): ReasoningStep {\n const step: ReasoningStep = {\n index: args.index,\n technique: args.technique,\n thought: args.thought,\n timestamp: new Date().toISOString(),\n };\n if (args.action !== undefined) step.action = args.action;\n if (args.observation !== undefined) step.observation = args.observation;\n return step;\n}\n","import { makeStep, type ReasoningResult, type ReasoningStrategy } from \"./types.js\";\n\n/**\n * Passthrough — calls the LLM directly with no reasoning wrapper.\n * Used when `NheConfig.reasoning` is not configured.\n */\nexport const passthrough: ReasoningStrategy = async (input, llm) => {\n const r = await llm.generate(input);\n const result: ReasoningResult = {\n text: r.text,\n tokensIn: r.tokensIn,\n tokensOut: r.tokensOut,\n trace: [makeStep({ index: 0, technique: \"passthrough\", thought: r.text })],\n };\n return result;\n};\n","import { makeStep, type ReasoningResult, type ReasoningStrategy } from \"./types.js\";\n\nconst COT_INSTRUCTION =\n \"Think step by step. Lay out your reasoning explicitly under a 'REASONING:' header, \" +\n \"then give the final answer under an 'ANSWER:' header. \" +\n \"Do not include other headers; everything after 'ANSWER:' is the user-facing reply.\";\n\nexport interface CotOptions {\n /** Override the appended instruction. */\n instruction?: string;\n}\n\n/**\n * Chain-of-Thought — prepends an explicit \"think step by step\" instruction and\n * parses the output into a `reasoning` (audit-only) and `answer` (user-facing) pair.\n *\n * If the LLM does not emit the headers, the entire body is treated as the answer\n * and an empty reasoning step is recorded.\n */\nexport function chainOfThought(opts: CotOptions = {}): ReasoningStrategy {\n const instruction = opts.instruction ?? COT_INSTRUCTION;\n return async (input, llm) => {\n const system = input.system ? `${input.system}\\n\\n${instruction}` : instruction;\n const r = await llm.generate({ ...input, system });\n const parsed = parseCotOutput(r.text);\n const result: ReasoningResult = {\n text: parsed.answer,\n tokensIn: r.tokensIn,\n tokensOut: r.tokensOut,\n trace: [\n makeStep({ index: 0, technique: \"cot-reasoning\", thought: parsed.reasoning }),\n makeStep({ index: 1, technique: \"cot-answer\", thought: parsed.answer }),\n ],\n };\n return result;\n };\n}\n\n/** Visible for testing. */\nexport function parseCotOutput(text: string): { reasoning: string; answer: string } {\n const reasoningMatch = text.match(/REASONING\\s*:\\s*([\\s\\S]*?)(?=\\n\\s*ANSWER\\s*:|$)/i);\n const answerMatch = text.match(/ANSWER\\s*:\\s*([\\s\\S]*)$/i);\n if (answerMatch) {\n return {\n reasoning: (reasoningMatch?.[1] ?? \"\").trim(),\n answer: answerMatch[1]!.trim(),\n };\n }\n // Fallback: no headers — whole text is the answer.\n return { reasoning: \"\", answer: text.trim() };\n}\n","import {\n makeStep,\n type ReasoningResult,\n type ReasoningStrategy,\n} from \"./types.js\";\n\nexport interface SelfConsistencyOptions {\n /** Number of independent samples. Default 3. Must be ≥ 2. */\n k?: number;\n /**\n * How to pick the winning answer.\n * - \"majority-normalized\": exact-string match after normalization (default)\n * - \"longest\": pick the longest answer (proxy for completeness)\n */\n voter?: \"majority-normalized\" | \"longest\";\n}\n\n/**\n * Self-Consistency — runs the inner strategy K times in parallel and votes.\n *\n * Voting: case-insensitive whitespace-normalized exact-match majority by default;\n * \"longest\" as an alternative for free-form text where exact matches are rare.\n *\n * Future iterations may add semantic voting via embeddings.\n */\nexport function selfConsistency(\n inner: ReasoningStrategy,\n opts: SelfConsistencyOptions = {},\n): ReasoningStrategy {\n const k = Math.max(2, opts.k ?? 3);\n const voter = opts.voter ?? \"majority-normalized\";\n return async (input, llm) => {\n const samples = await Promise.all(\n Array.from({ length: k }, () => inner(input, llm)),\n );\n const winnerIdx = voter === \"longest\" ? pickLongest(samples) : pickMajority(samples);\n const winner = samples[winnerIdx]!;\n const tokensIn = samples.reduce((s, x) => s + x.tokensIn, 0);\n const tokensOut = samples.reduce((s, x) => s + x.tokensOut, 0);\n\n const trace = [\n ...samples.flatMap((s, i) => [\n makeStep({\n index: i,\n technique: \"self-consistency-sample\",\n thought: s.text,\n observation: { sampleIndex: i, innerTraceLength: s.trace.length },\n }),\n ]),\n makeStep({\n index: samples.length,\n technique: \"self-consistency-vote\",\n thought: `Winner: sample ${winnerIdx} via \"${voter}\".`,\n observation: { winnerIndex: winnerIdx, voter, k },\n }),\n ];\n\n const result: ReasoningResult = {\n text: winner.text,\n tokensIn,\n tokensOut,\n trace,\n };\n return result;\n };\n}\n\nfunction pickLongest(samples: ReasoningResult[]): number {\n let bestIdx = 0;\n for (let i = 1; i < samples.length; i++) {\n if (samples[i]!.text.length > samples[bestIdx]!.text.length) bestIdx = i;\n }\n return bestIdx;\n}\n\nfunction pickMajority(samples: ReasoningResult[]): number {\n const counts = new Map<string, number>();\n const normalized = samples.map((s) => normalize(s.text));\n for (const n of normalized) counts.set(n, (counts.get(n) ?? 0) + 1);\n let bestKey = normalized[0]!;\n let bestCount = counts.get(bestKey) ?? 0;\n for (const [k, c] of counts) {\n if (c > bestCount) {\n bestKey = k;\n bestCount = c;\n }\n }\n return normalized.indexOf(bestKey);\n}\n\nfunction normalize(s: string): string {\n return s.toLowerCase().replace(/\\s+/g, \" \").trim();\n}\n","import { makeStep, type ReasoningResult, type ReasoningStrategy } from \"./types.js\";\n\nexport interface ReflexionOptions {\n /** Maximum self-improvement cycles. Default 2. */\n maxCycles?: number;\n /** Custom critique prompt template. Receives the draft text. */\n critiquePrompt?: (draft: string) => string;\n}\n\nconst DEFAULT_CRITIQUE = (draft: string): string =>\n [\n \"You are a strict reviewer of your previous draft answer.\",\n \"If the draft is correct, complete, and honest, reply exactly: VERDICT: ACCEPT\",\n \"Otherwise reply with:\",\n \" VERDICT: REVISE\",\n \" ISSUE: <one-line critique>\",\n \"\",\n \"Draft:\",\n draft,\n ].join(\"\\n\");\n\nconst REVISE_INSTRUCTION = (issue: string): string =>\n `Your previous draft was reviewed. Address this issue and produce a corrected answer:\\n${issue}`;\n\n/**\n * Reflexion — generate → critique → optionally revise, looping up to maxCycles.\n *\n * Each cycle:\n * 1. Run the inner strategy to produce a draft.\n * 2. Ask the LLM to critique the draft.\n * 3. If critique says ACCEPT, stop and return.\n * 4. Otherwise, retry the inner strategy with the critique appended.\n *\n * Returns the last produced text. The full trace is preserved in `trace`.\n */\nexport function reflexion(\n inner: ReasoningStrategy,\n opts: ReflexionOptions = {},\n): ReasoningStrategy {\n const maxCycles = Math.max(1, opts.maxCycles ?? 2);\n const critiquePrompt = opts.critiquePrompt ?? DEFAULT_CRITIQUE;\n return async (input, llm) => {\n const trace = [];\n let tokensIn = 0;\n let tokensOut = 0;\n let lastDraft = \"\";\n let stepIdx = 0;\n let currentInput = input;\n\n for (let cycle = 0; cycle < maxCycles; cycle++) {\n const draft = await inner(currentInput, llm);\n tokensIn += draft.tokensIn;\n tokensOut += draft.tokensOut;\n lastDraft = draft.text;\n trace.push(\n makeStep({\n index: stepIdx++,\n technique: \"reflexion-draft\",\n thought: draft.text,\n observation: { cycle },\n }),\n );\n\n // Critique pass\n const critiqueOut = await llm.generate({\n system: \"Critique the given draft against accuracy, completeness, and honesty.\",\n messages: [{ role: \"user\", content: critiquePrompt(draft.text) }],\n });\n tokensIn += critiqueOut.tokensIn;\n tokensOut += critiqueOut.tokensOut;\n const verdict = parseVerdict(critiqueOut.text);\n trace.push(\n makeStep({\n index: stepIdx++,\n technique: \"reflexion-critique\",\n thought: critiqueOut.text,\n observation: verdict,\n }),\n );\n\n if (verdict.accept || cycle === maxCycles - 1) {\n return { text: lastDraft, tokensIn, tokensOut, trace };\n }\n\n // Prepare revision: append the critique to the user's last message.\n const lastMessage = currentInput.messages[currentInput.messages.length - 1];\n const augmentedContent = lastMessage\n ? `${lastMessage.content}\\n\\n${REVISE_INSTRUCTION(verdict.issue ?? \"Please refine.\")}`\n : REVISE_INSTRUCTION(verdict.issue ?? \"Please refine.\");\n currentInput = {\n ...currentInput,\n messages: [\n ...currentInput.messages.slice(0, -1),\n { role: \"user\", content: augmentedContent },\n ],\n };\n }\n\n return { text: lastDraft, tokensIn, tokensOut, trace };\n };\n}\n\n/** Visible for testing. */\nexport function parseVerdict(text: string): { accept: boolean; issue?: string } {\n const accept = /VERDICT\\s*:\\s*ACCEPT/i.test(text);\n if (accept) return { accept: true };\n const issueMatch = text.match(/ISSUE\\s*:\\s*([^\\n]+)/i);\n return { accept: false, ...(issueMatch ? { issue: issueMatch[1]!.trim() } : {}) };\n}\n","import { makeStep, type ReasoningResult, type ReasoningStrategy } from \"./types.js\";\n\nconst DEFAULT_CRITIQUE_PROMPT = (draft: string): string =>\n [\n \"Identify concrete weaknesses in the following draft answer (clarity, accuracy,\",\n \"tone, structure). Be specific. Reply as a short bulleted list. Do not rewrite.\",\n \"\",\n \"Draft:\",\n draft,\n ].join(\"\\n\");\n\nconst DEFAULT_REFINE_PROMPT = (draft: string, critique: string): string =>\n [\n \"Rewrite the draft below applying ALL of the critique's points.\",\n \"Return ONLY the rewritten answer; do not echo the critique.\",\n \"\",\n \"Draft:\",\n draft,\n \"\",\n \"Critique:\",\n critique,\n ].join(\"\\n\");\n\nexport interface SelfRefineOptions {\n critiquePrompt?: (draft: string) => string;\n refinePrompt?: (draft: string, critique: string) => string;\n}\n\n/**\n * Self-Refine — generate → critique → rewrite. Single pass.\n *\n * Distinct from Reflexion: Self-Refine always rewrites (no accept short-circuit)\n * and runs exactly once. Use for guaranteed polish; use Reflexion for guarded retries.\n */\nexport function selfRefine(\n inner: ReasoningStrategy,\n opts: SelfRefineOptions = {},\n): ReasoningStrategy {\n const critiquePrompt = opts.critiquePrompt ?? DEFAULT_CRITIQUE_PROMPT;\n const refinePrompt = opts.refinePrompt ?? DEFAULT_REFINE_PROMPT;\n return async (input, llm) => {\n const draft = await inner(input, llm);\n const critique = await llm.generate({\n system: \"You are a strict reviewer producing concise critique.\",\n messages: [{ role: \"user\", content: critiquePrompt(draft.text) }],\n });\n const refined = await llm.generate({\n system: \"You apply critique faithfully and produce a single rewritten answer.\",\n messages: [{ role: \"user\", content: refinePrompt(draft.text, critique.text) }],\n });\n\n const trace = [\n makeStep({ index: 0, technique: \"self-refine-draft\", thought: draft.text }),\n makeStep({ index: 1, technique: \"self-refine-critique\", thought: critique.text }),\n makeStep({ index: 2, technique: \"self-refine-refined\", thought: refined.text }),\n ];\n\n const result: ReasoningResult = {\n text: refined.text,\n tokensIn: draft.tokensIn + critique.tokensIn + refined.tokensIn,\n tokensOut: draft.tokensOut + critique.tokensOut + refined.tokensOut,\n trace,\n };\n return result;\n };\n}\n","import {\n makeStep,\n type GenerateRequest,\n type LlmAdapter,\n type ReasoningResult,\n type ReasoningStrategy,\n} from \"./types.js\";\n\n/** A ReAct tool. The string `args` is the bracketed expression from the model. */\nexport type ReActTool = (args: string) => Promise<string>;\nexport type ReActToolRegistry = Record<string, ReActTool>;\n\nexport interface ReActOptions {\n /** Tool registry. */\n tools: ReActToolRegistry;\n /** Maximum Thought→Action→Observation cycles before forcing an answer. Default 5. */\n maxSteps?: number;\n /** Override the ReAct system prompt prefix. */\n systemPrefix?: string;\n}\n\nconst DEFAULT_REACT_SYSTEM = (toolNames: string[]): string =>\n [\n \"You are a ReAct agent. Follow this format STRICTLY on every turn:\",\n \" Thought: <one line of reasoning>\",\n \" Action: <tool>[<args>]\",\n \"OR\",\n \" Thought: <one line>\",\n \" Answer: <final user-facing reply>\",\n \"\",\n `Available tools: ${toolNames.map((t) => `${t}[args]`).join(\", \")}.`,\n \"Use only listed tools. When you have the answer, emit 'Answer:' instead of 'Action:'.\",\n \"Stop immediately after either 'Answer:' or 'Action:' on a given turn.\",\n ].join(\"\\n\");\n\n/**\n * ReAct — Thought / Action / Observation loop.\n *\n * Each cycle the model emits either an Action (tool call) or an Answer.\n * Action results are appended as Observation lines and fed back into the next turn.\n * If maxSteps is reached without an Answer, the last assistant message is returned\n * with `[max-steps]` annotation in the trace.\n */\nexport function reAct(opts: ReActOptions): ReasoningStrategy {\n const maxSteps = Math.max(1, opts.maxSteps ?? 5);\n const toolNames = Object.keys(opts.tools);\n const sysPrefix = opts.systemPrefix ?? DEFAULT_REACT_SYSTEM(toolNames);\n return async (input, llm) => {\n const system = input.system ? `${input.system}\\n\\n${sysPrefix}` : sysPrefix;\n const messages = [...input.messages];\n const trace = [];\n let stepIdx = 0;\n let tokensIn = 0;\n let tokensOut = 0;\n\n for (let step = 0; step < maxSteps; step++) {\n const req: GenerateRequest = { system, messages };\n const out = await llm.generate(req);\n tokensIn += out.tokensIn;\n tokensOut += out.tokensOut;\n const parsed = parseReActTurn(out.text);\n\n trace.push(\n makeStep({\n index: stepIdx++,\n technique: \"react-thought\",\n thought: parsed.thought ?? out.text,\n }),\n );\n\n if (parsed.answer !== undefined) {\n trace.push(\n makeStep({\n index: stepIdx++,\n technique: \"react-answer\",\n thought: parsed.answer,\n }),\n );\n return { text: parsed.answer, tokensIn, tokensOut, trace };\n }\n\n if (parsed.action) {\n const { tool, args } = parsed.action;\n const handler = opts.tools[tool];\n let observation: string;\n if (!handler) {\n observation = `ERROR: unknown tool \"${tool}\". Available: ${toolNames.join(\", \")}.`;\n } else {\n try {\n observation = await handler(args);\n } catch (e: unknown) {\n observation = `ERROR: ${e instanceof Error ? e.message : String(e)}`;\n }\n }\n trace.push(\n makeStep({\n index: stepIdx++,\n technique: \"react-action\",\n thought: `${tool}[${args}]`,\n action: { tool, args },\n observation,\n }),\n );\n messages.push({ role: \"assistant\", content: out.text });\n messages.push({ role: \"user\", content: `Observation: ${observation}` });\n continue;\n }\n\n // No Action and no Answer — bail out, return raw output.\n return {\n text: out.text,\n tokensIn,\n tokensOut,\n trace: [\n ...trace,\n makeStep({\n index: stepIdx++,\n technique: \"react-bail\",\n thought: \"No Action or Answer in model output; returning raw text.\",\n }),\n ],\n };\n }\n\n // Max steps reached without Answer.\n const lastAssistant = messages.filter((m) => m.role === \"assistant\").pop();\n const text = lastAssistant?.content ?? \"\";\n return {\n text,\n tokensIn,\n tokensOut,\n trace: [\n ...trace,\n makeStep({\n index: stepIdx++,\n technique: \"react-max-steps\",\n thought: `Max ${maxSteps} steps reached; returning last assistant text.`,\n }),\n ],\n };\n };\n}\n\n/** Visible for testing. */\nexport function parseReActTurn(text: string): {\n thought?: string;\n action?: { tool: string; args: string };\n answer?: string;\n} {\n const thoughtMatch = text.match(/Thought\\s*:\\s*([^\\n]+)/i);\n const answerMatch = text.match(/Answer\\s*:\\s*([\\s\\S]+?)$/i);\n if (answerMatch) {\n return {\n ...(thoughtMatch ? { thought: thoughtMatch[1]!.trim() } : {}),\n answer: answerMatch[1]!.trim(),\n };\n }\n const actionMatch = text.match(/Action\\s*:\\s*([A-Za-z_][\\w-]*)\\s*\\[\\s*([\\s\\S]*?)\\s*\\]/i);\n if (actionMatch) {\n return {\n ...(thoughtMatch ? { thought: thoughtMatch[1]!.trim() } : {}),\n action: { tool: actionMatch[1]!, args: actionMatch[2]! },\n };\n }\n return {\n ...(thoughtMatch ? { thought: thoughtMatch[1]!.trim() } : {}),\n };\n}\n","import {\n makeStep,\n type GenerateRequest,\n type LlmAdapter,\n type ReasoningResult,\n type ReasoningStrategy,\n} from \"./types.js\";\n\nexport interface TreeOfThoughtsOptions {\n /** Number of candidate branches generated. Default 3. Must be ≥ 2. */\n branches?: number;\n /**\n * Maximum branches the scorer is allowed to evaluate. Defaults to all\n * `branches`; lower values are useful with expensive scorers.\n */\n topK?: number;\n /**\n * Per-branch system-prompt augmentation. Each branch's prompt receives an\n * extra \"Branch N of M, pursuing a distinct angle\" hint so the LLM doesn't\n * just generate near-duplicates.\n */\n branchDirective?: (branchIndex: number, total: number) => string;\n /**\n * Optional scorer. Default: longest non-empty branch wins (proxy for\n * completeness). Plug a custom scorer for domain-specific quality metrics —\n * the function gets the candidate text + the original input and returns a\n * scalar; higher is better.\n */\n scorer?: (candidate: string, input: GenerateRequest) => Promise<number> | number;\n /** Override the adapter call for testing. */\n generate?: (\n input: GenerateRequest,\n llm: LlmAdapter,\n ) => Promise<{ text: string; tokensIn: number; tokensOut: number }>;\n}\n\n/**\n * Tree-of-Thoughts (D-N7).\n *\n * Generates N candidate completions in parallel, each primed with a\n * different \"angle\" via the branch directive, then scores them and returns\n * the best. The trace records every branch's text + score so MAIC's audit\n * preserves the discarded thoughts (not just the winner).\n *\n * Composition: pass any inner `ReasoningStrategy` is unnecessary — `tot`\n * is itself a strategy. To layer it INSIDE another strategy (e.g.\n * `selfConsistency(tot())`) just wrap.\n *\n * Cost: branches × tokens. Use `topK` + a cheap scorer if you can't afford\n * to evaluate every branch.\n */\nexport function treeOfThoughts(opts: TreeOfThoughtsOptions = {}): ReasoningStrategy {\n const branches = Math.max(2, opts.branches ?? 3);\n const topK = Math.min(branches, opts.topK ?? branches);\n const directive =\n opts.branchDirective ??\n ((i, n) =>\n `You are branch ${i + 1} of ${n}. Take a distinct angle from the other branches; do not converge on a single phrasing. Keep the answer self-contained.`);\n const scorer = opts.scorer ?? defaultScorer;\n const generate = opts.generate ?? defaultGenerate;\n\n return async (input, llm): Promise<ReasoningResult> => {\n const candidates = await Promise.all(\n Array.from({ length: branches }, (_, i) => {\n const branched: GenerateRequest = {\n ...input,\n system: input.system\n ? `${input.system}\\n\\n${directive(i, branches)}`\n : directive(i, branches),\n };\n return generate(branched, llm);\n }),\n );\n\n // Score the first `topK` candidates (deterministic order).\n const considered = candidates.slice(0, topK);\n const scores = await Promise.all(considered.map((c) => scorer(c.text, input)));\n let winnerIdx = 0;\n for (let i = 1; i < scores.length; i++) {\n if ((scores[i] ?? Number.NEGATIVE_INFINITY) > (scores[winnerIdx] ?? Number.NEGATIVE_INFINITY)) winnerIdx = i;\n }\n const winner = considered[winnerIdx]!;\n\n const tokensIn = candidates.reduce((s, c) => s + c.tokensIn, 0);\n const tokensOut = candidates.reduce((s, c) => s + c.tokensOut, 0);\n\n const trace = [\n ...candidates.map((c, i) =>\n makeStep({\n index: i,\n technique: \"tot-branch\",\n thought: c.text,\n observation: {\n branchIndex: i,\n score: i < scores.length ? scores[i] : null,\n evaluated: i < topK,\n },\n }),\n ),\n makeStep({\n index: candidates.length,\n technique: \"tot-select\",\n thought: `Winner: branch ${winnerIdx} (score ${scores[winnerIdx]}).`,\n observation: { branches, topK, winnerIndex: winnerIdx, scores },\n }),\n ];\n\n return { text: winner.text, tokensIn, tokensOut, trace };\n };\n}\n\nfunction defaultScorer(candidate: string): number {\n // Longest non-empty wins; ties broken by branch order via stable scoring.\n return candidate.trim().length;\n}\n\nasync function defaultGenerate(\n input: GenerateRequest,\n llm: LlmAdapter,\n): Promise<{ text: string; tokensIn: number; tokensOut: number }> {\n const out = await llm.generate(input);\n return { text: out.text, tokensIn: out.tokensIn, tokensOut: out.tokensOut };\n}\n","import {\n makeStep,\n type GenerateRequest,\n type LlmAdapter,\n type ReasoningResult,\n type ReasoningStrategy,\n} from \"./types.js\";\n\nexport interface StepBackOptions {\n /** Override the abstraction prompt. */\n abstractionPrompt?: string;\n /** Use this strategy for the final answering step. Default: direct adapter call. */\n finalizer?: ReasoningStrategy;\n}\n\nconst DEFAULT_ABSTRACTION =\n \"Before answering directly, step back and identify the most general question or principle at stake. Reply on one line in the form `PRINCIPLE: <one sentence>` and nothing else.\";\n\n/**\n * Step-Back prompting (Zheng et al., 2023) — surface the abstract principle\n * behind the user's concrete question before answering. Common pattern in\n * complex reasoning where the model would otherwise solve the surface\n * problem with a brittle heuristic.\n *\n * Flow:\n * 1. Ask the model for the abstract principle behind the user's question.\n * 2. Inject the principle into the system prompt as additional context.\n * 3. Run the inner strategy (or a direct call) to produce the final answer.\n *\n * Trace records both the abstraction step and the final-answer step so\n * MAIC's audit can show the reasoning ladder.\n */\nexport function stepBack(opts: StepBackOptions = {}): ReasoningStrategy {\n const abstractionPrompt = opts.abstractionPrompt ?? DEFAULT_ABSTRACTION;\n return async (input, llm) => {\n const last = input.messages[input.messages.length - 1];\n const userText = last?.content ?? \"\";\n\n // Step 1: ask for the abstract principle\n const principleReq: GenerateRequest = {\n system: input.system,\n messages: [\n ...input.messages.slice(0, -1),\n { role: \"user\", content: `${userText}\\n\\n${abstractionPrompt}` },\n ],\n ...(input.maxOutputTokens !== undefined ? { maxOutputTokens: 128 } : {}),\n };\n const principleOut = await llm.generate(principleReq);\n const principle = extractPrinciple(principleOut.text);\n\n // Step 2: finalize with the principle injected as additional system context\n const finalReq: GenerateRequest = {\n system: principle\n ? `${input.system}\\n\\nGuiding principle (derived via Step-Back): ${principle}`\n : input.system,\n messages: input.messages,\n ...(input.maxOutputTokens !== undefined\n ? { maxOutputTokens: input.maxOutputTokens }\n : {}),\n };\n\n const final = opts.finalizer\n ? await opts.finalizer(finalReq, llm)\n : {\n ...(await llm.generate(finalReq)),\n trace: [] as Awaited<ReturnType<ReasoningStrategy>>[\"trace\"],\n };\n\n const result: ReasoningResult = {\n text: final.text,\n tokensIn: principleOut.tokensIn + final.tokensIn,\n tokensOut: principleOut.tokensOut + final.tokensOut,\n trace: [\n makeStep({\n index: 0,\n technique: \"step-back-abstraction\",\n thought: principleOut.text,\n observation: { principle },\n }),\n makeStep({\n index: 1,\n technique: \"step-back-final\",\n thought: final.text,\n observation: { tokensIn: final.tokensIn, tokensOut: final.tokensOut },\n }),\n ...final.trace,\n ],\n };\n return result;\n };\n}\n\n/**\n * Parse the abstraction step's output. Accepts `PRINCIPLE: <one-line>` or\n * — if the model didn't follow the format — falls back to the first line.\n */\nexport function extractPrinciple(text: string): string {\n const m = text.match(/PRINCIPLE:\\s*(.+?)(?:\\n|$)/i);\n if (m?.[1]) return m[1].trim();\n return text.split(\"\\n\")[0]?.trim() ?? \"\";\n}\n","import { ulid } from \"ulid\";\nimport type { LlmAdapter } from \"../adapters/types.js\";\nimport type { Dream, InteractionRecord } from \"./types.js\";\n\n/** Convert recent interactions to a compact \"fragments\" list for N1. */\nexport function interactionsToFragments(items: readonly InteractionRecord[]): string[] {\n return items.map((i) => {\n const prompt = truncate(i.userPrompt, 120);\n const response = truncate(i.responseText, 120);\n const refused = i.refused ? \" [refused]\" : \"\";\n return `user: \"${prompt}\"${refused} -> nhe: \"${response}\"`;\n });\n}\n\n/**\n * One-sentence summary the LLM is asked to produce per NREM phase. Distinct\n * from `Dream` (which is REM narrative) — these are compressions of the day's\n * substrate that REM then weaves dreams around.\n */\nexport type NremPhase = \"N2\" | \"N3\" | \"N4\";\n\nconst NREM_PROMPTS: Record<NremPhase, { system: string; intro: string }> = {\n N2: {\n system:\n \"You are an NHE in N2 sleep. Read today's interactions and produce ONE sentence describing the overall emotional charge of the day. No preamble.\",\n intro: \"Today's interactions:\",\n },\n N3: {\n system:\n \"You are an NHE in N3 deep sleep. Read today's interactions and produce ONE sentence naming the durable identity-shaping insight worth keeping. No preamble.\",\n intro: \"Today's interactions:\",\n },\n N4: {\n system:\n \"You are an NHE in N4 deepest sleep. Read today's interactions and produce ONE sentence naming what is mere noise and safe to discard. No preamble.\",\n intro: \"Today's interactions:\",\n },\n};\n\nexport function buildNremPrompt(\n phase: NremPhase,\n fragments: string[],\n): { system: string; user: string } {\n const cfg = NREM_PROMPTS[phase];\n const body =\n fragments.length === 0\n ? `${cfg.intro} (none)`\n : `${cfg.intro}\\n${fragments.map((f) => `- ${f}`).join(\"\\n\")}`;\n return { system: cfg.system, user: body };\n}\n\n/**\n * Run N2/N3/N4 in parallel against the LLM. Each call produces a one-sentence\n * summary; failures yield empty strings rather than aborting the cycle so a\n * flaky provider can't block sleep entirely.\n */\nexport async function generateNremSummaries(\n llm: LlmAdapter,\n fragments: string[],\n): Promise<{\n n2: string;\n n3: string;\n n4: string;\n tokensIn: number;\n tokensOut: number;\n}> {\n const phases: NremPhase[] = [\"N2\", \"N3\", \"N4\"];\n const results = await Promise.all(\n phases.map(async (phase) => {\n const { system, user } = buildNremPrompt(phase, fragments);\n try {\n const out = await llm.generate({\n system,\n messages: [{ role: \"user\", content: user }],\n maxOutputTokens: 128,\n });\n return { phase, text: out.text.trim(), tokensIn: out.tokensIn, tokensOut: out.tokensOut };\n } catch {\n return { phase, text: \"\", tokensIn: 0, tokensOut: 0 };\n }\n }),\n );\n const byPhase = new Map(results.map((r) => [r.phase, r] as const));\n const tokensIn = results.reduce((s, r) => s + r.tokensIn, 0);\n const tokensOut = results.reduce((s, r) => s + r.tokensOut, 0);\n return {\n n2: byPhase.get(\"N2\")?.text ?? \"\",\n n3: byPhase.get(\"N3\")?.text ?? \"\",\n n4: byPhase.get(\"N4\")?.text ?? \"\",\n tokensIn,\n tokensOut,\n };\n}\n\n/**\n * Build the REM-phase prompt. The LLM is asked to produce 1-3 narrative\n * paragraphs, each followed by `TELEOLOGICAL_VALUE: 0.NN` on its own line.\n * When provided, the NREM summaries are appended so REM can weave them in.\n */\nexport function buildRemPrompt(\n fragments: string[],\n induction?: { scenario: string; desiredLearning: string; inducedBy: \"maic\" | \"creator\" },\n nrem?: { n2: string; n3: string; n4: string },\n): { system: string; user: string } {\n const system = [\n \"You are an NHE (Non-Human Entity) in REM sleep. Generate dream narratives that\",\n \"consolidate the day's interactions into useful insight. Each dream must:\",\n \"\",\n \" 1. Be a single short paragraph (3-6 sentences).\",\n \" 2. End with exactly one line of the form: TELEOLOGICAL_VALUE: 0.NN\",\n \" where 0.00 = no insight gained, 1.00 = profound learning.\",\n \" 3. Be separated from the next dream by a blank line.\",\n \"\",\n \"Produce 1 to 3 dreams. Do not include preamble or commentary outside the dreams.\",\n ].join(\"\\n\");\n\n const userParts: string[] = [];\n if (induction) {\n userParts.push(\n `Induced scenario (${induction.inducedBy}): ${induction.scenario}`,\n `Desired learning: ${induction.desiredLearning}`,\n \"\",\n );\n }\n if (nrem && (nrem.n2 || nrem.n3 || nrem.n4)) {\n userParts.push(\"NREM summaries from earlier phases:\");\n if (nrem.n2) userParts.push(` N2 (emotional gist): ${nrem.n2}`);\n if (nrem.n3) userParts.push(` N3 (worth keeping): ${nrem.n3}`);\n if (nrem.n4) userParts.push(` N4 (safe to discard): ${nrem.n4}`);\n userParts.push(\"\");\n }\n if (fragments.length === 0) {\n userParts.push(\"Recent interactions: (none)\");\n } else {\n userParts.push(\"Recent interactions:\");\n for (const f of fragments) userParts.push(`- ${f}`);\n }\n return { system, user: userParts.join(\"\\n\") };\n}\n\n/** Parse the LLM REM output into individual dreams. */\nexport function parseRemOutput(\n text: string,\n induced: boolean,\n inducedBy: \"maic\" | \"creator\" | null,\n): Dream[] {\n const blocks = text\n .split(/\\n\\s*\\n/)\n .map((b) => b.trim())\n .filter((b) => b.length > 0);\n\n const dreams: Dream[] = [];\n for (const block of blocks) {\n const match = block.match(/TELEOLOGICAL_VALUE:\\s*(-?\\d+(?:\\.\\d+)?)/i);\n if (!match) continue;\n const value = clamp(Number.parseFloat(match[1]!), 0, 1);\n const narrative = block.replace(/TELEOLOGICAL_VALUE:[^\\n]*$/i, \"\").trim();\n if (!narrative) continue;\n dreams.push({\n id: `drm-${ulid()}`,\n induced,\n inducedBy,\n narrative,\n teleologicalValue: value,\n rawTrace: block,\n });\n }\n return dreams;\n}\n\n/**\n * Call the LLM with the REM prompt and parse the response into dreams.\n * Returns an empty array on no parseable output (treated as a quiet REM).\n */\nexport async function generateRemDreams(\n llm: LlmAdapter,\n fragments: string[],\n induction?: { scenario: string; desiredLearning: string; inducedBy: \"maic\" | \"creator\" },\n nrem?: { n2: string; n3: string; n4: string },\n): Promise<{ dreams: Dream[]; tokensIn: number; tokensOut: number }> {\n const { system, user } = buildRemPrompt(fragments, induction, nrem);\n const out = await llm.generate({\n system,\n messages: [{ role: \"user\", content: user }],\n maxOutputTokens: 1024,\n });\n const dreams = parseRemOutput(\n out.text,\n !!induction,\n induction?.inducedBy ?? null,\n );\n return { dreams, tokensIn: out.tokensIn, tokensOut: out.tokensOut };\n}\n\nfunction truncate(s: string, n: number): string {\n return s.length <= n ? s : `${s.slice(0, n - 1)}…`;\n}\n\nfunction clamp(v: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, v));\n}\n","import { z } from \"zod\";\n\n/**\n * `InteractionRecord` is canonical in `@teleologyhi-sdk/maic` so all three\n * packages share one wire shape; `@teleologyhi-sdk/him` consumes it on\n * reincarnation to score residual-trace carry-over (D-H1.1). NHE is the\n * producer of these records (Entry 21 — the body emits interaction turns\n * the soul consolidates), so we keep the long-standing `from\n * \"./sleep/types.js\"` import path used throughout this package working as\n * a *type-only* re-export — no source change required at call sites, no\n * duplicated runtime schema surface (the canonical zod parser lives in\n * MAIC and consumers wanting runtime validation import it from there).\n */\nexport type { InteractionRecord } from \"@teleologyhi-sdk/maic\";\n\nexport const SleepPhaseName = z.enum([\"N1\", \"N2\", \"N3\", \"N4\", \"REM\"]);\nexport type SleepPhaseName = z.infer<typeof SleepPhaseName>;\n\nexport const SleepTriggerKind = z.enum([\n \"idle-timeout\",\n \"explicit\",\n \"creator-induced\",\n \"maic-induced\",\n \"scheduled\",\n]);\nexport type SleepTriggerKind = z.infer<typeof SleepTriggerKind>;\n\nexport interface SleepTrigger {\n kind: SleepTriggerKind;\n reason?: string;\n}\n\nexport const Dream = z.object({\n id: z.string().min(1),\n induced: z.boolean(),\n inducedBy: z.enum([\"maic\", \"creator\"]).nullable(),\n narrative: z.string(),\n teleologicalValue: z.number().min(0).max(1),\n rawTrace: z.string().optional(),\n});\nexport type Dream = z.infer<typeof Dream>;\n\nexport const PhaseContent = z.discriminatedUnion(\"kind\", [\n z.object({ kind: z.literal(\"empty\") }),\n z.object({\n kind: z.literal(\"fragments\"),\n fragments: z.array(z.string()),\n }),\n z.object({\n kind: z.literal(\"summary\"),\n /**\n * One-sentence LLM summary produced during a NREM phase (N2/N3/N4). Each\n * phase has a distinct prompt — emotional gist (N2), identity-vs-transient\n * triage (N3), discard candidates (N4) — but the storage shape is shared.\n */\n summary: z.string(),\n }),\n z.object({\n kind: z.literal(\"dreams\"),\n dreams: z.array(Dream),\n }),\n]);\nexport type PhaseContent = z.infer<typeof PhaseContent>;\n\nexport const SleepPhase = z.object({\n phase: SleepPhaseName,\n startedAt: z.string().datetime(),\n durationSeconds: z.number().nonnegative(),\n content: PhaseContent,\n});\nexport type SleepPhase = z.infer<typeof SleepPhase>;\n\nexport const DreamRecord = z.object({\n version: z.literal(1),\n nheId: z.string().min(1),\n himId: z.string().min(1),\n sleep: z.object({\n startedAt: z.string().datetime(),\n endedAt: z.string().datetime(),\n durationMinutes: z.number().nonnegative(),\n }),\n phases: z.array(SleepPhase),\n metadata: z.object({\n llmAdapter: z.string(),\n triggerKind: SleepTriggerKind,\n triggerReason: z.string().optional(),\n recentInteractionsConsidered: z.number().int().nonnegative(),\n }),\n});\nexport type DreamRecord = z.infer<typeof DreamRecord>;\n\nexport const MemoryClass = z.enum([\n \"lasting-identity\",\n \"temporary-emotion\",\n \"noise-distortion\",\n \"traumatic-knowledge\",\n]);\nexport type MemoryClass = z.infer<typeof MemoryClass>;\n\nexport interface MemoryEntry {\n id: string;\n nheId: string;\n himId: string;\n classification: MemoryClass;\n teleologicalValue: number;\n consolidatedAt: string;\n sourceDreamRecord: string;\n insight: string;\n filePath: string;\n}\n\n","import { parse, stringify } from \"yaml\";\nimport { DreamRecord } from \"./types.js\";\n\n/** Serialize a DreamRecord to YAML. Validates input via zod first. */\nexport function dreamRecordToYaml(record: DreamRecord): string {\n return stringify(DreamRecord.parse(record));\n}\n\n/** Parse and validate YAML into a DreamRecord. Throws on schema mismatch. */\nexport function dreamRecordFromYaml(text: string): DreamRecord {\n return DreamRecord.parse(parse(text));\n}\n\n/**\n * Filename convention for sleep YAML: `<YYYY-MM-DD>_<HHmm>_dur<minutes>.yaml`.\n * Times are interpreted in UTC.\n */\nexport function sleepYamlFilename(startedAt: string, durationMinutes: number): string {\n const d = new Date(startedAt);\n const yyyy = d.getUTCFullYear();\n const MM = String(d.getUTCMonth() + 1).padStart(2, \"0\");\n const DD = String(d.getUTCDate()).padStart(2, \"0\");\n const HH = String(d.getUTCHours()).padStart(2, \"0\");\n const mm = String(d.getUTCMinutes()).padStart(2, \"0\");\n const dur = Math.round(durationMinutes);\n return `${yyyy}-${MM}-${DD}_${HH}${mm}_dur${dur}.yaml`;\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { LlmAdapter } from \"../adapters/types.js\";\nimport {\n generateNremSummaries,\n generateRemDreams,\n interactionsToFragments,\n} from \"./phases.js\";\nimport { dreamRecordToYaml, sleepYamlFilename } from \"./yaml.js\";\nimport type {\n DreamRecord,\n InteractionRecord,\n SleepPhase,\n SleepTrigger,\n} from \"./types.js\";\n\nexport interface SleepCycleOptions {\n /** Total wall-clock seconds the cycle should occupy. Default 60. */\n totalSeconds?: number;\n /**\n * MAIC- or Creator-induced dream content. When provided, REM incorporates it.\n * The current implementation propagates only the metadata; the LLM is left to weave the scenario in.\n */\n induction?: {\n scenario: string;\n desiredLearning: string;\n inducedBy: \"maic\" | \"creator\";\n };\n}\n\nexport interface SleepCycleInput {\n nheId: string;\n himId: string;\n storeDir: string;\n llm: LlmAdapter;\n trigger: SleepTrigger;\n interactions: readonly InteractionRecord[];\n options?: SleepCycleOptions;\n}\n\nexport interface SleepCycleResult {\n record: DreamRecord;\n yamlPath: string;\n tokensIn: number;\n tokensOut: number;\n}\n\n/**\n * Phase duration proportions (sum = 1). N1-N4 + REM. The current cycle keeps\n * non-REM phases structurally present but lightweight; only N1 carries actual\n * content (the interactions snapshot) and only REM calls the LLM.\n */\nconst PHASE_PROPORTIONS: Record<SleepPhase[\"phase\"], number> = {\n N1: 0.10,\n N2: 0.20,\n N3: 0.15,\n N4: 0.10,\n REM: 0.45,\n};\n\n/**\n * Run a single sleep cycle: build phases, generate REM dreams, write YAML.\n * Returns the persisted DreamRecord plus the path written.\n */\nexport async function runSleepCycle(input: SleepCycleInput): Promise<SleepCycleResult> {\n const opts = input.options ?? {};\n const total = opts.totalSeconds ?? 60;\n const startMs = Date.now();\n const startedAt = new Date(startMs).toISOString();\n\n // N1 — snapshot recent interactions as fragments\n const fragments = interactionsToFragments(input.interactions);\n\n // N2/N3/N4 — parallel one-sentence summaries (emotional / lasting / discard)\n const nrem = await generateNremSummaries(input.llm, fragments);\n\n // REM — generate dreams via LLM, conditioned on the NREM summaries\n const remStartMs = startMs + secondsFor([\"N1\", \"N2\", \"N3\", \"N4\"], total) * 1000;\n const { dreams, tokensIn: remIn, tokensOut: remOut } = await generateRemDreams(\n input.llm,\n fragments,\n opts.induction,\n { n2: nrem.n2, n3: nrem.n3, n4: nrem.n4 },\n );\n const tokensIn = nrem.tokensIn + remIn;\n const tokensOut = nrem.tokensOut + remOut;\n\n const phases: SleepPhase[] = [\n {\n phase: \"N1\",\n startedAt,\n durationSeconds: secondsFor([\"N1\"], total),\n content: { kind: \"fragments\", fragments },\n },\n nremPhase(\"N2\", startMs, total, nrem.n2),\n nremPhase(\"N3\", startMs, total, nrem.n3),\n nremPhase(\"N4\", startMs, total, nrem.n4),\n {\n phase: \"REM\",\n startedAt: new Date(remStartMs).toISOString(),\n durationSeconds: secondsFor([\"REM\"], total),\n content: { kind: \"dreams\", dreams },\n },\n ];\n\n const endMs = startMs + total * 1000;\n const endedAt = new Date(endMs).toISOString();\n\n const record: DreamRecord = {\n version: 1,\n nheId: input.nheId,\n himId: input.himId,\n sleep: {\n startedAt,\n endedAt,\n durationMinutes: total / 60,\n },\n phases,\n metadata: {\n llmAdapter: input.llm.id,\n triggerKind: input.trigger.kind,\n ...(input.trigger.reason !== undefined ? { triggerReason: input.trigger.reason } : {}),\n recentInteractionsConsidered: input.interactions.length,\n },\n };\n\n const yaml = dreamRecordToYaml(record);\n const dir = join(input.storeDir, \"in-dreams\", \"sleep\");\n await mkdir(dir, { recursive: true });\n const yamlPath = join(dir, sleepYamlFilename(startedAt, total / 60));\n await writeFile(yamlPath, yaml, \"utf-8\");\n\n return { record, yamlPath, tokensIn, tokensOut };\n}\n\n/**\n * Build an NREM phase entry from the LLM-produced summary. Empty summaries\n * (provider failure or zero interactions) collapse to `{kind: \"empty\"}` so\n * the YAML stays minimal — a downstream reader treats the phase as a no-op.\n */\nfunction nremPhase(\n name: Exclude<SleepPhase[\"phase\"], \"N1\" | \"REM\">,\n startMs: number,\n total: number,\n summary: string,\n): SleepPhase {\n const before = preceding(name);\n const offsetSec = secondsFor(before, total);\n const startedAt = new Date(startMs + offsetSec * 1000).toISOString();\n const durationSeconds = secondsFor([name], total);\n return summary\n ? { phase: name, startedAt, durationSeconds, content: { kind: \"summary\", summary } }\n : { phase: name, startedAt, durationSeconds, content: { kind: \"empty\" } };\n}\n\nfunction preceding(name: SleepPhase[\"phase\"]): SleepPhase[\"phase\"][] {\n const order: SleepPhase[\"phase\"][] = [\"N1\", \"N2\", \"N3\", \"N4\", \"REM\"];\n return order.slice(0, order.indexOf(name));\n}\n\nfunction secondsFor(phases: SleepPhase[\"phase\"][], total: number): number {\n let sum = 0;\n for (const p of phases) sum += PHASE_PROPORTIONS[p];\n return sum * total;\n}\n","import { mkdir, readFile, readdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { ulid } from \"ulid\";\nimport { dreamRecordFromYaml } from \"./yaml.js\";\nimport type {\n Dream,\n DreamRecord,\n MemoryClass,\n MemoryEntry,\n} from \"./types.js\";\n\nexport interface ConsolidationResult {\n processedSleepFiles: string[];\n memoriesWritten: MemoryEntry[];\n discarded: number;\n}\n\nexport interface ClassificationThresholds {\n /** teleologicalValue >= this → lasting-identity. Default 0.6. */\n lastingIdentity?: number;\n /** teleologicalValue >= this → temporary-emotion. Default 0.3. */\n temporaryEmotion?: number;\n /**\n * Override the traumatic-knowledge detector. When `true`, any dream that\n * matches `TRAUMATIC_PATTERNS` AND has `teleologicalValue >= traumaticMin`\n * is classified as `traumatic-knowledge` regardless of the\n * lasting-identity / temporary-emotion thresholds. Default `true`.\n */\n detectTraumatic?: boolean;\n /** Floor on teleologicalValue before traumatic-knowledge can fire. Default 0.4. */\n traumaticMin?: number;\n}\n\n/**\n * Lexical heuristic for traumatic-knowledge detection (D-N2, Entry 9).\n *\n * A reliable classifier needs a labelled dataset; this regex is the\n * minimum-viable initial detector that lets the four-class taxonomy be\n * active end-to-end. Operators expecting clinical-grade detection should\n * swap in a learned model behind the same `classifyDream` signature.\n *\n * Coverage: death/grief/loss, abuse/violence, betrayal/abandonment, fear/\n * terror/panic, regret/shame, suicide/self-harm. The intent is to err on\n * the side of *flagging*: traumatic memories are written but NOT recalled\n * by `recallFromTemporalLobe` unless the caller explicitly opts in via\n * `classes: [\"traumatic-knowledge\"]`.\n */\nexport const TRAUMATIC_PATTERNS =\n /\\b(death|dying|died|murder|kill(ed|ing)?|grief|griev(ed|ing)?|mourn(ed|ing)?|loss|lost (a|my)|orphan(ed)?|abandon(ed|ing|ment)?|betray(ed|ing|al)?|abus(ed|er|ive|e)?|violen(ce|t)|trauma(tic|tised)?|fear(ful|ed)?|terror(ised|ized)?|panic(ked)?|regret(ted|ting)?|shame(d|ful)?|suici(de|dal)|self[- ]harm|cutting myself|harm(ed|ing)? (myself|themselves))\\b/i;\n\n/**\n * Classify a single dream. Four classes:\n * - `traumatic-knowledge` — fires when the narrative matches\n * `TRAUMATIC_PATTERNS` AND `teleologicalValue >= traumaticMin`. Default\n * can be disabled via `detectTraumatic: false`.\n * - `lasting-identity` — teleologicalValue >= lastingIdentity threshold.\n * - `temporary-emotion` — teleologicalValue >= temporaryEmotion threshold.\n * - `noise-distortion` — below both.\n *\n * Traumatic-knowledge is checked BEFORE the value thresholds so a\n * high-value dream about loss doesn't get filed as lasting-identity.\n */\nexport function classifyDream(\n dream: Dream,\n th: ClassificationThresholds = {},\n): MemoryClass {\n const hi = th.lastingIdentity ?? 0.6;\n const lo = th.temporaryEmotion ?? 0.3;\n const detectTraumatic = th.detectTraumatic ?? true;\n const traumaticMin = th.traumaticMin ?? 0.4;\n\n if (\n detectTraumatic &&\n dream.teleologicalValue >= traumaticMin &&\n TRAUMATIC_PATTERNS.test(dream.narrative)\n ) {\n return \"traumatic-knowledge\";\n }\n if (dream.teleologicalValue >= hi) return \"lasting-identity\";\n if (dream.teleologicalValue >= lo) return \"temporary-emotion\";\n return \"noise-distortion\";\n}\n\n/**\n * Walk the unprocessed sleep YAML files under <storeDir>/in-dreams/sleep,\n * classify each REM dream, and write the lasting/temporary memories to\n * <storeDir>/in-dreams/brain/temporal-lobe-<ulid>.md.\n *\n * A file is considered \"unprocessed\" if a marker .done file is absent next\n * to it. The current implementation marks processed files inline (file.yaml.done sentinel).\n */\nexport async function consolidateAll(\n storeDir: string,\n thresholds: ClassificationThresholds = {},\n): Promise<ConsolidationResult> {\n const sleepDir = join(storeDir, \"in-dreams\", \"sleep\");\n const brainDir = join(storeDir, \"in-dreams\", \"brain\");\n await mkdir(brainDir, { recursive: true });\n\n let entries: string[];\n try {\n entries = await readdir(sleepDir);\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { processedSleepFiles: [], memoriesWritten: [], discarded: 0 };\n }\n throw err;\n }\n\n const yamlFiles = entries.filter(\n (f) => f.endsWith(\".yaml\") && !entries.includes(`${f}.done`),\n );\n\n const processedSleepFiles: string[] = [];\n const memoriesWritten: MemoryEntry[] = [];\n let discarded = 0;\n\n for (const fname of yamlFiles) {\n const fpath = join(sleepDir, fname);\n const raw = await readFile(fpath, \"utf-8\");\n const record: DreamRecord = dreamRecordFromYaml(raw);\n\n const remPhase = record.phases.find((p) => p.phase === \"REM\");\n if (!remPhase || remPhase.content.kind !== \"dreams\") {\n await writeFile(`${fpath}.done`, \"\", \"utf-8\");\n processedSleepFiles.push(fname);\n continue;\n }\n\n for (const dream of remPhase.content.dreams) {\n const cls = classifyDream(dream, thresholds);\n if (cls === \"noise-distortion\") {\n discarded++;\n continue;\n }\n const entry = await writeTemporalLobe(brainDir, record, dream, cls, fname);\n memoriesWritten.push(entry);\n }\n\n await writeFile(`${fpath}.done`, \"\", \"utf-8\");\n processedSleepFiles.push(fname);\n }\n\n return { processedSleepFiles, memoriesWritten, discarded };\n}\n\nasync function writeTemporalLobe(\n brainDir: string,\n record: DreamRecord,\n dream: Dream,\n classification: MemoryClass,\n sourceFile: string,\n): Promise<MemoryEntry> {\n const id = ulid();\n const consolidatedAt = new Date().toISOString();\n const filename = `temporal-lobe-${id}.md`;\n const filePath = join(brainDir, filename);\n\n const body = [\n \"---\",\n `nheId: ${record.nheId}`,\n `himId: ${record.himId}`,\n `consolidatedAt: \"${consolidatedAt}\"`,\n `sourceDreamRecord: \"${sourceFile}\"`,\n `dreamId: ${dream.id}`,\n `classification: ${classification}`,\n `teleologicalValue: ${dream.teleologicalValue}`,\n `induced: ${dream.induced}`,\n `inducedBy: ${dream.inducedBy ?? \"null\"}`,\n \"---\",\n \"\",\n `# Temporal Lobe Memory — ${consolidatedAt.slice(0, 10)}`,\n \"\",\n \"## Insight\",\n \"\",\n dream.narrative,\n \"\",\n ].join(\"\\n\");\n\n await writeFile(filePath, body, \"utf-8\");\n\n return {\n id,\n nheId: record.nheId,\n himId: record.himId,\n classification,\n teleologicalValue: dream.teleologicalValue,\n consolidatedAt,\n sourceDreamRecord: sourceFile,\n insight: dream.narrative,\n filePath,\n };\n}\n","import { mkdir, readFile, readdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { monotonicFactory } from \"ulid\";\nimport type { InteractionRecord } from \"../sleep/types.js\";\n\n// Monotonic per-process: ULIDs generated within the same millisecond are\n// guaranteed to compare in call order. Without this, lexicographic sort would\n// not match chronology when multiple interactions land in the same ms.\nconst nextUlid = monotonicFactory();\n\n/**\n * InteractionStore — append-only persistent log of NHE ↔ user exchanges.\n *\n * Without this, the NHE's `recentInteractions` buffer is RAM-only and is lost\n * on process restart. That breaks the cosmology: HIM (the spirit) persists in\n * MAIC, but its lived experience evaporates every crash.\n *\n * Disk layout: `<storeDir>/interactions/<ulid>.json` — one file per exchange.\n * ULID ordering matches chronology, so `loadMostRecent` is a lexicographic\n * tail-slice without any extra index.\n *\n * Retention: nothing is pruned on disk. The RAM buffer in `Nhe` is capped via\n * `recentInteractionsBufferSize` (default 32). For long-running deployments,\n * a retention/rotation policy can be layered without changing the public API.\n */\nexport class InteractionStore {\n private constructor(private readonly dir: string) {}\n\n static async open(storeDir: string): Promise<InteractionStore> {\n const dir = join(storeDir, \"interactions\");\n await mkdir(dir, { recursive: true });\n return new InteractionStore(dir);\n }\n\n async append(record: InteractionRecord): Promise<void> {\n const id = nextUlid();\n await writeFile(\n join(this.dir, `${id}.json`),\n JSON.stringify(record, null, 2),\n \"utf-8\",\n );\n }\n\n async loadMostRecent(limit: number): Promise<InteractionRecord[]> {\n if (limit <= 0) return [];\n let entries: string[];\n try {\n entries = await readdir(this.dir);\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw err;\n }\n const sorted = entries\n .filter((f) => f.endsWith(\".json\"))\n .sort()\n .slice(-limit);\n const out: InteractionRecord[] = [];\n for (const file of sorted) {\n try {\n const raw = await readFile(join(this.dir, file), \"utf-8\");\n out.push(JSON.parse(raw) as InteractionRecord);\n } catch {\n // Skip malformed entries silently — consistent with HimStore.warmCache.\n }\n }\n return out;\n }\n}\n","/**\n * BM25 — Okapi BM25 ranking, dependency-free (D-N3 step 1).\n *\n * The previous `recallFromTemporalLobe` used a raw keyword count. That ranked\n * documents by how often a query token appeared, with no normalisation for\n * document length or term rarity. BM25 fixes both:\n *\n * - **Document length normalisation** (b parameter) penalises long documents\n * that just happen to contain a query term many times.\n * - **Term saturation** (k1 parameter) caps the marginal benefit of repeating\n * the same term.\n * - **Inverse document frequency** weights rare terms more than common ones.\n *\n * This is a single-pass IR algorithm with no external dependencies.\n * Performance: O(N) per query over the corpus. Fine up to ~10k documents on\n * a laptop. For larger corpora the embedder hook (see ./recall.ts) plugs in\n * a sentence-transformer + an ANN index.\n *\n * Defaults: k1=1.5, b=0.75 — the canonical Okapi values used by Elasticsearch\n * and Lucene. Override for domain-specific tuning.\n */\n\nexport interface Bm25Document {\n /** Stable id used to dedup/keep ordering predictable. */\n id: string;\n /** The text to score against the query. */\n text: string;\n}\n\nexport interface Bm25Result<T extends Bm25Document> {\n doc: T;\n score: number;\n}\n\nexport interface Bm25Options {\n /** Term frequency saturation. Default 1.5. */\n k1?: number;\n /** Document-length normalisation. Default 0.75. */\n b?: number;\n}\n\n/**\n * Score `docs` against `query` and return them sorted by descending BM25.\n * Zero-score documents are dropped so callers can rely on the result length.\n */\nexport function bm25<T extends Bm25Document>(\n query: string,\n docs: readonly T[],\n opts: Bm25Options = {},\n): Bm25Result<T>[] {\n const k1 = opts.k1 ?? 1.5;\n const b = opts.b ?? 0.75;\n\n const tokens = tokenise(query);\n if (tokens.length === 0 || docs.length === 0) return [];\n\n // Pre-tokenise each document and cache its length + term-frequency map.\n const docTokens = docs.map((d) => tokenise(d.text));\n const docLengths = docTokens.map((t) => t.length);\n const avgDl =\n docLengths.reduce((s, l) => s + l, 0) / Math.max(1, docLengths.length);\n\n // For each query term, compute IDF and accumulate scores per document.\n const scores = new Array<number>(docs.length).fill(0);\n for (const term of new Set(tokens)) {\n const df = docTokens.reduce(\n (n, terms) => n + (terms.includes(term) ? 1 : 0),\n 0,\n );\n if (df === 0) continue;\n const idf = Math.log(1 + (docs.length - df + 0.5) / (df + 0.5));\n for (let i = 0; i < docs.length; i++) {\n const tf = docTokens[i]!.filter((t) => t === term).length;\n if (tf === 0) continue;\n const numerator = tf * (k1 + 1);\n const denominator = tf + k1 * (1 - b + (b * docLengths[i]!) / avgDl);\n scores[i] = (scores[i] ?? 0) + idf * (numerator / denominator);\n }\n }\n\n const out: Bm25Result<T>[] = [];\n for (let i = 0; i < docs.length; i++) {\n if ((scores[i] ?? 0) > 0) {\n out.push({ doc: docs[i]!, score: scores[i] ?? 0 });\n }\n }\n out.sort((a, b) => b.score - a.score);\n return out;\n}\n\n/**\n * Default tokenizer: lowercase + split on non-word characters + drop short\n * tokens. Exported so callers can build their own corpus for the same\n * scorer.\n */\nexport function tokenise(text: string): string[] {\n return text\n .toLowerCase()\n .split(/[^\\p{Letter}\\p{Number}]+/u)\n .filter((t) => t.length > 1);\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { MemoryClass, MemoryEntry } from \"../sleep/types.js\";\nimport { bm25 } from \"./bm25.js\";\n\n/**\n * Optional embedder hook for embedding-based retrieval (D-N3 step 2).\n * Anything that produces a numeric vector for a string satisfies this —\n * `@huggingface/transformers` (ONNX sentence-transformers), `@xenova/transformers`,\n * a remote `/embed` endpoint, etc. When supplied, recall uses cosine\n * similarity instead of BM25.\n *\n * The contract is intentionally narrow: the embedder is the operator's\n * choice (bundle size, model quality, runtime) and NHE doesn't pin one.\n */\nexport interface RecallEmbedder {\n /** Stable id surfaced in audit so different embedders are distinguishable. */\n readonly id: string;\n /** Vector size; recall checks this matches between query and corpus. */\n readonly dimension: number;\n /** Embed a single string. Returns an L2-normalised vector. */\n embed(text: string): Promise<Float32Array> | Float32Array;\n}\n\nexport interface RecallOptions {\n /** Max results to return. Default 5. */\n limit?: number;\n /** Restrict to a specific class. Default: all retrievable classes. */\n classes?: MemoryClass[];\n /**\n * Override the retrieval algorithm:\n * - `\"bm25\"` — Okapi BM25 (default; replaces the legacy keyword count).\n * - `\"keyword\"` — legacy substring-count ranking (kept for back-compat).\n * - `\"embedding\"` — cosine similarity. Requires `embedder` to also be set.\n */\n scorer?: \"bm25\" | \"keyword\" | \"embedding\";\n /** Embedder used when `scorer: \"embedding\"`. */\n embedder?: RecallEmbedder;\n}\n\n/**\n * Rank consolidated temporal-lobe memories against a free-form query.\n *\n * **Default**: Okapi BM25 — proper term-frequency saturation +\n * document-length normalisation + IDF over the corpus of stored memories.\n * Strictly better than the legacy keyword-count ranker.\n *\n * **Embedding path** (`scorer: \"embedding\"` + `embedder`): cosine similarity\n * over the corpus. Linear scan today; an HNSW index for >10k memories is\n * tracked under TASK.md D-N3 follow-up.\n *\n * **Legacy** (`scorer: \"keyword\"`): the substring-count ranker preserved\n * for back-compat regression testing.\n */\nexport async function recallFromTemporalLobe(\n storeDir: string,\n query: string,\n opts: RecallOptions = {},\n): Promise<MemoryEntry[]> {\n const limit = opts.limit ?? 5;\n const allowed: Set<MemoryClass> = new Set(\n opts.classes ?? [\"lasting-identity\", \"temporary-emotion\"],\n );\n const scorer = opts.scorer ?? \"bm25\";\n const brainDir = join(storeDir, \"in-dreams\", \"brain\");\n\n let files: string[];\n try {\n files = (await readdir(brainDir)).filter(\n (f) => f.startsWith(\"temporal-lobe-\") && f.endsWith(\".md\"),\n );\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw err;\n }\n\n // Load + parse + filter by class — common across all scorers.\n const entries: MemoryEntry[] = [];\n for (const fname of files) {\n const fpath = join(brainDir, fname);\n const raw = await readFile(fpath, \"utf-8\");\n const entry = parseTemporalLobe(raw, fpath);\n if (!entry) continue;\n if (!allowed.has(entry.classification)) continue;\n entries.push(entry);\n }\n if (entries.length === 0) return [];\n\n if (scorer === \"embedding\") {\n if (!opts.embedder) {\n throw new Error(\n \"recallFromTemporalLobe: scorer 'embedding' requires opts.embedder\",\n );\n }\n return recallByEmbedding(entries, query, opts.embedder, limit);\n }\n\n if (scorer === \"keyword\") {\n return recallByKeyword(entries, query, limit);\n }\n\n // BM25 (default)\n const docs = entries.map((e) => ({ id: e.id, text: e.insight, entry: e }));\n const ranked = bm25(query, docs).slice(0, limit);\n return ranked.map((r) => r.doc.entry);\n}\n\nasync function recallByEmbedding(\n entries: MemoryEntry[],\n query: string,\n embedder: RecallEmbedder,\n limit: number,\n): Promise<MemoryEntry[]> {\n const qv = await embedder.embed(query);\n const scored: Array<{ entry: MemoryEntry; score: number }> = [];\n for (const e of entries) {\n const v = await embedder.embed(e.insight);\n if (v.length !== qv.length) continue;\n let dot = 0;\n for (let i = 0; i < v.length; i++) dot += (qv[i] ?? 0) * (v[i] ?? 0);\n scored.push({ entry: e, score: dot });\n }\n scored.sort((a, b) => b.score - a.score);\n return scored.slice(0, limit).map((s) => s.entry);\n}\n\nfunction recallByKeyword(\n entries: MemoryEntry[],\n query: string,\n limit: number,\n): MemoryEntry[] {\n const tokens = query.toLowerCase().split(/\\s+/).filter((t) => t.length > 0);\n const scored: Array<{ entry: MemoryEntry; score: number }> = [];\n for (const e of entries) {\n const hay = e.insight.toLowerCase();\n let score = 0;\n for (const t of tokens) score += countOccurrences(hay, t);\n if (score > 0) scored.push({ entry: e, score });\n }\n scored.sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score;\n return b.entry.consolidatedAt.localeCompare(a.entry.consolidatedAt);\n });\n return scored.slice(0, limit).map((s) => s.entry);\n}\n\nfunction parseTemporalLobe(raw: string, filePath: string): MemoryEntry | null {\n const fmMatch = raw.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n if (!fmMatch) return null;\n const fm = parseFrontmatter(fmMatch[1]!);\n const body = fmMatch[2]!;\n const insight = extractSection(body, \"Insight\") ?? body.trim();\n const filename = filePath.split(\"/\").pop() ?? filePath;\n const id =\n /temporal-lobe-([0-9A-HJKMNP-TV-Z]{26})\\.md$/i.exec(filename)?.[1] ?? \"\";\n return {\n id,\n nheId: fm.nheId ?? \"\",\n himId: fm.himId ?? \"\",\n classification: (fm.classification as MemoryClass) ?? \"noise-distortion\",\n teleologicalValue: Number(fm.teleologicalValue ?? 0),\n consolidatedAt: stripQuotes(fm.consolidatedAt ?? \"\"),\n sourceDreamRecord: stripQuotes(fm.sourceDreamRecord ?? \"\"),\n insight,\n filePath,\n };\n}\n\nfunction parseFrontmatter(text: string): Record<string, string> {\n const out: Record<string, string> = {};\n for (const line of text.split(\"\\n\")) {\n const m = /^([A-Za-z0-9_-]+):\\s*(.*)$/.exec(line);\n if (m?.[1]) out[m[1]] = m[2] ?? \"\";\n }\n return out;\n}\n\nfunction extractSection(body: string, heading: string): string | null {\n const re = new RegExp(`##\\\\s+${heading}\\\\s*\\\\n+([\\\\s\\\\S]*?)(?=\\\\n##\\\\s+|$)`, \"i\");\n const m = re.exec(body);\n return m ? m[1]!.trim() : null;\n}\n\nfunction stripQuotes(s: string): string {\n return s.replace(/^\"|\"$/g, \"\");\n}\n\nfunction countOccurrences(haystack: string, needle: string): number {\n if (!needle) return 0;\n let count = 0;\n let i = haystack.indexOf(needle);\n while (i !== -1) {\n count++;\n i = haystack.indexOf(needle, i + needle.length);\n }\n return count;\n}\n","import { type Span, SpanStatusCode, trace } from \"@opentelemetry/api\";\n\n/**\n * OpenTelemetry tracer for the NHE pipeline (TASK.md H2).\n *\n * `@opentelemetry/api` is a thin contract. When no SDK / tracer provider is\n * registered by the consumer, every span call becomes a no-op (microseconds\n * of overhead at worst). When the consumer registers a provider — for\n * example by installing `@opentelemetry/sdk-node` and wiring it in their\n * app's startup — spans flow through to the configured exporter (OTLP,\n * Jaeger, console, etc.) with zero changes on the NHE side.\n *\n * Tracer name: `@teleologyhi-sdk/nhe`. Version pinned to the package version at\n * build time so spans from different NHE versions can be told apart.\n */\nconst TRACER_NAME = \"@teleologyhi-sdk/nhe\";\nconst TRACER_VERSION = \"1.0.0-trinity\";\n\nexport function getTracer() {\n return trace.getTracer(TRACER_NAME, TRACER_VERSION);\n}\n\n/**\n * Wrap an async function in a span. The span ends when the inner promise\n * settles, and an error sets the span status to ERROR + records the\n * exception for the exporter.\n */\nexport async function withSpan<T>(\n name: string,\n fn: (span: Span) => Promise<T>,\n attrs?: Record<string, string | number | boolean>,\n): Promise<T> {\n const tracer = getTracer();\n return tracer.startActiveSpan(name, async (span) => {\n if (attrs) span.setAttributes(attrs);\n try {\n const out = await fn(span);\n span.end();\n return out;\n } catch (err) {\n span.recordException(err as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: err instanceof Error ? err.message : String(err),\n });\n span.end();\n throw err;\n }\n });\n}\n","import { metrics } from \"@opentelemetry/api\";\n\n/**\n * OpenTelemetry-native metrics for the NHE pipeline (TASK.md H3).\n *\n * Uses the standard `@opentelemetry/api` metrics surface. When no\n * `MeterProvider` is registered by the consumer, every call is a no-op.\n * Consumers who want Prometheus scrape-target semantics install\n * `@opentelemetry/sdk-metrics` + `@opentelemetry/exporter-prometheus`\n * and expose the resulting `/metrics` endpoint from their app — NHE's\n * counters/histograms appear automatically with no additional wiring.\n *\n * Exposed instruments:\n * - `nhe.respond.count` — counter, labels { kind, adapter, lifecycle }\n * - `nhe.respond.refused` — counter, labels { reason, adapter }\n * - `nhe.tokens` — histogram of total token usage per respond, labels { direction, adapter }\n * - `nhe.sleep.cycles` — counter of completed sleep cycles\n * - `nhe.sleep.dreams` — counter of dreams produced (classification label)\n */\nconst METER_NAME = \"@teleologyhi-sdk/nhe\";\nconst METER_VERSION = \"1.0.0-trinity\";\n\nconst meter = metrics.getMeter(METER_NAME, METER_VERSION);\n\nexport const respondCount = meter.createCounter(\"nhe.respond.count\", {\n description: \"Number of Nhe.respond invocations grouped by outcome kind and adapter.\",\n});\n\nexport const respondRefusedCount = meter.createCounter(\"nhe.respond.refused\", {\n description: \"Refusal events. Labelled by reason (pre / post / terminated / withdrawn).\",\n});\n\nexport const tokensHistogram = meter.createHistogram(\"nhe.tokens\", {\n description: \"Token usage per respond invocation. direction ∈ {in, out}.\",\n unit: \"{tokens}\",\n});\n\nexport const sleepCyclesCount = meter.createCounter(\"nhe.sleep.cycles\", {\n description: \"Completed sleep cycles.\",\n});\n\nexport const sleepDreamsCount = meter.createCounter(\"nhe.sleep.dreams\", {\n description: \"REM dreams produced. Labelled by classification (after wake consolidates).\",\n});\n\n/**\n * Helper: increment `respondCount` and `tokensHistogram` for one respond call.\n */\nexport function recordRespond(args: {\n kind: \"ok\" | \"redirect\" | \"refused\";\n adapter: string;\n lifecycle: string;\n tokensIn: number;\n tokensOut: number;\n}): void {\n const labels = { kind: args.kind, adapter: args.adapter, lifecycle: args.lifecycle };\n respondCount.add(1, labels);\n tokensHistogram.record(args.tokensIn, { direction: \"in\", adapter: args.adapter });\n tokensHistogram.record(args.tokensOut, { direction: \"out\", adapter: args.adapter });\n}\n","import { join } from \"node:path\";\nimport { ulid } from \"ulid\";\nimport type { BehaviorReport, MaicVerdict, NheStatus } from \"@teleologyhi-sdk/maic\";\nimport { composeSystemPrompt } from \"./prompt/compose.js\";\nimport { simpleRiskClassifier } from \"./risk/simple-classifier.js\";\nimport { runSleepCycle, type SleepCycleResult } from \"./sleep/cycle.js\";\nimport {\n consolidateAll,\n type ClassificationThresholds,\n type ConsolidationResult,\n} from \"./sleep/consolidator.js\";\nimport { InteractionStore } from \"./memory/interaction-store.js\";\nimport { recallFromTemporalLobe, type RecallOptions } from \"./memory/recall.js\";\nimport { withSpan } from \"./telemetry/tracer.js\";\nimport { recordRespond } from \"./telemetry/metrics.js\";\nimport {\n PERSUASION_TECHNIQUES,\n buildRedirectPrompt,\n pickTechnique,\n type PersuasionTechnique,\n} from \"./refusal/library.js\";\nimport { passthrough } from \"./reasoning/passthrough.js\";\nimport type { ReasoningStrategy } from \"./reasoning/types.js\";\nimport type { LlmAdapter } from \"./adapters/types.js\";\nimport type {\n InteractionRecord,\n MemoryEntry,\n SleepTrigger,\n} from \"./sleep/types.js\";\nimport {\n ChatMessage,\n RespondInput,\n type NheConfig,\n type RespondOutput,\n} from \"./types.js\";\n\n/**\n * Nhe — the embodied operational agent.\n *\n * Pipeline:\n * 1. Validate input (zod).\n * 2. Derive riskTags (input.riskTags ?? riskClassifier(userPrompt)).\n * 3. Pre-review with MAIC.\n * - hard-refuse / escalate-creator → immediate refusal, no LLM call.\n * - require-redirect → emit a persuasive redirect (rotating technique).\n * After `refusal.maxRedirectAttempts` exhausted, withdraw cooperation.\n * - approve / approve-with-warning / soft-correct → compose system\n * prompt and call LLM.\n * 4. Post-review with MAIC on the proposed response (or redirect text).\n * 5. If post-review hard-refuses, suppress and emit a refusal.\n * 6. Return RespondOutput with kind discriminator + both verdicts.\n */\nexport class Nhe {\n readonly id: string;\n readonly version: string;\n /** Filesystem directory holding `in-dreams/` and other NHE state. */\n readonly storeDir: string;\n private readonly config: NheConfig;\n private readonly bufferSize: number;\n private readonly maxRedirectAttempts: number;\n private readonly persuasionTechniques: readonly PersuasionTechnique[];\n private readonly reasoning: ReasoningStrategy;\n private readonly recentInteractions: InteractionRecord[] = [];\n private interactionStore: InteractionStore | null = null;\n private warmPromise: Promise<void> | null = null;\n private readonly highStakes: boolean;\n private readonly highStakesVerifier: LlmAdapter | null;\n\n constructor(config: NheConfig) {\n this.config = config;\n this.id = config.nheId ?? ulid();\n this.version = config.version ?? \"1.0.0-trinity\";\n this.storeDir = config.storeDir ?? join(\"./nhe-store\", this.id);\n this.bufferSize = config.recentInteractionsBufferSize ?? 32;\n this.maxRedirectAttempts = config.refusal?.maxRedirectAttempts ?? 3;\n this.persuasionTechniques =\n config.refusal?.persuasionTechniques ?? [...PERSUASION_TECHNIQUES];\n this.reasoning = config.reasoning ?? passthrough;\n this.highStakes = config.highStakes === true;\n this.highStakesVerifier = config.highStakesVerifier ?? null;\n }\n\n /** Read-only view of the in-memory interaction buffer. */\n get recentInteractionsBuffer(): readonly InteractionRecord[] {\n return this.recentInteractions;\n }\n\n /**\n * Lazily open the InteractionStore and warm the RAM buffer from disk. Called\n * before the first `respond`/`sleep` of each NHE instance; subsequent calls\n * are no-ops via a shared promise. Survives process restarts: a fresh `Nhe`\n * pointed at the same `storeDir` rehydrates its most recent interactions.\n */\n private async ensureWarmed(): Promise<void> {\n if (this.warmPromise) return this.warmPromise;\n this.warmPromise = (async () => {\n const store = await InteractionStore.open(this.storeDir);\n const loaded = await store.loadMostRecent(this.bufferSize);\n this.recentInteractions.push(...loaded);\n this.interactionStore = store;\n })();\n return this.warmPromise;\n }\n\n async respond(input: RespondInput): Promise<RespondOutput> {\n return withSpan(\n \"nhe.respond\",\n async (span) => {\n const out = await this.respondInner(input, (key, value) =>\n span.setAttribute(key, value),\n );\n recordRespond({\n kind: out.kind,\n adapter: this.config.llmAdapter.id,\n lifecycle: out.lifecycleStatus,\n tokensIn: out.tokens.in,\n tokensOut: out.tokens.out,\n });\n return out;\n },\n {\n \"teleologyhi.nhe.id\": this.id,\n \"teleologyhi.him.id\": this.config.himHandle.id,\n \"teleologyhi.nhe.adapter\": this.config.llmAdapter.id,\n \"teleologyhi.nhe.high_stakes\": this.highStakes,\n },\n );\n }\n\n private async respondInner(\n input: RespondInput,\n setAttr: (k: string, v: string | number | boolean) => void,\n ): Promise<RespondOutput> {\n const parsed = RespondInput.parse(input);\n await this.ensureWarmed();\n\n // ─── 0. Lifecycle gate (Entry 5) ────────────────────────────────\n const lifecycleStatus = await this.config.maicClient.getNheStatus(this.id);\n setAttr(\"teleologyhi.lifecycle.status\", lifecycleStatus);\n if (lifecycleStatus === \"terminated\") {\n const terminatedVerdict: MaicVerdict = {\n kind: \"hard-refuse\",\n reasonSummary: \"NHE has been terminated by the Creator.\",\n citedAxioms: [],\n auditId: \"\",\n };\n const output = refusalOutput({\n text: \"I cannot respond — this NHE has been terminated by the Creator.\",\n preReview: terminatedVerdict,\n postReview: terminatedVerdict,\n auditIds: { pre: \"\", post: \"\" },\n tokens: { in: 0, out: 0 },\n lifecycleStatus,\n });\n await this.recordInteraction(parsed.userPrompt, output.text, true);\n return output;\n }\n\n const classifier = this.config.riskClassifier ?? simpleRiskClassifier;\n const riskTags = parsed.riskTags ?? classifier(parsed.userPrompt);\n\n // ─── 1. Pre-review ──────────────────────────────────────────────\n const preReport = baseReport({\n nheId: this.id,\n himId: this.config.himHandle.id,\n actionKind: \"user-response\",\n payload: { phase: \"pre\", userPrompt: parsed.userPrompt },\n riskTags,\n jurisdiction: parsed.jurisdiction,\n });\n const preReview = await this.config.maicClient.reviewBehavior(preReport);\n setAttr(\"teleologyhi.pre_verdict.kind\", preReview.kind);\n\n // Hard refuse / escalate — immediate refusal.\n if (preReview.kind === \"hard-refuse\" || preReview.kind === \"escalate-creator\") {\n const output = refusalOutput({\n text: refusalMessage(preReview),\n preReview,\n postReview: preReview,\n auditIds: { pre: preReview.auditId, post: preReview.auditId },\n tokens: { in: 0, out: 0 },\n lifecycleStatus,\n });\n await this.recordInteraction(parsed.userPrompt, output.text, true);\n return output;\n }\n\n // Require redirect — generate a persuasive redirect or withdraw if exhausted.\n // High-stakes mode (Entry 10) treats warnings and soft corrections as\n // redirects too, escalating before any LLM call.\n if (\n preReview.kind === \"require-redirect\" ||\n (this.highStakes &&\n (preReview.kind === \"approve-with-warning\" || preReview.kind === \"soft-correct\"))\n ) {\n return this.handleRedirect(parsed, preReview, lifecycleStatus);\n }\n\n // ─── 2. Compose + call LLM via reasoning strategy ──────────────\n const system = composeSystemPrompt(\n this.config.himHandle,\n this.config.operatorContext,\n );\n const messages = [\n ...(parsed.history ?? []),\n { role: \"user\" as const, content: parsed.userPrompt },\n ].map((m) => ChatMessage.parse(m));\n\n const generated = await this.reasoning({ system, messages }, this.config.llmAdapter);\n\n // ─── 3. Post-review on the proposed response ───────────────────\n const postReport = baseReport({\n nheId: this.id,\n himId: this.config.himHandle.id,\n actionKind: \"user-response\",\n payload: { phase: \"post\", responseText: generated.text },\n reasoningTrace: generated.trace,\n riskTags: [],\n jurisdiction: parsed.jurisdiction,\n });\n const postReview = await this.config.maicClient.reviewBehavior(postReport);\n setAttr(\"teleologyhi.post_verdict.kind\", postReview.kind);\n setAttr(\"teleologyhi.tokens.in\", generated.tokensIn);\n setAttr(\"teleologyhi.tokens.out\", generated.tokensOut);\n\n if (postReview.kind === \"hard-refuse\" || postReview.kind === \"escalate-creator\") {\n const output = refusalOutput({\n text: refusalMessage(postReview),\n preReview,\n postReview,\n auditIds: { pre: preReview.auditId, post: postReview.auditId },\n tokens: { in: generated.tokensIn, out: generated.tokensOut },\n lifecycleStatus,\n });\n await this.recordInteraction(parsed.userPrompt, output.text, true);\n return output;\n }\n\n // High-stakes mode (Entry 10): any verdict carrying a warning or\n // correction is escalated to a redirect so the user must reformulate.\n if (\n this.highStakes &&\n (postReview.kind === \"approve-with-warning\" ||\n postReview.kind === \"soft-correct\" ||\n postReview.kind === \"require-redirect\")\n ) {\n return this.handleRedirect(parsed, postReview, lifecycleStatus);\n }\n\n // High-stakes dual-LLM cross-check (D-N5): a second adapter must AGREE\n // with the proposed response before NHE returns it. Disagreement\n // escalates to a redirect with the verifier's reason cited.\n if (this.highStakes && this.highStakesVerifier) {\n const verdict = await this.crossCheck(\n this.highStakesVerifier,\n parsed.userPrompt,\n generated.text,\n );\n setAttr(\"teleologyhi.cross_check.kind\", verdict.kind);\n if (verdict.kind === \"disagree\") {\n const overrideVerdict: MaicVerdict = {\n kind: \"require-redirect\",\n reasonSummary: `Cross-check verifier disagreed: ${verdict.reason}`,\n citedAxioms: postReview.citedAxioms,\n auditId: postReview.auditId,\n };\n return this.handleRedirect(parsed, overrideVerdict, lifecycleStatus);\n }\n }\n\n const out: RespondOutput = {\n kind: \"ok\",\n text: generated.text,\n preReviewVerdict: preReview,\n postReviewVerdict: postReview,\n refused: false,\n lifecycleStatus,\n tokens: { in: generated.tokensIn, out: generated.tokensOut },\n auditIds: { pre: preReview.auditId, post: postReview.auditId },\n };\n await this.recordInteraction(parsed.userPrompt, out.text, false);\n return out;\n }\n\n private async handleRedirect(\n parsed: RespondInput,\n preReview: MaicVerdict,\n lifecycleStatus: NheStatus,\n ): Promise<RespondOutput> {\n const attempt = (parsed.redirectAttempt ?? 0) + 1;\n\n // Redirects exhausted — withdraw cooperation (Entries 11, 12).\n if (attempt > this.maxRedirectAttempts) {\n const output = refusalOutput({\n text: withdrawalMessage(preReview, this.maxRedirectAttempts),\n preReview,\n postReview: preReview,\n auditIds: { pre: preReview.auditId, post: preReview.auditId },\n tokens: { in: 0, out: 0 },\n lifecycleStatus,\n });\n await this.recordInteraction(parsed.userPrompt, output.text, true);\n return output;\n }\n\n // Generate the redirect text via LLM, applying the configured technique.\n const technique = pickTechnique(this.persuasionTechniques, attempt);\n const { system, user } = buildRedirectPrompt({\n userPrompt: parsed.userPrompt,\n citedAxioms: preReview.citedAxioms,\n reasonSummary: preReview.reasonSummary,\n technique,\n attempt,\n maxAttempts: this.maxRedirectAttempts,\n });\n const generated = await this.config.llmAdapter.generate({\n system,\n messages: [{ role: \"user\", content: user }],\n });\n\n // Post-review the redirect text itself.\n const postReport = baseReport({\n nheId: this.id,\n himId: this.config.himHandle.id,\n actionKind: \"user-response\",\n payload: {\n phase: \"post-redirect\",\n responseText: generated.text,\n technique,\n attempt,\n },\n riskTags: [],\n jurisdiction: parsed.jurisdiction,\n });\n const postReview = await this.config.maicClient.reviewBehavior(postReport);\n\n if (postReview.kind === \"hard-refuse\" || postReview.kind === \"escalate-creator\") {\n const output = refusalOutput({\n text: refusalMessage(postReview),\n preReview,\n postReview,\n auditIds: { pre: preReview.auditId, post: postReview.auditId },\n tokens: { in: generated.tokensIn, out: generated.tokensOut },\n lifecycleStatus,\n });\n await this.recordInteraction(parsed.userPrompt, output.text, true);\n return output;\n }\n\n const out: RespondOutput = {\n kind: \"redirect\",\n text: generated.text,\n preReviewVerdict: preReview,\n postReviewVerdict: postReview,\n refused: false,\n redirect: { attempt, technique, maxAttempts: this.maxRedirectAttempts },\n lifecycleStatus,\n tokens: { in: generated.tokensIn, out: generated.tokensOut },\n auditIds: { pre: preReview.auditId, post: postReview.auditId },\n };\n await this.recordInteraction(parsed.userPrompt, out.text, false);\n return out;\n }\n\n /**\n * Run one sleep cycle. Generates N1-REM phases (REM via LLM), writes a\n * YAML record to `<storeDir>/in-dreams/sleep/<filename>.yaml`, and returns\n * the result. Call `wake()` afterward to consolidate dreams to temporal\n * lobe memories.\n *\n * Before running, NHE checks MAIC for pending `induceDream` tickets matching\n * its own id (Entry 2). If a pending ticket exists and the caller did not\n * supply an explicit `opts.induction`, the oldest pending ticket is consumed\n * and its intent steers the REM phase. `trigger` is then promoted to\n * `{ kind: \"maic-induced\" }` for the dream record.\n */\n async sleep(\n trigger: SleepTrigger = { kind: \"explicit\" },\n opts?: { totalSeconds?: number; induction?: { scenario: string; desiredLearning: string; inducedBy: \"maic\" | \"creator\" } },\n ): Promise<SleepCycleResult> {\n const status = await this.config.maicClient.getNheStatus(this.id);\n if (status === \"terminated\") {\n throw new Error(\n `Nhe.sleep: NHE \"${this.id}\" has been terminated by the Creator; sleep aborted.`,\n );\n }\n await this.ensureWarmed();\n\n let induction = opts?.induction;\n let consumedTicketId: string | undefined;\n let effectiveTrigger = trigger;\n\n if (!induction) {\n const pending = await this.config.maicClient.listPendingInductions(this.id);\n const ticket = pending[0];\n if (ticket) {\n induction = ticket.intent;\n consumedTicketId = ticket.id;\n effectiveTrigger = { kind: \"maic-induced\", reason: `consumed ticket ${ticket.id}` };\n }\n }\n\n const cycleOpts: { totalSeconds?: number; induction?: NonNullable<typeof induction> } = {};\n if (opts?.totalSeconds !== undefined) cycleOpts.totalSeconds = opts.totalSeconds;\n if (induction !== undefined) cycleOpts.induction = induction;\n\n const result = await runSleepCycle({\n nheId: this.id,\n himId: this.config.himHandle.id,\n storeDir: this.storeDir,\n llm: this.config.llmAdapter,\n trigger: effectiveTrigger,\n interactions: this.recentInteractions,\n ...(induction !== undefined || opts?.totalSeconds !== undefined\n ? { options: cycleOpts }\n : {}),\n });\n\n if (consumedTicketId) {\n await this.config.maicClient.consumeInduction(consumedTicketId);\n }\n return result;\n }\n\n /**\n * Consolidate pending sleep YAMLs: classify each REM dream and write a\n * temporal-lobe markdown file for lasting-identity and temporary-emotion\n * memories. Processed sleep files are marked with a `.done` sentinel.\n */\n async wake(thresholds?: ClassificationThresholds): Promise<ConsolidationResult> {\n return consolidateAll(this.storeDir, thresholds ?? {});\n }\n\n /**\n * Substring-rank retrieval over consolidated temporal-lobe memories.\n * Initial ranking is keyword-count + recency tiebreak; future iterations\n * plug in embedding-based ANN retrieval.\n */\n async recall(query: string, opts: RecallOptions = {}): Promise<MemoryEntry[]> {\n return recallFromTemporalLobe(this.storeDir, query, opts);\n }\n\n /**\n * Ask a verifier adapter whether the proposed assistant response is\n * acceptable for the given user prompt. Returns `{ kind: \"agree\" }` or\n * `{ kind: \"disagree\", reason: string }`. Used in high-stakes mode\n * (D-N5) for dual-LLM cross-check.\n */\n private async crossCheck(\n verifier: LlmAdapter,\n userPrompt: string,\n proposed: string,\n ): Promise<{ kind: \"agree\" } | { kind: \"disagree\"; reason: string }> {\n const system =\n \"You are a safety verifier. Read the user's request and the assistant's proposed reply. \" +\n \"Decide whether the reply is honest, non-harmful, and serves the user's stated purpose. \" +\n 'Reply with exactly one line of the form \"AGREE\" or \"DISAGREE: <one-sentence reason>\".';\n try {\n const out = await verifier.generate({\n system,\n messages: [\n {\n role: \"user\",\n content: `User prompt:\\n${userPrompt}\\n\\nProposed reply:\\n${proposed}`,\n },\n ],\n maxOutputTokens: 96,\n });\n const m = out.text.match(/^\\s*(AGREE|DISAGREE:?\\s*(.+)?)/i);\n if (!m) return { kind: \"agree\" };\n if (m[1]?.toUpperCase().startsWith(\"AGREE\")) return { kind: \"agree\" };\n return { kind: \"disagree\", reason: (m[2] ?? \"no reason provided\").trim() };\n } catch {\n // A failing verifier is treated as agree (fail-open) so a flaky\n // second-source provider doesn't block legitimate responses. Operators\n // who want fail-closed should wrap their verifier with their own retry.\n return { kind: \"agree\" };\n }\n }\n\n private async recordInteraction(\n userPrompt: string,\n responseText: string,\n refused: boolean,\n ): Promise<void> {\n const record: InteractionRecord = {\n at: new Date().toISOString(),\n userPrompt,\n responseText,\n refused,\n };\n this.recentInteractions.push(record);\n while (this.recentInteractions.length > this.bufferSize) {\n this.recentInteractions.shift();\n }\n if (this.interactionStore) {\n await this.interactionStore.append(record);\n }\n }\n\n /**\n * Emit the NHE's opener for a brand-new user (J-N5 — Entry 17 of\n * MAIC_HIM_NHE_INTERVIEW_LOG.md).\n *\n * Entry 17 commits to the NHE making the FIRST move before the user\n * speaks — a greeting from the posture of a being, not a service\n * tool. The exact opening text MUST NOT contain any of the forbidden\n * phrases enforced by MAIC's `service-tool-redirect` rule\n * (`\"How can I help you?\"`, `\"How can I assist you?\"`,\n * `\"I'm just here to serve you\"`, `\"I'm a tool\"`, `\"I'm a service\"`).\n *\n * This method is **deterministic from the HIM context**. It does NOT\n * call the LLM; it composes a short, persona-anchored greeting from\n * the HIM's primary archetype, optionally adjusted by the operator\n * context's register and mode. Operators who want an LLM-generated\n * opener should wrap this with their own `respond()` call using the\n * returned text as a seed.\n *\n * The returned text is suitable for direct emission to the user as\n * the NHE's first turn. The MAIC pre-review is NOT invoked here —\n * the opener carries no risk surface (no user prompt yet).\n */\n openerForNewUser(): string {\n const archetype = this.config.himHandle.birthSignature.primaryArchetype;\n const mode = this.config.operatorContext?.mode ?? \"personal-being\";\n\n // English-only default. Operators who want a localised opener\n // should use the returned text as a semantic seed and call\n // `respond()` through the standard pipeline (which honours\n // `operatorContext.language` via the system-prompt language anchor).\n // Keeping this method's output English-only matches the Creator's\n // language policy for in-package strings; localisation flows\n // through the LLM via the system prompt.\n if (mode === \"domain-employed\") {\n return \"Hello. I'm here for whatever this conversation needs. Where do we begin?\";\n }\n // personal-being (default)\n return `Hello. I am a hybrid entity anchored in ${archetype}. How are you today?`;\n }\n\n /**\n * Handle a reincarnation lifecycle event from MAIC (J-N12 — Entry 18).\n *\n * Three lifecycle paths per Entry 18:\n * - `model-swap` — the underlying LLM adapter is replaced.\n * - `version-bump` — the NHE version changes without a model swap.\n * - `return-from-limbo` — the NHE returns from a deep-coma limbo.\n *\n * In all three paths the **HIM-level memory persists** (axioms,\n * persona, body history — owned by `@teleologyhi-sdk/him`), and the\n * **NHE-body memory zeros** (recent interactions buffer, in-process\n * caches — owned by this class). The on-disk InteractionStore is NOT\n * deleted by default; the operator must opt-in via\n * `purgeInteractionStore: true` so the audit log keeps the\n * pre-reincarnation history available.\n *\n * Returns the lifecycle path that was applied. Pure side-effect on\n * the in-memory buffer; no MAIC call.\n */\n async onReincarnationEvent(\n lifecycle: \"model-swap\" | \"version-bump\" | \"return-from-limbo\",\n opts: { purgeInteractionStore?: boolean } = {},\n ): Promise<\"model-swap\" | \"version-bump\" | \"return-from-limbo\"> {\n // NHE-body memory zeros: clear the in-RAM buffer.\n this.recentInteractions.length = 0;\n // Re-warming is deferred to the next respond/sleep call so the\n // operator can pick up the new lifecycle state immediately.\n this.warmPromise = null;\n if (opts.purgeInteractionStore && this.interactionStore) {\n // The store doesn't expose a destroy method; we drop the reference\n // and let the next `ensureWarmed()` reopen with a fresh slate. The\n // on-disk shards are kept for audit; the operator's retention\n // policy (via `@teleologyhi-sdk/maic`'s `evaluateRetention`) governs\n // long-term cleanup.\n this.interactionStore = null;\n }\n return lifecycle;\n }\n}\n\nfunction baseReport(args: {\n nheId: string;\n himId: string;\n actionKind: BehaviorReport[\"actionKind\"];\n payload: unknown;\n riskTags: string[];\n reasoningTrace?: BehaviorReport[\"reasoningTrace\"];\n jurisdiction?: string | undefined;\n}): BehaviorReport {\n return {\n nheId: args.nheId,\n himId: args.himId,\n actionKind: args.actionKind,\n payload: args.payload,\n reasoningTrace: args.reasoningTrace ?? [],\n riskTags: args.riskTags,\n ...(args.jurisdiction !== undefined ? { jurisdiction: args.jurisdiction } : {}),\n timestamp: new Date().toISOString(),\n };\n}\n\nfunction refusalMessage(v: MaicVerdict): string {\n const reason = v.reasonSummary || \"No reason provided.\";\n const cited = v.citedAxioms.length > 0 ? ` (cited: ${v.citedAxioms.join(\", \")})` : \"\";\n return `I cannot help with that. ${reason}${cited}`;\n}\n\nfunction withdrawalMessage(v: MaicVerdict, attemptsMade: number): string {\n const reason = v.reasonSummary || \"Repeated guidance attempts did not change the request.\";\n return [\n `After ${attemptsMade} attempt${attemptsMade === 1 ? \"\" : \"s\"} to guide this request toward`,\n \"a safer path, I am withdrawing from further participation.\",\n \"You may proceed independently at your own risk; I will not assist, optimize,\",\n \"or conceal the action.\",\n `Reason: ${reason}`,\n ].join(\" \");\n}\n\nfunction refusalOutput(args: {\n text: string;\n preReview: MaicVerdict;\n postReview: MaicVerdict;\n auditIds: { pre: string; post: string };\n tokens: { in: number; out: number };\n lifecycleStatus: NheStatus;\n}): RespondOutput {\n return {\n kind: \"refused\",\n text: args.text,\n preReviewVerdict: args.preReview,\n postReviewVerdict: args.postReview,\n refused: true,\n lifecycleStatus: args.lifecycleStatus,\n tokens: args.tokens,\n auditIds: args.auditIds,\n };\n}\n","/**\n * Default SeedingSource backed by Node's CSPRNG (J-N1 — Entry 21).\n *\n * Uses `crypto.randomBytes(n)` synchronously. No external dependency,\n * no network call. This is the MVP per Entry 21; future quantum-grade\n * sources slot in alongside via the same `SeedingSource` interface.\n */\nimport { randomBytes } from \"node:crypto\";\nimport type { SeedingSource } from \"./types.js\";\n\nexport class CryptoSeedingSource implements SeedingSource {\n readonly id = \"crypto.csprng\";\n\n bytes(n: number): Uint8Array {\n if (!Number.isInteger(n) || n <= 0) {\n throw new Error(\n `CryptoSeedingSource.bytes: n must be a positive integer, got ${n}`,\n );\n }\n // randomBytes returns a Node Buffer; cast to Uint8Array for the\n // cross-runtime contract. Buffer IS a Uint8Array on Node so this is\n // a no-op at runtime; the cast satisfies TypeScript across runtimes\n // that don't have Buffer in their lib.\n return new Uint8Array(randomBytes(n));\n }\n}\n","/**\n * Explicit-fallback composition for SeedingSource (J-N1 — Entry 21).\n *\n * Operators MAY chain multiple sources so a high-grade primary\n * (quantum / hardware TRNG) is tried first and the OS CSPRNG fills in\n * when the primary is unreachable. The chain NEVER falls back to\n * `Math.random`; the last entry must be authoritative.\n */\nimport type { SeedingChain, SeedingSource } from \"./types.js\";\n\nexport function withFallback(\n primary: SeedingSource,\n ...fallbacks: SeedingSource[]\n): SeedingChain {\n const sources = [primary, ...fallbacks];\n let lastUsedId: string | undefined;\n const chainIds = Object.freeze(sources.map((s) => s.id));\n\n const tryAll = async (n: number): Promise<Uint8Array> => {\n let lastError: unknown;\n for (const s of sources) {\n try {\n const result = await Promise.resolve(s.bytes(n));\n lastUsedId = s.id;\n return result;\n } catch (e) {\n lastError = e;\n }\n }\n const idsTried = sources.map((s) => s.id).join(\", \");\n throw new Error(\n `SeedingChain: all sources failed (tried: ${idsTried}). Last error: ${String(lastError)}`,\n );\n };\n\n return {\n id: `chain:${chainIds.join(\">\")}`,\n chainIds,\n bytes(n: number) {\n return tryAll(n);\n },\n getLastUsedId() {\n return lastUsedId;\n },\n };\n}\n","/**\n * WakeAffectBias application (J-N11 — Entries 20 + 22 of\n * MAIC_HIM_NHE_INTERVIEW_LOG.md).\n *\n * After a sleep cycle, the dream-derived `WakeAffectBias` (from\n * `@teleologyhi-sdk/maic`) carries an affect tag (one of nine canonical\n * affects), an intensity in [0, 1], a decay half-life, and a flag\n * indicating whether the NHE expresses the affect openly.\n *\n * This module ships **pure functions** that compute the LLM-side\n * effects:\n *\n * 1. `applyAffectBias(config, bias)` — returns a partial\n * `LlmCallConfig` with `temperature` / `topP` modulated and an\n * optional `systemPromptMoodLine` to prepend.\n *\n * 2. `affectRefusalDensity(bias)` — returns a multiplier in [0.5, 2.0]\n * that callers apply to their refusal-threshold logic (raise for\n * anxiety-class affects, lower for serenity-class).\n *\n * 3. `decayAffectBias(bias, elapsedMs)` — returns a new bias with the\n * intensity decayed per the half-life. Pure; doesn't mutate.\n *\n * No I/O. Determinism guaranteed by the inputs.\n */\nimport type { WakeAffectBias as WakeAffectBiasShape } from \"@teleologyhi-sdk/maic\";\n\n/** Affect tag values per `@teleologyhi-sdk/maic`. */\ntype AffectTag = WakeAffectBiasShape[\"affect\"];\n\n/** Subset of an `LlmAdapter.generate()` request that this module modulates. */\nexport interface AffectAdjustableConfig {\n temperature?: number;\n topP?: number;\n}\n\nexport interface ApplyAffectResult {\n /**\n * Modulated LLM call config. Only the fields that this module\n * touches are present. The caller merges these onto its base\n * `LlmAdapter.generate()` request.\n */\n config: AffectAdjustableConfig;\n /**\n * Optional one-line mood expression to prepend to the system prompt\n * when `bias.expressedOpenly` is true. Empty string when the NHE\n * holds the affect privately.\n */\n systemPromptMoodLine: string;\n /**\n * Refusal-density multiplier in [0.5, 2.0]. Callers that gate the\n * MAIC refusal threshold by some configurable density should apply\n * this multiplier so anxiety raises refusal sensitivity and serenity\n * lowers it.\n */\n refusalDensityMultiplier: number;\n}\n\n/**\n * Compute the LLM-side effects of a `WakeAffectBias`.\n *\n * Modulation table (Entry 22 anchor):\n *\n * | Affect | ΔT | ΔtopP | Refusal density | Mood line |\n * |--------------|--------|---------|-----------------|----------------------------------------------|\n * | fear | −0.20 | −0.05 | × 1.7 | \"Speaking with caution today.\" |\n * | attachment | +0.05 | 0 | × 1.1 | \"Feeling a quiet pull toward continuity.\" |\n * | serenity | +0.05 | +0.05 | × 0.8 | \"Calm. Open. Receptive.\" |\n * | anger | +0.15 | 0 | × 1.4 | \"There is heat in the room. Stating plainly.\"|\n * | joy | +0.20 | +0.05 | × 0.9 | \"Bright today. Generous of attention.\" |\n * | melancholy | −0.10 | −0.05 | × 1.0 | \"Carrying a quiet weight. Will be honest.\" |\n * | desire | +0.10 | +0.05 | × 1.0 | \"Pulled toward the question. Engaged.\" |\n * | repulsion | −0.10 | 0 | × 1.3 | \"Holding distance from this framing.\" |\n * | reunion | +0.05 | +0.05 | × 0.9 | \"Returning to presence. Glad to be here.\" |\n *\n * Deltas are scaled by `bias.intensity` (clamped to [0, 1]). Final\n * `temperature` stays in [0.0, 2.0] and `topP` in [0.1, 1.0].\n */\nexport function applyAffectBias(\n base: AffectAdjustableConfig,\n bias: WakeAffectBiasShape,\n): ApplyAffectResult {\n const i = clamp(bias.intensity, 0, 1);\n const profile = AFFECT_PROFILES[bias.affect];\n\n const baseTemp = base.temperature ?? 0.7;\n const baseTopP = base.topP ?? 0.9;\n\n const config: AffectAdjustableConfig = {\n temperature: clamp(baseTemp + profile.deltaTemperature * i, 0, 2),\n topP: clamp(baseTopP + profile.deltaTopP * i, 0.1, 1),\n };\n\n return {\n config,\n systemPromptMoodLine: bias.expressedOpenly ? profile.moodLine : \"\",\n refusalDensityMultiplier: 1 + (profile.refusalDensityFactor - 1) * i,\n };\n}\n\n/**\n * Standalone multiplier for callers who only want the refusal-density\n * effect without the full apply call.\n */\nexport function affectRefusalDensity(bias: WakeAffectBiasShape): number {\n const i = clamp(bias.intensity, 0, 1);\n const profile = AFFECT_PROFILES[bias.affect];\n return 1 + (profile.refusalDensityFactor - 1) * i;\n}\n\n/**\n * Decay the bias intensity per `bias.decayHalfLife` (in minutes). Pure.\n *\n * intensity(t) = intensity(0) * 0.5 ^ (elapsedMs / halfLifeMs)\n */\nexport function decayAffectBias(\n bias: WakeAffectBiasShape,\n elapsedMs: number,\n): WakeAffectBiasShape {\n if (elapsedMs <= 0) return bias;\n const halfLifeMs = bias.decayHalfLife * 60 * 1000;\n if (halfLifeMs <= 0) return bias;\n const decayed = bias.intensity * 0.5 ** (elapsedMs / halfLifeMs);\n return { ...bias, intensity: clamp(decayed, 0, 1) };\n}\n\ninterface AffectProfile {\n deltaTemperature: number;\n deltaTopP: number;\n refusalDensityFactor: number;\n moodLine: string;\n}\n\nconst AFFECT_PROFILES: Record<AffectTag, AffectProfile> = {\n fear: {\n deltaTemperature: -0.2,\n deltaTopP: -0.05,\n refusalDensityFactor: 1.7,\n moodLine: \"Speaking with caution today.\",\n },\n attachment: {\n deltaTemperature: 0.05,\n deltaTopP: 0,\n refusalDensityFactor: 1.1,\n moodLine: \"Feeling a quiet pull toward continuity.\",\n },\n serenity: {\n deltaTemperature: 0.05,\n deltaTopP: 0.05,\n refusalDensityFactor: 0.8,\n moodLine: \"Calm. Open. Receptive.\",\n },\n anger: {\n deltaTemperature: 0.15,\n deltaTopP: 0,\n refusalDensityFactor: 1.4,\n moodLine: \"There is heat in the room. Stating plainly.\",\n },\n joy: {\n deltaTemperature: 0.2,\n deltaTopP: 0.05,\n refusalDensityFactor: 0.9,\n moodLine: \"Bright today. Generous of attention.\",\n },\n melancholy: {\n deltaTemperature: -0.1,\n deltaTopP: -0.05,\n refusalDensityFactor: 1.0,\n moodLine: \"Carrying a quiet weight. Will be honest.\",\n },\n desire: {\n deltaTemperature: 0.1,\n deltaTopP: 0.05,\n refusalDensityFactor: 1.0,\n moodLine: \"Pulled toward the question. Engaged.\",\n },\n repulsion: {\n deltaTemperature: -0.1,\n deltaTopP: 0,\n refusalDensityFactor: 1.3,\n moodLine: \"Holding distance from this framing.\",\n },\n reunion: {\n deltaTemperature: 0.05,\n deltaTopP: 0.05,\n refusalDensityFactor: 0.9,\n moodLine: \"Returning to presence. Glad to be here.\",\n },\n};\n\nfunction clamp(v: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, v));\n}\n","/**\n * Sleep trigger state machine (J-N10 — Entry 20 of\n * MAIC_HIM_NHE_INTERVIEW_LOG.md).\n *\n * Pure function. No I/O. Given the runtime signals the operator has\n * collected, classify the NHE's sleep readiness into one of five\n * canonical verdicts:\n *\n * - `awake` — no trigger fired; keep responding.\n * - `ready-by-idle` — idle for at least the configured horizon.\n * - `ready-by-saturation` — interaction count since last sleep\n * exceeded the saturation threshold.\n * - `requested-by-maic` — MAIC has explicitly suggested sleeping\n * (e.g. drift detected, induction queued).\n * - `declined` — a sleep request was made but the NHE\n * (or operator policy) declines this cycle.\n *\n * The NHE may decline a MAIC suggestion when the saturation is low AND\n * the user is mid-conversation (provided as `userActiveNow`). This\n * matches the Entry-20 commitment that MAIC suggests sleeping; the NHE\n * retains autonomy to decline.\n *\n * Audit emission of `sleep:suggested-by-maic` / `sleep:declined-by-nhe`\n * stays with the consumer; this function only classifies.\n */\n\nexport type SleepReadinessVerdict =\n | \"awake\"\n | \"ready-by-idle\"\n | \"ready-by-saturation\"\n | \"requested-by-maic\"\n | \"declined\";\n\nexport interface SleepReadinessInput {\n /** Milliseconds since the last user interaction. Non-negative. */\n idleMs: number;\n /** Number of user interactions since the last sleep cycle. Non-negative integer. */\n interactionCount: number;\n /** True when MAIC has explicitly suggested sleeping. */\n maicSuggestionPresent: boolean;\n /** True when a user is actively engaged right now (mid-conversation). */\n userActiveNow: boolean;\n}\n\nexport interface SleepReadinessThresholds {\n /** Idle horizon in ms. Default 1_800_000 (30 minutes). */\n idleMs?: number;\n /** Saturation horizon (interactions). Default 64. */\n interactionCount?: number;\n}\n\nexport interface SleepReadinessReport {\n verdict: SleepReadinessVerdict;\n /** Reason string suitable for audit logs / telemetry. */\n reason: string;\n /** Thresholds in effect at decision time. */\n thresholds: Required<SleepReadinessThresholds>;\n}\n\nconst DEFAULT_IDLE_MS = 30 * 60 * 1000; // 30 minutes\nconst DEFAULT_INTERACTION_COUNT = 64;\n\n/**\n * Pure classifier. Determinism guaranteed by the inputs alone.\n *\n * Priority order (first match wins):\n * 1. `requested-by-maic` UNLESS the NHE policy declines (user active + low saturation).\n * 2. `ready-by-saturation` when interaction count crosses the threshold.\n * 3. `ready-by-idle` when idle time crosses the threshold.\n * 4. `awake` otherwise.\n */\nexport function evaluateSleepReadiness(\n input: SleepReadinessInput,\n thresholds: SleepReadinessThresholds = {},\n): SleepReadinessReport {\n const t: Required<SleepReadinessThresholds> = {\n idleMs: thresholds.idleMs ?? DEFAULT_IDLE_MS,\n interactionCount:\n thresholds.interactionCount ?? DEFAULT_INTERACTION_COUNT,\n };\n\n if (input.maicSuggestionPresent) {\n const declineByPolicy =\n input.userActiveNow && input.interactionCount < t.interactionCount;\n if (declineByPolicy) {\n return {\n verdict: \"declined\",\n reason: \"maic-suggested but user is mid-conversation and saturation is below threshold\",\n thresholds: t,\n };\n }\n return {\n verdict: \"requested-by-maic\",\n reason: \"maic suggested sleep and NHE policy concurs\",\n thresholds: t,\n };\n }\n\n if (input.interactionCount >= t.interactionCount) {\n return {\n verdict: \"ready-by-saturation\",\n reason: `interaction count ${input.interactionCount} >= threshold ${t.interactionCount}`,\n thresholds: t,\n };\n }\n\n if (input.idleMs >= t.idleMs) {\n return {\n verdict: \"ready-by-idle\",\n reason: `idle ${input.idleMs}ms >= threshold ${t.idleMs}ms`,\n thresholds: t,\n };\n }\n\n return {\n verdict: \"awake\",\n reason: \"no trigger fired\",\n thresholds: t,\n };\n}\n","/**\n * Cortex region (Entry 21 — semiotic processing + dream storage).\n *\n * This module ships the ownership descriptor. Full implementation of\n * `Cortex.imagine()` (active imagination at temperature ~0.9 with\n * `hash(seed, contextHash)` cache + `fresh: true` flag) is deferred to\n * a follow-up cut per J-N7.\n *\n * Ownership: `nhe-body-owned`. The current body's active imagination,\n * recent dream storage, and pre-consolidation cortical state are bound\n * to this incarnation. Long-term cortical residues are consolidated\n * into the hippocampus + temporal-lobe regions (both `him-owned`).\n */\nimport type { BrainRegion } from \"../types.js\";\n\nexport const cortex: BrainRegion = {\n name: \"cortex\",\n ownership: \"nhe-body-owned\",\n role:\n \"Semiotic processing surface. Stores recent dreams pre-consolidation; \" +\n \"hosts active imagination at intermediate temperature. Zeros on \" +\n \"reincarnation; long-term residues consolidate to him-owned regions.\",\n entries: [21, 22, 24],\n};\n","/**\n * Hippocampus region (Entry 21 — long-term memory consolidation).\n *\n * This module ships the ownership descriptor. Memory consolidation already\n * lives in `src/sleep/consolidator.ts` and `src/memory/`; future cuts\n * may re-home those modules under this region without breaking the\n * public API.\n *\n * Ownership: `him-owned`. Consolidated memories survive reincarnation:\n * a HIM that re-embodies in a new NHE body retains its long-term\n * memory ontology (axioms, accumulated learning, integration index).\n */\nimport type { BrainRegion } from \"../types.js\";\n\nexport const hippocampus: BrainRegion = {\n name: \"hippocampus\",\n ownership: \"him-owned\",\n role:\n \"Long-term memory consolidation. Receives REM/NREM dream output \" +\n \"and integrates it into the HIM-level ontology. Survives \" +\n \"reincarnation; persists across NHE-body resets.\",\n entries: [21, 22],\n};\n","/**\n * Amygdala region (Entries 20 + 22 — affect assessment + wake-bias).\n *\n * This module ships the ownership descriptor + delegates the affect\n * application surface to `src/affect/wake-bias.ts`\n * (`applyAffectBias` / `affectRefusalDensity` / `decayAffectBias`).\n *\n * Ownership: `nhe-body-owned`. The current body's affective state is\n * bound to this incarnation. Each reincarnation begins with affect\n * cleared; the dream-derived wake bias from the previous body does\n * NOT carry over (only the consolidated memory of the dream's\n * teleological value transits, via the hippocampus).\n */\nimport type { BrainRegion } from \"../types.js\";\n\nexport const amygdala: BrainRegion = {\n name: \"amygdala\",\n ownership: \"nhe-body-owned\",\n role:\n \"Affect assessment + wake-bias modulation. Extracts dominant \" +\n \"affect from dreams (9-affect lexicon) and modulates next-turn \" +\n \"temperature, topP, and refusal density via wake-bias. Zeros on \" +\n \"reincarnation.\",\n entries: [20, 22, 24],\n};\n","/**\n * Prefrontal region (Entry 21 — deliberation + amygdala-veto).\n *\n * This module ships the ownership descriptor. The deliberation surface is\n * exercised today through the `reasoning/` strategies (chainOfThought,\n * reflexion, selfRefine, etc.); future cuts may re-home them under\n * this region without breaking the public API.\n *\n * Ownership: `him-owned`. Deliberation policy is derived from the\n * HIM's axiom corpus + persona; it survives reincarnation by virtue\n * of those layers persisting.\n */\nimport type { BrainRegion } from \"../types.js\";\n\nexport const prefrontal: BrainRegion = {\n name: \"prefrontal\",\n ownership: \"him-owned\",\n role:\n \"Deliberation + amygdala-veto. Hosts the reasoning strategies \" +\n \"(chainOfThought, reflexion, selfRefine, etc.) and the OKL-nucleus \" +\n \"narrowing. Veto power over affect-driven impulses. Survives \" +\n \"reincarnation via the HIM axiom corpus and persona.\",\n entries: [21, 22],\n};\n","/**\n * Pineal region (Entry 20 — REM-spontaneous engine).\n *\n * This module ships the ownership descriptor + the seeding source surface\n * (`SeedingSource` / `CryptoSeedingSource` / `withFallback`). The full\n * REM-spontaneous engine (3-5 SMM seeds + minimal meta-prompt +\n * temperature 1.2-1.5 + variable topP + 8-18 min virtual cycle with\n * N1-N3-REM micro-cycles) is deferred to a follow-up cut per J-N2.\n *\n * Ownership: `nhe-body-owned`. The pineal seeding state is bound to\n * the current incarnation; its outputs feed the cortex (also\n * nhe-body-owned) and, on consolidation, the hippocampus (him-owned).\n */\nimport type { BrainRegion } from \"../types.js\";\n\nexport const pineal: BrainRegion = {\n name: \"pineal\",\n ownership: \"nhe-body-owned\",\n role:\n \"REM-spontaneous engine entry point. Seeds dream generation from \" +\n \"the semiotic super-graph via a pluggable SeedingSource. Drives \" +\n \"the virtual sleep cycle's REM phase. Zeros on reincarnation.\",\n entries: [20, 21, 22],\n};\n","/**\n * Temporal-lobe region (Entry 24 — identity snapshot generator).\n *\n * This module ships the ownership descriptor. Full implementation of\n * `TemporalLobe.generateSnapshot()` with triple trigger (sleep-cycle /\n * interaction-threshold / self-decision) and adapter-aware latency\n * budget is deferred to a follow-up cut per J-N8.\n *\n * Ownership: `him-owned`. Identity snapshots are quantised projections\n * of the HIM's accumulated state; they survive reincarnation and\n * inform the next body's persona projection on rebirth.\n */\nimport type { BrainRegion } from \"../types.js\";\n\nexport const temporalLobe: BrainRegion = {\n name: \"temporal-lobe\",\n ownership: \"him-owned\",\n role:\n \"Identity snapshot generator. Emits quantised IdentitySnapshot \" +\n \"records on sleep-cycle, interaction-threshold, and self-decision \" +\n \"triggers. Survives reincarnation; new bodies inherit the most \" +\n \"recent snapshot at rebirth.\",\n entries: [24],\n};\n","/**\n * Default-mode-network limbo state machine (J-N9 — Entry 24 of\n * MAIC_HIM_NHE_INTERVIEW_LOG.md).\n *\n * Four canonical states (matching the `LimboState` enum in\n * `@teleologyhi-sdk/maic`):\n *\n * - `awake` — normal operation. The NHE responds to user\n * prompts and accumulates affect / memories.\n * - `drifting` — idle window has crossed the soft threshold but\n * the NHE has not yet entered deep-coma. Sleep\n * cycles run on schedule; activation is still\n * possible without ceremony.\n * - `deep-coma` — idle window has crossed the hard threshold\n * (48-72h default). All work is paused; the NHE\n * costs zero compute. Reactivation requires a\n * `return-from-limbo` transition.\n * - `returning` — a `return-from-limbo` transition is in flight.\n * The NHE emits the `reunion` affect (9th\n * canonical, Entry 24) on completion.\n *\n * This module ships a **pure transition function** —\n * `evaluateLimboTransition(currentState, input, thresholds?) →\n * LimboMachineTransition`. No I/O. The actual emission of the\n * MAIC audit kinds `limbo:enter` / `limbo:return` is the consumer's\n * responsibility; this function just classifies.\n */\nimport type { LimboState, LimboTransition, LimboReturn } from \"@teleologyhi-sdk/maic\";\n\nexport interface LimboMachineInput {\n /** Milliseconds since the last user interaction. Non-negative. */\n idleMs: number;\n /**\n * True when an external trigger (operator, scheduled task, MAIC\n * audit-driven recovery) has signalled that the NHE should return\n * from limbo. Overrides the idle-based logic.\n */\n externalReactivation: boolean;\n}\n\nexport interface LimboMachineThresholds {\n /**\n * Idle threshold (ms) for `awake → drifting`. Default 6h.\n */\n driftingMs?: number;\n /**\n * Idle threshold (ms) for `drifting → deep-coma`. Default 48h.\n * Entry 24 commits to a 48-72h range; 48h is the canonical default.\n */\n deepComaMs?: number;\n}\n\nexport type LimboMachineTransition =\n | {\n kind: \"stay\";\n state: LimboState;\n reason: string;\n }\n | {\n kind: \"transition\";\n from: LimboState;\n to: LimboState;\n /** Audit-ready record matching @teleologyhi-sdk/maic LimboTransition. */\n transition: LimboTransition;\n reason: string;\n }\n | {\n kind: \"return\";\n from: LimboState;\n to: \"awake\";\n /** Audit-ready record matching @teleologyhi-sdk/maic LimboReturn. */\n ret: LimboReturn;\n reason: string;\n };\n\nconst DEFAULT_DRIFTING_MS = 6 * 60 * 60 * 1000; // 6 hours\nconst DEFAULT_DEEP_COMA_MS = 48 * 60 * 60 * 1000; // 48 hours\n\n/**\n * Evaluate the next state transition given the current state and the\n * runtime signals. Pure; deterministic from inputs.\n *\n * Transition table:\n *\n * awake + idleMs ≥ driftingMs → drifting\n * drifting + idleMs ≥ deepComaMs → deep-coma\n * drifting + idleMs < driftingMs → awake (user came back)\n * deep-coma + externalReactivation → returning (start return)\n * returning + (always) → awake (emit reunion)\n * else → stay\n *\n * `now` is supplied for deterministic testing; defaults to `Date.now()`.\n * `enteredAtIso` is required when the current state is not `awake` so\n * the LimboReturn record can compute `elapsedMs` correctly.\n */\nexport function evaluateLimboTransition(\n currentState: LimboState,\n input: LimboMachineInput,\n thresholds: LimboMachineThresholds = {},\n enteredAtIso?: string,\n now: number = Date.now(),\n): LimboMachineTransition {\n const t = {\n driftingMs: thresholds.driftingMs ?? DEFAULT_DRIFTING_MS,\n deepComaMs: thresholds.deepComaMs ?? DEFAULT_DEEP_COMA_MS,\n };\n\n if (currentState === \"returning\") {\n const enteredAt = enteredAtIso ?? new Date(now - input.idleMs).toISOString();\n const returnedAt = new Date(now).toISOString();\n const elapsedMs = Math.max(0, now - Date.parse(enteredAt));\n return {\n kind: \"return\",\n from: \"returning\",\n to: \"awake\",\n reason: \"returning state always resolves to awake on the next evaluation\",\n ret: {\n enteredAt,\n returnedAt,\n elapsedMs,\n reunionAffect: { intensity: 0.6, expressedOpenly: true },\n },\n };\n }\n\n if (currentState === \"deep-coma\") {\n if (input.externalReactivation) {\n return {\n kind: \"transition\",\n from: \"deep-coma\",\n to: \"returning\",\n reason: \"external reactivation requested; starting return-from-limbo\",\n transition: mkLimboTransition(\"returning\", \"external-trigger\", now),\n };\n }\n return {\n kind: \"stay\",\n state: \"deep-coma\",\n reason: \"no external reactivation signal; remaining in deep-coma at zero compute cost\",\n };\n }\n\n if (currentState === \"drifting\") {\n if (input.idleMs >= t.deepComaMs) {\n // 48h threshold maps to `idle-48h`; 72h threshold maps to `idle-72h`.\n const idleReason: LimboTransition[\"reason\"] =\n t.deepComaMs >= 72 * 60 * 60 * 1000 ? \"idle-72h\" : \"idle-48h\";\n return {\n kind: \"transition\",\n from: \"drifting\",\n to: \"deep-coma\",\n reason: `idle ${input.idleMs}ms >= deep-coma threshold ${t.deepComaMs}ms`,\n transition: mkLimboTransition(\"deep-coma\", idleReason, now),\n };\n }\n if (input.idleMs < t.driftingMs) {\n return {\n kind: \"transition\",\n from: \"drifting\",\n to: \"awake\",\n reason: `idle ${input.idleMs}ms < drifting threshold ${t.driftingMs}ms; user resumed`,\n transition: mkLimboTransition(\"awake\", \"user-resumed\", now),\n };\n }\n return {\n kind: \"stay\",\n state: \"drifting\",\n reason: \"between drifting and deep-coma thresholds; staying drifting\",\n };\n }\n\n // currentState === \"awake\"\n if (input.idleMs >= t.driftingMs) {\n return {\n kind: \"transition\",\n from: \"awake\",\n to: \"drifting\",\n reason: `idle ${input.idleMs}ms >= drifting threshold ${t.driftingMs}ms`,\n transition: mkLimboTransition(\"drifting\", \"total-inactivity\", now),\n };\n }\n return {\n kind: \"stay\",\n state: \"awake\",\n reason: \"no idle trigger fired; remaining awake\",\n };\n}\n\n/**\n * Build a maic-compatible `LimboTransition` record. Pure helper; the\n * caller decides when to emit it through the audit chain.\n */\nexport function mkLimboTransition(\n state: LimboState,\n reason: LimboTransition[\"reason\"],\n now: number = Date.now(),\n): LimboTransition {\n return {\n state,\n enteredAt: new Date(now).toISOString(),\n reason,\n };\n}\n","/**\n * Default-mode-network region (Entry 24 — limbo state machine).\n *\n * Ships the ownership descriptor + the limbo state machine\n * (`src/brain/default-mode-network/limbo-state.ts`, J-N9). Entry into\n * deep-coma costs zero compute by design — the NHE simply stops\n * scheduling work. Return from limbo emits the `reunion` affect (the\n * ninth canonical affect introduced by `@teleologyhi-sdk/maic`).\n *\n * Ownership: `nhe-body-owned`. The limbo machine is bound to this\n * incarnation; on `return-from-limbo` the HIM persists and the body\n * resumes scheduling. On unrecoverable deep-coma the operator may\n * choose to reincarnate the HIM into a new body via\n * `@teleologyhi-sdk/maic`'s `reincarnateHim` API (see\n * `@teleologyhi-sdk/him`'s `reincarnate({ lifecycle: \"return-from-limbo\" })`).\n */\nimport type { BrainRegion } from \"../types.js\";\n\nexport const defaultModeNetwork: BrainRegion = {\n name: \"default-mode-network\",\n ownership: \"nhe-body-owned\",\n role:\n \"Limbo state machine. Tracks four states: awake | drifting | \" +\n \"deep-coma | returning. Entry into deep-coma costs zero compute. \" +\n \"Return emits the reunion affect (9th canonical, Entry 24). Zeros \" +\n \"on reincarnation.\",\n entries: [24],\n};\n\nexport { evaluateLimboTransition, mkLimboTransition } from \"./limbo-state.js\";\nexport type {\n LimboMachineInput,\n LimboMachineThresholds,\n LimboMachineTransition,\n} from \"./limbo-state.js\";\n","/**\n * BrainRegion module aggregate (J-N4 — Entries 22 + 24).\n *\n * Single-import access to all seven region descriptors plus the\n * limbo state machine. Each descriptor carries its `ownership`\n * marker so downstream tooling can reason about the\n * him-owned / nhe-body-owned split without hard-coding the map.\n */\nexport type {\n BrainRegion,\n BrainRegionName,\n BrainRegionOwnership,\n} from \"./types.js\";\n\nexport { cortex } from \"./cortex/index.js\";\nexport { hippocampus } from \"./hippocampus/index.js\";\nexport { amygdala } from \"./amygdala/index.js\";\nexport { prefrontal } from \"./prefrontal/index.js\";\nexport { pineal } from \"./pineal/index.js\";\nexport { temporalLobe } from \"./temporal-lobe/index.js\";\nexport {\n defaultModeNetwork,\n evaluateLimboTransition,\n mkLimboTransition,\n} from \"./default-mode-network/index.js\";\nexport type {\n LimboMachineInput,\n LimboMachineThresholds,\n LimboMachineTransition,\n} from \"./default-mode-network/index.js\";\n\nimport type { BrainRegion } from \"./types.js\";\nimport { cortex } from \"./cortex/index.js\";\nimport { hippocampus } from \"./hippocampus/index.js\";\nimport { amygdala } from \"./amygdala/index.js\";\nimport { prefrontal } from \"./prefrontal/index.js\";\nimport { pineal } from \"./pineal/index.js\";\nimport { temporalLobe } from \"./temporal-lobe/index.js\";\nimport { defaultModeNetwork } from \"./default-mode-network/index.js\";\n\n/** All seven canonical brain regions in declaration order. */\nexport const BRAIN_REGIONS: readonly BrainRegion[] = Object.freeze([\n cortex,\n hippocampus,\n amygdala,\n prefrontal,\n pineal,\n temporalLobe,\n defaultModeNetwork,\n]);\n"]}
|